#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 );
}