diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -372,8 +372,19 @@ public: class SlCompanyOldEconomy : public SlCompanyEconomy { public: - void GenericSaveLoad(CompanyProperties *c) const + void Save(CompanyProperties *c) const override { + SlSetStructListLength(c->num_valid_stat_ent); + for (int i = 0; i < c->num_valid_stat_ent; i++) { + SlObject(&c->old_economy[i], this->GetDescription()); + } + } + + void Load(CompanyProperties *c) const override + { + if (!IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) { + c->num_valid_stat_ent = (uint8)SlGetStructListLength(UINT8_MAX); + } if (c->num_valid_stat_ent > lengthof(c->old_economy)) SlErrorCorrupt("Too many old economy entries"); for (int i = 0; i < c->num_valid_stat_ent; i++) { @@ -381,10 +392,7 @@ public: } } - void Save(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void Load(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void LoadCheck(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void FixPointers(CompanyProperties *c) const override { this->GenericSaveLoad(c); } + void LoadCheck(CompanyProperties *c) const override { this->Load(c); } }; class SlCompanyLiveries : public DefaultSaveLoadHandler { @@ -395,12 +403,33 @@ public: SLE_CONDVAR(Livery, colour2, SLE_UINT8, SLV_34, SL_MAX_VERSION), }; - void GenericSaveLoad(CompanyProperties *c) const + /** + * Get the number of liveries used by this savegame version. + * @return The number of liveries used by this savegame version. + */ + size_t GetNumLiveries() const { - int num_liveries = IsSavegameVersionBefore(SLV_63) ? LS_END - 4 : (IsSavegameVersionBefore(SLV_85) ? LS_END - 2: LS_END); + if (IsSavegameVersionBefore(SLV_63)) return LS_END - 4; + if (IsSavegameVersionBefore(SLV_85)) return LS_END - 2; + if (IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH)) return LS_END; + /* Read from the savegame how long the list is. */ + return SlGetStructListLength(LS_END); + } + + void Save(CompanyProperties *c) const override + { + SlSetStructListLength(LS_END); + for (int i = 0; i < LS_END; i++) { + SlObject(&c->livery[i], this->GetDescription()); + } + } + + void Load(CompanyProperties *c) const override + { + size_t num_liveries = this->GetNumLiveries(); bool update_in_use = IsSavegameVersionBefore(SLV_GROUP_LIVERIES); - for (int i = 0; i < num_liveries; i++) { + for (size_t i = 0; i < num_liveries; i++) { SlObject(&c->livery[i], this->GetDescription()); if (update_in_use && i != LS_DEFAULT) { if (c->livery[i].in_use == 0) { @@ -426,10 +455,7 @@ public: } } - void Save(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void Load(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void LoadCheck(CompanyProperties *c) const override { this->GenericSaveLoad(c); } - void FixPointers(CompanyProperties *c) const override { this->GenericSaveLoad(c); } + void LoadCheck(CompanyProperties *c) const override { this->Load(c); } }; /* Save/load of companies */ @@ -467,7 +493,7 @@ static const SaveLoad _company_desc[] = SLE_ARR(CompanyProperties, share_owners, SLE_UINT8, 4), - SLE_VAR(CompanyProperties, num_valid_stat_ent, SLE_UINT8), + SLE_CONDVAR(CompanyProperties, num_valid_stat_ent, SLE_UINT8, SL_MIN_VERSION, SLV_SAVELOAD_LIST_LENGTH), SLE_VAR(CompanyProperties, months_of_bankruptcy, SLE_UINT8), SLE_CONDVAR(CompanyProperties, bankrupt_asked, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_104),