OpenTTD Source 20250717-master-g55605ae8f2
afterload.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#include "../void_map.h"
12#include "../signs_base.h"
13#include "../depot_base.h"
14#include "../fios.h"
15#include "../gamelog_internal.h"
16#include "../network/network.h"
17#include "../network/network_func.h"
18#include "../gfxinit.h"
19#include "../viewport_func.h"
20#include "../viewport_kdtree.h"
21#include "../industry.h"
22#include "../clear_map.h"
23#include "../vehicle_func.h"
24#include "../string_func.h"
25#include "../strings_func.h"
26#include "../window_func.h"
27#include "../roadveh.h"
28#include "../roadveh_cmd.h"
29#include "../train.h"
30#include "../station_base.h"
31#include "../waypoint_base.h"
32#include "../roadstop_base.h"
33#include "../tunnelbridge_map.h"
34#include "../pathfinder/yapf/yapf_cache.h"
35#include "../elrail_func.h"
36#include "../signs_func.h"
37#include "../aircraft.h"
38#include "../object_map.h"
39#include "../object_base.h"
40#include "../tree_map.h"
41#include "../company_func.h"
42#include "../road_cmd.h"
43#include "../ai/ai.hpp"
44#include "../script/script_gui.h"
45#include "../game/game.hpp"
46#include "../town.h"
47#include "../economy_base.h"
48#include "../animated_tile_map.h"
49#include "../animated_tile_func.h"
50#include "../subsidy_base.h"
51#include "../subsidy_func.h"
52#include "../newgrf.h"
53#include "../newgrf_station.h"
54#include "../engine_func.h"
55#include "../rail_gui.h"
56#include "../core/backup_type.hpp"
57#include "../smallmap_gui.h"
58#include "../news_func.h"
59#include "../order_backup.h"
60#include "../error.h"
61#include "../disaster_vehicle.h"
62#include "../ship.h"
63#include "../water.h"
64#include "../timer/timer.h"
65#include "../timer/timer_game_calendar.h"
66#include "../timer/timer_game_economy.h"
67#include "../timer/timer_game_tick.h"
68#include "../picker_func.h"
69
70#include "saveload_internal.h"
71
72#include <signal.h>
73
74#include "table/strings.h"
75
76#include "../safeguards.h"
77
78extern Company *DoStartupNewCompany(bool is_ai, CompanyID company = CompanyID::Invalid());
79extern void ClearOldOrders();
80
91void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_class)
92{
93 /* If the slope is not flat, we always assume 'land' (if allowed). Also for one-corner-raised-shores.
94 * Note: Wrt. autosloping under industry tiles this is the most fool-proof behaviour. */
95 if (!IsTileFlat(t)) {
96 if (include_invalid_water_class) {
98 return;
99 } else {
100 SlErrorCorrupt("Invalid water class for dry tile");
101 }
102 }
103
104 /* Mark tile dirty in all cases */
106
107 if (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1) {
108 /* tiles at map borders are always WATER_CLASS_SEA */
110 return;
111 }
112
113 bool has_water = false;
114 bool has_canal = false;
115 bool has_river = false;
116
117 for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
118 Tile neighbour = TileAddByDiagDir(t, dir);
119 switch (GetTileType(neighbour)) {
120 case MP_WATER:
121 /* clear water and shipdepots have already a WaterClass associated */
122 if (IsCoast(neighbour)) {
123 has_water = true;
124 } else if (!IsLock(neighbour)) {
125 switch (GetWaterClass(neighbour)) {
126 case WATER_CLASS_SEA: has_water = true; break;
127 case WATER_CLASS_CANAL: has_canal = true; break;
128 case WATER_CLASS_RIVER: has_river = true; break;
129 default: SlErrorCorrupt("Invalid water class for tile");
130 }
131 }
132 break;
133
134 case MP_RAILWAY:
135 /* Shore or flooded halftile */
136 has_water |= (GetRailGroundType(neighbour) == RAIL_GROUND_WATER);
137 break;
138
139 case MP_TREES:
140 /* trees on shore */
141 has_water |= (GB(neighbour.m2(), 4, 2) == TREE_GROUND_SHORE);
142 break;
143
144 default: break;
145 }
146 }
147
148 if (!has_water && !has_canal && !has_river && include_invalid_water_class) {
150 return;
151 }
152
153 if (has_river && !has_canal) {
155 } else if (has_canal || !has_water) {
157 } else {
159 }
160}
161
162static void ConvertTownOwner()
163{
164 for (auto tile : Map::Iterate()) {
165 switch (GetTileType(tile)) {
166 case MP_ROAD:
167 if (GB(tile.m5(), 4, 2) == ROAD_TILE_CROSSING && HasBit(tile.m3(), 7)) {
168 tile.m3() = OWNER_TOWN.base();
169 }
170 [[fallthrough]];
171
172 case MP_TUNNELBRIDGE:
173 if (tile.m1() & 0x80) SetTileOwner(tile, OWNER_TOWN);
174 break;
175
176 default: break;
177 }
178 }
179}
180
181/* since savegame version 4.1, exclusive transport rights are stored at towns */
182static void UpdateExclusiveRights()
183{
184 for (Town *t : Town::Iterate()) {
185 t->exclusivity = CompanyID::Invalid();
186 }
187}
188
189static const uint8_t convert_currency[] = {
190 0, 1, 12, 8, 3,
191 10, 14, 19, 4, 5,
192 9, 11, 13, 6, 17,
193 16, 22, 21, 7, 15,
194 18, 2, 20,
195};
196
197/* since savegame version 4.2 the currencies are arranged differently */
198static void UpdateCurrencies()
199{
201}
202
203/* Up to revision 1413 the invisible tiles at the southern border have not been
204 * MP_VOID, even though they should have. This is fixed by this function
205 */
206static void UpdateVoidTiles()
207{
208 for (uint x = 0; x < Map::SizeX(); x++) MakeVoid(TileXY(x, Map::MaxY()));
209 for (uint y = 0; y < Map::SizeY(); y++) MakeVoid(TileXY(Map::MaxX(), y));
210}
211
212static inline RailType UpdateRailType(RailType rt, RailType min)
213{
214 return rt >= min ? (RailType)(rt + 1): rt;
215}
216
221{
225 UpdateAllTextEffectVirtCoords();
226 RebuildViewportKdtree();
227}
228
229void ClearAllCachedNames()
230{
231 ClearAllStationCachedNames();
233 ClearAllIndustryCachedNames();
234}
235
246{
247 /* Initialize windows */
250
251 /* Update coordinates of the signs. */
252 ClearAllCachedNames();
254 ResetViewportAfterLoadGame();
255
256 for (Company *c : Company::Iterate()) {
257 /* For each company, verify (while loading a scenario) that the inauguration date is the current year and set it
258 * accordingly if it is not the case. No need to set it on companies that are not been used already,
259 * thus the MIN_YEAR (which is really nothing more than Zero, initialized value) test */
260 if (_file_to_saveload.ftype.abstract == FT_SCENARIO && c->inaugurated_year != EconomyTime::MIN_YEAR) {
261 c->inaugurated_year = TimerGameEconomy::year;
262 }
263 }
264
265 /* Count number of objects per type */
266 for (Object *o : Object::Iterate()) {
267 Object::IncTypeCount(o->type);
268 }
269
270 /* Identify owners of persistent storage arrays */
271 for (Industry *i : Industry::Iterate()) {
272 if (i->psa != nullptr) {
273 i->psa->feature = GSF_INDUSTRIES;
274 i->psa->tile = i->location.tile;
275 }
276 }
277 for (Station *s : Station::Iterate()) {
278 if (s->airport.psa != nullptr) {
279 s->airport.psa->feature = GSF_AIRPORTS;
280 s->airport.psa->tile = s->airport.tile;
281 }
282 }
283 for (Town *t : Town::Iterate()) {
284 for (auto &it : t->psa_list) {
285 it->feature = GSF_FAKE_TOWNS;
286 it->tile = t->xy;
287 }
288 }
289 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
290 if (rv->IsFrontEngine()) {
291 rv->CargoChanged();
292 }
293 }
294
296
298
300
301 /* Towns have a noise controlled number of airports system
302 * So each airport's noise value must be added to the town->noise_reached value
303 * Reset each town's noise_reached value to '0' before. */
305
308
309 /* Rebuild the smallmap list of owners. */
311}
312
313typedef void (CDECL *SignalHandlerPointer)(int);
314static SignalHandlerPointer _prev_segfault = nullptr;
315static SignalHandlerPointer _prev_abort = nullptr;
316static SignalHandlerPointer _prev_fpe = nullptr;
317
318static void CDECL HandleSavegameLoadCrash(int signum);
319
324static void SetSignalHandlers()
325{
326 _prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash);
327 _prev_abort = signal(SIGABRT, HandleSavegameLoadCrash);
328 _prev_fpe = signal(SIGFPE, HandleSavegameLoadCrash);
329}
330
335{
336 signal(SIGSEGV, _prev_segfault);
337 signal(SIGABRT, _prev_abort);
338 signal(SIGFPE, _prev_fpe);
339}
340
343
353
360static void CDECL HandleSavegameLoadCrash(int signum)
361{
363
364 std::string message;
365 message.reserve(1024);
366 message += "Loading your savegame caused OpenTTD to crash.\n";
367
368 _saveload_crash_with_missing_newgrfs = std::ranges::any_of(_grfconfig, [](const auto &c) { return c->flags.Test(GRFConfigFlag::Compatible) || c->status == GCS_NOT_FOUND; });
369
371 message +=
372 "This is most likely caused by a missing NewGRF or a NewGRF that\n"
373 "has been loaded as replacement for a missing NewGRF. OpenTTD\n"
374 "cannot easily determine whether a replacement NewGRF is of a newer\n"
375 "or older version.\n"
376 "It will load a NewGRF with the same GRF ID as the missing NewGRF.\n"
377 "This means that if the author makes incompatible NewGRFs with the\n"
378 "same GRF ID, OpenTTD cannot magically do the right thing. In most\n"
379 "cases, OpenTTD will load the savegame and not crash, but this is an\n"
380 "exception.\n"
381 "Please load the savegame with the appropriate NewGRFs installed.\n"
382 "The missing/compatible NewGRFs are:\n";
383
384 for (const auto &c : _grfconfig) {
385 if (c->flags.Test(GRFConfigFlag::Compatible)) {
386 const GRFIdentifier &replaced = _gamelog.GetOverriddenIdentifier(*c);
387 format_append(message, "NewGRF {:08X} (checksum {}) not found.\n Loaded NewGRF \"{}\" (checksum {}) with same GRF ID instead.\n",
388 std::byteswap(c->ident.grfid), FormatArrayAsHex(c->original_md5sum), c->filename, FormatArrayAsHex(replaced.md5sum));
389 }
390 if (c->status == GCS_NOT_FOUND) {
391 format_append(message, "NewGRF {:08X} ({}) not found; checksum {}.\n",
392 std::byteswap(c->ident.grfid), c->filename, FormatArrayAsHex(c->ident.md5sum));
393 }
394 }
395 } else {
396 message +=
397 "This is probably caused by a corruption in the savegame.\n"
398 "Please file a bug report and attach this savegame.\n";
399 }
400
401 ShowInfoI(message);
402
403 SignalHandlerPointer call = nullptr;
404 switch (signum) {
405 case SIGSEGV: call = _prev_segfault; break;
406 case SIGABRT: call = _prev_abort; break;
407 case SIGFPE: call = _prev_fpe; break;
408 default: NOT_REACHED();
409 }
410 if (call != nullptr) call(signum);
411}
412
419{
421
422 /* remove leftover rail piece from crossing (from very old savegames) */
423 Train *v = nullptr;
424 for (Train *w : Train::Iterate()) {
425 if (w->tile == TileIndex(t)) {
426 v = w;
427 break;
428 }
429 }
430
431 if (v != nullptr) {
432 /* when there is a train on crossing (it could happen in TTD), set owner of crossing to train owner */
433 SetTileOwner(t, v->owner);
434 return;
435 }
436
437 /* try to find any connected rail */
438 for (DiagDirection dd = DIAGDIR_BEGIN; dd < DIAGDIR_END; dd++) {
439 TileIndex tt{t + TileOffsByDiagDir(dd)};
440 if (GetTileTrackStatus(t, TRANSPORT_RAIL, 0, dd) != 0 &&
444 return;
445 }
446 }
447
448 if (IsLevelCrossingTile(t)) {
449 /* else change the crossing to normal road (road vehicles won't care) */
450 Owner road = GetRoadOwner(t, RTT_ROAD);
451 Owner tram = GetRoadOwner(t, RTT_TRAM);
453 bool hasroad = HasBit(t.m7(), 6);
454 bool hastram = HasBit(t.m7(), 7);
455
456 /* MakeRoadNormal */
458 SetTileOwner(t, road);
459 t.m3() = (hasroad ? bits : 0);
460 t.m5() = (hastram ? bits : 0) | ROAD_TILE_NORMAL << 6;
461 SB(t.m6(), 2, 4, 0);
462 SetRoadOwner(t, RTT_TRAM, tram);
463 return;
464 }
465
466 /* if it's not a crossing, make it clean land */
467 MakeClear(t, CLEAR_GRASS, 0);
468}
469
477{
478 /* Compute place where this vehicle entered the tile */
479 int entry_x = v->x_pos;
480 int entry_y = v->y_pos;
481 switch (dir) {
482 case DIR_NE: entry_x |= TILE_UNIT_MASK; break;
483 case DIR_NW: entry_y |= TILE_UNIT_MASK; break;
484 case DIR_SW: entry_x &= ~TILE_UNIT_MASK; break;
485 case DIR_SE: entry_y &= ~TILE_UNIT_MASK; break;
486 case INVALID_DIR: break;
487 default: NOT_REACHED();
488 }
489 uint8_t entry_z = GetSlopePixelZ(entry_x, entry_y, true);
490
491 /* Compute middle of the tile. */
492 int middle_x = (v->x_pos & ~TILE_UNIT_MASK) + TILE_SIZE / 2;
493 int middle_y = (v->y_pos & ~TILE_UNIT_MASK) + TILE_SIZE / 2;
494 uint8_t middle_z = GetSlopePixelZ(middle_x, middle_y, true);
495
496 /* middle_z == entry_z, no height change. */
497 if (middle_z == entry_z) return 0;
498
499 /* middle_z < entry_z, we are going downwards. */
500 if (middle_z < entry_z) return 1U << GVF_GOINGDOWN_BIT;
501
502 /* middle_z > entry_z, we are going upwards. */
503 return 1U << GVF_GOINGUP_BIT;
504}
505
512{
513 for (Vehicle *v : Vehicle::Iterate()) {
514 if (v->IsGroundVehicle()) {
515 /*
516 * Either the vehicle is not actually on the given tile, i.e. it is
517 * in the wormhole of a bridge or a tunnel, or the Z-coordinate must
518 * be the same as when it would be recalculated right now.
519 */
520 assert(v->tile != TileVirtXY(v->x_pos, v->y_pos) || v->z_pos == GetSlopePixelZ(v->x_pos, v->y_pos, true));
521 }
522 }
523}
524
531static inline bool MayHaveBridgeAbove(Tile t)
532{
533 return IsTileType(t, MP_CLEAR) || IsTileType(t, MP_RAILWAY) || IsTileType(t, MP_ROAD) ||
535}
536
540static void StartScripts()
541{
542 /* Script debug window requires AIs to be started before trying to start GameScript. */
543
544 /* Start the AIs. */
545 for (const Company *c : Company::Iterate()) {
546 if (Company::IsValidAiID(c->index)) AI::StartNew(c->index);
547 }
548
549 /* Start the GameScript. */
551
553}
554
561{
563
564 extern TileIndex _cur_tileloop_tile; // From landscape.cpp.
565 /* The LFSR used in RunTileLoop iteration cannot have a zeroed state, make it non-zeroed. */
566 if (_cur_tileloop_tile == 0) _cur_tileloop_tile = TileIndex{1};
567
569
572
573 RebuildTownKdtree();
574 RebuildStationKdtree();
575 /* This needs to be done even before conversion, because some conversions will destroy objects
576 * that otherwise won't exist in the tree. */
577 RebuildViewportKdtree();
578
579 /* Group hierarchy may be evaluated during conversion, so ensure its correct early on. */
581
583
587 Debug(net, 0, "The loading savegame was paused due to an error state");
588 Debug(net, 0, " This savegame cannot be used for multiplayer");
589 /* Restore the signals */
591 return false;
592 } else if (!_networking || _network_server) {
593 /* If we are in singleplayer mode, i.e. not networking, and loading the
594 * savegame or we are loading the savegame as network server we do
595 * not want to be bothered by being paused because of the automatic
596 * reason of a network server, e.g. joining clients or too few
597 * active clients. Note that resetting these values for a network
598 * client are very bad because then the client is going to execute
599 * the game loop when the server is not, i.e. it desyncs. */
601 }
602
603 /* In very old versions, size of train stations was stored differently.
604 * They had swapped width and height if station was built along the Y axis.
605 * TTO and TTD used 3 bits for width/height, while OpenTTD used 4.
606 * Because the data stored by TTDPatch are unusable for rail stations > 7x7,
607 * recompute the width and height. Doing this unconditionally for all old
608 * savegames simplifies the code. */
610 for (Station *st : Station::Iterate()) {
611 st->train_station.w = st->train_station.h = 0;
612 }
613 for (auto t : Map::Iterate()) {
614 if (!IsTileType(t, MP_STATION)) continue;
615 if (t.m5() > 7) continue; // is it a rail station tile?
616 Station *st = Station::Get(t.m2());
617 assert(st->train_station.tile != 0);
618 int dx = TileX(t) - TileX(st->train_station.tile);
619 int dy = TileY(t) - TileY(st->train_station.tile);
620 assert(dx >= 0 && dy >= 0);
621 st->train_station.w = std::max<uint>(st->train_station.w, dx + 1);
622 st->train_station.h = std::max<uint>(st->train_station.h, dy + 1);
623 }
624 }
625
628
629 /* In old savegame versions, the heightlevel was coded in bits 0..3 of the type field */
630 for (auto t : Map::Iterate()) {
631 t.height() = GB(t.type(), 0, 4);
632 SB(t.type(), 0, 2, GB(t.m6(), 0, 2));
633 SB(t.m6(), 0, 2, 0);
634 if (MayHaveBridgeAbove(t)) {
635 SB(t.type(), 2, 2, GB(t.m6(), 6, 2));
636 SB(t.m6(), 6, 2, 0);
637 } else {
638 SB(t.type(), 2, 2, 0);
639 }
640 }
641 }
642
643 /* in version 2.1 of the savegame, town owner was unified. */
644 if (IsSavegameVersionBefore(SLV_2, 1)) ConvertTownOwner();
645
646 /* from version 4.1 of the savegame, exclusive rights are stored at towns */
647 if (IsSavegameVersionBefore(SLV_4, 1)) UpdateExclusiveRights();
648
649 /* from version 4.2 of the savegame, currencies are in a different order */
650 if (IsSavegameVersionBefore(SLV_4, 2)) UpdateCurrencies();
651
652 /* In old version there seems to be a problem that water is owned by
653 * OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
654 * (4.3) version, so I just check when versions are older, and then
655 * walk through the whole map.. */
657 for (const auto t : Map::Iterate()) {
658 if (IsTileType(t, MP_WATER) && GetTileOwner(t) >= MAX_COMPANIES) {
660 }
661 }
662 }
663
665 for (Company *c : Company::Iterate()) {
666 c->name = CopyFromOldName(c->name_1);
667 if (!c->name.empty()) c->name_1 = STR_SV_UNNAMED;
668 c->president_name = CopyFromOldName(c->president_name_1);
669 if (!c->president_name.empty()) c->president_name_1 = SPECSTR_PRESIDENT_NAME;
670 }
671
672 for (Station *st : Station::Iterate()) {
673 st->name = CopyFromOldName(st->string_id);
674 /* generating new name would be too much work for little effect, use the station name fallback */
675 if (!st->name.empty()) st->string_id = STR_SV_STNAME_FALLBACK;
676 }
677
678 for (Town *t : Town::Iterate()) {
679 t->name = CopyFromOldName(t->townnametype);
680 if (!t->name.empty()) t->townnametype = SPECSTR_TOWNNAME_START + _settings_game.game_creation.town_name;
681 }
682 }
683
684 /* From this point the old names array is cleared. */
686
688 /* no station is determined by 'tile == INVALID_TILE' now (instead of '0') */
689 for (Station *st : Station::Iterate()) {
690 if (st->airport.tile == 0) st->airport.tile = INVALID_TILE;
691 if (st->train_station.tile == 0) st->train_station.tile = INVALID_TILE;
692 }
693
694 /* the same applies to Company::location_of_HQ */
695 for (Company *c : Company::Iterate()) {
696 if (c->location_of_HQ == 0 || (IsSavegameVersionBefore(SLV_4) && c->location_of_HQ == 0xFFFF)) {
697 c->location_of_HQ = INVALID_TILE;
698 }
699 }
700 }
701
702 /* convert road side to my format. */
704
705 /* Check if all NewGRFs are present, we are very strict in MP mode */
707 for (const auto &c : _grfconfig) {
708 if (c->status == GCS_NOT_FOUND) {
709 _gamelog.GRFRemove(c->ident.grfid);
710 } else if (c->flags.Test(GRFConfigFlag::Compatible)) {
711 _gamelog.GRFCompatible(c->ident);
712 }
713 }
714
715 if (_networking && gcf_res != GLC_ALL_GOOD) {
716 SetSaveLoadError(STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH);
717 /* Restore the signals */
719 return false;
720 }
721
722 switch (gcf_res) {
723 case GLC_COMPATIBLE: ShowErrorMessage(GetEncodedString(STR_NEWGRF_COMPATIBLE_LOAD_WARNING), {}, WL_CRITICAL); break;
724 case GLC_NOT_FOUND: ShowErrorMessage(GetEncodedString(STR_NEWGRF_DISABLED_WARNING), {}, WL_CRITICAL); _pause_mode = PauseMode::Error; break;
725 default: break;
726 }
727
728 /* The value of TimerGameCalendar::date_fract got divided, so make sure that old games are converted correctly. */
730
731 /* Update current year
732 * must be done before loading sprites as some newgrfs check it */
734
735 /* Only new games can use wallclock units. */
737
738 /* Update economy year. If we don't have a separate economy date saved, follow the calendar date. */
741 } else {
743 }
744
745 /*
746 * Force the old behaviour for compatibility reasons with old savegames. As new
747 * settings can only be loaded from new savegames loading old savegames with new
748 * versions of OpenTTD will normally initialize settings newer than the savegame
749 * version with "new game" defaults which the player can define to their liking.
750 * For some settings we override that to keep the behaviour the same as when the
751 * game was saved.
752 *
753 * Note that there is no non-stop in here. This is because the setting could have
754 * either value in TTDPatch. To convert it properly the user has to make sure the
755 * right value has been chosen in the settings. Otherwise we will be converting
756 * it incorrectly in half of the times without a means to correct that.
757 */
766 }
772 }
778 }
785 }
786
789 }
790
791 /* Convert linkgraph update settings from days to seconds. */
795 }
796
797 /* Load the sprites */
800
801 /* Copy temporary data to Engine pool */
803
804 /* Connect front and rear engines of multiheaded trains and converts
805 * subtype to the new format */
807
808 /* Connect front and rear engines of multiheaded trains */
810
811 /* Fix the CargoPackets *and* fix the caches of CargoLists.
812 * If this isn't done before Stations and especially Vehicles are
813 * running their AfterLoad we might get in trouble. In the case of
814 * vehicles we could give the wrong (cached) count of items in a
815 * vehicle which causes different results when getting their caches
816 * filled; and that could eventually lead to desyncs. */
818
819 /* Update all vehicles: Phase 1 */
821
822 /* Old orders are no longer needed. */
824
825 /* make sure there is a town in the game */
826 if (_game_mode == GM_NORMAL && Town::GetNumItems() == 0) {
827 SetSaveLoadError(STR_ERROR_NO_TOWN_IN_SCENARIO);
828 /* Restore the signals */
830 return false;
831 }
832
833 /* The void tiles on the southern border used to belong to a wrong class (pre 4.3).
834 * This problem appears in savegame version 21 too, see r3455. But after loading the
835 * savegame and saving again, the buggy map array could be converted to new savegame
836 * version. It didn't show up before r12070. */
837 if (IsSavegameVersionBefore(SLV_87)) UpdateVoidTiles();
838
839 /* Fix the cache for cargo payments. */
840 for (CargoPayment *cp : CargoPayment::Iterate()) {
841 cp->front->cargo_payment = cp;
842 cp->current_station = cp->front->last_station_visited;
843 }
844
845
847 /* Prior to SLV_WATER_TILE_TYPE, the water tile type was stored differently from the enumeration. This has to be
848 * converted before SLV_72 and SLV_82 conversions which use GetWaterTileType. */
849 static constexpr uint8_t WBL_COAST_FLAG = 0;
850
851 for (auto t : Map::Iterate()) {
852 if (!IsTileType(t, MP_WATER)) continue;
853
854 switch (GB(t.m5(), 4, 4)) {
855 case 0x0: /* Previously WBL_TYPE_NORMAL, Clear water or coast. */
856 SetWaterTileType(t, HasBit(t.m5(), WBL_COAST_FLAG) ? WATER_TILE_COAST : WATER_TILE_CLEAR);
857 break;
858
859 case 0x1: SetWaterTileType(t, WATER_TILE_LOCK); break; /* Previously WBL_TYPE_LOCK */
860 case 0x8: SetWaterTileType(t, WATER_TILE_DEPOT); break; /* Previously WBL_TYPE_DEPOT */
861 default: SetWaterTileType(t, WATER_TILE_CLEAR); break; /* Shouldn't happen... */
862 }
863 }
864 }
865
867 /* Locks in very old savegames had OWNER_WATER as owner */
868 for (auto t : Map::Iterate()) {
869 switch (GetTileType(t)) {
870 default: break;
871
872 case MP_WATER:
874 break;
875
876 case MP_STATION: {
877 if (HasBit(t.m6(), 3)) SetBit(t.m6(), 2);
878 StationGfx gfx = GetStationGfx(t);
879 StationType st;
880 if ( IsInsideMM(gfx, 0, 8)) { // Rail station
881 st = StationType::Rail;
882 SetStationGfx(t, gfx - 0);
883 } else if (IsInsideMM(gfx, 8, 67)) { // Airport
884 st = StationType::Airport;
885 SetStationGfx(t, gfx - 8);
886 } else if (IsInsideMM(gfx, 67, 71)) { // Truck
887 st = StationType::Truck;
888 SetStationGfx(t, gfx - 67);
889 } else if (IsInsideMM(gfx, 71, 75)) { // Bus
890 st = StationType::Bus;
891 SetStationGfx(t, gfx - 71);
892 } else if (gfx == 75) { // Oil rig
893 st = StationType::Oilrig;
894 SetStationGfx(t, gfx - 75);
895 } else if (IsInsideMM(gfx, 76, 82)) { // Dock
896 st = StationType::Dock;
897 SetStationGfx(t, gfx - 76);
898 } else if (gfx == 82) { // Buoy
899 st = StationType::Buoy;
900 SetStationGfx(t, gfx - 82);
901 } else if (IsInsideMM(gfx, 83, 168)) { // Extended airport
902 st = StationType::Airport;
903 SetStationGfx(t, gfx - 83 + 67 - 8);
904 } else if (IsInsideMM(gfx, 168, 170)) { // Drive through truck
905 st = StationType::Truck;
907 } else if (IsInsideMM(gfx, 170, 172)) { // Drive through bus
908 st = StationType::Bus;
910 } else {
911 /* Restore the signals */
913 return false;
914 }
915 SB(t.m6(), 3, 3, to_underlying(st));
916 break;
917 }
918 }
919 }
920 }
921
923 /* Expansion of station type field in m6 */
924 for (auto t : Map::Iterate()) {
925 if (IsTileType(t, MP_STATION)) {
926 ClrBit(t.m6(), 6);
927 }
928 }
929 }
930
931 for (const auto t : Map::Iterate()) {
932 switch (GetTileType(t)) {
933 case MP_STATION: {
935
936 /* Sanity check */
937 if (!IsBuoy(t) && bst->owner != GetTileOwner(t)) SlErrorCorrupt("Wrong owner for station tile");
938
939 /* Set up station spread */
940 bst->rect.BeforeAddTile(t, StationRect::ADD_FORCE);
941
942 /* Waypoints don't have road stops/oil rigs in the old format */
943 if (!Station::IsExpected(bst)) break;
944 Station *st = Station::From(bst);
945
946 switch (GetStationType(t)) {
947 case StationType::Truck:
948 case StationType::Bus:
950 /* Before version 5 you could not have more than 250 stations.
951 * Version 6 adds large maps, so you could only place 253*253
952 * road stops on a map (no freeform edges) = 64009. So, yes
953 * someone could in theory create such a full map to trigger
954 * this assertion, it's safe to assume that's only something
955 * theoretical and does not happen in normal games. */
957
958 /* From this version on there can be multiple road stops of the
959 * same type per station. Convert the existing stops to the new
960 * internal data structure. */
961 RoadStop *rs = new RoadStop(t);
962
963 RoadStop **head =
964 IsTruckStop(t) ? &st->truck_stops : &st->bus_stops;
965 *head = rs;
966 }
967 break;
968
969 case StationType::Oilrig: {
970 /* The internal encoding of oil rigs was changed twice.
971 * It was 3 (till 2.2) and later 5 (till 5.1).
972 * DeleteOilRig asserts on the correct type, and
973 * setting it unconditionally does not hurt.
974 */
975 Station::GetByTile(t)->airport.type = AT_OILRIG;
976
977 /* Very old savegames sometimes have phantom oil rigs, i.e.
978 * an oil rig which got shut down, but not completely removed from
979 * the map
980 */
981 TileIndex t1 = TileAddXY(t, 0, 1);
982 if (!IsTileType(t1, MP_INDUSTRY) || GetIndustryGfx(t1) != GFX_OILRIG_1) {
983 DeleteOilRig(t);
984 }
985 break;
986 }
987
988 default: break;
989 }
990 break;
991 }
992
993 default: break;
994 }
995 }
996
997 /* In version 6.1 we put the town index in the map-array. To do this, we need
998 * to use m2 (16bit big), so we need to clean m2, and that is where this is
999 * all about ;) */
1001 for (auto t : Map::Iterate()) {
1002 switch (GetTileType(t)) {
1003 case MP_HOUSE:
1004 t.m4() = t.m2();
1006 break;
1007
1008 case MP_ROAD:
1009 t.m4() |= (t.m2() << 4);
1010 if ((GB(t.m5(), 4, 2) == ROAD_TILE_CROSSING ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) {
1012 } else {
1013 SetTownIndex(t, TownID::Begin());
1014 }
1015 break;
1016
1017 default: break;
1018 }
1019 }
1020 }
1021
1022 /* Force the freeform edges to false for old savegames. */
1025 }
1026
1027 /* From version 9.0, we update the max passengers of a town (was sometimes negative
1028 * before that. */
1030 for (Town *t : Town::Iterate()) UpdateTownMaxPass(t);
1031 }
1032
1033 /* From version 16.0, we included autorenew on engines, which are now saved, but
1034 * of course, we do need to initialize them for older savegames. */
1036 for (Company *c : Company::Iterate()) {
1037 c->engine_renew_list = nullptr;
1038 c->settings.engine_renew = false;
1039 c->settings.engine_renew_months = 6;
1040 c->settings.engine_renew_money = 100000;
1041 }
1042
1043 /* When loading a game, _local_company is not yet set to the correct value.
1044 * However, in a dedicated server we are a spectator, so nothing needs to
1045 * happen. In case we are not a dedicated server, the local company always
1046 * becomes the first available company, unless we are in the scenario editor
1047 * where all the companies are 'invalid'.
1048 */
1050 if (!_network_dedicated && c != nullptr) {
1052 }
1053 }
1054
1056 for (auto t : Map::Iterate()) {
1057 switch (GetTileType(t)) {
1058 case MP_RAILWAY:
1059 if (IsPlainRail(t)) {
1060 /* Swap ground type and signal type for plain rail tiles, so the
1061 * ground type uses the same bits as for depots and waypoints. */
1062 uint tmp = GB(t.m4(), 0, 4);
1063 SB(t.m4(), 0, 4, GB(t.m2(), 0, 4));
1064 SB(t.m2(), 0, 4, tmp);
1065 } else if (HasBit(t.m5(), 2)) {
1066 /* Split waypoint and depot rail type and remove the subtype. */
1067 ClrBit(t.m5(), 2);
1068 ClrBit(t.m5(), 6);
1069 }
1070 break;
1071
1072 case MP_ROAD:
1073 /* Swap m3 and m4, so the track type for rail crossings is the
1074 * same as for normal rail. */
1075 std::swap(t.m3(), t.m4());
1076 break;
1077
1078 default: break;
1079 }
1080 }
1081 }
1082
1084 /* Added the RoadType */
1085 bool old_bridge = IsSavegameVersionBefore(SLV_42);
1086 for (auto t : Map::Iterate()) {
1087 switch (GetTileType(t)) {
1088 case MP_ROAD:
1089 SB(t.m5(), 6, 2, GB(t.m5(), 4, 2));
1090 switch (GetRoadTileType(t)) {
1091 default: SlErrorCorrupt("Invalid road tile type");
1092 case ROAD_TILE_NORMAL:
1093 SB(t.m4(), 0, 4, GB(t.m5(), 0, 4));
1094 SB(t.m4(), 4, 4, 0);
1095 SB(t.m6(), 2, 4, 0);
1096 break;
1097 case ROAD_TILE_CROSSING:
1098 SB(t.m4(), 5, 2, GB(t.m5(), 2, 2));
1099 break;
1100 case ROAD_TILE_DEPOT: break;
1101 }
1102 SB(t.m7(), 6, 2, 1); // Set pre-NRT road type bits for conversion later.
1103 break;
1104
1105 case MP_STATION:
1106 if (IsStationRoadStop(t)) SB(t.m7(), 6, 2, 1);
1107 break;
1108
1109 case MP_TUNNELBRIDGE:
1110 /* Middle part of "old" bridges */
1111 if (old_bridge && IsBridge(t) && HasBit(t.m5(), 6)) break;
1112 if (((old_bridge && IsBridge(t)) ? (TransportType)GB(t.m5(), 1, 2) : GetTunnelBridgeTransportType(t)) == TRANSPORT_ROAD) {
1113 SB(t.m7(), 6, 2, 1); // Set pre-NRT road type bits for conversion later.
1114 }
1115 break;
1116
1117 default: break;
1118 }
1119 }
1120 }
1121
1123 bool fix_roadtypes = !IsSavegameVersionBefore(SLV_61);
1124 bool old_bridge = IsSavegameVersionBefore(SLV_42);
1125
1126 for (auto t : Map::Iterate()) {
1127 switch (GetTileType(t)) {
1128 case MP_ROAD:
1129 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m7(), 5, 3));
1130 SB(t.m7(), 5, 1, GB(t.m3(), 7, 1)); // snow/desert
1131 switch (GetRoadTileType(t)) {
1132 default: SlErrorCorrupt("Invalid road tile type");
1133 case ROAD_TILE_NORMAL:
1134 SB(t.m7(), 0, 4, GB(t.m3(), 0, 4)); // road works
1135 SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground
1136 SB(t.m3(), 0, 4, GB(t.m4(), 4, 4)); // tram bits
1137 SB(t.m3(), 4, 4, GB(t.m5(), 0, 4)); // tram owner
1138 SB(t.m5(), 0, 4, GB(t.m4(), 0, 4)); // road bits
1139 break;
1140
1141 case ROAD_TILE_CROSSING:
1142 SB(t.m7(), 0, 5, GB(t.m4(), 0, 5)); // road owner
1143 SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground
1144 SB(t.m3(), 4, 4, GB(t.m5(), 0, 4)); // tram owner
1145 SB(t.m5(), 0, 1, GB(t.m4(), 6, 1)); // road axis
1146 SB(t.m5(), 5, 1, GB(t.m4(), 5, 1)); // crossing state
1147 break;
1148
1149 case ROAD_TILE_DEPOT:
1150 break;
1151 }
1152 if (!IsRoadDepot(t) && !HasTownOwnedRoad(t)) {
1153 const Town *town = CalcClosestTownFromTile(t);
1154 if (town != nullptr) SetTownIndex(t, town->index);
1155 }
1156 t.m4() = 0;
1157 break;
1158
1159 case MP_STATION:
1160 if (!IsStationRoadStop(t)) break;
1161
1162 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m3(), 0, 3));
1163 SB(t.m7(), 0, 5, (HasBit(t.m6(), 2) ? OWNER_TOWN : GetTileOwner(t)).base());
1164 SB(t.m3(), 4, 4, t.m1());
1165 t.m4() = 0;
1166 break;
1167
1168 case MP_TUNNELBRIDGE:
1169 if (old_bridge && IsBridge(t) && HasBit(t.m5(), 6)) break;
1170 if (((old_bridge && IsBridge(t)) ? (TransportType)GB(t.m5(), 1, 2) : GetTunnelBridgeTransportType(t)) == TRANSPORT_ROAD) {
1171 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m3(), 0, 3));
1172
1173 Owner o = GetTileOwner(t);
1174 SB(t.m7(), 0, 5, o.base()); // road owner
1175 SB(t.m3(), 4, 4, (o == OWNER_NONE ? OWNER_TOWN : o).base()); // tram owner
1176 }
1177 SB(t.m6(), 2, 4, GB(t.m2(), 4, 4)); // bridge type
1178 SB(t.m7(), 5, 1, GB(t.m4(), 7, 1)); // snow/desert
1179
1180 t.m2() = 0;
1181 t.m4() = 0;
1182 break;
1183
1184 default: break;
1185 }
1186 }
1187 }
1188
1189 /* Railtype moved from m3 to m8 in version SLV_EXTEND_RAILTYPES. */
1191 for (auto t : Map::Iterate()) {
1192 switch (GetTileType(t)) {
1193 case MP_RAILWAY:
1194 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1195 break;
1196
1197 case MP_ROAD:
1198 if (IsLevelCrossing(t)) {
1199 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1200 }
1201 break;
1202
1203 case MP_STATION:
1204 if (HasStationRail(t)) {
1205 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1206 }
1207 break;
1208
1209 case MP_TUNNELBRIDGE:
1211 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1212 }
1213 break;
1214
1215 default:
1216 break;
1217 }
1218 }
1219 }
1220
1222 for (auto t : Map::Iterate()) {
1224 if (IsBridgeTile(t)) {
1225 if (HasBit(t.m5(), 6)) { // middle part
1226 Axis axis = (Axis)GB(t.m5(), 0, 1);
1227
1228 if (HasBit(t.m5(), 5)) { // transport route under bridge?
1229 if (GB(t.m5(), 3, 2) == TRANSPORT_RAIL) {
1230 MakeRailNormal(
1231 t,
1232 GetTileOwner(t),
1233 axis == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X,
1234 GetRailType(t)
1235 );
1236 } else {
1237 TownID town = IsTileOwner(t, OWNER_TOWN) ? ClosestTownFromTile(t, UINT_MAX)->index : TownID::Begin();
1238
1239 /* MakeRoadNormal */
1240 SetTileType(t, MP_ROAD);
1241 t.m2() = town.base();
1242 t.m3() = 0;
1243 t.m5() = (axis == AXIS_X ? ROAD_Y : ROAD_X) | ROAD_TILE_NORMAL << 6;
1244 SB(t.m6(), 2, 4, 0);
1245 t.m7() = 1 << 6;
1246 SetRoadOwner(t, RTT_TRAM, OWNER_NONE);
1247 }
1248 } else {
1249 if (GB(t.m5(), 3, 2) == 0) {
1250 MakeClear(t, CLEAR_GRASS, 3);
1251 } else {
1252 if (!IsTileFlat(t)) {
1253 MakeShore(t);
1254 } else {
1255 if (GetTileOwner(t) == OWNER_WATER) {
1256 MakeSea(t);
1257 } else {
1258 MakeCanal(t, GetTileOwner(t), Random());
1259 }
1260 }
1261 }
1262 }
1263 SetBridgeMiddle(t, axis);
1264 } else { // ramp
1265 Axis axis = (Axis)GB(t.m5(), 0, 1);
1266 uint north_south = GB(t.m5(), 5, 1);
1267 DiagDirection dir = ReverseDiagDir(XYNSToDiagDir(axis, north_south));
1268 TransportType type = (TransportType)GB(t.m5(), 1, 2);
1269
1270 t.m5() = 1 << 7 | type << 2 | dir;
1271 }
1272 }
1273 }
1274
1275 for (Vehicle *v : Vehicle::Iterate()) {
1276 if (!v->IsGroundVehicle()) continue;
1277 if (IsBridgeTile(v->tile)) {
1279
1280 if (dir != DirToDiagDir(v->direction)) continue;
1281 switch (dir) {
1282 default: SlErrorCorrupt("Invalid vehicle direction");
1283 case DIAGDIR_NE: if ((v->x_pos & 0xF) != 0) continue; break;
1284 case DIAGDIR_SE: if ((v->y_pos & 0xF) != TILE_SIZE - 1) continue; break;
1285 case DIAGDIR_SW: if ((v->x_pos & 0xF) != TILE_SIZE - 1) continue; break;
1286 case DIAGDIR_NW: if ((v->y_pos & 0xF) != 0) continue; break;
1287 }
1288 } else if (v->z_pos > GetTileMaxPixelZ(TileVirtXY(v->x_pos, v->y_pos))) {
1289 v->tile = GetNorthernBridgeEnd(v->tile);
1290 v->UpdatePosition();
1291 } else {
1292 continue;
1293 }
1294 if (v->type == VEH_TRAIN) {
1295 Train::From(v)->track = TRACK_BIT_WORMHOLE;
1296 } else {
1297 RoadVehicle::From(v)->state = RVSB_WORMHOLE;
1298 }
1299 }
1300 }
1301
1303 /* Add road subtypes */
1304 for (auto t : Map::Iterate()) {
1305 bool has_road = false;
1306 switch (GetTileType(t)) {
1307 case MP_ROAD:
1308 has_road = true;
1309 break;
1310 case MP_STATION:
1311 has_road = IsAnyRoadStop(t);
1312 break;
1313 case MP_TUNNELBRIDGE:
1315 break;
1316 default:
1317 break;
1318 }
1319
1320 if (has_road) {
1321 RoadType road_rt = HasBit(t.m7(), 6) ? ROADTYPE_ROAD : INVALID_ROADTYPE;
1322 RoadType tram_rt = HasBit(t.m7(), 7) ? ROADTYPE_TRAM : INVALID_ROADTYPE;
1323
1324 assert(road_rt != INVALID_ROADTYPE || tram_rt != INVALID_ROADTYPE);
1325 SetRoadTypes(t, road_rt, tram_rt);
1326 SB(t.m7(), 6, 2, 0); // Clear pre-NRT road type bits.
1327 }
1328 }
1329 }
1330
1331 /* Elrails got added in rev 24 */
1333 RailType min_rail = RAILTYPE_ELECTRIC;
1334
1335 for (Train *v : Train::Iterate()) {
1336 RailType rt = RailVehInfo(v->engine_type)->railtype;
1337
1338 v->railtype = rt;
1339 if (rt == RAILTYPE_ELECTRIC) min_rail = RAILTYPE_RAIL;
1340 }
1341
1342 /* .. so we convert the entire map from normal to elrail (so maintain "fairness") */
1343 for (const auto t : Map::Iterate()) {
1344 switch (GetTileType(t)) {
1345 case MP_RAILWAY:
1346 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1347 break;
1348
1349 case MP_ROAD:
1350 if (IsLevelCrossing(t)) {
1351 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1352 }
1353 break;
1354
1355 case MP_STATION:
1356 if (HasStationRail(t)) {
1357 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1358 }
1359 break;
1360
1361 case MP_TUNNELBRIDGE:
1363 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1364 }
1365 break;
1366
1367 default:
1368 break;
1369 }
1370 }
1371 }
1372
1373 /* In version 16.1 of the savegame a company can decide if trains, which get
1374 * replaced, shall keep their old length. In all prior versions, just default
1375 * to false */
1377 for (Company *c : Company::Iterate()) c->settings.renew_keep_length = false;
1378 }
1379
1381 /* Waypoints became subclasses of stations ... */
1383 /* ... and buoys were moved to waypoints. */
1385 }
1386
1387 /* From version 15, we moved a semaphore bit from bit 2 to bit 3 in m4, making
1388 * room for PBS. Now in version 21 move it back :P. */
1390 for (auto t : Map::Iterate()) {
1391 switch (GetTileType(t)) {
1392 case MP_RAILWAY:
1393 if (HasSignals(t)) {
1394 /* Original signal type/variant was stored in m4 but since saveload
1395 * version 48 they are in m2. The bits has been already moved to m2
1396 * (see the code somewhere above) so don't use m4, use m2 instead. */
1397
1398 /* convert PBS signals to combo-signals */
1399 if (HasBit(t.m2(), 2)) SB(t.m2(), 0, 2, SIGTYPE_COMBO);
1400
1401 /* move the signal variant back */
1402 SB(t.m2(), 2, 1, HasBit(t.m2(), 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
1403 ClrBit(t.m2(), 3);
1404 }
1405
1406 /* Clear PBS reservation on track */
1407 if (!IsRailDepotTile(t)) {
1408 SB(t.m4(), 4, 4, 0);
1409 } else {
1410 ClrBit(t.m3(), 6);
1411 }
1412 break;
1413
1414 case MP_STATION: // Clear PBS reservation on station
1415 ClrBit(t.m3(), 6);
1416 break;
1417
1418 default: break;
1419 }
1420 }
1421 }
1422
1424 /* Remove obsolete VS_WAIT_FOR_SLOT state from road vehicles. */
1425 static constexpr VehStates OLD_VS_WAIT_FOR_SLOT{0x40};
1426 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1427 rv->vehstatus.Reset(OLD_VS_WAIT_FOR_SLOT);
1428 }
1429 }
1430
1432 for (Station *st : Station::Iterate()) {
1433 st->last_vehicle_type = VEH_INVALID;
1434 }
1435 }
1436
1438
1441 }
1442
1443 for (Company *c : Company::Iterate()) {
1444 c->avail_railtypes = GetCompanyRailTypes(c->index);
1445 c->avail_roadtypes = GetCompanyRoadTypes(c->index);
1446 }
1447
1448 AfterLoadStations();
1449
1450 /* Time starts at 0 instead of 1920.
1451 * Account for this in older games by adding an offset */
1457
1461 for (Company *c : Company::Iterate()) c->inaugurated_year += EconomyTime::ORIGINAL_BASE_YEAR;
1462 for (Industry *i : Industry::Iterate()) i->last_prod_year += EconomyTime::ORIGINAL_BASE_YEAR;
1463
1464 for (Vehicle *v : Vehicle::Iterate()) {
1465 v->date_of_last_service += EconomyTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
1466 v->build_year += CalendarTime::ORIGINAL_BASE_YEAR;
1467 }
1468 }
1469
1470 /* From 32 on we save the industry who made the farmland.
1471 * To give this prettiness to old savegames, we remove all farmfields and
1472 * plant new ones. */
1474 for (const auto t : Map::Iterate()) {
1476 /* remove fields */
1477 MakeClear(t, CLEAR_GRASS, 3);
1478 }
1479 }
1480
1481 for (Industry *i : Industry::Iterate()) {
1482 uint j;
1483
1485 for (j = 0; j != 50; j++) PlantRandomFarmField(i);
1486 }
1487 }
1488 }
1489
1490 /* Setting no refit flags to all orders in savegames from before refit in orders were added */
1492 for (OrderList *orderlist : OrderList::Iterate()) {
1493 for (Order &order : orderlist->GetOrders()) {
1494 order.SetRefit(CARGO_NO_REFIT);
1495 }
1496 }
1497
1498 for (Vehicle *v : Vehicle::Iterate()) {
1499 v->current_order.SetRefit(CARGO_NO_REFIT);
1500 }
1501 }
1502
1503 /* from version 38 we have optional elrails, since we cannot know the
1504 * preference of a user, let elrails enabled; it can be disabled manually */
1506 /* do the same as when elrails were enabled/disabled manually just now */
1507 UpdateDisableElrailSettingState(_settings_game.vehicle.disable_elrails, false);
1509
1510 /* From version 53, the map array was changed for house tiles to allow
1511 * space for newhouses grf features. A new byte, m7, was also added. */
1513 for (auto t : Map::Iterate()) {
1514 if (IsTileType(t, MP_HOUSE)) {
1515 if (GB(t.m3(), 6, 2) != TOWN_HOUSE_COMPLETED) {
1516 /* Move the construction stage from m3[7..6] to m5[5..4].
1517 * The construction counter does not have to move. */
1518 SB(t.m5(), 3, 2, GB(t.m3(), 6, 2));
1519 SB(t.m3(), 6, 2, 0);
1520
1521 /* The "house is completed" bit is now in m6[2]. */
1522 SetHouseCompleted(t, false);
1523 } else {
1524 /* The "lift has destination" bit has been moved from
1525 * m5[7] to m7[0]. */
1526 AssignBit(t.m7(), 0, HasBit(t.m5(), 7));
1527 ClrBit(t.m5(), 7);
1528
1529 /* The "lift is moving" bit has been removed, as it does
1530 * the same job as the "lift has destination" bit. */
1531 ClrBit(t.m1(), 7);
1532
1533 /* The position of the lift goes from m1[7..0] to m6[7..2],
1534 * making m1 totally free, now. The lift position does not
1535 * have to be a full byte since the maximum value is 36. */
1536 SetLiftPosition(t, GB(t.m1(), 0, 6 ));
1537
1538 t.m1() = 0;
1539 t.m3() = 0;
1540 SetHouseCompleted(t, true);
1541 }
1542 }
1543 }
1544 }
1545
1547 for (auto t : Map::Iterate()) {
1548 if (IsTileType(t, MP_HOUSE)) {
1549 /* House type is moved from m4 + m3[6] to m8. */
1550 SetHouseType(t, t.m4() | (GB(t.m3(), 6, 1) << 8));
1551 t.m4() = 0;
1552 ClrBit(t.m3(), 6);
1553 }
1554 }
1555 }
1556
1558 for (auto t : Map::Iterate()) {
1559 if (IsTileType(t, MP_HOUSE)) {
1560 /* We now store house protection status in the map. Set this based on the house spec flags. */
1561 const HouseSpec *hs = HouseSpec::Get(GetHouseType(t));
1563 }
1564 }
1565 }
1566
1567 /* Check and update house and town values */
1569
1571 for (auto t : Map::Iterate()) {
1572 if (IsTileType(t, MP_INDUSTRY)) {
1573 switch (GetIndustryGfx(t)) {
1574 case GFX_POWERPLANT_SPARKS:
1575 t.m3() = GB(t.m1(), 2, 5);
1576 break;
1577
1578 case GFX_OILWELL_ANIMATED_1:
1579 case GFX_OILWELL_ANIMATED_2:
1580 case GFX_OILWELL_ANIMATED_3:
1581 t.m3() = GB(t.m1(), 0, 2);
1582 break;
1583
1584 case GFX_COAL_MINE_TOWER_ANIMATED:
1585 case GFX_COPPER_MINE_TOWER_ANIMATED:
1586 case GFX_GOLD_MINE_TOWER_ANIMATED:
1587 t.m3() = t.m1();
1588 break;
1589
1590 default: // No animation states to change
1591 break;
1592 }
1593 }
1594 }
1595 }
1596
1598 /* Originally just the fact that some cargo had been paid for was
1599 * stored to stop people cheating and cashing in several times. This
1600 * wasn't enough though as it was cleared when the vehicle started
1601 * loading again, even if it didn't actually load anything, so now the
1602 * amount that has been paid is stored. */
1603 for (Vehicle *v : Vehicle::Iterate()) {
1604 v->vehicle_flags.Reset(VehicleFlag{2});
1605 }
1606 }
1607
1608 /* Buoys do now store the owner of the previous water tile, which can never
1609 * be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
1611 for (Waypoint *wp : Waypoint::Iterate()) {
1612 if (wp->facilities.Test(StationFacility::Dock) && IsTileOwner(wp->xy, OWNER_NONE) && TileHeight(wp->xy) == 0) SetTileOwner(wp->xy, OWNER_WATER);
1613 }
1614 }
1615
1617 /* Aircraft units changed from 8 mph to 1 km-ish/h */
1618 for (Aircraft *v : Aircraft::Iterate()) {
1619 if (v->subtype <= AIR_AIRCRAFT) {
1620 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
1621 v->cur_speed *= 128;
1622 v->cur_speed /= 10;
1623 v->acceleration = avi->acceleration;
1624 }
1625 }
1626 }
1627
1629 /* Perform conversion of very old face bits. */
1630 for (Company *c : Company::Iterate()) {
1631 c->face = ConvertFromOldCompanyManagerFace(c->face.bits);
1632 }
1634 /* Convert old gender and ethnicity bits to face style. */
1635 for (Company *c : Company::Iterate()) {
1636 SetCompanyManagerFaceStyle(c->face, GB(c->face.bits, 0, 2));
1637 }
1638 } else {
1639 /* Look up each company face style by its label. */
1640 for (Company *c : Company::Iterate()) {
1641 auto style = FindCompanyManagerFaceLabel(c->face.style_label);
1642 if (style.has_value()) {
1643 SetCompanyManagerFaceStyle(c->face, *style);
1644 } else {
1645 /* Style no longer exists, pick an entirely new face. */
1647 }
1648 }
1649 }
1650
1652 for (auto t : Map::Iterate()) {
1653 if (IsTileType(t, MP_OBJECT) && t.m5() == OBJECT_STATUE) {
1654 t.m2() = CalcClosestTownFromTile(t)->index.base();
1655 }
1656 }
1657 }
1658
1659 /* A setting containing the proportion of towns that grow twice as
1660 * fast was added in version 54. From version 56 this is now saved in the
1661 * town as cities can be built specifically in the scenario editor. */
1663 for (Town *t : Town::Iterate()) {
1664 if (_settings_game.economy.larger_towns != 0 && (t->index % _settings_game.economy.larger_towns) == 0) {
1665 t->larger_town = true;
1666 }
1667 }
1668 }
1669
1671 /* Added a FIFO queue of vehicles loading at stations */
1672 for (Vehicle *v : Vehicle::Iterate()) {
1673 if ((v->type != VEH_TRAIN || Train::From(v)->IsFrontEngine()) && // for all locs
1674 !v->vehstatus.Any({VehState::Stopped, VehState::Crashed}) && // not stopped or crashed
1675 v->current_order.IsType(OT_LOADING)) { // loading
1676 Station::Get(v->last_station_visited)->loading_vehicles.push_back(v);
1677
1678 /* The loading finished flag is *only* set when actually completely
1679 * finished. Because the vehicle is loading, it is not finished. */
1680 v->vehicle_flags.Reset(VehicleFlag::LoadingFinished);
1681 }
1682 }
1683 } else if (IsSavegameVersionBefore(SLV_59)) {
1684 /* For some reason non-loading vehicles could be in the station's loading vehicle list */
1685
1686 for (Station *st : Station::Iterate()) {
1687 for (auto iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end(); /* nothing */) {
1688 Vehicle *v = *iter;
1689 if (!v->current_order.IsType(OT_LOADING)) {
1690 iter = st->loading_vehicles.erase(iter);
1691 } else {
1692 ++iter;
1693 }
1694 }
1695 }
1696 }
1697
1699 /* Setting difficulty industry_density other than zero get bumped to +1
1700 * since a new option (very low at position 1) has been added */
1703 }
1704
1705 /* Same goes for number of towns, although no test is needed, just an increment */
1707 }
1708
1710 /* Since now we allow different signal types and variants on a single tile.
1711 * Move signal states to m4 to make room and clone the signal type/variant. */
1712 for (auto t : Map::Iterate()) {
1713 if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) {
1714 /* move signal states */
1715 SetSignalStates(t, GB(t.m2(), 4, 4));
1716 SB(t.m2(), 4, 4, 0);
1717 /* clone signal type and variant */
1718 SB(t.m2(), 4, 3, GB(t.m2(), 0, 3));
1719 }
1720 }
1721 }
1722
1724 /* In some old savegames a bit was cleared when it should not be cleared */
1725 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1726 if (rv->state == 250 || rv->state == 251) {
1727 SetBit(rv->state, 2);
1728 }
1729 }
1730 }
1731
1733 /* Added variables to support newindustries */
1734 for (Industry *i : Industry::Iterate()) i->founder = OWNER_NONE;
1735 }
1736
1737 /* From version 82, old style canals (above sealevel (0), WATER owner) are no longer supported.
1738 Replace the owner for those by OWNER_NONE. */
1740 for (const auto t : Map::Iterate()) {
1741 if (IsTileType(t, MP_WATER) &&
1743 GetTileOwner(t) == OWNER_WATER &&
1744 TileHeight(t) != 0) {
1746 }
1747 }
1748 }
1749
1750 /*
1751 * Add the 'previous' owner to the ship depots so we can reset it with
1752 * the correct values when it gets destroyed. This prevents that
1753 * someone can remove canals owned by somebody else and it prevents
1754 * making floods using the removal of ship depots.
1755 */
1757 for (auto t : Map::Iterate()) {
1758 if (IsShipDepotTile(t)) {
1759 t.m4() = (TileHeight(t) == 0 ? OWNER_WATER : OWNER_NONE).base();
1760 }
1761 }
1762 }
1763
1765 for (Station *st : Station::Iterate()) {
1766 for (GoodsEntry &ge : st->goods) {
1767 ge.last_speed = 0;
1768 if (ge.HasData() && ge.GetData().cargo.AvailableCount() != 0) ge.status.Set(GoodsEntry::State::Rating);
1769 }
1770 }
1771 }
1772
1773 /* At version 78, industry cargo types can be changed, and are stored with the industry. For older save versions
1774 * copy the IndustrySpec's cargo types over to the Industry. */
1776 for (Industry *i : Industry::Iterate()) {
1777 const IndustrySpec *indsp = GetIndustrySpec(i->type);
1778 for (uint j = 0; j < std::size(i->produced); j++) {
1779 i->produced[j].cargo = indsp->produced_cargo[j];
1780 }
1781 for (uint j = 0; j < std::size(i->accepted); j++) {
1782 i->accepted[j].cargo = indsp->accepts_cargo[j];
1783 }
1784 }
1785 }
1786
1787 /* Industry cargo slots were fixed size before (and including) SLV_VEHICLE_ECONOMY_AGE (either 2/3 or 16/16),
1788 * after this they are dynamic. Trim excess slots. */
1790 for (Industry *i : Industry::Iterate()) {
1792 }
1793 }
1794
1795 /* Before version 81, the density of grass was always stored as zero, and
1796 * grassy trees were always drawn fully grassy. Furthermore, trees on rough
1797 * land used to have zero density, now they have full density. Therefore,
1798 * make all grassy/rough land trees have a density of 3. */
1800 for (auto t : Map::Iterate()) {
1801 if (GetTileType(t) == MP_TREES) {
1802 TreeGround ground_type = (TreeGround)GB(t.m2(), 4, 2);
1803 if (ground_type != TREE_GROUND_SNOW_DESERT) SB(t.m2(), 6, 2, 3);
1804 }
1805 }
1806 }
1807
1808
1810 /* Rework of orders. */
1811 for (OrderList *orderlist : OrderList::Iterate()) {
1812 for (Order &o : orderlist->GetOrders()) {
1813 o.ConvertFromOldSavegame();
1814 }
1815 }
1816
1817 for (Vehicle *v : Vehicle::Iterate()) {
1818 if (v->orders != nullptr && v->GetFirstOrder() != nullptr && v->GetFirstOrder()->IsType(OT_NOTHING)) {
1819 v->orders->FreeChain();
1820 v->orders = nullptr;
1821 }
1822
1823 v->current_order.ConvertFromOldSavegame();
1824 if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->FirstShared() == v) {
1825 for (Order &order : v->Orders()) order.SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
1826 }
1827 }
1828 } else if (IsSavegameVersionBefore(SLV_94)) {
1829 /* Unload and transfer are now mutual exclusive. */
1830 for (OrderList *orderlist : OrderList::Iterate()) {
1831 for (Order &order : orderlist->GetOrders()) {
1832 if ((order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
1833 order.SetUnloadType(OUFB_TRANSFER);
1834 order.SetLoadType(OLFB_NO_LOAD);
1835 }
1836 }
1837 }
1838
1839 for (Vehicle *v : Vehicle::Iterate()) {
1840 if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) {
1841 v->current_order.SetUnloadType(OUFB_TRANSFER);
1842 v->current_order.SetLoadType(OLFB_NO_LOAD);
1843 }
1844 }
1846 /* OrderDepotActionFlags were moved, instead of starting at bit 4 they now start at bit 3. */
1847 for (OrderList *orderlist : OrderList::Iterate()) {
1848 for (Order &order : orderlist->GetOrders()) {
1849 if (!order.IsType(OT_GOTO_DEPOT)) continue;
1850 order.SetDepotActionType((OrderDepotActionFlags)(order.GetDepotActionType() >> 1));
1851 }
1852 }
1853
1854 for (Vehicle *v : Vehicle::Iterate()) {
1855 if (!v->current_order.IsType(OT_GOTO_DEPOT)) continue;
1856 v->current_order.SetDepotActionType((OrderDepotActionFlags)(v->current_order.GetDepotActionType() >> 1));
1857 }
1858 }
1859
1860 /* The water class was moved/unified. */
1862 for (auto t : Map::Iterate()) {
1863 switch (GetTileType(t)) {
1864 case MP_STATION:
1865 switch (GetStationType(t)) {
1866 case StationType::Oilrig:
1867 case StationType::Dock:
1868 case StationType::Buoy:
1869 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1870 SB(t.m3(), 0, 2, 0);
1871 break;
1872
1873 default:
1875 break;
1876 }
1877 break;
1878
1879 case MP_WATER:
1880 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1881 SB(t.m3(), 0, 2, 0);
1882 break;
1883
1884 case MP_OBJECT:
1886 break;
1887
1888 default:
1889 /* No water class. */
1890 break;
1891 }
1892 }
1893 }
1894
1896 for (auto t : Map::Iterate()) {
1897 /* Move river flag and update canals to use water class */
1898 if (IsTileType(t, MP_WATER)) {
1899 if (GetWaterClass(t) != WATER_CLASS_RIVER) {
1900 if (IsWater(t)) {
1901 Owner o = GetTileOwner(t);
1902 if (o == OWNER_WATER) {
1903 MakeSea(t);
1904 } else {
1905 MakeCanal(t, o, Random());
1906 }
1907 } else if (IsShipDepot(t)) {
1908 Owner o = (Owner)t.m4(); // Original water owner
1910 }
1911 }
1912 }
1913 }
1914
1915 /* Update locks, depots, docks and buoys to have a water class based
1916 * on its neighbouring tiles. Done after river and canal updates to
1917 * ensure neighbours are correct. */
1918 for (const auto t : Map::Iterate()) {
1919 if (!IsTileFlat(t)) continue;
1920
1923 }
1924 }
1925
1927 for (const auto t : Map::Iterate()) {
1928 /* skip oil rigs at borders! */
1929 if ((IsTileType(t, MP_WATER) || IsBuoyTile(t)) &&
1930 (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1)) {
1931 /* Some version 86 savegames have wrong water class at map borders (under buoy, or after removing buoy).
1932 * This conversion has to be done before buoys with invalid owner are removed. */
1934 }
1935
1937 Owner o = GetTileOwner(t);
1938 if (o < MAX_COMPANIES && !Company::IsValidID(o)) {
1939 Backup<CompanyID> cur_company(_current_company, o);
1941 cur_company.Restore();
1942 }
1943 if (IsBuoyTile(t)) {
1944 /* reset buoy owner to OWNER_NONE in the station struct
1945 * (even if it is owned by active company) */
1947 }
1948 } else if (IsTileType(t, MP_ROAD)) {
1949 /* works for all RoadTileType */
1950 for (RoadTramType rtt : _roadtramtypes) {
1951 /* update even non-existing road types to update tile owner too */
1952 Owner o = GetRoadOwner(t, rtt);
1953 if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
1954 }
1955 if (IsLevelCrossing(t)) {
1957 }
1958 } else if (IsPlainRailTile(t)) {
1960 }
1961 }
1962 }
1963
1965 /* Profits are now with 8 bit fract */
1966 for (Vehicle *v : Vehicle::Iterate()) {
1967 v->profit_this_year <<= 8;
1968 v->profit_last_year <<= 8;
1969 v->running_ticks = 0;
1970 }
1971 }
1972
1974 /* Increase HouseAnimationFrame from 5 to 7 bits */
1975 for (auto t : Map::Iterate()) {
1977 SB(t.m6(), 2, 6, GB(t.m6(), 3, 5));
1978 SB(t.m3(), 5, 1, 0);
1979 }
1980 }
1981 }
1982
1984 GroupStatistics::UpdateAfterLoad(); // Ensure statistics pool is initialised before trying to delete vehicles
1985 /* Remove all trams from savegames without tram support.
1986 * There would be trams without tram track under causing crashes sooner or later. */
1987 for (RoadVehicle *v : RoadVehicle::Iterate()) {
1988 if (v->First() == v && EngInfo(v->engine_type)->misc_flags.Test(EngineMiscFlag::RoadIsTram)) {
1989 ShowErrorMessage(GetEncodedString(STR_WARNING_LOADGAME_REMOVED_TRAMS), {}, WL_CRITICAL);
1990 delete v;
1991 }
1992 }
1993 }
1994
1996 for (auto t : Map::Iterate()) {
1997 /* Set newly introduced WaterClass of industry tiles */
1998 if (IsTileType(t, MP_STATION) && IsOilRig(t)) {
2000 }
2001 if (IsTileType(t, MP_INDUSTRY)) {
2004 } else {
2006 }
2007 }
2008
2009 /* Replace "house construction year" with "house age" */
2010 if (IsTileType(t, MP_HOUSE) && IsHouseCompleted(t)) {
2011 t.m5() = ClampTo<uint8_t>(TimerGameCalendar::year - (CalendarTime::ORIGINAL_BASE_YEAR + t.m5()));
2012 }
2013 }
2014 }
2015
2016 /* Move the signal variant back up one bit for PBS. We don't convert the old PBS
2017 * format here, as an old layout wouldn't work properly anyway. To be safe, we
2018 * clear any possible PBS reservations as well. */
2020 for (auto t : Map::Iterate()) {
2021 switch (GetTileType(t)) {
2022 case MP_RAILWAY:
2023 if (HasSignals(t)) {
2024 /* move the signal variant */
2025 SetSignalVariant(t, TRACK_UPPER, HasBit(t.m2(), 2) ? SIG_SEMAPHORE : SIG_ELECTRIC);
2026 SetSignalVariant(t, TRACK_LOWER, HasBit(t.m2(), 6) ? SIG_SEMAPHORE : SIG_ELECTRIC);
2027 ClrBit(t.m2(), 2);
2028 ClrBit(t.m2(), 6);
2029 }
2030
2031 /* Clear PBS reservation on track */
2032 if (IsRailDepot(t)) {
2033 SetDepotReservation(t, false);
2034 } else {
2036 }
2037 break;
2038
2039 case MP_ROAD: // Clear PBS reservation on crossing
2040 if (IsLevelCrossing(t)) SetCrossingReservation(t, false);
2041 break;
2042
2043 case MP_STATION: // Clear PBS reservation on station
2044 if (HasStationRail(t)) SetRailStationReservation(t, false);
2045 break;
2046
2047 case MP_TUNNELBRIDGE: // Clear PBS reservation on tunnels/bridges
2049 break;
2050
2051 default: break;
2052 }
2053 }
2054 }
2055
2056 /* Reserve all tracks trains are currently on. */
2058 for (const Train *t : Train::Iterate()) {
2059 if (t->First() == t) t->ReserveTrackUnderConsist();
2060 }
2061 }
2062
2064 /* Non-town-owned roads now store the closest town */
2066
2067 /* signs with invalid owner left from older savegames */
2068 for (Sign *si : Sign::Iterate()) {
2069 if (si->owner != OWNER_NONE && !Company::IsValidID(si->owner)) si->owner = OWNER_NONE;
2070 }
2071
2072 /* Station can get named based on an industry type, but the current ones
2073 * are not, so mark them as if they are not named by an industry. */
2074 for (Station *st : Station::Iterate()) {
2075 st->indtype = IT_INVALID;
2076 }
2077 }
2078
2080 for (Aircraft *a : Aircraft::Iterate()) {
2081 /* Set engine_type of shadow and rotor */
2082 if (!a->IsNormalAircraft()) {
2083 a->engine_type = a->First()->engine_type;
2084 }
2085 }
2086
2087 /* More companies ... */
2088 for (Company *c : Company::Iterate()) {
2089 if (c->bankrupt_asked.base() == 0xFF) c->bankrupt_asked.Set();
2090 }
2091
2092 for (Engine *e : Engine::Iterate()) {
2093 if (e->company_avail.base() == 0xFF) e->company_avail.Set();
2094 }
2095
2096 for (Town *t : Town::Iterate()) {
2097 if (t->have_ratings.base() == 0xFF) t->have_ratings.Set();
2098 for (uint i = 8; i != MAX_COMPANIES; i++) t->ratings[i] = RATING_INITIAL;
2099 }
2100 }
2101
2103 for (auto t : Map::Iterate()) {
2104 /* Check for HQ bit being set, instead of using map accessor,
2105 * since we've already changed it code-wise */
2106 if (IsTileType(t, MP_OBJECT) && HasBit(t.m5(), 7)) {
2107 /* Move size and part identification of HQ out of the m5 attribute,
2108 * on new locations */
2109 t.m3() = GB(t.m5(), 0, 5);
2110 t.m5() = OBJECT_HQ;
2111 }
2112 }
2113 }
2115 for (auto t : Map::Iterate()) {
2116 if (!IsTileType(t, MP_OBJECT)) continue;
2117
2118 /* Reordering/generalisation of the object bits. */
2119 ObjectType type = t.m5();
2120 SB(t.m6(), 2, 4, type == OBJECT_HQ ? GB(t.m3(), 2, 3) : 0);
2121 t.m3() = type == OBJECT_HQ ? GB(t.m3(), 1, 1) | GB(t.m3(), 0, 1) << 4 : 0;
2122
2123 /* Make sure those bits are clear as well! */
2124 t.m4() = 0;
2125 t.m7() = 0;
2126 }
2127 }
2128
2130 /* Make real objects for object tiles. */
2131 for (auto t : Map::Iterate()) {
2132 if (!IsTileType(t, MP_OBJECT)) continue;
2133
2134 if (Town::GetNumItems() == 0) {
2135 /* No towns, so remove all objects! */
2136 DoClearSquare(t);
2137 } else {
2138 uint offset = t.m3();
2139
2140 /* Also move the animation state. */
2141 t.m3() = GB(t.m6(), 2, 4);
2142 SB(t.m6(), 2, 4, 0);
2143
2144 if (offset == 0) {
2145 /* No offset, so make the object. */
2146 ObjectType type = t.m5();
2147 int size = type == OBJECT_HQ ? 2 : 1;
2148
2149 if (!Object::CanAllocateItem()) {
2150 /* Nice... you managed to place 64k lighthouses and
2151 * antennae on the map... boohoo. */
2152 SlError(STR_ERROR_TOO_MANY_OBJECTS);
2153 }
2154
2155 Object *o = new Object();
2156 o->location.tile = (TileIndex)t;
2157 o->location.w = size;
2158 o->location.h = size;
2160 o->town = type == OBJECT_STATUE ? Town::Get(t.m2()) : CalcClosestTownFromTile(t, UINT_MAX);
2161 t.m2() = o->index.base();
2163 } else {
2164 /* We're at an offset, so get the ID from our "root". */
2165 Tile northern_tile = t - TileXY(GB(offset, 0, 4), GB(offset, 4, 4));
2166 assert(IsTileType(northern_tile, MP_OBJECT));
2167 t.m2() = northern_tile.m2();
2168 }
2169 }
2170 }
2171 }
2172
2174 /* allow_town_roads is added, set it if town_layout wasn't TL_NO_ROADS */
2175 if (_settings_game.economy.town_layout == 0) { // was TL_NO_ROADS
2178 } else {
2181 }
2182
2183 /* Initialize layout of all towns. Older versions were using different
2184 * generator for random town layout, use it if needed. */
2185 for (Town *t : Town::Iterate()) {
2188 continue;
2189 }
2190
2191 /* Use old layout randomizer code */
2192 uint8_t layout = TileHash(TileX(t->xy), TileY(t->xy)) % 6;
2193 switch (layout) {
2194 default: break;
2195 case 5: layout = 1; break;
2196 case 0: layout = 2; break;
2197 }
2198 t->layout = static_cast<TownLayout>(layout - 1);
2199 }
2200 }
2201
2203 /* There could be (deleted) stations with invalid owner, set owner to OWNER NONE.
2204 * The conversion affects oil rigs and buoys too, but it doesn't matter as
2205 * they have st->owner == OWNER_NONE already. */
2206 for (Station *st : Station::Iterate()) {
2207 if (!Company::IsValidID(st->owner)) st->owner = OWNER_NONE;
2208 }
2209 }
2210
2211 /* Trains could now stop in a specific location. */
2213 for (OrderList *orderlist : OrderList::Iterate()) {
2214 for (Order &o : orderlist->GetOrders()) {
2215 if (o.IsType(OT_GOTO_STATION)) o.SetStopLocation(OSL_PLATFORM_FAR_END);
2216 }
2217 }
2218 }
2219
2222 for (Company *c : Company::Iterate()) {
2223 c->settings.vehicle = _old_vds;
2224 }
2225 }
2226
2228 /* Delete small ufos heading for non-existing vehicles */
2230 if (v->subtype == 2 /* ST_SMALL_UFO */ && v->state != 0) {
2231 const Vehicle *u = Vehicle::GetIfValid(v->dest_tile.base());
2232 if (u == nullptr || u->type != VEH_ROAD || !RoadVehicle::From(u)->IsFrontEngine()) {
2233 delete v;
2234 }
2235 }
2236 }
2237
2238 /* We didn't store cargo payment yet, so make them for vehicles that are
2239 * currently at a station and loading/unloading. If they don't get any
2240 * payment anymore they just removed in the next load/unload cycle.
2241 * However, some 0.7 versions might have cargo payment. For those we just
2242 * add cargopayment for the vehicles that don't have it.
2243 */
2244 for (Station *st : Station::Iterate()) {
2245 for (Vehicle *v : st->loading_vehicles) {
2246 /* There are always as many CargoPayments as Vehicles. We need to make the
2247 * assert() in Pool::GetNew() happy by calling CanAllocateItem(). */
2250 if (v->cargo_payment == nullptr) v->cargo_payment = new CargoPayment(v);
2251 }
2252 }
2253 }
2254
2256 /* Animated tiles would sometimes not be actually animated or
2257 * in case of old savegames duplicate. */
2258
2259 extern std::vector<TileIndex> _animated_tiles;
2260
2261 for (auto tile = _animated_tiles.begin(); tile < _animated_tiles.end(); /* Nothing */) {
2262 /* Remove if tile is not animated */
2263 bool remove = !MayAnimateTile(*tile);
2264
2265 /* and remove if duplicate */
2266 for (auto j = _animated_tiles.begin(); !remove && j < tile; j++) {
2267 remove = *tile == *j;
2268 }
2269
2270 if (remove) {
2271 tile = _animated_tiles.erase(tile);
2272 } else {
2273 tile++;
2274 }
2275 }
2276 }
2277
2279 for (auto t : Map::Iterate()) {
2280 if (!IsTileType(t, MP_WATER)) continue;
2281 SetNonFloodingWaterTile(t, false);
2282 }
2283 }
2284
2286 /* Animated tile state is stored in the map array, allowing
2287 * quicker addition and deletion of animated tiles. */
2288
2289 extern std::vector<TileIndex> _animated_tiles;
2290
2291 for (auto t : Map::Iterate()) {
2292 /* Ensure there is no spurious animated tile state. */
2294 }
2295
2296 /* Set animated flag for all valid animated tiles. */
2297 for (const TileIndex &tile : _animated_tiles) {
2299 }
2300 }
2301
2303 /* The train station tile area was added, but for really old (TTDPatch) it's already valid. */
2304 for (Waypoint *wp : Waypoint::Iterate()) {
2305 if (wp->facilities.Test(StationFacility::Train)) {
2306 wp->train_station.tile = wp->xy;
2307 wp->train_station.w = 1;
2308 wp->train_station.h = 1;
2309 } else {
2310 wp->train_station.tile = INVALID_TILE;
2311 wp->train_station.w = 0;
2312 wp->train_station.h = 0;
2313 }
2314 }
2315 }
2316
2318 /* Convert old subsidies */
2319 for (Subsidy *s : Subsidy::Iterate()) {
2320 if (s->remaining < 12) {
2321 /* Converting nonawarded subsidy */
2322 s->remaining = 12 - s->remaining; // convert "age" to "remaining"
2323 s->awarded = CompanyID::Invalid(); // not awarded to anyone
2324 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2325 switch (cs->town_acceptance_effect) {
2326 case TAE_PASSENGERS:
2327 case TAE_MAIL:
2328 /* Town -> Town */
2329 s->src.type = s->dst.type = SourceType::Town;
2330 if (Town::IsValidID(s->src.ToTownID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2331 break;
2332 case TAE_GOODS:
2333 case TAE_FOOD:
2334 /* Industry -> Town */
2335 s->src.type = SourceType::Industry;
2336 s->dst.type = SourceType::Town;
2337 if (Industry::IsValidID(s->src.ToIndustryID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2338 break;
2339 default:
2340 /* Industry -> Industry */
2341 s->src.type = s->dst.type = SourceType::Industry;
2342 if (Industry::IsValidID(s->src.ToIndustryID()) && Industry::IsValidID(s->dst.ToIndustryID())) continue;
2343 break;
2344 }
2345 } else {
2346 /* Do our best for awarded subsidies. The original source or destination industry
2347 * can't be determined anymore for awarded subsidies, so invalidate them.
2348 * Town -> Town subsidies are converted using simple heuristic */
2349 s->remaining = 24 - s->remaining; // convert "age of awarded subsidy" to "remaining"
2350 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2351 switch (cs->town_acceptance_effect) {
2352 case TAE_PASSENGERS:
2353 case TAE_MAIL: {
2354 /* Town -> Town */
2355 const Station *ss = Station::GetIfValid(s->src.id);
2356 const Station *sd = Station::GetIfValid(s->dst.id);
2357 if (ss != nullptr && sd != nullptr && ss->owner == sd->owner &&
2359 s->src.type = s->dst.type = SourceType::Town;
2360 s->src.SetIndex(ss->town->index);
2361 s->dst.SetIndex(sd->town->index);
2362 s->awarded = ss->owner;
2363 continue;
2364 }
2365 break;
2366 }
2367 default:
2368 break;
2369 }
2370 }
2371 /* Awarded non-town subsidy or invalid source/destination, invalidate */
2372 delete s;
2373 }
2374 }
2375
2377 /* Recompute inflation based on old unround loan limit
2378 * Note: Max loan is 500000. With an inflation of 4% across 170 years
2379 * that results in a max loan of about 0.7 * 2^31.
2380 * So taking the 16 bit fractional part into account there are plenty of bits left
2381 * for unmodified savegames ...
2382 */
2383 uint64_t aimed_inflation = (_economy.old_max_loan_unround << 16 | _economy.old_max_loan_unround_fract) / _settings_game.difficulty.max_loan;
2384
2385 /* ... well, just clamp it then. */
2386 if (aimed_inflation > MAX_INFLATION) aimed_inflation = MAX_INFLATION;
2387
2388 /* Simulate the inflation, so we also get the payment inflation */
2389 while (_economy.inflation_prices < aimed_inflation) {
2390 if (AddInflation(false)) break;
2391 }
2392 }
2393
2395 for (const Depot *d : Depot::Iterate()) {
2396 Tile tile = d->xy;
2397 /* At some point, invalid depots were saved into the game (possibly those removed in the past?)
2398 * Remove them here, so they don't cause issues further down the line */
2399 if (!IsDepotTile(tile)) {
2400 Debug(sl, 0, "Removing invalid depot {} at {}, {}", d->index, TileX(d->xy), TileY(d->xy));
2401 delete d;
2402 d = nullptr;
2403 continue;
2404 }
2405 tile.m2() = d->index.base();
2406 if (IsTileType(tile, MP_WATER)) Tile(GetOtherShipDepotTile(tile)).m2() = d->index.base();
2407 }
2408 }
2409
2410 /* The behaviour of force_proceed has been changed. Now
2411 * it counts signals instead of some random time out. */
2413 for (Train *t : Train::Iterate()) {
2414 if (t->force_proceed != TFP_NONE) {
2415 t->force_proceed = TFP_STUCK;
2416 }
2417 }
2418 }
2419
2420 /* The bits for the tree ground and tree density have
2421 * been swapped (m2 bits 7..6 and 5..4. */
2423 for (auto t : Map::Iterate()) {
2424 if (IsTileType(t, MP_CLEAR)) {
2425 if (GetClearGround(t) == CLEAR_SNOW) { // CLEAR_SNOW becomes CLEAR_GRASS with IsSnowTile() set.
2427 SetBit(t.m3(), 4);
2428 } else {
2429 ClrBit(t.m3(), 4);
2430 }
2431 }
2432 if (IsTileType(t, MP_TREES)) {
2433 uint density = GB(t.m2(), 6, 2);
2434 uint ground = GB(t.m2(), 4, 2);
2435 t.m2() = ground << 6 | density << 4;
2436 }
2437 }
2438 }
2439
2440 /* Wait counter and load/unload ticks got split. */
2442 for (Aircraft *a : Aircraft::Iterate()) {
2443 a->turn_counter = a->current_order.IsType(OT_LOADING) ? 0 : a->load_unload_ticks;
2444 }
2445
2446 for (Train *t : Train::Iterate()) {
2447 t->wait_counter = t->current_order.IsType(OT_LOADING) ? 0 : t->load_unload_ticks;
2448 }
2449 }
2450
2451 /* Airport tile animation uses animation frame instead of other graphics id */
2453 struct AirportTileConversion {
2454 uint8_t old_start;
2455 uint8_t num_frames;
2456 };
2457 static const AirportTileConversion atcs[] = {
2458 {31, 12}, // APT_RADAR_GRASS_FENCE_SW
2459 {50, 4}, // APT_GRASS_FENCE_NE_FLAG
2460 {62, 2}, // 1 unused tile
2461 {66, 12}, // APT_RADAR_FENCE_SW
2462 {78, 12}, // APT_RADAR_FENCE_NE
2463 {101, 10}, // 9 unused tiles
2464 {111, 8}, // 7 unused tiles
2465 {119, 15}, // 14 unused tiles (radar)
2466 {140, 4}, // APT_GRASS_FENCE_NE_FLAG_2
2467 };
2468 for (const auto t : Map::Iterate()) {
2469 if (IsAirportTile(t)) {
2470 StationGfx old_gfx = GetStationGfx(t);
2471 uint8_t offset = 0;
2472 for (const auto &atc : atcs) {
2473 if (old_gfx < atc.old_start) {
2474 SetStationGfx(t, old_gfx - offset);
2475 break;
2476 }
2477 if (old_gfx < atc.old_start + atc.num_frames) {
2478 SetAnimationFrame(t, old_gfx - atc.old_start);
2479 SetStationGfx(t, atc.old_start - offset);
2480 break;
2481 }
2482 offset += atc.num_frames - 1;
2483 }
2484 }
2485 }
2486 }
2487
2488 /* Oilrig was moved from id 15 to 9. */
2490 for (Station *st : Station::Iterate()) {
2491 if (st->airport.tile != INVALID_TILE && st->airport.type == 15) {
2492 st->airport.type = AT_OILRIG;
2493 }
2494 }
2495 }
2496
2498 for (Station *st : Station::Iterate()) {
2499 if (st->airport.tile != INVALID_TILE) {
2500 st->airport.w = st->airport.GetSpec()->size_x;
2501 st->airport.h = st->airport.GetSpec()->size_y;
2502 }
2503 }
2504 }
2505
2507 for (const auto t : Map::Iterate()) {
2508 /* Reset tropic zone for VOID tiles, they shall not have any. */
2510 }
2511
2512 /* We need to properly number/name the depots.
2513 * The first step is making sure none of the depots uses the
2514 * 'default' names, after that we can assign the names. */
2515 for (Depot *d : Depot::Iterate()) d->town_cn = UINT16_MAX;
2516
2517 for (Depot *d : Depot::Iterate()) MakeDefaultName(d);
2518 }
2519
2521 for (Depot *d : Depot::Iterate()) d->build_date = TimerGameCalendar::date;
2522 }
2523
2525 for (Station *st : Station::Iterate()) {
2526 if (st->facilities.Test(StationFacility::Airport)) st->airport.rotation = DIR_N;
2527 }
2528 }
2529
2530 /* In old versions it was possible to remove an airport while a plane was
2531 * taking off or landing. This gives all kind of problems when building
2532 * another airport in the same station so we don't allow that anymore.
2533 * For old savegames with such aircraft we just throw them in the air and
2534 * treat the aircraft like they were flying already. */
2536 for (Aircraft *v : Aircraft::Iterate()) {
2537 if (!v->IsNormalAircraft()) continue;
2539 if (st == nullptr && v->state != FLYING) {
2540 v->state = FLYING;
2543 /* get aircraft back on running altitude */
2544 if (!v->vehstatus.Test(VehState::Crashed)) {
2545 GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
2546 SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
2547 }
2548 }
2549 }
2550 }
2551
2552 /* Move the animation frame to the same location (m7) for all objects. */
2554 for (auto t : Map::Iterate()) {
2555 switch (GetTileType(t)) {
2556 case MP_HOUSE:
2557 if (GetHouseType(t) >= NEW_HOUSE_OFFSET) {
2558 uint per_proc = t.m7();
2559 t.m7() = GB(t.m6(), 2, 6) | (GB(t.m3(), 5, 1) << 6);
2560 SB(t.m3(), 5, 1, 0);
2561 SB(t.m6(), 2, 6, std::min(per_proc, 63U));
2562 }
2563 break;
2564
2565 case MP_INDUSTRY: {
2566 uint rand = t.m7();
2567 t.m7() = t.m3();
2568 t.m3() = rand;
2569 break;
2570 }
2571
2572 case MP_OBJECT:
2573 t.m7() = t.m3();
2574 t.m3() = 0;
2575 break;
2576
2577 default:
2578 /* For stations/airports it's already at m7 */
2579 break;
2580 }
2581 }
2582 }
2583
2584 /* Add (random) colour to all objects. */
2586 for (Object *o : Object::Iterate()) {
2587 Owner owner = GetTileOwner(o->location.tile);
2588 o->colour = (owner == OWNER_NONE) ? static_cast<Colours>(GB(Random(), 0, 4)) : Company::Get(owner)->livery[0].colour1;
2589 }
2590 }
2591
2593 for (const auto t : Map::Iterate()) {
2594 if (!IsTileType(t, MP_STATION)) continue;
2595 if (!IsBuoy(t) && !IsOilRig(t) && !(IsDock(t) && IsTileFlat(t))) {
2597 }
2598 }
2599
2600 /* Waypoints with custom name may have a non-unique town_cn,
2601 * renumber those. First set all affected waypoints to the
2602 * highest possible number to get them numbered in the
2603 * order they have in the pool. */
2604 for (Waypoint *wp : Waypoint::Iterate()) {
2605 if (!wp->name.empty()) wp->town_cn = UINT16_MAX;
2606 }
2607
2608 for (Waypoint *wp : Waypoint::Iterate()) {
2609 if (!wp->name.empty()) MakeDefaultName(wp);
2610 }
2611 }
2612
2614 _industry_builder.Reset(); // Initialize industry build data.
2615
2616 /* The moment vehicles go from hidden to visible changed. This means
2617 * that vehicles don't always get visible anymore causing things to
2618 * get messed up just after loading the savegame. This fixes that. */
2619 for (Vehicle *v : Vehicle::Iterate()) {
2620 /* Not all vehicle types can be inside a tunnel. Furthermore,
2621 * testing IsTunnelTile() for invalid tiles causes a crash. */
2622 if (!v->IsGroundVehicle()) continue;
2623
2624 /* Is the vehicle in a tunnel? */
2625 if (!IsTunnelTile(v->tile)) continue;
2626
2627 /* Is the vehicle actually at a tunnel entrance/exit? */
2628 TileIndex vtile = TileVirtXY(v->x_pos, v->y_pos);
2629 if (!IsTunnelTile(vtile)) continue;
2630
2631 /* Are we actually in this tunnel? Or maybe a lower tunnel? */
2632 if (GetSlopePixelZ(v->x_pos, v->y_pos, true) != v->z_pos) continue;
2633
2634 /* What way are we going? */
2635 const DiagDirection dir = GetTunnelBridgeDirection(vtile);
2636 const DiagDirection vdir = DirToDiagDir(v->direction);
2637
2638 /* Have we passed the visibility "switch" state already? */
2639 uint8_t pos = (DiagDirToAxis(vdir) == AXIS_X ? v->x_pos : v->y_pos) & TILE_UNIT_MASK;
2640 uint8_t frame = (vdir == DIAGDIR_NE || vdir == DIAGDIR_NW) ? TILE_SIZE - 1 - pos : pos;
2641 extern const uint8_t _tunnel_visibility_frame[DIAGDIR_END];
2642
2643 /* Should the vehicle be hidden or not? */
2644 bool hidden;
2645 if (dir == vdir) { // Entering tunnel
2646 hidden = frame >= _tunnel_visibility_frame[dir];
2647 v->tile = vtile;
2648 } else if (dir == ReverseDiagDir(vdir)) { // Leaving tunnel
2649 hidden = frame < TILE_SIZE - _tunnel_visibility_frame[dir];
2650 /* v->tile changes at the moment when the vehicle leaves the tunnel. */
2651 v->tile = hidden ? GetOtherTunnelBridgeEnd(vtile) : vtile;
2652 } else {
2653 /* We could get here in two cases:
2654 * - for road vehicles, it is reversing at the end of the tunnel
2655 * - it is crashed in the tunnel entry (both train or RV destroyed by UFO)
2656 * Whatever case it is, do not change anything and use the old values.
2657 * Especially changing RV's state would break its reversing in the middle. */
2658 continue;
2659 }
2660
2661 if (hidden) {
2662 v->vehstatus.Set(VehState::Hidden);
2663
2664 switch (v->type) {
2665 case VEH_TRAIN: Train::From(v)->track = TRACK_BIT_WORMHOLE; break;
2666 case VEH_ROAD: RoadVehicle::From(v)->state = RVSB_WORMHOLE; break;
2667 default: NOT_REACHED();
2668 }
2669 } else {
2670 v->vehstatus.Reset(VehState::Hidden);
2671
2672 switch (v->type) {
2673 case VEH_TRAIN: Train::From(v)->track = DiagDirToDiagTrackBits(vdir); break;
2674 case VEH_ROAD: RoadVehicle::From(v)->state = DiagDirToDiagTrackdir(vdir); RoadVehicle::From(v)->frame = frame; break;
2675 default: NOT_REACHED();
2676 }
2677 }
2678 }
2679 }
2680
2682 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
2683 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) continue;
2684
2685 bool loading = rv->current_order.IsType(OT_LOADING) || rv->current_order.IsType(OT_LEAVESTATION);
2686 if (HasBit(rv->state, RVS_IN_ROAD_STOP)) {
2687 extern const uint8_t _road_stop_stop_frame[];
2688 SB(rv->state, RVS_ENTERED_STOP, 1, loading || rv->frame > _road_stop_stop_frame[rv->state - RVSB_IN_ROAD_STOP + (_settings_game.vehicle.road_side << RVS_DRIVE_SIDE)]);
2689 } else if (HasBit(rv->state, RVS_IN_DT_ROAD_STOP)) {
2690 SB(rv->state, RVS_ENTERED_STOP, 1, loading || rv->frame > RVC_DRIVE_THROUGH_STOP_FRAME);
2691 }
2692 }
2693 }
2694
2696 /* The train's pathfinder lost flag got moved. */
2697 for (Train *t : Train::Iterate()) {
2698 if (!t->flags.Test(VehicleRailFlag{5})) continue;
2699
2700 t->flags.Reset(VehicleRailFlag{5});
2701 t->vehicle_flags.Set(VehicleFlag::PathfinderLost);
2702 }
2703
2704 /* Introduced terraform/clear limits. */
2705 for (Company *c : Company::Iterate()) {
2706 c->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
2707 c->clear_limit = _settings_game.construction.clear_frame_burst << 16;
2708 }
2709 }
2710
2711
2713 /*
2714 * The logic of GetPartialPixelZ has been changed, so the resulting Zs on
2715 * the map are consistent. This requires that the Z position of some
2716 * vehicles is updated to reflect this new situation.
2717 *
2718 * This needs to be before SLV_158, because that performs asserts using
2719 * GetSlopePixelZ which internally uses GetPartialPixelZ.
2720 */
2721 for (Vehicle *v : Vehicle::Iterate()) {
2722 if (v->IsGroundVehicle() && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2723 /* Vehicle is on the ground, and not in a wormhole. */
2724 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2725 }
2726 }
2727 }
2728
2730 for (Vehicle *v : Vehicle::Iterate()) {
2731 switch (v->type) {
2732 case VEH_TRAIN: {
2733 Train *t = Train::From(v);
2734
2735 /* Clear old GOINGUP / GOINGDOWN flags.
2736 * It was changed in savegame version 139, but savegame
2737 * version 158 doesn't use these bits, so it doesn't hurt
2738 * to clear them unconditionally. */
2739 t->flags.Reset(VehicleRailFlag{1});
2740 t->flags.Reset(VehicleRailFlag{2});
2741
2742 /* Clear both bits first. */
2745
2746 /* Crashed vehicles can't be going up/down. */
2747 if (t->vehstatus.Test(VehState::Crashed)) break;
2748
2749 /* Only X/Y tracks can be sloped. */
2750 if (t->track != TRACK_BIT_X && t->track != TRACK_BIT_Y) break;
2751
2753 break;
2754 }
2755 case VEH_ROAD: {
2759
2760 /* Crashed vehicles can't be going up/down. */
2761 if (rv->vehstatus.Test(VehState::Crashed)) break;
2762
2763 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break;
2764
2765 TrackStatus ts = GetTileTrackStatus(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype));
2766 TrackBits trackbits = TrackStatusToTrackBits(ts);
2767
2768 /* Only X/Y tracks can be sloped. */
2769 if (trackbits != TRACK_BIT_X && trackbits != TRACK_BIT_Y) break;
2770
2771 Direction dir = rv->direction;
2772
2773 /* Test if we are reversing. */
2774 Axis a = trackbits == TRACK_BIT_X ? AXIS_X : AXIS_Y;
2775 if (AxisToDirection(a) != dir &&
2776 AxisToDirection(a) != ReverseDir(dir)) {
2777 /* When reversing, the road vehicle is on the edge of the tile,
2778 * so it can be safely compared to the middle of the tile. */
2779 dir = INVALID_DIR;
2780 }
2781
2782 rv->gv_flags |= FixVehicleInclination(rv, dir);
2783 break;
2784 }
2785 case VEH_SHIP:
2786 break;
2787
2788 default:
2789 continue;
2790 }
2791
2792 if (IsBridgeTile(v->tile) && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2793 /* In old versions, z_pos was 1 unit lower on bridge heads.
2794 * However, this invalid state could be converted to new savegames
2795 * by loading and saving the game in a new version. */
2796 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2798 if (v->type == VEH_TRAIN && !v->vehstatus.Test(VehState::Crashed) &&
2799 v->direction != DiagDirToDir(dir)) {
2800 /* If the train has left the bridge, it shouldn't have
2801 * track == TRACK_BIT_WORMHOLE - this could happen
2802 * when the train was reversed while on the last "tick"
2803 * on the ramp before leaving the ramp to the bridge. */
2804 Train::From(v)->track = DiagDirToDiagTrackBits(dir);
2805 }
2806 }
2807
2808 /* If the vehicle is really above v->tile (not in a wormhole),
2809 * it should have set v->z_pos correctly. */
2810 assert(v->tile != TileVirtXY(v->x_pos, v->y_pos) || v->z_pos == GetSlopePixelZ(v->x_pos, v->y_pos, true));
2811 }
2812
2813 /* Fill Vehicle::cur_real_order_index */
2814 for (Vehicle *v : Vehicle::Iterate()) {
2815 if (!v->IsPrimaryVehicle()) continue;
2816
2817 /* Older versions are less strict with indices being in range and fix them on the fly */
2818 if (v->cur_implicit_order_index >= v->GetNumOrders()) v->cur_implicit_order_index = 0;
2819
2820 v->cur_real_order_index = v->cur_implicit_order_index;
2821 v->UpdateRealOrderIndex();
2822 }
2823 }
2824
2826 /* If the savegame is old (before version 100), then the value of 255
2827 * for these settings did not mean "disabled". As such everything
2828 * before then did reverse.
2829 * To simplify stuff we disable all turning around or we do not
2830 * disable anything at all. So, if some reversing was disabled we
2831 * will keep reversing disabled, otherwise it'll be turned on. */
2833
2834 for (Train *t : Train::Iterate()) {
2835 _settings_game.vehicle.max_train_length = std::max<uint8_t>(_settings_game.vehicle.max_train_length, CeilDiv(t->gcache.cached_total_length, TILE_SIZE));
2836 }
2837 }
2838
2840 /* Setting difficulty industry_density other than zero get bumped to +1
2841 * since a new option (minimal at position 1) has been added */
2844 }
2845 }
2846
2848 /* Before savegame version 161, persistent storages were not stored in a pool. */
2849
2851 for (Industry *ind : Industry::Iterate()) {
2852 assert(ind->psa != nullptr);
2853
2854 /* Check if the old storage was empty. */
2855 bool is_empty = true;
2856 for (uint i = 0; i < sizeof(ind->psa->storage); i++) {
2857 if (ind->psa->GetValue(i) != 0) {
2858 is_empty = false;
2859 break;
2860 }
2861 }
2862
2863 if (!is_empty) {
2864 ind->psa->grfid = _industry_mngr.GetGRFID(ind->type);
2865 } else {
2866 delete ind->psa;
2867 ind->psa = nullptr;
2868 }
2869 }
2870 }
2871
2873 for (Station *st : Station::Iterate()) {
2874 if (!st->facilities.Test(StationFacility::Airport)) continue;
2875 assert(st->airport.psa != nullptr);
2876
2877 /* Check if the old storage was empty. */
2878 bool is_empty = true;
2879 for (uint i = 0; i < sizeof(st->airport.psa->storage); i++) {
2880 if (st->airport.psa->GetValue(i) != 0) {
2881 is_empty = false;
2882 break;
2883 }
2884 }
2885
2886 if (!is_empty) {
2887 st->airport.psa->grfid = _airport_mngr.GetGRFID(st->airport.type);
2888 } else {
2889 delete st->airport.psa;
2890 st->airport.psa = nullptr;
2891
2892 }
2893 }
2894 }
2895 }
2896
2897 /* This triggers only when old snow_lines were copied into the snow_line_height. */
2900 }
2901
2903 /* We store 4 fences in the field tiles instead of only SE and SW. */
2904 for (auto t : Map::Iterate()) {
2905 if (!IsTileType(t, MP_CLEAR) && !IsTileType(t, MP_TREES)) continue;
2906 if (IsTileType(t, MP_CLEAR) && IsClearGround(t, CLEAR_FIELDS)) continue;
2907 uint fence = GB(t.m4(), 5, 3);
2908 if (fence != 0 && IsTileType(TileAddXY(t, 1, 0), MP_CLEAR) && IsClearGround(TileAddXY(t, 1, 0), CLEAR_FIELDS)) {
2909 SetFence(TileAddXY(t, 1, 0), DIAGDIR_NE, fence);
2910 }
2911 fence = GB(t.m4(), 2, 3);
2912 if (fence != 0 && IsTileType(TileAddXY(t, 0, 1), MP_CLEAR) && IsClearGround(TileAddXY(t, 0, 1), CLEAR_FIELDS)) {
2913 SetFence(TileAddXY(t, 0, 1), DIAGDIR_NW, fence);
2914 }
2915 SB(t.m4(), 2, 3, 0);
2916 SB(t.m4(), 5, 3, 0);
2917 }
2918 }
2919
2921 for (Town *t : Town::Iterate()) {
2922 /* Set the default cargo requirement for town growth */
2924 case LandscapeType::Arctic:
2926 break;
2927
2928 case LandscapeType::Tropic:
2931 break;
2932
2933 default:
2934 break;
2935 }
2936 }
2937 }
2938
2940 /* Adjust zoom level to account for new levels */
2941 _saved_scrollpos_zoom += ZOOM_BASE_SHIFT;
2942 _saved_scrollpos_x *= ZOOM_BASE;
2943 _saved_scrollpos_y *= ZOOM_BASE;
2944 }
2945
2946 /* When any NewGRF has been changed the availability of some vehicles might
2947 * have been changed too. e->company_avail must be set to 0 in that case
2948 * which is done by StartupEngines(). */
2949 if (gcf_res != GLC_ALL_GOOD) StartupEngines();
2950
2951 /* The road owner of standard road stops was not properly accounted for. */
2953 for (const auto t : Map::Iterate()) {
2954 if (!IsBayRoadStopTile(t)) continue;
2955 Owner o = GetTileOwner(t);
2956 SetRoadOwner(t, RTT_ROAD, o);
2957 SetRoadOwner(t, RTT_TRAM, o);
2958 }
2959 }
2960
2962 /* Introduced tree planting limit. */
2963 for (Company *c : Company::Iterate()) c->tree_limit = _settings_game.construction.tree_frame_burst << 16;
2964 }
2965
2967 /* Fix too high inflation rates */
2970
2971 /* We have to convert the quarters of bankruptcy into months of bankruptcy */
2972 for (Company *c : Company::Iterate()) {
2973 c->months_of_bankruptcy = 3 * c->months_of_bankruptcy;
2974 }
2975 }
2976
2978 /* Aircraft acceleration variable was bonkers */
2979 for (Aircraft *v : Aircraft::Iterate()) {
2980 if (v->subtype <= AIR_AIRCRAFT) {
2981 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
2982 v->acceleration = avi->acceleration;
2983 }
2984 }
2985
2986 /* Blocked tiles could be reserved due to a bug, which causes
2987 * other places to assert upon e.g. station reconstruction. */
2988 for (const auto t : Map::Iterate()) {
2990 SetRailStationReservation(t, false);
2991 }
2992 }
2993 }
2994
2996 /* The global units configuration is split up in multiple configurations. */
2997 extern uint8_t _old_units;
2998 _settings_game.locale.units_velocity = Clamp(_old_units, 0, 2);
2999 _settings_game.locale.units_power = Clamp(_old_units, 0, 2);
3000 _settings_game.locale.units_weight = Clamp(_old_units, 1, 2);
3001 _settings_game.locale.units_volume = Clamp(_old_units, 1, 2);
3003 _settings_game.locale.units_height = Clamp(_old_units, 0, 2);
3004 }
3005
3007 /* Match nautical velocity with land velocity units. */
3009 }
3010
3012 /* Move ObjectType from map to pool */
3013 for (auto t : Map::Iterate()) {
3014 if (IsTileType(t, MP_OBJECT)) {
3015 Object *o = Object::Get(t.m2());
3016 o->type = t.m5();
3017 t.m5() = 0; // zero upper bits of (now bigger) ObjectID
3018 }
3019 }
3020 }
3021
3022 /* Beyond this point, tile types which can be accessed by vehicles must be in a valid state. */
3023
3024 /* Update all vehicles: Phase 2 */
3026
3027 /* The center of train vehicles was changed, fix up spacing. */
3029
3030 /* In version 2.2 of the savegame, we have new airports, so status of all aircraft is reset.
3031 * This has to be called after all map array updates */
3033
3035 /* Fix articulated road vehicles.
3036 * Some curves were shorter than other curves.
3037 * Now they have the same length, but that means that trailing articulated parts will
3038 * take longer to go through the curve than the parts in front which already left the courve.
3039 * So, make articulated parts catch up. */
3040 bool roadside = _settings_game.vehicle.road_side == 1;
3041 std::vector<uint> skip_frames;
3042 for (RoadVehicle *v : RoadVehicle::Iterate()) {
3043 if (!v->IsFrontEngine()) continue;
3044 skip_frames.clear();
3045 TileIndex prev_tile = v->tile;
3046 uint prev_tile_skip = 0;
3047 uint cur_skip = 0;
3048 for (RoadVehicle *u = v; u != nullptr; u = u->Next()) {
3049 if (u->tile != prev_tile) {
3050 prev_tile_skip = cur_skip;
3051 prev_tile = u->tile;
3052 } else {
3053 cur_skip = prev_tile_skip;
3054 }
3055
3056 uint &this_skip = skip_frames.emplace_back(prev_tile_skip);
3057
3058 /* The following 3 curves now take longer than before */
3059 switch (u->state) {
3060 case 2:
3061 cur_skip++;
3062 if (u->frame <= (roadside ? 9 : 5)) this_skip = cur_skip;
3063 break;
3064
3065 case 4:
3066 cur_skip++;
3067 if (u->frame <= (roadside ? 5 : 9)) this_skip = cur_skip;
3068 break;
3069
3070 case 5:
3071 cur_skip++;
3072 if (u->frame <= (roadside ? 4 : 2)) this_skip = cur_skip;
3073 break;
3074
3075 default:
3076 break;
3077 }
3078 }
3079 while (cur_skip > skip_frames[0]) {
3080 RoadVehicle *u = v;
3081 RoadVehicle *prev = nullptr;
3082 for (uint sf : skip_frames) {
3083 if (sf >= cur_skip) IndividualRoadVehicleController(u, prev);
3084
3085 prev = u;
3086 u = u->Next();
3087 }
3088 cur_skip--;
3089 }
3090 }
3091 }
3092
3094 for (OrderList *orderlist : OrderList::Iterate()) {
3095 for (Order &order : orderlist->GetOrders()) {
3096 order.SetTravelTimetabled(order.GetTravelTime() > 0);
3097 order.SetWaitTimetabled(order.GetWaitTime() > 0);
3098 }
3099 orderlist->RecalculateTimetableDuration();
3100 }
3101 }
3102
3103 /*
3104 * Only keep order-backups for network clients (and when replaying).
3105 * If we are a network server or not networking, then we just loaded a previously
3106 * saved-by-server savegame. There are no clients with a backup, so clear it.
3107 * Furthermore before savegame version SLV_192 the actual content was always corrupt.
3108 */
3110#ifndef DEBUG_DUMP_COMMANDS
3111 /* Note: We cannot use CleanPool since that skips part of the destructor
3112 * and then leaks un-reachable Orders in the order pool. */
3113 for (OrderBackup *ob : OrderBackup::Iterate()) {
3114 delete ob;
3115 }
3116#endif
3117 }
3118
3120 /* Convert towns growth_rate and grow_counter to ticks */
3121 for (Town *t : Town::Iterate()) {
3122 /* 0x8000 = TOWN_GROWTH_RATE_CUSTOM previously */
3123 if (t->growth_rate & 0x8000) SetBit(t->flags, TOWN_CUSTOM_GROWTH);
3124 if (t->growth_rate != TOWN_GROWTH_RATE_NONE) {
3125 t->growth_rate = TownTicksToGameTicks(t->growth_rate & ~0x8000);
3126 }
3127 /* Add t->index % TOWN_GROWTH_TICKS to spread growth across ticks. */
3128 t->grow_counter = TownTicksToGameTicks(t->grow_counter) + t->index % Ticks::TOWN_GROWTH_TICKS;
3129 }
3130 }
3131
3133 /* Make sure added industry cargo slots are cleared */
3134 for (Industry *i : Industry::Iterate()) {
3135 /* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo.
3136 * The loading routine should put the original singular value into the first array element. */
3137 for (auto &a : i->accepted) {
3138 if (IsValidCargoType(a.cargo)) {
3139 a.last_accepted = i->GetAccepted(0).last_accepted;
3140 } else {
3141 a.last_accepted = EconomyTime::MIN_DATE;
3142 }
3143 }
3144 }
3145 }
3146
3148 /* Move ships from lock slope to upper or lower position. */
3149 for (Ship *s : Ship::Iterate()) {
3150 /* Suitable tile? */
3151 if (!IsTileType(s->tile, MP_WATER) || !IsLock(s->tile) || GetLockPart(s->tile) != LOCK_PART_MIDDLE) continue;
3152
3153 /* We don't need to adjust position when at the tile centre */
3154 int x = s->x_pos & 0xF;
3155 int y = s->y_pos & 0xF;
3156 if (x == 8 && y == 8) continue;
3157
3158 /* Test if ship is on the second half of the tile */
3159 bool second_half;
3160 DiagDirection shipdiagdir = DirToDiagDir(s->direction);
3161 switch (shipdiagdir) {
3162 default: NOT_REACHED();
3163 case DIAGDIR_NE: second_half = x < 8; break;
3164 case DIAGDIR_NW: second_half = y < 8; break;
3165 case DIAGDIR_SW: second_half = x > 8; break;
3166 case DIAGDIR_SE: second_half = y > 8; break;
3167 }
3168
3169 DiagDirection slopediagdir = GetInclinedSlopeDirection(GetTileSlope(s->tile));
3170
3171 /* Heading up slope == passed half way */
3172 if ((shipdiagdir == slopediagdir) == second_half) {
3173 /* On top half of lock */
3174 s->z_pos = GetTileMaxZ(s->tile) * (int)TILE_HEIGHT;
3175 } else {
3176 /* On lower half of lock */
3177 s->z_pos = GetTileZ(s->tile) * (int)TILE_HEIGHT;
3178 }
3179 }
3180 }
3181
3183 /* Ensure the original cargo generation mode is used */
3185 }
3186
3188 /* Ensure the original neutral industry/station behaviour is used */
3190
3191 /* Link oil rigs to their industry and back. */
3192 for (Station *st : Station::Iterate()) {
3193 if (IsTileType(st->xy, MP_STATION) && IsOilRig(st->xy)) {
3194 /* Industry tile is always adjacent during construction by TileDiffXY(0, 1) */
3195 st->industry = Industry::GetByTile(st->xy + TileDiffXY(0, 1));
3196 st->industry->neutral_station = st;
3197 }
3198 }
3199 } else {
3200 /* Link neutral station back to industry, as this is not saved. */
3201 for (Industry *ind : Industry::Iterate()) if (ind->neutral_station != nullptr) ind->neutral_station->industry = ind;
3202 }
3203
3205 /* Update water class for trees. */
3206 for (const auto t : Map::Iterate()) {
3208 }
3209 }
3210
3211 /* Update structures for multitile docks */
3213 for (const auto t : Map::Iterate()) {
3214 /* Clear docking tile flag from relevant tiles as it
3215 * was not previously cleared. */
3217 SetDockingTile(t, false);
3218 }
3219 /* Add docks and oilrigs to Station::ship_station. */
3220 if (IsTileType(t, MP_STATION)) {
3221 if (IsDock(t) || IsOilRig(t)) Station::GetByTile(t)->ship_station.Add(t);
3222 }
3223 }
3224 }
3225
3227 /* Placing objects on docking tiles was not updating adjacent station's docking tiles. */
3228 for (Station *st : Station::Iterate()) {
3229 if (st->ship_station.tile != INVALID_TILE) UpdateStationDockingTiles(st);
3230 }
3231 }
3232
3233 /* Make sure all industries exclusive supplier/consumer set correctly. */
3235 for (Industry *i : Industry::Iterate()) {
3236 i->exclusive_supplier = INVALID_OWNER;
3237 i->exclusive_consumer = INVALID_OWNER;
3238 }
3239 }
3240
3242 /* Propagate wagon removal flag for compatibility */
3243 /* Temporary bitmask of company wagon removal setting */
3244 CompanyMask wagon_removal{};
3245 for (const Company *c : Company::Iterate()) {
3246 if (c->settings.renew_keep_length) wagon_removal.Set(c->index);
3247 }
3248 for (Group *g : Group::Iterate()) {
3249 if (g->flags.Any()) {
3250 /* Convert old replace_protection value to flag. */
3252 }
3253 if (wagon_removal.Test(g->owner)) g->flags.Set(GroupFlag::ReplaceWagonRemoval);
3254 }
3255 }
3256
3257 /* Use current order time to approximate last loading time */
3259 for (Vehicle *v : Vehicle::Iterate()) {
3260 v->last_loading_tick = std::max(TimerGameTick::counter, static_cast<uint64_t>(v->current_order_time)) - v->current_order_time;
3261 }
3262 }
3263
3264 /* Road stops is 'only' updating some caches, but they are needed for PF calls in SLV_MULTITRACK_LEVEL_CROSSINGS teleporting. */
3266
3267 /* Road vehicles stopped on multitrack level crossings need teleporting to a depot
3268 * to avoid crashing into the side of the train they're waiting for. */
3270 /* Teleport road vehicles to the nearest depot. */
3271 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
3272 /* Ignore trailers of articulated vehicles. */
3273 if (rv->IsArticulatedPart()) continue;
3274
3275 /* Ignore moving vehicles. */
3276 if (rv->cur_speed > 0) continue;
3277
3278 /* Ignore crashed vehicles. */
3279 if (rv->vehstatus.Test(VehState::Crashed)) continue;
3280
3281 /* Ignore vehicles not on level crossings. */
3282 TileIndex cur_tile = rv->tile;
3283 if (!IsLevelCrossingTile(cur_tile)) continue;
3284
3285 ClosestDepot closest_depot = rv->FindClosestDepot();
3286
3287 /* Try to find a depot with a distance limit of 512 tiles (Manhattan distance). */
3288 if (closest_depot.found && DistanceManhattan(rv->tile, closest_depot.location) < 512u) {
3289 /* Teleport all parts of articulated vehicles. */
3290 for (RoadVehicle *u = rv; u != nullptr; u = u->Next()) {
3291 u->tile = closest_depot.location;
3292 int x = TileX(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3293 int y = TileY(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3294 u->x_pos = x;
3295 u->y_pos = y;
3296 u->z_pos = GetSlopePixelZ(x, y, true);
3297
3298 u->vehstatus.Set(VehState::Hidden);
3299 u->state = RVSB_IN_DEPOT;
3300 u->UpdatePosition();
3301 }
3302 RoadVehLeaveDepot(rv, false);
3303 }
3304 }
3305
3307 /* Reset unused tree counters to reduce the savegame size. */
3308 for (auto t : Map::Iterate()) {
3309 if (IsTileType(t, MP_TREES)) {
3310 SB(t.m2(), 0, 4, 0);
3311 }
3312 }
3313 }
3314
3315 /* Refresh all level crossings to bar adjacent crossing tiles, if needed. */
3316 for (const auto tile : Map::Iterate()) {
3317 if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile, false);
3318 }
3319 }
3320
3321 /* Compute station catchment areas. This is needed here in case UpdateStationAcceptance is called below. */
3323
3324 /* Station acceptance is some kind of cache */
3326 for (Station *st : Station::Iterate()) UpdateStationAcceptance(st, false);
3327 }
3328
3331 }
3332
3334 /* For older savegames, we don't now the actual interval; so set it to the newgame value. */
3336
3337 /* We did load the "period" of the timer, but not the fired/elapsed. We can deduce that here. */
3339 _new_competitor_timeout.storage.elapsed = 0;
3340 _new_competitor_timeout.fired = _new_competitor_timeout.period.value == 0;
3341 }
3342
3344 /* Set service date provided to NewGRF. */
3345 for (Vehicle *v : Vehicle::Iterate()) {
3346 v->date_of_last_service_newgrf = TimerGameCalendar::Date{v->date_of_last_service.base()};
3347 }
3348 }
3349
3351 /* NewGRF acceleration information was added to ships. */
3352 for (Ship *s : Ship::Iterate()) {
3353 if (s->acceleration == 0) s->acceleration = ShipVehInfo(s->engine_type)->acceleration;
3354 }
3355 }
3356
3358 for (Company *c : Company::Iterate()) {
3359 c->max_loan = COMPANY_MAX_LOAN_DEFAULT;
3360 }
3361 }
3362
3364 ScriptObject::InitializeRandomizers();
3365 }
3366
3368 for (Company *c : Company::Iterate()) {
3369 c->inaugurated_year_calendar = _settings_game.game_creation.starting_year;
3370 }
3371 }
3372
3374 /* Between these two versions (actually from f8b1e303 to 77236258) EngineFlags had an off-by-one. Depending
3375 * on when the save was started, this may or may not affect existing engines. Here we try to detect invalid flags
3376 * and reset them to what they should be. */
3377 for (Engine *e : Engine::Iterate()) {
3378 if (e->flags.Test(EngineFlag::Available)) continue;
3379 if (e->flags.Test(EngineFlag{2}) || (e->flags.Test(EngineFlag::ExclusivePreview) && e->preview_asked.None())) {
3380 e->flags = EngineFlags(e->flags.base() >> 1U);
3381 }
3382 }
3383 }
3384
3385 for (Company *c : Company::Iterate()) {
3387 }
3388
3389 /* Update free group numbers data for each company, required regardless of savegame version. */
3390 for (Group *g : Group::Iterate()) {
3391 Company *c = Company::Get(g->owner);
3393 /* Use the index as group number when converting old savegames. */
3394 g->number = c->freegroups.UseID(g->index.base());
3395 } else {
3396 c->freegroups.UseID(g->number);
3397 }
3398 }
3399
3403
3405
3407 /* Restore the signals */
3409
3411
3413
3414 /* Start the scripts. This MUST happen after everything else except
3415 * starting a new company. */
3416 StartScripts();
3417
3418 /* If Load Scenario / New (Scenario) Game is used,
3419 * a company does not exist yet. So create one here.
3420 * 1 exception: network-games. Those can have 0 companies
3421 * But this exception is not true for non-dedicated network servers! */
3423 CompanyID first_human_company = GetFirstPlayableCompanyID();
3424 if (!Company::IsValidID(first_human_company)) {
3425 Company *c = DoStartupNewCompany(false, first_human_company);
3427 }
3428 }
3429
3430 return true;
3431}
3432
3442{
3443 /* reload grf data */
3447 /* reload vehicles */
3448 ResetVehicleHash();
3454 /* update station graphics */
3455 AfterLoadStations();
3456 /* Update company statistics. */
3458 /* Check and update house and town values */
3460 /* Delete news referring to no longer existing entities */
3462 /* Update livery selection windows */
3463 for (CompanyID i = CompanyID::Begin(); i < MAX_COMPANIES; ++i) InvalidateWindowData(WC_COMPANY_COLOUR, i);
3464 /* Update company infrastructure counts. */
3467 InvalidateAllPickerWindows();
3468 /* redraw the whole screen */
3471}
static void SetSignalHandlers()
Replaces signal handlers of SIGSEGV and SIGABRT and stores pointers to original handlers in memory.
static uint FixVehicleInclination(Vehicle *v, Direction dir)
Fixes inclination of a vehicle.
Company * DoStartupNewCompany(bool is_ai, CompanyID company=CompanyID::Invalid())
Create a new company and sets all company variables default values.
static void InitializeWindowsAndCaches()
Initialization of the windows and several kinds of caches.
static void CheckGroundVehiclesAtCorrectZ()
Check whether the ground vehicles are at the correct Z-coordinate.
static bool _saveload_crash_with_missing_newgrfs
Was the saveload crash because of missing NewGRFs?
static void FixOwnerOfRailTrack(Tile t)
Tries to change owner of this rail tile to a valid owner.
static void CDECL HandleSavegameLoadCrash(int signum)
Signal handler used to give a user a more useful report for crashes during the savegame loading proce...
static bool MayHaveBridgeAbove(Tile t)
Checks for the possibility that a bridge may be on this tile These are in fact all the tile types on ...
void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_class)
Makes a tile canal or water depending on the surroundings.
Definition afterload.cpp:91
static void StartScripts()
Start the scripts.
bool SaveloadCrashWithMissingNewGRFs()
Did loading the savegame cause a crash? If so, were NewGRFs missing?
void UpdateAllVirtCoords()
Update the viewport coordinates of all signs.
void ClearOldOrders()
Clear all old orders.
Definition order_sl.cpp:111
bool AfterLoadGame()
Perform a (large) amount of savegame conversion magic in order to load older savegames and to fill th...
void ReloadNewGRFData()
Reload all NewGRF files during a running game.
static void ResetSignalHandlers()
Resets signal handlers back to original handlers.
void GetAircraftFlightLevelBounds(const Vehicle *v, int *min, int *max)
Get the 'flight level' bounds, in pixels from 'z_pos' 0 for a particular vehicle for normal flight si...
void AircraftNextAirportPos_and_Order(Aircraft *v)
set the right pos when heading to other airports after takeoff
Station * GetTargetAirportIfValid(const Aircraft *v)
Returns aircraft's target station if v->target_airport is a valid station with airport.
void SetAircraftPosition(Aircraft *v, int x, int y, int z)
Set aircraft position.
@ AIR_AIRCRAFT
an airplane
Definition aircraft.h:30
void UpdateAircraftCache(Aircraft *v, bool update_range=false)
Update cached values of an aircraft.
@ FLYING
Vehicle is flying in the air.
Definition airport.h:77
@ AT_OILRIG
Oilrig airport.
Definition airport.h:38
std::vector< TileIndex > _animated_tiles
The table/list with animated tiles.
@ Animated
Tile is animated.
@ None
Tile is not animated.
void SetAnimatedTileState(Tile t, AnimatedTileState state)
Set the animated state of a tile.
VehicleFlag
Bit numbers in Vehicle::vehicle_flags.
@ PathfinderLost
Vehicle's pathfinder is lost.
@ LoadingFinished
Vehicle has finished loading.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T AssignBit(T &x, const uint8_t y, bool value)
Assigns a bit in a variable.
constexpr T SB(T &x, const uint8_t s, const uint8_t n, const U d)
Set n bits in x starting at bit s to d.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
debug_inline static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
TileIndex GetNorthernBridgeEnd(TileIndex t)
Finds the northern end of a bridge starting at a middle tile.
void SetBridgeMiddle(Tile t, Axis a)
Set that there is a bridge over the given axis.
Definition bridge_map.h:114
bool IsBridgeTile(Tile t)
checks if there is a bridge on this tile
Definition bridge_map.h:35
void ClearBridgeMiddle(Tile t)
Removes bridges from the given, that is bridges along the X and Y axis.
Definition bridge_map.h:103
bool IsBridge(Tile t)
Checks if this is a bridge, instead of a tunnel.
Definition bridge_map.h:24
void AfterLoadCompanyStats()
Rebuilding of company statistics after loading a savegame.
bool IsValidCargoType(CargoType cargo)
Test whether cargo type is not INVALID_CARGO.
Definition cargo_type.h:106
static const CargoType CARGO_NO_REFIT
Do not refit cargo of a vehicle (used in vehicle orders and auto-replace/auto-renew).
Definition cargo_type.h:79
@ TAE_GOODS
Cargo behaves goods/candy-like.
Definition cargotype.h:27
@ TAE_PASSENGERS
Cargo behaves passenger-like.
Definition cargotype.h:25
@ TAE_MAIL
Cargo behaves mail-like.
Definition cargotype.h:26
@ TAE_FOOD
Cargo behaves food/fizzy-drinks-like.
Definition cargotype.h:29
@ TAE_WATER
Cargo behaves water-like.
Definition cargotype.h:28
static void StartNew(CompanyID company)
Start a new AI company.
Definition ai_core.cpp:36
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Tstorage base() const noexcept
Retrieve the raw value behind this bit set.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Set()
Set all bits.
TStorage storage
The storage of the timer.
Definition timer.h:50
Enum-as-bit-set wrapper.
UnitID UseID(UnitID index)
Use a unit number.
Definition vehicle.cpp:1833
static void StartNew()
Start up a new GameScript.
Definition game_core.cpp:72
void TestRevision()
Finds out if current revision is different than last revision stored in the savegame.
Definition gamelog.cpp:425
const GRFIdentifier & GetOverriddenIdentifier(const GRFConfig &c)
Try to find the overridden GRF identifier of the given GRF.
Definition gamelog.cpp:712
void PrintDebug(int level)
Prints gamelog to debug output.
Definition gamelog.cpp:323
void GRFRemove(uint32_t grfid)
Logs removal of a GRF.
Definition gamelog.cpp:517
void GRFAddList(const GRFConfigList &newg)
Logs adding of list of GRFs.
Definition gamelog.cpp:578
void GRFCompatible(const GRFIdentifier &newg)
Logs loading compatible GRF (the same ID, but different MD5 hash)
Definition gamelog.cpp:542
void Oldver()
Logs loading from savegame without gamelog.
Definition gamelog.cpp:399
void TestMode()
Finds last stored game mode or landscape.
Definition gamelog.cpp:446
uint32_t GetGRFID(uint16_t entity_id) const
Gives the GRFID of the file the entity belongs to.
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
static constexpr TimerGameTick::Ticks TOWN_GROWTH_TICKS
Cycle duration for towns trying to grow (this originates from the size of the town array in TTD).
Wrapper class to abstract away the way the tiles are stored.
Definition map_func.h:25
debug_inline uint16_t & m2()
Primarily used for indices to towns, industries and stations.
Definition map_func.h:125
debug_inline uint8_t & m7()
Primarily used for newgrf support.
Definition map_func.h:185
debug_inline uint8_t & m6()
General purpose.
Definition map_func.h:173
debug_inline uint8_t & m3()
General purpose.
Definition map_func.h:137
debug_inline uint8_t & m5()
General purpose.
Definition map_func.h:161
A timeout timer will fire once after the interval.
Definition timer.h:116
static void SetDate(Date date, DateFract fract)
Set the date.
static Date date
Current date in days (day counter).
static Year year
Current year, starting at 0.
static DateFract date_fract
Fractional part of the day.
static constexpr TimerGame< struct Economy >::Date MIN_DATE
The date on January 1, year 0.
static constexpr TimerGame< struct Calendar >::Year DEF_END_YEAR
The default scoring end year.
static constexpr TimerGame< struct Economy >::Year MIN_YEAR
The absolute minimum year in OTTD.
static constexpr int SECONDS_PER_DAY
approximate seconds per day, not for precise calculations
static constexpr TimerGame< struct Calendar >::Year ORIGINAL_BASE_YEAR
The minimum starting year/base year of the original TTD.
static constexpr TimerGame< struct Calendar >::Date DAYS_TILL_ORIGINAL_BASE_YEAR
The date of the first day of the original base year.
static Date date
Current date in days (day counter).
static Year year
Current year, starting at 0.
static DateFract date_fract
Fractional part of the day.
static void SetDate(Date date, DateFract fract)
Set the date.
static TickCounter counter
Monotonic counter, in ticks, since start of game.
bool IsClearGround(Tile t, ClearGround ct)
Set the type of clear tile.
Definition clear_map.h:59
void SetFence(Tile t, DiagDirection side, uint h)
Sets the type of fence (and whether there is one) for the given border.
Definition clear_map.h:228
@ CLEAR_GRASS
0-3
Definition clear_map.h:20
@ CLEAR_FIELDS
3
Definition clear_map.h:23
@ CLEAR_SNOW
0-3 (Not stored in map.)
Definition clear_map.h:24
void MakeClear(Tile t, ClearGround g, uint density)
Make a clear tile.
Definition clear_map.h:247
ClearGround GetClearGround(Tile t)
Get the type of clear tile.
Definition clear_map.h:47
void SetClearGroundDensity(Tile t, ClearGround type, uint density)
Sets ground type and density in one go, also sets the counter to 0.
Definition clear_map.h:146
uint GetClearDensity(Tile t)
Get the density of a non-field clear tile.
Definition clear_map.h:71
TimeoutTimer< TimerGameTick > _new_competitor_timeout({ TimerGameTick::Priority::COMPETITOR_TIMEOUT, 0 }, []() { if(_game_mode==GM_MENU||!AI::CanStartNew()) return;if(_networking &&Company::GetNumItems() >=_settings_client.network.max_companies) return;if(_settings_game.difficulty.competitors_interval==0) return;uint8_t n=0;for(const Company *c :Company::Iterate()) { if(c->is_ai) n++;} if(n >=_settings_game.difficulty.max_no_competitors) return;Command< CMD_COMPANY_CTRL >::Post(CCA_NEW_AI, CompanyID::Invalid(), CRR_NONE, INVALID_CLIENT_ID);})
Start a new competitor company if possible.
void RandomiseCompanyManagerFace(CompanyManagerFace &cmf, Randomizer &randomizer)
Completely randomise a company manager face, including style.
void ResetCompanyLivery(Company *c)
Reset the livery schemes to the company's primary colour.
void UpdateCompanyLiveries(Company *c)
Update liveries for a company.
void SetCompanyManagerFaceStyle(CompanyManagerFace &cmf, uint style)
Set a company face style.
CompanyID GetFirstPlayableCompanyID()
Get the index of the first available company.
std::optional< uint > FindCompanyManagerFaceLabel(std::string_view label)
Find a company manager face style by label.
CompanyID _current_company
Company currently doing an action.
CompanyManagerFace ConvertFromOldCompanyManagerFace(uint32_t face)
Converts an old company manager's face format to the new company manager's face format.
static constexpr Owner OWNER_TOWN
A town owns the tile, or a town is expanding.
static constexpr Owner OWNER_NONE
The tile has no ownership.
static constexpr Owner INVALID_OWNER
An invalid owner.
static constexpr Owner OWNER_WATER
The tile/execution is done by "water".
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
bool IsDepotTile(Tile tile)
Is the given tile a tile with a depot on it?
Definition depot_map.h:42
Direction DiagDirToDir(DiagDirection dir)
Convert a DiagDirection to a Direction.
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
Direction ReverseDir(Direction d)
Return the reverse of a direction.
Direction AxisToDirection(Axis a)
Converts an Axis to a Direction.
Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
DiagDirection XYNSToDiagDir(Axis xy, uint ns)
Convert an axis and a flag for north/south into a DiagDirection.
DiagDirection DirToDiagDir(Direction dir)
Convert a Direction to a DiagDirection.
Direction
Defines the 8 directions on the map.
@ DIR_SW
Southwest.
@ DIR_NW
Northwest.
@ INVALID_DIR
Flag for an invalid direction.
@ DIR_N
North.
@ DIR_SE
Southeast.
@ DIR_NE
Northeast.
Axis
Allow incrementing of DiagDirDiff variables.
@ AXIS_X
The X axis.
@ AXIS_Y
The y axis.
DiagDirection
Enumeration for diagonal directions.
@ DIAGDIR_NE
Northeast, upper right on your monitor.
@ DIAGDIR_NW
Northwest.
@ DIAGDIR_SE
Southeast.
@ DIAGDIR_END
Used for iterations.
@ DIAGDIR_BEGIN
Used for iterations.
@ DIAGDIR_SW
Southwest.
void RecomputePrices()
Computes all prices, payments and maximum loan.
Definition economy.cpp:742
bool AddInflation(bool check_year)
Add monthly inflation.
Definition economy.cpp:704
static const uint64_t MAX_INFLATION
Maximum inflation (including fractional part) without causing overflows in int64_t price computations...
void StartupEngines()
Start/initialise all our engines.
Definition engine.cpp:799
void CopyTempEngineData()
Copy data from temporary engine array into the real engine pool.
Definition engine_sl.cpp:96
@ RoadIsTram
Road vehicle is a tram/light rail vehicle.
EngineFlag
Engine.flags is a bitmask, with the following values.
@ Available
This vehicle is available to everyone.
@ ExclusivePreview
This vehicle is in the exclusive preview stage, either being used or being offered to a company.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23)
Definition enum_type.hpp:17
@ WL_CRITICAL
Critical errors, the MessageBox is shown in all cases.
Definition error.h:27
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, CommandCost &cc)
Display an error message in a window.
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:20
Gamelog _gamelog
Gamelog instance.
Definition gamelog.cpp:31
void LoadStringWidthTable(bool monospace)
Initialize _stringwidth_table cache.
Definition gfx.cpp:1246
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:50
void GfxLoadSprites()
Initialise and load all the sprites.
Definition gfxinit.cpp:335
@ GVF_GOINGDOWN_BIT
Vehicle is currently going downhill. (Cached track information for acceleration)
@ GVF_GOINGUP_BIT
Vehicle is currently going uphill. (Cached track information for acceleration)
void UpdateGroupChildren()
Update children list for each group.
Definition group_cmd.cpp:47
@ ReplaceProtection
If set, the global autoreplace has no effect on the group.
@ ReplaceWagonRemoval
If set, autoreplace will perform wagon removal on vehicles in this group.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1535
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
@ BuildingIsProtected
towns and AI will not remove this house, while human players will be able to
static const HouseID NEW_HOUSE_OFFSET
Offset for new houses.
Definition house.h:28
static const uint8_t TOWN_HOUSE_COMPLETED
Simple value that indicates the house has reached the final stage of construction.
Definition house.h:25
IndustryBuildData _industry_builder
In-game manager of industries.
void TrimIndustryAcceptedProduced(Industry *ind)
Remove unused industry accepted/produced slots – entries after the last slot with valid cargo.
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Accessor for array _industry_specs.
IndustryType GetIndustryType(Tile tile)
Retrieve the type for this industry.
IndustryGfx GetIndustryGfx(Tile t)
Get the industry graphics ID for the given industry tile.
@ PlantOnBuild
Fields are planted around when built (all farms)
@ BuiltOnWater
is built on water (oil rig)
void AfterLoadLabelMaps()
Perform rail type and road type conversion if necessary.
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner)
Change the owner of a tile.
int GetSlopePixelZ(int x, int y, bool ground_vehicle)
Return world Z coordinate of a given point of a tile.
@ Random
Randomise borders.
void AfterLoadLinkGraphs()
Spawn the threads for running link graph calculations.
@ DT_MANUAL
Manual distribution. No link graph calculations are run.
void SetupColoursAndInitialWindow()
Initialise the default colours (remaps and the likes), and load the main windows.
Definition main_gui.cpp:553
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
Definition map.cpp:142
TileIndex TileAddXY(TileIndex tile, int x, int y)
Adds a given offset to a tile.
Definition map_func.h:469
static debug_inline TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
Definition map_func.h:372
TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Definition map_func.h:610
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition map_func.h:388
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:424
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:414
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:569
static debug_inline TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
Definition map_func.h:403
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
void GenerateSavegameId()
Generate an unique savegame ID.
Definition misc.cpp:87
bool _networking
are we in networking mode?
Definition network.cpp:67
bool _network_dedicated
are we a dedicated server?
Definition network.cpp:70
bool _network_server
network-server is active
Definition network.cpp:68
@ GSF_FAKE_TOWNS
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition newgrf.h:95
void ShowNewGRFError()
Show the first NewGRF error we can find.
uint8_t StationGfx
Copy from station_map.h.
GRFConfigList _grfconfig
First item in list of current GRF set up.
GRFListCompatibility IsGoodGRFConfigList(GRFConfigList &grfconfig)
Check if all GRFs in the GRF config from a savegame can be loaded.
GRFListCompatibility
Status of post-gameload GRF compatibility check.
@ GLC_COMPATIBLE
Compatible (eg. the same ID, but different checksum) GRF found in at least one case.
@ GLC_ALL_GOOD
All GRF needed by game are present.
@ GLC_NOT_FOUND
At least one GRF couldn't be found (higher priority than GLC_COMPATIBLE)
@ GCS_NOT_FOUND
GRF file was not found in the local cache.
@ Compatible
GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
void DeleteInvalidEngineNews()
Remove engine announcements for invalid engines.
uint16_t ObjectType
Types of objects.
Definition object_type.h:16
static const ObjectType OBJECT_STATUE
Statue in towns.
Definition object_type.h:20
static const ObjectType OBJECT_HQ
HeadQuarter of a player.
Definition object_type.h:22
@ Error
A game paused because a (critical) error.
@ ActiveClients
A game paused for 'min_active_clients'.
@ Normal
A game normally paused.
@ Join
A game paused for 'pause_on_join'.
@ OSL_PLATFORM_FAR_END
Stop at the far end of the platform.
Definition order_type.h:101
@ OUFB_TRANSFER
Transfer all cargo onto the platform.
Definition order_type.h:70
@ OUFB_UNLOAD
Force unloading all cargo onto the platform, possibly not getting paid.
Definition order_type.h:69
OrderDepotActionFlags
Actions that can be performed when the vehicle enters the depot.
Definition order_type.h:117
@ OLFB_NO_LOAD
Do not load anything.
Definition order_type.h:81
@ ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS
The vehicle will not stop at any stations it passes except the destination.
Definition order_type.h:89
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
Get the rail types the given company can build.
Definition rail.cpp:253
void InitializeRailGUI()
Resets the rail GUI - sets default railtype to build and resets the signal GUI.
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
Definition rail_map.h:115
static debug_inline bool IsRailDepotTile(Tile t)
Is this tile rail tile and a rail depot?
Definition rail_map.h:105
void SetTrackReservation(Tile t, TrackBits b)
Sets the reserved track bits of the tile.
Definition rail_map.h:209
@ RAIL_GROUND_WATER
Grass with a fence and shore or water on the free halftile.
Definition rail_map.h:498
static debug_inline bool IsRailDepot(Tile t)
Is this rail tile a rail depot?
Definition rail_map.h:95
void SetDepotReservation(Tile t, bool b)
Set the reservation state of the depot.
Definition rail_map.h:269
static debug_inline bool IsPlainRail(Tile t)
Returns whether this is plain rails, with or without signals.
Definition rail_map.h:49
bool HasSignals(Tile t)
Checks if a rail tile has signals.
Definition rail_map.h:72
static debug_inline bool IsPlainRailTile(Tile t)
Checks whether the tile is a rail tile or rail tile with signals.
Definition rail_map.h:60
void SetSignalStates(Tile tile, uint state)
Set the states of the signals (Along/AgainstTrackDir)
Definition rail_map.h:351
void SetRailType(Tile t, RailType r)
Sets the rail type of the given tile.
Definition rail_map.h:125
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:25
@ RAILTYPE_ELECTRIC
Electric rails.
Definition rail_type.h:28
@ RAILTYPE_RAIL
Standard non-electric rails.
Definition rail_type.h:27
Randomizer _random
Random used in the game state calculations.
RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces)
Get the road types the given company can build.
Definition road.cpp:198
void UpdateNearestTownForRoadTiles(bool invalidate)
Updates cached nearest town for all road tiles.
void UpdateLevelCrossing(TileIndex tile, bool sound=true, bool force_bar=false)
Update a level crossing to barred or open (crossing may include multiple adjacent tiles).
void SetRoadOwner(Tile t, RoadTramType rtt, Owner o)
Set the owner of a specific road type.
Definition road_map.h:235
bool HasTownOwnedRoad(Tile t)
Checks if given tile has town owned road.
Definition road_map.h:264
static debug_inline bool IsRoadDepot(Tile t)
Return whether a tile is a road depot.
Definition road_map.h:90
bool IsLevelCrossingTile(Tile t)
Return whether a tile is a level crossing tile.
Definition road_map.h:79
void SetRoadTypes(Tile t, RoadType road_rt, RoadType tram_rt)
Set the present road types of a tile.
Definition road_map.h:599
@ ROAD_TILE_NORMAL
Normal road.
Definition road_map.h:23
@ ROAD_TILE_DEPOT
Depot (one entrance)
Definition road_map.h:25
@ ROAD_TILE_CROSSING
Level crossing.
Definition road_map.h:24
RoadBits GetCrossingRoadBits(Tile tile)
Get the road bits of a level crossing.
Definition road_map.h:332
Owner GetRoadOwner(Tile t, RoadTramType rtt)
Get the owner of a specific road type.
Definition road_map.h:218
static debug_inline RoadTileType GetRoadTileType(Tile t)
Get the type of the road tile.
Definition road_map.h:36
void SetCrossingReservation(Tile t, bool b)
Set the reservation state of the rail crossing.
Definition road_map.h:377
bool IsLevelCrossing(Tile t)
Return whether a tile is a level crossing.
Definition road_map.h:69
RoadBits
Enumeration for the road parts on a tile.
Definition road_type.h:40
@ ROAD_Y
Full road along the y-axis (north-west + south-east)
Definition road_type.h:47
@ ROAD_X
Full road along the x-axis (south-west + north-east)
Definition road_type.h:46
RoadType
The different roadtypes we support.
Definition road_type.h:23
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:28
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:26
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:25
@ RVS_ENTERED_STOP
Only set when a vehicle has entered the stop.
Definition roadveh.h:43
@ RVSB_IN_ROAD_STOP
The vehicle is in a road stop.
Definition roadveh.h:49
@ RVS_IN_DT_ROAD_STOP
The vehicle is in a drive-through road stop.
Definition roadveh.h:46
@ RVS_IN_ROAD_STOP
The vehicle is in a road stop.
Definition roadveh.h:45
@ RVSB_IN_DEPOT
The vehicle is in a depot.
Definition roadveh.h:38
@ RVSB_WORMHOLE
The vehicle is in a tunnel and/or bridge.
Definition roadveh.h:39
@ RVS_DRIVE_SIDE
Only used when retrieving move data.
Definition roadveh.h:44
const uint8_t _road_stop_stop_frame[]
Table of road stop stop frames, when to stop at a road stop.
void SlError(StringID string, const std::string &extra_msg)
Error handler.
Definition saveload.cpp:327
void SetSaveLoadError(StringID str)
Set the error message from outside of the actual loading/saving of the game (AfterLoadGame and friend...
void SlErrorCorrupt(const std::string &msg)
Error handler for corrupt savegames.
Definition saveload.cpp:357
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Definition saveload.cpp:66
bool IsSavegameVersionBefore(SaveLoadVersion major, uint8_t minor=0)
Checks whether the savegame is below major.
Definition saveload.h:1271
@ SLV_AI_START_DATE
309 PR#10653 Removal of individual AI start dates and added a generic one.
Definition saveload.h:350
@ SLV_190
190 26547 Separate order travel and wait times
Definition saveload.h:271
@ SLV_91
91 12347
Definition saveload.h:152
@ SLV_49
49 8969
Definition saveload.h:101
@ SLV_90
90 12293
Definition saveload.h:151
@ SLV_64
64 10006
Definition saveload.h:119
@ SLV_69
69 10319
Definition saveload.h:125
@ SLV_ECONOMY_MODE_TIMEKEEPING_UNITS
327 PR#11341 Mode to display economy measurements in wallclock units.
Definition saveload.h:372
@ SLV_PROTECT_PLACED_HOUSES
351 PR#13270 Houses individually placed by players can be protected from town/AI removal.
Definition saveload.h:401
@ SLV_172
172 23947
Definition saveload.h:249
@ SLV_COMPANY_INAUGURATED_PERIOD_V2
349 PR#13448 Fix savegame storage for company inaugurated year in wallclock mode.
Definition saveload.h:398
@ SLV_182
182 25115 FS#5492, r25259, r25296 Goal status
Definition saveload.h:261
@ SLV_186
186 25833 Objects storage
Definition saveload.h:266
@ SLV_175
175 24136
Definition saveload.h:253
@ SLV_16
16.0 2817 16.1 3155
Definition saveload.h:60
@ SLV_87
87 12129
Definition saveload.h:147
@ SLV_SERVE_NEUTRAL_INDUSTRIES
210 PR#7234 Company stations can serve industries with attached neutral stations.
Definition saveload.h:296
@ SLV_147
147 20621
Definition saveload.h:219
@ SLV_188
188 26169 v1.4 FS#5831 Unify RV travel time
Definition saveload.h:268
@ SLV_61
61 9892
Definition saveload.h:116
@ SLV_84
84 11822
Definition saveload.h:143
@ SLV_25
25 4259
Definition saveload.h:73
@ SLV_15
15.0 2499
Definition saveload.h:59
@ SLV_198
198 PR#6763 Switch town growth rate and counter to actual game ticks
Definition saveload.h:281
@ SLV_36
36 6624
Definition saveload.h:86
@ SLV_26
26 4466
Definition saveload.h:74
@ SLV_96
96 13226
Definition saveload.h:158
@ SLV_EXTEND_RAILTYPES
200 PR#6805 Extend railtypes to 64, adding uint16_t to map array.
Definition saveload.h:284
@ SLV_17
17.0 3212 17.1 3218
Definition saveload.h:62
@ SLV_42
42 7573
Definition saveload.h:93
@ SLV_177
177 24619
Definition saveload.h:255
@ SLV_EXTEND_INDUSTRY_CARGO_SLOTS
202 PR#6867 Increase industry cargo slots to 16 in, 16 out
Definition saveload.h:286
@ SLV_103
103 14598
Definition saveload.h:166
@ SLV_100
100 13952
Definition saveload.h:163
@ SLV_GROUP_REPLACE_WAGON_REMOVAL
291 PR#7441 Per-group wagon removal flag.
Definition saveload.h:329
@ SLV_VELOCITY_NAUTICAL
305 PR#10594 Separation of land and nautical velocity (knots!)
Definition saveload.h:346
@ SLV_VEHICLE_ECONOMY_AGE
334 PR#12141 v14.0 Add vehicle age in economy year, for profit stats minimum age
Definition saveload.h:380
@ 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_TOWN_CARGOGEN
208 PR#6965 New algorithms for town building cargo generation.
Definition saveload.h:293
@ SLV_149
149 20832
Definition saveload.h:221
@ SLV_83
83 11589
Definition saveload.h:142
@ SLV_6
6.0 1721 6.1 1768
Definition saveload.h:46
@ SLV_34
34 6455
Definition saveload.h:83
@ SLV_LINKGRAPH_SECONDS
308 PR#10610 Store linkgraph update intervals in seconds instead of days.
Definition saveload.h:349
@ SLV_114
114 15601
Definition saveload.h:179
@ SLV_137
137 18912
Definition saveload.h:207
@ SLV_SAVEGAME_ID
313 PR#10719 Add an unique ID to every savegame (used to deduplicate surveys).
Definition saveload.h:355
@ SLV_131
131 18481
Definition saveload.h:200
@ SLV_11
11.0 2033 11.1 2041
Definition saveload.h:53
@ SLV_120
120 16439
Definition saveload.h:187
@ SLV_99
99 13838
Definition saveload.h:161
@ SLV_123
123 16909
Definition saveload.h:190
@ SLV_46
46 8705
Definition saveload.h:98
@ SLV_122
122 16855
Definition saveload.h:189
@ SLV_FACE_STYLES
355 PR#14319 Addition of face styles, replacing gender and ethnicity.
Definition saveload.h:406
@ SLV_ENDING_YEAR
218 PR#7747 v1.10 Configurable ending year.
Definition saveload.h:305
@ SLV_141
141 19799
Definition saveload.h:212
@ SLV_112
112 15290
Definition saveload.h:177
@ SLV_125
125 17113
Definition saveload.h:193
@ SLV_166
166 23415
Definition saveload.h:242
@ SLV_98
98 13375
Definition saveload.h:160
@ SLV_WATER_TILE_TYPE
342 PR#13030 Simplify water tile type.
Definition saveload.h:390
@ SLV_117
117 16037
Definition saveload.h:183
@ SLV_140
140 19382
Definition saveload.h:211
@ SLV_126
126 17433
Definition saveload.h:194
@ SLV_138
138 18942 1.0.x
Definition saveload.h:208
@ SLV_ANIMATED_TILE_STATE_IN_MAP
347 PR#13082 Animated tile state saved for improved performance.
Definition saveload.h:396
@ SLV_MULTITILE_DOCKS
216 PR#7380 Multiple docks per station.
Definition saveload.h:303
@ SLV_86
86 12042
Definition saveload.h:146
@ SLV_ROAD_TYPES
214 PR#6811 NewGRF road types.
Definition saveload.h:300
@ SLV_1
1.0 0.1.x, 0.2.x
Definition saveload.h:33
@ SLV_GS_INDUSTRY_CONTROL
287 PR#7912 and PR#8115 GS industry control.
Definition saveload.h:324
@ SLV_164
164 23290
Definition saveload.h:239
@ SLV_160
160 21974 1.1.x
Definition saveload.h:235
@ SLV_38
38 7195
Definition saveload.h:88
@ SLV_145
145 20376
Definition saveload.h:217
@ SLV_48
48 8935
Definition saveload.h:100
@ SLV_57
57 9691
Definition saveload.h:111
@ SLV_104
104 14735
Definition saveload.h:167
@ SLV_52
52 9066
Definition saveload.h:105
@ SLV_134
134 18703
Definition saveload.h:203
@ SLV_165
165 23304
Definition saveload.h:241
@ SLV_144
144 20334
Definition saveload.h:215
@ SLV_2
2.0 0.3.0 2.1 0.3.1, 0.3.2
Definition saveload.h:34
@ SLV_INCREASE_HOUSE_LIMIT
348 PR#12288 Increase house limit to 4096.
Definition saveload.h:397
@ SLV_143
143 20048
Definition saveload.h:214
@ SLV_127
127 17439
Definition saveload.h:195
@ SLV_152
152 21171
Definition saveload.h:225
@ SLV_LAST_LOADING_TICK
301 PR#9693 Store tick of last loading for vehicles.
Definition saveload.h:341
@ SLV_76
76 11139
Definition saveload.h:134
@ SLV_SCRIPT_RANDOMIZER
333 PR#12063 v14.0-RC1 Save script randomizers.
Definition saveload.h:379
@ SLV_78
78 11176
Definition saveload.h:136
@ SLV_106
106 14919
Definition saveload.h:170
@ SLV_DEPOT_UNBUNCHING
331 PR#11945 Allow unbunching shared order vehicles at a depot.
Definition saveload.h:377
@ SLV_119
119 16242
Definition saveload.h:185
@ SLV_139
139 19346
Definition saveload.h:209
@ SLV_SHIP_ACCELERATION
329 PR#10734 Start using Vehicle's acceleration field for ships too.
Definition saveload.h:374
@ SLV_135
135 18719
Definition saveload.h:205
@ SLV_MULTITRACK_LEVEL_CROSSINGS
302 PR#9931 v13.0 Multi-track level crossings.
Definition saveload.h:342
@ SLV_121
121 16694
Definition saveload.h:188
@ SLV_192
192 26700 FS#6066 Fix saving of order backups
Definition saveload.h:274
@ SLV_58
58 9762
Definition saveload.h:112
@ SLV_94
94 12816
Definition saveload.h:155
@ SLV_153
153 21263
Definition saveload.h:226
@ SLV_101
101 14233
Definition saveload.h:164
@ SLV_95
95 12924
Definition saveload.h:157
@ SLV_158
158 21933
Definition saveload.h:232
@ SLV_133
133 18674
Definition saveload.h:202
@ SLV_93
93 12648
Definition saveload.h:154
@ SLV_81
81 11244
Definition saveload.h:140
@ SLV_72
72 10601
Definition saveload.h:129
@ SLV_43
43 7642
Definition saveload.h:94
@ SLV_113
113 15340
Definition saveload.h:178
@ SLV_ECONOMY_DATE
326 PR#10700 Split calendar and economy timers and dates.
Definition saveload.h:371
@ SLV_45
45 8501
Definition saveload.h:97
@ SLV_128
128 18281
Definition saveload.h:196
@ SLV_GROUP_NUMBERS
336 PR#12297 Add per-company group numbers.
Definition saveload.h:383
@ SLV_NEWGRF_LAST_SERVICE
317 PR#11124 Added stable date_of_last_service to avoid NewGRF trouble.
Definition saveload.h:360
@ SLV_53
53 9316
Definition saveload.h:106
@ SLV_161
161 22567
Definition saveload.h:236
@ SLV_74
74 11030
Definition saveload.h:131
@ SLV_184
184 25508 Unit localisation split
Definition saveload.h:263
@ SLV_INCREASE_STATION_TYPE_FIELD_SIZE
337 PR#12572 Increase size of StationType field in map array
Definition saveload.h:384
@ SLV_88
88 12134
Definition saveload.h:148
@ SLV_156
156 21728
Definition saveload.h:230
@ SLV_NONFLOODING_WATER_TILES
345 PR#13013 Store water tile non-flooding state.
Definition saveload.h:394
@ SLV_62
62 9905
Definition saveload.h:117
@ SLV_59
59 9779
Definition saveload.h:113
@ SLV_82
82 11410
Definition saveload.h:141
@ SLV_194
194 26881 v1.5
Definition saveload.h:276
@ SLV_TREES_WATER_CLASS
213 PR#7405 WaterClass update for tree tiles.
Definition saveload.h:299
@ SLV_124
124 16993
Definition saveload.h:191
@ SLV_159
159 21962
Definition saveload.h:233
@ SLV_32
32 6001
Definition saveload.h:81
@ SLV_56
56 9667
Definition saveload.h:110
@ SLV_SHIPS_STOP_IN_LOCKS
206 PR#7150 Ship/lock movement changes.
Definition saveload.h:291
@ SLV_111
111 15190
Definition saveload.h:176
@ SLV_70
70 10541
Definition saveload.h:127
@ SLV_183
183 25363 Cargodist
Definition saveload.h:262
@ SLV_31
31 5999
Definition saveload.h:80
@ SLV_148
148 20659
Definition saveload.h:220
@ SLV_50
50 8973
Definition saveload.h:103
@ SLV_REPAIR_OBJECT_DOCKING_TILES
299 PR#9594 v12.0 Fixing issue with docking tiles overlapping objects.
Definition saveload.h:338
@ SLV_CONSISTENT_PARTIAL_Z
306 PR#10570 Conversion from an inconsistent partial Z calculation for slopes, to one that is (more) ...
Definition saveload.h:347
@ SLV_142
142 20003
Definition saveload.h:213
@ SLV_21
21 3472 0.4.x
Definition saveload.h:68
@ SLV_136
136 18764
Definition saveload.h:206
@ SLV_146
146 20446
Definition saveload.h:218
@ SLV_SCRIPT_SAVE_INSTANCES
352 PR#13556 Scripts are allowed to save instances.
Definition saveload.h:402
@ SLV_MAX_LOAN_FOR_COMPANY
330 PR#11224 Separate max loan for each company.
Definition saveload.h:376
@ SLV_24
24 4150
Definition saveload.h:71
@ SLV_9
9.0 1909
Definition saveload.h:50
bool IsSavegameVersionBeforeOrAt(SaveLoadVersion major)
Checks whether the savegame is below or at major.
Definition saveload.h:1285
Declaration of functions used in more save/load files.
void AfterLoadVehiclesPhase1(bool part_of_load)
Called after load for phase 1 of vehicle initialisation.
void ResetOldNames()
Free the memory of the old names array.
void FixupTrainLengths()
Fixup old train spacing.
void MoveBuoysToWaypoints()
Perform all steps to upgrade from the old station buoys to the new version that uses waypoints.
void UpdateOldAircraft()
need to be called to load aircraft from old version
void ConvertOldMultiheadToNew()
Converts all trains to the new subtype format introduced in savegame 16.2 It also links multiheaded e...
void ConnectMultiheadedTrains()
Link front and rear multiheaded engines to each other This is done when loading a savegame.
void AfterLoadRoadStops()
(Re)building of road stop caches after loading a savegame.
void MoveWaypointsToBaseStations()
Perform all steps to upgrade from the old waypoints to the new version that uses station.
void AfterLoadVehiclesPhase2(bool part_of_load)
Called after load for phase 2 of vehicle initialisation.
void UpdateHousesAndTowns()
Check and update town and house values.
Definition town_sl.cpp:64
std::string CopyFromOldName(StringID id)
Copy and convert old custom names to UTF-8.
void AfterLoadStoryBook()
Called after load to trash broken pages.
Definition story_sl.cpp:20
void ShowScriptDebugWindowIfScriptError()
Open the AI debug window if one of the AI scripts has crashed.
VehicleDefaultSettings _old_vds
Used for loading default vehicles settings from old savegames.
Definition settings.cpp:63
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
Definition settings.cpp:62
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
@ SIGTYPE_COMBO
presignal inter-block
Definition signal_type.h:27
@ SIG_SEMAPHORE
Old-fashioned semaphore signal.
Definition signal_type.h:18
@ SIG_ELECTRIC
Light signal.
Definition signal_type.h:17
void UpdateAllSignVirtCoords()
Update the coordinates of all signs.
Definition signs.cpp:50
DiagDirection GetInclinedSlopeDirection(Slope s)
Returns the direction of an inclined slope.
Definition slope_func.h:239
void BuildOwnerLegend()
Completes the array for the owned property legend.
@ Industry
Source/destination is an industry.
@ Town
Source/destination is a town.
void UpdateAllStationVirtCoords()
Update the virtual coords needed to draw the station sign for all stations.
void UpdateAirportsNoise()
Recalculate the noise generated by the airports of each town.
void UpdateStationAcceptance(Station *st, bool show_msg)
Update the acceptance for a station.
StationType GetStationType(Tile t)
Get the station type of this tile.
Definition station_map.h:44
StationGfx GetStationGfx(Tile t)
Get the station graphics of this tile.
Definition station_map.h:68
void SetStationGfx(Tile t, StationGfx gfx)
Set the station graphics of this tile.
Definition station_map.h:80
bool IsAirportTile(Tile t)
Is this tile a station tile and an airport tile?
bool IsBayRoadStopTile(Tile t)
Is tile t a bay (non-drive through) road stop station?
bool IsBuoy(Tile t)
Is tile t a buoy tile?
bool IsDriveThroughStopTile(Tile t)
Is tile t a drive through road stop station or waypoint?
bool HasStationTileRail(Tile t)
Has this station tile a rail? In other words, is this station tile a rail station or rail waypoint?
void SetRailStationReservation(Tile t, bool b)
Set the reservation state of the rail station.
bool IsAnyRoadStop(Tile t)
Is the station at t a road station?
bool IsStationTileBlocked(Tile t)
Is tile t a blocked tile?
bool IsTruckStop(Tile t)
Is the station at t a truck stop?
bool IsStationRoadStop(Tile t)
Is the station at t a road station?
bool HasStationRail(Tile t)
Has this station tile a rail? In other words, is this station tile a rail station or rail waypoint?
static const int GFX_TRUCK_BUS_DRIVETHROUGH_OFFSET
The offset for the drive through parts.
Definition station_map.h:36
bool IsOilRig(Tile t)
Is tile t part of an oilrig?
bool IsBuoyTile(Tile t)
Is tile t a buoy tile?
bool IsDock(Tile t)
Is tile t a dock tile?
@ Dock
Station with a dock.
@ Train
Station with train station.
@ Airport
Station with an airport.
StationType
Station types.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
Definition string.cpp:75
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:91
static constexpr StringID SPECSTR_PRESIDENT_NAME
Special string for the president's name.
static constexpr StringID SPECSTR_TOWNNAME_START
Special strings for town names.
Information about a aircraft vehicle.
Aircraft, helicopters, rotors and their shadows belong to this class.
Definition aircraft.h:72
Class to backup a specific variable and restore it later.
void Restore()
Restore the variable.
Base class for all station-ish types.
TileArea train_station
Tile area the train 'station' part covers.
Owner owner
The owner of this station.
StationRect rect
NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions.
Town * town
The town this station is associated with.
static BaseStation * GetByTile(TileIndex tile)
Get the base station belonging to a specific tile.
VehicleType type
Type of vehicle.
static void AfterLoad()
Savegame conversion for cargopackets.
Helper class to perform the cargo payment.
Specification of a cargo type.
Definition cargotype.h:74
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo type.
Definition cargotype.h:137
TownAcceptanceEffect town_acceptance_effect
The effect that delivering this cargo type has on towns. Also affects destination of subsidies.
Definition cargotype.h:86
CompanySettings company
default values for per-company settings
Structure to return information about the closest depot location, and whether it could be found.
CompanySettings settings
settings specific for each company
static bool IsValidAiID(auto index)
Is this company a valid company, controlled by the computer (a NoAI program)?
bool freeform_edges
allow terraforming the tiles at the map edges
uint16_t max_bridge_length
maximum length of bridges
uint16_t terraform_frame_burst
how many tile heights may, over a short period, be terraformed?
uint16_t max_tunnel_length
maximum length of tunnels
uint16_t tree_frame_burst
how many trees may, over a short period, be planted?
uint8_t map_height_limit
the maximum allowed heightlevel
uint16_t clear_frame_burst
how many tiles may, over a short period, be cleared?
uint8_t number_towns
the amount of towns
uint32_t max_loan
the maximum initial loan
uint16_t competitors_interval
the interval (in minutes) between adding competitors
uint8_t industry_density
The industry density.
Disasters, like submarines, skyrangers and their shadows, belong to this class.
TownLayout town_layout
select town layout,
TimekeepingUnits timekeeping_units
time units to use for the game economy, either calendar or wallclock
bool allow_town_level_crossings
towns are allowed to build level crossings
bool allow_town_roads
towns are allowed to build roads (always allowed when generating world / in SE)
bool station_noise_level
build new airports when the town noise level is still within accepted limits
bool infrastructure_maintenance
enable monthly maintenance fee for owner infrastructure
uint8_t feeder_payment_share
percentage of leg payment to virtually pay in feeder systems
TownCargoGenMode town_cargogen_mode
algorithm for generating cargo from houses,
uint8_t larger_towns
the number of cities to build. These start off larger and grow twice as fast
uint64_t inflation_payment
Cumulated inflation of cargo payment since game start; 16 bit fractional part.
uint64_t inflation_prices
Cumulated inflation of prices since game start; 16 bit fractional part.
Money old_max_loan_unround
Old: Unrounded max loan.
uint16_t old_max_loan_unround_fract
Old: Fraction of the unrounded max loan.
EngineMiscFlags misc_flags
Miscellaneous flags.
FiosType ftype
File type.
Definition saveload.h:422
AbstractFileType abstract
Abstract file type.
Definition fileio_type.h:64
Basic data to distinguish a GRF.
MD5Hash md5sum
MD5 checksum of file to distinguish files with the same GRF ID (eg. newer version of GRF)
TimerGameCalendar::Year ending_year
scoring end date
LandscapeType landscape
the landscape we're currently in
uint8_t snow_line_height
the configured snow line height (deduced from "snow_coverage")
uint8_t town_name
the town name generator used for town names
TimerGameCalendar::Year starting_year
starting date
LocaleSettings locale
settings related to used currency/unit system in the current game
PathfinderSettings pf
settings for all pathfinders
EconomySettings economy
settings to change the economy
ConstructionSettings construction
construction of things in-game
DifficultySettings difficulty
settings related to the difficulty
GameCreationSettings game_creation
settings used during the creation of a game (map)
StationSettings station
settings related to station management
VehicleSettings vehicle
options for vehicles
LinkGraphSettings linkgraph
settings for link graph calculations
Stores station stats for a single cargo.
@ Rating
This indicates whether a cargo has a rating at the station.
static void UpdateAfterLoad()
Update all caches after loading a game, changing NewGRF, etc.
Group data.
Definition group.h:73
static HouseSpec * Get(size_t house_id)
Get the spec for a house ID.
HouseExtraFlags extra_flags
some more flags
Definition house.h:118
void Reset()
Completely reset the industry build data.
Defines the data structure for constructing industry.
std::array< CargoType, INDUSTRY_NUM_INPUTS > accepts_cargo
16 accepted cargoes.
IndustryBehaviours behaviour
How this industry will behave, and how others entities can use it.
Defines the internal data of a functional industry.
Definition industry.h:62
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
Definition industry.h:234
uint16_t recalc_time
time (in days) for recalculating each link graph component.
DistributionType distribution_mail
distribution type for mail
DistributionType distribution_default
distribution type for all other goods
DistributionType distribution_pax
distribution type for passengers
DistributionType distribution_armoured
distribution type for armoured cargo class
uint16_t recalc_interval
time (in days) between subsequent checks for link graphs to be calculated.
uint8_t units_velocity_nautical
unit system for velocity of ships and aircraft
uint8_t currency
currency we currently use
uint8_t units_velocity
unit system for velocity of trains and road vehicles
uint8_t units_power
unit system for power
uint8_t units_height
unit system for height
uint8_t units_force
unit system for force
uint8_t units_volume
unit system for volume
uint8_t units_weight
unit system for weight
Size related data of the map.
Definition map_func.h:206
static uint SizeY()
Get the size of the map along the Y.
Definition map_func.h:278
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition map_func.h:362
static debug_inline uint SizeX()
Get the size of the map along the X.
Definition map_func.h:269
static uint MaxY()
Gets the maximum Y coordinate within the map, including MP_VOID.
Definition map_func.h:305
static debug_inline uint MaxX()
Gets the maximum X coordinate within the map, including MP_VOID.
Definition map_func.h:296
An object, such as transmitter, on the map.
Definition object_base.h:23
ObjectType type
Type of the object.
Definition object_base.h:24
Town * town
Town the object is built in.
Definition object_base.h:25
static void IncTypeCount(ObjectType type)
Increment the count of objects for this type.
Definition object_base.h:45
TimerGameCalendar::Date build_date
Date of construction.
Definition object_base.h:27
TileArea location
Location of the object.
Definition object_base.h:26
Data for backing up an order of a vehicle so it can be restored after a vehicle is rebuilt in the sam...
Shared order list linking together the linked list of orders and the list of vehicles sharing this or...
Definition order_base.h:264
bool IsType(OrderType type) const
Check whether this order is of the given type.
Definition order_base.h:66
uint16_t w
The width of the area.
TileIndex tile
The base tile of the area.
uint16_t h
The height of the area.
uint8_t wait_for_pbs_path
how long to wait for a path reservation.
uint8_t wait_oneway_signal
waitingtime in days before a oneway signal
bool reverse_at_signals
whether to reverse at signals at all
bool forbid_90_deg
forbid trains to make 90 deg turns
uint8_t wait_twoway_signal
waitingtime in days before a twoway signal
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static Titem * Get(auto index)
Returns Titem with given index.
static size_t GetNumItems()
Returns number of valid items in the pool.
Tindex index
Index of this pool item.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Titem * GetIfValid(auto index)
Returns Titem with given index.
static constexpr size_t MAX_SIZE
Make template parameter accessible from outside.
RailType railtype
Railtype, mangled if elrail is disabled.
Definition engine_type.h:51
A Stop for a Road Vehicle.
Buses, trucks and trams belong to this class.
Definition roadveh.h:98
uint8_t state
Definition roadveh.h:100
RoadType roadtype
NOSAVE: Roadtype of this vehicle.
Definition roadveh.h:108
uint8_t acceleration
Acceleration (1 unit = 1/3.2 mph per tick = 0.5 km-ish/h per tick)
Definition engine_type.h:76
All ships have this type.
Definition ship.h:32
static bool IsExpected(const BaseStation *st)
Helper for checking whether the given station is of this type.
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
static Station * Get(auto index)
Gets station with given index.
static Station * GetIfValid(auto index)
Returns station if the index is a valid index for this station type.
static Station * From(BaseStation *st)
Converts a BaseStation to SpecializedStation with type checking.
T * Next() const
Get next vehicle in the chain.
static Pool::IterateWrapper< T > Iterate(size_t from=0)
Returns an iterable ensemble of all valid vehicles of type T.
static T * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
bool modified_catchment
different-size catchment areas
bool serve_neutral_industries
company stations can serve industries with attached neutral stations
Station data structure.
RoadStop * bus_stops
All the road stops.
static void RecomputeCatchmentForAll()
Recomputes catchment of all stations.
Definition station.cpp:534
RoadStop * truck_stops
All the truck stops.
Struct about subsidies, offered and awarded.
Town data structure.
Definition town.h:52
'Train' is either a loco or a wagon.
Definition train.h:91
Default settings for vehicles.
uint8_t plane_crashes
number of plane crashes, 0 = none, 1 = reduced, 2 = normal
uint8_t roadveh_acceleration_model
realistic acceleration for road vehicles
uint8_t roadveh_slope_steepness
Steepness of hills for road vehicles when using realistic acceleration.
uint8_t train_acceleration_model
realistic acceleration for trains
uint8_t train_slope_steepness
Steepness of hills for trains when using realistic acceleration.
uint8_t road_side
the side of the road vehicles drive on
bool dynamic_engines
enable dynamic allocation of engine data
uint8_t max_train_length
maximum length for trains
uint8_t plane_speed
divisor for speed of aircraft
bool disable_elrails
when true, the elrails are disabled
Vehicle data structure.
Direction direction
facing
VehStates vehstatus
Status.
Order current_order
The current order (+ status, like: loading)
int32_t y_pos
y coordinate.
int32_t x_pos
x coordinate.
TileIndex tile
Current tile index.
Owner owner
Which company owns the vehicle?
Representation of a waypoint.
void RebuildSubsidisedSourceAndDestinationCache()
Perform a full rebuild of the subsidies cache.
Definition subsidy.cpp:103
bool MayAnimateTile(TileIndex tile)
Test if a tile may be animated.
Definition tile_cmd.h:188
bool IsTileFlat(TileIndex tile, int *h)
Check if a given tile is flat.
Definition tile_map.cpp:95
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
Definition tile_map.cpp:136
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
Definition tile_map.cpp:116
uint TileHash(uint x, uint y)
Calculate a hash value from a tile position.
Definition tile_map.h:324
bool IsTileOwner(Tile tile, Owner owner)
Checks if a tile belongs to the given owner.
Definition tile_map.h:214
void SetTileType(Tile tile, TileType type)
Set the type of a tile.
Definition tile_map.h:131
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
Definition tile_map.h:178
void SetTileOwner(Tile tile, Owner owner)
Sets the owner of a tile.
Definition tile_map.h:198
int GetTileMaxPixelZ(TileIndex tile)
Get top height of the tile.
Definition tile_map.h:312
static debug_inline TileType GetTileType(Tile tile)
Get the tiletype of a given tile.
Definition tile_map.h:96
void SetAnimationFrame(Tile t, uint8_t frame)
Set a new animation frame.
Definition tile_map.h:262
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
Definition tile_map.h:279
void SetTropicZone(Tile tile, TropicZone type)
Set the tropic zone.
Definition tile_map.h:225
static debug_inline uint TileHeight(Tile tile)
Returns the height of a tile.
Definition tile_map.h:29
static const uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in ZOOM_BASE.
Definition tile_type.h:18
static const uint MIN_SNOWLINE_HEIGHT
Minimum snowline height.
Definition tile_type.h:32
static const uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
static const uint TILE_UNIT_MASK
For masking in/out the inner-tile world coordinate units.
Definition tile_type.h:16
@ TROPICZONE_NORMAL
Normal tropiczone.
Definition tile_type.h:77
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:95
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:87
@ MP_TREES
Tile got trees.
Definition tile_type.h:52
@ MP_ROAD
A tile with road (or tram tracks)
Definition tile_type.h:50
@ MP_STATION
A tile of a station.
Definition tile_type.h:53
@ MP_TUNNELBRIDGE
Tunnel entry/exit and bridge heads.
Definition tile_type.h:57
@ MP_CLEAR
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition tile_type.h:48
@ MP_HOUSE
A house by a town.
Definition tile_type.h:51
@ MP_WATER
Water tile.
Definition tile_type.h:54
@ MP_RAILWAY
A railway.
Definition tile_type.h:49
@ MP_INDUSTRY
Part of an industry.
Definition tile_type.h:56
@ MP_VOID
Invisible tiles at the SW and SE border.
Definition tile_type.h:55
@ MP_OBJECT
Contains objects such as transmitters and owned land.
Definition tile_type.h:58
static const uint TOWN_GROWTH_WINTER
The town only needs this cargo in the winter (any amount)
Definition town.h:31
const CargoSpec * FindFirstCargoWithTownAcceptanceEffect(TownAcceptanceEffect effect)
Determines the first cargo with a certain town effect.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
static const uint TOWN_GROWTH_DESERT
The town needs the cargo for growth when on desert (any amount)
Definition town.h:32
@ TOWN_CUSTOM_GROWTH
Growth rate is controlled by GS.
Definition town.h:197
void UpdateTownMaxPass(Town *t)
Update the maximum amount of monthly passengers and mail for a town, based on its population.
void ClearAllTownCachedNames()
Clear the cached_name of all towns.
Definition town_cmd.cpp:425
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold=UINT_MAX)
Return the town closest to the given tile within threshold.
static const uint16_t TOWN_GROWTH_RATE_NONE
Special value for Town::growth_rate to disable town growth.
Definition town.h:33
void MakeDefaultName(T *obj)
Set the default name for a depot/waypoint.
Definition town.h:247
void UpdateAllTownVirtCoords()
Update the virtual coords needed to draw the town sign for all towns.
Definition town_cmd.cpp:417
HouseID GetHouseType(Tile t)
Get the type of this house, which is an index into the house spec array.
Definition town_map.h:60
void SetHouseType(Tile t, HouseID house_id)
Set the house type.
Definition town_map.h:71
void SetLiftPosition(Tile t, uint8_t pos)
Set the position of the lift on this animated house.
Definition town_map.h:157
void SetHouseCompleted(Tile t, bool status)
Mark this house as been completed.
Definition town_map.h:178
void SetHouseProtected(Tile t, bool house_protected)
Set a house as protected from removal by towns.
Definition town_map.h:93
void SetTownIndex(Tile t, TownID index)
Set the town index for a road or house tile.
Definition town_map.h:35
bool IsHouseCompleted(Tile t)
Get the completion of this house.
Definition town_map.h:167
static constexpr int RATING_INITIAL
initial rating
Definition town_type.h:45
@ TCGM_ORIGINAL
Original algorithm (quadratic cargo by population)
Definition town_type.h:114
TownLayout
Town Layouts.
Definition town_type.h:81
@ TL_RANDOM
Random town layout.
Definition town_type.h:88
@ TL_BETTER_ROADS
Extended original algorithm (min. 2 distance between roads)
Definition town_type.h:84
TrackBits DiagDirToDiagTrackBits(DiagDirection diagdir)
Maps a (4-way) direction to the diagonal track bits incidating with that diagdir.
Definition track_func.h:524
Trackdir DiagDirToDiagTrackdir(DiagDirection diagdir)
Maps a (4-way) direction to the diagonal trackdir that runs in that direction.
Definition track_func.h:537
TrackBits TrackStatusToTrackBits(TrackStatus ts)
Returns the present-track-information of a TrackStatus.
Definition track_func.h:363
TrackBits
Allow incrementing of Track variables.
Definition track_type.h:35
@ TRACK_BIT_WORMHOLE
Bitflag for a wormhole (used for tunnels)
Definition track_type.h:52
@ TRACK_BIT_Y
Y-axis track.
Definition track_type.h:38
@ TRACK_BIT_NONE
No track.
Definition track_type.h:36
@ TRACK_BIT_X
X-axis track.
Definition track_type.h:37
@ INVALID_TRACK
Flag for an invalid track.
Definition track_type.h:28
@ TRACK_LOWER
Track in the lower corner of the tile (south)
Definition track_type.h:24
@ TRACK_UPPER
Track in the upper corner of the tile (north)
Definition track_type.h:23
void CheckTrainsLengths()
Checks if lengths of all rail vehicles are valid.
Definition train_cmd.cpp:76
VehicleRailFlag
Rail vehicle flags.
Definition train.h:25
@ TFP_NONE
Normal operation.
Definition train.h:39
@ TFP_STUCK
Proceed till next signal, but ignore being stuck till then. This includes force leaving depots.
Definition train.h:40
TransportType
Available types of transport.
@ TRANSPORT_RAIL
Transport by train.
@ TRANSPORT_ROAD
Transport by road vehicle.
TreeGround GetTreeGround(Tile t)
Returns the groundtype for tree tiles.
Definition tree_map.h:102
TreeGround
Enumeration for ground types of tiles with trees.
Definition tree_map.h:52
@ TREE_GROUND_SHORE
shore
Definition tree_map.h:56
@ TREE_GROUND_SNOW_DESERT
a desert or snow tile, depend on landscape
Definition tree_map.h:55
bool IsTunnelTile(Tile t)
Is this a tunnel (entrance)?
Definition tunnel_map.h:34
const uint8_t _tunnel_visibility_frame[DIAGDIR_END]
Frame when a vehicle should be hidden in a tunnel with a certain direction.
DiagDirection GetTunnelBridgeDirection(Tile t)
Get the direction pointing to the other end.
TransportType GetTunnelBridgeTransportType(Tile t)
Tunnel: Get the transport type of the tunnel (road or rail) Bridge: Get the transport type of the bri...
TileIndex GetOtherTunnelBridgeEnd(Tile t)
Determines type of the wormhole and returns its other end.
void SetTunnelBridgeReservation(Tile t, bool b)
Set the reservation state of the rail tunnel/bridge.
@ Crashed
Vehicle is crashed.
@ Hidden
Vehicle is not visible.
@ Stopped
Vehicle is stopped by the player.
@ VEH_INVALID
Non-existing type of vehicle.
@ VEH_ROAD
Road vehicle type.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void MakeVoid(Tile t)
Make a nice void tile ;)
Definition void_map.h:19
void MakeShore(Tile t)
Helper function to make a coast tile.
Definition water_map.h:381
void SetWaterClass(Tile t, WaterClass wc)
Set the water class at a tile.
Definition water_map.h:124
bool IsShipDepot(Tile t)
Is it a water tile with a ship depot on it?
Definition water_map.h:222
WaterClass
classes of water (for WATER_TILE_CLEAR water tile type).
Definition water_map.h:39
@ WATER_CLASS_SEA
Sea.
Definition water_map.h:40
@ WATER_CLASS_CANAL
Canal.
Definition water_map.h:41
@ WATER_CLASS_INVALID
Used for industry tiles on land (also for oilrig if newgrf says so).
Definition water_map.h:43
@ WATER_CLASS_RIVER
River.
Definition water_map.h:42
bool IsShipDepotTile(Tile t)
Is it a ship depot tile?
Definition water_map.h:232
bool IsCoast(Tile t)
Is it a coast tile?
Definition water_map.h:201
WaterTileType GetWaterTileType(Tile t)
Get the water tile type of a tile.
Definition water_map.h:78
void SetNonFloodingWaterTile(Tile t, bool b)
Set the non-flooding water tile state of a tile.
Definition water_map.h:524
void SetWaterTileType(Tile t, WaterTileType type)
Set the water tile type of a tile.
Definition water_map.h:89
WaterClass GetWaterClass(Tile t)
Get the water class at a tile.
Definition water_map.h:112
void MakeCanal(Tile t, Owner o, uint8_t random_bits)
Make a canal tile.
Definition water_map.h:443
uint8_t GetLockPart(Tile t)
Get the part of a lock.
Definition water_map.h:326
TileIndex GetOtherShipDepotTile(Tile t)
Get the other tile of the ship depot.
Definition water_map.h:278
@ WATER_TILE_COAST
Coast.
Definition water_map.h:33
@ WATER_TILE_LOCK
Water lock.
Definition water_map.h:34
@ WATER_TILE_DEPOT
Water Depot.
Definition water_map.h:35
@ WATER_TILE_CLEAR
Plain water.
Definition water_map.h:32
void SetDockingTile(Tile t, bool b)
Set the docking tile state of a tile.
Definition water_map.h:361
@ LOCK_PART_MIDDLE
Middle part of a lock.
Definition water_map.h:66
bool IsWater(Tile t)
Is it a plain water tile?
Definition water_map.h:147
bool IsLock(Tile t)
Is there a lock on a given water tile?
Definition water_map.h:303
void MakeSea(Tile t)
Make a sea tile.
Definition water_map.h:422
void ResetWindowSystem()
Reset the windowing system, by means of shutting it down followed by re-initialization.
Definition window.cpp:1863
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition window.cpp:3265
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3282
@ WC_COMPANY_INFRASTRUCTURE
Company infrastructure overview; Window numbers:
@ WC_COMPANY_COLOUR
Company colour selection; Window numbers:
@ WC_BUILD_TOOLBAR
Build toolbar; Window numbers:
Definition window_type.h:75
void YapfNotifyTrackLayoutChange(TileIndex tile, Track track)
Use this function to notify YAPF that track layout (or signal configuration) has change.