OpenTTD Source  20241108-master-g80f628063a
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 <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "../stdafx.h"
11 
12 #include "saveload.h"
13 #include "compat/town_sl_compat.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"
21 
22 #include "../safeguards.h"
23 
28 {
30  RebuildTownKdtree();
31 
32  /* Reset town population and num_houses */
33  for (Town *town : Town::Iterate()) {
34  town->cache.population = 0;
35  town->cache.num_houses = 0;
36  }
37 
38  for (TileIndex t = 0; t < Map::Size(); t++) {
39  if (!IsTileType(t, MP_HOUSE)) continue;
40 
41  HouseID house_id = GetHouseType(t);
42  Town *town = Town::GetByTile(t);
43  IncreaseBuildingCount(town, house_id);
44  if (IsHouseCompleted(t)) town->cache.population += HouseSpec::Get(house_id)->population;
45 
46  /* Increase the number of houses for every house, but only once. */
47  if (GetHouseNorthPart(house_id) == TileDiffXY(0, 0)) town->cache.num_houses++;
48  }
49 
50  /* Update the population and num_house dependent values */
51  for (Town *town : Town::Iterate()) {
52  UpdateTownRadius(town);
53  }
54 }
55 
65 {
66  for (TileIndex t = 0; t < Map::Size(); t++) {
67  if (!IsTileType(t, MP_HOUSE)) continue;
68 
69  HouseID house_id = GetCleanHouseType(t);
70  if (!HouseSpec::Get(house_id)->enabled && house_id >= NEW_HOUSE_OFFSET) {
71  /* The specs for this type of house are not available any more, so
72  * replace it with the substitute original house type. */
73  house_id = _house_mngr.GetSubstituteID(house_id);
74  SetHouseType(t, house_id);
75  }
76  }
77 
78  /* Check for cases when a NewGRF has set a wrong house substitute type. */
79  for (TileIndex t = 0; t < Map::Size(); t++) {
80  if (!IsTileType(t, MP_HOUSE)) continue;
81 
82  HouseID house_type = GetCleanHouseType(t);
83  TileIndex north_tile = t + GetHouseNorthPart(house_type); // modifies 'house_type'!
84  if (t == north_tile) {
85  const HouseSpec *hs = HouseSpec::Get(house_type);
86  bool valid_house = true;
87  if (hs->building_flags & TILE_SIZE_2x1) {
88  TileIndex tile = t + TileDiffXY(1, 0);
89  if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
90  } else if (hs->building_flags & TILE_SIZE_1x2) {
91  TileIndex tile = t + TileDiffXY(0, 1);
92  if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
93  } else if (hs->building_flags & TILE_SIZE_2x2) {
94  TileIndex tile = t + TileDiffXY(0, 1);
95  if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
96  tile = t + TileDiffXY(1, 0);
97  if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 2) valid_house = false;
98  tile = t + TileDiffXY(1, 1);
99  if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 3) valid_house = false;
100  }
101  /* If not all tiles of this house are present remove the house.
102  * The other tiles will get removed later in this loop because
103  * their north tile is not the correct type anymore. */
104  if (!valid_house) DoClearSquare(t);
105  } else if (!IsTileType(north_tile, MP_HOUSE) || GetCleanHouseType(north_tile) != house_type) {
106  /* This tile should be part of a multi-tile building but the
107  * north tile of this house isn't on the map. */
108  DoClearSquare(t);
109  }
110  }
111 
113 }
114 
115 class SlTownSupplied : public DefaultSaveLoadHandler<SlTownSupplied, Town> {
116 public:
117  inline static const SaveLoad description[] = {
122  };
123  inline const static SaveLoadCompatTable compat_description = _town_supplied_sl_compat;
124 
129  size_t GetNumCargo() const
130  {
133  /* Read from the savegame how long the list is. */
135  }
136 
137  void Save(Town *t) const override
138  {
139  SlSetStructListLength(std::size(t->supplied));
140  for (auto &supplied : t->supplied) {
141  SlObject(&supplied, this->GetDescription());
142  }
143  }
144 
145  void Load(Town *t) const override
146  {
147  size_t num_cargo = this->GetNumCargo();
148  for (size_t i = 0; i < num_cargo; i++) {
149  SlObject(&t->supplied[i], this->GetLoadDescription());
150  }
151  }
152 };
153 
154 class SlTownReceived : public DefaultSaveLoadHandler<SlTownReceived, Town> {
155 public:
156  inline static const SaveLoad description[] = {
161  };
162  inline const static SaveLoadCompatTable compat_description = _town_received_sl_compat;
163 
164  void Save(Town *t) const override
165  {
166  SlSetStructListLength(std::size(t->received));
167  for (auto &received : t->received) {
168  SlObject(&received, this->GetDescription());
169  }
170  }
171 
172  void Load(Town *t) const override
173  {
174  size_t length = IsSavegameVersionBefore(SLV_SAVELOAD_LIST_LENGTH) ? static_cast<size_t>(TAE_END) : SlGetStructListLength(TAE_END);
175  for (size_t i = 0; i < length; i++) {
176  SlObject(&t->received[i], this->GetLoadDescription());
177  }
178  }
179 };
180 
181 class SlTownAcceptanceMatrix : public DefaultSaveLoadHandler<SlTownAcceptanceMatrix, Town> {
182 private:
185  TileArea area;
186  static const uint GRID = 4;
187  };
188 public:
189  inline static const SaveLoad description[] = {
190  SLE_VAR(AcceptanceMatrix, area.tile, SLE_UINT32),
191  SLE_VAR(AcceptanceMatrix, area.w, SLE_UINT16),
192  SLE_VAR(AcceptanceMatrix, area.h, SLE_UINT16),
193  };
194  inline const static SaveLoadCompatTable compat_description = _town_acceptance_matrix_sl_compat;
195 
196  void Load(Town *) const override
197  {
198  /* Discard now unused acceptance matrix. */
199  AcceptanceMatrix dummy;
200  SlObject(&dummy, this->GetLoadDescription());
201  if (dummy.area.w != 0) {
202  uint arr_len = dummy.area.w / AcceptanceMatrix::GRID * dummy.area.h / AcceptanceMatrix::GRID;
203  SlSkipBytes(4 * arr_len);
204  }
205  }
206 };
207 
208 static const SaveLoad _town_desc[] = {
209  SLE_CONDVAR(Town, xy, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_6),
210  SLE_CONDVAR(Town, xy, SLE_UINT32, SLV_6, SL_MAX_VERSION),
211 
212  SLE_CONDVAR(Town, townnamegrfid, SLE_UINT32, SLV_66, SL_MAX_VERSION),
213  SLE_VAR(Town, townnametype, SLE_UINT16),
214  SLE_VAR(Town, townnameparts, SLE_UINT32),
216 
217  SLE_VAR(Town, flags, SLE_UINT8),
218  SLE_CONDVAR(Town, statues, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_104),
219  SLE_CONDVAR(Town, statues, SLE_UINT16, SLV_104, SL_MAX_VERSION),
220 
221  SLE_CONDVAR(Town, have_ratings, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_104),
222  SLE_CONDVAR(Town, have_ratings, SLE_UINT16, SLV_104, SL_MAX_VERSION),
223  SLE_CONDARR(Town, ratings, SLE_INT16, 8, SL_MIN_VERSION, SLV_104),
224  SLE_CONDARR(Town, ratings, SLE_INT16, MAX_COMPANIES, SLV_104, SL_MAX_VERSION),
225  SLE_CONDARR(Town, unwanted, SLE_INT8, 8, SLV_4, SLV_104),
226  SLE_CONDARR(Town, unwanted, SLE_INT8, MAX_COMPANIES, SLV_104, SL_MAX_VERSION),
227 
228  /* Slots 0 and 2 are passengers and mail respectively for old saves. */
229  SLE_CONDVARNAME(Town, supplied[0].old_max, "supplied[CT_PASSENGERS].old_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
230  SLE_CONDVARNAME(Town, supplied[0].old_max, "supplied[CT_PASSENGERS].old_max", SLE_UINT32, SLV_9, SLV_165),
231  SLE_CONDVARNAME(Town, supplied[2].old_max, "supplied[CT_MAIL].old_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
232  SLE_CONDVARNAME(Town, supplied[2].old_max, "supplied[CT_MAIL].old_max", SLE_UINT32, SLV_9, SLV_165),
233  SLE_CONDVARNAME(Town, supplied[0].new_max, "supplied[CT_PASSENGERS].new_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
234  SLE_CONDVARNAME(Town, supplied[0].new_max, "supplied[CT_PASSENGERS].new_max", SLE_UINT32, SLV_9, SLV_165),
235  SLE_CONDVARNAME(Town, supplied[2].new_max, "supplied[CT_MAIL].new_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
236  SLE_CONDVARNAME(Town, supplied[2].new_max, "supplied[CT_MAIL].new_max", SLE_UINT32, SLV_9, SLV_165),
237  SLE_CONDVARNAME(Town, supplied[0].old_act, "supplied[CT_PASSENGERS].old_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
238  SLE_CONDVARNAME(Town, supplied[0].old_act, "supplied[CT_PASSENGERS].old_act", SLE_UINT32, SLV_9, SLV_165),
239  SLE_CONDVARNAME(Town, supplied[2].old_act, "supplied[CT_MAIL].old_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
240  SLE_CONDVARNAME(Town, supplied[2].old_act, "supplied[CT_MAIL].old_act", SLE_UINT32, SLV_9, SLV_165),
241  SLE_CONDVARNAME(Town, supplied[0].new_act, "supplied[CT_PASSENGERS].new_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
242  SLE_CONDVARNAME(Town, supplied[0].new_act, "supplied[CT_PASSENGERS].new_act", SLE_UINT32, SLV_9, SLV_165),
243  SLE_CONDVARNAME(Town, supplied[2].new_act, "supplied[CT_MAIL].new_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9),
244  SLE_CONDVARNAME(Town, supplied[2].new_act, "supplied[CT_MAIL].new_act", SLE_UINT32, SLV_9, SLV_165),
245 
246  SLE_CONDVARNAME(Town, received[TAE_FOOD].old_act, "received[TE_FOOD].old_act", SLE_UINT16, SL_MIN_VERSION, SLV_165),
247  SLE_CONDVARNAME(Town, received[TAE_WATER].old_act, "received[TE_WATER].old_act", SLE_UINT16, SL_MIN_VERSION, SLV_165),
248  SLE_CONDVARNAME(Town, received[TAE_FOOD].new_act, "received[TE_FOOD].new_act", SLE_UINT16, SL_MIN_VERSION, SLV_165),
249  SLE_CONDVARNAME(Town, received[TAE_WATER].new_act, "received[TE_WATER].new_act", SLE_UINT16, SL_MIN_VERSION, SLV_165),
250 
251  SLE_CONDARR(Town, goal, SLE_UINT32, NUM_TAE, SLV_165, SL_MAX_VERSION),
252 
254 
255  SLE_CONDVAR(Town, time_until_rebuild, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_54),
256  SLE_CONDVAR(Town, time_until_rebuild, SLE_UINT16, SLV_54, SL_MAX_VERSION),
257  SLE_CONDVAR(Town, grow_counter, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_54),
258  SLE_CONDVAR(Town, grow_counter, SLE_UINT16, SLV_54, SL_MAX_VERSION),
259  SLE_CONDVAR(Town, growth_rate, SLE_FILE_U8 | SLE_VAR_I16, SL_MIN_VERSION, SLV_54),
260  SLE_CONDVAR(Town, growth_rate, SLE_FILE_I16 | SLE_VAR_U16, SLV_54, SLV_165),
261  SLE_CONDVAR(Town, growth_rate, SLE_UINT16, SLV_165, SL_MAX_VERSION),
262 
263  SLE_VAR(Town, fund_buildings_months, SLE_UINT8),
264  SLE_VAR(Town, road_build_months, SLE_UINT8),
265 
266  SLE_CONDVAR(Town, exclusivity, SLE_UINT8, SLV_2, SL_MAX_VERSION),
267  SLE_CONDVAR(Town, exclusive_counter, SLE_UINT8, SLV_2, SL_MAX_VERSION),
268 
269  SLE_CONDVAR(Town, larger_town, SLE_BOOL, SLV_56, SL_MAX_VERSION),
270  SLE_CONDVAR(Town, layout, SLE_UINT8, SLV_113, SL_MAX_VERSION),
271 
273 
277 };
278 
280  HIDSChunkHandler() : NewGRFMappingChunkHandler('HIDS', _house_mngr) {}
281 };
282 
284  CITYChunkHandler() : ChunkHandler('CITY', CH_TABLE) {}
285 
286  void Save() const override
287  {
288  SlTableHeader(_town_desc);
289 
290  for (Town *t : Town::Iterate()) {
291  SlSetArrayIndex(t->index);
292  SlObject(t, _town_desc);
293  }
294  }
295 
296  void Load() const override
297  {
298  const std::vector<SaveLoad> slt = SlCompatTableHeader(_town_desc, _town_sl_compat);
299 
300  int index;
301 
302  while ((index = SlIterateArray()) != -1) {
303  Town *t = new (index) Town();
304  SlObject(t, slt);
305 
306  if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) {
307  SlErrorCorrupt("Invalid town name generator");
308  }
309  }
310  }
311 
312  void FixPointers() const override
313  {
314  if (IsSavegameVersionBefore(SLV_161)) return;
315 
316  for (Town *t : Town::Iterate()) {
317  SlObject(t, _town_desc);
318  }
319  }
320 };
321 
322 static const HIDSChunkHandler HIDS;
323 static const CITYChunkHandler CITY;
324 static const ChunkHandlerRef town_chunk_handlers[] = {
325  HIDS,
326  CITY,
327 };
328 
329 extern const ChunkHandlerTable _town_chunk_handlers(town_chunk_handlers);
static const CargoID NUM_CARGO
Maximum number of cargo types in a game.
Definition: cargo_type.h:74
@ Town
Source/destination is a town.
@ NUM_TAE
Amount of town effects.
Definition: cargotype.h:30
@ TAE_END
End of town effects.
Definition: cargotype.h:29
@ TAE_FOOD
Cargo behaves food/fizzy-drinks-like.
Definition: cargotype.h:28
@ TAE_WATER
Cargo behaves water-like.
Definition: cargotype.h:27
Default handler for saving/loading an object to/from disk.
Definition: saveload.h:577
SaveLoadTable GetDescription() const override
Definition: saveload.h:579
uint16_t GetSubstituteID(uint16_t entity_id) const
Gives the substitute of the entity, as specified by the grf file.
SaveLoadTable GetLoadDescription() const
Get the description for how to load the chunk.
Definition: saveload.cpp:3288
size_t GetNumCargo() const
Get the number of cargoes used by this savegame version.
Definition: town_sl.cpp:129
@ MAX_COMPANIES
Maximum number of companies.
Definition: company_type.h:23
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:13
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition: map_func.h:389
constexpr bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
Definition: math_func.hpp:268
void IncreaseBuildingCount(Town *t, HouseID house_id)
IncreaseBuildingCount() Increase the count of a building when it has been added by a town.
void InitializeBuildingCounts(Town *t)
Initialise building counts for a town.
Code handling saving and loading of NewGRF mappings.
size_t SlGetStructListLength(size_t limit)
Get the length of this list; if it exceeds the limit, error out.
Definition: saveload.cpp:1684
int SlIterateArray()
Iterate through the elements of an array and read the whole thing.
Definition: saveload.cpp:658
void SlErrorCorrupt(const std::string &msg)
Error handler for corrupt savegames.
Definition: saveload.cpp:351
std::vector< SaveLoad > SlCompatTableHeader(const SaveLoadTable &slt, const SaveLoadCompatTable &slct)
Load a table header in a savegame compatible way.
Definition: saveload.cpp:1888
std::vector< SaveLoad > SlTableHeader(const SaveLoadTable &slt)
Save or Load a table header.
Definition: saveload.cpp:1750
void SlObject(void *object, const SaveLoadTable &slt)
Main SaveLoad function.
Definition: saveload.cpp:1697
void SlSetStructListLength(size_t length)
Set the length of this list.
Definition: saveload.cpp:1668
Functions/types related to saving and loading games.
@ SLF_ALLOW_CONTROL
Allow control codes in the strings.
Definition: saveload.h:684
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:1309
std::reference_wrapper< const ChunkHandler > ChunkHandlerRef
A reference to ChunkHandler.
Definition: saveload.h:505
std::span< const ChunkHandlerRef > ChunkHandlerTable
A table of ChunkHandler entries.
Definition: saveload.h:508
#define SLE_CONDREFLIST(base, variable, type, from, to)
Storage of a list of SL_REF elements in some savegame versions.
Definition: saveload.h:947
#define SLE_CONDARR(base, variable, type, length, from, to)
Storage of a fixed-size array of SL_VAR elements in some savegame versions.
Definition: saveload.h:893
std::span< const struct SaveLoadCompat > SaveLoadCompatTable
A table of SaveLoadCompat entries.
Definition: saveload.h:514
#define SLE_CONDSSTR(base, variable, type, from, to)
Storage of a std::string in some savegame versions.
Definition: saveload.h:926
#define SLE_CONDVAR(base, variable, type, from, to)
Storage of a variable in some savegame versions.
Definition: saveload.h:861
bool IsSavegameVersionBefore(SaveLoadVersion major, uint8_t minor=0)
Checks whether the savegame is below major.
Definition: saveload.h:1227
@ SLV_66
66 10211
Definition: saveload.h:122
@ SLV_84
84 11822
Definition: saveload.h:143
@ SLV_168
168 23637
Definition: saveload.h:244
@ SLV_4
4.0 1 4.1 122 0.3.3, 0.3.4 4.2 1222 0.3.5 4.3 1417 4.4 1426
Definition: saveload.h:37
@ SLV_6
6.0 1721 6.1 1768
Definition: saveload.h:46
@ SLV_EXTEND_CARGOTYPES
199 PR#6802 Extend cargotypes to 64
Definition: saveload.h:282
@ SLV_SAVELOAD_LIST_LENGTH
293 PR#9374 Consistency in list length with SL_STRUCT / SL_STRUCTLIST / SL_DEQUE / SL_REFLIST.
Definition: saveload.h:331
@ SLV_166
166 23415
Definition: saveload.h:242
@ SL_MAX_VERSION
Highest possible saveload version.
Definition: saveload.h:395
@ SL_MIN_VERSION
First savegame version.
Definition: saveload.h:31
@ SLV_104
104 14735
Definition: saveload.h:167
@ SLV_165
165 23304
Definition: saveload.h:241
@ SLV_2
2.0 0.3.0 2.1 0.3.1, 0.3.2
Definition: saveload.h:34
@ SLV_113
113 15340
Definition: saveload.h:178
@ SLV_161
161 22567
Definition: saveload.h:236
@ SLV_54
54 9613
Definition: saveload.h:107
@ SLV_56
56 9667
Definition: saveload.h:110
@ SLV_REMOVE_TOWN_CARGO_CACHE
219 PR#8258 Remove town cargo acceptance and production caches.
Definition: saveload.h:306
@ SLV_9
9.0 1909
Definition: saveload.h:50
@ REF_STORAGE
Load/save a reference to a persistent storage.
Definition: saveload.h:606
#define SLEG_CONDSTRUCTLIST(name, handler, from, to)
Storage of a list of structs in some savegame versions.
Definition: saveload.h:1143
#define SLE_VAR(base, variable, type)
Storage of a variable in every version of a savegame.
Definition: saveload.h:975
#define SLE_CONDVARNAME(base, variable, name, type, from, to)
Storage of a variable in some savegame versions.
Definition: saveload.h:872
StringTab GetStringTab(StringID str)
Extract the StringTab from a StringID.
Definition: strings_func.h:25
void FixPointers() const override
Fix the pointers.
Definition: town_sl.cpp:312
void Load() const override
Load the chunk.
Definition: town_sl.cpp:296
void Save() const override
Save the chunk.
Definition: town_sl.cpp:286
Handlers and description of chunk.
Definition: saveload.h:459
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:105
uint8_t population
population (Zero on other tiles in multi tile house.)
Definition: house.h:97
static debug_inline uint Size()
Get the size of the map.
Definition: map_func.h:288
Represents the covered area of e.g.
Definition: tilearea_type.h:18
Tindex index
Index of this pool item.
Definition: pool_type.hpp:238
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:388
SaveLoad type struct.
Definition: saveload.h:711
Compatibility struct with just enough of TileMatrix to facilitate loading.
Definition: town_sl.cpp:184
uint32_t population
Current population of people.
Definition: town.h:44
uint32_t num_houses
Amount of houses.
Definition: town.h:43
Town data structure.
Definition: town.h:54
TransportedCargoStat< uint32_t > supplied[NUM_CARGO]
Cargo statistics about supplied cargo.
Definition: town.h:79
TransportedCargoStat< uint16_t > received[NUM_TAE]
Cargo statistics about received cargotypes.
Definition: town.h:80
TownCache cache
Container for all cacheable data.
Definition: town.h:57
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition: tile_map.h:150
@ MP_HOUSE
A house by a town.
Definition: tile_type.h:51
TileIndexDiff GetHouseNorthPart(HouseID &house)
Determines if a given HouseID is part of a multitile house.
Definition: town_cmd.cpp:2924
void UpdateTownRadius(Town *t)
Update the cached town zone radii of a town, based on the number of houses.
Definition: town_cmd.cpp:1919
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:146
void RebuildTownCaches()
Rebuild all the cached variables of towns.
Definition: town_sl.cpp:27
void UpdateHousesAndTowns()
Check and update town and house values.
Definition: town_sl.cpp:64
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.