OpenTTD Source 20260731-master-g77ba2b244a
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
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"
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"
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"
45#include "../game/game.hpp"
46#include "../town.h"
47#include "../economy_base.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"
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"
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 WaterClass::Sea */
110 return;
111 }
112
113 bool has_water = false;
114 bool has_canal = false;
115 bool has_river = false;
116
118 Tile neighbour = TileAddByDiagDir(t, dir);
119 switch (GetTileType(neighbour)) {
120 case TileType::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 WaterClass::Sea: has_water = true; break;
127 case WaterClass::Canal: has_canal = true; break;
128 case WaterClass::River: has_river = true; break;
129 default: SlErrorCorrupt("Invalid water class for tile");
130 }
131 }
132 break;
133
135 /* Shore or flooded halftile */
136 has_water |= (GetRailGroundType(neighbour) == RailGroundType::HalfTileWater);
137 break;
138
139 case TileType::Trees:
140 /* trees on shore */
141 has_water |= (static_cast<TreeGround>(GB(neighbour.m2(), 4, 2)) == TreeGround::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 TileType::Road:
167 if (GB(tile.m5(), 4, 2) == to_underlying(RoadTileType::Crossing) && HasBit(tile.m3(), 7)) {
168 tile.m3() = OWNER_TOWN.base();
169 }
170 [[fallthrough]];
171
173 if (tile.m1() & 0x80) SetTileOwner(tile, OWNER_TOWN);
174 break;
175
176 default: break;
177 }
178 }
179}
180
183{
184 for (Town *t : Town::Iterate()) {
185 t->exclusivity = CompanyID::Invalid();
186 }
187}
188
202
207static void UpdateVoidTiles()
208{
209 for (uint x = 0; x < Map::SizeX(); x++) MakeVoid(TileXY(x, Map::MaxY()));
210 for (uint y = 0; y < Map::SizeY(); y++) MakeVoid(TileXY(Map::MaxX(), y));
211}
212
213static inline RailType UpdateRailType(RailType rt, RailType min)
214{
215 return rt >= min ? (RailType)(rt + 1): rt;
216}
217
222{
226 UpdateAllTextEffectVirtCoords();
227 RebuildViewportKdtree();
228}
229
230void ClearAllCachedNames()
231{
232 ClearAllStationCachedNames();
234 ClearAllIndustryCachedNames();
235}
236
247{
248 /* Initialize windows */
251
252 /* Update coordinates of the signs. */
253 ClearAllCachedNames();
255 ResetViewportAfterLoadGame();
256
257 for (Company *c : Company::Iterate()) {
258 /* For each company, verify (while loading a scenario) that the inauguration date is the current year and set it
259 * accordingly if it is not the case. No need to set it on companies that are not been used already,
260 * thus the MIN_YEAR (which is really nothing more than Zero, initialized value) test */
261 if (_file_to_saveload.ftype.abstract == AbstractFileType::Scenario && c->inaugurated_year != EconomyTime::MIN_YEAR) {
262 c->inaugurated_year = TimerGameEconomy::year;
263 }
264 }
265
266 /* Count number of objects per type */
267 for (Object *o : Object::Iterate()) {
268 Object::IncTypeCount(o->type);
269 }
270
271 /* Identify owners of persistent storage arrays */
272 for (Industry *i : Industry::Iterate()) {
273 if (i->psa != nullptr) {
274 i->psa->feature = GrfSpecFeature::Industries;
275 i->psa->tile = i->location.tile;
276 }
277 }
278 for (Station *s : Station::Iterate()) {
279 if (s->airport.psa != nullptr) {
280 s->airport.psa->feature = GrfSpecFeature::Airports;
281 s->airport.psa->tile = s->airport.tile;
282 }
283 }
284 for (Town *t : Town::Iterate()) {
285 for (auto &it : t->psa_list) {
286 it->feature = GrfSpecFeature::FakeTowns;
287 it->tile = t->xy;
288 }
289 }
290 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
291 if (rv->IsFrontEngine()) {
292 rv->CargoChanged();
293 }
294 }
295
297
299
301
302 /* Towns have a noise controlled number of airports system
303 * So each airport's noise value must be added to the town->noise_reached value
304 * Reset each town's noise_reached value to '0' before. */
306
309
310 /* Rebuild the smallmap list of owners. */
312}
313
314typedef void (CDECL *SignalHandlerPointer)(int);
315static SignalHandlerPointer _prev_segfault = nullptr;
316static SignalHandlerPointer _prev_abort = nullptr;
317static SignalHandlerPointer _prev_fpe = nullptr;
318
319static void CDECL HandleSavegameLoadCrash(int signum);
320
325static void SetSignalHandlers()
326{
327 _prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash);
328 _prev_abort = signal(SIGABRT, HandleSavegameLoadCrash);
329 _prev_fpe = signal(SIGFPE, HandleSavegameLoadCrash);
330}
331
336{
337 signal(SIGSEGV, _prev_segfault);
338 signal(SIGABRT, _prev_abort);
339 signal(SIGFPE, _prev_fpe);
340}
341
344
354
361static void CDECL HandleSavegameLoadCrash(int signum)
362{
364
365 std::string message;
366 message.reserve(1024);
367 message += "Loading your savegame caused OpenTTD to crash.\n";
368
369 _saveload_crash_with_missing_newgrfs = std::ranges::any_of(_grfconfig, [](const auto &c) { return c->flags.Test(GRFConfigFlag::Compatible) || c->status == GRFStatus::NotFound; });
370
372 message +=
373 "This is most likely caused by a missing NewGRF or a NewGRF that\n"
374 "has been loaded as replacement for a missing NewGRF. OpenTTD\n"
375 "cannot easily determine whether a replacement NewGRF is of a newer\n"
376 "or older version.\n"
377 "It will load a NewGRF with the same GRF ID as the missing NewGRF.\n"
378 "This means that if the author makes incompatible NewGRFs with the\n"
379 "same GRF ID, OpenTTD cannot magically do the right thing. In most\n"
380 "cases, OpenTTD will load the savegame and not crash, but this is an\n"
381 "exception.\n"
382 "Please load the savegame with the appropriate NewGRFs installed.\n"
383 "The missing/compatible NewGRFs are:\n";
384
385 for (const auto &c : _grfconfig) {
386 if (c->flags.Test(GRFConfigFlag::Compatible)) {
387 const GRFIdentifier &replaced = _gamelog.GetOverriddenIdentifier(*c);
388 format_append(message, "NewGRF {} (checksum {}) not found.\n Loaded NewGRF \"{}\" (checksum {}) with same GRF ID instead.\n",
389 FormatArrayAsHex(c->ident.grfid), FormatArrayAsHex(c->original_md5sum), c->filename, FormatArrayAsHex(replaced.md5sum));
390 }
391 if (c->status == GRFStatus::NotFound) {
392 format_append(message, "NewGRF {} ({}) not found; checksum {}.\n",
393 FormatArrayAsHex(c->ident.grfid), c->filename, FormatArrayAsHex(c->ident.md5sum));
394 }
395 }
396 } else {
397 message +=
398 "This is probably caused by a corruption in the savegame.\n"
399 "Please file a bug report and attach this savegame.\n";
400 }
401
402 ShowInfoI(message);
403
404 SignalHandlerPointer call = nullptr;
405 switch (signum) {
406 case SIGSEGV: call = _prev_segfault; break;
407 case SIGABRT: call = _prev_abort; break;
408 case SIGFPE: call = _prev_fpe; break;
409 default: NOT_REACHED();
410 }
411 if (call != nullptr) call(signum);
412}
413
420{
422
423 /* remove leftover rail piece from crossing (from very old savegames) */
424 Train *v = nullptr;
425 for (Train *w : Train::Iterate()) {
426 if (w->tile == TileIndex(t)) {
427 v = w;
428 break;
429 }
430 }
431
432 if (v != nullptr) {
433 /* when there is a train on crossing (it could happen in TTD), set owner of crossing to train owner */
434 SetTileOwner(t, v->owner);
435 return;
436 }
437
438 /* try to find any connected rail */
440 TileIndex tt{t + TileOffsByDiagDir(dd)};
441 if (GetTileTrackStatus(t, TransportType::Rail, RoadTramType::Invalid, dd).trackdirs.Any() &&
445 return;
446 }
447 }
448
449 if (IsLevelCrossingTile(t)) {
450 /* else change the crossing to normal road (road vehicles won't care) */
451 Owner road = GetRoadOwner(t, RoadTramType::Road);
452 Owner tram = GetRoadOwner(t, RoadTramType::Tram);
454 bool hasroad = HasBit(t.m7(), 6);
455 bool hastram = HasBit(t.m7(), 7);
456
457 /* MakeRoadNormal */
459 SetTileOwner(t, road);
460 t.m3() = (hasroad ? bits.base() : 0);
461 t.m5() = (hastram ? bits.base() : 0) | to_underlying(RoadTileType::Normal) << 6;
462 SB(t.m6(), 2, 4, 0);
464 return;
465 }
466
467 /* if it's not a crossing, make it clean land */
469}
470
478{
479 /* Compute place where this vehicle entered the tile */
480 int entry_x = v->x_pos;
481 int entry_y = v->y_pos;
482 switch (dir) {
483 case Direction::NE: entry_x |= TILE_UNIT_MASK; break;
484 case Direction::NW: entry_y |= TILE_UNIT_MASK; break;
485 case Direction::SW: entry_x &= ~TILE_UNIT_MASK; break;
486 case Direction::SE: entry_y &= ~TILE_UNIT_MASK; break;
487 case Direction::Invalid: break;
488 default: NOT_REACHED();
489 }
490 uint8_t entry_z = GetSlopePixelZ(entry_x, entry_y, true);
491
492 /* Compute middle of the tile. */
493 int middle_x = (v->x_pos & ~TILE_UNIT_MASK) + TILE_SIZE / 2;
494 int middle_y = (v->y_pos & ~TILE_UNIT_MASK) + TILE_SIZE / 2;
495 uint8_t middle_z = GetSlopePixelZ(middle_x, middle_y, true);
496
497 /* middle_z == entry_z, no height change. */
498 if (middle_z == entry_z) return {};
499
500 /* middle_z < entry_z, we are going downwards. */
501 if (middle_z < entry_z) return GroundVehicleFlag::GoingDown;
502
503 /* middle_z > entry_z, we are going upwards. */
505}
506
513{
514 for (Vehicle *v : Vehicle::Iterate()) {
515 if (v->IsGroundVehicle()) {
516 /*
517 * Either the vehicle is not actually on the given tile, i.e. it is
518 * in the wormhole of a bridge or a tunnel, or the Z-coordinate must
519 * be the same as when it would be recalculated right now.
520 */
521 assert(v->tile != TileVirtXY(v->x_pos, v->y_pos) || v->z_pos == GetSlopePixelZ(v->x_pos, v->y_pos, true));
522 }
523 }
524}
525
537
541static void StartScripts()
542{
543 /* Script debug window requires AIs to be started before trying to start GameScript. */
544
545 /* Start the AIs. */
546 for (const Company *c : Company::Iterate()) {
547 if (Company::IsValidAiID(c->index)) AI::StartNew(c->index);
548 }
549
550 /* Start the GameScript. */
552
554}
555
562{
564
565 extern TileIndex _cur_tileloop_tile; // From landscape.cpp.
566 /* The LFSR used in RunTileLoop iteration cannot have a zeroed state, make it non-zeroed. */
567 if (_cur_tileloop_tile == 0) _cur_tileloop_tile = TileIndex{1};
568
570
571 _gamelog.TestRevision();
572 _gamelog.TestMode();
573
574 RebuildTownKdtree();
575 RebuildStationKdtree();
576 /* This needs to be done even before conversion, because some conversions will destroy objects
577 * that otherwise won't exist in the tree. */
578 RebuildViewportKdtree();
579
580 /* Group hierarchy may be evaluated during conversion, so ensure its correct early on. */
582
584
587 } else if (_network_dedicated && _pause_mode.Test(PauseMode::Error)) {
588 Debug(net, 0, "The loading savegame was paused due to an error state");
589 Debug(net, 0, " This savegame cannot be used for multiplayer");
590 /* Restore the signals */
592 return false;
593 } else if (!_networking || _network_server) {
594 /* If we are in singleplayer mode, i.e. not networking, and loading the
595 * savegame or we are loading the savegame as network server we do
596 * not want to be bothered by being paused because of the automatic
597 * reason of a network server, e.g. joining clients or too few
598 * active clients. Note that resetting these values for a network
599 * client are very bad because then the client is going to execute
600 * the game loop when the server is not, i.e. it desyncs. */
602 }
603
604 /* In very old versions, size of train stations was stored differently.
605 * They had swapped width and height if station was built along the Y axis.
606 * TTO and TTD used 3 bits for width/height, while OpenTTD used 4.
607 * Because the data stored by TTDPatch are unusable for rail stations > 7x7,
608 * recompute the width and height. Doing this unconditionally for all old
609 * savegames simplifies the code. */
611 for (Station *st : Station::Iterate()) {
612 st->train_station.w = st->train_station.h = 0;
613 }
614 for (auto t : Map::Iterate()) {
615 if (!IsTileType(t, TileType::Station)) continue;
616 if (t.m5() > 7) continue; // is it a rail station tile?
617 Station *st = Station::Get(t.m2());
618 assert(st->train_station.tile != 0);
619 int dx = TileX(t) - TileX(st->train_station.tile);
620 int dy = TileY(t) - TileY(st->train_station.tile);
621 assert(dx >= 0 && dy >= 0);
622 st->train_station.w = std::max<uint16_t>(st->train_station.w, dx + 1);
623 st->train_station.h = std::max<uint16_t>(st->train_station.h, dy + 1);
624 }
625 }
626
628 _settings_game.construction.map_height_limit = 15;
629
630 /* In old savegame versions, the heightlevel was coded in bits 0..3 of the type field */
631 for (auto t : Map::Iterate()) {
632 t.height() = GB(t.type(), 0, 4);
633 SB(t.type(), 0, 2, GB(t.m6(), 0, 2));
634 SB(t.m6(), 0, 2, 0);
635 if (MayHaveBridgeAbove(t)) {
636 SB(t.type(), 2, 2, GB(t.m6(), 6, 2));
637 SB(t.m6(), 6, 2, 0);
638 } else {
639 SB(t.type(), 2, 2, 0);
640 }
641 }
642 }
643
644 /* in version 2.1 of the savegame, town owner was unified. */
646
647 /* from version 4.1 of the savegame, exclusive rights are stored at towns */
649
650 /* from version 4.2 of the savegame, currencies are in a different order */
652
653 /* In old version there seems to be a problem that water is owned by
654 * OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
655 * (4.3) version, so I just check when versions are older, and then
656 * walk through the whole map.. */
658 for (const auto t : Map::Iterate()) {
659 if (IsTileType(t, TileType::Water) && GetTileOwner(t) >= MAX_COMPANIES) {
661 }
662 }
663 }
664
666 for (Company *c : Company::Iterate()) {
667 c->name = CopyFromOldName(c->name_1);
668 if (!c->name.empty()) c->name_1 = STR_SV_UNNAMED;
669 c->president_name = CopyFromOldName(c->president_name_1);
670 if (!c->president_name.empty()) c->president_name_1 = SPECSTR_PRESIDENT_NAME;
671 }
672
673 for (Station *st : Station::Iterate()) {
674 st->name = CopyFromOldName(st->string_id);
675 /* generating new name would be too much work for little effect, use the station name fallback */
676 if (!st->name.empty()) st->string_id = STR_SV_STNAME_FALLBACK;
677 }
678
679 for (Town *t : Town::Iterate()) {
680 t->name = CopyFromOldName(static_cast<StringID>(t->townnametype));
681 if (!t->name.empty()) t->townnametype = SPECSTR_TOWNNAME_START + _settings_game.game_creation.town_name;
682 }
683 }
684
685 /* From this point the old names array is cleared. */
687
689 /* no station is determined by 'tile == INVALID_TILE' now (instead of '0') */
690 for (Station *st : Station::Iterate()) {
691 if (st->airport.tile == 0) st->airport.tile = INVALID_TILE;
692 if (st->train_station.tile == 0) st->train_station.tile = INVALID_TILE;
693 }
694
695 /* the same applies to Company::location_of_HQ */
696 for (Company *c : Company::Iterate()) {
697 if (c->location_of_HQ == 0 || (IsSavegameVersionBefore(SaveLoadVersion::TownTolerancePauseMode) && c->location_of_HQ == 0xFFFF)) {
698 c->location_of_HQ = INVALID_TILE;
699 }
700 }
701 }
702
703 /* convert road side to my format. */
704 if (to_underlying(_settings_game.vehicle.road_side) != 0) _settings_game.vehicle.road_side = RoadVehicleDrivingSide::Right;
705
706 /* Check if all NewGRFs are present, we are very strict in MP mode */
708 for (const auto &c : _grfconfig) {
709 if (c->status == GRFStatus::NotFound) {
710 _gamelog.GRFRemove(c->ident.grfid);
711 } else if (c->flags.Test(GRFConfigFlag::Compatible)) {
712 _gamelog.GRFCompatible(c->ident);
713 }
714 }
715
716 if (_networking && gcf_res != GRFListCompatibility::AllGood) {
717 SetSaveLoadError(STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH);
718 /* Restore the signals */
720 return false;
721 }
722
723 switch (gcf_res) {
724 case GRFListCompatibility::Compatible: ShowErrorMessage(GetEncodedString(STR_NEWGRF_COMPATIBLE_LOAD_WARNING), {}, WarningLevel::Critical); break;
726 default: break;
727 }
728
729 /* The value of TimerGameCalendar::date_fract got divided, so make sure that old games are converted correctly. */
731
732 /* Update current year
733 * must be done before loading sprites as some newgrfs check it */
735
736 /* Only new games can use wallclock units. */
737 if (IsSavegameVersionBefore(SaveLoadVersion::EconomyModeTimekeepingUnits)) _settings_game.economy.timekeeping_units = TimekeepingUnits::Calendar;
738
739 /* Set the correct default for 'minutes per year' if the savegame was created before the setting existed. */
740 if (IsSavegameVersionBefore(SaveLoadVersion::CalendarSubDateFract)) _settings_game.economy.minutes_per_calendar_year = CalendarTime::DEF_MINUTES_PER_YEAR;
741
742 /* Update economy year. If we don't have a separate economy date saved, follow the calendar date. */
745 } else {
747 }
748
749 /*
750 * Force the old behaviour for compatibility reasons with old savegames. As new
751 * settings can only be loaded from new savegames loading old savegames with new
752 * versions of OpenTTD will normally initialize settings newer than the savegame
753 * version with "new game" defaults which the player can define to their liking.
754 * For some settings we override that to keep the behaviour the same as when the
755 * game was saved.
756 *
757 * Note that there is no non-stop in here. This is because the setting could have
758 * either value in TTDPatch. To convert it properly the user has to make sure the
759 * right value has been chosen in the settings. Otherwise we will be converting
760 * it incorrectly in half of the times without a means to correct that.
761 */
762 if (IsSavegameVersionBefore(SaveLoadVersion::TownTolerancePauseMode, 2)) _settings_game.station.modified_catchment = false;
766 if (IsSavegameVersionBefore(SaveLoadVersion::MoreEngineTypes)) _settings_game.vehicle.dynamic_engines = false;
767 if (IsSavegameVersionBefore(SaveLoadVersion::AirportNoise)) _settings_game.economy.station_noise_level = false;
769 _settings_game.vehicle.train_slope_steepness = 3;
770 }
774 _settings_game.vehicle.roadveh_acceleration_model = AccelerationModel::Original;
775 _settings_game.vehicle.roadveh_slope_steepness = 7;
776 }
777 if (IsSavegameVersionBefore(SaveLoadVersion::DisableTownLevelCrossing)) _settings_game.economy.allow_town_level_crossings = true;
779 _settings_game.vehicle.max_train_length = 50;
780 _settings_game.construction.max_bridge_length = 64;
781 _settings_game.construction.max_tunnel_length = 64;
782 }
783 if (IsSavegameVersionBefore(SaveLoadVersion::InfrastructureMaintenanceCosts)) _settings_game.economy.infrastructure_maintenance = false;
785 _settings_game.linkgraph.distribution_pax = DistributionType::Manual;
786 _settings_game.linkgraph.distribution_mail = DistributionType::Manual;
787 _settings_game.linkgraph.distribution_armoured = DistributionType::Manual;
788 _settings_game.linkgraph.distribution_default = DistributionType::Manual;
789 }
790
792 _settings_game.game_creation.ending_year = CalendarTime::DEF_END_YEAR;
793 }
794
795 /* Convert linkgraph update settings from days to seconds. */
797 _settings_game.linkgraph.recalc_interval *= CalendarTime::SECONDS_PER_DAY;
798 _settings_game.linkgraph.recalc_time *= CalendarTime::SECONDS_PER_DAY;
799 }
800
801 /* Load the sprites */
804
805 /* Copy temporary data to Engine pool */
807
808 /* Connect front and rear engines of multiheaded trains and converts
809 * subtype to the new format */
811
812 /* Connect front and rear engines of multiheaded trains */
814
815 /* Fix the CargoPackets *and* fix the caches of CargoLists.
816 * If this isn't done before Stations and especially Vehicles are
817 * running their AfterLoad we might get in trouble. In the case of
818 * vehicles we could give the wrong (cached) count of items in a
819 * vehicle which causes different results when getting their caches
820 * filled; and that could eventually lead to desyncs. */
822
823 /* Update all vehicles: Phase 1 */
825
826 /* Old orders are no longer needed. */
828
829 /* make sure there is a town in the game */
830 if (_game_mode == GameMode::Normal && Town::GetNumItems() == 0) {
831 SetSaveLoadError(STR_ERROR_NO_TOWN_IN_SCENARIO);
832 /* Restore the signals */
834 return false;
835 }
836
837 /* The void tiles on the southern border used to belong to a wrong class (pre 4.3).
838 * This problem appears in savegame version 21 too, see r3455. But after loading the
839 * savegame and saving again, the buggy map array could be converted to new savegame
840 * version. It didn't show up before r12070. */
842
843 /* Fix the cache for cargo payments. */
844 for (CargoPayment *cp : CargoPayment::Iterate()) {
845 cp->front->cargo_payment = cp;
846 cp->current_station = cp->front->last_station_visited;
847 }
848
849
851 /* Prior to SaveLoadVersion::WaterTileType, the water tile type was stored differently from the enumeration. This has to be
852 * converted before SaveLoadVersion::SplitStationTypeFromGfxid and SaveLoadVersion::NewGRFIndustryRandomTriggers conversions which use GetWaterTileType. */
853 static constexpr uint8_t WBL_COAST_FLAG = 0;
854
855 for (auto t : Map::Iterate()) {
856 if (!IsTileType(t, TileType::Water)) continue;
857
858 switch (GB(t.m5(), 4, 4)) {
859 case 0x0: /* Previously WBL_TYPE_NORMAL, Clear water or coast. */
861 break;
862
863 case 0x1: SetWaterTileType(t, WaterTileType::Lock); break; /* Previously WBL_TYPE_LOCK */
864 case 0x8: SetWaterTileType(t, WaterTileType::Depot); break; /* Previously WBL_TYPE_DEPOT */
865 default: SetWaterTileType(t, WaterTileType::Clear); break; /* Shouldn't happen... */
866 }
867 }
868 }
869
871 /* Locks in very old savegames had OWNER_WATER as owner */
872 for (auto t : Map::Iterate()) {
873 switch (GetTileType(t)) {
874 default: break;
875
876 case TileType::Water:
878 break;
879
880 case TileType::Station: {
881 if (HasBit(t.m6(), 3)) SetBit(t.m6(), 2);
882 StationGfx gfx = GetStationGfx(t);
883 StationType st;
884 if ( IsInsideMM(gfx, 0, 8)) { // Rail station
886 SetStationGfx(t, gfx - 0);
887 } else if (IsInsideMM(gfx, 8, 67)) { // Airport
889 SetStationGfx(t, gfx - 8);
890 } else if (IsInsideMM(gfx, 67, 71)) { // Truck
892 SetStationGfx(t, gfx - 67);
893 } else if (IsInsideMM(gfx, 71, 75)) { // Bus
894 st = StationType::Bus;
895 SetStationGfx(t, gfx - 71);
896 } else if (gfx == 75) { // Oil rig
898 SetStationGfx(t, gfx - 75);
899 } else if (IsInsideMM(gfx, 76, 82)) { // Dock
901 SetStationGfx(t, gfx - 76);
902 } else if (gfx == 82) { // Buoy
904 SetStationGfx(t, gfx - 82);
905 } else if (IsInsideMM(gfx, 83, 168)) { // Extended airport
907 SetStationGfx(t, gfx - 83 + 67 - 8);
908 } else if (IsInsideMM(gfx, 168, 170)) { // Drive through truck
911 } else if (IsInsideMM(gfx, 170, 172)) { // Drive through bus
912 st = StationType::Bus;
914 } else {
915 /* Restore the signals */
917 return false;
918 }
919 SB(t.m6(), 3, 3, to_underlying(st));
920 break;
921 }
922 }
923 }
924 }
925
927 /* Expansion of station type field in m6 */
928 for (auto t : Map::Iterate()) {
930 ClrBit(t.m6(), 6);
931 }
932 }
933 }
934
935 for (const auto t : Map::Iterate()) {
936 switch (GetTileType(t)) {
937 case TileType::Station: {
939
940 /* Sanity check */
941 if (!IsBuoy(t) && bst->owner != GetTileOwner(t)) SlErrorCorrupt("Wrong owner for station tile");
942
943 /* Set up station spread */
944 bst->rect.BeforeAddTile(t, StationRect::ADD_FORCE);
945
946 /* Waypoints don't have road stops/oil rigs in the old format */
947 if (!Station::IsExpected(bst)) break;
948 Station *st = Station::From(bst);
949
950 switch (GetStationType(t)) {
952 case StationType::Bus:
954 /* Before version 5 you could not have more than 250 stations.
955 * Version 6 adds large maps, so you could only place 253*253
956 * road stops on a map (no freeform edges) = 64009. So, yes
957 * someone could in theory create such a full map to trigger
958 * this assertion, it's safe to assume that's only something
959 * theoretical and does not happen in normal games. */
961
962 /* From this version on there can be multiple road stops of the
963 * same type per station. Convert the existing stops to the new
964 * internal data structure. */
965 RoadStop *rs = RoadStop::Create(t);
966
967 RoadStop **head =
968 IsTruckStop(t) ? &st->truck_stops : &st->bus_stops;
969 *head = rs;
970 }
971 break;
972
973 case StationType::Oilrig: {
974 /* The internal encoding of oil rigs was changed twice.
975 * It was 3 (till 2.2) and later 5 (till 5.1).
976 * DeleteOilRig asserts on the correct type, and
977 * setting it unconditionally does not hurt.
978 */
979 Station::GetByTile(t)->airport.type = AT_OILRIG;
980
981 /* Very old savegames sometimes have phantom oil rigs, i.e.
982 * an oil rig which got shut down, but not completely removed from
983 * the map
984 */
985 TileIndex t1 = TileAddXY(t, 0, 1);
986 if (!IsTileType(t1, TileType::Industry) || GetIndustryGfx(t1) != GFX_OILRIG_1) {
987 DeleteOilRig(t);
988 }
989 break;
990 }
991
992 default: break;
993 }
994 break;
995 }
996
997 default: break;
998 }
999 }
1000
1001 /* In version 6.1 we put the town index in the map-array. To do this, we need
1002 * to use m2 (16bit big), so we need to clean m2, and that is where this is
1003 * all about ;) */
1005 for (auto t : Map::Iterate()) {
1006 switch (GetTileType(t)) {
1007 case TileType::House:
1008 t.m4() = t.m2();
1010 break;
1011
1012 case TileType::Road:
1013 t.m4() |= (t.m2() << 4);
1014 if (GB(t.m5(), 4, 2) == to_underlying(RoadTileType::Depot)) break;
1015 if ((GB(t.m5(), 4, 2) == to_underlying(RoadTileType::Crossing) ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) {
1017 } else {
1018 SetTownIndex(t, TownID::Begin());
1019 }
1020 break;
1021
1022 default: break;
1023 }
1024 }
1025 }
1026
1027 /* Force the freeform edges to false for old savegames. */
1029 _settings_game.construction.freeform_edges = false;
1030 }
1031
1032 /* From version 9.0, we update the max passengers of a town (was sometimes negative
1033 * before that. */
1035 for (Town *t : Town::Iterate()) UpdateTownMaxPass(t);
1036 }
1037
1038 /* From version 16.0, we included autorenew on engines, which are now saved, but
1039 * of course, we do need to initialize them for older savegames. */
1041 for (Company *c : Company::Iterate()) {
1042 c->engine_renew_list = nullptr;
1043 c->settings.engine_renew = false;
1044 c->settings.engine_renew_months = 6;
1045 c->settings.engine_renew_money = 100000;
1046 }
1047
1048 /* When loading a game, _local_company is not yet set to the correct value.
1049 * However, in a dedicated server we are a spectator, so nothing needs to
1050 * happen. In case we are not a dedicated server, the local company always
1051 * becomes the first available company, unless we are in the scenario editor
1052 * where all the companies are 'invalid'.
1053 */
1055 if (!_network_dedicated && c != nullptr) {
1056 c->settings = _settings_client.company;
1057 }
1058 }
1059
1061 for (auto t : Map::Iterate()) {
1062 switch (GetTileType(t)) {
1063 case TileType::Railway:
1064 if (IsPlainRail(t)) {
1065 /* Swap ground type and signal type for plain rail tiles, so the
1066 * ground type uses the same bits as for depots and waypoints. */
1067 uint tmp = GB(t.m4(), 0, 4);
1068 SB(t.m4(), 0, 4, GB(t.m2(), 0, 4));
1069 SB(t.m2(), 0, 4, tmp);
1070 } else if (HasBit(t.m5(), 2)) {
1071 /* Split waypoint and depot rail type and remove the subtype. */
1072 ClrBit(t.m5(), 2);
1073 ClrBit(t.m5(), 6);
1074 }
1075 break;
1076
1077 case TileType::Road:
1078 /* Swap m3 and m4, so the track type for rail crossings is the
1079 * same as for normal rail. */
1080 std::swap(t.m3(), t.m4());
1081 break;
1082
1083 default: break;
1084 }
1085 }
1086 }
1087
1089 /* Added the RoadType */
1091 for (auto t : Map::Iterate()) {
1092 switch (GetTileType(t)) {
1093 case TileType::Road:
1094 SB(t.m5(), 6, 2, GB(t.m5(), 4, 2));
1095 switch (GetRoadTileType(t)) {
1096 default: SlErrorCorrupt("Invalid road tile type");
1098 SB(t.m4(), 0, 4, GB(t.m5(), 0, 4));
1099 SB(t.m4(), 4, 4, 0);
1100 SB(t.m6(), 2, 4, 0);
1101 break;
1103 SB(t.m4(), 5, 2, GB(t.m5(), 2, 2));
1104 break;
1105 case RoadTileType::Depot: break;
1106 }
1107 SB(t.m7(), 6, 2, 1); // Set pre-NRT road type bits for conversion later.
1108 break;
1109
1110 case TileType::Station:
1111 if (IsStationRoadStop(t)) SB(t.m7(), 6, 2, 1);
1112 break;
1113
1115 /* Middle part of "old" bridges */
1116 if (old_bridge && IsBridge(t) && HasBit(t.m5(), 6)) break;
1117 if (((old_bridge && IsBridge(t)) ? (TransportType)GB(t.m5(), 1, 2) : GetTunnelBridgeTransportType(t)) == TransportType::Road) {
1118 SB(t.m7(), 6, 2, 1); // Set pre-NRT road type bits for conversion later.
1119 }
1120 break;
1121
1122 default: break;
1123 }
1124 }
1125 }
1126
1130
1131 for (auto t : Map::Iterate()) {
1132 switch (GetTileType(t)) {
1133 case TileType::Road:
1134 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m7(), 5, 3));
1135 SB(t.m7(), 5, 1, GB(t.m3(), 7, 1)); // snow/desert
1136 switch (GetRoadTileType(t)) {
1137 default: SlErrorCorrupt("Invalid road tile type");
1139 SB(t.m7(), 0, 4, GB(t.m3(), 0, 4)); // road works
1140 SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground
1141 SB(t.m3(), 0, 4, GB(t.m4(), 4, 4)); // tram bits
1142 SB(t.m3(), 4, 4, GB(t.m5(), 0, 4)); // tram owner
1143 SB(t.m5(), 0, 4, GB(t.m4(), 0, 4)); // road bits
1144 break;
1145
1147 SB(t.m7(), 0, 5, GB(t.m4(), 0, 5)); // road owner
1148 SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground
1149 SB(t.m3(), 4, 4, GB(t.m5(), 0, 4)); // tram owner
1150 SB(t.m5(), 0, 1, GB(t.m4(), 6, 1)); // road axis
1151 SB(t.m5(), 5, 1, GB(t.m4(), 5, 1)); // crossing state
1152 break;
1153
1155 break;
1156 }
1157 if (!IsRoadDepot(t) && !HasTownOwnedRoad(t)) {
1158 const Town *town = CalcClosestTownFromTile(t);
1159 if (town != nullptr) SetTownIndex(t, town->index);
1160 }
1161 t.m4() = 0;
1162 break;
1163
1164 case TileType::Station:
1165 if (!IsStationRoadStop(t)) break;
1166
1167 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m3(), 0, 3));
1168 SB(t.m7(), 0, 5, (HasBit(t.m6(), 2) ? OWNER_TOWN : GetTileOwner(t)).base());
1169 SB(t.m3(), 4, 4, t.m1());
1170 t.m4() = 0;
1171 break;
1172
1174 if (old_bridge && IsBridge(t) && HasBit(t.m5(), 6)) break;
1175 if (((old_bridge && IsBridge(t)) ? (TransportType)GB(t.m5(), 1, 2) : GetTunnelBridgeTransportType(t)) == TransportType::Road) {
1176 if (fix_roadtypes) SB(t.m7(), 6, 2, GB(t.m3(), 0, 3));
1177
1178 Owner o = GetTileOwner(t);
1179 SB(t.m7(), 0, 5, o.base()); // road owner
1180 SB(t.m3(), 4, 4, (o == OWNER_NONE ? OWNER_TOWN : o).base()); // tram owner
1181 }
1182 SB(t.m6(), 2, 4, GB(t.m2(), 4, 4)); // bridge type
1183 SB(t.m7(), 5, 1, GB(t.m4(), 7, 1)); // snow/desert
1184
1185 t.m2() = 0;
1186 t.m4() = 0;
1187 break;
1188
1189 default: break;
1190 }
1191 }
1192 }
1193
1194 /* Railtype moved from m3 to m8 in version SaveLoadVersion::ExtendRailtypes. */
1196 for (auto t : Map::Iterate()) {
1197 switch (GetTileType(t)) {
1198 case TileType::Railway:
1199 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1200 break;
1201
1202 case TileType::Road:
1203 if (IsLevelCrossing(t)) {
1204 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1205 }
1206 break;
1207
1208 case TileType::Station:
1209 if (HasStationRail(t)) {
1210 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1211 }
1212 break;
1213
1216 SetRailType(t, (RailType)GB(t.m3(), 0, 4));
1217 }
1218 break;
1219
1220 default:
1221 break;
1222 }
1223 }
1224 }
1225
1227 for (auto t : Map::Iterate()) {
1229 if (IsBridgeTile(t)) {
1230 if (HasBit(t.m5(), 6)) { // middle part
1231 Axis axis = static_cast<Axis>(GB(t.m5(), 0, 1));
1232
1233 if (HasBit(t.m5(), 5)) { // transport route under bridge?
1234 if (static_cast<TransportType>(GB(t.m5(), 3, 2)) == TransportType::Rail) {
1236 t,
1237 GetTileOwner(t),
1238 AxisToTrack(OtherAxis(axis)),
1239 GetRailType(t)
1240 );
1241 } else {
1242 TownID town = IsTileOwner(t, OWNER_TOWN) ? ClosestTownFromTile(t, UINT_MAX)->index : TownID::Begin();
1243
1244 /* MakeRoadNormal */
1246 t.m2() = town.base();
1247 t.m3() = 0;
1249 SB(t.m6(), 2, 4, 0);
1250 t.m7() = 1 << 6;
1252 }
1253 } else {
1254 if (GB(t.m5(), 3, 2) == 0) {
1256 } else {
1257 if (!IsTileFlat(t)) {
1258 MakeShore(t);
1259 } else {
1260 if (GetTileOwner(t) == OWNER_WATER) {
1261 MakeSea(t);
1262 } else {
1263 MakeCanal(t, GetTileOwner(t), Random());
1264 }
1265 }
1266 }
1267 }
1268 SetBridgeMiddle(t, axis);
1269 } else { // ramp
1270 Axis axis = static_cast<Axis>(GB(t.m5(), 0, 1));
1271 uint north_south = GB(t.m5(), 5, 1);
1272 DiagDirection dir = ReverseDiagDir(XYNSToDiagDir(axis, north_south));
1273 TransportType type = static_cast<TransportType>(GB(t.m5(), 1, 2));
1274
1275 t.m5() = 1 << 7 | to_underlying(type) << 2 | to_underlying(dir);
1276 }
1277 }
1278 }
1279
1280 for (Vehicle *v : Vehicle::Iterate()) {
1281 if (!v->IsGroundVehicle()) continue;
1282 if (IsBridgeTile(v->tile)) {
1284
1285 if (dir != DirToDiagDir(v->direction)) continue;
1286 switch (dir) {
1287 default: SlErrorCorrupt("Invalid vehicle direction");
1288 case DiagDirection::NE: if ((v->x_pos & 0xF) != 0) continue; break;
1289 case DiagDirection::SE: if ((v->y_pos & 0xF) != TILE_SIZE - 1) continue; break;
1290 case DiagDirection::SW: if ((v->x_pos & 0xF) != TILE_SIZE - 1) continue; break;
1291 case DiagDirection::NW: if ((v->y_pos & 0xF) != 0) continue; break;
1292 }
1293 } else if (v->z_pos > GetTileMaxPixelZ(TileVirtXY(v->x_pos, v->y_pos))) {
1294 v->tile = GetNorthernBridgeEnd(v->tile);
1295 v->UpdatePosition();
1296 } else {
1297 continue;
1298 }
1299 if (v->type == VehicleType::Train) {
1301 } else {
1303 }
1304 }
1305 }
1306
1308 /* Add road subtypes */
1309 for (auto t : Map::Iterate()) {
1310 bool has_road = false;
1311 switch (GetTileType(t)) {
1312 case TileType::Road:
1313 has_road = true;
1314 break;
1315 case TileType::Station:
1316 has_road = IsAnyRoadStop(t);
1317 break;
1320 break;
1321 default:
1322 break;
1323 }
1324
1325 if (has_road) {
1326 RoadType road_rt = HasBit(t.m7(), 6) ? ROADTYPE_ROAD : INVALID_ROADTYPE;
1327 RoadType tram_rt = HasBit(t.m7(), 7) ? ROADTYPE_TRAM : INVALID_ROADTYPE;
1328
1329 assert(road_rt != INVALID_ROADTYPE || tram_rt != INVALID_ROADTYPE);
1330 SetRoadTypes(t, road_rt, tram_rt);
1331 SB(t.m7(), 6, 2, 0); // Clear pre-NRT road type bits.
1332 }
1333 }
1334 }
1335
1336 /* Elrails got added in rev 24 */
1338 RailType min_rail = RAILTYPE_ELECTRIC;
1339
1340 for (Train *v : Train::Iterate()) {
1341 RailTypes rts = RailVehInfo(v->engine_type)->railtypes;
1342
1343 v->railtypes = rts;
1344 if (rts.Test(RAILTYPE_ELECTRIC)) min_rail = RAILTYPE_RAIL;
1345 }
1346
1347 /* .. so we convert the entire map from normal to elrail (so maintain "fairness") */
1348 for (const auto t : Map::Iterate()) {
1349 switch (GetTileType(t)) {
1350 case TileType::Railway:
1351 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1352 break;
1353
1354 case TileType::Road:
1355 if (IsLevelCrossing(t)) {
1356 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1357 }
1358 break;
1359
1360 case TileType::Station:
1361 if (HasStationRail(t)) {
1362 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1363 }
1364 break;
1365
1368 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1369 }
1370 break;
1371
1372 default:
1373 break;
1374 }
1375 }
1376 }
1377
1378 /* In version 16.1 of the savegame a company can decide if trains, which get
1379 * replaced, shall keep their old length. In all prior versions, just default
1380 * to false */
1382 for (Company *c : Company::Iterate()) c->settings.renew_keep_length = false;
1383 }
1384
1386 /* Waypoints became subclasses of stations ... */
1388 /* ... and buoys were moved to waypoints. */
1390 }
1391
1392 /* From version 15, we moved a semaphore bit from bit 2 to bit 3 in m4, making
1393 * room for PBS. Now in version 21 move it back :P. */
1395 for (auto t : Map::Iterate()) {
1396 switch (GetTileType(t)) {
1397 case TileType::Railway:
1398 if (HasSignals(t)) {
1399 /* Original signal type/variant was stored in m4 but since saveload
1400 * version 48 they are in m2. The bits has been already moved to m2
1401 * (see the code somewhere above) so don't use m4, use m2 instead. */
1402
1403 /* convert old PBS signals to combo-signals */
1404 if (HasBit(t.m2(), 2)) SB(t.m2(), 0, 2, to_underlying(SignalType::Combo));
1405
1406 /* move the signal variant back */
1408 ClrBit(t.m2(), 3);
1409 }
1410
1411 /* Clear PBS reservation on track */
1412 if (!IsRailDepotTile(t)) {
1413 SB(t.m4(), 4, 4, 0);
1414 } else {
1415 ClrBit(t.m3(), 6);
1416 }
1417 break;
1418
1419 case TileType::Station: // Clear PBS reservation on station
1420 ClrBit(t.m3(), 6);
1421 break;
1422
1423 default: break;
1424 }
1425 }
1426 }
1427
1429 /* Remove obsolete VS_WAIT_FOR_SLOT state from road vehicles. */
1430 static constexpr VehStates OLD_VS_WAIT_FOR_SLOT{0x40};
1431 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1432 rv->vehstatus.Reset(OLD_VS_WAIT_FOR_SLOT);
1433 }
1434 }
1435
1437 for (Station *st : Station::Iterate()) {
1438 st->last_vehicle_type = VehicleType::Invalid;
1439 }
1440 }
1441
1443
1446 }
1447
1448 for (Company *c : Company::Iterate()) {
1449 c->avail_railtypes = GetCompanyRailTypes(c->index);
1450 c->avail_roadtypes = GetCompanyRoadTypes(c->index);
1451 }
1452
1453 AfterLoadStations();
1454
1455 /* Time starts at 0 instead of 1920.
1456 * Account for this in older games by adding an offset */
1462
1466 for (Company *c : Company::Iterate()) c->inaugurated_year += EconomyTime::ORIGINAL_BASE_YEAR;
1467 for (Industry *i : Industry::Iterate()) i->last_prod_year += EconomyTime::ORIGINAL_BASE_YEAR;
1468
1469 for (Vehicle *v : Vehicle::Iterate()) {
1470 v->date_of_last_service += EconomyTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
1471 v->build_year += CalendarTime::ORIGINAL_BASE_YEAR;
1472 }
1473 }
1474
1475 /* From 32 on we save the industry who made the farmland.
1476 * To give this prettiness to old savegames, we remove all farmfields and
1477 * plant new ones. */
1479 for (const auto t : Map::Iterate()) {
1481 /* remove fields */
1483 }
1484 }
1485
1486 for (Industry *i : Industry::Iterate()) {
1487 uint j;
1488
1490 for (j = 0; j != 50; j++) PlantRandomFarmField(i);
1491 }
1492 }
1493 }
1494
1495 /* Setting no refit flags to all orders in savegames from before refit in orders were added */
1497 for (OrderList *orderlist : OrderList::Iterate()) {
1498 for (Order &order : orderlist->GetOrders()) {
1499 order.SetRefit(CARGO_NO_REFIT);
1500 }
1501 }
1502
1503 for (Vehicle *v : Vehicle::Iterate()) {
1504 v->current_order.SetRefit(CARGO_NO_REFIT);
1505 }
1506 }
1507
1508 /* from version 38 we have optional elrails, since we cannot know the
1509 * preference of a user, let elrails enabled; it can be disabled manually */
1511 /* do the same as when elrails were enabled/disabled manually just now */
1512 UpdateDisableElrailSettingState(_settings_game.vehicle.disable_elrails, false);
1514
1515 /* From version 53, the map array was changed for house tiles to allow
1516 * space for newhouses grf features. A new byte, m7, was also added. */
1518 for (auto t : Map::Iterate()) {
1519 if (IsTileType(t, TileType::House)) {
1520 if (GB(t.m3(), 6, 2) != TOWN_HOUSE_COMPLETED) {
1521 /* Move the construction stage from m3[7..6] to m5[5..4].
1522 * The construction counter does not have to move. */
1523 SB(t.m5(), 3, 2, GB(t.m3(), 6, 2));
1524 SB(t.m3(), 6, 2, 0);
1525
1526 /* The "house is completed" bit is now in m6[2]. */
1527 SetHouseCompleted(t, false);
1528 } else {
1529 /* The "lift has destination" bit has been moved from
1530 * m5[7] to m7[0]. */
1531 AssignBit(t.m7(), 0, HasBit(t.m5(), 7));
1532 ClrBit(t.m5(), 7);
1533
1534 /* The "lift is moving" bit has been removed, as it does
1535 * the same job as the "lift has destination" bit. */
1536 ClrBit(t.m1(), 7);
1537
1538 /* The position of the lift goes from m1[7..0] to m6[7..2],
1539 * making m1 totally free, now. The lift position does not
1540 * have to be a full byte since the maximum value is 36. */
1541 SetLiftPosition(t, GB(t.m1(), 0, 6 ));
1542
1543 t.m1() = 0;
1544 t.m3() = 0;
1545 SetHouseCompleted(t, true);
1546 }
1547 }
1548 }
1549 }
1550
1552 for (auto t : Map::Iterate()) {
1553 if (IsTileType(t, TileType::House)) {
1554 /* House type is moved from m4 + m3[6] to m8. */
1555 SetHouseType(t, t.m4() | (GB(t.m3(), 6, 1) << 8));
1556 t.m4() = 0;
1557 ClrBit(t.m3(), 6);
1558 }
1559 }
1560 }
1561
1562 /* Check and update house and town values */
1564
1566 for (auto t : Map::Iterate()) {
1568 switch (GetIndustryGfx(t)) {
1569 case GFX_POWERPLANT_SPARKS:
1570 t.m3() = GB(t.m1(), 2, 5);
1571 break;
1572
1573 case GFX_OILWELL_ANIMATED_1:
1574 case GFX_OILWELL_ANIMATED_2:
1575 case GFX_OILWELL_ANIMATED_3:
1576 t.m3() = GB(t.m1(), 0, 2);
1577 break;
1578
1579 case GFX_COAL_MINE_TOWER_ANIMATED:
1580 case GFX_COPPER_MINE_TOWER_ANIMATED:
1581 case GFX_GOLD_MINE_TOWER_ANIMATED:
1582 t.m3() = t.m1();
1583 break;
1584
1585 default: // No animation states to change
1586 break;
1587 }
1588 }
1589 }
1590 }
1591
1593 /* Originally just the fact that some cargo had been paid for was
1594 * stored to stop people cheating and cashing in several times. This
1595 * wasn't enough though as it was cleared when the vehicle started
1596 * loading again, even if it didn't actually load anything, so now the
1597 * amount that has been paid is stored. */
1598 for (Vehicle *v : Vehicle::Iterate()) {
1599 v->vehicle_flags.Reset(VehicleFlag{2});
1600 }
1601 }
1602
1603 /* Buoys do now store the owner of the previous water tile, which can never
1604 * be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
1606 for (Waypoint *wp : Waypoint::Iterate()) {
1607 if (wp->facilities.Test(StationFacility::Dock) && IsTileOwner(wp->xy, OWNER_NONE) && TileHeight(wp->xy) == 0) SetTileOwner(wp->xy, OWNER_WATER);
1608 }
1609 }
1610
1612 /* Aircraft units changed from 8 mph to 1 km-ish/h */
1613 for (Aircraft *v : Aircraft::Iterate()) {
1614 if (v->subtype <= AIR_AIRCRAFT) {
1615 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
1616 v->cur_speed *= 128;
1617 v->cur_speed /= 10;
1618 v->acceleration = avi->acceleration;
1619 }
1620 }
1621 }
1622
1624 /* Perform conversion of very old face bits. */
1625 for (Company *c : Company::Iterate()) {
1626 c->face = ConvertFromOldCompanyManagerFace(c->face.bits);
1627 }
1629 /* Convert old gender and ethnicity bits to face style. */
1630 for (Company *c : Company::Iterate()) {
1631 SetCompanyManagerFaceStyle(c->face, GB(c->face.bits, 0, 2));
1632 }
1633 } else {
1634 /* Look up each company face style by its label. */
1635 for (Company *c : Company::Iterate()) {
1636 auto style = FindCompanyManagerFaceLabel(c->face.style_label);
1637 if (style.has_value()) {
1638 SetCompanyManagerFaceStyle(c->face, *style);
1639 } else {
1640 /* Style no longer exists, pick an entirely new face. */
1642 }
1643 }
1644 }
1645
1647 for (auto t : Map::Iterate()) {
1648 if (IsTileType(t, TileType::Object) && t.m5() == OBJECT_STATUE) {
1649 t.m2() = CalcClosestTownFromTile(t)->index.base();
1650 }
1651 }
1652 }
1653
1654 /* A setting containing the proportion of towns that grow twice as
1655 * fast was added in version 54. From version 56 this is now saved in the
1656 * town as cities can be built specifically in the scenario editor. */
1658 for (Town *t : Town::Iterate()) {
1659 if (_settings_game.economy.larger_towns != 0 && (t->index % _settings_game.economy.larger_towns) == 0) {
1660 t->larger_town = true;
1661 }
1662 }
1663 }
1664
1666 /* Added a FIFO queue of vehicles loading at stations */
1667 for (Vehicle *v : Vehicle::Iterate()) {
1668 if ((v->type != VehicleType::Train || Train::From(v)->IsFrontEngine()) && // for all locs
1669 !v->vehstatus.Any({VehState::Stopped, VehState::Crashed}) && // not stopped or crashed
1670 v->current_order.IsType(OT_LOADING)) { // loading
1671 Station::Get(v->last_station_visited)->loading_vehicles.push_back(v);
1672
1673 /* The loading finished flag is *only* set when actually completely
1674 * finished. Because the vehicle is loading, it is not finished. */
1675 v->vehicle_flags.Reset(VehicleFlag::LoadingFinished);
1676 }
1677 }
1679 /* For some reason non-loading vehicles could be in the station's loading vehicle list */
1680
1681 for (Station *st : Station::Iterate()) {
1682 for (auto iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end(); /* nothing */) {
1683 Vehicle *v = *iter;
1684 if (!v->current_order.IsType(OT_LOADING)) {
1685 iter = st->loading_vehicles.erase(iter);
1686 } else {
1687 ++iter;
1688 }
1689 }
1690 }
1691 }
1692
1694 /* Setting difficulty industry_density other than zero get bumped to +1
1695 * since a new option (very low at position 1) has been added */
1696 if (_settings_game.difficulty.industry_density > IndustryDensity::FundedOnly) {
1697 _settings_game.difficulty.industry_density = static_cast<IndustryDensity>(to_underlying(_settings_game.difficulty.industry_density) + 1);
1698 }
1699
1700 /* Same goes for number of towns, although no test is needed, just an increment */
1701 _settings_game.difficulty.number_towns++;
1702 }
1703
1705 /* Since now we allow different signal types and variants on a single tile.
1706 * Move signal states to m4 to make room and clone the signal type/variant. */
1707 for (auto t : Map::Iterate()) {
1708 if (IsTileType(t, TileType::Railway) && HasSignals(t)) {
1709 /* move signal states */
1710 SetSignalStates(t, GB(t.m2(), 4, 4));
1711 SB(t.m2(), 4, 4, 0);
1712 /* clone signal type and variant */
1713 SB(t.m2(), 4, 3, GB(t.m2(), 0, 3));
1714 }
1715 }
1716 }
1717
1719 /* In some old savegames a bit was cleared when it should not be cleared */
1720 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1721 if (rv->state == 250 || rv->state == 251) {
1722 SetBit(rv->state, 2);
1723 }
1724 }
1725 }
1726
1728 /* Added variables to support newindustries */
1729 for (Industry *i : Industry::Iterate()) i->founder = OWNER_NONE;
1730 }
1731
1732 /* From version 82, old style canals (above sealevel (0), WATER owner) are no longer supported.
1733 Replace the owner for those by OWNER_NONE. */
1735 for (const auto t : Map::Iterate()) {
1736 if (IsTileType(t, TileType::Water) &&
1738 GetTileOwner(t) == OWNER_WATER &&
1739 TileHeight(t) != 0) {
1741 }
1742 }
1743 }
1744
1745 /*
1746 * Add the 'previous' owner to the ship depots so we can reset it with
1747 * the correct values when it gets destroyed. This prevents that
1748 * someone can remove canals owned by somebody else and it prevents
1749 * making floods using the removal of ship depots.
1750 */
1752 for (auto t : Map::Iterate()) {
1753 if (IsShipDepotTile(t)) {
1754 t.m4() = (TileHeight(t) == 0 ? OWNER_WATER : OWNER_NONE).base();
1755 }
1756 }
1757 }
1758
1760 for (Station *st : Station::Iterate()) {
1761 for (GoodsEntry &ge : st->goods) {
1762 ge.last_speed = 0;
1764 }
1765 }
1766 }
1767
1768 /* At version 78, industry cargo types can be changed, and are stored with the industry. For older save versions
1769 * copy the IndustrySpec's cargo types over to the Industry. */
1771 for (Industry *i : Industry::Iterate()) {
1772 const IndustrySpec *indsp = GetIndustrySpec(i->type);
1773 for (uint j = 0; j < std::size(i->produced); j++) {
1774 i->produced[j].cargo = indsp->produced_cargo[j];
1775 }
1776 for (uint j = 0; j < std::size(i->accepted); j++) {
1777 i->accepted[j].cargo = indsp->accepts_cargo[j];
1778 }
1779 }
1780 }
1781
1782 /* Industry cargo slots were fixed size before (and including) SaveLoadVersion::VehicleEconomyAge (either 2/3 or 16/16),
1783 * after this they are dynamic. Trim excess slots. */
1785 for (Industry *i : Industry::Iterate()) {
1787 }
1788 }
1789
1790 /* Before version 81, the density of grass was always stored as zero, and
1791 * grassy trees were always drawn fully grassy. Furthermore, trees on rough
1792 * land used to have zero density, now they have full density. Therefore,
1793 * make all grassy/rough land trees have a density of 3. */
1795 for (auto t : Map::Iterate()) {
1796 if (GetTileType(t) == TileType::Trees) {
1797 TreeGround ground_type = (TreeGround)GB(t.m2(), 4, 2);
1798 if (ground_type != TreeGround::SnowOrDesert) SB(t.m2(), 6, 2, 3);
1799 }
1800 }
1801 }
1802
1803
1805 /* Rework of orders. */
1806 for (OrderList *orderlist : OrderList::Iterate()) {
1807 for (Order &o : orderlist->GetOrders()) {
1808 o.ConvertFromOldSavegame();
1809 }
1810 }
1811
1812 for (Vehicle *v : Vehicle::Iterate()) {
1813 if (v->orders != nullptr && v->GetFirstOrder() != nullptr && v->GetFirstOrder()->IsType(OT_NOTHING)) {
1814 v->orders->FreeChain();
1815 v->orders = nullptr;
1816 }
1817
1818 v->current_order.ConvertFromOldSavegame();
1819 if (v->type == VehicleType::Road && v->IsPrimaryVehicle() && v->FirstShared() == v) {
1820 for (Order &order : v->Orders()) order.SetNonStopType(OrderNonStopFlag::NonStop);
1821 }
1822 }
1824 /* Unload and transfer are now mutual exclusive. */
1825 for (OrderList *orderlist : OrderList::Iterate()) {
1826 for (Order &order : orderlist->GetOrders()) {
1827 if (order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load.
1828 order.SetUnloadType(OrderUnloadType::Transfer);
1829 order.SetLoadType(OrderLoadType::NoLoad);
1830 }
1831 }
1832 }
1833
1834 for (Vehicle *v : Vehicle::Iterate()) {
1835 if (v->current_order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load.
1836 v->current_order.SetUnloadType(OrderUnloadType::Transfer);
1837 v->current_order.SetLoadType(OrderLoadType::NoLoad);
1838 }
1839 }
1841 /* OrderDepotActionFlags were moved, instead of starting at bit 4 they now start at bit 3. */
1842 for (OrderList *orderlist : OrderList::Iterate()) {
1843 for (Order &order : orderlist->GetOrders()) {
1844 if (!order.IsType(OT_GOTO_DEPOT)) continue;
1845 order.SetDepotActionType(static_cast<OrderDepotActionFlags>(order.GetDepotActionType().base() >> 1));
1846 }
1847 }
1848
1849 for (Vehicle *v : Vehicle::Iterate()) {
1850 if (!v->current_order.IsType(OT_GOTO_DEPOT)) continue;
1851 v->current_order.SetDepotActionType(static_cast<OrderDepotActionFlags>(v->current_order.GetDepotActionType().base() >> 1));
1852 }
1853 }
1854
1855 /* The water class was moved/unified. */
1857 for (auto t : Map::Iterate()) {
1858 switch (GetTileType(t)) {
1859 case TileType::Station:
1860 switch (GetStationType(t)) {
1862 case StationType::Dock:
1863 case StationType::Buoy:
1864 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1865 SB(t.m3(), 0, 2, 0);
1866 break;
1867
1868 default:
1870 break;
1871 }
1872 break;
1873
1874 case TileType::Water:
1875 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1876 SB(t.m3(), 0, 2, 0);
1877 break;
1878
1879 case TileType::Object:
1881 break;
1882
1883 default:
1884 /* No water class. */
1885 break;
1886 }
1887 }
1888 }
1889
1891 for (auto t : Map::Iterate()) {
1892 /* Move river flag and update canals to use water class */
1893 if (IsTileType(t, TileType::Water)) {
1894 if (GetWaterClass(t) != WaterClass::River) {
1895 if (IsWater(t)) {
1896 Owner o = GetTileOwner(t);
1897 if (o == OWNER_WATER) {
1898 MakeSea(t);
1899 } else {
1900 MakeCanal(t, o, Random());
1901 }
1902 } else if (IsShipDepot(t)) {
1903 Owner o = (Owner)t.m4(); // Original water owner
1905 }
1906 }
1907 }
1908 }
1909
1910 /* Update locks, depots, docks and buoys to have a water class based
1911 * on its neighbouring tiles. Done after river and canal updates to
1912 * ensure neighbours are correct. */
1913 for (const auto t : Map::Iterate()) {
1914 if (!IsTileFlat(t)) continue;
1915
1918 }
1919 }
1920
1922 for (const auto t : Map::Iterate()) {
1923 /* skip oil rigs at borders! */
1924 if ((IsTileType(t, TileType::Water) || IsBuoyTile(t)) &&
1925 (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1)) {
1926 /* Some version 86 savegames have wrong water class at map borders (under buoy, or after removing buoy).
1927 * This conversion has to be done before buoys with invalid owner are removed. */
1929 }
1930
1932 Owner o = GetTileOwner(t);
1933 if (o < MAX_COMPANIES && !Company::IsValidID(o)) {
1934 AutoRestoreBackup cur_company(_current_company, o);
1936 }
1937 if (IsBuoyTile(t)) {
1938 /* reset buoy owner to OWNER_NONE in the station struct
1939 * (even if it is owned by active company) */
1941 }
1942 } else if (IsTileType(t, TileType::Road)) {
1943 /* works for all RoadTileType */
1944 for (RoadTramType rtt : ROADTRAMTYPES_ALL) {
1945 /* update even non-existing road types to update tile owner too */
1946 Owner o = GetRoadOwner(t, rtt);
1947 if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
1948 }
1949 if (IsLevelCrossing(t)) {
1951 }
1952 } else if (IsPlainRailTile(t)) {
1954 }
1955 }
1956 }
1957
1959 /* Profits are now with 8 bit fract */
1960 for (Vehicle *v : Vehicle::Iterate()) {
1961 v->profit_this_year <<= 8;
1962 v->profit_last_year <<= 8;
1963 v->running_ticks = 0;
1964 }
1965 }
1966
1968 /* Increase HouseAnimationFrame from 5 to 7 bits */
1969 for (auto t : Map::Iterate()) {
1971 SB(t.m6(), 2, 6, GB(t.m6(), 3, 5));
1972 SB(t.m3(), 5, 1, 0);
1973 }
1974 }
1975 }
1976
1978 GroupStatistics::UpdateAfterLoad(); // Ensure statistics pool is initialised before trying to delete vehicles
1979 /* Remove all trams from savegames without tram support.
1980 * There would be trams without tram track under causing crashes sooner or later. */
1981 for (RoadVehicle *v : RoadVehicle::Iterate()) {
1982 if (v->First() == v && EngInfo(v->engine_type)->misc_flags.Test(EngineMiscFlag::RoadIsTram)) {
1983 ShowErrorMessage(GetEncodedString(STR_WARNING_LOADGAME_REMOVED_TRAMS), {}, WarningLevel::Critical);
1984 delete v;
1985 }
1986 }
1987 }
1988
1990 for (auto t : Map::Iterate()) {
1991 /* Set newly introduced WaterClass of industry tiles */
1992 if (IsTileType(t, TileType::Station) && IsOilRig(t)) {
1994 }
1998 } else {
2000 }
2001 }
2002
2003 /* Replace "house construction year" with "house age" */
2006 }
2007 }
2008 }
2009
2010 /* Move the signal variant back up one bit for PBS. We don't convert the old PBS
2011 * format here, as an old layout wouldn't work properly anyway. To be safe, we
2012 * clear any possible PBS reservations as well. */
2014 for (auto t : Map::Iterate()) {
2015 switch (GetTileType(t)) {
2016 case TileType::Railway:
2017 if (HasSignals(t)) {
2018 /* move the signal variant */
2021 ClrBit(t.m2(), 2);
2022 ClrBit(t.m2(), 6);
2023 }
2024
2025 /* Clear PBS reservation on track */
2026 if (IsRailDepot(t)) {
2027 SetDepotReservation(t, false);
2028 } else {
2029 SetTrackReservation(t, {});
2030 }
2031 break;
2032
2033 case TileType::Road: // Clear PBS reservation on crossing
2034 if (IsLevelCrossing(t)) SetCrossingReservation(t, false);
2035 break;
2036
2037 case TileType::Station: // Clear PBS reservation on station
2038 if (HasStationRail(t)) SetRailStationReservation(t, false);
2039 break;
2040
2041 case TileType::TunnelBridge: // Clear PBS reservation on tunnels/bridges
2043 break;
2044
2045 default: break;
2046 }
2047 }
2048 }
2049
2050 /* Reserve all tracks trains are currently on. */
2052 for (const Train *t : Train::Iterate()) {
2053 if (t->First() == t) t->ReserveTrackUnderConsist();
2054 }
2055 }
2056
2058 /* Non-town-owned roads now store the closest town */
2060
2061 /* signs with invalid owner left from older savegames */
2062 for (Sign *si : Sign::Iterate()) {
2063 if (si->owner != OWNER_NONE && !Company::IsValidID(si->owner)) si->owner = OWNER_NONE;
2064 }
2065
2066 /* Station can get named based on an industry type, but the current ones
2067 * are not, so mark them as if they are not named by an industry. */
2068 for (Station *st : Station::Iterate()) {
2069 st->indtype = IT_INVALID;
2070 }
2071 }
2072
2074 for (Aircraft *a : Aircraft::Iterate()) {
2075 /* Set engine_type of shadow and rotor */
2076 if (!a->IsNormalAircraft()) {
2077 a->engine_type = a->First()->engine_type;
2078 }
2079 }
2080
2081 /* More companies ... */
2082 for (Company *c : Company::Iterate()) {
2083 if (c->bankrupt_asked.base() == 0xFF) c->bankrupt_asked.Set();
2084 }
2085
2086 for (Engine *e : Engine::Iterate()) {
2087 if (e->company_avail.base() == 0xFF) e->company_avail.Set();
2088 }
2089
2090 for (Town *t : Town::Iterate()) {
2091 if (t->have_ratings.base() == 0xFF) t->have_ratings.Set();
2092 t->ratings.fill(RATING_INITIAL);
2093 }
2094 }
2095
2097 for (auto t : Map::Iterate()) {
2098 /* Check for HQ bit being set, instead of using map accessor,
2099 * since we've already changed it code-wise */
2100 if (IsTileType(t, TileType::Object) && HasBit(t.m5(), 7)) {
2101 /* Move size and part identification of HQ out of the m5 attribute,
2102 * on new locations */
2103 t.m3() = GB(t.m5(), 0, 5);
2104 t.m5() = OBJECT_HQ;
2105 }
2106 }
2107 }
2109 for (auto t : Map::Iterate()) {
2110 if (!IsTileType(t, TileType::Object)) continue;
2111
2112 /* Reordering/generalisation of the object bits. */
2113 ObjectType type = t.m5();
2114 SB(t.m6(), 2, 4, type == OBJECT_HQ ? GB(t.m3(), 2, 3) : 0);
2115 t.m3() = type == OBJECT_HQ ? GB(t.m3(), 1, 1) | GB(t.m3(), 0, 1) << 4 : 0;
2116
2117 /* Make sure those bits are clear as well! */
2118 t.m4() = 0;
2119 t.m7() = 0;
2120 }
2121 }
2122
2124 /* Make real objects for object tiles. */
2125 for (auto t : Map::Iterate()) {
2126 if (!IsTileType(t, TileType::Object)) continue;
2127
2128 if (Town::GetNumItems() == 0) {
2129 /* No towns, so remove all objects! */
2130 DoClearSquare(t);
2131 } else {
2132 uint offset = t.m3();
2133
2134 /* Also move the animation state. */
2135 t.m3() = GB(t.m6(), 2, 4);
2136 SB(t.m6(), 2, 4, 0);
2137
2138 if (offset == 0) {
2139 /* No offset, so make the object. */
2140 ObjectType type = t.m5();
2141 int size = type == OBJECT_HQ ? 2 : 1;
2142
2143 if (!Object::CanAllocateItem()) {
2144 /* Nice... you managed to place 64k lighthouses and
2145 * antennae on the map... boohoo. */
2146 SlError(STR_ERROR_TOO_MANY_OBJECTS);
2147 }
2148
2149 Object *o = Object::Create();
2150 o->location.tile = (TileIndex)t;
2151 o->location.w = size;
2152 o->location.h = size;
2154 o->town = type == OBJECT_STATUE ? Town::Get(t.m2()) : CalcClosestTownFromTile(t, UINT_MAX);
2155 t.m2() = o->index.base();
2156 } else {
2157 /* We're at an offset, so get the ID from our "root". */
2158 Tile northern_tile = t - TileXY(GB(offset, 0, 4), GB(offset, 4, 4));
2159 assert(IsTileType(northern_tile, TileType::Object));
2160 t.m2() = northern_tile.m2();
2161 }
2162 }
2163 }
2164 }
2165
2167 /* allow_town_roads is added, set it if town_layout wasn't TL_NO_ROADS */
2168 uint8_t old_town_layout = to_underlying(_settings_game.economy.town_layout);
2169 if (old_town_layout == 0) { // was TL_NO_ROADS
2170 _settings_game.economy.allow_town_roads = false;
2171 _settings_game.economy.town_layout = TownLayout::BetterRoads;
2172 } else {
2173 _settings_game.economy.allow_town_roads = true;
2174 _settings_game.economy.town_layout = static_cast<TownLayout>(old_town_layout - 1);
2175 }
2176
2177 /* Initialize layout of all towns. Older versions were using different
2178 * generator for random town layout, use it if needed. */
2179 for (Town *t : Town::Iterate()) {
2180 if (_settings_game.economy.town_layout != TownLayout::Random) {
2181 t->layout = _settings_game.economy.town_layout;
2182 continue;
2183 }
2184
2185 /* Use old layout randomizer code */
2186 uint8_t layout = TileHash(TileX(t->xy), TileY(t->xy)) % 6;
2187 switch (layout) {
2188 default: break;
2189 case 5: layout = 1; break;
2190 case 0: layout = 2; break;
2191 }
2192 t->layout = static_cast<TownLayout>(layout - 1);
2193 }
2194 }
2195
2197 /* There could be (deleted) stations with invalid owner, set owner to OWNER NONE.
2198 * The conversion affects oil rigs and buoys too, but it doesn't matter as
2199 * they have st->owner == OWNER_NONE already. */
2200 for (Station *st : Station::Iterate()) {
2201 if (!Company::IsValidID(st->owner)) st->owner = OWNER_NONE;
2202 }
2203 }
2204
2205 /* Trains could now stop in a specific location. */
2207 for (OrderList *orderlist : OrderList::Iterate()) {
2208 for (Order &o : orderlist->GetOrders()) {
2209 if (o.IsType(OT_GOTO_STATION)) o.SetStopLocation(OrderStopLocation::FarEnd);
2210 }
2211 }
2212 }
2213
2216 for (Company *c : Company::Iterate()) {
2217 c->settings.vehicle = _old_vds;
2218 }
2219 }
2220
2222 /* Tile for no orders is now INVALID_TILE instead of 0. */
2223 for (Vehicle *v : Vehicle::Iterate()) {
2224 if (v->dest_tile == 0) v->SetDestTile(INVALID_TILE);
2225 }
2226 }
2227
2229 /* Delete small ufos heading for non-existing vehicles */
2231 if (v->subtype == 2 /* ST_SMALL_UFO */ && v->state != 0) {
2232 const Vehicle *u = Vehicle::GetIfValid(v->dest_tile.base());
2233 if (u == nullptr || u->type != VehicleType::Road || !RoadVehicle::From(u)->IsFrontEngine()) {
2234 delete v;
2235 }
2236 }
2237 }
2238
2239 /* We didn't store cargo payment yet, so make them for vehicles that are
2240 * currently at a station and loading/unloading. If they don't get any
2241 * payment anymore they just removed in the next load/unload cycle.
2242 * However, some 0.7 versions might have cargo payment. For those we just
2243 * add cargopayment for the vehicles that don't have it.
2244 */
2245 for (Station *st : Station::Iterate()) {
2246 for (Vehicle *v : st->loading_vehicles) {
2247 /* There are always as many CargoPayments as Vehicles. We need to make the
2248 * assert() in Pool::GetNew() happy by calling CanAllocateItem(). */
2251 if (v->cargo_payment == nullptr) v->cargo_payment = CargoPayment::Create(v);
2252 }
2253 }
2254 }
2255
2257 /* Animated tiles would sometimes not be actually animated or
2258 * in case of old savegames duplicate. */
2259
2260 extern std::vector<TileIndex> _animated_tiles;
2261
2262 for (auto tile = _animated_tiles.begin(); tile < _animated_tiles.end(); /* Nothing */) {
2263 /* Remove if tile is not animated */
2264 bool remove = !MayAnimateTile(*tile);
2265
2266 /* and remove if duplicate */
2267 for (auto j = _animated_tiles.begin(); !remove && j < tile; j++) {
2268 remove = *tile == *j;
2269 }
2270
2271 if (remove) {
2272 tile = _animated_tiles.erase(tile);
2273 } else {
2274 tile++;
2275 }
2276 }
2277 }
2278
2280 for (auto t : Map::Iterate()) {
2281 if (!IsTileType(t, TileType::Water)) continue;
2282 SetNonFloodingWaterTile(t, false);
2283 }
2284 }
2285
2287 /* Animated tile state is stored in the map array, allowing
2288 * quicker addition and deletion of animated tiles. */
2289
2290 extern std::vector<TileIndex> _animated_tiles;
2291
2292 for (auto t : Map::Iterate()) {
2293 /* Ensure there is no spurious animated tile state. */
2295 }
2296
2297 /* Set animated flag for all valid animated tiles. */
2298 for (const TileIndex &tile : _animated_tiles) {
2300 }
2301 }
2302
2304 /* The train station tile area was added, but for really old (TTDPatch) it's already valid. */
2305 for (Waypoint *wp : Waypoint::Iterate()) {
2306 if (wp->facilities.Test(StationFacility::Train)) {
2307 wp->train_station.tile = wp->xy;
2308 wp->train_station.w = 1;
2309 wp->train_station.h = 1;
2310 } else {
2311 wp->train_station.tile = INVALID_TILE;
2312 wp->train_station.w = 0;
2313 wp->train_station.h = 0;
2314 }
2315 }
2316 }
2317
2319 /* Convert old subsidies */
2320 for (Subsidy *s : Subsidy::Iterate()) {
2321 if (s->remaining < 12) {
2322 /* Converting nonawarded subsidy */
2323 s->remaining = 12 - s->remaining; // convert "age" to "remaining"
2324 s->awarded = CompanyID::Invalid(); // not awarded to anyone
2325 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2326 switch (cs->town_acceptance_effect) {
2329 /* Town -> Town */
2330 s->src.type = s->dst.type = SourceType::Town;
2331 if (Town::IsValidID(s->src.ToTownID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2332 break;
2335 /* Industry -> Town */
2336 s->src.type = SourceType::Industry;
2337 s->dst.type = SourceType::Town;
2338 if (Industry::IsValidID(s->src.ToIndustryID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2339 break;
2340 default:
2341 /* Industry -> Industry */
2342 s->src.type = s->dst.type = SourceType::Industry;
2343 if (Industry::IsValidID(s->src.ToIndustryID()) && Industry::IsValidID(s->dst.ToIndustryID())) continue;
2344 break;
2345 }
2346 } else {
2347 /* Do our best for awarded subsidies. The original source or destination industry
2348 * can't be determined anymore for awarded subsidies, so invalidate them.
2349 * Town -> Town subsidies are converted using simple heuristic */
2350 s->remaining = 24 - s->remaining; // convert "age of awarded subsidy" to "remaining"
2351 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2352 switch (cs->town_acceptance_effect) {
2355 /* Town -> Town */
2356 const Station *ss = Station::GetIfValid(s->src.id);
2357 const Station *sd = Station::GetIfValid(s->dst.id);
2358 if (ss != nullptr && sd != nullptr && ss->owner == sd->owner &&
2360 s->src.type = s->dst.type = SourceType::Town;
2361 s->src.SetIndex(ss->town->index);
2362 s->dst.SetIndex(sd->town->index);
2363 s->awarded = ss->owner;
2364 continue;
2365 }
2366 break;
2367 }
2368 default:
2369 break;
2370 }
2371 }
2372 /* Awarded non-town subsidy or invalid source/destination, invalidate */
2373 delete s;
2374 }
2375 }
2376
2378 /* Recompute inflation based on old unround loan limit
2379 * Note: Max loan is 500000. With an inflation of 4% across 170 years
2380 * that results in a max loan of about 0.7 * 2^31.
2381 * So taking the 16 bit fractional part into account there are plenty of bits left
2382 * for unmodified savegames ...
2383 */
2384 uint64_t aimed_inflation = (_economy.old_max_loan_unround << 16 | _economy.old_max_loan_unround_fract) / _settings_game.difficulty.max_loan;
2385
2386 /* ... well, just clamp it then. */
2387 if (aimed_inflation > MAX_INFLATION) aimed_inflation = MAX_INFLATION;
2388
2389 /* Simulate the inflation, so we also get the payment inflation */
2390 while (_economy.inflation_prices < aimed_inflation) {
2391 if (AddInflation(false)) break;
2392 }
2393 }
2394
2396 for (const Depot *d : Depot::Iterate()) {
2397 Tile tile = d->xy;
2398 /* At some point, invalid depots were saved into the game (possibly those removed in the past?)
2399 * Remove them here, so they don't cause issues further down the line */
2400 if (!IsDepotTile(tile)) {
2401 Debug(sl, 0, "Removing invalid depot {} at {}, {}", d->index, TileX(d->xy), TileY(d->xy));
2402 delete d;
2403 d = nullptr;
2404 continue;
2405 }
2406 tile.m2() = d->index.base();
2407 if (IsTileType(tile, TileType::Water)) Tile(GetOtherShipDepotTile(tile)).m2() = d->index.base();
2408 }
2409 }
2410
2411 /* The behaviour of force_proceed has been changed. Now
2412 * it counts signals instead of some random time out. */
2414 for (Train *t : Train::Iterate()) {
2415 if (t->force_proceed != TFP_NONE) {
2416 t->force_proceed = TFP_STUCK;
2417 }
2418 }
2419 }
2420
2421 /* The bits for the tree ground and tree density have
2422 * been swapped (m2 bits 7..6 and 5..4. */
2424 for (auto t : Map::Iterate()) {
2425 if (IsTileType(t, TileType::Clear)) {
2426 if (GetClearGround(t) == ClearGround{4}) { // CLEAR_SNOW becomes ClearGround::Grass with IsSnowTile() set.
2428 SetBit(t.m3(), 4);
2429 } else {
2430 ClrBit(t.m3(), 4);
2431 }
2432 }
2433 if (IsTileType(t, TileType::Trees)) {
2434 uint density = GB(t.m2(), 6, 2);
2435 uint ground = GB(t.m2(), 4, 2);
2436 t.m2() = ground << 6 | density << 4;
2437 }
2438 }
2439 }
2440
2441 /* Wait counter and load/unload ticks got split. */
2443 for (Aircraft *a : Aircraft::Iterate()) {
2444 a->turn_counter = a->current_order.IsType(OT_LOADING) ? 0 : a->load_unload_ticks;
2445 }
2446
2447 for (Train *t : Train::Iterate()) {
2448 t->wait_counter = t->current_order.IsType(OT_LOADING) ? 0 : t->load_unload_ticks;
2449 }
2450 }
2451
2452 /* Airport tile animation uses animation frame instead of other graphics id */
2454 struct AirportTileConversion {
2455 uint8_t old_start;
2456 uint8_t num_frames;
2457 };
2458 static const AirportTileConversion atcs[] = {
2459 {31, 12}, // APT_RADAR_GRASS_FENCE_SW
2460 {50, 4}, // APT_GRASS_FENCE_NE_FLAG
2461 {62, 2}, // 1 unused tile
2462 {66, 12}, // APT_RADAR_FENCE_SW
2463 {78, 12}, // APT_RADAR_FENCE_NE
2464 {101, 10}, // 9 unused tiles
2465 {111, 8}, // 7 unused tiles
2466 {119, 15}, // 14 unused tiles (radar)
2467 {140, 4}, // APT_GRASS_FENCE_NE_FLAG_2
2468 };
2469 for (const auto t : Map::Iterate()) {
2470 if (IsAirportTile(t)) {
2471 StationGfx old_gfx = GetStationGfx(t);
2472 uint8_t offset = 0;
2473 for (const auto &atc : atcs) {
2474 if (old_gfx < atc.old_start) {
2475 SetStationGfx(t, old_gfx - offset);
2476 break;
2477 }
2478 if (old_gfx < atc.old_start + atc.num_frames) {
2479 SetAnimationFrame(t, old_gfx - atc.old_start);
2480 SetStationGfx(t, atc.old_start - offset);
2481 break;
2482 }
2483 offset += atc.num_frames - 1;
2484 }
2485 }
2486 }
2487 }
2488
2489 /* Oilrig was moved from id 15 to 9. */
2491 for (Station *st : Station::Iterate()) {
2492 if (st->airport.tile != INVALID_TILE && st->airport.type == 15) {
2493 st->airport.type = AT_OILRIG;
2494 }
2495 }
2496 }
2497
2499 for (Station *st : Station::Iterate()) {
2500 if (st->airport.tile != INVALID_TILE) {
2501 st->airport.w = st->airport.GetSpec()->size_x;
2502 st->airport.h = st->airport.GetSpec()->size_y;
2503 }
2504 }
2505 }
2506
2508 for (const auto t : Map::Iterate()) {
2509 /* Reset tropic zone for VOID tiles, they shall not have any. */
2511 }
2512
2513 /* We need to properly number/name the depots.
2514 * The first step is making sure none of the depots uses the
2515 * 'default' names, after that we can assign the names. */
2516 for (Depot *d : Depot::Iterate()) d->town_cn = UINT16_MAX;
2517
2518 for (Depot *d : Depot::Iterate()) MakeDefaultName(d);
2519 }
2520
2522 for (Depot *d : Depot::Iterate()) d->build_date = TimerGameCalendar::date;
2523 }
2524
2526 for (Station *st : Station::Iterate()) {
2527 if (st->facilities.Test(StationFacility::Airport)) st->airport.rotation = Direction::N;
2528 }
2529 }
2530
2531 /* In old versions it was possible to remove an airport while a plane was
2532 * taking off or landing. This gives all kind of problems when building
2533 * another airport in the same station so we don't allow that anymore.
2534 * For old savegames with such aircraft we just throw them in the air and
2535 * treat the aircraft like they were flying already. */
2537 for (Aircraft *v : Aircraft::Iterate()) {
2538 if (!v->IsNormalAircraft()) continue;
2540 if (st == nullptr && v->state != FLYING) {
2541 v->state = FLYING;
2544 /* get aircraft back on running altitude */
2545 if (!v->vehstatus.Test(VehState::Crashed)) {
2546 GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
2547 SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
2548 }
2549 }
2550 }
2551 }
2552
2553 /* Move the animation frame to the same location (m7) for all objects. */
2555 for (auto t : Map::Iterate()) {
2556 switch (GetTileType(t)) {
2557 case TileType::House:
2558 if (GetHouseType(t) >= NEW_HOUSE_OFFSET) {
2559 uint per_proc = t.m7();
2560 t.m7() = GB(t.m6(), 2, 6) | (GB(t.m3(), 5, 1) << 6);
2561 SB(t.m3(), 5, 1, 0);
2562 SB(t.m6(), 2, 6, std::min(per_proc, 63U));
2563 }
2564 break;
2565
2566 case TileType::Industry: {
2567 uint rand = t.m7();
2568 t.m7() = t.m3();
2569 t.m3() = rand;
2570 break;
2571 }
2572
2573 case TileType::Object:
2574 t.m7() = t.m3();
2575 t.m3() = 0;
2576 break;
2577
2578 default:
2579 /* For stations/airports it's already at m7 */
2580 break;
2581 }
2582 }
2583 }
2584
2585 /* Add (random) colour to all objects. */
2587 for (Object *o : Object::Iterate()) {
2588 Owner owner = GetTileOwner(o->location.tile);
2589 o->recolour_offset = (owner == OWNER_NONE) ? GB(Random(), 0, 4) : to_underlying(Company::Get(owner)->livery[LiveryScheme::Default].colour1);
2590 }
2591 }
2592
2594 for (const auto t : Map::Iterate()) {
2595 if (!IsTileType(t, TileType::Station)) continue;
2596 if (!IsBuoy(t) && !IsOilRig(t) && !(IsDock(t) && IsTileFlat(t))) {
2598 }
2599 }
2600
2601 /* Waypoints with custom name may have a non-unique town_cn,
2602 * renumber those. First set all affected waypoints to the
2603 * highest possible number to get them numbered in the
2604 * order they have in the pool. */
2605 for (Waypoint *wp : Waypoint::Iterate()) {
2606 if (!wp->name.empty()) wp->town_cn = UINT16_MAX;
2607 }
2608
2609 for (Waypoint *wp : Waypoint::Iterate()) {
2610 if (!wp->name.empty()) MakeDefaultName(wp);
2611 }
2612 }
2613
2615 _industry_builder.Reset(); // Initialize industry build data.
2616
2617 /* The moment vehicles go from hidden to visible changed. This means
2618 * that vehicles don't always get visible anymore causing things to
2619 * get messed up just after loading the savegame. This fixes that. */
2620 for (Vehicle *v : Vehicle::Iterate()) {
2621 /* Not all vehicle types can be inside a tunnel. Furthermore,
2622 * testing IsTunnelTile() for invalid tiles causes a crash. */
2623 if (!v->IsGroundVehicle()) continue;
2624
2625 /* Is the vehicle in a tunnel? */
2626 if (!IsTunnelTile(v->tile)) continue;
2627
2628 /* Is the vehicle actually at a tunnel entrance/exit? */
2629 TileIndex vtile = TileVirtXY(v->x_pos, v->y_pos);
2630 if (!IsTunnelTile(vtile)) continue;
2631
2632 /* Are we actually in this tunnel? Or maybe a lower tunnel? */
2633 if (GetSlopePixelZ(v->x_pos, v->y_pos, true) != v->z_pos) continue;
2634
2635 /* What way are we going? */
2636 const DiagDirection dir = GetTunnelBridgeDirection(vtile);
2637 const DiagDirection vdir = DirToDiagDir(v->direction);
2638
2639 /* Have we passed the visibility "switch" state already? */
2640 uint8_t pos = (DiagDirToAxis(vdir) == Axis::X ? v->x_pos : v->y_pos) & TILE_UNIT_MASK;
2641 uint8_t frame = (vdir == DiagDirection::NE || vdir == DiagDirection::NW) ? TILE_SIZE - 1 - pos : pos;
2643
2644 /* Should the vehicle be hidden or not? */
2645 bool hidden;
2646 if (dir == vdir) { // Entering tunnel
2647 hidden = frame >= _tunnel_visibility_frame[dir];
2648 v->tile = vtile;
2649 } else if (dir == ReverseDiagDir(vdir)) { // Leaving tunnel
2650 hidden = frame < TILE_SIZE - _tunnel_visibility_frame[dir];
2651 /* v->tile changes at the moment when the vehicle leaves the tunnel. */
2652 v->tile = hidden ? GetOtherTunnelBridgeEnd(vtile) : vtile;
2653 } else {
2654 /* We could get here in two cases:
2655 * - for road vehicles, it is reversing at the end of the tunnel
2656 * - it is crashed in the tunnel entry (both train or RV destroyed by UFO)
2657 * Whatever case it is, do not change anything and use the old values.
2658 * Especially changing RV's state would break its reversing in the middle. */
2659 continue;
2660 }
2661
2662 if (hidden) {
2663 v->vehstatus.Set(VehState::Hidden);
2664
2665 switch (v->type) {
2668 default: NOT_REACHED();
2669 }
2670 } else {
2671 v->vehstatus.Reset(VehState::Hidden);
2672
2673 switch (v->type) {
2674 case VehicleType::Train: Train::From(v)->track = DiagDirToDiagTrack(vdir); break;
2676 default: NOT_REACHED();
2677 }
2678 }
2679 }
2680 }
2681
2683 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
2684 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) continue;
2685
2686 bool loading = rv->current_order.IsType(OT_LOADING) || rv->current_order.IsType(OT_LEAVESTATION);
2687 if (HasBit(rv->state, RVS_IN_ROAD_STOP)) {
2688 extern const uint8_t _road_stop_stop_frame[];
2689 SB(rv->state, RVS_ENTERED_STOP, 1, loading || rv->frame > _road_stop_stop_frame[rv->state - RVSB_IN_ROAD_STOP + (to_underlying(_settings_game.vehicle.road_side) << RVS_DRIVE_SIDE)]);
2690 } else if (HasBit(rv->state, RVS_IN_DT_ROAD_STOP)) {
2691 SB(rv->state, RVS_ENTERED_STOP, 1, loading || rv->frame > RVC_DRIVE_THROUGH_STOP_FRAME);
2692 }
2693 }
2694 }
2695
2697 /* The train's pathfinder lost flag got moved. */
2698 for (Train *t : Train::Iterate()) {
2699 if (!t->flags.Test(VehicleRailFlag{5})) continue;
2700
2701 t->flags.Reset(VehicleRailFlag{5});
2702 t->vehicle_flags.Set(VehicleFlag::PathfinderLost);
2703 }
2704
2705 /* Introduced terraform/clear limits. */
2706 for (Company *c : Company::Iterate()) {
2707 c->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
2708 c->clear_limit = _settings_game.construction.clear_frame_burst << 16;
2709 }
2710 }
2711
2712
2714 /*
2715 * The logic of GetPartialPixelZ has been changed, so the resulting Zs on
2716 * the map are consistent. This requires that the Z position of some
2717 * vehicles is updated to reflect this new situation.
2718 *
2719 * This needs to be before SaveLoadVersion::TrackRealAndAutoOrders, because that performs asserts using
2720 * GetSlopePixelZ which internally uses GetPartialPixelZ.
2721 */
2722 for (Vehicle *v : Vehicle::Iterate()) {
2723 if (v->IsGroundVehicle() && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2724 /* Vehicle is on the ground, and not in a wormhole. */
2725 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2726 }
2727 }
2728 }
2729
2731 for (Vehicle *v : Vehicle::Iterate()) {
2732 switch (v->type) {
2733 case VehicleType::Train: {
2734 Train *t = Train::From(v);
2735
2736 /* Clear old GOINGUP / GOINGDOWN flags.
2737 * It was changed in savegame version 139, but savegame
2738 * version 158 doesn't use these bits, so it doesn't hurt
2739 * to clear them unconditionally. */
2742
2743 /* 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::X && t->track != Track::Y) break;
2751
2753 break;
2754 }
2755 case VehicleType::Road: {
2758
2759 /* Crashed vehicles can't be going up/down. */
2760 if (rv->vehstatus.Test(VehState::Crashed)) break;
2761
2762 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break;
2763
2764 TrackStatus ts = GetTileTrackStatus(rv->tile, TransportType::Road, GetRoadTramType(rv->roadtype));
2766
2767 /* Only X/Y tracks can be sloped. */
2768 if (trackbits != Track::X && trackbits != Track::Y) break;
2769
2770 Direction dir = rv->direction;
2771
2772 /* Test if we are reversing. */
2773 Axis a = trackbits == Track::X ? Axis::X : Axis::Y;
2774 if (AxisToDirection(a) != dir &&
2775 AxisToDirection(a) != ReverseDir(dir)) {
2776 /* When reversing, the road vehicle is on the edge of the tile,
2777 * so it can be safely compared to the middle of the tile. */
2778 dir = Direction::Invalid;
2779 }
2780
2781 rv->gv_flags |= FixVehicleInclination(rv, dir);
2782 break;
2783 }
2784 case VehicleType::Ship:
2785 break;
2786
2787 default:
2788 continue;
2789 }
2790
2791 if (IsBridgeTile(v->tile) && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2792 /* In old versions, z_pos was 1 unit lower on bridge heads.
2793 * However, this invalid state could be converted to new savegames
2794 * by loading and saving the game in a new version. */
2795 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2797 if (v->type == VehicleType::Train && !v->vehstatus.Test(VehState::Crashed) &&
2798 v->direction != DiagDirToDir(dir)) {
2799 /* If the train has left the bridge, it shouldn't have
2800 * track == Track::Wormhole - this could happen
2801 * when the train was reversed while on the last "tick"
2802 * on the ramp before leaving the ramp to the bridge. */
2804 }
2805 }
2806
2807 /* If the vehicle is really above v->tile (not in a wormhole),
2808 * it should have set v->z_pos correctly. */
2809 assert(v->tile != TileVirtXY(v->x_pos, v->y_pos) || v->z_pos == GetSlopePixelZ(v->x_pos, v->y_pos, true));
2810 }
2811
2812 /* Fill Vehicle::cur_real_order_index */
2813 for (Vehicle *v : Vehicle::Iterate()) {
2814 if (!v->IsPrimaryVehicle()) continue;
2815
2816 /* Older versions are less strict with indices being in range and fix them on the fly */
2817 if (v->cur_implicit_order_index >= v->GetNumOrders()) v->cur_implicit_order_index = 0;
2818
2819 v->cur_real_order_index = v->cur_implicit_order_index;
2820 v->UpdateRealOrderIndex();
2821 }
2822 }
2823
2825 /* If the savegame is old (before version 100), then the value of 255
2826 * for these settings did not mean "disabled". As such everything
2827 * before then did reverse.
2828 * To simplify stuff we disable all turning around or we do not
2829 * disable anything at all. So, if some reversing was disabled we
2830 * will keep reversing disabled, otherwise it'll be turned on. */
2831 _settings_game.pf.reverse_at_signals = IsSavegameVersionBefore(SaveLoadVersion::Yapp) || (_settings_game.pf.wait_oneway_signal != 255 && _settings_game.pf.wait_twoway_signal != 255 && _settings_game.pf.wait_for_pbs_path != 255);
2832
2833 for (Train *t : Train::Iterate()) {
2834 _settings_game.vehicle.max_train_length = std::max<uint8_t>(_settings_game.vehicle.max_train_length, CeilDiv(t->gcache.cached_total_length, TILE_SIZE));
2835 }
2836 }
2837
2839 /* Setting difficulty industry_density other than zero get bumped to +1
2840 * since a new option (minimal at position 1) has been added */
2841 if (_settings_game.difficulty.industry_density > IndustryDensity::FundedOnly) {
2842 _settings_game.difficulty.industry_density = static_cast<IndustryDensity>(to_underlying(_settings_game.difficulty.industry_density) + 1);
2843 }
2844 }
2845
2847 /* Before savegame version 161, persistent storages were not stored in a pool. */
2848
2850 for (Industry *ind : Industry::Iterate()) {
2851 assert(ind->psa != nullptr);
2852
2853 /* Check if the old storage was empty. */
2854 bool is_empty = true;
2855 for (uint i = 0; i < sizeof(ind->psa->storage); i++) {
2856 if (ind->psa->GetValue(i) != 0) {
2857 is_empty = false;
2858 break;
2859 }
2860 }
2861
2862 if (!is_empty) {
2863 ind->psa->grfid = _industry_mngr.GetGRFID(ind->type);
2864 } else {
2865 delete ind->psa;
2866 ind->psa = nullptr;
2867 }
2868 }
2869 }
2870
2872 for (Station *st : Station::Iterate()) {
2873 if (!st->facilities.Test(StationFacility::Airport)) continue;
2874 assert(st->airport.psa != nullptr);
2875
2876 /* Check if the old storage was empty. */
2877 bool is_empty = true;
2878 for (uint i = 0; i < sizeof(st->airport.psa->storage); i++) {
2879 if (st->airport.psa->GetValue(i) != 0) {
2880 is_empty = false;
2881 break;
2882 }
2883 }
2884
2885 if (!is_empty) {
2886 st->airport.psa->grfid = _airport_mngr.GetGRFID(st->airport.type);
2887 } else {
2888 delete st->airport.psa;
2889 st->airport.psa = nullptr;
2890
2891 }
2892 }
2893 }
2894 }
2895
2896 /* This triggers only when old snow_lines were copied into the snow_line_height. */
2898 _settings_game.game_creation.snow_line_height /= TILE_HEIGHT;
2899 }
2900
2902 /* We store 4 fences in the field tiles instead of only SE and SW. */
2903 for (auto t : Map::Iterate()) {
2904 if (!IsTileType(t, TileType::Clear) && !IsTileType(t, TileType::Trees)) continue;
2906 uint fence = GB(t.m4(), 5, 3);
2907 if (fence != 0 && IsTileType(TileAddXY(t, 1, 0), TileType::Clear) && IsClearGround(TileAddXY(t, 1, 0), ClearGround::Fields)) {
2908 SetFence(TileAddXY(t, 1, 0), DiagDirection::NE, fence);
2909 }
2910 fence = GB(t.m4(), 2, 3);
2911 if (fence != 0 && IsTileType(TileAddXY(t, 0, 1), TileType::Clear) && IsClearGround(TileAddXY(t, 0, 1), ClearGround::Fields)) {
2912 SetFence(TileAddXY(t, 0, 1), DiagDirection::NW, fence);
2913 }
2914 SB(t.m4(), 2, 3, 0);
2915 SB(t.m4(), 5, 3, 0);
2916 }
2917 }
2918
2920 /* Vehicles used to be reversed immediately when entering depot.
2921 * Now they are reversed when the whole consist has entered.
2922 * Find trains in the process of entering a depot and un-reverse them. */
2923 for (Train *t : Train::Iterate()) {
2924 if (!t->IsPrimaryVehicle()) continue;
2925
2926 /* Front not in depot -> consist not entering depot */
2927 if (t->track != Track::Depot) continue;
2928 /* Back in depot -> consist completely in depot */
2929 if (t->Last()->track == Track::Depot) continue;
2930 for (Train *u = t; u->track == Track::Depot; u = u->Next()) {
2931 u->direction = ReverseDir(u->direction);
2932 }
2933 }
2934
2935 /* Update the setting for train flipping. */
2936 _settings_game.difficulty.train_flip_reverse_allowed = _settings_game.difficulty.line_reverse_mode ? TrainFlipReversingAllowed::EndOfLineOnly : TrainFlipReversingAllowed::All;
2937 }
2938
2940 for (Town *t : Town::Iterate()) {
2941 /* Set the default cargo requirement for town growth */
2942 switch (_settings_game.game_creation.landscape) {
2945 break;
2946
2950 break;
2951
2952 default:
2953 break;
2954 }
2955 }
2956 }
2957
2959 /* Adjust zoom level to account for new levels */
2960 _saved_scrollpos_zoom += ZOOM_BASE_SHIFT;
2961 _saved_scrollpos_x *= ZOOM_BASE;
2962 _saved_scrollpos_y *= ZOOM_BASE;
2963 }
2964
2965 /* When any NewGRF has been changed the availability of some vehicles might
2966 * have been changed too. e->company_avail must be set to 0 in that case
2967 * which is done by StartupEngines(). */
2969
2970 /* The road owner of standard road stops was not properly accounted for. */
2972 for (const auto t : Map::Iterate()) {
2973 if (!IsBayRoadStopTile(t)) continue;
2974 Owner o = GetTileOwner(t);
2977 }
2978 }
2979
2981 /* Introduced tree planting limit. */
2982 for (Company *c : Company::Iterate()) c->tree_limit = _settings_game.construction.tree_frame_burst << 16;
2983 }
2984
2986 /* Fix too high inflation rates */
2987 if (_economy.inflation_prices > MAX_INFLATION) _economy.inflation_prices = MAX_INFLATION;
2988 if (_economy.inflation_payment > MAX_INFLATION) _economy.inflation_payment = MAX_INFLATION;
2989
2990 /* We have to convert the quarters of bankruptcy into months of bankruptcy */
2991 for (Company *c : Company::Iterate()) {
2992 c->months_of_bankruptcy = 3 * c->months_of_bankruptcy;
2993 }
2994 }
2995
2997 /* Aircraft acceleration variable was bonkers */
2998 for (Aircraft *v : Aircraft::Iterate()) {
2999 if (v->subtype <= AIR_AIRCRAFT) {
3000 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
3001 v->acceleration = avi->acceleration;
3002 }
3003 }
3004
3005 /* Blocked tiles could be reserved due to a bug, which causes
3006 * other places to assert upon e.g. station reconstruction. */
3007 for (const auto t : Map::Iterate()) {
3009 SetRailStationReservation(t, false);
3010 }
3011 }
3012 }
3013
3015 /* The global units configuration is split up in multiple configurations. */
3016 extern uint8_t _old_units;
3017 _settings_game.locale.units_velocity = Clamp(_old_units, 0, 2);
3018 _settings_game.locale.units_power = Clamp(_old_units, 0, 2);
3019 _settings_game.locale.units_weight = Clamp(_old_units, 1, 2);
3020 _settings_game.locale.units_volume = Clamp(_old_units, 1, 2);
3021 _settings_game.locale.units_force = 2;
3022 _settings_game.locale.units_height = Clamp(_old_units, 0, 2);
3023 }
3024
3026 /* Match nautical velocity with land velocity units. */
3027 _settings_game.locale.units_velocity_nautical = _settings_game.locale.units_velocity;
3028 }
3029
3031 /* Move ObjectType from map to pool */
3032 for (auto t : Map::Iterate()) {
3033 if (IsTileType(t, TileType::Object)) {
3034 Object *o = Object::Get(t.m2());
3035 o->type = t.m5();
3036 t.m5() = 0; // zero upper bits of (now bigger) ObjectID
3037 }
3038 }
3039 }
3040
3041 /* Beyond this point, tile types which can be accessed by vehicles must be in a valid state. */
3042
3043 /* Update all vehicles: Phase 2 */
3045
3046 /* The center of train vehicles was changed, fix up spacing. */
3048
3049 /* In version 2.2 of the savegame, we have new airports, so status of all aircraft is reset.
3050 * This has to be called after all map array updates */
3052
3054 /* Fix articulated road vehicles.
3055 * Some curves were shorter than other curves.
3056 * Now they have the same length, but that means that trailing articulated parts will
3057 * take longer to go through the curve than the parts in front which already left the curve.
3058 * So, make articulated parts catch up. */
3059 bool roadside = _settings_game.vehicle.road_side == RoadVehicleDrivingSide::Right;
3060 std::vector<uint> skip_frames;
3061 for (RoadVehicle *v : RoadVehicle::Iterate()) {
3062 if (!v->IsFrontEngine()) continue;
3063 skip_frames.clear();
3064 TileIndex prev_tile = v->tile;
3065 uint prev_tile_skip = 0;
3066 uint cur_skip = 0;
3067 for (RoadVehicle *u = v; u != nullptr; u = u->Next()) {
3068 if (u->tile != prev_tile) {
3069 prev_tile_skip = cur_skip;
3070 prev_tile = u->tile;
3071 } else {
3072 cur_skip = prev_tile_skip;
3073 }
3074
3075 uint &this_skip = skip_frames.emplace_back(prev_tile_skip);
3076
3077 /* The following 3 curves now take longer than before */
3078 switch (u->state) {
3079 case 2:
3080 cur_skip++;
3081 if (u->frame <= (roadside ? 9 : 5)) this_skip = cur_skip;
3082 break;
3083
3084 case 4:
3085 cur_skip++;
3086 if (u->frame <= (roadside ? 5 : 9)) this_skip = cur_skip;
3087 break;
3088
3089 case 5:
3090 cur_skip++;
3091 if (u->frame <= (roadside ? 4 : 2)) this_skip = cur_skip;
3092 break;
3093
3094 default:
3095 break;
3096 }
3097 }
3098 while (cur_skip > skip_frames[0]) {
3099 RoadVehicle *u = v;
3100 RoadVehicle *prev = nullptr;
3101 for (uint sf : skip_frames) {
3102 if (sf >= cur_skip) IndividualRoadVehicleController(u, prev);
3103
3104 prev = u;
3105 u = u->Next();
3106 }
3107 cur_skip--;
3108 }
3109 }
3110 }
3111
3113 for (OrderList *orderlist : OrderList::Iterate()) {
3114 for (Order &order : orderlist->GetOrders()) {
3115 order.SetTravelTimetabled(order.GetTravelTime() > 0);
3116 order.SetWaitTimetabled(order.GetWaitTime() > 0);
3117 }
3118 orderlist->RecalculateTimetableDuration();
3119 }
3120 }
3121
3122 /*
3123 * Only keep order-backups for network clients (and when replaying).
3124 * If we are a network server or not networking, then we just loaded a previously
3125 * saved-by-server savegame. There are no clients with a backup, so clear it.
3126 * Furthermore before savegame version SaveLoadVersion::FixOrderBackup the actual content was always corrupt.
3127 */
3129#ifndef DEBUG_DUMP_COMMANDS
3130 /* Note: We cannot use CleanPool since that skips part of the destructor
3131 * and then leaks un-reachable Orders in the order pool. */
3132 for (OrderBackup *ob : OrderBackup::Iterate()) {
3133 delete ob;
3134 }
3135#endif
3136 }
3137
3139 /* Convert towns growth_rate and grow_counter to ticks */
3140 for (Town *t : Town::Iterate()) {
3141 /* 0x8000 = TOWN_GROWTH_RATE_CUSTOM previously */
3142 if (t->growth_rate & 0x8000) t->flags.Set(TownFlag::CustomGrowth);
3143 if (t->growth_rate != TOWN_GROWTH_RATE_NONE) {
3144 t->growth_rate = TownTicksToGameTicks(t->growth_rate & ~0x8000);
3145 }
3146 /* Add t->index % TOWN_GROWTH_TICKS to spread growth across ticks. */
3147 t->grow_counter = TownTicksToGameTicks(t->grow_counter) + t->index % Ticks::TOWN_GROWTH_TICKS;
3148 }
3149 }
3150
3152 /* Make sure added industry cargo slots are cleared */
3153 for (Industry *i : Industry::Iterate()) {
3154 /* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo.
3155 * The loading routine should put the original singular value into the first array element. */
3156 for (auto &a : i->accepted) {
3157 if (IsValidCargoType(a.cargo)) {
3158 a.last_accepted = i->GetAccepted(0).last_accepted;
3159 } else {
3160 a.last_accepted = EconomyTime::MIN_DATE;
3161 }
3162 }
3163 }
3164 }
3165
3167 /* Move ships from lock slope to upper or lower position. */
3168 for (Ship *s : Ship::Iterate()) {
3169 /* Suitable tile? */
3170 if (!IsTileType(s->tile, TileType::Water) || !IsLock(s->tile) || GetLockPart(s->tile) != LockPart::Middle) continue;
3171
3172 /* We don't need to adjust position when at the tile centre */
3173 int x = s->x_pos & 0xF;
3174 int y = s->y_pos & 0xF;
3175 if (x == 8 && y == 8) continue;
3176
3177 /* Test if ship is on the second half of the tile */
3178 bool second_half;
3179 DiagDirection shipdiagdir = DirToDiagDir(s->direction);
3180 switch (shipdiagdir) {
3181 default: NOT_REACHED();
3182 case DiagDirection::NE: second_half = x < 8; break;
3183 case DiagDirection::NW: second_half = y < 8; break;
3184 case DiagDirection::SW: second_half = x > 8; break;
3185 case DiagDirection::SE: second_half = y > 8; break;
3186 }
3187
3188 DiagDirection slopediagdir = GetInclinedSlopeDirection(GetTileSlope(s->tile));
3189
3190 /* Heading up slope == passed half way */
3191 if ((shipdiagdir == slopediagdir) == second_half) {
3192 /* On top half of lock */
3193 s->z_pos = GetTileMaxZ(s->tile) * (int)TILE_HEIGHT;
3194 } else {
3195 /* On lower half of lock */
3196 s->z_pos = GetTileZ(s->tile) * (int)TILE_HEIGHT;
3197 }
3198 }
3199 }
3200
3202 /* Ensure the original cargo generation mode is used */
3203 _settings_game.economy.town_cargogen_mode = TownCargoGenMode::Original;
3204 }
3205
3207 /* Ensure the original neutral industry/station behaviour is used */
3208 _settings_game.station.serve_neutral_industries = true;
3209
3210 /* Link oil rigs to their industry and back. */
3211 for (Station *st : Station::Iterate()) {
3212 if (IsTileType(st->xy, TileType::Station) && IsOilRig(st->xy)) {
3213 /* Industry tile is always adjacent during construction by TileDiffXY(0, 1) */
3214 st->industry = Industry::GetByTile(st->xy + TileDiffXY(0, 1));
3215 st->industry->neutral_station = st;
3216 }
3217 }
3218 } else {
3219 /* Link neutral station back to industry, as this is not saved. */
3220 for (Industry *ind : Industry::Iterate()) if (ind->neutral_station != nullptr) ind->neutral_station->industry = ind;
3221 }
3222
3224 /* Update water class for trees. */
3225 for (const auto t : Map::Iterate()) {
3227 }
3228 }
3229
3230 /* Update structures for multitile docks */
3232 for (const auto t : Map::Iterate()) {
3233 /* Clear docking tile flag from relevant tiles as it
3234 * was not previously cleared. */
3236 SetDockingTile(t, false);
3237 }
3238 /* Add docks and oilrigs to Station::ship_station. */
3239 if (IsTileType(t, TileType::Station)) {
3240 if (IsDock(t) || IsOilRig(t)) Station::GetByTile(t)->ship_station.Add(t);
3241 }
3242 }
3243 }
3244
3246 /* Placing objects on docking tiles was not updating adjacent station's docking tiles. */
3247 for (Station *st : Station::Iterate()) {
3248 if (st->ship_station.tile != INVALID_TILE) UpdateStationDockingTiles(st);
3249 }
3250 }
3251
3252 /* Make sure all industries exclusive supplier/consumer set correctly. */
3254 for (Industry *i : Industry::Iterate()) {
3255 i->exclusive_supplier = INVALID_OWNER;
3256 i->exclusive_consumer = INVALID_OWNER;
3257 }
3258 }
3259
3261 /* Propagate wagon removal flag for compatibility */
3262 /* Temporary bitmask of company wagon removal setting */
3263 CompanyMask wagon_removal{};
3264 for (const Company *c : Company::Iterate()) {
3265 if (c->settings.renew_keep_length) wagon_removal.Set(c->index);
3266 }
3267 for (Group *g : Group::Iterate()) {
3268 if (g->flags.Any()) {
3269 /* Convert old replace_protection value to flag. */
3271 }
3272 if (wagon_removal.Test(g->owner)) g->flags.Set(GroupFlag::ReplaceWagonRemoval);
3273 }
3274 }
3275
3276 /* Use current order time to approximate last loading time */
3278 for (Vehicle *v : Vehicle::Iterate()) {
3279 v->last_loading_tick = std::max(TimerGameTick::counter, static_cast<uint64_t>(v->current_order_time)) - v->current_order_time;
3280 }
3281 }
3282
3283 /* Road stops is 'only' updating some caches, but they are needed for PF calls in SaveLoadVersion::MultitrackLevelCrossings teleporting. */
3285
3286 /* Road vehicles stopped on multitrack level crossings need teleporting to a depot
3287 * to avoid crashing into the side of the train they're waiting for. */
3289 /* Teleport road vehicles to the nearest depot. */
3290 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
3291 /* Ignore trailers of articulated vehicles. */
3292 if (rv->IsArticulatedPart()) continue;
3293
3294 /* Ignore moving vehicles. */
3295 if (rv->cur_speed > 0) continue;
3296
3297 /* Ignore crashed vehicles. */
3298 if (rv->vehstatus.Test(VehState::Crashed)) continue;
3299
3300 /* Ignore vehicles not on level crossings. */
3301 TileIndex cur_tile = rv->tile;
3302 if (!IsLevelCrossingTile(cur_tile)) continue;
3303
3304 ClosestDepot closest_depot = rv->FindClosestDepot();
3305
3306 /* Try to find a depot with a distance limit of 512 tiles (Manhattan distance). */
3307 if (closest_depot.found && DistanceManhattan(rv->tile, closest_depot.location) < 512u) {
3308 /* Teleport all parts of articulated vehicles. */
3309 for (RoadVehicle *u = rv; u != nullptr; u = u->Next()) {
3310 u->tile = closest_depot.location;
3311 int x = TileX(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3312 int y = TileY(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3313 u->x_pos = x;
3314 u->y_pos = y;
3315 u->z_pos = GetSlopePixelZ(x, y, true);
3316
3317 u->vehstatus.Set(VehState::Hidden);
3318 u->state = RVSB_IN_DEPOT;
3319 u->UpdatePosition();
3320 }
3321 RoadVehLeaveDepot(rv, false);
3322 }
3323 }
3324
3326 /* Reset unused tree counters to reduce the savegame size. */
3327 for (auto t : Map::Iterate()) {
3328 if (IsTileType(t, TileType::Trees)) {
3329 SB(t.m2(), 0, 4, 0);
3330 }
3331 }
3332 }
3333
3334 /* Refresh all level crossings to bar adjacent crossing tiles, if needed. */
3335 for (const auto tile : Map::Iterate()) {
3336 if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile, false);
3337 }
3338 }
3339
3340 /* Compute station catchment areas. This is needed here in case UpdateStationAcceptance is called below. */
3342
3343 /* Station acceptance is some kind of cache */
3345 for (Station *st : Station::Iterate()) UpdateStationAcceptance(st, false);
3346 }
3347
3350 }
3351
3353 /* For older savegames, we don't now the actual interval; so set it to the newgame value. */
3354 _settings_game.difficulty.competitors_interval = _settings_newgame.difficulty.competitors_interval;
3355
3356 /* We did load the "period" of the timer, but not the fired/elapsed. We can deduce that here. */
3358 _new_competitor_timeout.storage.elapsed = 0;
3359 _new_competitor_timeout.fired = _new_competitor_timeout.period.value == 0;
3360 }
3361
3363 /* Set service date provided to NewGRF. */
3364 for (Vehicle *v : Vehicle::Iterate()) {
3365 v->date_of_last_service_newgrf = TimerGameCalendar::Date{v->date_of_last_service.base()};
3366 }
3367 }
3368
3370 /* NewGRF acceleration information was added to ships. */
3371 for (Ship *s : Ship::Iterate()) {
3372 if (s->acceleration == 0) s->acceleration = ShipVehInfo(s->engine_type)->acceleration;
3373 }
3374 }
3375
3377 for (Company *c : Company::Iterate()) {
3378 c->max_loan = COMPANY_MAX_LOAN_DEFAULT;
3379 }
3380 }
3381
3383 ScriptObject::InitializeRandomizers();
3384 }
3385
3387 for (Company *c : Company::Iterate()) {
3388 c->inaugurated_year_calendar = _settings_game.game_creation.starting_year;
3389 }
3390 }
3391
3393 /* Between these two versions (actually from f8b1e303 to 77236258) EngineFlags had an off-by-one. Depending
3394 * on when the save was started, this may or may not affect existing engines. Here we try to detect invalid flags
3395 * and reset them to what they should be. */
3396 for (Engine *e : Engine::Iterate()) {
3397 if (e->flags.Test(EngineFlag::Available)) continue;
3398 if (e->flags.Test(EngineFlag{2}) || (e->flags.Test(EngineFlag::ExclusivePreview) && e->preview_asked.None())) {
3399 e->flags = EngineFlags(e->flags.base() >> 1U);
3400 }
3401 }
3402 }
3403
3405 /* Default waypoints were built with an incorrect layout that prevents building bridges over them. */
3406 for (auto tile : Map::Iterate()) {
3407 if (!IsRailWaypointTile(tile)) continue; // Not a waypoint.
3408 if (GetCustomStationSpecIndex(tile) > 0) continue; // Not a default waypoint.
3409 SetStationGfx(tile, GetStationGfx(tile) & 1);
3410 }
3411 }
3412
3413 for (Company *c : Company::Iterate()) {
3415 }
3416
3417 /* Update free group numbers data for each company, required regardless of savegame version. */
3418 for (Group *g : Group::Iterate()) {
3419 Company *c = Company::Get(g->owner);
3421 /* Use the index as group number when converting old savegames. */
3422 g->number = c->freegroups.UseID(g->index.base());
3423 } else {
3424 c->freegroups.UseID(g->number);
3425 }
3426 }
3427
3431
3432 _gamelog.PrintDebug(1);
3433
3435 /* Restore the signals */
3437
3439
3441
3442 /* Start the scripts. This MUST happen after everything else except
3443 * starting a new company. */
3444 StartScripts();
3445
3446 /* If Load Scenario / New (Scenario) Game is used,
3447 * a company does not exist yet. So create one here.
3448 * 1 exception: network-games. Those can have 0 companies
3449 * But this exception is not true for non-dedicated network servers! */
3451 CompanyID first_human_company = GetFirstPlayableCompanyID();
3452 if (!Company::IsValidID(first_human_company)) {
3453 Company *c = DoStartupNewCompany(false, first_human_company);
3454 c->settings = _settings_client.company;
3455 }
3456 }
3457
3458 return true;
3459}
3460
3470{
3471 /* reload grf data */
3475 /* reload vehicles */
3476 ResetVehicleHash();
3482 /* update station graphics */
3483 AfterLoadStations();
3484 /* Update company statistics. */
3486 /* Check and update house and town values */
3488 /* Delete news referring to no longer existing entities */
3490 /* Update livery selection windows */
3491 for (CompanyID i = CompanyID::Begin(); i < MAX_COMPANIES; ++i) InvalidateWindowData(WindowClass::CompanyLivery, i);
3492 /* Update company infrastructure counts. */
3493 InvalidateWindowClassesData(WindowClass::CompanyInfrastructure);
3494 InvalidateWindowClassesData(WindowClass::BuildToolbar);
3495 InvalidateAllPickerWindows();
3496 /* redraw the whole screen */
3499}
static void SetSignalHandlers()
Replaces signal handlers of SIGSEGV and SIGABRT and stores pointers to original handlers in memory.
static void UpdateExclusiveRights()
Since savegame version 4.1, exclusive transport rights are stored at towns.
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 HandleSavegameLoadCrash(int signum)
Signal handler used to give a user a more useful report for crashes during the savegame loading proce...
static void FixOwnerOfRailTrack(Tile t)
Tries to change owner of this rail tile to a valid owner.
static void UpdateVoidTiles()
Up to revision 1413 the invisible tiles at the southern border have not been TileType::Void,...
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 ...
static void UpdateCurrencies()
Since savegame version 4.2 the currencies are arranged differently.
void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_class)
Makes a tile canal or water depending on the surroundings.
Definition afterload.cpp:91
static GroundVehicleFlags FixVehicleInclination(Vehicle *v, Direction dir)
Fixes inclination of a vehicle.
static void StartScripts()
Start the scripts.
bool SaveloadCrashWithMissingNewGRFs()
Did loading the savegame cause a crash?
void UpdateAllVirtCoords()
Update the viewport coordinates of all signs.
void ClearOldOrders()
Clear all old orders.
Definition order_sl.cpp:114
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.
Base functions for all AIs.
Base for aircraft.
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:78
@ AT_OILRIG
Oilrig airport.
Definition airport.h:38
std::vector< TileIndex > _animated_tiles
The table/list with animated tiles.
Tile animation!
Maps accessors for animated tiles.
@ Animated
Tile is animated.
@ None
Tile is not animated.
void SetAnimatedTileState(Tile t, AnimatedTileState state)
Set the animated state of a tile.
Class for backupping variables and making sure they are restored later.
VehicleFlag
Bit numbers in Vehicle::vehicle_flags.
@ PathfinderLost
Vehicle's pathfinder is lost.
@ LoadingFinished
Vehicle has finished loading.
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.
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 SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
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:110
static constexpr 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
@ Food
Cargo behaves food/fizzy-drinks-like.
Definition cargotype.h:29
@ Water
Cargo behaves water-like.
Definition cargotype.h:28
@ Mail
Cargo behaves mail-like.
Definition cargotype.h:26
@ Passengers
Cargo behaves passenger-like.
Definition cargotype.h:25
@ Goods
Cargo behaves goods/candy-like.
Definition cargotype.h:27
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.
Iterate a range of enum values.
UnitID UseID(UnitID index)
Use a unit number.
Definition vehicle.cpp:1889
static void StartNew()
Start up a new GameScript.
Definition game_core.cpp:70
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
uint8_t & m5()
General purpose.
Definition map_func.h:156
uint8_t & m6()
General purpose.
Definition map_func.h:167
uint8_t & m7()
Primarily used for newgrf support.
Definition map_func.h:178
uint8_t & m3()
General purpose.
Definition map_func.h:134
uint16_t & m2()
Primarily used for indices to towns, industries and stations.
Definition map_func.h:123
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
static constexpr TimerGame< struct Calendar >::Year DEF_END_YEAR
static constexpr TimerGame< struct Economy >::Year MIN_YEAR
static constexpr TimerGame< struct Calendar >::Year ORIGINAL_BASE_YEAR
static constexpr TimerGame< struct Calendar >::Date DAYS_TILL_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.
StrongType::Typedef< int32_t, DateTag< struct Economy >, StrongType::Compare, StrongType::Integer > Date
Map accessors for 'clear' tiles.
bool IsClearGround(Tile t, ClearGround ct)
Set the type of clear tile.
Definition clear_map.h:65
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:234
ClearGround
Ground types.
Definition clear_map.h:21
@ Fields
Farm fields (3).
Definition clear_map.h:25
@ Grass
Plain grass with dirt transition (0-3).
Definition clear_map.h:22
void MakeClear(Tile t, ClearGround g, uint density)
Make a clear tile.
Definition clear_map.h:253
ClearGround GetClearGround(Tile t)
Get the type of clear tile.
Definition clear_map.h:52
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:152
uint GetClearDensity(Tile t)
Get the density of a non-field clear tile.
Definition clear_map.h:77
void RandomiseCompanyManagerFace(CompanyManagerFace &cmf, Randomizer &randomizer)
Completely randomise a company manager face, including style.
TimeoutTimer< TimerGameTick > _new_competitor_timeout({ TimerGameTick::Priority::CompetitorTimeout, 0 }, []() { if(_game_mode==GameMode::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< Commands::CompanyControl >::Post(CompanyCtrlAction::NewAI, CompanyID::Invalid(), CompanyRemoveReason::None, ClientID::Invalid);})
Start a new competitor company if possible.
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.
Functions related to companies.
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".
Currency
This enum gives the currencies a unique id which must be maintained for savegame compatibility and in...
@ SIT
Slovenian Tolar.
@ JPY
Japanese Yen.
@ RUR
Russian Rouble.
@ NLG
Dutch Gulden.
@ CHF
Swiss Franc.
@ USD
US Dollar.
@ DEM
Deutsche Mark.
@ GBP
British Pound.
@ ESP
Spanish Peseta.
@ ISK
Icelandic Krona.
@ PLN
Polish Zloty.
@ ITL
Italian Lira.
@ DKK
Danish Krona.
@ ATS
Austrian Schilling.
@ GRD
Greek Drachma.
@ FIM
Finish Markka.
@ NOK
Norwegian Krone.
@ EUR
Euro.
@ BEF
Belgian Franc.
@ HUF
Hungarian Forint.
@ FRF
French Franc.
@ RON
Romanian Leu.
@ CZK
Czech Koruna.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
Base for all depots (except hangars).
bool IsDepotTile(Tile tile)
Is the given tile a tile with a depot on it?
Definition depot_map.h:45
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 OtherAxis(Axis a)
Select the other axis as provided.
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.
EnumIndexArray< T, DiagDirection, DiagDirection::End > DiagDirectionIndexArray
Array with DiagDirection as index.
Direction
Defines the 8 directions on the map.
@ Invalid
Flag for an invalid direction.
@ SW
Southwest.
@ NW
Northwest.
@ NE
Northeast.
@ SE
Southeast.
Axis
Enumeration for the two axis X and Y.
@ X
The X axis.
@ Y
The y axis.
DiagDirection
Enumeration for diagonal directions.
@ SW
Southwest.
@ NW
Northwest.
@ End
Used for iterations.
@ NE
Northeast, upper right on your monitor.
@ SE
Southeast.
All disaster vehicles.
void RecomputePrices()
Computes all prices, payments and maximum loan.
Definition economy.cpp:734
bool AddInflation(bool check_year)
Add monthly inflation.
Definition economy.cpp:696
Base classes related to the economy.
static const uint64_t MAX_INFLATION
Maximum inflation (including fractional part) without causing overflows in int64_t price computations...
Header file for electrified rail specific functions.
void StartupEngines()
Start/initialise all our engines.
Definition engine.cpp:836
Functions related to engines.
void CopyTempEngineData()
Copy data from temporary engine array into the real engine pool.
EnumBitSet< EngineFlag, uint8_t > EngineFlags
Bitset of EngineFlag elements.
@ 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:21
Functions related to errors.
@ 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.
@ Scenario
old or new scenario
Definition fileio_type.h:20
Declarations for savegames operations.
Base functions for all Games.
Gamelog _gamelog
Gamelog instance.
Definition gamelog.cpp:31
Declaration shared among gamelog.cpp and saveload/gamelog_sl.cpp.
void LoadStringWidthTable(FontSizes fontsizes)
Initialize _stringwidth_table cache for the specified font sizes.
Definition gfx.cpp:1260
PauseModes _pause_mode
The current pause mode.
Definition gfx.cpp:51
void GfxLoadSprites()
Initialise and load all the sprites.
Definition gfxinit.cpp:334
Functions related to the graphics initialization.
@ Tile
Destination is a tile.
Definition goal_type.h:53
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.
Definition group.h:68
@ ReplaceWagonRemoval
If set, autoreplace will perform wagon removal on vehicles in this group.
Definition group.h:69
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1553
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
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
Base of all industries.
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.
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner)
Change the owner of a tile.
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, RoadTramType sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
int GetSlopePixelZ(int x, int y, bool ground_vehicle)
Return world Z coordinate of a given point of a tile.
@ Arctic
Landscape with snow levels.
@ Tropic
Landscape with distinct rainforests and deserts,.
void AfterLoadLinkGraphs()
Spawn the threads for running link graph calculations.
@ Manual
Manual distribution. No link graph calculations are run.
@ Default
Default scheme.
Definition livery.h:24
void SetupColoursAndInitialWindow()
Initialise the default colours (remaps and the likes), and load the main windows.
Definition main_gui.cpp:554
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
Definition map.cpp:169
TileIndex TileAddXY(TileIndex tile, int x, int y)
Adds a given offset to a tile.
Definition map_func.h:474
static TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
Definition map_func.h:407
TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Definition map_func.h:615
TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition map_func.h:392
static TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
Definition map_func.h:376
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition map_func.h:429
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition map_func.h:419
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:574
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
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
void GenerateSavegameId()
Generate an unique savegame ID.
Definition misc.cpp:89
ZoomLevel _saved_scrollpos_zoom
Definition misc_sl.cpp:37
int _saved_scrollpos_x
Definition misc_sl.cpp:35
int _saved_scrollpos_y
Definition misc_sl.cpp:36
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
Basic functions/variables used all over the place.
Network functions used by other parts of OpenTTD.
Base for the NewGRF implementation.
@ FakeTowns
Fake town GrfSpecFeature for NewGRF debugging (parent scope).
Definition newgrf.h:104
@ Airports
Airports feature.
Definition newgrf.h:92
@ Industries
Industries feature.
Definition newgrf.h:89
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.
@ NotFound
At least one GRF couldn't be found (higher priority than GRFListCompatibility::Compatible).
@ AllGood
All GRF needed by game are present.
@ Compatible
Compatible (eg. the same ID, but different checksum) GRF found in at least one case.
@ NotFound
GRF file was not found in the local cache.
@ Compatible
GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches).
Header file for NewGRF stations.
Functions related to news.
void DeleteInvalidEngineNews()
Remove engine announcements for invalid engines.
Base for all objects.
Map accessors for object tiles.
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.
Definition openttd.h:75
@ ActiveClients
A game paused for 'min_active_clients'.
Definition openttd.h:76
@ Normal
A game normally paused.
Definition openttd.h:72
@ Join
A game paused for 'pause_on_join'.
Definition openttd.h:74
@ Normal
Playing a game.
Definition openttd.h:20
EnumBitSet< PauseMode, uint8_t > PauseModes
Bitset of PauseMode elements.
Definition openttd.h:83
Functions related to order backups.
OrderUnloadType
Unloading order types.
Definition order_type.h:67
@ Transfer
Transfer all cargo onto the platform.
Definition order_type.h:70
@ FarEnd
Stop at the far end of the platform.
Definition order_type.h:101
@ NonStop
The vehicle will not stop at any stations it passes except the destination, aka non-stop.
Definition order_type.h:88
EnumBitSet< OrderDepotActionFlag, uint8_t > OrderDepotActionFlags
Bitset of OrderDepotActionFlag elements.
Definition order_type.h:126
@ NoLoad
Do not load anything.
Definition order_type.h:81
Functions/types etc.
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
Get the rail types the given company can build.
Definition rail.cpp:137
void InitializeSignalGui()
Resets the signal GUI.
Functions/types etc.
static bool IsPlainRail(Tile t)
Returns whether this is plain rails, with or without signals.
Definition rail_map.h:49
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
Definition rail_map.h:115
static bool IsRailDepot(Tile t)
Is this rail tile a rail depot?
Definition rail_map.h:95
RailGroundType GetRailGroundType(Tile t)
Get the ground type for rail tiles.
Definition rail_map.h:601
static bool IsPlainRailTile(Tile t)
Checks whether the tile is a rail tile or rail tile with signals.
Definition rail_map.h:60
void MakeRailNormal(Tile t, Owner o, TrackBits b, RailType r)
Make the given tile a normal rail.
Definition rail_map.h:624
void SetTrackReservation(Tile t, TrackBits b)
Sets the reserved track bits of the tile.
Definition rail_map.h:209
@ HalfTileWater
Grass with a fence and shore or water on the free halftile.
Definition rail_map.h:582
void SetDepotReservation(Tile t, bool b)
Set the reservation state of the depot.
Definition rail_map.h:268
bool HasSignals(Tile t)
Checks if a rail tile has signals.
Definition rail_map.h:72
void SetSignalVariant(Tile t, Track track, SignalVariant v)
Set the signal variant for a track on a tile.
Definition rail_map.h:398
static bool IsRailDepotTile(Tile t)
Is this tile rail tile and a rail depot?
Definition rail_map.h:105
void SetSignalStates(Tile tile, uint state)
Set the states of the signals (Along/AgainstTrackDir).
Definition rail_map.h:410
void SetRailType(Tile t, RailType r)
Sets the rail type of the given tile.
Definition rail_map.h:125
EnumBitSet< RailType, uint64_t > RailTypes
Bitset of RailType elements.
Definition rail_type.h:37
RailType
Enumeration for all possible railtypes.
Definition rail_type.h:26
@ RAILTYPE_ELECTRIC
Electric rails.
Definition rail_type.h:29
@ RAILTYPE_RAIL
Standard non-electric rails.
Definition rail_type.h:28
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:210
void UpdateNearestTownForRoadTiles(bool invalidate)
Updates cached nearest town for all road tiles.
Road related functions.
RoadBits AxisToRoadBits(Axis a)
Create the road-part which belongs to the given Axis.
Definition road_func.h:93
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:261
static RoadTileType GetRoadTileType(Tile t)
Get the type of the road tile.
Definition road_map.h:36
bool HasTownOwnedRoad(Tile t)
Checks if given tile has town owned road.
Definition road_map.h:290
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:619
static bool IsRoadDepot(Tile t)
Return whether a tile is a road depot.
Definition road_map.h:90
@ Normal
Normal road.
Definition road_map.h:23
@ Depot
Depot (one entrance).
Definition road_map.h:25
@ Crossing
Level crossing.
Definition road_map.h:24
RoadBits GetCrossingRoadBits(Tile tile)
Get the road bits of a level crossing.
Definition road_map.h:358
Owner GetRoadOwner(Tile t, RoadTramType rtt)
Get the owner of a specific road type.
Definition road_map.h:244
void SetCrossingReservation(Tile t, bool b)
Set the reservation state of the rail crossing.
Definition road_map.h:392
bool IsLevelCrossing(Tile t)
Return whether a tile is a level crossing.
Definition road_map.h:69
EnumBitSet< RoadBit, uint8_t > RoadBits
Bitset of RoadBit elements.
Definition road_type.h:65
static constexpr RoadTramTypes ROADTRAMTYPES_ALL
All possible RoadTramTypes.
Definition road_type.h:49
RoadType
The different roadtypes we support.
Definition road_type.h:24
@ INVALID_ROADTYPE
flag for invalid roadtype
Definition road_type.h:29
@ ROADTYPE_TRAM
Trams.
Definition road_type.h:27
@ ROADTYPE_ROAD
Basic road type.
Definition road_type.h:26
RoadTramType
The different types of road type.
Definition road_type.h:38
@ Invalid
Invalid marker.
Definition road_type.h:42
@ Tram
Tram type.
Definition road_type.h:40
@ Road
Road type.
Definition road_type.h:39
Base class for roadstops.
Road vehicle states.
@ 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
static const uint RVC_DRIVE_THROUGH_STOP_FRAME
Stop frame for a vehicle in a drive-through stop.
Definition roadveh.h:82
Command definitions related to road vehicles.
const uint8_t _road_stop_stop_frame[]
Table of road stop stop frames, when to stop at a road stop.
A number of safeguards to prevent using unsafe methods.
void SlError(StringID string, const std::string &extra_msg)
Error handler.
Definition saveload.cpp:339
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:369
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Definition saveload.cpp:78
bool IsSavegameVersionBefore(SaveLoadVersion major, uint8_t minor=0)
Checks whether the savegame is below major.
Definition saveload.h:1268
@ LastLoadingTick
Saveload version: 301, GitHub pull request: 9693 Store tick of last loading for vehicles.
Definition saveload.h:344
@ LargerTownCargoStatistics
Saveload version: 9.0, SVN revision: 1909 Increase size of passenger/mail production of this and pre...
Definition saveload.h:54
@ BigDates
Saveload version: 31, SVN revision: 5999 Change date from 1920 - 2090 to 0 - 5 000 000.
Definition saveload.h:84
@ IncreaseHouseLimit
Saveload version: 348, GitHub pull request: 12288 Increase house limit to 4096.
Definition saveload.h:400
@ CustomSeaLevel
Saveload version: 149, SVN revision: 20832 Setting to influence the sea level (amount of water).
Definition saveload.h:225
@ StoreIndustryCargo
Saveload version: 78, SVN revision: 11176 Store an industry's cargo, so it can be customised upon bu...
Definition saveload.h:140
@ MoreEngineTypes
Saveload version: 95, SVN revision: 12924 Allow more than the original 255 engine types.
Definition saveload.h:161
@ TrainSlopeSteepness
Saveload version: 133, SVN revision: 18674 Setting to increase steepness of slopes for trains under ...
Definition saveload.h:206
@ FractionProfitRunningTicks
Saveload version: 88, SVN revision: 12134 Store vehicle profits as a (fixed point) fraction,...
Definition saveload.h:152
@ UnifyWaypointAndStation
Saveload version: 123, SVN revision: 16909 Unify stations and waypoints.
Definition saveload.h:194
@ InfrastructureMaintenanceCosts
Saveload version: 166, SVN revision: 23415 Infrastructure can now cost some periodic fee.
Definition saveload.h:246
@ VehicleEconomyAge
Saveload version: 334, GitHub pull request: 12141, release: 14.0 Add vehicle age in economy year,...
Definition saveload.h:383
@ GroupReplaceWagonRemoval
Saveload version: 291, GitHub pull request: 7441 Per-group wagon removal flag.
Definition saveload.h:332
@ PauseModes
Saveload version: 119, SVN revision: 16242 Use bitmask of reason to pause, so manual/auto pausing do...
Definition saveload.h:189
@ ImproveMultistop
Saveload version: 25, SVN revision: 4259 Improve the behaviour of RVs going to road stops.
Definition saveload.h:77
@ MonthlyBankruptcyCheck
Saveload version: 177, SVN revision: 24619 Check for bankruptcy on a monthly cycle.
Definition saveload.h:259
@ CompanyInauguratedPeriodV2
Saveload version: 349, GitHub pull request: 13448 Fix savegame storage for company inaugurated year ...
Definition saveload.h:401
@ GoalProgressPlaneAcceleration
Saveload version: 182, SVN revision: 25115, r25259, r25296 Goal status and plane acceleration fixes.
Definition saveload.h:265
@ CountPaidForCargo
Saveload version: 45, SVN revision: 8501 Count the amount of cargo that was paid for.
Definition saveload.h:101
@ EndingYear
Saveload version: 218, GitHub pull request: 7747, release: 1.10 Configurable ending year.
Definition saveload.h:308
@ FifoLoading
Saveload version: 57, SVN revision: 9691 First-in-first-out loading of vehicles.
Definition saveload.h:115
@ LargerTownIterator
Saveload version: 11.0, SVN revision: 2033 Increase size of the town iterator.
Definition saveload.h:57
@ FreeformEdges
Saveload version: 111, SVN revision: 15190 Allow terraforming along the edge of the map.
Definition saveload.h:180
@ UnifyAnimationState
Saveload version: 43, SVN revision: 7642 Put all animation state information in same map bits.
Definition saveload.h:98
@ MoveSemaphoreBits
Saveload version: 15.0, SVN revision: 2499 Move rail signal bit for semaphores.
Definition saveload.h:63
@ ReplaceCustomNameArray
Saveload version: 84, SVN revision: 11822 Replace single fixed size array of custom names,...
Definition saveload.h:147
@ IncreaseStationTypeFieldSize
Saveload version: 337, GitHub pull request: 12572 Increase size of StationType field in map array.
Definition saveload.h:387
@ WaterClass
Saveload version: 86, SVN revision: 12042 Store the type of water (sea/ocean, canal,...
Definition saveload.h:150
@ LastVehicleType
Saveload version: 26, SVN revision: 4466 Store the last vehicle type at stations instead of the vehi...
Definition saveload.h:78
@ RoadLayoutPerTown
Saveload version: 113, SVN revision: 15340 Allow for different road layouts for each of the towns.
Definition saveload.h:182
@ SplitStationTypeFromGfxid
Saveload version: 72, SVN revision: 10601 Splits the encoding of station type from the graphics iden...
Definition saveload.h:133
@ NewGRFSuppliedStationName
Saveload version: 103, SVN revision: 14598 NewGRF industry supplying default names for nearby statio...
Definition saveload.h:170
@ MaxLengthAndReverseSignals
Saveload version: 159, SVN revision: 21962 Settings for reversing at signals, and maximum train,...
Definition saveload.h:237
@ ObjectTypeToPool
Saveload version: 186, SVN revision: 25833 Move object type from map to pool object.
Definition saveload.h:270
@ MultipleSignalTypes
Saveload version: 64, SVN revision: 10006 Multiple different signal types on the same (diagonal) til...
Definition saveload.h:123
@ SimplifyPlayerFace
Saveload version: 49, SVN revision: 8969 Simplify the storage of player face information.
Definition saveload.h:105
@ VehicleCurrencyStationChanges
Saveload version: 2.0, release: 0.3.0 Adding vehicle state, larger currency size for statistics,...
Definition saveload.h:37
@ TownTolerancePauseMode
Saveload version: 4.0, SVN revision: 1 Town council tolerance and pause mode.
Definition saveload.h:41
@ RoadTypes
Saveload version: 214, GitHub pull request: 6811 NewGRF road types.
Definition saveload.h:303
@ AircraftSpeedHolding
Saveload version: 50, SVN revision: 8973 Aircraft speed in km-ish/h and reduced speed in holding pat...
Definition saveload.h:107
@ MaxLoanForCompany
Saveload version: 330, GitHub pull request: 11224 Separate max loan for each company.
Definition saveload.h:379
@ TrackRealAndAutoOrders
Saveload version: 158, SVN revision: 21933 Track which real and auto order is the current order.
Definition saveload.h:236
@ VehicleCentreAndZPos
Saveload version: 164, SVN revision: 23290 Vehicle centres are not fixed at 4/8 of the vehicle; chan...
Definition saveload.h:243
@ VirtualFeederSharePayment
Saveload version: 134, SVN revision: 18703 Pay a part of the virtual profit during a transfer to the...
Definition saveload.h:207
@ SimplifyPathfinderSettings
Saveload version: 87, SVN revision: 12129 Make it easier to select the pathfinder to use.
Definition saveload.h:151
@ EconomyModeTimekeepingUnits
Saveload version: 327, GitHub pull request: 11341 Mode to display economy measurements in wallclock ...
Definition saveload.h:375
@ DriveBackwards
Saveload version: 365, GitHub pull request: 15379 Trains can drive backwards.
Definition saveload.h:421
@ MultipleRoadTypes
Saveload version: 61, SVN revision: 9892 Multiple road types for the same tile.
Definition saveload.h:120
@ MultitileDocks
Saveload version: 216, GitHub pull request: 7380 Multiple docks per station.
Definition saveload.h:306
@ RailTrackTypeUnification
Saveload version: 48, SVN revision: 8935 Put all the rail track type information in same map bits.
Definition saveload.h:104
@ AnimatedTileStateInMap
Saveload version: 347, GitHub pull request: 13082 Animated tile state saved for improved performance...
Definition saveload.h:399
@ NewGRFIndustryRandomTriggers
Saveload version: 82, SVN revision: 11410 NewGRF random triggers for industries.
Definition saveload.h:145
@ NewGRFLastService
Saveload version: 317, GitHub pull request: 11124 Added stable date_of_last_service to avoid NewGRF ...
Definition saveload.h:363
@ LinkgraphSeconds
Saveload version: 308, GitHub pull request: 10610 Store linkgraph update intervals in seconds instea...
Definition saveload.h:352
@ DisableTownLevelCrossing
Saveload version: 143, SVN revision: 20048 Setting to be able to disable building rail/road crossing...
Definition saveload.h:218
@ ShipAcceleration
Saveload version: 329, GitHub pull request: 10734 Start using Vehicle's acceleration field for ships...
Definition saveload.h:377
@ MaximumDepotPenalty
Saveload version: 131, SVN revision: 18481 Add configurable maximum pathfinder penalty for finding a...
Definition saveload.h:204
@ NewGRFPersistentStorage
Saveload version: 76, SVN revision: 11139 Persistently store some state of NewGRF objects/entities.
Definition saveload.h:138
@ TownAcceptance
Saveload version: 127, SVN revision: 17439 Store mask of cargos accepted by town houses and head qua...
Definition saveload.h:199
@ MoreCargoPackets
Saveload version: 69, SVN revision: 10319 Allow more than ~65k cargo packets.
Definition saveload.h:129
@ FixTreeGround
Saveload version: 81, SVN revision: 11244 Various fixes to improve the visuals of the ground under t...
Definition saveload.h:144
@ SeparateOrderTravelWaitTime
Saveload version: 190, SVN revision: 26547 Separate order travel and wait times.
Definition saveload.h:275
@ AirportAnimationFrames
Saveload version: 137, SVN revision: 18912 Use animation frames instead of many airport tile ids for...
Definition saveload.h:211
@ IndustryManagement
Saveload version: 152, SVN revision: 21171 Manage the amount of industries that ought to be spawned ...
Definition saveload.h:229
@ NewGRFHouses
Saveload version: 53, SVN revision: 9316 NewGRF controlled houses.
Definition saveload.h:110
@ FoundTown
Saveload version: 128, SVN revision: 18281 Founding of new towns.
Definition saveload.h:200
@ NonfloodingWaterTiles
Saveload version: 345, GitHub pull request: 13013 Store water tile non-flooding state.
Definition saveload.h:397
@ RefitOrders
Saveload version: 36, SVN revision: 6624 Vehicles can be refitted as part of an order.
Definition saveload.h:90
@ ExtendIndustryCargoSlots
Saveload version: 202, GitHub pull request: 6867 Increase industry cargo slots to 16 in,...
Definition saveload.h:289
@ RemoveSubsidyStationBinding
Saveload version: 125, SVN revision: 17113 Awarded subsidies are not bound to stations,...
Definition saveload.h:197
@ ImprovedOrders
Saveload version: 93, SVN revision: 12648 Orders support all full load/non stop types at the same ti...
Definition saveload.h:158
@ DisableElrailSetting
Saveload version: 38, SVN revision: 7195 Add setting to disable electrified rails.
Definition saveload.h:92
@ AIStartDate
Saveload version: 309, GitHub pull request: 10653 Removal of individual AI start dates and added a g...
Definition saveload.h:353
@ StoreAirportSize
Saveload version: 140, SVN revision: 19382 Store the size of the airport in the station.
Definition saveload.h:215
@ StoreWaypointIdInMap
Saveload version: 17.0, SVN revision: 3212 Store the ID of waypoints in m2 of the map.
Definition saveload.h:66
@ BuoysAt0_0
Saveload version: 364, GitHub pull request: 14983 Allow to build buoys at (0x0).
Definition saveload.h:419
@ PlatformStopLocation
Saveload version: 117, SVN revision: 16037 Set the platform stop location via train orders.
Definition saveload.h:187
@ SeparateRoadOwners
Saveload version: 114, SVN revision: 15601 Separate owners for road bits, tram bits and the road sto...
Definition saveload.h:183
@ MoreCompanies
Saveload version: 104, SVN revision: 14735 Increase maximum number of companies to 15.
Definition saveload.h:171
@ NewGRFPalette
Saveload version: 101, SVN revision: 14233 Store palette used by each of the NewGRFs.
Definition saveload.h:168
@ MultipleRoadStops
Saveload version: 6.0, SVN revision: 1721 Multi tile road stops, and some map size related fixes.
Definition saveload.h:50
@ SavegameId
Saveload version: 313, GitHub pull request: 10719 Add an unique ID to every savegame (used to dedupl...
Definition saveload.h:358
@ UnifyAnimationFrame
Saveload version: 147, SVN revision: 20621 Unify location of animation frame.
Definition saveload.h:223
@ AutoreplaceWhenOldTreeLimit
Saveload version: 175, SVN revision: 24136 Autoreplace vehicle only when they are old,...
Definition saveload.h:257
@ CargoPayments
Saveload version: 121, SVN revision: 16694 Perform payment of cargo after unloading.
Definition saveload.h:192
@ MultitrackLevelCrossings
Saveload version: 302, GitHub pull request: 9931, release: 13.0 Multi-track level crossings.
Definition saveload.h:345
@ PlaneSpeedFactor
Saveload version: 90, SVN revision: 12293 Setting to increase aircraft speed to be on par with the o...
Definition saveload.h:155
@ StationsUnderBridges
Saveload version: 359, GitHub pull request: 14477 Allow stations under bridges.
Definition saveload.h:413
@ CumulatedInflation
Saveload version: 126, SVN revision: 17433 Store cumulated inflation, and recalculate prices/payment...
Definition saveload.h:198
@ TownCargogen
Saveload version: 208, GitHub pull request: 6965 New algorithms for town building cargo generation.
Definition saveload.h:296
@ DisallowRoadReconstruction
Saveload version: 160, SVN revision: 21974, release: 1.1.x Setting to disallow road reconstruction.
Definition saveload.h:239
@ Cargodist
Saveload version: 183, SVN revision: 25363 Cargodist.
Definition saveload.h:266
@ Elrail
Saveload version: 24, SVN revision: 4150 Electrified railways.
Definition saveload.h:75
@ CompanyServiceIntervals
Saveload version: 120, SVN revision: 16439 Make service intervals configurable per company.
Definition saveload.h:191
@ MoreAirportBlocks
Saveload version: 46, SVN revision: 8705 Increase number of blocks an airport can have.
Definition saveload.h:102
@ ReducePlaneCrashes
Saveload version: 138, SVN revision: 18942, release: 1.0.x Setting to reduce/disable crashing of pla...
Definition saveload.h:212
@ RocksStayUnderSnow
Saveload version: 135, SVN revision: 18719 Rocks stay under snow, i.e. they return when the snow goe...
Definition saveload.h:209
@ MinVersion
First savegame version.
Definition saveload.h:34
@ EconomyDate
Saveload version: 326, GitHub pull request: 10700 Split calendar and economy timers and dates.
Definition saveload.h:374
@ OrderMaxSpeed
Saveload version: 172, SVN revision: 23947 Set maximum speed for orders.
Definition saveload.h:253
@ MoreHouseAnimationFrames
Saveload version: 91, SVN revision: 12347 Increase number of animation frames for NewGRF houses.
Definition saveload.h:156
@ WaypointMoreLikeStation
Saveload version: 122, SVN revision: 16855 Make waypoint data look more like stations.
Definition saveload.h:193
@ ExtendRailtypes
Saveload version: 200, GitHub pull request: 6805 Extend railtypes to 64, adding uint16_t to map arra...
Definition saveload.h:287
@ VeryLowTownIndustryNumber
Saveload version: 58, SVN revision: 9762 Difficulty settings for very low number of industries and t...
Definition saveload.h:116
@ SplitLoadWaitCounters
Saveload version: 136, SVN revision: 18764 Split counters for (un)loading and signal waiting/turning...
Definition saveload.h:210
@ LeaveRoadStopSeparately
Saveload version: 153, SVN revision: 21263 Fix issue where multiple vehicles could leave a road stop...
Definition saveload.h:230
@ StatueOwner
Saveload version: 52, SVN revision: 9066 Store the owner of the statue, so the town can be informed ...
Definition saveload.h:109
@ SplitHQ
Saveload version: 112, SVN revision: 15290 Split the behaviour of headquarters from the other unmova...
Definition saveload.h:181
@ UniqueDepotNames
Saveload version: 141, SVN revision: 19799 Give depots unique names.
Definition saveload.h:216
@ DepotWaterOwners
Saveload version: 83, SVN revision: 11589 Store the owner of the water under depots,...
Definition saveload.h:146
@ EngineRenew
Saveload version: 16.0, SVN revision: 2817 Automatic replacing/renewing of vehicles.
Definition saveload.h:64
@ TownGrowthInGameTicks
Saveload version: 198, GitHub pull request: 6763 Switch town growth rate and counter to actual game ...
Definition saveload.h:284
@ DepotUnbunching
Saveload version: 331, GitHub pull request: 11945 Allow unbunching shared order vehicles at a depot.
Definition saveload.h:380
@ ShipsStopInLocks
Saveload version: 206, GitHub pull request: 7150 Ship/lock movement changes.
Definition saveload.h:294
@ IndustryTileWaterClass
Saveload version: 99, SVN revision: 13838 Add water classes to industry tiles.
Definition saveload.h:165
@ ScriptRandomizer
Saveload version: 333, GitHub pull request: 12063, release: 14.0-RC1 Save script randomizers.
Definition saveload.h:382
@ RepairObjectDockingTiles
Saveload version: 299, GitHub pull request: 9594, release: 12.0 Fixing issue with docking tiles over...
Definition saveload.h:341
@ RemoveOldPbs
Saveload version: 21, SVN revision: 3472, release: 0.4.x Remove old implementation of path based sig...
Definition saveload.h:72
@ NewGRFDepotBuildDate
Saveload version: 142, SVN revision: 20003 Depot build date for NewGRFs.
Definition saveload.h:217
@ NewGRFAirportSmoke
Saveload version: 145, SVN revision: 20376 NewGRF support for airport and configurable amount of smo...
Definition saveload.h:221
@ FixStationPickupAccounting
Saveload version: 74, SVN revision: 11030 Accounting of which cargos a station would pick up was don...
Definition saveload.h:135
@ DistantStationJoining
Saveload version: 106, SVN revision: 14919 Distant joining of stations.
Definition saveload.h:174
@ VelocityNautical
Saveload version: 305, GitHub pull request: 10594 Separation of land and nautical velocity (knots!...
Definition saveload.h:349
@ CalendarSubDateFract
Saveload version: 328, GitHub pull request: 11428 Add sub_date_fract to measure calendar days.
Definition saveload.h:376
@ Liveries
Saveload version: 34, SVN revision: 6455 Liveries and two company colours (2cc).
Definition saveload.h:87
@ GroupNumbers
Saveload version: 336, GitHub pull request: 12297 Add per-company group numbers.
Definition saveload.h:386
@ RvRealisticAcceleration
Saveload version: 139, SVN revision: 19346 Realistic acceleration of road vehicles.
Definition saveload.h:213
@ ServeNeutralIndustries
Saveload version: 210, GitHub pull request: 7234 Company stations can serve industries with attached...
Definition saveload.h:299
@ ReorderUnmovableRemoveReserved
Saveload version: 144, SVN revision: 20334 Reorder map bits of unmovable tiles and remove unused res...
Definition saveload.h:219
@ Yapp
Saveload version: 100, SVN revision: 13952 New version of path based signals.
Definition saveload.h:167
@ MultiTileWaypoints
Saveload version: 124, SVN revision: 16993 Waypoints can be bigger than a single tile.
Definition saveload.h:195
@ FaceStyles
Saveload version: 355, GitHub pull request: 14319 Addition of face styles, replacing gender and ethn...
Definition saveload.h:409
@ TerraformLimits
Saveload version: 156, SVN revision: 21728 Introduce limits for terraforming and clearing times.
Definition saveload.h:234
@ SeparateLocaleUnits
Saveload version: 184, SVN revision: 25508 Unit localisation split.
Definition saveload.h:267
@ TreesWaterClass
Saveload version: 213, GitHub pull request: 7405 WaterClass update for tree tiles.
Definition saveload.h:302
@ AdjacentStations
Saveload version: 62, SVN revision: 9905 Allow building multiple stations directly next to eachother...
Definition saveload.h:121
@ UnifyRvTravelTime
Saveload version: 188, SVN revision: 26169, release: 1.4 Unify RV travel time.
Definition saveload.h:272
@ MaxBridgeMapHeight
Saveload version: 194, SVN revision: 26881, release: 1.5 Setting for maximum bridge and map height.
Definition saveload.h:279
@ ScriptSaveInstances
Saveload version: 352, GitHub pull request: 13556 Scripts are allowed to save instances.
Definition saveload.h:405
@ IndustryPlatform
Saveload version: 148, SVN revision: 20659 Setting to make a flat area around (new) industries.
Definition saveload.h:224
@ ScriptTownGrowth
Saveload version: 165, SVN revision: 23304 Storage of cargo statistics for use by game scripts.
Definition saveload.h:245
@ FixCompanyCargoTypes
Saveload version: 94, SVN revision: 12816 The company's cargo types should have increased in since w...
Definition saveload.h:159
@ Gamelog
Saveload version: 98, SVN revision: 13375 Logging of important actions/situations in the save.
Definition saveload.h:164
@ PersistentStoragePool
Saveload version: 161, SVN revision: 22567 Store persistent storage in a pool.
Definition saveload.h:240
@ TownLayout
Saveload version: 59, SVN revision: 9779 More layout options for towns.
Definition saveload.h:117
@ UnifyWaterClass
Saveload version: 146, SVN revision: 20446 Unify location for storing water class in the map.
Definition saveload.h:222
@ Cities
Saveload version: 56, SVN revision: 9667 Cities that start bigger and grow faster.
Definition saveload.h:114
@ AirportNoise
Saveload version: 96, SVN revision: 13226 Introduce noise for airports, to allow more than two airpo...
Definition saveload.h:162
@ CargoPaymentOverflow
Saveload version: 70, SVN revision: 10541 Fix overflow of cargo payment rates, plus preparation for ...
Definition saveload.h:131
@ WaterTileType
Saveload version: 342, GitHub pull request: 13030 Simplify water tile type.
Definition saveload.h:393
@ FixOrderBackup
Saveload version: 192, SVN revision: 26700 Fix saving of order backups.
Definition saveload.h:277
@ BridgeWormhole
Saveload version: 42, SVN revision: 7573 Bridges become wormholes, so more things can be built under...
Definition saveload.h:97
@ GSIndustryControl
Saveload version: 287, GitHub pull request: 7912 and 8115 GS industry control.
Definition saveload.h:327
@ LinkFarmFieldToIndustry
Saveload version: 32, SVN revision: 6001 Link farm fields to the industry, so it gets removed when t...
Definition saveload.h:85
@ ConsistentPartialZ
Saveload version: 306, GitHub pull request: 10570 Conversion from an inconsistent partial Z calculat...
Definition saveload.h:350
bool IsSavegameVersionBeforeOrAt(SaveLoadVersion major)
Checks whether the savegame is below or at major.
Definition saveload.h:1282
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:65
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.
Window for configuring the scripts.
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
IndustryDensity
Available industry map generation densities.
@ FundedOnly
The game does not build industries.
@ EndOfLineOnly
Trains can only flip when the track ends.
@ All
Trains can flip anywhere.
@ Right
Drive on the right side.
Base for ships.
@ Combo
presignal inter-block.
Definition signal_type.h:28
@ Electric
Light signal.
Definition signal_type.h:17
@ Semaphore
Old-fashioned semaphore signal.
Definition signal_type.h:18
void UpdateAllSignVirtCoords()
Update the coordinates of all signs.
Definition signs.cpp:50
Base class for signs.
Functions related to signs.
DiagDirection GetInclinedSlopeDirection(Slope s)
Returns the direction of an inclined slope.
Definition slope_func.h:249
void BuildOwnerLegend()
Completes the array for the owned property legend.
Smallmap GUI functions.
@ Industry
Source/destination is an industry.
Definition source_type.h:21
@ Town
Source/destination is a town.
Definition source_type.h:22
Base classes/functions for stations.
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 IsRailWaypointTile(Tile t)
Is this tile a station tile and a rail waypoint?
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?
uint GetCustomStationSpecIndex(Tile t)
Get the custom station spec for this tile.
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?
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.
@ Dock
Ship port.
@ Rail
Railways/train station.
@ Bus
Road stop for busses.
@ Truck
Road stop for trucks.
@ Buoy
Waypoint for ships.
@ Oilrig
Heliport on an oil rig.
@ Airport
Airports and heliports, excluding the ones on oil rigs.
Definition of base types and functions in a cross-platform compatible way.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
Definition string.cpp:77
Functions related to low-level strings.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
Functions related to OTTD's strings.
static constexpr uint16_t SPECSTR_TOWNNAME_START
Special strings for town names.
static constexpr StringID SPECSTR_PRESIDENT_NAME
Special string for the president's name.
StrongType::Typedef< uint32_t, struct StringIDTag, StrongType::Compare, StrongType::Integer > StringID
Numeric value that represents a string, independent of the selected language.
Information about a aircraft vehicle.
Aircraft, helicopters, rotors and their shadows belong to this class.
Definition aircraft.h:75
Class to backup a specific variable and restore it upon destruction of this object to prevent stack v...
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:77
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo type.
Definition cargotype.h:141
TownAcceptanceEffect town_acceptance_effect
The effect that delivering this cargo type has on towns. Also affects destination of subsidies.
Definition cargotype.h:89
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)?
Disasters, like submarines, skyrangers and their shadows, belong to this class.
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).
Stores station stats for a single cargo.
uint8_t last_speed
Maximum speed (up to 255) of the last vehicle that tried to load this cargo.
States status
Status of this cargo, see State.
@ Rating
This indicates whether a cargo has a rating at the station.
uint AvailableCount() const
Returns sum of cargo still available for loading at the station.
GroundVehicleFlags gv_flags
static void UpdateAfterLoad()
Update all caches after loading a game, changing NewGRF, etc.
Group data.
Definition group.h:76
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:64
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
Definition industry.h:253
static uint SizeX()
Get the size of the map along the X.
Definition map_func.h:262
static uint SizeY()
Get the size of the map along the Y.
Definition map_func.h:271
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition map_func.h:366
static uint MaxY()
Gets the maximum Y coordinate within the map, including TileType::Void.
Definition map_func.h:298
static uint MaxX()
Gets the maximum X coordinate within the map, including TileType::Void.
Definition map_func.h:289
An object, such as transmitter, on the map.
Definition object_base.h:24
ObjectType type
Type of the object.
Definition object_base.h:25
Town * town
Town the object is built in.
Definition object_base.h:26
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:28
TileArea location
Location of the object.
Definition object_base.h:27
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:384
If you change this, keep in mind that it is also saved in 2 other places:
Definition order_base.h:34
bool IsType(OrderType type) const
Check whether this order is of the given type.
Definition order_base.h:67
uint16_t w
The width of the area.
TileIndex tile
The base tile of the area.
uint16_t h
The height of the area.
static Pool::IterateWrapper< Town > Iterate(size_t from=0)
static T * Create(Targs &&... args)
static Town * Get(auto index)
static Company * GetIfValid(auto index)
A Stop for a Road Vehicle.
Buses, trucks and trams belong to this class.
Definition roadveh.h:105
uint8_t state
Definition roadveh.h:107
RoadType roadtype
NOSAVE: Roadtype of this vehicle.
Definition roadveh.h:115
All ships have this type.
Definition ship.h:32
static bool IsExpected(const BaseStation *st)
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
static Station * Get(auto index)
static Station * GetIfValid(auto index)
static Station * From(BaseStation *st)
T * Next() const
Get next vehicle in the chain.
static Train * From(Vehicle *v)
Station data structure.
RoadStop * bus_stops
All the road stops.
static void RecomputeCatchmentForAll()
Recomputes catchment of all stations.
Definition station.cpp:537
RoadStop * truck_stops
All the truck stops.
Struct about subsidies, offered and awarded.
Town data structure.
Definition town.h:64
Track status of a tile.
Definition track_type.h:105
TrackdirBits trackdirs
Trackdirs present on the tile.
Definition track_type.h:106
'Train' is either a loco or a wagon.
Definition train.h:97
TrackBits track
On which track the train currently is.
Definition train.h:110
VehicleRailFlags flags
Which flags has this train currently set.
Definition train.h:98
Default settings for vehicles.
Vehicle data structure.
CargoPayment * cargo_payment
The cargo payment we're currently in.
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:104
Subsidy base class.
Functions related to subsidies.
bool MayAnimateTile(TileIndex tile)
Test if a tile may be animated.
Definition tile_cmd.h:269
bool IsTileFlat(TileIndex tile, int *h)
Check if a given tile is flat.
Definition tile_map.cpp:94
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
Definition tile_map.cpp:135
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
Definition tile_map.cpp:115
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
uint TileHash(uint x, uint y)
Calculate a hash value from a tile position.
Definition tile_map.h:324
static uint TileHeight(Tile tile)
Returns the height of a tile.
Definition tile_map.h:29
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
void SetAnimationFrame(Tile t, uint8_t frame)
Set a new animation frame.
Definition tile_map.h:262
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 TileType GetTileType(Tile tile)
Get the tiletype of a given tile.
Definition tile_map.h:96
static constexpr uint TILE_UNIT_MASK
For masking in/out the inner-tile world coordinate units.
Definition tile_type.h:16
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
@ Normal
Normal tropiczone.
Definition tile_type.h:82
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:100
static constexpr uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
static constexpr uint MIN_SNOWLINE_HEIGHT
Minimum snowline height.
Definition tile_type.h:32
static constexpr uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in ZOOM_BASE.
Definition tile_type.h:18
@ TunnelBridge
Tunnel entry/exit and bridge heads.
Definition tile_type.h:58
@ Water
Water tile.
Definition tile_type.h:55
@ Station
A tile of a station or airport.
Definition tile_type.h:54
@ Object
Contains objects such as transmitters and owned land.
Definition tile_type.h:59
@ Industry
Part of an industry.
Definition tile_type.h:57
@ Railway
A tile with railway.
Definition tile_type.h:50
@ Void
Invisible tiles at the SW and SE border.
Definition tile_type.h:56
@ Trees
Tile with one or more trees.
Definition tile_type.h:53
@ House
A house by a town.
Definition tile_type.h:52
@ Road
A tile with road and/or tram tracks.
Definition tile_type.h:51
@ Clear
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition tile_type.h:49
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the game-economy-timer.
Definition of the tick-based game-timer.
Base of the town class.
static const uint TOWN_GROWTH_WINTER
The town only needs this cargo in the winter (any amount).
Definition town.h:32
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:33
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:420
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold=UINT_MAX)
Return the town closest to the given tile within threshold.
@ CustomGrowth
Growth rate is controlled by GS.
Definition town.h:45
static const uint16_t TOWN_GROWTH_RATE_NONE
Special value for Town::growth_rate to disable town growth.
Definition town.h:34
void MakeDefaultName(T *obj)
Set the default name for a depot/waypoint.
Definition town.h:334
void UpdateAllTownVirtCoords()
Update the virtual coords needed to draw the town sign for all towns.
Definition town_cmd.cpp:412
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 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:44
@ Original
Original algorithm (quadratic cargo by population).
Definition town_type.h:112
TownLayout
Town Layouts.
Definition town_type.h:83
@ Random
Random town layout.
Definition town_type.h:89
@ BetterRoads
Extended original algorithm (min. 2 distance between roads).
Definition town_type.h:85
Trackdir DiagDirToDiagTrackdir(DiagDirection diagdir)
Maps a (4-way) direction to the diagonal trackdir that runs in that direction.
Definition track_func.h:432
Track AxisToTrack(Axis a)
Convert an Axis to the corresponding Track Axis::X -> Track::X Axis::Y -> Track::Y Uses the fact that...
Definition track_func.h:62
Track DiagDirToDiagTrack(DiagDirection diagdir)
Maps a DiagDirection to the associated diagonal Track.
Definition track_func.h:419
TrackBits TrackdirBitsToTrackBits(TrackdirBits bits)
Discards all directional information from a TrackdirBits value.
Definition track_func.h:281
EnumBitSet< Track, uint8_t > TrackBits
Bitset of Track elements.
Definition track_type.h:43
@ X
Track along the x-axis (north-east to south-west).
Definition track_type.h:21
@ Upper
Track in the upper corner of the tile (north).
Definition track_type.h:23
@ Invalid
Flag for an invalid track.
Definition track_type.h:32
@ Y
Track along the y-axis (north-west to south-east).
Definition track_type.h:22
@ Depot
Special flag indicating a vehicle is inside a depot.
Definition track_type.h:30
@ Lower
Track in the lower corner of the tile (south).
Definition track_type.h:24
@ Wormhole
Special flag indicating vehicle is inside a bridge or tunnel.
Definition track_type.h:29
Base for the train class.
void CheckTrainsLengths()
Checks if lengths of all rail vehicles are valid.
Definition train_cmd.cpp:81
VehicleRailFlag
Rail vehicle flags.
Definition train.h:25
@ TFP_NONE
Normal operation.
Definition train.h:40
@ TFP_STUCK
Proceed till next signal, but ignore being stuck till then. This includes force leaving depots.
Definition train.h:41
TransportType
Available types of transport.
@ Rail
Transport by train.
@ Road
Transport by road vehicle.
Map accessors for tree tiles.
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
@ SnowOrDesert
Snow or desert, depending on landscape.
Definition tree_map.h:55
@ Shore
Shore.
Definition tree_map.h:56
bool IsTunnelTile(Tile t)
Is this a tunnel (entrance)?
Definition tunnel_map.h:34
const DiagDirectionIndexArray< uint8_t > _tunnel_visibility_frame
Frame when a vehicle should be hidden in a tunnel with a certain direction.
Functions that have tunnels and bridges in common.
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.
EnumBitSet< VehState, uint8_t > VehStates
Bitset of VehState elements.
Functions related to vehicles.
@ Ship
Ship vehicle type.
@ Invalid
Non-existing type of vehicle.
@ Road
Road vehicle type.
@ Train
Train vehicle type.
@ Original
Original acceleration model.
EnumBitSet< GroundVehicleFlag, uint16_t > GroundVehicleFlags
Bitset of GroundVehicleFlag elements.
@ GoingUp
Vehicle is currently going uphill. (Cached track information for acceleration).
@ GoingDown
Vehicle is currently going downhill. (Cached track information for acceleration).
Functions related to (drawing on) viewports.
Declarations for accessing the k-d tree of viewports.
Map accessors for void tiles.
void MakeVoid(Tile t)
Make a nice void tile ;).
Definition void_map.h:19
Functions related to water management.
void MakeShore(Tile t)
Helper function to make a coast tile.
Definition water_map.h:385
void SetWaterClass(Tile t, WaterClass wc)
Set the water class at a tile.
Definition water_map.h:126
bool IsShipDepot(Tile t)
Is it a water tile with a ship depot on it?
Definition water_map.h:224
WaterClass
classes of water (for WaterTileType::Clear water tile type).
Definition water_map.h:39
@ River
River.
Definition water_map.h:42
@ Invalid
Used for industry tiles on land (also for oilrig if newgrf says so).
Definition water_map.h:43
@ Canal
Canal.
Definition water_map.h:41
@ Sea
Sea.
Definition water_map.h:40
bool IsShipDepotTile(Tile t)
Is it a ship depot tile?
Definition water_map.h:234
bool IsCoast(Tile t)
Is it a coast tile?
Definition water_map.h:203
WaterTileType GetWaterTileType(Tile t)
Get the water tile type of a tile.
Definition water_map.h:80
void SetNonFloodingWaterTile(Tile t, bool b)
Set the non-flooding water tile state of a tile.
Definition water_map.h:532
void SetWaterTileType(Tile t, WaterTileType type)
Set the water tile type of a tile.
Definition water_map.h:91
WaterClass GetWaterClass(Tile t)
Get the water class at a tile.
Definition water_map.h:114
void MakeCanal(Tile t, Owner o, uint8_t random_bits)
Make a canal tile.
Definition water_map.h:449
TileIndex GetOtherShipDepotTile(Tile t)
Get the other tile of the ship depot.
Definition water_map.h:280
@ Coast
Coast.
Definition water_map.h:33
@ Depot
Water Depot.
Definition water_map.h:35
@ Lock
Water lock.
Definition water_map.h:34
@ 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:364
@ 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:149
bool IsLock(Tile t)
Is there a lock on a given water tile?
Definition water_map.h:305
void MakeSea(Tile t)
Make a sea tile.
Definition water_map.h:428
LockPart GetLockPart(Tile t)
Get the part of a lock.
Definition water_map.h:328
Base of waypoints.
void ResetWindowSystem()
Reset the windowing system, by means of shutting it down followed by re-initialization.
Definition window.cpp:1903
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:3318
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:3336
Window functions not directly related to making/drawing windows.
Entry point for OpenTTD to YAPF's cache.
void YapfNotifyTrackLayoutChange(TileIndex tile, Track track)
Use this function to notify YAPF that track layout (or signal configuration) has change.