From 9008d793ab6e1175ecec2771bb85043a7573db4f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 7 May 2024 20:01:28 +0100 Subject: [PATCH] Change: Use per-company group numbers. (#12297) This is used by the default group name, replacing the use of group index. --- regression/regression/result.txt | 2 +- src/company_base.h | 1 + src/economy.cpp | 6 +++++- src/group.h | 1 + src/group_cmd.cpp | 12 +++++++----- src/group_gui.cpp | 2 +- src/saveload/afterload.cpp | 11 +++++++++++ src/saveload/group_sl.cpp | 1 + src/saveload/saveload.h | 1 + src/strings.cpp | 2 +- 10 files changed, 30 insertions(+), 9 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 8abbcb7e48..27a81675a9 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -6093,7 +6093,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetNumEngines(): 1 GetNumEngines(): 1 GetNumEngines(): 0 - GetName(): Group 0 + GetName(): Group 1 GetName(): (null : 0x00000000) AIVehicle.SellVehicle(): true AITile.DemolishTile(): true diff --git a/src/company_base.h b/src/company_base.h index d6ab4a8fd1..814665777b 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -146,6 +146,7 @@ struct Company : CompanyProperties, CompanyPool::PoolItem<&_company_pool> { CompanyInfrastructure infrastructure; ///< NOSAVE: Counts of company owned infrastructure. FreeUnitIDGenerator freeunits[VEH_COMPANY_END]; + FreeUnitIDGenerator freegroups; Money GetMaxLoan() const; diff --git a/src/economy.cpp b/src/economy.cpp index 868b1acb5a..bdb3cb06e0 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -424,8 +424,12 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner) if (new_owner == INVALID_OWNER) { RemoveAllGroupsForCompany(old_owner); } else { + Company *c = Company::Get(old_owner); for (Group *g : Group::Iterate()) { - if (g->owner == old_owner) g->owner = new_owner; + if (g->owner == old_owner) { + g->owner = new_owner; + g->number = c->freegroups.UseID(c->freegroups.NextID()); + } } } diff --git a/src/group.h b/src/group.h index 3886b155c4..39d9033d36 100644 --- a/src/group.h +++ b/src/group.h @@ -81,6 +81,7 @@ struct Group : GroupPool::PoolItem<&_group_pool> { bool folded; ///< NOSAVE: Is this group folded in the group view? GroupID parent; ///< Parent group + uint16_t number; ///< Per-company group number. Group(CompanyID owner = INVALID_COMPANY); }; diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index e7a49dd570..96aa2d1c9f 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -350,8 +350,9 @@ std::tuple CmdCreateGroup(DoCommandFlag flags, VehicleType g->vehicle_type = vt; g->parent = INVALID_GROUP; + Company *c = Company::Get(g->owner); + g->number = c->freegroups.UseID(c->freegroups.NextID()); if (pg == nullptr) { - const Company *c = Company::Get(_current_company); g->livery.colour1 = c->livery[LS_DEFAULT].colour1; g->livery.colour2 = c->livery[LS_DEFAULT].colour2; if (c->settings.renew_keep_length) SetBit(g->flags, GroupFlags::GF_REPLACE_WAGON_REMOVAL); @@ -397,14 +398,15 @@ CommandCost CmdDeleteGroup(DoCommandFlag flags, GroupID group_id) /* Update backupped orders if needed */ OrderBackup::ClearGroup(g->index); - /* If we set an autoreplace for the group we delete, remove it. */ - if (_current_company < MAX_COMPANIES) { - Company *c; + if (g->owner < MAX_COMPANIES) { + Company *c = Company::Get(g->owner); - c = Company::Get(_current_company); + /* If we set an autoreplace for the group we delete, remove it. */ for (EngineRenew *er : EngineRenew::Iterate()) { if (er->group_id == g->index) RemoveEngineReplacementForCompany(c, er->from, g->index, flags); } + + c->freegroups.ReleaseID(g->number); } VehicleType vt = g->vehicle_type; diff --git a/src/group_gui.cpp b/src/group_gui.cpp index b355e9f98f..8f3ff5dfcb 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -180,7 +180,7 @@ void BuildGuiGroupList(GUIGroupList &dst, bool fold, Owner owner, VehicleType ve } int r = StrNaturalCompare(last_group[0].second, last_group[1].second); // Sort by name (natural sorting). - if (r == 0) return a.group->index < b.group->index; + if (r == 0) return a.group->number < b.group->number; return r < 0; }); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a1d016a1f1..a62f19c05b 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3286,6 +3286,17 @@ bool AfterLoadGame() UpdateCompanyLiveries(c); } + /* Update free group numbers data for each company, required regardless of savegame version. */ + for (Group *g : Group::Iterate()) { + Company *c = Company::Get(g->owner); + if (IsSavegameVersionBefore(SLV_GROUP_NUMBERS)) { + /* Use the index as group number when converting old savegames. */ + g->number = c->freegroups.UseID(g->index); + } else { + c->freegroups.UseID(g->number); + } + } + AfterLoadLabelMaps(); AfterLoadCompanyStats(); AfterLoadStoryBook(); diff --git a/src/saveload/group_sl.cpp b/src/saveload/group_sl.cpp index 2baae15416..82ef465e08 100644 --- a/src/saveload/group_sl.cpp +++ b/src/saveload/group_sl.cpp @@ -26,6 +26,7 @@ static const SaveLoad _group_desc[] = { SLE_CONDVAR(Group, livery.colour1, SLE_UINT8, SLV_GROUP_LIVERIES, SL_MAX_VERSION), SLE_CONDVAR(Group, livery.colour2, SLE_UINT8, SLV_GROUP_LIVERIES, SL_MAX_VERSION), SLE_CONDVAR(Group, parent, SLE_UINT16, SLV_189, SL_MAX_VERSION), + SLE_CONDVAR(Group, number, SLE_UINT16, SLV_GROUP_NUMBERS, SL_MAX_VERSION), }; struct GRPSChunkHandler : ChunkHandler { diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 94c1303acc..99f74777bf 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -380,6 +380,7 @@ enum SaveLoadVersion : uint16_t { SLV_VEHICLE_ECONOMY_AGE, ///< 334 PR#12141 v14.0 Add vehicle age in economy year, for profit stats minimum age SLV_COMPANY_ALLOW_LIST, ///< 335 PR#12337 Saving of list of client keys that are allowed to join this company. + SLV_GROUP_NUMBERS, ///< 336 PR#12297 Add per-company group numbers. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/strings.cpp b/src/strings.cpp index 02c57d362b..8a23b93daa 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1539,7 +1539,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara auto tmp_params = MakeParameters(g->name); GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); } else { - auto tmp_params = MakeParameters(g->index); + auto tmp_params = MakeParameters(g->number); GetStringWithArgs(builder, STR_FORMAT_GROUP_NAME, tmp_params); } break;