/**************************************************************************** * Eldhamud Codebase V2.2 * * ------------------------------------------------------------------------ * * EldhaMUD code (C) 2003-2008 by Robert Powell (Tommi) * * ------------------------------------------------------------------------ * * mental skills file * ****************************************************************************/ #include "./Headers/mud.h" ch_ret spell_cure_blindness( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; SKILLTYPE *skill = get_skilltype( sn ); set_char_color( AT_MAGIC, ch ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( !is_affected( victim, gsn_blindness ) ) { if( ch != victim ) send_to_char( "You work your cure, but it has no apparent effect.\n\r", ch ); else send_to_char( "You don't seem to be blind.\n\r", ch ); return rSPELL_FAILED; } affect_strip( victim, gsn_blindness ); set_char_color( AT_MAGIC, victim ); send_to_char( "Your vision returns!\n\r", victim ); if( ch != victim ) send_to_char( "You work your cure, restoring vision.\n\r", ch ); return rNONE; } ch_ret spell_cure_poison( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; SKILLTYPE *skill = get_skilltype( sn ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( is_affected( victim, gsn_poison ) ) { affect_strip( victim, gsn_poison ); set_char_color( AT_MAGIC, victim ); send_to_char( "A warm feeling runs through your body.\n\r", victim ); if( ch != victim ) { act( AT_MAGIC, "A flush of health washes over $N.", ch, NULL, victim, TO_NOTVICT ); act( AT_MAGIC, "You lift the poison from $N's body.", ch, NULL, victim, TO_CHAR ); } return rNONE; } else { set_char_color( AT_MAGIC, ch ); if( ch != victim ) send_to_char( "You work your cure, but it has no apparent effect.\n\r", ch ); else send_to_char( "You don't seem to be poisoned.\n\r", ch ); return rSPELL_FAILED; } } ch_ret spell_dispel_magic( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA *paf, *paf_next; SKILLTYPE *skill = NULL; set_char_color( AT_MAGIC, ch ); if( victim != ch ) { /* Edited by Tarl 27 Mar 02 to correct */ if( saves_spell_staff( level, victim ) ) { set_char_color( AT_MAGIC, ch ); send_to_char( "You weave arcane gestures, but the spell does nothing.\n\r", ch ); return rSPELL_FAILED; } } /* * Remove ALL affects generated by spells, and kill the AFF_X bit for it as well */ for( paf = victim->first_affect; paf != NULL; paf = paf_next ) { paf_next = paf->next; if( ( skill = get_skilltype( paf->type ) ) != NULL ) { if( skill->type == SKILL_SPELL ) { if( skill->msg_off ) ch_printf( victim, "%s\n\r", skill->msg_off ); xREMOVE_BIT( victim->affected_by, paf->modifier ); affect_remove( victim, paf ); } } } /* * Now we get to do the hard part - step thru and look for things to dispel when it's not set by a spell. */ if( IS_AFFECTED( victim, AFF_SANCTUARY ) ) xREMOVE_BIT( victim->affected_by, AFF_SANCTUARY ); if( IS_AFFECTED( victim, AFF_FAERIE_FIRE ) ) xREMOVE_BIT( victim->affected_by, AFF_FAERIE_FIRE ); if( IS_AFFECTED( victim, AFF_CURSE ) ) xREMOVE_BIT( victim->affected_by, AFF_CURSE ); if( IS_AFFECTED( victim, AFF_PROTECT ) ) xREMOVE_BIT( victim->affected_by, AFF_PROTECT ); if( IS_AFFECTED( victim, AFF_SLEEP ) ) xREMOVE_BIT( victim->affected_by, AFF_SLEEP ); if( IS_AFFECTED( victim, AFF_CHARM ) ) xREMOVE_BIT( victim->affected_by, AFF_CHARM ); if( IS_AFFECTED( victim, AFF_ACIDMIST ) ) xREMOVE_BIT( victim->affected_by, AFF_ACIDMIST ); if( IS_AFFECTED( victim, AFF_TRUESIGHT ) ) xREMOVE_BIT( victim->affected_by, AFF_TRUESIGHT ); if( IS_AFFECTED( victim, AFF_FIRESHIELD ) ) xREMOVE_BIT( victim->affected_by, AFF_FIRESHIELD ); if( IS_AFFECTED( victim, AFF_SHOCKSHIELD ) ) xREMOVE_BIT( victim->affected_by, AFF_SHOCKSHIELD ); if( IS_AFFECTED( victim, AFF_VENOMSHIELD ) ) xREMOVE_BIT( victim->affected_by, AFF_VENOMSHIELD ); if( IS_AFFECTED( victim, AFF_ICESHIELD ) ) xREMOVE_BIT( victim->affected_by, AFF_ICESHIELD ); set_char_color( AT_MAGIC, ch ); ch_printf( ch, "You weave arcane gestures, and %s's spells are negated!\n\r", IS_NPC( victim ) ? victim->short_descr : victim->name ); /* * Have to reset victim's racial and eq affects etc */ if( !IS_NPC( victim ) ) update_aris( victim ); if( IS_NPC( victim ) ) { if( !ch->fighting || ( ch->fighting && ch->fighting->who != victim ) ) multi_hit( ch, victim, TYPE_UNDEFINED ); } return rNONE; } ch_ret spell_remove_curse( int sn, int level, CHAR_DATA * ch, void *vo ) { OBJ_DATA *obj; CHAR_DATA *victim = ( CHAR_DATA * ) vo; SKILLTYPE *skill = get_skilltype( sn ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( is_affected( victim, gsn_curse ) ) { affect_strip( victim, gsn_curse ); set_char_color( AT_MAGIC, victim ); send_to_char( "The weight of your curse is lifted.\n\r", victim ); if( ch != victim ) { act( AT_MAGIC, "You dispel the curses afflicting $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n's dispels the curses afflicting $N.", ch, NULL, victim, TO_NOTVICT ); } } else if( victim->first_carrying ) { for( obj = victim->first_carrying; obj; obj = obj->next_content ) if( !obj->in_obj && ( IS_OBJ_STAT( obj, ITEM_NOREMOVE ) || IS_OBJ_STAT( obj, ITEM_NODROP ) ) ) { if( IS_OBJ_STAT( obj, ITEM_NOREMOVE ) ) xREMOVE_BIT( obj->extra_flags, ITEM_NOREMOVE ); if( IS_OBJ_STAT( obj, ITEM_NODROP ) ) xREMOVE_BIT( obj->extra_flags, ITEM_NODROP ); set_char_color( AT_MAGIC, victim ); send_to_char( "You feel a burden released.\n\r", victim ); if( ch != victim ) { act( AT_MAGIC, "You dispel the curses afflicting $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n's dispels the curses afflicting $N.", ch, NULL, victim, TO_NOTVICT ); } return rNONE; } } return rNONE; } ch_ret spell_identify( int sn, int level, CHAR_DATA * ch, void *vo ) { OBJ_DATA *obj; AFFECT_DATA *paf; SKILLTYPE *sktmp; if( target_name[0] == STRING_NULL ) { send_to_char( "What should the spell be cast upon?\n\r", ch ); return rSPELL_FAILED; } if( ( obj = get_obj_carry( ch, target_name ) ) != NULL ) { set_char_color( AT_IDENTIFY, ch ); send_to_char( "&D--------------------------------------------------------------------------------\n\r", ch); ch_printf( ch, "Object: &w'%s&D'\n\r", obj->short_descr ); send_to_char( "&D--------------------------------------------------------------------------------\n\r", ch); ch_printf( ch, "Item Type : &w%s&D\n\r", item_type_name( obj ) ); if( obj->item_type != ITEM_LIGHT && obj->wear_flags - 1 > 0 ) ch_printf( ch, "Wear location:&w %s&D\n\r", flag_string( obj->wear_flags, w_flags ) ); ch_printf( ch, "Weight :&w %d&D\n\r", obj->weight); ch_printf( ch, "Level :&w %d&D\n\r", obj->level); ch_printf( ch, "Cost :&w %d&D\n\r", obj->cost); ch_printf( ch, "Flags :&w %s&D\n\r", extra_bit_name( &obj->extra_flags ) ); switch ( obj->item_type ) { case ITEM_CONTAINER: ch_printf( ch, "&wCapacity : %d&D items.\n\r", obj->value[0] ); break; case ITEM_PILL: case ITEM_SCROLL: case ITEM_POTION: ch_printf( ch, "Level %d spells of:", obj->value[0] ); if( obj->value[1] >= 0 && ( sktmp = get_skilltype( obj->value[1] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } if( obj->value[2] >= 0 && ( sktmp = get_skilltype( obj->value[2] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } if( obj->value[3] >= 0 && ( sktmp = get_skilltype( obj->value[3] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } send_to_char( ".\n\r", ch ); break; case ITEM_SALVE: ch_printf( ch, "Has %d(%d) applications of level %d", obj->value[1], obj->value[2], obj->value[0] ); if( obj->value[4] >= 0 && ( sktmp = get_skilltype( obj->value[4] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } if( obj->value[5] >= 0 && ( sktmp = get_skilltype( obj->value[5] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } send_to_char( ".\n\r", ch ); break; case ITEM_WAND: case ITEM_STAFF: ch_printf( ch, "Has %d(%d) charges of level %d", obj->value[1], obj->value[2], obj->value[0] ); if( obj->value[3] >= 0 && ( sktmp = get_skilltype( obj->value[3] ) ) != NULL ) { send_to_char( " '", ch ); send_to_char( sktmp->name, ch ); send_to_char( "'", ch ); } send_to_char( ".\n\r", ch ); break; case ITEM_WEAPON: ch_printf( ch, "Damage : &w%d &Dto &w%d &D(average &w%d&D)\n\r", obj->value[1], obj->value[2], ( obj->value[1] + obj->value[2] ) / 2); ch_printf( ch, "Skill needed : &w%s&D\n\r", weapon_skills[obj->value[4]] ); ch_printf( ch, "Damage type : &w%s&D\n\r", attack_table[obj->value[3]] ); break; case ITEM_MISSILE_WEAPON: ch_printf( ch, "Bonus damage added to projectiles is %d to %d (average %d).\n\r", obj->value[1], obj->value[2], ( obj->value[1] + obj->value[2] ) / 2 ); ch_printf( ch, "Skill needed: %s\n\r", weapon_skills[obj->value[4]] ); ch_printf( ch, "Projectiles fired: %s\n\r", projectiles[obj->value[5]] ); break; case ITEM_PROJECTILE: ch_printf( ch, "Damage is %d to %d (average %d)%s\n\r", obj->value[1], obj->value[2], ( obj->value[1] + obj->value[2] ) / 2, IS_OBJ_STAT( obj, ITEM_POISONED ) ? ", and is poisonous." : "." ); ch_printf( ch, "Damage type: %s\n\r", attack_table[obj->value[3]] ); ch_printf( ch, "Projectile type: %s\n\r", projectiles[obj->value[4]] ); break; case ITEM_ARMOR: ch_printf( ch, "Armor Class : &w%d&D.\n\r", obj->value[0] ); break; } for( paf = obj->pIndexData->first_affect; paf; paf = paf->next ) showaffect( ch, paf ); for( paf = obj->first_affect; paf; paf = paf->next ) showaffect( ch, paf ); send_to_char( "--------------------------------------------------------------------------------\n\r", ch); return rNONE; } else { ch_printf( ch, "You can't find %s!\n\r", target_name ); return rSPELL_FAILED; } return rNONE; } ch_ret spell_fireball( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; dam = dice( level, 6 ); if( saves_spell_staff( level, victim ) ) dam /= 2; act( AT_MAGIC, "A ball of blue flames explodes upon $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "A ball of blue flames flys forth from $n outstretched hand enveloping $N.", ch, NULL, victim, TO_NOTVICT ); return damage( ch, victim, dam, sn ); } ch_ret spell_blindness( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; int tmp; SKILLTYPE *skill = get_skilltype( sn ); if( SPELL_FLAG( skill, SF_PKSENSITIVE ) && !IS_NPC( ch ) && !IS_NPC( victim ) ) tmp = level / 2; else tmp = level; if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( IS_AFFECTED( victim, AFF_BLIND ) || saves_spell_staff( tmp, victim ) ) { failed_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } af.type = sn; af.location = APPLY_HITROLL; af.modifier = -4; af.duration = ( 1 + ( level / 3 ) ) * DUR_CONV; af.bitvector = meb( AFF_BLIND ); affect_to_char( victim, &af ); set_char_color( AT_MAGIC, victim ); send_to_char( "You are blinded!\n\r", victim ); if( ch != victim ) { act( AT_MAGIC, "You weave a spell of blindness around $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n weaves a spell of blindness about $N.", ch, NULL, victim, TO_NOTVICT ); } return rNONE; } ch_ret spell_curse( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; SKILLTYPE *skill = get_skilltype( sn ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( IS_AFFECTED( victim, AFF_CURSE ) || saves_spell_staff( level, victim ) ) { failed_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } af.type = sn; af.duration = ( 4 * level ) * DUR_CONV; af.location = APPLY_HITROLL; af.modifier = -1; af.bitvector = meb( AFF_CURSE ); affect_to_char( victim, &af ); af.location = APPLY_SAVING_SPELL; af.modifier = 1; affect_to_char( victim, &af ); set_char_color( AT_MAGIC, victim ); send_to_char( "You feel unclean.\n\r", victim ); if( ch != victim ) { act( AT_MAGIC, "You utter a curse upon $N.", ch, NULL, victim, TO_CHAR ); act( AT_MAGIC, "$n utters a curse upon $N.", ch, NULL, victim, TO_NOTVICT ); } return rNONE; } ch_ret spell_energy_drain( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; int dam; int schance; SKILLTYPE *skill = get_skilltype( sn ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } schance = ris_save( victim, victim->level, RIS_DRAIN ); if( schance == 1000 || saves_spell_staff( schance, victim ) ) { failed_casting( skill, ch, victim, NULL ); /* SB */ return rSPELL_FAILED; } ch->alignment = UMAX( -1000, ch->alignment - 200 ); if( victim->level <= 2 ) dam = ch->hit + 1; else { gain_exp( victim, 0 - number_range( level / 2, 3 * level / 2 ) ); victim->mana /= 2; victim->move /= 2; dam = dice( 1, level ); ch->hit += dam; } if( ch->hit > ch->max_hit ) ch->hit = ch->max_hit; return damage( ch, victim, dam, sn ); } ch_ret spell_poison( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; int schance; bool first = TRUE; schance = ris_save( victim, level, RIS_POISON ); if( schance == 1000 || saves_poison_death( schance, victim ) ) { set_char_color( AT_MAGIC, ch ); send_to_char( "Your magic fails to take hold.\n\r", ch ); return rSPELL_FAILED; } if( IS_AFFECTED( victim, AFF_POISON ) ) first = FALSE; af.type = sn; af.duration = level * DUR_CONV; af.location = APPLY_STR; af.modifier = -2; af.bitvector = meb( AFF_POISON ); affect_join( victim, &af ); set_char_color( AT_GREEN, victim ); send_to_char( "You feel very sick.\n\r", victim ); if( ch != victim ) { act( AT_GREEN, "$N shivers as your poison spreads through $S body.", ch, NULL, victim, TO_CHAR ); act( AT_GREEN, "$N shivers as $n's poison spreads through $S body.", ch, NULL, victim, TO_NOTVICT ); } return rNONE; } ch_ret spell_enchant_weapon( int sn, int level, CHAR_DATA * ch, void *vo ) { OBJ_DATA *obj = ( OBJ_DATA * ) vo; AFFECT_DATA *paf; int aenchant; int oldaffect, exchance; if( ( obj->item_type != ITEM_WEAPON || IS_OBJ_STAT( obj, ITEM_MAGIC ) ) && !IS_IMMORTAL( ch ) ) /* Must be a Weapon, and NON-MAGIC .. Except for IMMORTALS - Badastaz */ { act( AT_MAGIC, "Winding and twisting about $p your magic fails to take hold.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "As energy twists and winds about $p, $n's magic fails to take hold.", ch, obj, NULL, TO_NOTVICT ); return rSPELL_FAILED; } aenchant = ( number_percent( ) / 5 ) + ( ( get_curr_int( ch ) / 6 ) + ( get_curr_lck( ch ) / 10 ) ); /* Generate BASE enchant chance */ separate_obj( obj ); /* REMOVE the object to save BUG/CRASH (In Case) */ exchance = 0; /* Use ANY modifers to HR and DR to increase change of EXPLODE or FADE */ for( paf = obj->first_affect; paf; paf = paf->next ) { if( paf->location == APPLY_HITROLL || paf->location == APPLY_DAMROLL ) { exchance += paf->modifier; } } if( number_percent( ) > 30 ) { aenchant += exchance; /* Increase EXPLODE chance (70%) LEVEL DIFF between OBJ and CH increases this */ if( obj->level > ch->level ) aenchant += ( obj->level - ch->level + 1 ); } else if( number_percent( ) > 50 ) { aenchant -= exchance; /* Increase FADE chance (50%) LEVEL DIFF between OBJ and CH increases this */ if( obj->level > ch->level ) aenchant -= ( obj->level - ch->level + 1 ); } if( aenchant >= 40 ) { /* * EXPLODE */ act( AT_FIRE, "In a fiery display $p violently explodes.", ch, obj, NULL, TO_CHAR ); act( AT_FIRE, "In a shower of shards $p violently explodes.", ch, obj, NULL, TO_NOTVICT ); extract_obj( obj ); } else if( aenchant >= 10 ) { oldaffect = 5; /* NORMAL */ if( aenchant <= 20 ) { oldaffect++; } if( !obj->first_affect ) { CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = APPLY_HITROLL; paf->modifier = oldaffect; xCLEAR_BITS( paf->bitvector ); LINK( paf, obj->first_affect, obj->last_affect, next, prev ); CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = APPLY_DAMROLL; paf->modifier = oldaffect; xCLEAR_BITS( paf->bitvector ); LINK( paf, obj->first_affect, obj->last_affect, next, prev ); } else { for( paf = obj->first_affect; paf; paf = paf->next ) { if( paf->location == APPLY_HITROLL || paf->location == APPLY_DAMROLL ) { oldaffect = paf->modifier; UNLINK( paf, obj->first_affect, obj->last_affect, next, prev ); } } if( aenchant >= 23 ) { oldaffect += 3; } else { oldaffect += 2; } CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = APPLY_HITROLL; paf->modifier = oldaffect; xCLEAR_BITS( paf->bitvector ); LINK( paf, obj->first_affect, obj->last_affect, next, prev ); CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = APPLY_DAMROLL; paf->modifier = oldaffect; xCLEAR_BITS( paf->bitvector ); LINK( paf, obj->first_affect, obj->last_affect, next, prev ); } if( IS_GOOD( ch ) ) xSET_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); else if( IS_EVIL( ch ) ) xSET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); else { xSET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); xSET_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); } if( aenchant >= 23 ) { xSET_BIT( obj->extra_flags, ITEM_GLOW ); act( AT_BYE, "In a swirl of color $p glows with fantastic brightness.", ch, obj, NULL, TO_CHAR ); act( AT_BYE, "In a shower of color $p suddenly glows with fantastic brilliance.", ch, obj, NULL, TO_NOTVICT ); } else { act( AT_MAGIC, "As the magic takes hold $p glows a lovely blue.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$n's magic take hold and makes $p glow a lovely blue.", ch, obj, NULL, TO_NOTVICT ); } } else if( aenchant >= 4 ) { /* * NOTHING */ act( AT_PLAIN, "Nothing Happens.", ch, obj, NULL, TO_CHAR ); act( AT_PLAIN, "$n's magic fails to take hold on $p.", ch, obj, NULL, TO_NOTVICT ); } else if( aenchant < 4 ) /* FADE any ENCHANTS and FLAGS */ { for( paf = obj->first_affect; paf; paf = paf->next ) { if( paf->location == APPLY_HITROLL || paf->location == APPLY_DAMROLL ) { UNLINK( paf, obj->first_affect, obj->last_affect, next, prev ); } } /* now remove FLAGS */ if( IS_OBJ_STAT( obj, ITEM_ANTI_GOOD ) ) xREMOVE_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); if( IS_OBJ_STAT( obj, ITEM_ANTI_EVIL ) ) xREMOVE_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); if( IS_OBJ_STAT( obj, ITEM_ANTI_NEUTRAL ) ) xREMOVE_BIT( obj->extra_flags, ITEM_ANTI_NEUTRAL ); if( IS_OBJ_STAT( obj, ITEM_INVIS ) ) xREMOVE_BIT( obj->extra_flags, ITEM_INVIS ); if( IS_OBJ_STAT( obj, ITEM_GLOW ) ) xREMOVE_BIT( obj->extra_flags, ITEM_GLOW ); if( IS_OBJ_STAT( obj, ITEM_MAGIC ) ) xREMOVE_BIT( obj->extra_flags, ITEM_MAGIC ); act( AT_MAGIC, "With a dull light $p fades slightly.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "Suddenly $p glows brightly and then fades.", ch, obj, NULL, TO_NOTVICT ); } return rNONE; } ch_ret spell_pass_door( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim = ( CHAR_DATA * ) vo; AFFECT_DATA af; SKILLTYPE *skill = get_skilltype( sn ); if( IS_SET( victim->immune, RIS_MAGIC ) ) { immune_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( IS_AFFECTED( victim, AFF_PASS_DOOR ) ) { failed_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } af.type = sn; af.duration = number_fuzzy( level / 4 ) * DUR_CONV; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = meb( AFF_PASS_DOOR ); affect_to_char( victim, &af ); act( AT_MAGIC, "$n turns translucent.", victim, NULL, NULL, TO_ROOM ); act( AT_MAGIC, "You turn translucent.", victim, NULL, NULL, TO_CHAR ); return rNONE; } ch_ret spell_transport( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *victim; char arg3[MAX_STRING_LENGTH]; OBJ_DATA *obj; SKILLTYPE *skill = get_skilltype( sn ); target_name = one_argument( target_name, arg3 ); if( ( victim = get_char_world( ch, target_name ) ) == NULL || victim == ch || xIS_SET( victim->in_room->room_flags, ROOM_PRIVATE ) || xIS_SET( victim->in_room->room_flags, ROOM_SOLITARY ) || xIS_SET( victim->in_room->room_flags, ROOM_NO_ASTRAL ) || xIS_SET( victim->in_room->room_flags, ROOM_DEATH ) || xIS_SET( victim->in_room->room_flags, ROOM_PROTOTYPE ) || xIS_SET( ch->in_room->room_flags, ROOM_NO_RECALL ) || victim->level >= level + 15 || ( IS_NPC( victim ) && xIS_SET( victim->act, ACT_PROTOTYPE ) ) || ( IS_NPC( victim ) && saves_spell_staff( level, victim ) ) ) { failed_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } if( victim->in_room == ch->in_room ) { send_to_char( "They are right beside you!", ch ); return rSPELL_FAILED; } if( ( obj = get_obj_carry( ch, arg3 ) ) == NULL || ( victim->carry_weight + get_obj_weight( obj ) ) > can_carry_w( victim ) || ( IS_NPC( victim ) && xIS_SET( victim->act, ACT_PROTOTYPE ) ) ) { failed_casting( skill, ch, victim, NULL ); return rSPELL_FAILED; } separate_obj( obj ); /* altrag shoots, haus alley-oops! */ if( IS_OBJ_STAT( obj, ITEM_NODROP ) ) { send_to_char( "You can't seem to let go of it.\n\r", ch ); return rSPELL_FAILED; /* nice catch, caine */ } if( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) && get_trust( victim ) < LEVEL_IMMORTAL ) { send_to_char( "That item is not for mortal hands to touch!\n\r", ch ); return rSPELL_FAILED; /* Thoric */ } act( AT_MAGIC, "$p slowly dematerializes...", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$p slowly dematerializes from $n's hands..", ch, obj, NULL, TO_ROOM ); obj_from_char( obj ); obj_to_char( obj, victim ); act( AT_MAGIC, "$p from $n appears in your hands!", ch, obj, victim, TO_VICT ); act( AT_MAGIC, "$p appears in $n's hands!", victim, obj, NULL, TO_ROOM ); save_char_obj( ch ); save_char_obj( victim ); return rNONE; } ch_ret spell_enchant_armor( int sn, int level, CHAR_DATA * ch, void *vo ) { OBJ_DATA *obj = ( OBJ_DATA * ) vo; AFFECT_DATA *paf; if( obj->item_type != ITEM_ARMOR || IS_OBJ_STAT( obj, ITEM_MAGIC ) || obj->first_affect ) { act( AT_MAGIC, "Your magic twists and winds around $p but cannot take hold.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$n's magic twists and winds around $p but cannot take hold.", ch, obj, NULL, TO_NOTVICT ); return rSPELL_FAILED; } /* * Bug fix here. -- Alty */ separate_obj( obj ); CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = APPLY_AC; paf->modifier = ( ( ch->level / -10 ) + ( number_fuzzy( -5 ) ) ); xCLEAR_BITS( paf->bitvector ); LINK( paf, obj->first_affect, obj->last_affect, next, prev ); if( IS_GOOD( ch ) ) { xSET_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); act( AT_BLUE, "$p gleams with flecks of blue energy.", ch, obj, NULL, TO_ROOM ); act( AT_BLUE, "$p gleams with flecks of blue energy.", ch, obj, NULL, TO_CHAR ); } else if( IS_EVIL( ch ) ) { xSET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); act( AT_BLOOD, "A crimson stain flows slowly over $p.", ch, obj, NULL, TO_CHAR ); act( AT_BLOOD, "A crimson stain flows slowly over $p.", ch, obj, NULL, TO_ROOM ); } else { xSET_BIT( obj->extra_flags, ITEM_ANTI_EVIL ); xSET_BIT( obj->extra_flags, ITEM_ANTI_GOOD ); act( AT_YELLOW, "$p glows with a disquieting light.", ch, obj, NULL, TO_ROOM ); act( AT_YELLOW, "$p glows with a disquieting light.", ch, obj, NULL, TO_CHAR ); } return rNONE; } ch_ret spell_earthquake( int sn, int level, CHAR_DATA * ch, void *vo ) { CHAR_DATA *vch; CHAR_DATA *vch_next; bool ch_died; ch_ret retcode; SKILLTYPE *skill = get_skilltype( sn ); ch_died = FALSE; retcode = rNONE; if( xIS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) { failed_casting( skill, ch, NULL, NULL ); return rSPELL_FAILED; } act( AT_MAGIC, "The earth trembles beneath your feet!", ch, NULL, NULL, TO_CHAR ); act( AT_MAGIC, "$n makes the earth tremble and shiver.", ch, NULL, NULL, TO_ROOM ); for( vch = first_char; vch; vch = vch_next ) { vch_next = vch->next; if( !vch->in_room ) continue; if( vch->in_room == ch->in_room && (vch->x == ch->x && vch->y == ch->y ) ) { if( !IS_NPC( vch ) && xIS_SET( vch->act, PLR_WIZINVIS ) && vch->pcdata->wizinvis >= LEVEL_IMMORTAL ) continue; if( vch != ch && ( IS_NPC( ch ) ? !IS_NPC( vch ) : IS_NPC( vch ) ) && !IS_AFFECTED( vch, AFF_FLYING ) && !IS_AFFECTED( vch, AFF_FLOATING ) ) retcode = damage( ch, vch, level + dice( 2, 8 ), sn ); if( retcode == rCHAR_DIED || char_died( ch ) ) { ch_died = TRUE; continue; } if( char_died( vch ) ) continue; } if( !ch_died && vch->in_room->area == ch->in_room->area ) { if( number_bits( 3 ) == 0 ) send_to_char_color( "&BThe earth trembles and shivers.\n\r", vch ); } } if( ch_died ) return rCHAR_DIED; else return rNONE; }