/*
* 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 : ONATIONB.H
//Description : class NationBase
#ifndef __ONATIONB_H
#define __ONATIONB_H
#ifndef __OINFO_H
#include
#endif
#ifndef __ORAWRES_H
#include
#endif
#ifndef __OTALKMSG_H
#include
#endif
//---------- Define constant -----------//
enum { NATION_OWN=1, NATION_REMOTE, NATION_AI }; // NATION_MISC=Government
enum { NATION_HOSTILE=0, NATION_TENSE, NATION_NEUTRAL, NATION_FRIENDLY, NATION_ALLIANCE };
enum { RELATION_LEVEL_PER_STATUS = 20 }; // relation_level = status * NATION_LEVEL_PER_STATUS
//---------- import type ----------//
enum { IMPORT_TYPE_COUNT = 3 };
enum { IMPORT_RAW,
IMPORT_PRODUCT,
IMPORT_TOTAL
};
//--------- income types --------//
enum { INCOME_TYPE_COUNT = 8 };
enum { INCOME_SELL_GOODS,
INCOME_EXPORTS,
INCOME_TAX,
INCOME_TREASURE,
INCOME_FOREIGN_WORKER,
INCOME_SELL_FIRM,
INCOME_TRIBUTE,
INCOME_CHEAT,
};
//--------- expense types --------//
enum { EXPENSE_TYPE_COUNT = 16 };
enum { EXPENSE_GENERAL,
EXPENSE_SPY,
EXPENSE_MOBILE_UNIT,
EXPENSE_CARAVAN,
EXPENSE_WEAPON,
EXPENSE_SHIP,
EXPENSE_FIRM,
EXPENSE_TRAIN_UNIT,
EXPENSE_HIRE_UNIT,
EXPENSE_REWARD_UNIT,
EXPENSE_FOREIGN_WORKER,
EXPENSE_GRANT_OWN_TOWN,
EXPENSE_GRANT_OTHER_TOWN,
EXPENSE_IMPORTS,
EXPENSE_TRIBUTE,
EXPENSE_BRIBE,
};
//----- Define struct NationRelation -------//
#pragma pack(1)
struct NationRelation // many-to-many relationships between nations
{
char has_contact; // whether this nation has been contacted or not
char should_attack; // whether units should automatically attack units/firms of this nation when the relationship is hostile
char trade_treaty; // whether allow trading with this nation
char status;
char* status_str() { return relation_status_str_array[status]; }
int last_change_status_date;
char* status_duration_str();
char ai_relation_level; // AI's subjectively relation levels towards the others, the opposite nation's relation level is not the same as this
char ai_secret_attack;
char ai_demand_trade_treaty;
float good_relation_duration_rating; // a rating indicate how long does a good relation (friendly/alliance) lasts
short started_war_on_us_count; // how many times this nation has started a war with us, the more the times the worse this nation is.
float cur_year_import[IMPORT_TYPE_COUNT];
float last_year_import[IMPORT_TYPE_COUNT];
float lifetime_import[IMPORT_TYPE_COUNT];
float import_365days(int importType) { return last_year_import[importType]*(365-info.year_day)/365 +
cur_year_import[importType]; }
int last_talk_reject_date_array[MAX_TALK_TYPE]; // the date which the last diplomatic request was rejected.
int last_military_aid_date;
int last_give_gift_date; // the last date which the current nation give tribute, aid or technology to this nation
short total_given_gift_amount; // the total amount of gift the current nation has given to this nation
char contact_msg_flag; // used only in multiplayer
static char* relation_status_str_array[5];
};
#pragma pack()
//---------- Define class Nation -----------//
class Unit;
class Firm;
#pragma pack(1)
class NationBase
{
public:
enum { NATION_NAME_LEN=50 };
short nation_recno;
char nation_type;
char race_id;
char color_scheme_id;
char nation_color; // main color of the nation, based on from color_scheme_id
short king_unit_recno; // recno of the king
char king_leadership;
int nation_name_id; // name of the king/nation
char nation_name_str[NATION_NAME_LEN+1]; // for nation_name()'s use
char* nation_name();
char* king_name(int firstWordOnly=0);
DWORD player_id; // player id for multiplayer game
char next_frame_ready; // for indicating whether the next frame is ready or not
short last_caravan_id; // id. of the nation's caravan.
short nation_firm_count; // total no. of firms the nation has built
int last_build_firm_date;
char know_base_array[MAX_RACE]; // whether the unit knows how to constructure seat of power or not
char base_count_array[MAX_RACE]; // no. of seat of power this nation has
char is_at_war_today;
char is_at_war_yesterday;
int last_war_date;
short last_attacker_unit_recno;
int last_independent_unit_join_date;
int peaceful_days() { return info.game_date - last_war_date; }
char* peace_duration_str();
void set_at_war_today(int attackerUnitRecno=0)
{ is_at_war_today=1; if(attackerUnitRecno) last_attacker_unit_recno=attackerUnitRecno; }
int is_at_war() { return is_at_war_today || is_at_war_yesterday; }
char cheat_enabled_flag;
//----------------------------------//
float cash;
float food;
char* cash_str();
char* food_str();
int yearly_food_consumption() { return PERSON_FOOD_YEAR_CONSUMPTION * all_population(); }
int yearly_food_production() { return PEASANT_FOOD_YEAR_PRODUCTION * total_jobless_population; }
int yearly_food_change() { return yearly_food_production() - yearly_food_consumption(); }
float reputation; // can be negative, means bad reputation
float kill_monster_score;
//------- town 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
//----- yearly income, expense and profit ------//
float cur_year_profit;
float last_year_profit;
float profit_365days() { return last_year_profit*(365-info.year_day)/365 +
cur_year_profit; }
float cur_year_fixed_income;
float last_year_fixed_income;
float fixed_income_365days() { return last_year_fixed_income*(365-info.year_day)/365 +
cur_year_fixed_income; }
float cur_year_fixed_expense;
float last_year_fixed_expense;
float fixed_expense_365days() { return last_year_fixed_expense*(365-info.year_day)/365 +
cur_year_fixed_expense; }
float fixed_profit_365days() { return fixed_income_365days() - fixed_expense_365days(); }
//------- yearly income ------//
float cur_year_income_array[INCOME_TYPE_COUNT];
float last_year_income_array[INCOME_TYPE_COUNT];
float cur_year_income; // total income
float last_year_income;
float income_365days() { return last_year_income*(365-info.year_day)/365 + cur_year_income; }
float income_365days(int incomeType) { return last_year_income_array[incomeType] * (365-info.year_day) / 365 +
cur_year_income_array[incomeType]; }
float true_income_365days(); // total income, excluding cheats
//------- yearly expense ------//
float cur_year_expense_array[EXPENSE_TYPE_COUNT];
float last_year_expense_array[EXPENSE_TYPE_COUNT];
float cur_year_expense; // total expense
float last_year_expense;
float expense_365days() { return last_year_expense*(365-info.year_day)/365 + cur_year_expense; }
float expense_365days(int expenseType) { return last_year_expense_array[expenseType] * (365-info.year_day) / 365 +
cur_year_expense_array[expenseType]; }
//------- yearly expense ------//
float cur_year_cheat; // total cheat
float last_year_cheat;
float cheat_365days() { return last_year_cheat*(365-info.year_day)/365 + cur_year_cheat; }
float true_profit_365days() { return profit_365days() - cheat_365days(); }
//----- yearly food in, out and change ------//
float cur_year_food_in;
float last_year_food_in;
float cur_year_food_out;
float last_year_food_out;
float cur_year_food_change;
float last_year_food_change;
float food_change_365days() { return last_year_food_change*(365-info.year_day)/365 +
cur_year_food_change; }
//----- yearly reputatino change ------//
float cur_year_reputation_change;
float last_year_reputation_change;
float reputation_change_365days() { return last_year_reputation_change*(365-info.year_day)/365 +
cur_year_reputation_change; }
//--------- inter-nation relationship -----------//
NationRelation relation_array[MAX_NATION]; // inter-relationship with other nations
char relation_status_array[MAX_NATION]; // replace status in struct NationRelation
char relation_passable_array[MAX_NATION]; // for seeking to indicate whether passing other nation region
char relation_should_attack_array[MAX_NATION];
char is_allied_with_player; // for fast access in visiting world functions
void set_relation_status(short nationRecno, char newStatus, char recursiveCall=0);
char get_relation_status(short nationRecno);
void set_relation_passable(short nationRecno, char status);
char get_relation_passable(short nationRecno);
void set_relation_should_attack(short nationRecno, char newValue, char remoteAction);
char get_relation_should_attack(short nationRecno);
void set_trade_treaty(int nationRecno, char allowFlag);
void establish_contact(int nationRecno);
void change_ai_relation_level(short nationRecno, int levelChange);
#ifdef DEBUG
NationRelation* get_relation(int nationRecno);
#else
NationRelation* get_relation(int nationRecno) { return relation_array+nationRecno-1; }
#endif
//--------- total yearly trade amount --------//
float total_year_trade(int nationRecno);
int trade_rating(int nationRecno);
//---------- statistic ------------//
int total_population;
int total_jobless_population;
int all_population() { return total_population + total_human_count; }
int total_unit_count;
int total_human_count;
int total_general_count;
int total_weapon_count;
int total_ship_count;
int total_firm_count;
int total_spy_count;
int total_ship_combat_level;
short largest_town_recno; // the recno of the biggest town of this nation
short largest_town_pop;
int total_tech_level(int unitClass=0);
int base_town_count_in_region(int regionId);
short raw_count_array[MAX_RAW]; // no. of natural resources site this nation possesses
short last_unit_name_id_array[MAX_UNIT_TYPE];
//--------- rank ratings ---------//
int population_rating;
int military_rating;
int economic_rating;
int overall_rating;
void update_nation_rating();
int get_population_rating();
int get_economic_rating();
int get_overall_rating();
int population_rank_rating();
int military_rank_rating();
int economic_rank_rating();
int reputation_rank_rating();
int kill_monster_rank_rating();
int overall_rank_rating();
//------ additional statistic ------//
int enemy_soldier_killed;
int own_soldier_killed;
int enemy_civilian_killed;
int own_civilian_killed;
int enemy_weapon_destroyed;
int own_weapon_destroyed;
int enemy_ship_destroyed;
int own_ship_destroyed;
int enemy_firm_destroyed;
int own_firm_destroyed;
//---------- functions -------------//
int goal_destroy_nation_achieved();
int goal_destroy_monster_achieved();
int goal_population_achieved();
int goal_economic_score_achieved();
int goal_total_score_achieved();
int is_own() { return nation_type==NATION_OWN; }
int is_ai() { return nation_type==NATION_AI; }
int is_remote() { return nation_type==NATION_REMOTE; }
public:
NationBase();
~NationBase();
virtual void init(int nationType, int raceId, int colorSchemeId, DWORD playerId=0);
virtual void deinit();
void init_relation(int relationNationRecno);
void close_all_firm();
void deinit_all_unit();
void succeed_king(int kingUnitRecno);
void set_king(int kingUnitRecno, int firstKing);
void hand_over_to(int handoverNationRecno);
void disp_nation_color(int x, int y);
void next_day();
void next_month();
void next_year();
void add_income(int incomeType, float incomeAmt, int fixedIncome=0);
void add_expense(int expenseType, float expenseAmt, int fixedExpense=0);
void add_cheat(float cheatAmt);
void change_reputation(float);
void add_food(float);
void consume_food(float);
void import_goods(int importType, int nationRecno, float importAmt);
void give_tribute(int toNationRecno, int tributeAmt);
void give_tech(int toNationRecno, int techId, int techVersion);
void set_auto_collect_tax_loyalty(int loyaltyLevel);
void set_auto_grant_loyalty(int loyaltyLevel);
int has_people(); // whether the nation has any people (but not counting the king). If no, then the nation is going to end.
void being_attacked(int attackNationRecno);
void civilian_killed(int civilianRaceId, int isAttacker);
void change_all_people_loyalty(int loyaltyChange, int raceId=0);
void form_friendly_treaty(int nationRecno);
void form_alliance_treaty(int nationRecno);
void end_treaty(int endTreatyNationRecno, int newStatus);
void surrender(int toNationRecno);
void defeated();
void check_win();
void check_lose();
int revealed_by_phoenix(int xLoc, int yLoc);
//--------- file functions -----------//
int write_file(File* filePtr);
int read_file(File* filePtr);
//-------------- multiplayer checking codes ---------------//
virtual UCHAR crc8();
virtual void clear_ptr();
};
#pragma pack()
//--------------------------------------//
//### begin alex 12/8 ###//
extern short nation_hand_over_flag; // 0 for no nation hand over, 1-MAX_NATION for nation hand over
//#### end alex 12/8 ####//
#endif