summaryrefslogtreecommitdiff
path: root/src/saveload/town_sl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/saveload/town_sl.cpp')
-rw-r--r--src/saveload/town_sl.cpp78
1 files changed, 44 insertions, 34 deletions
diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp
index 906940033..09c575e6a 100644
--- a/src/saveload/town_sl.cpp
+++ b/src/saveload/town_sl.cpp
@@ -272,54 +272,64 @@ static const SaveLoad _town_desc[] = {
SLEG_CONDSTRUCTLIST("acceptance_matrix", SlTownAcceptanceMatrix, SLV_166, SLV_REMOVE_TOWN_CARGO_CACHE),
};
-static void Save_HIDS()
-{
- Save_NewGRFMapping(_house_mngr);
-}
+struct HIDSChunkHandler : ChunkHandler {
+ HIDSChunkHandler() : ChunkHandler('HIDS', CH_TABLE) {}
-static void Load_HIDS()
-{
- Load_NewGRFMapping(_house_mngr);
-}
+ void Save() const override
+ {
+ Save_NewGRFMapping(_house_mngr);
+ }
-static void Save_TOWN()
-{
- SlTableHeader(_town_desc);
+ void Load() const override
+ {
+ Load_NewGRFMapping(_house_mngr);
+ }
+};
- for (Town *t : Town::Iterate()) {
- SlSetArrayIndex(t->index);
- SlObject(t, _town_desc);
+struct CITYChunkHandler : ChunkHandler {
+ CITYChunkHandler() : ChunkHandler('CITY', CH_TABLE)
+ {
+ this->fix_pointers = true;
}
-}
-static void Load_TOWN()
-{
- const std::vector<SaveLoad> slt = SlCompatTableHeader(_town_desc, _town_sl_compat);
+ void Save() const override
+ {
+ SlTableHeader(_town_desc);
- int index;
+ for (Town *t : Town::Iterate()) {
+ SlSetArrayIndex(t->index);
+ SlObject(t, _town_desc);
+ }
+ }
- while ((index = SlIterateArray()) != -1) {
- Town *t = new (index) Town();
- SlObject(t, slt);
+ void Load() const override
+ {
+ const std::vector<SaveLoad> slt = SlCompatTableHeader(_town_desc, _town_sl_compat);
- if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) {
- SlErrorCorrupt("Invalid town name generator");
+ int index;
+
+ while ((index = SlIterateArray()) != -1) {
+ Town *t = new (index) Town();
+ SlObject(t, slt);
+
+ if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) {
+ SlErrorCorrupt("Invalid town name generator");
+ }
}
}
-}
-/** Fix pointers when loading town data. */
-static void Ptrs_TOWN()
-{
- if (IsSavegameVersionBefore(SLV_161)) return;
+ void FixPointers() const override
+ {
+ if (IsSavegameVersionBefore(SLV_161)) return;
- for (Town *t : Town::Iterate()) {
- SlObject(t, _town_desc);
+ for (Town *t : Town::Iterate()) {
+ SlObject(t, _town_desc);
+ }
}
-}
+};
-static const ChunkHandler HIDS{ 'HIDS', Save_HIDS, Load_HIDS, nullptr, nullptr, CH_TABLE };
-static const ChunkHandler CITY{ 'CITY', Save_TOWN, Load_TOWN, Ptrs_TOWN, nullptr, CH_TABLE };
+static const HIDSChunkHandler HIDS;
+static const CITYChunkHandler CITY;
static const ChunkHandlerRef town_chunk_handlers[] = {
HIDS,
CITY,