eldhamud_2.3.3/clans/
eldhamud_2.3.3/councils/
eldhamud_2.3.3/doc/
eldhamud_2.3.3/doc/DIKU/
eldhamud_2.3.3/doc/DIKU/.svn/
eldhamud_2.3.3/doc/DIKU/.svn/prop-base/
eldhamud_2.3.3/doc/DIKU/.svn/text-base/
eldhamud_2.3.3/doc/MERC/
eldhamud_2.3.3/doc/MERC/.svn/
eldhamud_2.3.3/doc/SMAUG/.svn/
eldhamud_2.3.3/doc/SMAUG/mudprogs/
eldhamud_2.3.3/doc/SMAUG/mudprogs/.svn/
eldhamud_2.3.3/doc/mudprogs/
eldhamud_2.3.3/gods/
eldhamud_2.3.3/houses/
eldhamud_2.3.3/player/a/
/****************************************************************************
 *			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;
}