/* * 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 . * */ //Filename : OFIRM.H //Description : Header file of Object Firm #ifndef __OFIRM_H #define __OFIRM_H #ifndef __GAMEDEF_H #include #endif #ifndef __OFIRMA_H #include #endif #ifndef __OINFO_H #include #endif #ifndef __OFIRMID_H #include #endif #ifndef __OFIRMRES_H #include #endif #ifndef __OSKILL_H #include #endif //----------- Define constant ------------// #define MAX_WORKER 8 // maximum no. of workers in a firm #define MAX_CARGO 9 #define WORKER_YEAR_SALARY 10 #define CAN_SELL_HIT_POINTS_PERCENT 80 // only when the firm's hit points is higher than this can the firm be sold //------- define firm menu modes --------// enum { FIRM_MENU_MAIN, FIRM_MENU_SPY, FIRM_MENU_SELECT_BRIBER, FIRM_MENU_SET_BRIBE_AMOUNT, FIRM_MENU_VIEW_SECRET, FIRM_MENU_ASSASSINATE_RESULT }; //------- define parameters for ai_status, used for AI ------// enum { FIRM_WITHOUT_ACTION=0, FACTORY_RELOCATE, MARKET_FOR_SELL, CAMP_IN_DEFENSE, }; //-------- define values for Firm::bribe_result -------// enum { BRIBE_NONE, BRIBE_SUCCEED, BRIBE_FAIL, }; //-------- define values for Firm::assassinate_result -------// enum { ASSASSINATE_FAIL, ASSASSINATE_SUCCEED_AT_LARGE, // assassination succeed and the assassinator is at large ASSASSINATE_SUCCEED_KILLED, // assassination succeed and the assassinator is caught and executed }; //------------- Define struct Worker ------------// #pragma pack(1) struct Worker { public: Worker(); char race_id; char unit_id; short town_recno; short name_id; char skill_id; char skill_level; char skill_level_minor; char skill_potential; char combat_level; char combat_level_minor; short spy_recno; char rank_id; char worker_loyalty; // only for firms with live_in_town being 0 short hit_points; short extra_para; // weapon version for weapons and power attack points for human units short max_hit_points(); int loyalty(); int target_loyalty(int firmRecno); int is_nation(int firmRecno, int nationRecno); public: void init_potential(); char *small_icon_ptr(); void change_loyalty(int loyaltyChange); void change_hit_points(int changePoints); int max_attack_range(); }; #pragma pack() class FirmBase; class FirmMine; class FirmFactory; class FirmMarket; class FirmCamp; class FirmFarm; class FirmInn; class FirmResearch; class FirmWar; class FirmHarbor; //----------- Define class Firm ------------// #pragma pack(1) class Firm { public: char firm_id; // Firm ID, meanings are defined in OFIRMID.H short firm_build_id; short firm_recno; // record no. of this firm in the firm_array char firm_ai; // whether Computer AI control this firm or not char ai_processed; // some ai actions are processed once only in the processing day. To prevent multiple checking in the processing day char ai_status; char ai_link_checked; // AI checks firms and towns location by links, disable checking by setting this parameter to 1 char ai_sell_flag; // this is true if the AI has queued the command to sell this firm char race_id; short nation_recno; // this firm's parent company nation char majority_race(); // the race that has the majority of the population int own_firm(); // whether the firm is controlled by the current player int can_sell() { return hit_points >= (int) max_hit_points * CAN_SELL_HIT_POINTS_PERCENT / 100; } //-------- firm name vars ---------// short closest_town_name_id; // name id. of the town that is closest to this firm when it is built short firm_name_instance_id; virtual char* firm_name(); //--------- display info ----------// short loc_x1, loc_y1, loc_x2, loc_y2; short abs_x1, abs_y1, abs_x2, abs_y2; short center_x, center_y; BYTE region_id; char cur_frame; // current animation frame id. char remain_frame_delay; //---------- game vars ------------// float hit_points; float max_hit_points; char under_construction; // whether the firm is under construction char firm_skill_id; short overseer_recno; short overseer_town_recno; short builder_recno; // the recno of the builder BYTE builder_region_id; // the original region no. of builder float productivity; Worker* worker_array; char worker_count; char selected_worker_id; char player_spy_count; BYTE sabotage_level; // 0-100 for counter productivity int average_worker_skill(); virtual int is_operating() { return productivity > 0; } //------ inter-relationship -------// char linked_firm_count; char linked_town_count; short linked_firm_array[MAX_LINKED_FIRM_FIRM]; short linked_town_array[MAX_LINKED_FIRM_TOWN]; char linked_firm_enable_array[MAX_LINKED_FIRM_FIRM]; char linked_town_enable_array[MAX_LINKED_FIRM_TOWN]; //--------- financial vars ---------// float last_year_income; float cur_year_income; float income_365days() { return last_year_income*(365-info.year_day)/365 + cur_year_income; } int year_expense(); //---------------------------------// int setup_date; // the date which this firm is setup char* setup_years_str(int=0); // return the no. of years this firm has been setup in string char should_set_power; int last_attacked_date; // the date when the firm was last being attacked. //----------- AI vars ------------// char should_close_flag; char no_neighbor_space; // no space to build firms/towns next to this town char ai_should_build_factory_count; //--------- static vars ----------// static char firm_menu_mode; static short action_spy_recno; // recno of the spy that is doing the bribing or viewing secret reports of other nations static char bribe_result; static char assassinate_result; public: Firm(); virtual ~Firm(); virtual void init(int xLoc, int yLoc, int nationRecno, int firmId, char* buildCode=NULL, short builderRecno=0); virtual void deinit(); void init_name(); int get_closest_town_name_id(); virtual void assign_unit(int unitRecno); virtual void assign_overseer(int overseerUnitRecno); virtual void assign_worker(int workerUnitRecno); void kill_overseer(); void kill_all_worker(); void kill_worker(int workerId); void kill_builder(short builderRecno); virtual void being_attacked(int attackerUnitRecno); virtual int pull_town_people(int townRecno, char remoteAction, int raceId=0, int forcePull=0); void resign_overseer() { assign_overseer(0); } void set_world_matrix(); void restore_world_matrix(); int get_should_set_power(); void establish_contact_with_player(); void complete_construction(); // complete construction instantly void capture_firm(int newNationRecno); virtual void change_nation(int newNationRecno); void setup_link(); void release_link(); void release_firm_link(int); void release_town_link(int); int can_toggle_town_link(); int can_toggle_firm_link(int firmRecno); int is_in_zoom_win(); int find_settle_town(); int should_show_info(); int set_builder(short newBuilderRecno); virtual void sell_firm(char remoteAction); void destruct_firm(char remoteAction); void cancel_construction(char remoteAction); int can_assign_capture(); int can_worker_capture(int captureNationRecno); virtual int is_worker_full(); void set_worker_home_town(int townRecno, char remoteAction, int workerId=0); int can_spy_bribe(int bribeWorkerId, int briberNationRecno); int spy_bribe(int bribeAmount, short briber, short workerId); int spy_bribe_succeed_chance(int bribeAmount, short briberSpyRecno, short workerId); int validate_cur_bribe(); //------------------- defense --------------------// virtual void auto_defense(short targetRecno); int locate_space(int removeFirm, int &xLoc, int &yLoc, int xLoc2, int yLoc2, int width, int height, int mobileType=UNIT_LAND, int regionId=0); //---------------------------------------// virtual void draw(int displayLayer=1); virtual void draw_full_size(int displayLayer=1); virtual void draw_frame(int frameId, int displayLayer=1); void draw_selected(); int draw_detect_link_line(int actionDetect); void disp_info_both(int refreshFlag); void detect_info_both(); virtual void put_info(int refreshFlag) {;} virtual void detect_info() {;} void process_animation(); void process_construction(); void process_repair(); void process_common_ai(); virtual void process_ai() {;} virtual void process_tell() {;} virtual void next_day(); virtual void next_month(); virtual void next_year(); void mobilize_all_worker(int leaderUnitRecno); virtual int mobilize_worker(int workerId, char remoteAction); int create_worker_unit(Worker& thisWorker); virtual int mobilize_overseer(); int mobilize_builder(short recno); void resign_all_worker(int disappearFlag=0); virtual int resign_worker(int workerId); void reward(int workerId, int remoteAction); 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); virtual int write_derived_file(File*); virtual int read_derived_file(File*); virtual FirmBase* cast_to_FirmBase() { return 0; }; virtual FirmMine* cast_to_FirmMine() { return 0; }; virtual FirmFactory* cast_to_FirmFactory() { return 0; }; virtual FirmMarket* cast_to_FirmMarket() { return 0; }; virtual FirmCamp* cast_to_FirmCamp() { return 0; }; virtual FirmFarm* cast_to_FirmFarm() { return 0; }; virtual FirmInn* cast_to_FirmInn() { return 0; }; virtual FirmResearch* cast_to_FirmResearch() { return 0; }; virtual FirmWar* cast_to_FirmWar() { return 0; }; virtual FirmHarbor* cast_to_FirmHarbor() { return 0; }; //---------- AI functions ----------// void think_repair(); void ai_del_firm(); int ai_recruit_worker(); virtual int ai_has_excess_worker() { return 0; } // whether the AI has excess workers on this firm or not int think_build_factory(int rawId); virtual int ai_should_close(); int ai_build_neighbor_firm(int firmId); virtual void ai_update_link_status(); int think_hire_inn_unit(); int think_capture(); virtual void think_linked_town_change_nation(int linkedTownRecno, int oldNationRecno, int newNationRecno); void ai_firm_captured(int capturerNationRecno); //-------------- multiplayer checking codes ---------------// virtual UCHAR crc8(); virtual void clear_ptr(); //---------------------------------------// protected: virtual void init_derived() {;} virtual void deinit_derived() {;} void recruit_worker(); void free_worker_room(); int assign_settle(int raceId, int unitLoyalty, int isOverseer); int best_worker_id(); void calc_productivity(); void update_worker(); void add_income(int incomeType, float incomeAmt); void pay_expense(); void consume_food(); void update_loyalty(); void think_worker_migrate(); void worker_migrate(int workerId, int destTownZoneRecno, int newLoyalty); void process_independent_town_worker(); void disp_spy_button(int x, int y, int refreshFlag); void detect_spy_button(); void disp_spy_menu(int refreshFlag); void detect_spy_menu(); int can_player_spy_capture(); void disp_bribe_menu(int refreshFlag); void detect_bribe_menu(); void spy_bribe(int bribeAmount); void disp_bribe_unit(int dispY1); void disp_assassinate_result(int refreshFlag); void detect_assassinate_result(); void disp_worker_list(int dispY1, int refreshFlag); int detect_worker_list(); void disp_basic_info(int dispY1, int refreshFlag); int detect_basic_info(); void disp_worker_info(int dispY1, int refreshFlag); void disp_overseer_info(int dispY1, int refreshFlag); void draw_cargo(int cargoCount, char* cargoBitmapPtr); int create_unit(int unitId, int townZoneRecno=0, int unitHasJob=0); void disp_hit_point(int dispY1); // ##### begin Gilbert 18/10 #######// int construction_frame(); // for under construction only // ##### end Gilbert 18/10 #######// }; #pragma pack() //------------------------------------------// #endif