OpenTTD Source 20260711-master-g3fb3006dff
town_sl.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD 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, version 2.
4 * OpenTTD 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.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "../stdafx.h"
11
12#include "saveload.h"
14
15#include "newgrf_sl.h"
16#include "../newgrf_house.h"
17#include "../town.h"
18#include "../landscape.h"
19#include "../subsidy_func.h"
20#include "../strings_func.h"
22
23#include "../safeguards.h"
24
29{
31 RebuildTownKdtree();
32
33 /* Reset town population and num_houses */
34 for (Town *town : Town::Iterate()) {
35 town->cache.population = 0;
36 town->cache.num_houses = 0;
37 }
38
39 for (const auto t : Map::Iterate()) {
40 if (!IsTileType(t, TileType::House)) continue;
41
42 HouseID house_id = GetHouseType(t);
43 Town *town = Town::GetByTile(t);
44 IncreaseBuildingCount(town, house_id);
45 if (IsHouseCompleted(t)) town->cache.population += HouseSpec::Get(house_id)->population;
46
47 /* Increase the number of houses for every house, but only once. */
48 if (GetHouseNorthPart(house_id) == TileDiffXY(0, 0)) town->cache.num_houses++;
49 }
50
51 /* Update the population and num_house dependent values */
52 for (Town *town : Town::Iterate()) {
53 UpdateTownRadius(town);
54 }
55}
56
66{
67 for (const auto t : Map::Iterate()) {
68 if (!IsTileType(t, TileType::House)) continue;
69
70 HouseID house_id = GetCleanHouseType(t);
71 if (!HouseSpec::Get(house_id)->enabled && house_id >= NEW_HOUSE_OFFSET) {
72 /* The specs for this type of house are not available any more, so
73 * replace it with the substitute original house type. */
74 house_id = _house_mngr.GetSubstituteID(house_id);
75 SetHouseType(t, house_id);
76 }
77 }
78
79 /* Check for cases when a NewGRF has set a wrong house substitute type. */
80 for (const TileIndex &t : Map::Iterate()) {
81 if (!IsTileType(t, TileType::House)) continue;
82
83 HouseID house_type = GetCleanHouseType(t);
84 TileIndex north_tile = t + GetHouseNorthPart(house_type); // modifies 'house_type'!
85 if (t == north_tile) {
86 const HouseSpec *hs = HouseSpec::Get(house_type);
87 bool valid_house = true;
89 TileIndex tile = t + TileDiffXY(1, 0);
90 if (!IsTileType(tile, TileType::House) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
92 TileIndex tile = t + TileDiffXY(0, 1);
93 if (!IsTileType(tile, TileType::House) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
95 TileIndex tile = t + TileDiffXY(0, 1);
96 if (!IsTileType(tile, TileType::House) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
97 tile = t + TileDiffXY(1, 0);
98 if (!IsTileType(tile, TileType::House) || GetCleanHouseType(tile) != house_type + 2) valid_house = false;
99 tile = t + TileDiffXY(1, 1);
100 if (!IsTileType(tile, TileType::House) || GetCleanHouseType(tile) != house_type + 3) valid_house = false;
101 }
102 /* If not all tiles of this house are present remove the house.
103 * The other tiles will get removed later in this loop because
104 * their north tile is not the correct type anymore. */
105 if (!valid_house) DoClearSquare(t);
106 } else if (!IsTileType(north_tile, TileType::House) || GetCleanHouseType(north_tile) != house_type) {
107 /* This tile should be part of a multi-tile building but the
108 * north tile of this house isn't on the map. */
109 DoClearSquare(t);
110 }
111 }
112
114}
115
116
117class SlTownOldSupplied : public DefaultSaveLoadHandler<SlTownOldSupplied, Town> {
118public:
119 static inline const SaveLoad description[] = {
124 };
125 static inline const SaveLoadCompatTable compat_description = _town_supplied_sl_compat;
126
131 size_t GetNumCargo() const
132 {
135 /* Read from the savegame how long the list is. */
137 }
138
139 void Load(Town *t) const override
140 {
141 size_t num_cargo = this->GetNumCargo();
142 for (size_t i = 0; i < num_cargo; i++) {
144 SlObject(&cargo_stat, this->GetLoadDescription());
145
146 /* Ignore empty statistics. */
147 if (cargo_stat.new_act == 0 && cargo_stat.new_max == 0 && cargo_stat.old_act == 0 && cargo_stat.old_max == 0) continue;
148
149 auto &s = t->supplied.emplace_back(static_cast<CargoType>(i));
150 s.history[LAST_MONTH].production = cargo_stat.old_max;
151 s.history[LAST_MONTH].transported = cargo_stat.old_act;
152 s.history[THIS_MONTH].production = cargo_stat.new_max;
153 s.history[THIS_MONTH].transported = cargo_stat.new_act;
154 }
155 }
156};
157
158class SlTownSuppliedHistory : public DefaultSaveLoadHandler<SlTownSuppliedHistory, Town::SuppliedCargo> {
159public:
160 static inline const SaveLoad description[] = {
163 };
164 static inline const SaveLoadCompatTable compat_description = {};
165
166 void Save(Town::SuppliedCargo *p) const override
167 {
168 SlSetStructListLength(p->history.size());
169
170 for (auto &h : p->history) {
171 SlObject(&h, this->GetDescription());
172 }
173 }
174
175 void Load(Town::SuppliedCargo *p) const override
176 {
177 size_t len = SlGetStructListLength(p->history.size());
178
179 for (auto &h : p->history) {
180 if (--len > p->history.size()) break; // unsigned so wraps after hitting zero.
181 SlObject(&h, this->GetLoadDescription());
182 }
183 }
184};
185
186class SlTownSupplied : public VectorSaveLoadHandler<SlTownSupplied, Town, Town::SuppliedCargo> {
187public:
188 inline static const SaveLoad description[] = {
191 };
192 inline const static SaveLoadCompatTable compat_description = {};
193
194 std::vector<Town::SuppliedCargo> &GetVector(Town *t) const override { return t->supplied; }
195};
196
198class SlTownAcceptedHistory : public DefaultSaveLoadHandler<SlTownAcceptedHistory, Town::AcceptedCargo> {
199public:
201 static inline const SaveLoad description[] = {
203 };
204
205 static inline const SaveLoadCompatTable compat_description = {};
206
207 void Save(Town::AcceptedCargo *p) const override
208 {
210
211 for (auto &h : p->history) {
212 SlObject(&h, this->GetDescription());
213 }
214 }
215
216 void Load(Town::AcceptedCargo *p) const override
217 {
218 size_t len = SlGetStructListLength(p->history.size());
219
220 for (auto &h : p->history) {
221 if (--len > p->history.size()) break; // unsigned so wraps after hitting zero.
222 SlObject(&h, this->GetLoadDescription());
223 }
224 }
225};
226
228class SlTownAccepted : public VectorSaveLoadHandler<SlTownAccepted, Town, Town::AcceptedCargo> {
229public:
231 inline static const SaveLoad description[] = {
234 };
235
236 inline const static SaveLoadCompatTable compat_description = {};
237
238 std::vector<Town::AcceptedCargo> &GetVector(Town *t) const override { return t->accepted; }
239};
240
241class SlTownReceived : public DefaultSaveLoadHandler<SlTownReceived, Town> {
242public:
243 static inline const SaveLoad description[] = {
248 };
249 static inline const SaveLoadCompatTable compat_description = _town_received_sl_compat;
250
251 void Save(Town *t) const override
252 {
253 SlSetStructListLength(std::size(t->received));
254 for (auto &received : t->received) {
255 SlObject(&received, this->GetDescription());
256 }
257 }
258
259 void Load(Town *t) const override
260 {
262 for (size_t i = 0; i < length; i++) {
263 SlObject(&t->received[static_cast<TownAcceptanceEffect>(i)], this->GetLoadDescription());
264 }
265 }
266};
267
268class SlTownAcceptanceMatrix : public DefaultSaveLoadHandler<SlTownAcceptanceMatrix, Town> {
269private:
272 TileArea area;
273 static const uint GRID = 4;
274 };
275public:
276 static inline const SaveLoad description[] = {
280 };
281 static inline const SaveLoadCompatTable compat_description = _town_acceptance_matrix_sl_compat;
282
283 void Load(Town *) const override
284 {
285 /* Discard now unused acceptance matrix. */
286 AcceptanceMatrix dummy;
287 SlObject(&dummy, this->GetLoadDescription());
288 if (dummy.area.w != 0) {
289 uint arr_len = dummy.area.w / AcceptanceMatrix::GRID * dummy.area.h / AcceptanceMatrix::GRID;
290 SlSkipBytes(4 * arr_len);
291 }
292 }
293};
294
295static std::array<Town::SuppliedHistory, 2> _old_pass_supplied{};
296static std::array<Town::SuppliedHistory, 2> _old_mail_supplied{};
297
298static const SaveLoad _town_desc[] = {
301
303 SLE_VAR(Town, townnametype, VarTypes::U16),
304 SLE_VAR(Town, townnameparts, VarTypes::U32),
306
307 SLE_VAR(Town, flags, VarTypes::U8),
310
317
318 /* Slots 0 and 2 are passengers and mail respectively for old saves. */
319 SLEG_CONDVAR("supplied[CT_PASSENGERS].old_max", _old_pass_supplied[LAST_MONTH].production, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
320 SLEG_CONDVAR("supplied[CT_PASSENGERS].old_max", _old_pass_supplied[LAST_MONTH].production, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
321 SLEG_CONDVAR( "supplied[CT_MAIL].old_max", _old_mail_supplied[LAST_MONTH].production, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
322 SLEG_CONDVAR( "supplied[CT_MAIL].old_max", _old_mail_supplied[LAST_MONTH].production, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
323 SLEG_CONDVAR("supplied[CT_PASSENGERS].new_max", _old_pass_supplied[THIS_MONTH].production, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
324 SLEG_CONDVAR("supplied[CT_PASSENGERS].new_max", _old_pass_supplied[THIS_MONTH].production, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
325 SLEG_CONDVAR( "supplied[CT_MAIL].new_max", _old_mail_supplied[THIS_MONTH].production, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
326 SLEG_CONDVAR( "supplied[CT_MAIL].new_max", _old_mail_supplied[THIS_MONTH].production, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
327 SLEG_CONDVAR("supplied[CT_PASSENGERS].old_act", _old_pass_supplied[LAST_MONTH].transported, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
328 SLEG_CONDVAR("supplied[CT_PASSENGERS].old_act", _old_pass_supplied[LAST_MONTH].transported, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
329 SLEG_CONDVAR( "supplied[CT_MAIL].old_act", _old_mail_supplied[LAST_MONTH].transported, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
330 SLEG_CONDVAR( "supplied[CT_MAIL].old_act", _old_mail_supplied[LAST_MONTH].transported, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
331 SLEG_CONDVAR("supplied[CT_PASSENGERS].new_act", _old_pass_supplied[THIS_MONTH].transported, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
332 SLEG_CONDVAR("supplied[CT_PASSENGERS].new_act", _old_pass_supplied[THIS_MONTH].transported, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
333 SLEG_CONDVAR( "supplied[CT_MAIL].new_act", _old_mail_supplied[THIS_MONTH].transported, VarFileType::U16 | VarMemType::U32, SaveLoadVersion::MinVersion, SaveLoadVersion::LargerTownCargoStatistics),
334 SLEG_CONDVAR( "supplied[CT_MAIL].new_act", _old_mail_supplied[THIS_MONTH].transported, VarTypes::U32, SaveLoadVersion::LargerTownCargoStatistics, SaveLoadVersion::ScriptTownGrowth),
335
340
342
344
352
353 SLE_VAR(Town, fund_buildings_months, VarTypes::U8),
354 SLE_VAR(Town, road_build_months, VarTypes::U8),
355
358
362
364
367 SLEG_STRUCTLIST("accepted", SlTownAccepted),
370};
371
372struct HIDSChunkHandler : NewGRFMappingChunkHandler {
373 HIDSChunkHandler() : NewGRFMappingChunkHandler('HIDS', _house_mngr) {}
374};
375
376struct CITYChunkHandler : ChunkHandler {
377 CITYChunkHandler() : ChunkHandler('CITY', ChunkType::Table) {}
378
379 void Save() const override
380 {
381 SlTableHeader(_town_desc);
382
383 for (Town *t : Town::Iterate()) {
384 SlSetArrayIndex(t->index);
385 SlObject(t, _town_desc);
386 }
387 }
388
389 void Load() const override
390 {
391 const std::vector<SaveLoad> slt = SlCompatTableHeader(_town_desc, _town_sl_compat);
392
393 int index;
394
395 while ((index = SlIterateArray()) != -1) {
396 Town *t = Town::CreateAtIndex(TownID(index));
397 SlObject(t, slt);
398
400 /* Passengers and mail were always treated as slots 0 and 2 in older saves. */
401 auto &pass = t->supplied.emplace_back(CargoType{0});
402 pass.history[LAST_MONTH] = _old_pass_supplied[LAST_MONTH];
403 pass.history[THIS_MONTH] = _old_pass_supplied[THIS_MONTH];
404 auto &mail = t->supplied.emplace_back(CargoType{2});
405 mail.history[LAST_MONTH] = _old_mail_supplied[LAST_MONTH];
406 mail.history[THIS_MONTH] = _old_mail_supplied[THIS_MONTH];
407 }
408
410 t->valid_history = 1U << LAST_MONTH;
411 }
412
413 if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_END) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) {
414 SlErrorCorrupt("Invalid town name generator");
415 }
416 }
417 }
418
419 void FixPointers() const override
420 {
422
423 for (Town *t : Town::Iterate()) {
424 SlObject(t, _town_desc);
425 }
426 }
427};
428
429static const HIDSChunkHandler HIDS;
430static const CITYChunkHandler CITY;
431static const ChunkHandlerRef town_chunk_handlers[] = {
432 HIDS,
433 CITY,
434};
435
436extern const ChunkHandlerTable _town_chunk_handlers(town_chunk_handlers);
static constexpr CargoType NUM_CARGO
Maximum number of cargo types in a game.
Definition cargo_type.h:75
CargoType
Cargo slots to indicate a cargo type within a game.
Definition cargo_type.h:22
TownAcceptanceEffect
Town growth effect when delivering cargo.
Definition cargotype.h:22
@ Food
Cargo behaves food/fizzy-drinks-like.
Definition cargotype.h:29
@ Water
Cargo behaves water-like.
Definition cargotype.h:28
@ End
End of town effects.
Definition cargotype.h:30
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Default handler for saving/loading an object to/from disk.
Definition saveload.h:606
SaveLoadTable GetLoadDescription() const
Get the description for how to load the chunk.
void Load(Town *) const override
Load the object from disk.
Definition town_sl.cpp:283
Saveload handler for town accepted cargo history entries.
Definition town_sl.cpp:198
void Load(Town::AcceptedCargo *p) const override
Load the object from disk.
Definition town_sl.cpp:216
void Save(Town::AcceptedCargo *p) const override
Save the object to disk.
Definition town_sl.cpp:207
static const SaveLoadCompatTable compat_description
Compatibility saveload description for handler.
Definition town_sl.cpp:205
static const SaveLoad description[]
Saveload description for handler.
Definition town_sl.cpp:201
Saveload handler for town accepted cargo history.
Definition town_sl.cpp:228
static const SaveLoadCompatTable compat_description
Compatibility saveload description for handler.
Definition town_sl.cpp:236
static const SaveLoad description[]
Saveload description for handler.
Definition town_sl.cpp:231
std::vector< Town::AcceptedCargo > & GetVector(Town *t) const override
Get instance of vector to load/save.
Definition town_sl.cpp:238
size_t GetNumCargo() const
Get the number of cargoes used by this savegame version.
Definition town_sl.cpp:131
void Load(Town *t) const override
Load the object from disk.
Definition town_sl.cpp:139
void Save(Town *t) const override
Save the object to disk.
Definition town_sl.cpp:251
void Load(Town *t) const override
Load the object from disk.
Definition town_sl.cpp:259
void Load(Town::SuppliedCargo *p) const override
Load the object from disk.
Definition town_sl.cpp:175
void Save(Town::SuppliedCargo *p) const override
Save the object to disk.
Definition town_sl.cpp:166
std::vector< Town::SuppliedCargo > & GetVector(Town *t) const override
Get instance of vector to load/save.
Definition town_sl.cpp:194
Default handler for saving/loading a vector to/from disk.
Definition saveload.h:1385
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23).
Definition enum_type.hpp:21
Functions for storing historical data.
@ Size2x2
The building is 2x2 tiles.
Definition house.h:43
@ Size2x1
The building is 2x1 tiles, i.e. wider on the X-axis.
Definition house.h:41
@ Size1x2
The building is 1x2 tiles, i.e. wider on the Y-axis.
Definition house.h:42
static const HouseID NEW_HOUSE_OFFSET
Offset for new houses.
Definition house.h:28
uint16_t HouseID
OpenTTD ID of house types.
Definition house_type.h:15
Functions related to OTTD's landscape.
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition map_func.h:392
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
void IncreaseBuildingCount(Town *t, HouseID house_id)
IncreaseBuildingCount() Increase the count of a building when it has been added by a town.
void InitializeBuildingCounts()
Initialise global building counts and all town building counts.
Functions related to NewGRF houses.
Code handling saving and loading of NewGRF mappings.
A number of safeguards to prevent using unsafe methods.
std::vector< SaveLoad > SlCompatTableHeader(const SaveLoadTable &slt, const SaveLoadCompatTable &slct)
Load a table header in a savegame compatible way.
size_t SlGetStructListLength(size_t limit)
Get the length of this list; if it exceeds the limit, error out.
int SlIterateArray()
Iterate through the elements of an array and read the whole thing.
Definition saveload.cpp:734
void SlErrorCorrupt(const std::string &msg)
Error handler for corrupt savegames.
Definition saveload.cpp:369
void SlObject(void *object, const SaveLoadTable &slt)
Main SaveLoad function.
std::vector< SaveLoad > SlTableHeader(const SaveLoadTable &slt)
Save or Load a table header.
void SlSetStructListLength(size_t length)
Set the length of this list.
Functions/types related to saving and loading games.
@ I16
A 16 bit signed int.
Definition saveload.h:681
@ U32
A 32 bit unsigned int.
Definition saveload.h:684
@ U16
A 16 bit unsigned int.
Definition saveload.h:682
@ U8
A 8 bit unsigned int.
Definition saveload.h:662
@ I16
A 16 bit signed int.
Definition saveload.h:663
@ U16
A 16 bit unsigned int.
Definition saveload.h:664
#define SLEG_STRUCTLIST(name, handler)
Storage of a list of structs in every savegame version.
Definition saveload.h:1256
#define SLE_CONDREFVECTOR(base, variable, type, from, to)
Storage of a vector of SaveLoadType::Reference elements in some savegame versions.
Definition saveload.h:989
#define SLEG_CONDVAR(name, variable, type, from, to)
Storage of a global variable in some savegame versions.
Definition saveload.h:1124
void SlSkipBytes(size_t length)
Read in bytes from the file/data structure but don't do anything with them, discarding them in effect...
Definition saveload.h:1365
std::reference_wrapper< const ChunkHandler > ChunkHandlerRef
A reference to ChunkHandler.
Definition saveload.h:530
@ Storage
Load/save a reference to a persistent storage.
Definition saveload.h:651
std::span< const ChunkHandlerRef > ChunkHandlerTable
A table of ChunkHandler entries.
Definition saveload.h:533
#define SLE_CONDARR(base, variable, type, length, from, to)
Storage of a fixed-size array of SaveLoadType::Variable elements in some savegame versions.
Definition saveload.h:936
std::span< const struct SaveLoadCompat > SaveLoadCompatTable
A table of SaveLoadCompat entries.
Definition saveload.h:539
#define SLE_CONDSSTR(base, variable, type, from, to)
Storage of a std::string in some savegame versions.
Definition saveload.h:958
#define SLE_CONDVAR(base, variable, type, from, to)
Storage of a variable in some savegame versions.
Definition saveload.h:904
bool IsSavegameVersionBefore(SaveLoadVersion major, uint8_t minor=0)
Checks whether the savegame is below major.
Definition saveload.h:1278
@ LargerTownCargoStatistics
Saveload version: 9.0, SVN revision: 1909 Increase size of passenger/mail production of this and pre...
Definition saveload.h:51
@ ExtendCargotypes
Saveload version: 199, GitHub pull request: 6802 Extend cargotypes to 64.
Definition saveload.h:282
@ InfrastructureMaintenanceCosts
Saveload version: 166, SVN revision: 23415 Infrastructure can now cost some periodic fee.
Definition saveload.h:243
@ ReplaceCustomNameArray
Saveload version: 84, SVN revision: 11822 Replace single fixed size array of custom names,...
Definition saveload.h:144
@ RoadLayoutPerTown
Saveload version: 113, SVN revision: 15340 Allow for different road layouts for each of the towns.
Definition saveload.h:179
@ VehicleCurrencyStationChanges
Saveload version: 2.0, release: 0.3.0 Adding vehicle state, larger currency size for statistics,...
Definition saveload.h:34
@ TownTolerancePauseMode
Saveload version: 4.0, SVN revision: 1 Town council tolerance and pause mode.
Definition saveload.h:38
@ RemoveTownCargoCache
Saveload version: 219, GitHub pull request: 8258 Remove town cargo acceptance and production caches.
Definition saveload.h:306
@ NewGRFTownNames
Saveload version: 66, SVN revision: 10211 NewGRF provided town names.
Definition saveload.h:123
@ TownGrowthControl
Saveload version: 54, SVN revision: 9613 Give the player control over the town growth.
Definition saveload.h:108
@ MoreCompanies
Saveload version: 104, SVN revision: 14735 Increase maximum number of companies to 15.
Definition saveload.h:168
@ MultipleRoadStops
Saveload version: 6.0, SVN revision: 1721 Multi tile road stops, and some map size related fixes.
Definition saveload.h:47
@ TownSupplyHistory
Saveload version: 358, GitHub pull request: 14461 Town supply history.
Definition saveload.h:409
@ MinVersion
First savegame version.
Definition saveload.h:31
@ SaveloadListLength
Saveload version: 293, GitHub pull request: 9374 Consistency in list length with SaveLoadType::Struc...
Definition saveload.h:331
@ MaxVersion
Highest possible saveload version.
Definition saveload.h:421
@ ScriptTownGrowth
Saveload version: 165, SVN revision: 23304 Storage of cargo statistics for use by game scripts.
Definition saveload.h:242
@ PersistentStoragePool
Saveload version: 161, SVN revision: 22567 Store persistent storage in a pool.
Definition saveload.h:237
@ ScriptTownText
Saveload version: 168, SVN revision: 23637 Game scripts can put a text in the town window.
Definition saveload.h:245
@ Cities
Saveload version: 56, SVN revision: 9667 Cities that start bigger and grow faster.
Definition saveload.h:111
#define SLEG_CONDSTRUCTLIST(name, handler, from, to)
Storage of a list of structs in some savegame versions.
Definition saveload.h:1193
@ Table
An Array with a header describing the elements.
Definition saveload.h:475
#define SLE_VAR(base, variable, type)
Storage of a variable in every version of a savegame.
Definition saveload.h:1017
#define SLE_CONDVARNAME(base, variable, name, type, from, to)
Storage of a variable in some savegame versions.
Definition saveload.h:915
Definition of base types and functions in a cross-platform compatible way.
@ AllowControlCode
Allow the special control codes.
Definition string_type.h:47
Functions related to OTTD's strings.
StringTab GetStringTab(StringID str)
Extract the StringTab from a StringID.
static constexpr StringID SPECSTR_TOWNNAME_START
Special strings for town names.
void FixPointers() const override
Fix the pointers.
Definition town_sl.cpp:419
void Load() const override
Load the chunk.
Definition town_sl.cpp:389
void Save() const override
Save the chunk.
Definition town_sl.cpp:379
static HouseSpec * Get(size_t house_id)
Get the spec for a house ID.
BuildingFlags building_flags
some flags that describe the house (size, stadium etc...)
Definition house.h:117
uint8_t population
population (Zero on other tiles in multi tile house.)
Definition house.h:110
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition map_func.h:366
uint16_t w
The width of the area.
uint16_t h
The height of the area.
static Pool::IterateWrapper< Town > Iterate(size_t from=0)
static T * CreateAtIndex(TownID index, Targs &&... args)
SaveLoad type struct.
Definition saveload.h:787
Compatibility struct with just enough of TileMatrix to facilitate loading.
Definition town_sl.cpp:271
uint32_t population
Current population of people.
Definition town.h:54
uint32_t num_houses
Amount of houses.
Definition town.h:53
Storage for accepted cargo history.
Definition town.h:116
HistoryData< AcceptedHistory > history
Histor data of accepted cargo.
Definition town.h:118
Individual data point for accepted cargo history.
Definition town.h:111
Town data structure.
Definition town.h:64
SuppliedCargoes supplied
Cargo statistics about supplied cargo.
Definition town.h:131
GrfID townnamegrfid
NewGRF id that contains the name. O is not used.
Definition town.h:71
TownCache cache
Container for all cacheable data.
Definition town.h:67
ValidHistoryMask valid_history
Mask of valid history records.
Definition town.h:135
EnumIndexArray< TransportedCargoStat< uint16_t >, TownAcceptanceEffect, TownAcceptanceEffect::End > received
Cargo statistics about received cargotypes.
Definition town.h:133
AcceptedCargoes accepted
Cargo statistics about accepted cargo.
Definition town.h:132
uint16_t townnametype
The style of the name.
Definition town.h:72
Store the maximum and actually transported cargo amount for the current and the last month.
Definition town_type.h:120
Tstorage new_max
Maximum amount this month.
Definition town_type.h:122
Tstorage old_max
Maximum amount last month.
Definition town_type.h:121
Tstorage old_act
Actually transported last month.
Definition town_type.h:123
Tstorage new_act
Actually transported this month.
Definition town_type.h:124
static constexpr VarType U16
Store a 16 bits unsigned int.
Definition saveload.h:754
static constexpr VarType U8
Store a 8 bits unsigned int.
Definition saveload.h:752
static constexpr VarType STR
Store string.
Definition saveload.h:760
static constexpr VarType I16
Store a 16 bits signed int.
Definition saveload.h:753
static constexpr VarType U64
Store a 64 bits unsigned int.
Definition saveload.h:758
static constexpr VarType I8
Store a 8 bits signed int.
Definition saveload.h:751
static constexpr VarType U32
Store a 32 bits unsigned int.
Definition saveload.h:756
static constexpr VarType BOOL
Store a boolean (as int8).
Definition saveload.h:750
Functions related to subsidies.
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
@ House
A house by a town.
Definition tile_type.h:52
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Base of the town class.
TileIndexDiff GetHouseNorthPart(HouseID &house)
Determines if a given HouseID is part of a multitile house.
void UpdateTownRadius(Town *t)
Update the cached town zone radii of a town, based on the number of houses.
HouseID GetHouseType(Tile t)
Get the type of this house, which is an index into the house spec array.
Definition town_map.h:60
HouseID GetCleanHouseType(Tile t)
Get the type of this house, which is an index into the house spec array without doing any NewGRF rela...
Definition town_map.h:48
void SetHouseType(Tile t, HouseID house_id)
Set the house type.
Definition town_map.h:71
bool IsHouseCompleted(Tile t)
Get the completion of this house.
Definition town_map.h:167
void RebuildTownCaches()
Rebuild all the cached variables of towns.
Definition town_sl.cpp:28
void UpdateHousesAndTowns()
Check and update town and house values.
Definition town_sl.cpp:65
Loading of town chunks before table headers were added.
const SaveLoadCompat _town_supplied_sl_compat[]
Original field order for SlTownSupplied.
const SaveLoadCompat _town_received_sl_compat[]
Original field order for SlTownReceived.
const SaveLoadCompat _town_sl_compat[]
Original field order for town_desc.
const SaveLoadCompat _town_acceptance_matrix_sl_compat[]
Original field order for SlTownAcceptanceMatrix.