/* AD&D, 2nd Edition (c) Player Character Race */ #include "ability.h" string raceObj; /* filename of race object */ int height, weight; /* in inches and pounds */ int curAge, realAge, maxAge; /* in game years */ string get_race_obj(void) { return (raceObj); } int set_race_obj(string filename) { if (!filename || filename == "" || file_size(filename) < 0) return 0; if (!filename->CheckRaceRqr()) return 0; raceObj = filename; raceObj->GetAbilityScoreAdj(); height = raceObj->GetAvgHt(); weight = raceObj->GetAvgWt(); realAge = curAge = raceObj->GetStartingAge(); maxAge = raceObj->GetMaximumAge(); raceObj->ActivateRace(); } int get_height(void) { return (height); } int get_weight(void) { return (weight); } void set_height(int ht) { height = ht; } void set_weight(int wt) { weight = wt; } int adjust_height(int adj) { return (height += adj); } int adjust_weight(int adj) { return (weight += adj); } int get_current_age(void) { return (curAge); } /* int get_real_age(void) { return (realAge); } int get_maximum_age(void) { return (maxAge); } */ int adjust_current_age(int adj) { if (curAge + adj > maxAge) { this_player()->natural_death(); return (curAge); } curAge += adj; get_physical_effects(); return (curAge); } int adjust_maximum_age(int adj) { if (curAge > maxAge + adj) { this_player()->natural_death(); return (curAge); } return (maxAge += adj); } /* this function should only be called by the process that keeps */ /* track of time. it should be called only once per game year. */ /* for example, if the ratio of game time to real time is 6 sec */ /* to 1 sec, this function would be called every 60 game days and */ /* 20 game hours. This is called regardless of the amount of */ /* time that the player has used in that period. after all, a */ /* player character doesn't adventure every single day. */ void happy_birthday(void) { realAge++; get_physical_effects(); /* physical effects can oscillate */ get_mental_effects(); /* mental effects depend on real age */ } void get_mental_effects(void) { if (realAge > raceObj->GetVenerableAge()) ChangeAbilityScore(INT, 1), ChangeAbilityScore(WIS, 1); if (realAge > raceObj->GetOldAge()) ChangeAbilityScore(WIS, 1); if (realAge > raceObj(INT, 1), ChangeAbilityScore(WIS, 1); } void get_physical_effects(void) { static int middle = 0, old = 0, venerable = 0; object plrChr = this_player(); if (curAge < raceObj->GetMiddleAge()) { if (middle) { plrChr->ChangeAbilityScore(STR, 1); plrChr->ChangeAbilityScore(CON, 1); middle = 0; } if (old) { plrChr->ChangeAbilityScore(STR, 2); plrChr->ChangeAbilityScore(DEX, 2); plrChr->ChangeAbilityScore(CON, 1); old = 0; } if (venerable) { plrChr->ChangeAbilityScore(STR, 1); plrChr->ChangeAbilityScore(DEX, 1); plrChr->ChangeAbilityScore(CON, 1); venerable = 0; } return; } if (!middle) { plrChr->ChangeAbilityScore(STR, -1); plrChr->ChangeAbilityScore(CON, -1); middle = 1; } if (curAge < raceObj->GetOldAge()) return; if (!old) { plrChr->ChangeAbilityScore(STR, -2); plrChr->ChangeAbilityScore(DEX, -2); plrChr->ChangeAbilityScore(CON, -1); old = 1; } if (curAge < raceObj->GetVenerableAge()) return; if (!venerable) { plrChr->ChangeAbilityScore(STR, -1); plrChr->ChangeAbilityScore(DEX, -1); plrChr->ChangeAbilityScore(CON, -1); venerable = 1; } }