diff --git a/src/company_base.h b/src/company_base.h index 16fc622c1f..e06bca4336 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -33,10 +33,8 @@ typedef Pool CompanyPool; extern CompanyPool _company_pool; -struct Company : CompanyPool::PoolItem<&_company_pool> { - Company(uint16 name_1 = 0, bool is_ai = false); - ~Company(); - +/** Statically loadable part of Company pool item */ +struct CompanyProperties { uint32 name_2; uint16 name_1; char *name; @@ -52,9 +50,9 @@ struct Company : CompanyPool::PoolItem<&_company_pool> { Money current_loan; byte colour; - Livery livery[LS_END]; + RailTypes avail_railtypes; - RoadTypes avail_roadtypes; + byte block_preview; uint32 cargo_types; ///< which cargo types were transported the last year @@ -74,12 +72,29 @@ struct Company : CompanyPool::PoolItem<&_company_pool> { bool is_ai; - class AIInstance *ai_instance; - class AIInfo *ai_info; - Money yearly_expenses[3][EXPENSES_END]; CompanyEconomyEntry cur_economy; CompanyEconomyEntry old_economy[MAX_HISTORY_MONTHS]; + + CompanyProperties() : name(NULL), president_name(NULL) {} + + ~CompanyProperties() + { + free(this->name); + free(this->president_name); + } +}; + +struct Company : CompanyPool::PoolItem<&_company_pool>, CompanyProperties { + Company(uint16 name_1 = 0, bool is_ai = false); + ~Company(); + + Livery livery[LS_END]; + RoadTypes avail_roadtypes; + + class AIInstance *ai_instance; + class AIInfo *ai_info; + EngineRenewList engine_renew_list; ///< Defined later CompanySettings settings; ///< settings specific for each company uint16 *num_engines; ///< caches the number of engines of each type the company owns (no need to save this) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index fe3dc29a4a..34def7f365 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -50,19 +50,17 @@ uint _cur_company_tick_index; ///< used to generate a name for one c CompanyPool _company_pool("Company"); INSTANTIATE_POOL_METHODS(Company) -Company::Company(uint16 name_1, bool is_ai) : - name_1(name_1), - location_of_HQ(INVALID_TILE), - is_ai(is_ai) +Company::Company(uint16 name_1, bool is_ai) { + this->name_1 = name_1; + this->location_of_HQ = INVALID_TILE; + this->is_ai = is_ai; for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR; InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY); } Company::~Company() { - free(this->name); - free(this->president_name); free(this->num_engines); if (CleaningPool()) return; diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index fd0e8aaf27..1a13fb9b58 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -88,56 +88,60 @@ CompanyManagerFace ConvertFromOldCompanyManagerFace(uint32 face) /* Save/load of companies */ static const SaveLoad _company_desc[] = { - SLE_VAR(Company, name_2, SLE_UINT32), - SLE_VAR(Company, name_1, SLE_STRINGID), - SLE_CONDSTR(Company, name, SLE_STR, 0, 84, SL_MAX_VERSION), + SLE_VAR(CompanyProperties, name_2, SLE_UINT32), + SLE_VAR(CompanyProperties, name_1, SLE_STRINGID), + SLE_CONDSTR(CompanyProperties, name, SLE_STR, 0, 84, SL_MAX_VERSION), - SLE_VAR(Company, president_name_1, SLE_UINT16), - SLE_VAR(Company, president_name_2, SLE_UINT32), - SLE_CONDSTR(Company, president_name, SLE_STR, 0, 84, SL_MAX_VERSION), + SLE_VAR(CompanyProperties, president_name_1, SLE_UINT16), + SLE_VAR(CompanyProperties, president_name_2, SLE_UINT32), + SLE_CONDSTR(CompanyProperties, president_name, SLE_STR, 0, 84, SL_MAX_VERSION), - SLE_VAR(Company, face, SLE_UINT32), + SLE_VAR(CompanyProperties, face, SLE_UINT32), /* money was changed to a 64 bit field in savegame version 1. */ - SLE_CONDVAR(Company, money, SLE_VAR_I64 | SLE_FILE_I32, 0, 0), - SLE_CONDVAR(Company, money, SLE_INT64, 1, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, money, SLE_VAR_I64 | SLE_FILE_I32, 0, 0), + SLE_CONDVAR(CompanyProperties, money, SLE_INT64, 1, SL_MAX_VERSION), - SLE_CONDVAR(Company, current_loan, SLE_VAR_I64 | SLE_FILE_I32, 0, 64), - SLE_CONDVAR(Company, current_loan, SLE_INT64, 65, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, current_loan, SLE_VAR_I64 | SLE_FILE_I32, 0, 64), + SLE_CONDVAR(CompanyProperties, current_loan, SLE_INT64, 65, SL_MAX_VERSION), - SLE_VAR(Company, colour, SLE_UINT8), - SLE_VAR(Company, money_fraction, SLE_UINT8), - SLE_CONDVAR(Company, avail_railtypes, SLE_UINT8, 0, 57), - SLE_VAR(Company, block_preview, SLE_UINT8), + SLE_VAR(CompanyProperties, colour, SLE_UINT8), + SLE_VAR(CompanyProperties, money_fraction, SLE_UINT8), + SLE_CONDVAR(CompanyProperties, avail_railtypes, SLE_UINT8, 0, 57), + SLE_VAR(CompanyProperties, block_preview, SLE_UINT8), - SLE_CONDVAR(Company, cargo_types, SLE_FILE_U16 | SLE_VAR_U32, 0, 93), - SLE_CONDVAR(Company, cargo_types, SLE_UINT32, 94, SL_MAX_VERSION), - SLE_CONDVAR(Company, location_of_HQ, SLE_FILE_U16 | SLE_VAR_U32, 0, 5), - SLE_CONDVAR(Company, location_of_HQ, SLE_UINT32, 6, SL_MAX_VERSION), - SLE_CONDVAR(Company, last_build_coordinate, SLE_FILE_U16 | SLE_VAR_U32, 0, 5), - SLE_CONDVAR(Company, last_build_coordinate, SLE_UINT32, 6, SL_MAX_VERSION), - SLE_CONDVAR(Company, inaugurated_year, SLE_FILE_U8 | SLE_VAR_I32, 0, 30), - SLE_CONDVAR(Company, inaugurated_year, SLE_INT32, 31, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, cargo_types, SLE_FILE_U16 | SLE_VAR_U32, 0, 93), + SLE_CONDVAR(CompanyProperties, cargo_types, SLE_UINT32, 94, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, location_of_HQ, SLE_FILE_U16 | SLE_VAR_U32, 0, 5), + SLE_CONDVAR(CompanyProperties, location_of_HQ, SLE_UINT32, 6, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, last_build_coordinate, SLE_FILE_U16 | SLE_VAR_U32, 0, 5), + SLE_CONDVAR(CompanyProperties, last_build_coordinate, SLE_UINT32, 6, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, inaugurated_year, SLE_FILE_U8 | SLE_VAR_I32, 0, 30), + SLE_CONDVAR(CompanyProperties, inaugurated_year, SLE_INT32, 31, SL_MAX_VERSION), - SLE_ARR(Company, share_owners, SLE_UINT8, 4), + SLE_ARR(CompanyProperties, share_owners, SLE_UINT8, 4), - SLE_VAR(Company, num_valid_stat_ent, SLE_UINT8), + SLE_VAR(CompanyProperties, num_valid_stat_ent, SLE_UINT8), - SLE_VAR(Company, quarters_of_bankruptcy,SLE_UINT8), - SLE_CONDVAR(Company, bankrupt_asked, SLE_FILE_U8 | SLE_VAR_U16, 0, 103), - SLE_CONDVAR(Company, bankrupt_asked, SLE_UINT16, 104, SL_MAX_VERSION), - SLE_VAR(Company, bankrupt_timeout, SLE_INT16), - SLE_CONDVAR(Company, bankrupt_value, SLE_VAR_I64 | SLE_FILE_I32, 0, 64), - SLE_CONDVAR(Company, bankrupt_value, SLE_INT64, 65, SL_MAX_VERSION), + SLE_VAR(CompanyProperties, quarters_of_bankruptcy,SLE_UINT8), + SLE_CONDVAR(CompanyProperties, bankrupt_asked, SLE_FILE_U8 | SLE_VAR_U16, 0, 103), + SLE_CONDVAR(CompanyProperties, bankrupt_asked, SLE_UINT16, 104, SL_MAX_VERSION), + SLE_VAR(CompanyProperties, bankrupt_timeout, SLE_INT16), + SLE_CONDVAR(CompanyProperties, bankrupt_value, SLE_VAR_I64 | SLE_FILE_I32, 0, 64), + SLE_CONDVAR(CompanyProperties, bankrupt_value, SLE_INT64, 65, SL_MAX_VERSION), /* yearly expenses was changed to 64-bit in savegame version 2. */ - SLE_CONDARR(Company, yearly_expenses, SLE_FILE_I32 | SLE_VAR_I64, 3 * 13, 0, 1), - SLE_CONDARR(Company, yearly_expenses, SLE_INT64, 3 * 13, 2, SL_MAX_VERSION), + SLE_CONDARR(CompanyProperties, yearly_expenses, SLE_FILE_I32 | SLE_VAR_I64, 3 * 13, 0, 1), + SLE_CONDARR(CompanyProperties, yearly_expenses, SLE_INT64, 3 * 13, 2, SL_MAX_VERSION), - SLE_CONDVAR(Company, is_ai, SLE_BOOL, 2, SL_MAX_VERSION), + SLE_CONDVAR(CompanyProperties, is_ai, SLE_BOOL, 2, SL_MAX_VERSION), SLE_CONDNULL(1, 107, 111), ///< is_noai SLE_CONDNULL(1, 4, 99), + SLE_END() +}; + +static const SaveLoad _company_settings_desc[] = { /* Engine renewal settings */ SLE_CONDNULL(512, 16, 18), SLE_CONDREF(Company, engine_renew_list, REF_ENGINE_RENEWS, 19, SL_MAX_VERSION), @@ -230,7 +234,8 @@ static void SaveLoad_PLYR(Company *c) { int i; - SlObject(c, _company_desc); + SlObject((CompanyProperties *)c, _company_desc); + SlObject(c, _company_settings_desc); /* Keep backwards compatible for savegames, so load the old AI block */ if (CheckSavegameVersion(107) && c->is_ai) {