/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* _/ _/_/_/ _/ _/ _/ ACK! MUD is modified *
* _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code *
* _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 *
* _/_/_/_/ _/ _/ _/ Version #: 4.3 *
* _/ _/ _/_/_/ _/ _/ _/ *
* *
* http://ackmud.nuc.net/ *
* zenithar@ackmud.nuc.net *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "globals.h"
#include "magic.h"
extern bool deathmatch;
/*
* This file should contain:
* o Adept Spells
* o Remort Spells
* o Room-affect Spells
*/
bool spell_seal_room( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_ENCAPS ) )
{
send_to_char( "This room is already sealed!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
if( deathmatch )
{
if( ch->hit < 150 )
{
send_to_char( "You don't have enough life force remaining!\n\r", ch );
return FALSE;
}
else
{
send_to_char( "@@eYou feel some of your life force rip from your soul!@@N\n\r", ch );
ch->hit -= 100;
}
}
act( "$n spreads his hands into the air and ejects a web of energy!", ch, NULL, NULL, TO_ROOM );
send_to_char( "You spread your hands into the air and eject a web of energy!\n\r", ch );
raf.type = sn;
raf.level = level;
raf.duration = ( level / 20 ) + 2;
raf.bitvector = ROOM_BV_ENCAPS;
raf.caster = ch;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_deflect_weapon( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if( is_affected( victim, sn ) )
return FALSE;
af.type = sn;
af.duration = (level + 2);
af.modifier = -40 - get_psuedo_level( ch ) / 5;
af.location = APPLY_AC;
af.bitvector = 0;
affect_to_char( victim, &af );
send_to_char( "You feel a mind shield form around you.\n\r", victim );
if( ch != victim )
send_to_char( "Ok.\n\r", ch );
return TRUE;
}
bool spell_black_hand( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
act( "You summon a hand of death, and it chokes $N!", ch, NULL, victim, TO_CHAR );
act( "A Black Hand grows from the shadows, and begins to choke $N!", ch, NULL, victim, TO_NOTVICT );
act( "$n summons a Black Hand from the shadows, which begins to choke you!", ch, NULL, victim, TO_VICT );
if( saves_spell( level, victim ) || IS_VAMP( victim ) || is_affected( victim, sn ) )
{
send_to_char( "The Black Hand dissolves back into the shadows!\n\r", victim );
send_to_char( "The Black Hand dissolves back into the shadows!\n\r", ch );
act( "The Black Hand dissolves back into the shadows!", ch, NULL, victim, TO_NOTVICT );
return TRUE;
}
af.type = sn;
af.duration = 3;
af.location = APPLY_HIT;
af.modifier = level;
af.bitvector = 0;
af.caster = ch;
affect_to_char( victim, &af );
act( "The Black Hand surrounds $N and begins to choke!", ch, NULL, victim, TO_ROOM );
return TRUE;
}
bool spell_throw_needle( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if( !sp_damage( obj, ch, ( CHAR_DATA * ) vo, dice( 2, level ), REALM_POISON, sn, TRUE ) )
return TRUE;
if( !saves_spell( level, victim ) )
{
af.type = sn;
af.duration = 12 + ( level / 10 );
af.location = APPLY_STR;
af.modifier = -3;
af.bitvector = AFF_POISON;
affect_join( victim, &af );
send_to_char( "You feel very sick.\n\r", victim );
act( "$n looks very sick.", victim, NULL, NULL, TO_ROOM );
}
return TRUE;
}
bool spell_morale( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
CHAR_DATA *gch;
for( gch = ch->in_room->first_person; gch != NULL; gch = gch->next_in_room )
{
if( is_affected( gch, sn ) || !is_same_group( ch, gch ) )
continue;
act( "$n seems much more willing to fight.", gch, NULL, NULL, TO_ROOM );
send_to_char( "You are inspired to fight better!\n\r", gch );
af.type = sn;
af.duration = 4 + ( level / 5 );
af.location = APPLY_DAMROLL;
af.modifier = get_psuedo_level( ch ) / 10;
af.bitvector = 0;
affect_to_char( gch, &af );
}
send_to_char( "You inspire the troops!\n\r", ch );
return TRUE;
}
bool spell_leadership( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
CHAR_DATA *gch;
for( gch = ch->in_room->first_person; gch != NULL; gch = gch->next_in_room )
{
if( is_affected( gch, sn ) || !is_same_group( ch, gch ) )
continue;
act( "$n looks more courageous!", gch, NULL, NULL, TO_ROOM );
send_to_char( "You fell courage wash over you!\n\r", gch );
af.type = sn;
af.duration = 4 + ( level / 5 );
af.location = APPLY_HITROLL;
af.modifier = get_psuedo_level( ch ) / 10;
af.bitvector = 0;
affect_to_char( gch, &af );
}
send_to_char( "You inspire the troops!\n\r", ch );
return TRUE;
}
bool spell_ice_bolt( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int dam;
dam = 150 + dice( level / 4, 12 );
if( saves_spell( level, victim ) )
dam /= 1.2;
sp_damage( obj, ch, victim, dam, REALM_COLD, sn, TRUE );
return TRUE;
}
bool spell_waterelem( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the elemental forces of @@lwater@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the elemental forces of @@lwater@@N.", ch, obj, NULL, TO_CHAR );
act( "A waterfall appears, and an elemental steps from the pool!!", ch, obj, NULL, TO_ROOM );
act( "A waterfall appears, and an elemental steps from the pool!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_WATERELEM ) );
char_to_room( summoned, ch->in_room );
act( "$n floods from the pool, drawing all the water into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_skeleton( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the @@dNegative Plane@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the @@dNegative Plane@@N.", ch, obj, NULL, TO_CHAR );
act( "The ground opens beneath you, and a skeleton crawls out of the graveyard filth!!", ch, obj, NULL, TO_ROOM );
act( "The ground opens beneath you, and a skeleton crawls out of the graveyard filth!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_SKELETON ) );
char_to_room( summoned, ch->in_room );
act( "$n Stands erect, and bow's towards it's master.", summoned, NULL, NULL, TO_ROOM );
/*
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_poison_weapon( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
OBJ_DATA *ob = ( OBJ_DATA * ) vo;
AFFECT_DATA *paf;
/*
* Quick way to stop imms (Bash?) enchanting weapons for players
*/
if( IS_IMMORTAL( ch ) && ch->level != 85 )
{
send_to_char( "Nothing Happens.\n\r", ch );
return FALSE;
}
if( ob->item_type != ITEM_WEAPON )
{
send_to_char( "That is not a weapon!.\n\r", ch );
return FALSE;
}
/*
* This is gonna fuck up a lot.. paf->type isnt saved for objects in
* pfiles.. -- Alty
*/
for( paf = ob->first_apply; paf != NULL; paf = paf->next )
{
if( paf->type == sn )
{
send_to_char( "That weapon is already poisoned!.\n\r", ch );
return FALSE;
}
}
GET_FREE( paf, affect_free );
paf->type = sn;
paf->duration = -1;
paf->location = APPLY_DAMROLL;
paf->modifier = UMIN( ( level / 30 ) + 1, ob->level );
paf->bitvector = 0;
paf->caster = NULL;
LINK( paf, ob->first_apply, ob->last_apply, next, prev );
return TRUE;
}
void do_disguise( CHAR_DATA * ch, char *argument )
{
char arg[MAX_STRING_LENGTH];
if( !IS_NPC( ch ) && ch->pcdata->learned[gsn_disguise] == 0 )
{
send_to_char( "You are not trained in this skill!\n\r", ch );
return;
}
one_argument( argument, arg );
if( arg[0] == '\0' )
{
send_to_char( " Enter the disguise name, or reset to reset your description to normal.\n\r", ch );
return;
}
if( !str_cmp( arg, "reset" ) )
{
free_string( ch->long_descr );
ch->long_descr = str_dup( ch->long_descr_orig );
return;
}
else
{
free_string( ch->long_descr );
xcat( argument, "\n\r" );
ch->long_descr = str_dup( argument );
send_to_char( "You are now Disguised!!!\n\r", ch );
return;
}
return;
}
bool spell_fireshield( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
MAGIC_SHIELD *shield;
AFFECT_DATA af;
bool char_login = FALSE;
if( ( !IS_NPC( ch ) ) && ( ch->desc != NULL ) && ( ch->desc->connected == CON_SETTING_STATS ) )
char_login = TRUE;
/* check to see if victim is already flaming
if ( is_shielded( victim, FLAME_SHIELD ) )
return FALSE;
for now, we are gonna allow only one shield up at a time */
if( ch->first_shield != NULL )
{
return FALSE;
}
af.type = sn;
af.duration = get_psuedo_level( ch ) / 10;
if( char_login )
af.duration /= 2;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
GET_FREE( shield, shield_free );
shield->name = str_dup( "@@eFIRE@@N" );
shield->type = FLAME_SHIELD;
shield->harmfull = TRUE;
shield->attack_dam = number_range( ( level * 3 ), ( level * 5 ) );
shield->percent = 10 + ( get_psuedo_level( ch ) / 10 );
shield->hits = 5000 + ( get_psuedo_level( ch ) * 10 );
shield->sn = sn;
if( char_login )
shield->hits /= ( number_range( 2, 10 ) );
shield->absorb_message_room = str_dup( "@@N$n's @@eshield@@N flares and envelops $N in @@eflames@@N!!" );
shield->absorb_message_victim = str_dup( "@@N$N's @@eshield@@N flares, and envelops you with @@eflame@@N!!" );
shield->absorb_message_self = str_dup( "@@NYour @@eshield@@N flares, and envelops $N with @@eflame@@N!!!" );
shield->wearoff_room = str_dup( "@@N$n's @@eshield@@N @@yFLAMES OUT@@N!!!!!" );
shield->wearoff_self = str_dup( "@@NYour @@eshield@@N @@yFLAMES OUT@@N!!!!!" );
LINK( shield, ch->first_shield, ch->last_shield, next, prev );
send_to_char( "@@NYou @@eburst@@N into @@Rflames@@N!\n\r", ch );
act( "@@N$n @@ebursts@@N into @@Rflames@@N!", ch, NULL, NULL, TO_ROOM );
return TRUE;
}
bool spell_iceshield( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
MAGIC_SHIELD *shield;
AFFECT_DATA af;
bool char_login = FALSE;
if( ( !IS_NPC( ch ) ) && ( ch->desc != NULL ) && ( ch->desc->connected == CON_SETTING_STATS ) )
char_login = TRUE;
/* check to see if victim is already flaming
if ( is_shielded( victim, ICE_SHIELD ) )
return FALSE;
for now, we are gonna allow only one shield up at a time */
if( ch->first_shield != NULL )
{
return FALSE;
}
af.type = sn;
af.duration = get_psuedo_level( ch ) / 15;
if( char_login )
af.duration /= 2;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
GET_FREE( shield, shield_free );
shield->name = str_dup( "@@aICE@@N" );
shield->type = ICE_SHIELD;
shield->harmfull = FALSE;
shield->attack_dam = 0;
shield->percent = 50 + ( get_psuedo_level( ch ) / 6 );
shield->hits = 15000 + ( get_psuedo_level( ch ) * 50 );
shield->sn = sn;
if( char_login )
shield->hits /= ( number_range( 2, 10 ) );
shield->absorb_message_room = str_dup( "@@N$n's @@ashield@@N absorbs the blow@@N!!" );
shield->absorb_message_victim = str_dup( "@@N$N's @@ashield@@N absorbs the blow@@N!!" );
shield->absorb_message_self = str_dup( "@@NYour @@ashield@@N absorbs the blow@@N!!!" );
shield->wearoff_room = str_dup( "@@N$n's @@ashield @@Nis @@rSHATTERED@@N!!!" );
shield->wearoff_self = str_dup( "@@NYour @@ashield@@N is @@rSHATTERED@@N!!!" );
LINK( shield, ch->first_shield, ch->last_shield, next, prev );
send_to_char( "@@NYou are encased in @@aIce@@N!\n\r", ch );
act( "@@N$n is encased in @@aIce@@N!!", ch, NULL, NULL, TO_ROOM );
return TRUE;
}
bool spell_shockshield( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
MAGIC_SHIELD *shield;
AFFECT_DATA af;
bool char_login = FALSE;
if( ( !IS_NPC( ch ) ) && ( ch->desc != NULL ) && ( ch->desc->connected == CON_SETTING_STATS ) )
char_login = TRUE;
/* check to see if victim is already flaming
if ( is_shielded( victim, SHOCK_SHIELD ) )
return FALSE;
for now, we are gonna allow only one shield up at a time */
if( ch->first_shield != NULL )
{
return FALSE;
}
af.type = sn;
af.duration = get_psuedo_level( ch ) / 7;
if( char_login )
af.duration /= 2;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
GET_FREE( shield, shield_free );
shield->name = str_dup( "@@lSHOCK@@N" );
shield->type = SHOCK_SHIELD;
shield->harmfull = TRUE;
shield->attack_dam = number_range( ( level * 2 ), ( level * 4 ) );
shield->percent = 25 + get_psuedo_level( ch ) / 9;
shield->hits = 7000 + get_psuedo_level( ch ) * 20;
shield->sn = sn;
if( char_login )
shield->hits /= ( number_range( 2, 10 ) );
shield->absorb_message_room = str_dup( "@@N$n's @@lshield@@N @@ysparks,@@N and zaps $N@@N!!" );
shield->absorb_message_victim = str_dup( "@@N$N's @@lshield@@N @@ysparks@@N, and zaps you@@N!!" );
shield->absorb_message_self = str_dup( "@@NYour @@lshield@@N @@ysparks@@N, and zaps $N@@N!!!" );
shield->wearoff_room = str_dup( "@@N$n's @@lshield@@N @@aDISSAPATES@@N!!!!!" );
shield->wearoff_self = str_dup( "@@NYour @@lshield@@N @@aDISSAPATES@@N!!!!!" );
LINK( shield, ch->first_shield, ch->last_shield, next, prev );
send_to_char( "@@NYou are surrounded by an @@lelectric field@@N!!\n\r", ch );
act( "@@N$n is surrounded in an @@lelectric field@@N!!", ch, NULL, NULL, TO_ROOM );
return TRUE;
}
bool spell_shadowshield( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
MAGIC_SHIELD *shield;
AFFECT_DATA af;
bool char_login = FALSE;
if( ( !IS_NPC( ch ) ) && ( ch->desc != NULL ) && ( ch->desc->connected == CON_SETTING_STATS ) )
char_login = TRUE;
/* check to see if victim is already flaming
if ( is_shielded( victim, FLAME_SHIELD ) )
return FALSE;
for now, we are gonna allow only one shield up at a time */
if( ch->first_shield != NULL )
{
return FALSE;
}
af.type = sn;
af.duration = get_psuedo_level( ch ) / 10;
if( char_login )
af.duration /= 2;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
GET_FREE( shield, shield_free );
shield->name = str_dup( "@@dSHADOW@@N" );
shield->type = FLAME_SHIELD;
shield->harmfull = TRUE;
shield->attack_dam = number_range( ( level * 2 ), ( level * 4.5 ) );
shield->percent = 20;
shield->hits = 3000;
shield->sn = sn;
if( char_login )
shield->hits /= ( number_range( 2, 10 ) );
shield->absorb_message_room = str_dup( "@@N$n's @@eshield@@N flares and envelops $N in @@eflames@@N!!" );
shield->absorb_message_victim = str_dup( "@@N$N's @@eshield@@N flares, and envelops you with @@eflame@@N!!" );
shield->absorb_message_self = str_dup( "@@NYour @@eshield@@N flares, and envelops $N with @@eflame@@N!!!" );
shield->wearoff_room = str_dup( "@@N$n's @@dshield@@N @@dDISSAPATES@@N!!!!!" );
shield->wearoff_self = str_dup( "@@NYour @@dshield@@N @@dDISSAPATES@@N!!!!!" );
LINK( shield, ch->first_shield, ch->last_shield, next, prev );
send_to_char( "You burst into flames!\n\r", ch );
act( "$n bursts into flames!", ch, NULL, NULL, TO_ROOM );
return TRUE;
}
bool spell_thoughtshield( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
MAGIC_SHIELD *shield;
AFFECT_DATA af;
bool char_login = FALSE;
if( ( !IS_NPC( ch ) ) && ( ch->desc != NULL ) && ( ch->desc->connected == CON_SETTING_STATS ) )
char_login = TRUE;
/* check to see if victim is already flaming
if ( is_shielded( victim, FLAME_SHIELD ) )
return FALSE;
for now, we are gonna allow only one shield up at a time */
if( ch->first_shield != NULL )
{
return FALSE;
}
af.type = sn;
af.duration = get_psuedo_level( ch ) / 10;
if( char_login )
af.duration /= 2;
af.location = 0;
af.modifier = 0;
af.bitvector = 0;
affect_to_char( ch, &af );
GET_FREE( shield, shield_free );
shield->name = str_dup( "@@mTHOUGHT@@N" );
shield->type = FLAME_SHIELD;
shield->harmfull = TRUE;
shield->attack_dam = number_range( ( level * 2 ), ( level * 4.5 ) );
shield->percent = 20;
shield->hits = 3000;
shield->sn = sn;
if( char_login )
shield->hits /= ( number_range( 2, 10 ) );
shield->absorb_message_room = str_dup( "@@N$n's @@eshield@@N flares and envelops $N in @@eflames@@N!!" );
shield->absorb_message_victim = str_dup( "@@N$N's @@eshield@@N flares, and envelops you with @@eflame@@N!!" );
shield->absorb_message_self = str_dup( "@@NYour @@eshield@@N flares, and envelops $N with @@eflame@@N!!!" );
shield->wearoff_room = str_dup( "@@N$n's @@dshield@@N @@dDISSAPATES@@N!!!!!" );
shield->wearoff_self = str_dup( "@@NYour @@dshield@@N @@dDISSAPATES@@N!!!!!" );
LINK( shield, ch->first_shield, ch->last_shield, next, prev );
send_to_char( "You burst into flames!\n\r", ch );
act( "$n bursts into flames!", ch, NULL, NULL, TO_ROOM );
return TRUE;
}
bool spell_ethereal( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
/*
* Ethereal travel :)
* *
* * Zenithar
*/
if( deathmatch )
{
send_to_char( "Not during a @@eDeath Match@@N!!\n\r", ch );
return FALSE;
}
if( ( IS_SET( ch->in_room->room_flags, ROOM_NO_RECALL ) )
&& ( !IS_NPC( ch ) && ( !IS_SET( ch->act, ACT_INTELLIGENT ) ) ) )
{
send_to_char( "You failed.\n\r", ch );
return FALSE;
}
/*
* Check is ch screws up, and ends up in limbo... <grin>
*/
if( ( number_percent( ) < 15 ) && ( !IS_NPC( ch ) ) ) /* 15% chance */
{
send_to_char( "@@NYou get distracted, and appear in the middle of @@dnowhere@@N!\n\r", ch );
act( "@@N$n begins to disperse into @@lghostly @@Nparticles, then disappears!!", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, get_room_index( ROOM_VNUM_LIMBO ) );
if( ch->riding != NULL )
{
char_from_room( ch->riding );
char_to_room( ch->riding, get_room_index( ROOM_VNUM_LIMBO ) );
}
act( "@@N$n coelesces from a @@lghostly@@N image into the room.", ch, NULL, NULL, TO_ROOM );
do_look( ch, "auto" );
return TRUE;
}
act( "@@N$n begins to disperse into @@lghostly @@Nparticles, then disappears!!", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, get_room_index( ROOM_VNUM_ETHEREAL_PLANE ) );
if( ch->riding != NULL )
{
char_from_room( ch->riding );
char_to_room( ch->riding, get_room_index( ROOM_VNUM_ETHEREAL_PLANE ) );
}
act( "@@N$n coelesces from a @@lghostly@@N image into the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou enter the @@lEthereal Plane@@N!\n\r", ch );
do_look( ch, "auto" );
return TRUE;
}
bool spell_fireelem( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the elemental forces of @@efire@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the elemental forces of @@efire@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA @@ebonfire@@N appears, and an elemental steps from the flames!!", ch, obj, NULL, TO_ROOM );
act( "@@NA @@ebonfire@@N appears, and an elemental steps from the flames!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_FIREELEM ) );
char_to_room( summoned, ch->in_room );
act( "$n leaps from the bonfire, drawing all the @@eflames@@N into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_rune_fire( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_FIRE_RUNE ) )
{
send_to_char( "@@NThere is already a @@eFire@@N Rune operating here!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
act( "$n draws a mystical @@eFire@@N Rune in the air.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou draw a @@eFire@@N Rune in the air.\n\r", ch );
raf.type = sn;
raf.duration = ( level ) + number_range( 2, 20 );
raf.level = level;
raf.bitvector = ROOM_BV_FIRE_RUNE;
raf.caster = ch;
raf.modifier = ( level * 3 ) - number_range( 10, 50 );
affect_to_room( room, &raf );
return TRUE;
}
bool spell_rune_poison( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_POISON_RUNE ) )
{
send_to_char( "@@NThere is already a @@dPoison@@N Rune operating here!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
act( "$n draws a mystical @@dPoison@@N Rune in the air.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou draw a @@dPoison@@N Rune in the air.\n\r", ch );
raf.type = sn;
raf.duration = ( level ) + number_range( 2, 20 );
raf.level = level;
raf.bitvector = ROOM_BV_POISON_RUNE;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_rune_shock( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_SHOCK_RUNE ) )
{
send_to_char( "@@NThere is already a @@lShock@@N Rune operating here!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
act( "$n draws a mystical @@lShock@@N Rune in the air.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou draw a @@lShock@@N Rune in the air.\n\r", ch );
raf.type = sn;
raf.duration = ( level ) + number_range( 2, 20 );
raf.level = level;
raf.bitvector = ROOM_BV_SHOCK_RUNE;
raf.caster = ch;
raf.modifier = ( level * 3 ) - number_range( 10, 50 );
affect_to_room( room, &raf );
return TRUE;
}
bool spell_healing_light( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_HEAL_REGEN ) )
{
send_to_char( "@@NThere is already a @@mHealing Light@@N operating here!\n\r", ch );
return FALSE;
}
act( "@@NA majestic @@mHealing Light@@N fills the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou fill the room with a majestic @@mHealing Light@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 8 ) + number_range( 2, 10 );
raf.level = level;
raf.bitvector = ROOM_BV_HEAL_REGEN;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_wither_shadow( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_HEAL_STEAL ) )
{
send_to_char( "@@NThere is already a @@dWithering Shadow@@N operating here!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
act( "@@NA deadly @@dWithering Shadow@@N fills the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou fill the room with a deadly @@dWithering Shadow@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 8 ) + number_range( 2, 10 );
raf.level = level;
raf.bitvector = ROOM_BV_HEAL_STEAL;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_mana_flare( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_MANA_REGEN ) )
{
send_to_char( "@@NThere is already a @@eMana Flare@@N operating here!\n\r", ch );
return FALSE;
}
act( "@@NA powerful @@eMana Flare@@N encompasses the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou fill the room with a powerful @@eMana Flare@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 8 ) + number_range( 2, 10 );
raf.level = level;
raf.bitvector = ROOM_BV_MANA_REGEN;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_mana_drain( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_MANA_STEAL ) )
{
send_to_char( "@@NThere is already a @@dMana Drain@@N operating here!\n\r", ch );
return FALSE;
}
if( IS_SET( room->area->flags, AREA_NO_ROOM_AFF ) )
{
send_to_char( "A strange @@eDeamon@@N appears, waggles it's finger at you, and shakes its(?) head!\n\r", ch );
return FALSE;
}
act( "@@NA mind-sapping @@dMana Drain@@N fills the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou fill the room with a mind-sapping @@dMana Drain@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 8 ) + number_range( 2, 10 );
raf.level = level;
raf.bitvector = ROOM_BV_MANA_STEAL;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_cage( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_HOLD ) )
{
send_to_char( "@@NThere is already a @@rCage@@N operating here!\n\r", ch );
return FALSE;
}
act( "@@NA paralysing @@rCage@@N surrounds the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou surround the room with a paralyzing @@rCage@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 20 ) + number_range( 2, 10 );
raf.level = level;
raf.bitvector = ROOM_BV_HOLD;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_cloak_flaming( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
if( is_affected( ch, sn ) )
return FALSE;
af.type = sn;
af.duration = ch->level / 8;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_CLOAK_FLAMING;
affect_to_char( ch, &af );
return TRUE;
}
bool spell_cloak_reflect( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
if( is_affected( ch, sn ) )
return FALSE;
af.type = sn;
af.duration = ch->level / 8;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_CLOAK_REFLECTION;
affect_to_char( ch, &af );
return TRUE;
}
bool spell_cloak_absorb( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
if( is_affected( ch, sn ) )
return FALSE;
af.type = sn;
af.duration = ch->level / 8;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_CLOAK_ABSORPTION;
affect_to_char( ch, &af );
return TRUE;
}
bool spell_cloak_adept( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
if( is_affected( ch, sn ) )
return FALSE;
if( IS_NPC( ch ) )
return FALSE;
af.type = sn;
af.duration = get_psuedo_level( ch ) / 5;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_CLOAK_ADEPT;
affect_to_char( ch, &af );
return TRUE;
}
bool spell_cloak_regen( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
AFFECT_DATA af;
if( is_affected( ch, sn ) )
return FALSE;
af.type = sn;
af.duration = get_psuedo_level( ch ) / 10;
af.location = 0;
af.modifier = 0;
af.bitvector = AFF_CLOAK_REGEN;
affect_to_char( ch, &af );
return TRUE;
}
bool spell_room_dispel( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA *raf;
ROOM_AFFECT_DATA *raf_next;
int chance = 0;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_NPC( ch ) && IS_SET( ch->act, ACT_INTELLIGENT ) )
chance = 1000;
else
chance = ch->level + 20;
act( "$n gestures demonically at the magical spells around the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou gesture demonically!\n\r", ch );
for( raf = room->first_room_affect; raf != NULL; raf = raf_next )
{
raf_next = raf->next;
if( number_percent( ) < chance )
{
r_affect_remove( room, raf );
chance = ( 2 * chance ) / 3;
}
else
break;
}
return TRUE;
}
bool spell_throw_star( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if( !sp_damage( obj, ch, ( CHAR_DATA * ) vo,
dice( 5, level / 2 ) + dice( 5, level / 2 ) + level, REALM_POISON, sn, TRUE ) )
return TRUE;
if( !saves_spell( level, victim ) )
{
af.type = sn;
af.duration = 12 + ( level / 10 );
af.location = APPLY_DAMROLL;
af.modifier = -level / 3;
af.bitvector = AFF_POISON;
affect_join( victim, &af );
send_to_char( "You feel very sick.\n\r", victim );
act( "$n looks very sick.", victim, NULL, NULL, TO_ROOM );
}
return TRUE;
}
bool spell_soul_net( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
ROOM_INDEX_DATA *room;
ROOM_AFFECT_DATA raf;
room = ch->in_room;
if( room == NULL )
return FALSE;
if( IS_SET( room->affected_by, ROOM_BV_SOUL_NET ) )
{
send_to_char( "@@NThere is already a @@dSoul Net@@N operating here!\n\r", ch );
return FALSE;
}
act( "@@NA demonic @@dSoul Net@@N enshrouds the room.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou enshroud the room with a demonic @@dSoul Net@@N.\n\r", ch );
raf.type = sn;
raf.duration = ( level / 8 );
raf.level = level;
raf.bitvector = ROOM_BV_SOUL_NET;
raf.caster = ch;
raf.modifier = 0;
affect_to_room( room, &raf );
return TRUE;
}
bool spell_condense_soul( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
OBJ_DATA *ob = ( OBJ_DATA * ) vo;
if( IS_NPC( ch ) )
return FALSE;
if( ob->item_type != ITEM_SOUL )
{
send_to_char( "That is not a soul!.\n\r", ch );
return FALSE;
}
if( ob->level < 80 )
{
send_to_char( "Bah!! That soul is to weak to use!!\n\r", ch );
return FALSE;
}
extract_obj( ob );
ob = create_object( get_obj_index( OBJ_VNUM_SOUL_POTION ), level );
obj_to_char( ob, ch );
act( "@@N$n gestures diabolically, and his captured soul condenses into a@@dSoul Potion@@N.", ch, NULL, NULL, TO_ROOM );
send_to_char( "@@NYou condense the soul and some of your life force into a @@dSoul potion@@N.\n\r", ch );
ch->max_hit -= 75;
ch->pcdata->hp_from_gain -= 75;
return TRUE;
}
bool spell_restoration( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
char buf[MAX_STRING_LENGTH];
if( IS_NPC( ch ) )
return FALSE;
ch->hit = ch->max_hit;
ch->mana = ch->max_mana;
ch->move = ch->max_move;
if( !IS_NPC( ch ) )
ch->pcdata->super->energy = ch->pcdata->super->energy_max;
send_to_char( "@@eTHe life force of tha captured soul restores you!\n\r", ch );
xprintf( buf, " %s has used a restoration spell.\n\r", ch->name );
monitor_chan( buf, MONITOR_BAD );
return TRUE;
}
bool spell_infuse( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
OBJ_DATA *ob = ( OBJ_DATA * ) vo;
AFFECT_DATA *paf;
OBJ_DATA *obj_soul;
if( IS_NPC( ch ) )
return FALSE;
/*
* Quick way to stop imms (Bash?) enchanting weapons for players
*/
if( IS_IMMORTAL( ch ) && ch->level != 85 )
{
send_to_char( "Nothing Happens.\n\r", ch );
return FALSE;
}
if( IS_NPC( ch ) )
return FALSE;
if( ( obj_soul = get_eq_char( ch, WEAR_HOLD_HAND_L ) ) == NULL )
if( ( obj_soul = get_eq_char( ch, WEAR_HOLD_HAND_R ) ) == NULL )
{
send_to_char( "@@NYou must be holding a @@eSoul@@N to cast this spell!!\n\r", ch );
return FALSE;
}
if( obj_soul->item_type != ITEM_SOUL )
{
send_to_char( "@@NYou are not holding a @@eSoul@@N!!\n\r", ch );
return FALSE;
}
if( ob->item_type != ITEM_WEAPON )
{
send_to_char( "That is not a weapon!.\n\r", ch );
return FALSE;
}
for( paf = ob->first_apply; paf != NULL; paf = paf->next )
{
if( paf->type == sn )
{
send_to_char( "That weapon is already infused with a soul!.\n\r", ch );
return FALSE;
}
}
if( ch->pcdata->hp_from_gain < 100 )
{
send_to_char( "You have exhausted your life force, and are unable to"
" control the necromantic forces necessary for this act.\n\r", ch );
return FALSE;
}
GET_FREE( paf, affect_free );
paf->type = sn;
paf->duration = -1;
paf->location = APPLY_DAMROLL;
paf->modifier = ( obj_soul->level / 8 );
paf->bitvector = 0;
paf->caster = NULL;
LINK( paf, ob->first_apply, ob->last_apply, next, prev );
GET_FREE( paf, affect_free );
paf->type = sn;
paf->duration = -1;
paf->location = APPLY_AC;
paf->modifier = -( obj_soul->level / 2 );
paf->bitvector = 0;
paf->caster = NULL;
LINK( paf, ob->first_apply, ob->last_apply, next, prev );
GET_FREE( paf, affect_free );
paf->type = sn;
paf->duration = -1;
paf->location = APPLY_MANA;
paf->modifier = obj_soul->level / 3;
paf->bitvector = 0;
paf->caster = NULL;
LINK( paf, ob->first_apply, ob->last_apply, next, prev );
GET_FREE( paf, affect_free );
paf->type = sn;
paf->duration = -1;
paf->location = APPLY_HITROLL;
paf->modifier = ( obj_soul->level / 8 );
paf->bitvector = 0;
paf->caster = NULL;
LINK( paf, ob->first_apply, ob->last_apply, next, prev );
SET_BIT( ob->extra_flags, ITEM_NODISARM );
SET_BIT( ob->extra_flags, ITEM_NODROP );
SET_BIT( ob->extra_flags, ITEM_NO_AUCTION );
SET_BIT( ob->extra_flags, ITEM_NOSAC );
SET_BIT( ob->extra_flags, ITEM_NOLOOT );
SET_BIT( ob->extra_flags, ITEM_ANTI_GOOD );
SET_BIT( ob->extra_flags, ITEM_NOLOOT );
ob->obj_fun = obj_fun_lookup( "objfun_infused_soul" );
extract_obj( obj_soul );
act( "@@N$n gestures diabolically, and his captured @@esoul@@N is infused into his $P.", ch, NULL, ob, TO_ROOM );
send_to_char( "@@NYou condense the soul and some of your life force into your weapon.\n\r", ch );
ch->max_hit -= 100;
ch->pcdata->hp_from_gain -= 100;
do_save( ch, "" );
return TRUE;
}
bool spell_holy_light( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *gch;
for( gch = ch->in_room->first_person; gch != NULL; gch = gch->next_in_room )
{
if( !is_same_group( ch, gch ) )
continue;
act( "$N is invigorated by the light shining off of $n!", ch, NULL, gch, TO_NOTVICT );
send_to_char( "You feel a warm light invigorate you!\n\r", gch );
gch->hit = UMIN( gch->max_hit, ( gch->hit + number_range( level * 2, level * 5 ) ) );
}
send_to_char( "You invigorate the troops!\n\r", ch );
return TRUE;
}
bool spell_holy_armor( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
AFFECT_DATA af;
if( is_affected( victim, sn ) )
return FALSE;
af.type = sn;
af.duration = 2 + ( level / 7 );
af.modifier = -80 - get_psuedo_level( ch ) / 5;
af.location = APPLY_AC;
af.bitvector = 0;
affect_to_char( victim, &af );
send_to_char( "Your armor is now blessed!.\n\r", victim );
if( ch != victim )
send_to_char( "Ok.\n\r", ch );
return TRUE;
}
bool spell_divine_intervention( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
int heal;
heal = UMAX( 600, number_range( level * 4, level * 10 ) );
victim->hit = UMIN( victim->hit + heal, victim->max_hit );
update_pos( victim );
send_to_char( "You feel the hand of your God invigorate your soul!\n\r", victim );
if( ch != victim )
send_to_char( "Ok.\n\r", ch );
return TRUE;
}
bool spell_earthelem( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the elemental forces of @@bearth@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the elemental forces of @@bearth@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA huge mound of @@bearth@@N appears, and an elemental steps from the boulders!!", ch, obj, NULL, TO_ROOM );
act( "@@NA huge mound of @@bearth@@N appears, and an elemental steps from the boulders!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_EARTHELEM ) );
char_to_room( summoned, ch->in_room );
act( "@@N$n emerges from the mound, assuming the @@bearth@@N into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_iron_golem( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "@@N$n calls upon the @@aalchemical@@N forces of @@dmetal@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the @@aalchemical@@N forces of @@dmetal@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA large slab of @@diron@@N appears, and a golem steps from the mass!!", ch, obj, NULL, TO_ROOM );
act( "@@NA large slab of @@diron@@N appears, and a golem steps from the mass!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_IRON_GOLEM ) );
char_to_room( summoned, ch->in_room );
act( "@@N$n mutates from the @@dslab of iron@@N, drawing all the metal into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_soul_thief( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the @@dNegative Plane@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the @@dNegative Plane@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NThe ground opens beneath you, and a @@lSoul @@eThief@@N crawls out of the graveyard filth!!", ch, obj, NULL,
TO_ROOM );
act( "@@NThe ground opens beneath you, and a @@lSoul @@eThief@@N crawls out of the graveyard filth!!", ch, obj, NULL,
TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_SOUL_THIEF ) );
char_to_room( summoned, ch->in_room );
act( "$n Stands erect, and bow's towards it's master.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_holy_avenger( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the holy forces of @@Wlight@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the holy forces of @@Wlight@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA shimmering halo appears, and a @@yHoly @@WAvenger@@N steps from the light!!", ch, obj, NULL, TO_ROOM );
act( "@@NA shimmering halo appears, and a @@yHoly @@WAvenger@@N steps from the light!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_HOLY_AVENGER ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the light, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_diamond_golem( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "@@N$n calls upon the @@aalchemical@@N forces of @@ylight@@N!", ch, obj, NULL, TO_ROOM );
act( "@@NYou call upon the @@aalchemical@@N forces of @@ylight@@N.", ch, obj, NULL, TO_CHAR );
act( "A huge gemstone appears, and a golem steps from the diamond!!", ch, obj, NULL, TO_ROOM );
act( "A huge gemstone appears, and a golem steps from the diamond!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_DIAMOND_GOLEM ) );
char_to_room( summoned, ch->in_room );
act( "$n floods from the pool, drawing all the water into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_summon_pegasus( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the holy forces of @@Wlight@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the holy forces of @@Wlight@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA shimmering pyramid appears, and a @@mMagestic @@WPegasus@@N steps from the light!!", ch, obj, NULL, TO_ROOM );
act( "@@NA shimmering pyramid appears, and a @@mMagestic @@WPagsus@@N steps from the light!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_PEGASUS ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the light, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_summon_nightmare( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the unholy forces of @@eEvil@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the unholy forces of @@eEvil@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA flaming pit appears, and a @@eDemonic @@dNightmare@@N steps from the heat!!", ch, obj, NULL, TO_ROOM );
act( "@@NA flaming pit appears, and a @@eDemonic @@dNightmare@@N steps from the heat!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_NIGHTMARE ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the flames, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_summon_beast( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the elemental forces of @@lAir@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the elemental forces of @@'Air@@N.", ch, obj, NULL, TO_CHAR );
act( "@@NA whirlwind appears, and an @@lElemental @@aBeast@@N steps from the winds!!", ch, obj, NULL, TO_ROOM );
act( "@@NA whirlwind appears, and an @@lElemental @@aBeast@@N steps from the winds!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_ELEM_BEAST ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the whirlwind, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_summon_devourer( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the psychic forces of the @@rMind@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the psychic forces of the @@rMind@@N!", ch, obj, NULL, TO_CHAR );
act( "@@NA vortex appears, and an @@rIntellect @@bDevourer@@N steps from the circle!!", ch, obj, NULL, TO_ROOM );
act( "@@NA vortex appears, and an @@rIntellect @@bDevourer@@N steps from the circle!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_INT_DEVOURER ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the vortex, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_summon_shadow( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *summoned;
act( "$n calls upon the shadowy forces of @@dDarkness@@N!", ch, obj, NULL, TO_ROOM );
act( "You call upon the shadowy forces of @@dDarkness@@N!", ch, obj, NULL, TO_CHAR );
act( "@@NA tunnel of shadow appears, and a @@dShadow @@RHound@@N steps from the depths!!", ch, obj, NULL, TO_ROOM );
act( "@@NA tunnel of shadow appears, and a @@dShadow @@RHound@@N steps from the depths!!", ch, obj, NULL, TO_CHAR );
summoned = create_mobile( get_mob_index( MOB_VNUM_SHADOW_HOUND ) );
char_to_room( summoned, ch->in_room );
act( "$n steps from the tunnel, drawing all the power into it's body.", summoned, NULL, NULL, TO_ROOM );
/*
* don't think we need these
* summoned->level = 40;
* summoned->max_hit = dice( 8, 40 );
* summoned->hit = summoned->max_hit;
* summoned->max_move = dice( 10, 40 );
* summoned->move = summoned->max_move;
*
*/
SET_BIT( summoned->act, ACT_PET );
SET_BIT( summoned->affected_by, AFF_CHARM );
summoned->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( summoned, ch );
return TRUE;
}
bool spell_lava_burst( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
float save_mod = 1.0;
if( saves_spell( level, victim ) )
save_mod = .75;
if( number_range( 0, 100 ) < 50 )
{
OBJ_DATA *heated_item = NULL;
OBJ_DATA *prev_carried = NULL;
for( heated_item = victim->first_carry; heated_item != NULL; heated_item = heated_item->next_in_carry_list )
{
if( heated_item->wear_loc == WEAR_NONE )
continue;
prev_carried = heated_item;
if( number_range( 0, 100 ) < 25 )
continue;
else
break;
}
if( heated_item == NULL )
{
if( prev_carried != NULL )
{
SET_BIT( prev_carried->item_apply, ITEM_APPLY_HEATED );
return TRUE;
}
else
{
return TRUE;
}
}
else
{
SET_BIT( heated_item->item_apply, ITEM_APPLY_HEATED );
return TRUE;
}
}
sp_damage( obj, ch, ( CHAR_DATA * ) vo,
number_range( get_psuedo_level( ch ) * 2, get_psuedo_level( ch ) * 4 ) * save_mod, REALM_FIRE, sn, TRUE );
return TRUE;
}
bool spell_heat_armor( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
if( saves_spell( level, victim ) && ( number_range( 0, 99 ) < 50 ) )
return TRUE;
{
OBJ_DATA *heated_item = NULL;
OBJ_DATA *prev_carried = NULL;
for( heated_item = victim->first_carry; heated_item != NULL; heated_item = heated_item->next_in_carry_list )
{
if( heated_item->wear_loc == WEAR_NONE )
continue;
prev_carried = heated_item;
if( number_range( 0, 100 ) < 25 )
continue;
else
break;
}
if( heated_item == NULL )
{
if( prev_carried != NULL )
{
if( ( !IS_NPC( victim ) && IS_WOLF( victim ) ) && ( !IS_RAGED( victim ) && !IS_SHIFTED( victim ) ) )
SET_BIT( prev_carried->item_apply, ITEM_APPLY_HEATED );
return TRUE;
}
else
{
return TRUE;
}
}
else
{
if( ( !IS_NPC( victim ) && IS_WOLF( victim ) ) && ( !IS_RAGED( victim ) && !IS_SHIFTED( victim ) ) )
SET_BIT( heated_item->item_apply, ITEM_APPLY_HEATED );
return TRUE;
}
}
return TRUE;
}
bool spell_retri_strike( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
OBJ_DATA *staff_obj = NULL;
if( ( staff_obj = get_eq_char( ch, WEAR_HOLD_HAND_R ) ) == NULL )
if( ( staff_obj = get_eq_char( ch, WEAR_HOLD_HAND_L ) ) == NULL )
{
send_to_char( "You must be holding a @@rstaff@@N for this spell!\n\r", ch );
return FALSE;
}
if( staff_obj->item_type != ITEM_STAFF )
{
send_to_char( "That is not a staff you are holding, you fool!!\n\r", ch );
return FALSE;
}
if( obj == NULL )
{
send_to_char( "The earth trembles beneath your feet!\n\r", ch );
act( "$n makes the earth tremble and shiver.", ch, NULL, NULL, TO_ROOM );
}
else
{
act( "$p vibrates violently, making the earth tremble!", ch, obj, NULL, TO_CHAR );
act( "$p vibrates violenty, making the earth around $n tremble!", ch, obj, NULL, TO_ROOM );
}
CREF( vch_next, CHAR_NEXT );
for( vch = first_char; vch != NULL; vch = vch_next )
{
vch_next = vch->next;
if( vch->in_room == NULL )
continue;
if( vch->in_room == ch->in_room )
{
if( vch != ch )
{
OBJ_DATA *heated_item = NULL;
OBJ_DATA *prev_carried = NULL;
act( "@@W$n @@Wis @@eimmolated@@N by the fury released from the $p@@W, and falls to the ground!", vch, staff_obj,
NULL, TO_ROOM );
act( "@@WYou are @@eimmolated@@N by the fury released from the $p@@W, and fall to the ground!", vch, staff_obj,
NULL, TO_CHAR );
if( !sp_damage
( obj, ch, vch, number_range( staff_obj->level * 6, staff_obj->level * 10 ), REALM_LIGHT, sn, FALSE ) )
continue;
for( heated_item = vch->first_carry; heated_item != NULL; heated_item = heated_item->next_in_carry_list )
{
if( heated_item->wear_loc == WEAR_NONE )
continue;
prev_carried = heated_item;
if( number_range( 0, 100 ) < 25 )
continue;
else
break;
}
if( heated_item == NULL )
{
if( prev_carried != NULL )
{
if( ( !IS_NPC( vch ) && IS_WOLF( vch ) ) && ( !IS_RAGED( vch ) && !IS_SHIFTED( vch ) ) )
SET_BIT( prev_carried->item_apply, ITEM_APPLY_HEATED );
}
}
else
{
if( ( !IS_NPC( vch ) && IS_WOLF( vch ) ) && ( !IS_RAGED( vch ) && !IS_SHIFTED( vch ) ) )
SET_BIT( heated_item->item_apply, ITEM_APPLY_HEATED );
}
}
continue;
}
else
{
act( "@@W$n @@Wis protected by the fury of the @@W$p@@W.", vch, staff_obj, NULL, TO_ROOM );
continue;
}
if( vch->in_room->area == ch->in_room->area )
send_to_char( "@@WSuddenly, a @@ybright flash@@W sears your eyes, then is gone.@@N\n\r", vch );
}
CUREF( vch_next );
extract_obj( staff_obj );
return TRUE;
}
void do_stance( CHAR_DATA * ch, char *argument )
{
char arg[MAX_STRING_LENGTH];
bool legal_stance = FALSE;
sh_int i;
if( IS_NPC( ch ) )
{
send_to_char( "Not for Npcs!\n\r", ch );
return;
}
if( IS_WOLF( ch ) && ( IS_SHIFTED( ch ) || IS_RAGED( ch ) ) )
{
send_to_char( "This form is not capable of fighting Stances.\n\r", ch );
return;
}
one_argument( argument, arg );
if( arg[0] == '\0' )
{
char cat_buf[MSL];
char msg_buf[MSL];
xprintf( msg_buf, "\n\r%s\n\r", "Fighting Stances available to you:\n\r" );
for( i = 0; i < MAX_STANCE; i++ )
{
switch ( i )
{
case STANCE_WARRIOR:
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_CASTER:
if( ( ch->lvl[0] > 50 ) /* mage */
|| ( ch->lvl[1] > 70 ) /* cleric */
|| ( ch->lvl[4] > 60 ) ) /* psi */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_WIZARD:
if( ( ch->lvl2[0] > 20 ) /* sorc */
|| ( ch->lvl2[3] > 40 ) /* necro */
|| ( ch->lvl2[4] > 60 ) ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_MAGI:
if( ( ch->adept_level > 10 ) ) /*adept */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_AMBUSH:
if( ch->lvl2[1] > 30 ) /* assassin */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_AC_BEST:
if( ( ch->lvl2[2] > 65 ) /* knight */
|| ( ch->lvl2[4] > 30 ) ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_HR_BEST:
if( ( ch->lvl2[2] > 45 ) /* knight */
|| ( ch->lvl2[4] > 20 ) ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_DR_BEST:
if( ( ch->lvl2[2] > 35 ) /* knight */
|| ( ch->lvl2[4] > 10 ) ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_AC_WORST:
if( ch->lvl2[4] > 45 ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_HR_WORST:
if( ch->lvl2[4] > 60 ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_DR_WORST:
if( ch->lvl2[4] > 70 ) /* monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_SUPER_FIGHTER:
if( ( ch->lvl2[4] > 79 ) && ( ch->lvl2[2] > 79 ) ) /* both knight and monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
case STANCE_SUPER_SPEED:
if( ( ch->lvl2[4] > 70 ) && ( ch->lvl2[2] > 70 ) ) /* both knight and monk */
xprintf( cat_buf, "%s\n\r", stance_app[i].name );
break;
}
xcat( msg_buf, cat_buf );
xprintf( cat_buf, "%s", "" );
}
xprintf( cat_buf, "%s",
"Type stance <stance name> to change your current fighting stance.\n\r You may place your current Stance in your prompt with a \%s\n\r" );
xcat( msg_buf, cat_buf );
send_to_char( msg_buf, ch );
return;
}
for( i = 0; i < MAX_STANCE; i++ )
if( !str_prefix( arg, stance_app[i].name ) )
break;
if( i == MAX_STANCE )
{
do_stance( ch, "" );
act( "$n poses in a strange fashion, looking rather silly.", ch, NULL, NULL, TO_ROOM );
send_to_char( "You twist about wildly, but are unable to figure out just the right Stance.\n\r", ch );
}
else
{
switch ( i )
{
case STANCE_WARRIOR:
{
legal_stance = TRUE;
break;
}
case STANCE_CASTER:
if( ( ch->lvl[0] > 50 ) /* mage */
|| ( ch->lvl[1] > 70 ) /* cleric */
|| ( ch->lvl[4] > 60 ) ) /* psi */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_WIZARD:
if( ( ch->lvl2[0] > 20 ) /* sorc */
|| ( ch->lvl2[3] > 40 ) /* necro */
|| ( ch->lvl2[4] > 60 ) ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_MAGI:
if( ( ch->adept_level > 10 ) ) /*adept */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_AMBUSH:
if( ch->lvl2[1] > 30 ) /* assassin */
{
CHAR_DATA *other;
for( other = ch->in_room->first_person; other != NULL; other = other->next_in_room )
if( ( other != ch ) && ( other != NULL ) )
break;
if( other != NULL )
{
send_to_char( "You can't set an ambush with people watching you!\n\r", ch );
}
else
{
legal_stance = TRUE;
}
break;
}
break;
case STANCE_AC_BEST:
if( ( ch->lvl2[2] > 65 ) /* knight */
|| ( ch->lvl2[4] > 30 ) ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_HR_BEST:
if( ( ch->lvl2[2] > 45 ) /* knight */
|| ( ch->lvl2[4] > 20 ) ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_DR_BEST:
if( ( ch->lvl2[2] > 35 ) /* knight */
|| ( ch->lvl2[4] > 10 ) ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_AC_WORST:
if( ch->lvl2[4] > 45 ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_HR_WORST:
if( ch->lvl2[4] > 60 ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_DR_WORST:
if( ch->lvl2[4] > 70 ) /* monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_SUPER_FIGHTER:
if( ( ch->lvl2[4] > 79 ) && ( ch->lvl2[2] > 79 ) ) /* both knight and monk */
{
legal_stance = TRUE;
break;
}
break;
case STANCE_SUPER_SPEED:
if( ( ch->lvl2[4] > 70 ) && ( ch->lvl2[2] > 70 ) ) /* both knight and monk */
{
legal_stance = TRUE;
break;
}
break;
}
if( legal_stance )
{
char stance_buf[MSL];
if( stance_app[i].ac_mod > 0 )
ch->stance_ac_mod = ( stance_app[i].ac_mod * ( 20 - get_psuedo_level( ch ) / 12 ) );
else
ch->stance_ac_mod = stance_app[i].ac_mod * get_psuedo_level( ch ) / 12;
if( stance_app[i].dr_mod < 0 )
ch->stance_dr_mod = ( stance_app[i].dr_mod * ( 20 - get_psuedo_level( ch ) / 12 ) );
else
ch->stance_dr_mod = stance_app[i].dr_mod * get_psuedo_level( ch ) / 10;
if( stance_app[i].hr_mod < 0 )
ch->stance_hr_mod = ( stance_app[i].hr_mod * ( 20 - get_psuedo_level( ch ) / 12 ) );
else
ch->stance_hr_mod = stance_app[i].hr_mod * get_psuedo_level( ch ) / 10;
ch->stance = i;
xprintf( stance_buf, "$n assumes the Stance of the %s!", stance_app[i].name );
act( stance_buf, ch, NULL, NULL, TO_ROOM );
xprintf( stance_buf, "You assume the Stance of the %s!\n\r", stance_app[i].name );
send_to_char( stance_buf, ch );
}
WAIT_STATE( ch, 350 );
return;
}
}
bool spell_creature_bond( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
CHAR_DATA *master;
if( IS_NPC( ch ) )
{
send_to_char( "Not for Npcs.\n\r", ch );
return FALSE;
}
if( ( !IS_NPC( victim ) ) || ( !IS_SET( victim->affected_by, AFF_CHARM ) ) )
{
send_to_char( "That is not a charmed creature!\n\r", ch );
return FALSE;
}
master = victim->master ? victim->master : victim;
if( ( master != NULL ) && ( get_psuedo_level( ch ) < ( get_psuedo_level( master ) - 20 ) ) )
{
send_to_char( "The current bond is too strong for you to overcome.\n\r", ch );
return FALSE;
}
if( number_range( 0, 105 ) < ( level + ( get_psuedo_level( ch ) - get_psuedo_level( master ) ) ) )
{
if( saves_spell( level, victim ) )
{
do_say( victim, "How dare you!, I LOVE my master!" );
one_hit( victim, ch, TYPE_UNDEFINED );
return TRUE;
}
stop_follower( victim );
SET_BIT( victim->act, ACT_PET );
SET_BIT( victim->affected_by, AFF_CHARM );
victim->extract_timer = get_psuedo_level( ch ) / 3;
add_follower( victim, ch );
}
else
{
do_say( victim, "How dare you!, I LOVE my master!" );
one_hit( victim, ch, TYPE_UNDEFINED );
return TRUE;
}
return TRUE;
}
bool spell_corrupt_bond( int sn, int level, CHAR_DATA * ch, void *vo, OBJ_DATA * obj )
{
CHAR_DATA *victim = ( CHAR_DATA * ) vo;
CHAR_DATA *master = NULL;
if( IS_NPC( ch ) )
{
send_to_char( "Not for Npcs.\n\r", ch );
return FALSE;
}
if( ( !IS_NPC( victim ) ) || ( !IS_SET( victim->affected_by, AFF_CHARM ) ) )
{
send_to_char( "That is not a charmed creature!\n\r", ch );
return FALSE;
}
master = victim->master ? victim->master : victim;
if( ( master != NULL ) && ( get_psuedo_level( ch ) < ( get_psuedo_level( master ) - 20 ) ) )
{
send_to_char( "The current bond is too strong for you to corrupt.\n\r", ch );
return FALSE;
}
if( number_range( 0, 105 ) < ( level + ( get_psuedo_level( ch ) - get_psuedo_level( master ) ) ) )
{
if( saves_spell( level, victim ) )
{
do_say( victim, "How dare you!, I LOVE my master!" );
one_hit( victim, ch, TYPE_UNDEFINED );
return TRUE;
}
stop_follower( victim );
if( victim->in_room == master->in_room )
{
do_say( victim, "Now I shall have my revenge for being charmed!!!" );
one_hit( victim, master, TYPE_UNDEFINED );
return TRUE;
}
else
{
do_say( victim, "AARRGH! I HATE being charmed! Now I shall have my revenge!" );
victim->hunt_flags = HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR | HUNT_UNLOCKDOOR | HUNT_INFORM;
set_hunt( victim, NULL, master, NULL, HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR | HUNT_UNLOCKDOOR | HUNT_INFORM,
HUNT_MERC | HUNT_CR );
return TRUE;
}
}
else
{
do_say( victim, "How dare you!, I LOVE my master!" );
one_hit( victim, ch, TYPE_UNDEFINED );
return TRUE;
}
return TRUE;
}