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


/*
 *   CAN_EXTRACT ROUTINE
 */
 

bool can_extract( species_data* species, char_data* ch )
{
  for( int i = 0; i < mob_list; i++ )
    if( mob_list[i]->species == species ) {
      send( ch, "There are still some creatures of that species alive.\n\r" );
      return FALSE;
      }
 
  return TRUE;
}


/*
 *   CREATION ROUTINES
 */


mob_data* create_mobile( species_data* species )
{
  mob_data*       mob;
  obj_data*       obj;
  int               i;
  int           coins;
  int            type;

  if( species == NULL ) 
    panic( "Create_mobile: NULL species." );

  mob          = new mob_data;
  mob->shdata  = species->shdata;
  mob->descr   = species->descr;
  mob->species = species;

  mob->affected_by[0] = species->affected_by[0];
  mob->affected_by[1] = species->affected_by[1];

  mob->base_hit  = max(1,roll_dice( species->hitdice ));
  mob->base_move = max(0,roll_dice( species->movedice ));
  mob->base_mana = 100;

  if( ( mob->sex = species->sex ) == SEX_RANDOM ) 
    mob->sex = ( number_range( 0, 1 ) == 0 ? SEX_MALE : SEX_FEMALE ); 

  update_max_hit( mob );
  update_max_mana( mob );

  mob->hit   = mob->max_hit;
  mob->mana  = mob->max_mana;

  update_max_move( mob );

  mob->move     = mob->max_move;
  mob->position = POS_STANDING;

  coins = species->gold;
  for( type = MAX_COIN - 1; type >= 0; type-- ) {
    if( ( i = number_range( 0, coins/coin_value[type] ) ) > 0 ) {
      obj = create( get_obj_index( coin_vnum[type] ), i );
      obj->To( mob );
      coins -= i*coin_value[type];
      }
    }

  assign_bit( &mob->status, STAT_SENTINEL,
    is_set( &species->act_flags, ACT_SENTINEL ) );
  assign_bit( &mob->status, STAT_AGGR_ALL,
    is_set( &species->act_flags, ACT_AGGR_ALL ) );
  assign_bit( &mob->status, STAT_AGGR_GOOD,
    is_set( &species->act_flags, ACT_AGGR_GOOD ) );
  assign_bit( &mob->status, STAT_AGGR_EVIL,
    is_set( &species->act_flags, ACT_AGGR_EVIL ) );

  mob->reset  = NULL;  
  mob->number = 1;

  return mob;
}


/*
 *   LOAD SPECIES
 */


void fix_species( )
{
  species_data*  species;

  for( int i = 0; i < MAX_SPECIES; i++ ) {
    if( ( species = species_list[i] ) == NULL )
      continue;
    if( species->group < 0 || species->group >= MAX_ENTRY_GROUP ) {
      roach( "Fix_Species: Non-existent group." );
      roach( "-- Species = %s", species->Name( ) );
      species->group = 0;
      } 
    if( species->nation < 0 || species->nation >= MAX_ENTRY_NATION ) {
      roach( "Fix_Species: Non-existent nation." );
      roach( "-- Species = %s", species->Name( ) );
      species->nation = 0;
      }
    if( species->shdata->race < 0
      || species->shdata->race >= MAX_ENTRY_RACE ) {
      roach( "Fix_Species: Non-existant race." );
      roach( "-- Species = %s", species->Name( ) );
      species->shdata->race = 0;
      }
    }

  return;
}


void load_mobiles( void )
{
  descr_data*      descr;
  FILE*               fp;
  mprog_data*      mprog  = NULL;
  species_data*  species;
  share_data*     shdata;

  echo( "Loading Mobs ...\n\r" );
 
  fp = open_file( AREA_DIR, MOB_FILE, "r", TRUE ); 

  if( strcmp( fread_word( fp ), "#MOBILES" ) ) 
    panic( "Load_mobiles: missing header" );

  for( ; ; ) {
    int vnum;
    char letter;

    if( ( letter = fread_letter( fp ) ) != '#' ) 
      panic( "Load_mobiles: # not found." );

    if( ( vnum = fread_number( fp ) ) == 0 )
       break;

    if( ( species = get_species( vnum ) ) != NULL ) {
      bug( "Load_mobiles: vnum %d duplicated.", vnum );
      bug( fread_string( fp, MEM_UNKNOWN ) );
      bug( species->descr->name );
      exit( 1 );
      }

    species         = new species_data;
    species->shdata = new share_data;
    species->descr  = new descr_data;

    shdata = species->shdata;
    descr  = species->descr;

    species->vnum             = vnum;

    descr->name          = fread_string( fp, MEM_DESCR );
    descr->keywords      = fread_string( fp, MEM_DESCR );
    descr->singular      = fread_string( fp, MEM_DESCR );
    descr->prefix_s      = fread_string( fp, MEM_DESCR );
    descr->adj_s         = fread_string( fp, MEM_DESCR );
    descr->long_s        = fread_string( fp, MEM_DESCR );
    descr->plural        = fread_string( fp, MEM_DESCR );
    descr->prefix_p      = fread_string( fp, MEM_DESCR );
    descr->adj_p         = fread_string( fp, MEM_DESCR );
    descr->long_p        = fread_string( fp, MEM_DESCR );
    descr->complete      = fread_string( fp, MEM_DESCR );

    species->creator       = fread_string( fp, MEM_SPECIES ); 
    species->attack        = new program_data;
    species->attack->code  = fread_string( fp, MEM_MPROG );

    read_extra( fp, species->attack->data );

    species->nation      = fread_number( fp );
    species->group       = fread_number( fp );
    shdata->race         = fread_number( fp );
    species->adult       = fread_number( fp );
    species->maturity    = fread_number( fp );
    species->skeleton    = fread_number( fp );
    species->zombie      = fread_number( fp );
    species->corpse      = fread_number( fp );
    species->price       = fread_number( fp );
    shdata->kills        = fread_number( fp );
    shdata->deaths       = fread_number( fp );
    species->wander      = fread_number( fp );
    species->date        = fread_number( fp );
    species->light       = fread_number( fp );
    species->color       = fread_number( fp );

    species->act_flags      = fread_number( fp ) | ( 1 << ACT_IS_NPC );
    species->affected_by[0] = fread_number( fp );
    species->affected_by[1] = fread_number( fp );
    species->affected_by[2] = fread_number( fp );

    shdata->alignment     = fread_number( fp );
    shdata->level         = fread_number( fp );
    shdata->strength      = fread_number( fp );
    shdata->intelligence  = fread_number( fp );
    shdata->wisdom        = fread_number( fp );
    shdata->dexterity     = fread_number( fp );
    shdata->constitution  = fread_number( fp );

    shdata->resist[RES_MAGIC]    = fread_number( fp ); 
    shdata->resist[RES_FIRE]     = fread_number( fp ); 
    shdata->resist[RES_COLD]     = fread_number( fp ); 
    shdata->resist[RES_SHOCK]    = fread_number( fp ); 
    shdata->resist[RES_MIND]     = fread_number( fp ); 
    shdata->resist[RES_ACID]     = fread_number( fp );
    shdata->resist[RES_POISON]   = fread_number( fp );
 
    for( int i = 0; i < MAX_ARMOR; i++ ) {
      species->chance[i] = fread_number( fp );
      species->armor[i] = fread_number( fp );
      species->part_name[i] = fread_string( fp, MEM_SPECIES );
      }

    species->wear_part = fread_number( fp );
    species->hitdice   = fread_number( fp );
    species->movedice  = fread_number( fp );

    species->damage       = fread_number( fp );
    species->rounds       = fread_number( fp );
    species->special      = fread_number( fp );
    species->damage_taken = fread_number( fp );
    species->exp          = fread_number( fp );

    switch( fread_letter( fp ) ) {
      case 'M' : species->sex = SEX_MALE;       break;
      case 'F' : species->sex = SEX_FEMALE;     break;
      case 'R' : species->sex = SEX_RANDOM;     break;
      default  : species->sex = SEX_NEUTRAL;    break;
      }

    species->gold   = fread_number( fp );
    species->size   = fread_number( fp );
    species->weight = fread_number( fp );

    load( fp, species->reset );
  
    for( ; ; ) {
      int number = fread_number( fp );

      if( number == -1 )
        break;

      mprog = new mprog_data;
      append( species->mprog, mprog );

      mprog->next    = NULL;
      mprog->trigger = number;
      mprog->value   = fread_number( fp );
      mprog->string  = fread_string( fp, MEM_MPROG );
      mprog->code    = fread_string( fp, MEM_MPROG );
      mprog->species = species;

      read_extra( fp, mprog->data );
      }       


    species_list[vnum] = species;
    }

  fclose( fp );
}