#include <sys/types.h> #include <stdio.h> #include "define.h" #include "struct.h" const char* sex_name [ MAX_SEX ] = { "neutral", "male", "female", "random" }; const char *size_name [ MAX_SIZE ] = { "Ant", "Rat", "Dog", "Gnome", "Human", "Ogre", "Horse", "Giant", "Elephant", "Dinosaur" }; Array<Thing_Data*> extracted; /* * EXTERNAL ROUTINES */ /* * CHARACTER DATA */ Char_Data :: Char_Data( ) : wearing( this ) { descr = NULL; shdata = NULL; pcdata = NULL; position = POS_STANDING; logon = current_time; save_time = current_time; cast = NULL; link = NULL; enemy = NULL; leader = NULL; mount = NULL; rider = NULL; next_on_obj = NULL; pos_obj = NULL; prepare = NULL; species = NULL; pShop = NULL; reply = NULL; reset = NULL; fighting = NULL; was_in_room = NULL; in_room = NULL; pet_name = empty_string; status = 0; damroll = 0; exp = 0; hit = 0; hitroll = 0; mana = 0; max_hit = 0; max_mana = 0; max_move = 0; mod_con = 0; mod_dex = 0; mod_int = 0; mod_str = 0; mod_wis = 0; mod_armor = 0; mod_hit = 0; mod_mana = 0; mod_move = 0; move = 0; played = 0; timer = 0; move_regen = 0; mana_regen = 0; hit_regen = 0; vzero( mod_resist, MAX_RESIST ); vzero( affected_by, AFFECT_INTS ); active.func = next_action; active.owner = this; } Char_Data :: ~Char_Data( ) { if( position == POS_DELETED ) { roach( "~Char_data : Deleting Twice!?" ); return; } position = POS_DELETED; } /* * PLAYER_DATA */ Player_Data :: Player_Data( char* name ) : locker( this ), junked( this ) { record_new( sizeof( player_data ), MEM_PLAYER ); player_list += this; /*-- INITIALISE VARIABLES --*/ valid = PLAYER_DATA; switched = NULL; familiar = NULL; note_edit = NULL; atalk = NULL; gtell = NULL; ctell = NULL; chant = NULL; chat = NULL; gossip = NULL; yell = NULL; shout = NULL; say = NULL; tell = NULL; to = NULL; whisper = NULL; base_age = 17; bank = 0; noteboard = 0; gossip_pts = 50; prayer = 500; whistle = 0; timezone = 0; vzero( iflag, 2 ); pcdata = new pc_data; shdata = new share_data; descr = new descr_data; descr->name = alloc_string( name, MEM_DESCR ); pcdata->pfile = NULL; pcdata->help_edit = NULL; pcdata->mail_edit = NULL; pcdata->recognize = NULL; pcdata->clss = 0; pcdata->mod_age = 0; pcdata->piety = 0; pcdata->speaking = 0; pcdata->trust = 0; pcdata->quest_pts = 0; pcdata->terminal = 0; pcdata->practice = -1; pcdata->prac_timer = 5; pcdata->religion = REL_NONE; pcdata->lines = 24; pcdata->max_level = -1; pcdata->wimpy = 0; vzero( pcdata->cflags, MAX_CFLAG ); vzero( pcdata->color, MAX_COLOR ); vzero( shdata->skill, MAX_SKILL ); vzero( pcdata->quest_flags, MAX_QUEST ); pcdata->condition[ COND_ALCOHOL ] = 0; pcdata->condition[ COND_FULL ] = 24; pcdata->condition[ COND_THIRST ] = 24; pcdata->condition[ COND_DRUNK ] = 0; pcdata->tmp_short = empty_string; pcdata->tmp_keywords = empty_string; pcdata->title = empty_string; pcdata->prompt = empty_string; pcdata->buffer = empty_string; pcdata->message = ( 1 << MAX_MESSAGE )-1; pcdata->mess_settings = 0; } Player_Data :: ~Player_Data( ) { record_delete( sizeof( player_data ), MEM_PLAYER ); player_list -= this; } /* * WIZARD_DATA */ Wizard_Data :: Wizard_Data( char* name ) : player_data( name ) { record_new( sizeof( wizard_data ), MEM_WIZARD ); record_delete( sizeof( player_data ), MEM_PLAYER ); valid = WIZARD_DATA; action_edit = NULL; adata_edit = NULL; room_edit = NULL; mpdata_edit = NULL; mprog_edit = NULL; oextra_edit = NULL; opdata_edit = NULL; oprog_edit = NULL; player_edit = NULL; quest_edit = NULL; obj_edit = NULL; mob_edit = NULL; exit_edit = NULL; custom_edit = 0; rtable_edit = -1; list_edit = 0; office = 0; wizinvis = 0; vzero( table_edit, 2 ); bamfin = empty_string; bamfout = empty_string; level_title = empty_string; build_chan = NULL; imm_talk = NULL; god_talk = NULL; avatar = NULL; vzero( permission, 2 ); } Wizard_Data :: ~Wizard_Data( ) { record_delete( sizeof( wizard_data ), MEM_WIZARD ); record_new( sizeof( player_data), MEM_PLAYER ); } /* * SHARE_DATA */ Share_Data :: Share_Data( ) { record_new( sizeof( share_data ), MEM_SHDATA ); strength = 10; intelligence = 10; wisdom = 10; dexterity = 10; constitution = 10; deaths = 0; kills = 0; level = 0; fame = 0; race = RACE_HUMAN; vzero( resist, MAX_RESIST ); } Share_Data :: ~Share_Data( ) { record_delete( sizeof( share_data ), MEM_SHDATA ); } /* * AGE */ int Player_Data :: Age( ) { return base_age+( played+current_time -logon )/144000+pcdata->mod_age; } /* * RESISTANCES */ void calc_resist( char_data* ch ) { int i, j; for( i = 0; i < MAX_RESIST; i++ ) { ch->shdata->resist[i] = 0; if( ( j = clss_table[ch->pcdata->clss].resist[i] ) != 0 ) ch->shdata->resist[i] += (ch->shdata->level+20)*j/10; if( ch->shdata->race < MAX_PLYR_RACE ) ch->shdata->resist[i] += plyr_race_table[ch->shdata->race].resist[i]; } } int Char_Data :: Save_Magic( ) { int res; res = min( 100, shdata->resist[RES_MAGIC]+mod_resist[RES_MAGIC] +Intelligence( )-12 ); return res; } int Char_Data :: Save_Fire( ) { int res; res = min( 100, shdata->resist[RES_FIRE]+mod_resist[RES_FIRE] ); if( is_set( affected_by, AFF_RESIST_FIRE ) ) res = 33+2*res/3; return res; } int Char_Data :: Save_Cold( ) { int res; res = min( 100, shdata->resist[RES_COLD]+mod_resist[RES_COLD] ); if( is_set( affected_by, AFF_RESIST_COLD ) ) res = 33+2*res/3; return res; } int Char_Data :: Save_Shock( ) { int res; res = min( 100, shdata->resist[RES_SHOCK]+mod_resist[RES_SHOCK] ); if( is_set( affected_by, AFF_RESIST_SHOCK ) ) res = 33+2*res/3; return res; } int Char_Data :: Save_Mind( ) { int i; i = shdata->resist[RES_MIND]+mod_resist[RES_MIND] +2*Intelligence( )-24; if( pcdata != NULL ) i += 25; return( min( i, 100 ) ); } int Char_Data :: Save_Acid( ) { int res; res = min( 100, shdata->resist[RES_ACID]+mod_resist[RES_ACID] ); if( is_set( affected_by, AFF_RESIST_ACID ) ) res = 33+2*res/3; return res; } int Char_Data :: Save_Poison( ) { int res; res = min( 100, shdata->resist[RES_POISON] +mod_resist[RES_POISON]+3*Constitution( )-40 ); if( is_set( affected_by, AFF_RESIST_POISON ) ) res = 33+2*res/3; return res; } /* * ABILITY ROUTINES */ int Char_Data :: Strength( ) { int i = shdata->strength; if( is_set( affected_by, AFF_OGRE_STRENGTH ) ) i = max( i, min( i+3, 17 ) ); i -= affect_duration( this, AFF_DEATH )/2; return URANGE( 3, i+mod_str, 30 ); } int Char_Data :: Intelligence( ) { return URANGE( 3, shdata->intelligence+mod_int, 30 ); } int Char_Data :: Wisdom( ) { return URANGE( 3, shdata->wisdom+mod_wis, 30 ); } int char_data :: Dexterity( ) { return URANGE( 3, shdata->dexterity+mod_dex-get_burden( ), 30 ); } int char_data :: Constitution( ) { int i = shdata->constitution+mod_con; i -= affect_duration( this, AFF_DEATH )/2; return URANGE( 3, i, 30 ); } /* * HIT/MANA/MOVE */ void rejuvenate( char_data* ch ) { update_max_hit( ch ); update_max_mana( ch ); ch->hit = ch->max_hit; ch->mana = ch->max_mana; update_max_move( ch ); ch->move = ch->max_move; return; } void update_maxes( char_data* ch ) { if( ch != NULL ) { update_max_hit( ch ); update_max_move( ch ); update_max_mana( ch ); } } void update_max_hit( char_data* ch ) { if( ch->species != NULL ) { ch->max_hit = ch->base_hit*ch->Constitution()/ch->shdata->constitution +ch->mod_hit; } else { ch->max_hit = max( 1, ch->base_hit+ch->mod_hit +ch->shdata->level*(ch->Constitution( )-12)/2 ); } ch->hit = min( ch->hit, ch->max_hit ); } void update_max_move( char_data* ch ) { int move; move = ch->base_move+ch->mod_move; move = ( ch->hit*move )/ch->max_hit; ch->max_move = max( 0, move ); ch->move = min( ch->move, ch->max_move ); } void update_max_mana( char_data* ch ) { int mana; mana = ch->base_mana+ch->mod_mana+ch->shdata->level*ch->Intelligence( )/4; mana -= leech_max( ch ); mana -= prep_max( ch ); ch->max_mana = max( 0, mana ); ch->mana = min( ch->mana, ch->max_mana ); } /* * MISC ATTRIBUTES */ int Mob_Data :: Size( ) { return species->size; } int Player_Data :: Size( ) { return( shdata->race < MAX_PLYR_RACE ? plyr_race_table[ shdata->race ].size : SIZE_OGRE ); } /* * MISC */ char_data* random_pers( room_data* room ) { int count = 0; for( int i = 0; i < room->contents; i++ ) if( character( room->contents[i] ) != NULL ) count++; if( count == 0 ) return NULL; count = number_range( 1, count ); for( int i = 0; ; i++ ) if( character( room->contents[i] ) != NULL && --count == 0 ) return (char_data*) room->contents[i]; }