tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#include "define.h"
#include "struct.h"


/*
 *   CHARACTERS
 */ 


bool target_offensive( char_data* ch, cast_data* cast, char* argument )
{
  char           tmp  [ ONE_LINE ];  
  char_data*  victim;

  if( *argument == '\0'
    && ( cast->target = opponent( ch ) ) != NULL )
    return TRUE;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( victim = one_character( ch, argument, tmp,
    ch->array ) ) == NULL )
    return FALSE;

  if( victim == ch ) {
    fsend( ch,
      "Your anima speaks up nervously and argues persuasively that casting\
 %s at yourself would be fatuous.", spell_table[ cast->spell ].name );
    return FALSE;
    }

  if( !can_kill( ch, victim ) )
    return FALSE;

  cast->target = victim;
  return TRUE;
}


bool target_self_only( char_data* ch, cast_data* cast, char* argument )
{
  if( *argument != '\0' ) {
    fsend( ch, "Casting %s requires no argument as the only possible victim\
 is yourself.", spell_table[ cast->spell ].name );
    return FALSE;
    }

  cast->target = ch;
  return TRUE;
}


bool target_peaceful( char_data* ch, cast_data* cast, char* argument )
{
  char tmp  [ ONE_LINE ];  

  if( *argument == '\0' ) {
    cast->target = ch;
    return TRUE;
    }

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  return( ( cast->target = one_character( ch, argument, tmp,
    ch->array ) ) != NULL );
}


bool target_peaceful_other( char_data* ch, cast_data* cast, char* argument )
{
  char           tmp  [ ONE_LINE ];  
  char_data*  victim;

  if( *argument == '\0'
    && ( cast->target = opponent( ch ) ) != NULL )
    return TRUE;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( victim = one_character( ch, argument, tmp,
    ch->array ) ) == NULL )
    return FALSE;

  if( ch == victim ) {
    send( ch, "You can't cast %s on yourself.\r\n",
      spell_table[ cast->spell ].name ); 
    return FALSE;
    }

  cast->target = victim;

  return TRUE;
}


bool target_mob_only( char_data* ch, cast_data* cast, char* argument )
{
  if( *argument == '\0' 
    && ( cast->target = opponent( ch ) ) != NULL ) 
    return TRUE;

  char           tmp  [ ONE_LINE ];  
  char_data*  victim;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( victim = one_character( ch, argument, tmp,
    ch->array ) ) == NULL )
    return FALSE;

  if( victim->Type( ) == PLAYER_DATA ) {
    send( ch, "You can't cast %s on players.\r\n", 
      spell_table[ cast->spell ].name );
    return FALSE;
    }

  cast->target = victim;
  return TRUE;
}


bool target_world( char_data* ch, cast_data* cast, char* argument )
{
  char           tmp  [ ONE_LINE ];  
  char_data*  victim;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( victim = one_character( ch, argument, tmp, 
    (thing_array*) &player_list ) ) == NULL )
    return FALSE;

  if( victim == ch ) {
    send( ch, "You can't cast that on yourself!\r\n" );
    return FALSE;
    }

  cast->target = victim;
  return TRUE;
}


/*
 *   OBJECTS
 */


bool target_replicate( char_data* ch, cast_data* cast, char* argument )
{
  obj_data* obj;

  if( ( obj = one_object( ch, argument, "replicate", 
    &ch->contents ) ) == NULL )
    return FALSE;

  if( !is_empty( obj->contents )
    || ( obj->pIndexData->item_type == ITEM_DRINK_CON
    && obj->value[1] != 0 ) ) {
    include_empty = FALSE;
    send( ch, "The contents of %s would disrupt the spell.\r\n", obj );
    include_empty = TRUE;
    return FALSE;
    }

  if( is_set( obj->extra_flags, OFLAG_MAGIC ) ) {
    send( ch, "You are unable to copy magical items.\r\n" ); 
    return FALSE;
    }

  if( !is_set( obj->pIndexData->extra_flags, OFLAG_REPLICATE ) ) {
    send( ch, "%s is too complex for you to replicate.\r\n", obj );
    return FALSE;
    }

  cast->target = obj;

  return TRUE;
}


bool target_weapon_armor( char_data* ch, cast_data* cast, char* argument ) 
{
  char         tmp  [ ONE_LINE ];  
  obj_data*    obj;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( obj = one_object( ch, argument, tmp, 
    &ch->contents, ch->array ) ) == NULL )
    return FALSE;

  if( obj->pIndexData->item_type != ITEM_WEAPON 
    && obj->pIndexData->item_type != ITEM_ARMOR ) {
    send( ch, "You can only cast %s on weapons and armor.\r\n",
      spell_table[ cast->spell ].name );
    return FALSE;
    }

  cast->target = obj;

  return TRUE;
}


bool target_object( char_data* ch, cast_data* cast, char* argument ) 
{
  char         tmp  [ ONE_LINE ];  
  obj_data*    obj;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( obj = one_object( ch, argument, tmp, 
    &ch->contents, ch->array ) ) == NULL )
    return FALSE;

  cast->target = obj;

  return TRUE;
}


bool target_weapon( char_data* ch, cast_data* cast, char* argument ) 
{
  char         tmp  [ ONE_LINE ];  
  obj_data*    obj;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( obj = one_object( ch, argument, tmp, 
    &ch->contents, ch->array ) ) == NULL )
    return FALSE;

  if( obj->pIndexData->item_type != ITEM_WEAPON ) {
    send( ch, "You can only cast %s on weapons.\r\n",
      spell_table[ cast->spell ].name );
    return FALSE;
    }

  cast->target = obj;

  return TRUE;
}


bool target_corpse( char_data* ch, cast_data* cast, char* argument )
{
  char         tmp  [ ONE_LINE ];  
  obj_data*    obj;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( obj = one_object( ch, argument, tmp, 
    ch->array ) ) == NULL )
    return FALSE;

  if( obj->pIndexData->item_type != ITEM_CORPSE ) {
    send( ch, "%s can only be cast on corpses.\r\n",
      spell_table[ cast->spell ].name );
    return FALSE;
    }

  if( obj->pIndexData->item_type != ITEM_CORPSE ) {
    send( ch, "%s has no affect on player corpses yet.\r\n",
      spell_table[ cast->spell ].name );
    return FALSE;
    }

  cast->target = obj;

  return TRUE;
}


bool target_drink_con( char_data* ch, cast_data* cast, char* argument )
{
  char         tmp  [ ONE_LINE ];  
  obj_data*    obj;

  sprintf( tmp, "cast %s on", spell_table[ cast->spell ].name );

  if( ( obj = one_object( ch, argument, tmp, 
    &ch->contents, ch->array ) ) == NULL )
    return FALSE;

  if( obj->pIndexData->item_type != ITEM_DRINK_CON ) {
    send( ch, "You can only cast that on a drink container.\r\n" );
    return FALSE;
    }

  cast->target = obj;

  return TRUE;
}


/*
 *   MAIN ROUTINE
 */


bool get_target( char_data* ch, cast_data* cast, char* argument )
{
  int           spell  = cast->spell;
  int            type  = spell_table[spell].type;

  #define parm ch, cast, argument

  switch( type ) {
    case STYPE_REPLICATE      : return target_replicate      ( parm );
    case STYPE_SELF_ONLY      : return target_self_only      ( parm ); 
    case STYPE_PEACEFUL       : return target_peaceful       ( parm ); 
    case STYPE_OFFENSIVE      : return target_offensive      ( parm ); 
    case STYPE_CORPSE         : return target_corpse         ( parm ); 
    case STYPE_DRINK_CON      : return target_drink_con      ( parm ); 
    case STYPE_WEAPON         : return target_weapon         ( parm ); 
    case STYPE_WEAPON_ARMOR   : return target_weapon_armor   ( parm );
    case STYPE_WORLD          : return target_world          ( parm );
    case STYPE_MOB_ONLY       : return target_mob_only       ( parm );
    case STYPE_PEACEFUL_OTHER : return target_peaceful_other ( parm );
    case STYPE_OBJECT         : return target_object         ( parm );
    }

  #undef parm
 
  /*
  skip_spaces( argument );

  if( type == STYPE_RECALL ) {
    if( *argument == '\0' ) {
      cast->target = ch;
      return TRUE;
      }
    for( i = 0; i < MAX_ENTRY_TOWN ; i++ ) {     
      if( matches( argument, town_table[i].name ) ) {
        cast->room = get_room_index( town_table[i].recall );
        break;
        }
      }
    if( *argument == '\0' ) {
      cast->target = ch;
      } 
    else if( ( cast->target = one_character( ch, argument,
     "cast on", ch->array ) ) == NULL ) {
      return FALSE;
      }
    return TRUE;
    }

  if( type == STYPE_ANNOYING ) 
    return !in_sanctuary( ch );

  if( type == STYPE_PEACEFUL_OTHER || type == STYPE_MOB_ONLY ) {
    if( *argument == '\0' ) {
      if( ( victim = opponent( ch ) ) == NULL ) {
        send( ch, "Who do you want to cast that on?\r\n" );
        return FALSE;
	}
      }
    else if( ( victim = get_char_room( ch, argument ) ) == NULL ) {
      send( ch, "They aren't here.\r\n" );
      return FALSE;
      }
    if( victim == ch ) {
      send( ch, "That is not intended to be cast on yourself.\r\n" );
      }
    else if( type == STYPE_MOB_ONLY && victim->pcdata != NULL ) {
      send( ch, "You can only cast that on mobs.\r\n" );
      }
    else {
      cast->target = victim;
      return TRUE;
      }
    return FALSE;
    }

  if( type == STYPE_ROOM ) {
    if( *argument == '\0' ) {
      send( ch, "What location do you want to cast it on?\r\n" );
      }
    else if( atoi( argument ) != 0 ) {
      send( "What type of location is that??\r\n", ch );
      }
    else if( ( room = find_location( ch, argument ) ) == NULL ) {
      send( "Unknown Location.\r\n", ch );
      }
    else {
      cast->room = room;
      return TRUE;
      }
    return FALSE;
    }

  if( type == STYPE_OBJECT || type == STYPE_WEAPON
    || type == STYPE_WEAPON_ARMOR ) {
    if( *argument == '\0' ) {
      send( ch, "What object do you want to cast that on?\r\n" );
      }
    else if( ( obj = get_obj_inv( ch, argument ) ) == NULL
      && ( obj = get_obj_wear( ch, argument ) ) == NULL ) {
      send( ch, "You do not see that here.\r\n" );
      }
    else if( type == STYPE_WEAPON_ARMOR
      && obj->pIndexData->item_type != ITEM_WEAPON
      && obj->pIndexData->item_type != ITEM_ARMOR ) {
      send( ch, "You can only cast that on weapons and armor.\r\n" );
      }
    else if( type == STYPE_WEAPON
      && obj->pIndexData->item_type != ITEM_WEAPON ) {
      send( ch, "You can only cast that on a weapon.\r\n" );
      }
    else {
      for( i = 0; i < MAX_SPELL_WAIT; i++ )
        if( cast->reagent[i] == obj && obj->number == 1 ) {
          send( ch, "You can't cast a spell on the required reagent.\r\n" );
          return FALSE;
	  }
      if( type != STYPE_REPLICATE || can_replicate( ch, obj ) ) { 
        cast->target = obj;
        return TRUE;
        }
      }
    return FALSE;
    }

  if( ch->fighting != NULL ) {
    send( ch, "You cannot concentrate enough.\r\n" );
    return FALSE;
    }

  if( type == STYPE_ASTRAL ) {
    if( *argument == '\0' ) {
      send( ch, "At where do you wish to focus the astral gate?\r\n" );
      return FALSE;
      }
    for( i = 0; i < MAX_ENTRY_ASTRAL; i++ ) {     
      if( fmatches( argument, astral_table[i].name ) ) {
        cast->room = get_room_index( astral_table[i].recall );
        return TRUE;
        }
      }
    send( ch, "Unknown astral focus point.\r\n" );
    return FALSE;
    }

  bug( "Get_Target: Unknown spell type." );
  */
  return FALSE;
}