123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- /*
- * Seven Kingdoms: Ancient Adversaries
- *
- * Copyright 1997,1998 Enlight Software Ltd.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- //Filename : OTOWN.H
- //Description : Header file of Object Town
- #ifndef __OTOWN_H
- #define __OTOWN_H
- #ifndef __ODYNARRB_H
- #include <ODYNARRB.h>
- #endif
- #ifndef __OSKILL_H
- #include <OSKILL.h>
- #endif
- #ifndef __OFIRMID_H
- #include <OFIRMID.h>
- #endif
- #ifndef __ORAWRES_H
- #include <ORAWRES.h>
- #endif
- #ifndef __OTOWNRES_H
- #include <OTOWNRES.h>
- #endif
- //------- define constant --------//
- #define MAX_TOWN_GROWTH_POPULATION 60 // grow up to 60 persons in a town
- #define MAX_TOWN_POPULATION 60 // max number of unitw in a town
- //-------- Define constant -----------//
- #define STD_TOWN_LOC_WIDTH 4
- #define STD_TOWN_LOC_HEIGHT 4
- //--------- Define training cost and level --------//
- #define TRAIN_SKILL_COST 30
- #define TRAIN_SKILL_LEVEL 20
- #define TOTAL_TRAIN_DAYS 5 // No. of days needed for training an unit
- #define MIN_RECRUIT_LOYALTY 30 // only when loyalty > this, the unit can be recruited
- #define MIN_NATION_DEFEND_LOYALTY 50 // if the loyalty of the town people > this, they will defense against the attack
- #define MIN_INDEPENDENT_DEFEND_LOYALTY 30
- #define SURRENDER_LOYALTY 29 // when the loyalty of the town is <= this, and being attacked by a nation, the town will surrender
- #define REBEL_LOYALTY 29 // if loyalty <= REBEL_LOYALTY, the unit may rebel
- #define INDEPENDENT_LINK_RESISTANCE 50 // only if the resistance of an independent town is lower than this, the town will enable its link with a foreign firm
- #define TAX_PER_PERSON 5 // amount of tax can be collected from each person
- #define COLLECT_TAX_LOYALTY_DECREASE 10 // Reduce 10 loyalty points per tax collection
- #define TOWN_REWARD_PER_PERSON 10
- #define TOWN_REWARD_LOYALTY_INCREASE 10
- #define IND_TOWN_GRANT_PER_PERSON 30 // independent town granting cost per person
- #define IND_TOWN_GRANT_RESISTANCE_DECREASE 10 // resistance decrease per grant
- #define RECEIVED_HIT_PER_KILL (200/ATTACK_SLOW_DOWN) // no. of received hits will result in one death of town people
- #define MAX_TRAIN_QUEUE 10
- //-------- Define class Town ----------//
- class Unit;
- #pragma pack(1)
- class Town
- {
- public:
- enum { TOWN_NAME_LEN=20 };
- short town_recno;
- short town_name_id;
- char* town_name() { return town_res.get_name(town_name_id); }
- short nation_recno;
- short rebel_recno; // whether this town is controlled by a rebel
- char race_id;
- int setup_date; // the setup date of this town
- char ai_town;
- char ai_link_checked; // AI check firm and town locatin by links, disable checking by setting this parameter to 1
- char independ_town_nation_relation; // each bit n is high representing this independent town will attack nation n.
- char has_linked_own_camp; // whether the town has linked military camps of the same nation
- char has_linked_enemy_camp; // whether the town has linked military camps of the same nation
- char is_base_town; // whether this town is base town or not
- short loc_x1, loc_y1, loc_x2, loc_y2;
- short abs_x1, abs_y1, abs_x2, abs_y2;
- short loc_width() { return loc_x2-loc_x1+1; }
- short loc_height() { return loc_y2-loc_y1+1; }
- short center_x;
- short center_y;
- BYTE region_id;
- short layout_id; // town layout id.
- short first_slot_id; // the first slot id. of the layout
- short slot_object_id_array[MAX_TOWN_LAYOUT_SLOT]; // the race id. of each slot building
- //---------- game vars ----------//
- short population;
- short jobless_population;
- short worker_population() { return population-jobless_population; }
-
- short max_race_pop_array[MAX_RACE]; // the max population the current town layout supports
- short race_pop_array[MAX_RACE]; // population of each race
- unsigned char race_pop_growth_array[MAX_RACE]; // population growth, when it reaches 100, there will be one more person in the town
- short jobless_race_pop_array[MAX_RACE];
- int recruitable_race_pop(int raceId, int recruitSpy);
- float race_loyalty_array[MAX_RACE];
- char race_target_loyalty_array[MAX_RACE];
- short race_spy_count_array[MAX_RACE]; // no. of spies in each race
- float race_resistance_array[MAX_RACE][MAX_NATION];
- char race_target_resistance_array[MAX_RACE][MAX_NATION];
- int race_harmony(int raceId);
- int majority_race(); // the race that has the majority of the population
- int average_loyalty();
- int average_target_loyalty();
- int average_resistance(int nationRecno);
- int average_target_resistance(int nationRecno);
- short town_defender_count; // no. of units currently defending this town
- int last_being_attacked_date;
- float received_hit_count; // no. of received hit by attackers, when this > RECEIVED_HIT_PER_KILL, a town people will be killed
- char train_queue_skill_array[MAX_TRAIN_QUEUE]; // it stores the skill id.
- char train_queue_race_array[MAX_TRAIN_QUEUE]; // it stores the race id.
- char train_queue_count;
- short train_unit_recno; // race id. of the unit the town is currently training, 0-if currently not training any
- int train_unit_action_id; // id. of the action to be assigned to this unit when it is finished training.
- DWORD start_train_frame_no;
- short defend_target_recno; // used in defend mode, store recno of latest target atttacking this town
- //-------- other vars ----------//
- int accumulated_collect_tax_penalty;
- int accumulated_reward_penalty;
- int accumulated_recruit_penalty;
- int accumulated_enemy_grant_penalty;
- int last_rebel_date;
- short independent_unit_join_nation_min_rating;
- short quality_of_life;
- void update_quality_of_life();
- //------- auto policy -------------//
- short auto_collect_tax_loyalty; // auto collect tax if the loyalty reaches this level
- short auto_grant_loyalty; // auto grant if the loyalty drop below this level
- //----------- AI vars ------------//
- char town_combat_level; // combat level of the people in this town
- char has_product_supply[MAX_PRODUCT]; // whether this town has the supply of these products
- char no_neighbor_space; // 1 if there is no space to build firms/towns next to this town
- //------ inter-relationship -------//
- short linked_firm_count;
- short linked_town_count;
- short linked_firm_array[MAX_LINKED_FIRM_TOWN];
- short linked_town_array[MAX_LINKED_TOWN_TOWN];
- char linked_firm_enable_array[MAX_LINKED_FIRM_TOWN];
- char linked_town_enable_array[MAX_LINKED_TOWN_TOWN];
- int closest_own_camp();
- //------ static class member var ------//
- static short if_town_recno;
- public:
- Town();
- void init(int,int,int,int);
- void deinit();
- void next_day();
- void draw(int displayLayer=1);
- void process_ai();
- void disp_info(int refreshFlag);
- void detect_info();
- int browse_selected_race_id();
- void assign_unit(int unitRecno);
- int recruit(int withTraining, int raceId, char remoteAction);
- int recruit_dec_loyalty(int raceId, int decNow=1);
- void cancel_train_unit();
- int form_new_nation();
- int can_recruit(int raceId);
- int can_train(int raceId);
- int can_migrate(int destTownRecno, int migrateNow=0, int raceId=0); // if not called by Town::mirgate, don't set migrateNow to TRUE
- void move_pop(Town* destTown, int raceId, int hasJob);
- int pick_random_race(int pickNonRecruitableAlso, int pickSpyFlag);
- int camp_influence(int unitRecno);
- void setup_link();
- void release_link();
- void release_firm_link(int);
- void release_town_link(int);
- int linked_active_camp_count();
- int can_toggle_firm_link(int firmRecno);
- void update_camp_link();
- void init_pop(int raceId, int addPop, int loyalty, int hasJob=0, int firstInit=0);
- void inc_pop(int raceId, int unitHasJob, int unitLoyalty);
- void inc_pop_overcrowded(int raceId, int unitHasJob, int unitLoyalty);
- void dec_pop(int raceId, int unitHasJob);
- void draw_selected();
- int draw_detect_link_line(int);
- int is_in_zoom_win();
- int has_linked_camp(int nationRecno, int needOverseer);
- void auto_set_layout();
- void set_nation(int nationRecno);
- void surrender(int toNationRecno);
- void set_hostile_nation(int nationRecno);
- void reset_hostile_nation(int nationRecno);
- int is_hostile_nation(int nationRecno);
- int create_rebel_unit(int raceId, int isLeader);
- int mobilize_town_people(int raceId, int decPop, int mobilizeSpy);
- int mobilize_defender(int attackerNationRecno);
- int migrate_to(int destTownRecno, char remoteAction, int raceId=0);
- void collect_yearly_tax();
- void collect_tax(char remoteAction);
- void reward(char remoteAction);
- void distribute_demand();
- void being_attacked(int attackerUnitRecno, float attackDamage);
- void clear_defense_mode();
- void reduce_defender_count();
- void kill_town_people(int raceId, int attackerUnitRecno=0);
- int can_grant_to_non_own_town(int grantNationRecno);
- int grant_to_non_own_town(int grantNationRecno, int remoteAction);
- void get_most_populated_race(int& mostRaceId1, int& mostRaceId2);
- void update_target_loyalty();
- void update_target_resistance();
- void update_loyalty();
- void update_resistance();
- void update_product_supply();
- void change_loyalty(int raceId, float loyaltyChange);
- void change_resistance(int raceId, int nationRecno, float loyaltyChange);
- void toggle_firm_link(int linkId, int toggleFlag, char remoteAction, int setBoth=0);
- void toggle_town_link(int linkId, int toggleFlag, char remoteAction, int setBoth=0);
- void auto_defense(short targetRecno);
- int has_player_spy();
- void verify_slot_object_id_array();
- void set_auto_collect_tax_loyalty(int loyaltyLevel);
- void set_auto_grant_loyalty(int loyaltyLevel);
- void disp_auto_loyalty();
- void add_queue(char skillId, char raceId);
- void remove_queue(char skillId);
- int write_file(File*);
- int read_file(File*);
- //-------- ai functions ---------//
- void think_collect_tax();
- void think_reward();
- int think_build_firm(int firmId, int maxFirm);
- int think_build_market();
- int think_build_camp();
- int think_build_research();
- int think_build_war_factory();
- int think_build_base();
- int think_build_inn();
- int think_ai_migrate();
- int think_ai_migrate_to_town();
- void think_defense();
- int think_split_town();
- void think_move_between_town();
- int think_attack_nearby_enemy();
- int think_attack_linked_enemy();
- void think_capture_linked_firm();
- int think_capture_enemy_town();
- int think_scout();
- void update_base_town_status();
- int new_base_town_status();
- int think_counter_spy();
- int needed_anti_spy_level();
- int think_spying_town();
- int think_spying_town_assign_to(int raceId);
- int should_ai_migrate();
- int detect_enemy(int);
- int protection_needed(); // an index from 0 to 100 indicating the military protection needed for this town
- int protection_available();
- int ai_build_neighbor_firm(int firmId, int firmRaceId=0);
- int ai_settle_new(int raceId);
- //-------- independent town ai functions ---------//
- void think_independent_town();
- void think_independent_set_link();
- int think_independent_form_new_nation();
- int think_independent_unit_join_nation();
- int independent_unit_join_nation(int raceId, int toNationRecno);
- //--------- function for cheat key ----------//
- int get_selected_race();
- //-------------- multiplayer checking codes ---------------//
- UCHAR crc8();
- void clear_ptr();
- //-------------------------------//
- private:
- void set_world_matrix();
- void restore_world_matrix();
- void establish_contact_with_player();
- void process_food();
- void process_auto();
- void process_train();
- void finish_train(Unit*);
- void population_grow();
- void process_queue();
- void think_migrate();
- int think_migrate_one(Town* targetTown, int raceId, int townDistance);
- void migrate(int raceId, int destTownZoneRecno, int newLoyalty);
- // int can_migrate(int destTownRecno, int migrateNow=0, int raceId=0);
- int unjob_town_people(int raceId, int unjobOverseer, int killOverseer=0);
- // void kill_town_people(int raceId);
- int think_layout_id();
- void draw_flag(int,int);
- void draw_farm(int,int,int);
- void disp_basic_info(int refreshFlag);
- void disp_train_info(int refreshFlag);
- void disp_main_menu(int refreshFlag);
- void detect_main_menu();
- void disp_debug_resistance(int refreshFlag);
- void disp_train_menu(int refreshFlag);
- void disp_train_button(int y, int skillId, int buttonUp);
- void disp_queue_button(int y, int skillId, int buttonUp);
- void detect_train_menu();
- void disp_auto_menu(int modeCollectTax);
- void detect_auto_menu(int modeCollectTax);
- void disp_spy_menu(int refreshFlag);
- void detect_spy_menu();
- void daily_update_loyalty();
- void calc_loyalty();
- void think_rebel();
- int think_surrender();
- };
- #pragma pack()
- //-------- Begin of class TownArray ------------//
- class TownArray : public DynArrayB
- {
- public:
- int selected_recno; // the firm current being selected
- int race_wander_pop_array[MAX_RACE]; // no. of wandering people of each race. They are people for setting up independent towns later
- public:
- TownArray();
- ~TownArray();
- void init();
- void deinit();
- int add_town(int nationRecno, int raceId, int xLoc, int yLoc);
- void del_town(int townRecno);
- Town* create_town();
- void draw();
- void draw_dot();
- void draw_profile();
- void process();
- int independent_town_resistance();
- void think_new_independent_town();
- int think_town_loc(int maxTries, int& xLoc, int& yLoc);
- int find_nearest_town(int xLoc, int yLoc, int nationRecno=0);
- int settle(int unitRecno, int xLoc, int yLoc);
- void distribute_demand();
- void stop_attack_nation(short nationRecno);
- int write_file(File*);
- int read_file(File*);
- int is_deleted(int recNo);
- #ifdef DEBUG
- Town* operator[](int recNo);
- #else
- Town* operator[](int recNo) { return (Town*) get_ptr(recNo); }
- #endif
- };
- extern TownArray town_array;
- //---------------------------------------------------//
- #endif
|