/****************************************************************************
* 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;
}