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 "ctype.h"
#include "sys/types.h"
#include "stdio.h"
#include "stdlib.h"
#include "define.h"
#include "struct.h"


const char* arg_type_name[] = { "none", "any", "string", "integer",
  "character", "object", "room", "direction", "clan", "skill", "rflag",
  "stat", "class", "religion", "race", "thing" };


/*
 *   FUNCTION TABLE
 */


#define nn NONE
#define st STRING
#define ch CHARACTER
#define ob OBJECT
#define in INTEGER
#define rm ROOM
#define sk SKILL
#define sa STAT
#define di DIRECTION
#define rf RFLAG
#define na NATION
#define cl CLASS
#define re RELIGION
#define rc RACE
#define th THING

const class cfunc_type cfunc_list [] =
{
  { "acode",           &code_acode,         nn, { rm, in, nn, nn } },
  { "act_area",        &code_act_area,      nn, { st, ch, ob, ch } },
  { "act_room",        &code_act_room,      nn, { st, ch, ob, ch } },
  { "act_notchar",     &code_act_notchar,   nn, { st, ch, ob, ch } },
  { "act_notvict",     &code_act_notchar,   nn, { st, ch, ob, ch } },
  { "act_tochar",      &code_act_tochar,    nn, { st, ch, ob, ch } },
  { "act_neither",     &code_act_neither,   nn, { st, ch, ob, ch } },
  { "assign_quest",    &code_assign_quest,  nn, { ch, in, nn, nn } },
  { "attack",          &code_attack,        in, { ch, ch, in, st } },
  { "attack_acid",     &code_attack_acid,   in, { ch, ch, in, st } },
  { "attack_cold",     &code_attack_cold,   in, { ch, ch, in, st } },
  { "attack_fire",     &code_attack_fire,   in, { ch, ch, in, st } },
  { "attack_shock",    &code_attack_shock,  in, { ch, ch, in, st } },
  { "attack_room",     &code_attack_room,   nn, { ch, in, st, nn } },
  { "attack_weapon",   &code_attack_weapon, in, { ch, ch, in, st } },
  { "can_fly",         &code_can_fly,       in, { ch, nn, nn, nn } },
  { "cast_spell",      &code_cast_spell,    nn, { sk, ch, ch, nn } },
  { "char_in_room",    &code_char_in_room,  in, { ch, rm, nn, nn } },
  { "cflag",           &code_cflag,         in, { in, ch, nn, nn } },
  { "class",           &code_class,         cl, { ch, nn, nn, nn } },
  { "close",           &code_close,         nn, { rm, di, nn, nn } },
  { "coin_value",      &code_coin_value,    in, { ob, nn, nn, nn } },
  { "dam_message",     &code_dam_message,   nn, { ch, in, st, nn } },
  { "dice",            &code_dice,          in, { in, in, in, nn } },
  { "disarm",          &code_disarm,        in, { ch, in, nn, nn } },
  { "do_spell",        &code_do_spell,      nn, { sk, ch, ch, nn } },
  { "doing_quest",     &code_doing_quest,   in, { ch, in, nn, nn } },
  { "done_quest",      &code_done_quest,    in, { ch, in, nn, nn } },
  { "drain_exp",       &code_drain_exp,     nn, { ch, in, nn, nn } },
  { "drain_stat",      &code_drain_stat,    nn, { ch, sa, in, in } },
  { "find_room",       &code_find_room,     rm, { in, nn, nn, nn } },
  { "find_skill",      &code_find_skill,    in, { ch, sk, nn, nn } },
  { "find_stat",       &code_find_stat,     in, { ch, sa, nn, nn } },
  { "get_room",        &code_get_room,      rm, { ch, nn, nn, nn } },
  { "junk_mob",        &code_junk_mob,      nn, { ch, nn, nn, nn } },
  { "junk_obj",        &code_junk_obj,      nn, { ob, in, nn, nn } },
  { "has_obj",         &code_has_obj,       ob, { in, ch, nn, nn } },
  { "has_quest",       &code_has_quest,     in, { ch, in, nn, nn } },
  { "heal",            &code_heal,          nn, { ch, in, nn, nn } },
  { "inflict",         &code_inflict,       in, { ch, ch, in, st } },
  { "inflict_acid",    &code_inflict_acid,  in, { ch, ch, in, st } },
  { "inflict_cold",    &code_inflict_cold,  in, { ch, ch, in, st } },
  { "inflict_fire",    &code_inflict_fire,  in, { ch, ch, in, st } },
  { "inflict_shock",   &code_inflict_shock, in, { ch, ch, in, st } },
  { "interpret",       &code_interpret,     nn, { ch, st, ch, nn } },
  { "is_exhausted",    &code_is_exhausted,  in, { ch, in, nn, nn } },
  { "is_fighting",     &code_is_fighting,   in, { ch, nn, nn, nn } },
  { "is_follower",     &code_is_follower,   in, { ch, nn, nn, nn } },
  { "is_locked",       &code_is_locked,     in, { rm, di, nn, nn } },
  { "is_mounted",      &code_is_mounted,    in, { ch, nn, nn, nn } },
  { "is_name",         &code_is_name,       in, { st, st, nn, nn } },
  { "is_open",         &code_is_open,       in, { rm, di, nn, nn } },
  { "is_player",       &code_is_player,     in, { ch, nn, nn, nn } },
  { "is_resting",      &code_is_resting,    in, { ch, nn, nn, nn } },
  { "is_searching",    &code_is_searching,  in, { ch, nn, nn, nn } },
  { "is_silenced",     &code_is_silenced,   in, { ch, nn, nn, nn } },
  { "lock",            &code_lock,          nn, { rm, di, nn, nn } },
  { "num_in_room",     &code_num_in_room,   in, { rm, nn, nn, nn } },
  { "num_mob",         &code_num_mob,       in, { in, rm, nn, nn } },
  { "mpcode",          &code_mpcode,        nn, { ch, in, nn, nn } },
  { "mload",           &code_mload,         ch, { in, rm, nn, nn } },
  { "mob_in_room",     &code_mob_in_room,   ch, { in, rm, nn, nn } },
  { "modify_mana",     &code_modify_mana,   in, { ch, in, nn, nn } },
  { "modify_move",     &code_modify_move,   in, { ch, in, nn, nn } },
  { "obj_name",        &code_obj_name,      st, { ob, nn, nn, nn } },
  { "obj_in_room",     &code_obj_in_room,   ob, { in, rm, nn, nn } },
  { "obj_to_room",     &code_obj_to_room,   nn, { ob, rm, nn, nn } },
  { "obj_to_char",     &code_obj_to_char,   nn, { ob, ch, nn, nn } },
  { "obj_value",       &code_obj_value,     in, { ob, in, nn, nn } },
  { "oload",           &code_oload,         ob, { in, nn, nn, nn } },
  { "opcode",          &code_opcode,        nn, { ob, in, nn, nn } },
  { "open",            &code_open,          nn, { rm, di, nn, nn } },
  { "plague",          &code_plague,        nn, { ch, nn, nn, nn } },
  { "players_area",    &code_players_area,  in, { rm, nn, nn, nn } },
  { "players_room",    &code_players_room,  in, { rm, nn, nn, nn } },
  { "poison",          &code_poison,        nn, { ch, nn, nn, nn } },
  { "race",            &code_race,          rc, { ch, nn, nn, nn } },
  { "random",          &code_random,        in, { in, in, nn, nn } },
  { "rand_char",       &code_rand_char,     ch, { rm, nn, nn, nn } },
  { "rand_player",     &code_rand_player,   ch, { rm, nn, nn, nn } },
  { "remove_cflag",    &code_remove_cflag,  nn, { in, ch, nn, nn } },
  { "remove_rflag",    &code_remove_rflag,  nn, { rf, rm, nn, nn } },
  { "reputation",      &code_reputation,    in, { ch, na, nn, nn } },
  { "rflag",           &code_rflag,         in, { rf, rm, nn, nn } },
  { "send_to_area",    &code_send_to_area,  nn, { st, rm, nn, nn } },
  { "send_to_char",    &code_send_to_char,  nn, { st, ch, nn, nn } },
  { "send_to_room",    &code_send_to_room,  nn, { st, rm, nn, nn } },
  { "set_cflag",       &code_set_cflag,     nn, { in, ch, nn, nn } },
  { "set_religion",    &code_set_religion,  nn, { ch, re, nn, nn } },
  { "set_rflag",       &code_set_rflag,     nn, { rf, rm, nn, nn } },
  { "show",            &code_show,          nn, { ch, rm, in, nn } }, 
  { "size",            &code_size,          in, { ch, nn, nn, nn } }, 
  { "summon",          &code_summon,        nn, { ch, ch, nn, nn } },
  { "tell",            &code_tell,          nn, { ch, ch, st, nn } },
  { "transfer",        &code_transfer,      nn, { ch, rm, nn, nn } },
  { "transfer_all",    &code_transfer_all,  nn, { rm, rm, nn, nn } },
  { "unlock",          &code_unlock,        nn, { rm, di, nn, nn } },
  { "update_quest",    &code_update_quest,  nn, { ch, in, nn, nn } },
  { "wait",            &code_wait,          nn, { in, nn, nn, nn } },
  { "weight",          &code_weight,        in, { th, nn, nn, nn } },
  { "",                NULL,                nn, { nn, nn, nn, nn } }
};

#undef nn
#undef st
#undef ch
#undef ob
#undef in
#undef rm
#undef sk
#undef st
#undef di
#undef rf
#undef na
#undef re
#undef th


/*
 *   POSITION ROUTINES
 */

   
void* code_is_mounted( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  return (void*) ( ch->mount != NULL );
}

 
void* code_is_resting( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Is_Resting: NULL character." );
    return FALSE;
    }

  return (void*) ( ch->position == POS_RESTING );
}


void* code_is_fighting( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Is_Fighting: NULL character." );
    return (void*) FALSE;
    }

  return (void*) ( ch->position == POS_FIGHTING );
}


void* code_is_player( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Is_Player: NULL character." );
    return (void*) FALSE;
    }

  return (void*) ( ch->species == NULL );
}


/*
 *   ROOM ROUTINES
 */


void* code_rflag( void** argument )
{
  int         flag  = (int)        argument[0];
  room_data*  room  = (room_data*) argument[1]; 

  if( room == NULL ) {
    code_bug( "Code_rflag: NULL room" );
    return (void*) FALSE;
    }

  return (void*) is_set( &room->room_flags, flag );
}


void* code_set_rflag( void** argument )
{
  int         flag  = (int)        argument[0];
  room_data*  room  = (room_data*) argument[1]; 

  if( room == NULL ) {
    code_bug( "Code_rflag: NULL room" );
    return NULL;
    }

  set_bit( &room->room_flags, flag );

  return NULL;
}


void* code_remove_rflag( void** argument )
{
  int         flag  = (int)        argument[0];
  room_data*  room  = (room_data*) argument[1]; 

  if( room == NULL ) {
    code_bug( "Code_rflag: NULL room" );
    return NULL;
    }

  remove_bit( &room->room_flags, flag );

  return NULL;
}


void* code_get_room( void** argument )
{
  char_data* ch = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Get_room: NULL character" );
    return NULL;
    }

  return ch->in_room;
}


/*
 *   CHARACTER ROUTINES
 */


void* code_size( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Size: Null argument" );
    return NULL;
    }

  return (void*) ch->Size( );
}


void* code_weight( void** argument )
{
  thing_data*  thing  = (char_data*) argument[0];

  if( thing == NULL ) {
    code_bug( "Weight: Null argument" );
    return NULL;
    }

  return (void*) thing->Weight( );
}


void* code_race( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Race: Null character." );
    return NULL;
    }

  return (void*) ch->shdata->race;
}


void* code_class( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Class: Null character." );
    return NULL;
    }

  if( ch->species != NULL ) {
    code_bug( "Class: Non-Player character." );
    return NULL;
    }
   
  return (void*) ch->pcdata->clss;
}


/*
 *   CFLAG ROUTINES
 */


void* code_cflag( void** argument )
{
  int         flag  = (int)        argument[0];
  char_data*    ch  = (char_data*) argument[1]; 

  if( ch == NULL ) {
    code_bug( "Code_Cflag: NULL character." );
    return (void*) FALSE;
    }

  if( flag < 0 || flag >= 32*MAX_CFLAG ) {
    code_bug( "Code_Cflag: flag out of range." );
    return (void*) FALSE;
    }

  if( ch->pcdata == NULL )
    return (void*) FALSE;

  return (void*) is_set( ch->pcdata->cflags, flag );
}


void* code_set_cflag( void** argument )
{
  int        flag  = (int)        argument[0];
  char_data*   ch  = (char_data*) argument[1]; 

  if( ch == NULL ) {
    code_bug( "Code_Set_Cflag: NULL character." );
    return NULL;
    }

  if( flag < 0 || flag >= 32*MAX_CFLAG ) {
    code_bug( "Code_Set_Cflag: flag out of range." );
    return NULL;
    }

  if( ch->pcdata != NULL )
    set_bit( ch->pcdata->cflags, flag );

  return NULL;
}


void* code_remove_cflag( void** argument )
{
  int flag      = (int)        argument[0];
  char_data* ch = (char_data*) argument[1]; 

  if( ch == NULL ) {
    code_bug( "Code_Remove_Cflag: NULL character." );
    return NULL;
    }

  if( flag < 0 || flag >= 32*MAX_CFLAG ) {
    code_bug( "Code_Remove_Cflag: flag out of range." );
    return NULL;
    }

  if( ch->pcdata != NULL )
    remove_bit( ch->pcdata->cflags, flag );

  return NULL;
}


/*
 *   CHARACTER STATUS ROUTINES
 */


void* code_can_fly( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Can_Fly: NULL Character." );
    return (void*) FALSE;
    }

  return (void*) ch->can_fly( );
}


void* code_is_silenced( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];

  if( ch == NULL ) {
    code_bug( "Is_Silenced: NULL Character." );
    return (void*) FALSE;
    }

  return (void*) is_set( ch->affected_by, AFF_SILENCE );
}


/*
 *   UNCLASSIFIED 
 */


void* code_interpret( void** argument )
{
  char_data* ch     = (char_data*) argument[0];
  char* string      = (char*)      argument[1];
  char_data* victim = (char_data*) argument[2];

  char tmp [ MAX_INPUT_LENGTH ];

  if( ch != NULL ) {
    if( victim == NULL ) 
      interpret( ch, string );
    else {
      sprintf( tmp, "%s %s", string, victim->descr->name );
      interpret( ch, tmp );
      }
    }

  return NULL;
}   


void* code_send_to_char( void** argument )
{
  char      *string = (char*)      argument[0];
  char_data *ch     = (char_data*) argument[1];

  send( string, ch );
 
  return NULL;
}


void* code_send_to_room( void** argument )
{
  char*      string = (char*)      argument[0];
  room_data*   room   = (room_data*) argument[1];

  if( room != NULL )
    act_room( room, string );
 
  return NULL;
}


void* code_send_to_area( void** argument )
{
  char      *string = (char*)      argument[0];
  room_data *room   = (room_data*) argument[1];

  if( room != NULL )
    send_to_area( string, room->area ); 
 
  return NULL;
}


void* code_act_room( void** argument )
{
  char*       string  = (char*)      argument[0];
  char_data*      ch  = (char_data*) argument[1];
  obj_data*      obj  = (obj_data*)  argument[2];
  char_data*  victim  = (char_data*) argument[3];  

  if( ch != NULL && ch->in_room != NULL )
    act_room( ch->in_room, string );

  return NULL;
}


void* code_act_neither( void** argument )
{
  char*       string  = (char*)      argument[0];
  char_data*      ch  = (char_data*) argument[1];
  obj_data*      obj  = (obj_data*)  argument[2];
  char_data*  victim  = (char_data*) argument[3];  
  
  act_neither( string, ch, victim, obj );

  return NULL;
}


void* code_act_tochar( void** argument )
{
  char*      string  = (char*)      argument[0];
  char_data*     ch  = (char_data*) argument[1];
  obj_data*     obj  = (obj_data*)  argument[2];
  char_data* victim  = (char_data*) argument[3];  
  
  act( ch, string, ch, victim, obj );

  return NULL;
}


void* code_act_area( void** argument )
{
  char*       string  = (char*)      argument[0];
  char_data*      ch  = (char_data*) argument[1];
  obj_data*      obj  = (obj_data*)  argument[2];
  char_data*  victim  = (char_data*) argument[3];  
  
  if( ch == NULL ) {
    code_bug( "Act_Area: Character = null pointer." );
    return NULL;
    }

  act_area( string, ch, victim, obj );

  return NULL;
}


void* code_act_notchar( void** argument )
{
  char*      string  = (char*)      argument[0];
  char_data*     ch  = (char_data*) argument[1];
  obj_data*     obj  = (obj_data*)  argument[2];
  char_data* victim  = (char_data*) argument[3];  
  
  if( ch != NULL )
    act_notchar( string, ch, victim, obj );

  return NULL;
}


void* code_act_notvict( void** argument )
{
  char      *string = (char*)      argument[0];
  char_data *ch     = (char_data*) argument[1];
  obj_data  *obj    = (obj_data*)  argument[2];
  char_data *victim = (char_data*) argument[3];  
  
  /*
    act( string, ch, obj, victim, TO_NOTVICT );
  act_to( string, ch, obj, victim, var_ch );
  */
  return NULL;
}


void* code_junk_mob( void** argument )
{
  char_data* ch = (char_data*) argument[0];

  if( ch == NULL )
    return NULL;
 
  if( !IS_NPC( ch ) ) {
    code_bug( "Junk_mob: character is a player??" );
    return NULL;
    } 
  
  ch->Extract( );

  return NULL;
}


void* code_drain_stat( void** argument )
{
  char_data* ch  = (char_data*) argument[0];
  int         i  = (int)        argument[1]; 
  int         j  = (int)        argument[2];
  int         m  = (int)        argument[3];

  int loc[] = { APPLY_STR, APPLY_INT, APPLY_WIS, APPLY_DEX, APPLY_CON }; 
  affect_data affect;
 
  if( ch == NULL || i < 0 || i > 4 || j <= 0 || m < -1 || m > 1 )
    return NULL;
 
  affect.type      = AFF_NONE;
  affect.location  = loc[i];
  affect.modifier  = m;
  affect.duration  = j;
  affect.level     = 5;
  affect.leech     = NULL;

  add_affect( ch, &affect );
  return NULL;
}  


void* code_find_stat( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          i  = (int)        argument[1]; 

  if( ch == NULL ) 
    return NULL;

  if( i < 0 || i > 8 ) {
    code_bug( "Find_Stat: Impossible field." );
    return NULL;
    } 

  if( ch->species != NULL ) {
    int value[] = { ch->Strength( ), ch->Intelligence( ),
      ch->Wisdom( ), ch->Dexterity( ), ch->Constitution( ),
      ch->shdata->level, 0, 0, ch->shdata->alignment };
    return (void*) value[i];
    }
  else { 
    int value[] = { ch->Strength( ), ch->Intelligence( ),
      ch->Wisdom( ), ch->Dexterity( ), ch->Constitution( ),
      ch->shdata->level, ch->pcdata->piety,
      ch->pcdata->clss, ch->shdata->alignment };
    return (void*) value[i];
    }
}


void* code_random( void** argument )
{
  int  n1  = (int) argument[0];
  int  n2  = (int) argument[1];

  return (void*) ( number_range( n1,n2 ) );
}


void* code_dice( void** argument )
{
  int  n1  = (int) argument[0];
  int  n2  = (int) argument[1];
  int  n3  = (int) argument[2];

  return (void*) ( roll_dice( n1,n2 )+n3 );
}


void* code_find_skill( void** argument )
{
  char_data*    ch  = (char_data*) argument[0];
  int        skill  = (int)        argument[1];

  if( ch == NULL ) {
    code_bug( "Find_Skill: NULL character." );
    return NULL;
    }

  return (void*) ch->get_skill( skill );
}


void* code_summon( void** argument )
{
  char_data*      ch  = (char_data*) argument[0];
  char_data*  victim  = (char_data*) argument[1];

  if( ch != NULL )
    summon_help( ch, victim );

  return NULL;
}


void* code_reputation( void** argument )
{
  char_data*     ch  = (char_data*) argument[0];
  int        nation  = (int)        argument[1];

  if( ch == NULL ) {
    code_bug( "Reputation: Null character." );
    return NULL;
    }

  return (void*) 50;
}


void* code_find_room( void** argument )
{
  int         vnum   = (int) argument[0];
  room_data*  room;

  if( ( room = get_room_index( vnum, FALSE ) ) == NULL ) 
    code_bug( "Find_Room: Non-existent room." );
 
  return room;
}


void* code_cast_spell( void** argument )
{
  int          spell  = (int)        argument[0];
  char_data*      ch  = (char_data*) argument[1];
  char_data*  victim  = (char_data*) argument[2];

  if( ch == NULL || spell < SPELL_FIRST || spell >= WEAPON_UNARMED ) 
    return NULL;

  switch( spell_table[ spell-SPELL_FIRST ].type ) {
   case STYPE_SELF_ONLY :
   case STYPE_PEACEFUL :
    if( victim == NULL )
      victim = ch;
    break;

   case STYPE_OFFENSIVE :
    if( victim == NULL )
      return NULL;
    break;

   default :
    return NULL;
    }

  /*
  stop_active( ch );

  event = new cast_event( ch, victim );
  
  event->vo      = victim;
  event->spell   = *spell-SPELL_FIRST;
  event->prepare = FALSE;
  event->wait    = spell_table[*spell-SPELL_FIRST].prepare-1;
  ch->active     = event;

  has_reagents( ch, event );
  execute_cast( event );
  */

  return NULL;  
}


void* code_do_spell( void** argument )
{
  int          spell  = (int)        argument[0];
  char_data*      ch  = (char_data*) argument[1];
  char_data*  victim  = (char_data*) argument[2];

  if( ch == NULL )
    return NULL;

  if( victim == NULL )
    victim = ch;

  if( spell >= SPELL_FIRST && spell < WEAPON_UNARMED ) 
    ( spell_table[spell-SPELL_FIRST].function )( ch, victim,
      NULL, 10, -1 );

  return NULL;
}


void* code_num_in_room( void** argument )
{
  room_data*  room  = (room_data*) argument[0];
  int          num  = 0;

  if( room != NULL )
    for( int i = 0; i < room->contents; i++ )
      num += ( character( room->contents[i] ) != NULL );

  return (void*) num;
}  


void* code_players_area( void** argument )
{
  room_data*  room  = (room_data*) argument[0];

  if( room == NULL ) {
    code_bug( "Players_Area: NULL room." );
    return NULL;
    }

  return (void*) room->area->nplayer;
}  


void* code_players_room( void** argument )
{
  room_data*  room  = (room_data*) argument[0];
  int          num  = 0;  

  if( room != NULL )
    for( int i = 0; i < room->contents; i++ )
      num += ( player( room->contents[i] ) != NULL );

  return (void*) num;
}  


void* code_num_mob( void** argument )
{
  int         vnum  = (int)        argument[0];
  room_data*  room  = (room_data*) argument[1];
  mob_data*    rch;
  int          num  = 0;  

  if( room != NULL )
    for( int i = 0; i < room->contents; i++ )
      if( ( rch = mob( room->contents[i] ) ) != NULL
        && rch->species->vnum == vnum )
        num++;

  return (void*) num;
}  


void* code_transfer( void** argument )
{
  char_data*    ch  = (char_data*) argument[0];
  room_data*  room  = (room_data*) argument[1];

  if( room != NULL && room->vnum == 4 ) 
    room = get_room_index( ROOM_PRISON );

  if( room == NULL ) {
    send( "A script attempts to send you to a non-existent room??\n\r", ch );
    return NULL;
    }

  if( ch == NULL )
    return NULL;

  if( ch->rider != NULL )
    ch = ch->rider;

  ch->From( );
  ch->To( room );

  if( ch->mount != NULL ) {
    ch->mount->From( );
    ch->mount->To( room );
    }

  send( "\n\r", ch );
  do_look( ch, "" );

  return NULL;
}


void* code_transfer_all( void** argument )
{
  room_data*       from  = (room_data*) argument[0];
  room_data*         to  = (room_data*) argument[1];
  char_data*        rch;
  thing_array      list;

  if( to == NULL )
    return NULL;

  copy( list, from->contents );

  for( int i = 0; i < list; i++ )
    if( ( rch = character( list[i] ) ) != NULL ) {
      rch->From( );
      rch->To( to );
      }

  for( int i = 0; i < list; i++ )
    if( ( rch = character( list[i] ) ) != NULL ) {
      send( "\n\r", rch );
      show_room( rch, to, FALSE, FALSE );
      }

  return NULL;
}


void* code_mload( void** argument )
{
  int               vnum  = (int)        argument[0];
  room_data*        room  = (room_data*) argument[1];
  mob_data*          mob;
  species_data*  species;

  if( room == NULL || ( species = get_species( vnum ) ) == NULL ) {
    code_bug( "Mload: non-existent species or null room." );
    return NULL;
    }

  mob = create_mobile( species );
  mreset_mob( mob );
 
  mob->To( room );
  
  return mob;
}


void* code_rand_char( void** argument )
{
  room_data*  room  = (room_data*) argument[0];
  char_data*   rch;

  if( room == NULL )
    return NULL;

  rch = random_pers( room );
  
  return rch;
}


void* code_rand_player( void** argument )
{
  room_data*  room  = (room_data*) argument[0];
  char_data*   rch;

  if( room == NULL )
    return NULL;

  rch = rand_player( room );
  
  return rch;
}

   
void* code_obj_in_room( void** argument )
{
  int         vnum  = (int)       argument[0];
  room_data*  room  = (room_data*) argument[1];

  if( room == NULL ) {
    code_bug( "Obj_in_room: NULL room." );
    return NULL;
    }

  return find_vnum( room->contents, vnum );
}


void* code_mob_in_room( void** argument )
{
  int         vnum  = (int)        argument[0];
  room_data*  room  = (room_data*) argument[1];
  char_data*   rch;

  if( room == NULL ) {
    code_bug( "Mob_in_Room: Null Room??" );
    return NULL;
    }

  for( int i = 0; i < room->contents; i++ )
    if( ( rch = mob( room->contents[i] ) ) != NULL
      && rch->species->vnum == vnum )
      return rch; 
  
  return NULL;
}


void* code_has_obj( void** argument )
{
  int        vnum  = (int)        argument[0];
  char_data*   ch  = (char_data*) argument[1];

  if( ch == NULL ) {
    code_bug( "Has_Obj: NULL character." );
    return NULL;
    }
 
  return find_vnum( ch->contents, vnum );
}


void* code_obj_to_room( void** argument )
{
  obj_data*    obj  = (obj_data*)  argument[0];
  room_data*  room  = (room_data*) argument[1];

  if( obj == NULL || room == NULL )
    return NULL;

  obj->To( room );
  
  return NULL;
}


void* code_obj_to_char( void** argument )
{
  obj_data*   obj  = (obj_data*)  argument[0];
  char_data*   ch  = (char_data*) argument[1];

  if( obj == NULL || ch == NULL )
    return NULL;

  obj->To( ch );

  return obj;
}

   
void* code_coin_value( void** argument )
{
  obj_data*  obj  = (obj_data*) argument[0];
  int          i;

  if( obj == NULL || obj->pIndexData->item_type != ITEM_MONEY )  
    return NULL;

  for( i = 0; i < MAX_COIN; i++ ) 
    if( obj->pIndexData->vnum == coin_vnum[i] ) 
      return (void*) ( coin_value[i]*obj->number );

  return NULL;;
}


void* code_plague( void** argument )
{
  char_data*        ch  = (char_data*) argument[0];
  affect_data   affect;
 
  if( ch == NULL || ch->save_vs_poison( 5 ) )
    return NULL;

  if( var_mob != NULL && var_mob->species != NULL
    && !is_set( ch->affected_by, AFF_PLAGUE ) )
    var_mob->species->special += 20;

  affect.type      = AFF_PLAGUE;
  affect.duration  = 11;
  affect.level     = 0;
  affect.leech     = NULL;

  add_affect( ch, &affect );

  return NULL;
}


void* code_poison( void** argument )
{
  char_data*        ch  = (char_data*) argument[0];
  affect_data   affect;

  if( ch == NULL || ch->save_vs_poison( 5 ) )
    return NULL;

  if( var_mob != NULL && var_mob->species != NULL 
    && !is_set( ch->affected_by, AFF_POISON ) ) 
    var_mob->species->special += 10;

  affect.type      = AFF_POISON;
  affect.duration  = 10;
  affect.level     = 8;
  affect.leech     = NULL;

  add_affect( ch, &affect );

  return NULL;
}


void* code_heal( void** argument )
{
  char_data* ch = (char_data*) argument[0];
  int i         = (int)        argument[1];

  if( ch != NULL ) {
    ch->hit += i;
    ch->hit = min( ch->hit, ch->max_hit );
    }

  return NULL;
}


void* code_modify_mana( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          i  = (int)        argument[1];

  if( ch == NULL || ch->mana+i < 0 ) 
    return (void*) FALSE;

  ch->mana += i;
  ch->mana = min( ch->mana, ch->max_mana );

  return (void*) TRUE;
}


void* code_drain_exp( void** argument )
{
  char_data *ch = (char_data*) argument[0];
  int i         = (int)       argument[1];

  if( ch != NULL && ch->species == NULL ) 
    add_exp( ch, -i, "You lose %d exp!!\n\r" );

  return NULL;
}


/*
 *   FUNCTION CALLS
 */


void* code_acode( void** argument )
{
  room_data *room = (room_data*) argument[0];
  int i           = (int)        argument[1];

  action_data* action; 
  int               j  = 1;

  if( room == NULL ) {
    code_bug( "Code_acode: NULL room." );
    return NULL;
    }

  for( action = room->action; action != NULL; action = action->next ) 
    if( j++ == i ) {
      push( );
      execute( action );
      pop( );
      break;
      }

  if( action == NULL ) 
    code_bug( "Code_acode: NULL action." );

  return NULL;
}


void* code_mpcode( void** argument )
{
  char_data* mob = (char_data*) argument[0];
  int i          = (int)       argument[1];

  mprog_data* mprog;
  int             j  = 1;

  if( mob == NULL || mob->species == NULL ) {
    code_bug( "Code_mpcode: NULL mob or mob is a player." );
    return NULL;
    }

  for( mprog = mob->species->mprog; mprog != NULL; mprog = mprog->next ) 
    if( j++ == i ) {
      push( );
      execute( mprog );
      pop( );
      break;
      }

  if( mprog == NULL ) 
    code_bug( "Code_mpcode: NULL mprog." );

  return NULL;
}


void* code_opcode( void** argument )
{
  obj_data *obj = (obj_data*) argument[0];
  int i         = (int)       argument[1];

  oprog_data* oprog;
  int             j  = 1;

  if( obj == NULL ) {
    code_bug( "Opcode: NULL obj." );
    return NULL;
    }
 
  for( oprog = obj->pIndexData->oprog; oprog != NULL; oprog = oprog->next ) 
    if( j++ == i ) {
      push( );
      execute( oprog );
      pop( );
      break;
      }

  if( oprog == NULL )
    code_bug( "Opcode: NULL oprog." );

  return NULL;
}


void* code_wait( void** argument )
{
  int i = (int) argument[0];

  queue_data* queue = new queue_data;

  end_prog   = TRUE;
  queue_prog = TRUE;
  
  queue->time = i;

  queue->room = var_room;
  queue->mob  = var_mob;
  queue->ch   = var_ch;
  queue->obj  = var_obj;
  queue->i    = var_i;

  queue->arg  = curr_arg;
  queue->next = queue_list;
  queue_list  = queue;

  return NULL;
}


void* code_is_searching( void** argument )
{
  char_data*   ch  = (char_data*) argument[0];

  return (void*) ( ch != NULL && ch->pcdata != NULL
    && is_set( ch->pcdata->pfile->flags, PLR_SEARCHING ) );
}


void* code_is_follower( void** argument )
{
  char_data*   ch  = (char_data*) argument[0];

  return (void*) ( ch == NULL || is_set( &ch->status, STAT_FOLLOWER ) );
}
  

void* code_char_in_room( void** argument )
{
  char_data*    ch  = (char_data*) argument[0];
  room_data*  room  = (room_data*) argument[1]; 

  return (void*) ( ch != NULL && ch->in_room == room );
}


void* code_is_name( void** argument )
{
  char*       str  = (char*) argument[0];
  char*  namelist  = (char*) argument[1];

  if( str == NULL || namelist == NULL )
    return (void*) FALSE;

  return (void*) is_name( str, namelist );
}


void* code_set_religion( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          i  = (int)        argument[1];

  if( ch == NULL || ch->pcdata == NULL )
    return NULL;

  if( i < 0 || i >= MAX_RELIGION ) {
    code_bug( "Code_set_religion: religion value out of range." );
    return NULL;
    } 

  ch->pcdata->religion = i;

  return NULL;
}  


void* code_tell( void** argument )
{
  char_data*      ch  = (char_data*) argument[0];
  char_data*  victim  = (char_data*) argument[1];
  char*       string  = (char*)      argument[2];

  char      tmp  [ 3*MAX_STRING_LENGTH ];

  if( victim == NULL || ch == NULL || victim->pcdata == NULL )
    return NULL;

  act_print( tmp, string, victim, ch, NULL, NULL, NULL, NULL, victim );
  process_tell( ch, victim, tmp );

  return NULL;
}


void* code_obj_name( void** argument )
{
  obj_data* obj = (obj_data*) argument[0];

  if( obj == NULL )
    return NULL;

  return obj->singular;
} 


void* code_disarm( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          j  = (int)        argument[1];

  if( ch == NULL ) {
    code_bug( "Disarm: NULL character or level." );
    return NULL;
    }

  return (void*) ( ch->check_skill( SKILL_UNTRAP )
    && number_range( 0, 20 ) > j );
}


/*
 *   MOVEMENT ROUTINES
 */


void* code_modify_move( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          i  = (int)        argument[1];

  if( ch == NULL || ch->move+i < 0 ) 
    return (void*) FALSE;

  ch->move += i;
  ch->move  = min( ch->move, ch->max_move );
 
  return (void*) TRUE;
}


void* code_is_exhausted( void** argument )
{
  char_data*  ch  = (char_data*) argument[0];
  int          i  = (int)        argument[1];

  if( ch == NULL )
    return (void*) TRUE;
  
  if( ch->move-i < 0 ) {
    send( ch, "You are too exhausted.\n\r" );
    return (void*) TRUE;
    }

  ch->move -= i;
 
  return (void*) FALSE;
}