OpenTTD Source 20260820-master-g39da062c0c
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);
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 but can be disabled since version 38. */
1338 RailType min_rail = static_cast<RailType>(1); // Monorail was 1 before elrails were introduced.
1339
1340 if (!_settings_game.vehicle.disable_elrails) {
1341 for (Train *v : Train::Iterate()) {
1342 RailTypes rts = RailVehInfo(v->engine_type)->railtypes;
1343
1344 if (rts.Test(RAILTYPE_ELECTRIC)) {
1345 min_rail = RAILTYPE_RAIL;
1346 break;
1347 }
1348 }
1349 }
1350
1351 /* We update the entire map to keep monorail and maglev in place. */
1352 /* If min_rail == RAILTYPE_RAIL, this will also upgrade normal rail to electric rail. */
1353 for (const auto t : Map::Iterate()) {
1354 switch (GetTileType(t)) {
1355 case TileType::Railway:
1356 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1357 break;
1358
1359 case TileType::Road:
1360 if (IsLevelCrossing(t)) {
1361 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1362 }
1363 break;
1364
1365 case TileType::Station:
1366 if (HasStationRail(t)) {
1367 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1368 }
1369 break;
1370
1373 SetRailType(t, UpdateRailType(GetRailType(t), min_rail));
1374 }
1375 break;
1376
1377 default:
1378 break;
1379 }
1380 }
1382 /* Since we cannot know the preference of a user, let elrails enabled; it
1383 * can be disabled manually. */
1384 _settings_game.vehicle.disable_elrails = false;
1385 }
1386 /* Do the same as when elrails were enabled/disabled manually just now. */
1387 UpdateDisableElrailSettingState(_settings_game.vehicle.disable_elrails, false);
1389
1390 /* In version 16.1 of the savegame a company can decide if trains, which get
1391 * replaced, shall keep their old length. In all prior versions, just default
1392 * to false */
1394 for (Company *c : Company::Iterate()) c->settings.renew_keep_length = false;
1395 }
1396
1398 /* Waypoints became subclasses of stations ... */
1400 /* ... and buoys were moved to waypoints. */
1402 }
1403
1404 /* From version 15, we moved a semaphore bit from bit 2 to bit 3 in m4, making
1405 * room for PBS. Now in version 21 move it back :P. */
1407 for (auto t : Map::Iterate()) {
1408 switch (GetTileType(t)) {
1409 case TileType::Railway:
1410 if (HasSignals(t)) {
1411 /* Original signal type/variant was stored in m4 but since saveload
1412 * version 48 they are in m2. The bits has been already moved to m2
1413 * (see the code somewhere above) so don't use m4, use m2 instead. */
1414
1415 /* convert old PBS signals to combo-signals */
1416 if (HasBit(t.m2(), 2)) SB(t.m2(), 0, 2, to_underlying(SignalType::Combo));
1417
1418 /* move the signal variant back */
1420 ClrBit(t.m2(), 3);
1421 }
1422
1423 /* Clear PBS reservation on track */
1424 if (!IsRailDepotTile(t)) {
1425 SB(t.m4(), 4, 4, 0);
1426 } else {
1427 ClrBit(t.m3(), 6);
1428 }
1429 break;
1430
1431 case TileType::Station: // Clear PBS reservation on station
1432 ClrBit(t.m3(), 6);
1433 break;
1434
1435 default: break;
1436 }
1437 }
1438 }
1439
1441 /* Remove obsolete VS_WAIT_FOR_SLOT state from road vehicles. */
1442 static constexpr VehStates OLD_VS_WAIT_FOR_SLOT{0x40};
1443 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1444 rv->vehstatus.Reset(OLD_VS_WAIT_FOR_SLOT);
1445 }
1446 }
1447
1449 for (Station *st : Station::Iterate()) {
1450 st->last_vehicle_type = VehicleType::Invalid;
1451 }
1452 }
1453
1455
1458 }
1459
1460 for (Company *c : Company::Iterate()) {
1461 c->avail_railtypes = GetCompanyRailTypes(c->index);
1462 c->avail_roadtypes = GetCompanyRoadTypes(c->index);
1463 }
1464
1465 AfterLoadStations();
1466
1467 /* Time starts at 0 instead of 1920.
1468 * Account for this in older games by adding an offset */
1474
1478 for (Company *c : Company::Iterate()) c->inaugurated_year += EconomyTime::ORIGINAL_BASE_YEAR;
1479 for (Industry *i : Industry::Iterate()) i->last_prod_year += EconomyTime::ORIGINAL_BASE_YEAR;
1480
1481 for (Vehicle *v : Vehicle::Iterate()) {
1482 v->date_of_last_service += EconomyTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
1483 v->build_year += CalendarTime::ORIGINAL_BASE_YEAR;
1484 }
1485 }
1486
1487 /* From 32 on we save the industry who made the farmland.
1488 * To give this prettiness to old savegames, we remove all farmfields and
1489 * plant new ones. */
1491 for (const auto t : Map::Iterate()) {
1493 /* remove fields */
1495 }
1496 }
1497
1498 for (Industry *i : Industry::Iterate()) {
1499 uint j;
1500
1502 for (j = 0; j != 50; j++) PlantRandomFarmField(i);
1503 }
1504 }
1505 }
1506
1507 /* Setting no refit flags to all orders in savegames from before refit in orders were added */
1509 for (OrderList *orderlist : OrderList::Iterate()) {
1510 for (Order &order : orderlist->GetOrders()) {
1511 order.SetRefit(CARGO_NO_REFIT);
1512 }
1513 }
1514
1515 for (Vehicle *v : Vehicle::Iterate()) {
1516 v->current_order.SetRefit(CARGO_NO_REFIT);
1517 }
1518 }
1519
1520 /* From version 53, the map array was changed for house tiles to allow
1521 * space for newhouses grf features. A new byte, m7, was also added. */
1523 for (auto t : Map::Iterate()) {
1524 if (IsTileType(t, TileType::House)) {
1525 if (GB(t.m3(), 6, 2) != TOWN_HOUSE_COMPLETED) {
1526 /* Move the construction stage from m3[7..6] to m5[5..4].
1527 * The construction counter does not have to move. */
1528 SB(t.m5(), 3, 2, GB(t.m3(), 6, 2));
1529 SB(t.m3(), 6, 2, 0);
1530
1531 /* The "house is completed" bit is now in m6[2]. */
1532 SetHouseCompleted(t, false);
1533 } else {
1534 /* The "lift has destination" bit has been moved from
1535 * m5[7] to m7[0]. */
1536 AssignBit(t.m7(), 0, HasBit(t.m5(), 7));
1537 ClrBit(t.m5(), 7);
1538
1539 /* The "lift is moving" bit has been removed, as it does
1540 * the same job as the "lift has destination" bit. */
1541 ClrBit(t.m1(), 7);
1542
1543 /* The position of the lift goes from m1[7..0] to m6[7..2],
1544 * making m1 totally free, now. The lift position does not
1545 * have to be a full byte since the maximum value is 36. */
1546 SetLiftPosition(t, GB(t.m1(), 0, 6 ));
1547
1548 t.m1() = 0;
1549 t.m3() = 0;
1550 SetHouseCompleted(t, true);
1551 }
1552 }
1553 }
1554 }
1555
1557 for (auto t : Map::Iterate()) {
1558 if (IsTileType(t, TileType::House)) {
1559 /* House type is moved from m4 + m3[6] to m8. */
1560 SetHouseType(t, t.m4() | (GB(t.m3(), 6, 1) << 8));
1561 t.m4() = 0;
1562 ClrBit(t.m3(), 6);
1563 }
1564 }
1565 }
1566
1567 /* Check and update house and town values */
1569
1571 for (auto t : Map::Iterate()) {
1573 switch (GetIndustryGfx(t)) {
1575 t.m3() = GB(t.m1(), 2, 5);
1576 break;
1577
1581 t.m3() = GB(t.m1(), 0, 2);
1582 break;
1583
1587 t.m3() = t.m1();
1588 break;
1589
1590 default: // No animation states to change
1591 break;
1592 }
1593 }
1594 }
1595 }
1596
1598 /* Originally just the fact that some cargo had been paid for was
1599 * stored to stop people cheating and cashing in several times. This
1600 * wasn't enough though as it was cleared when the vehicle started
1601 * loading again, even if it didn't actually load anything, so now the
1602 * amount that has been paid is stored. */
1603 for (Vehicle *v : Vehicle::Iterate()) {
1604 v->vehicle_flags.Reset(VehicleFlag{2});
1605 }
1606 }
1607
1608 /* Buoys do now store the owner of the previous water tile, which can never
1609 * be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
1611 for (Waypoint *wp : Waypoint::Iterate()) {
1612 if (wp->facilities.Test(StationFacility::Dock) && IsTileOwner(wp->xy, OWNER_NONE) && TileHeight(wp->xy) == 0) SetTileOwner(wp->xy, OWNER_WATER);
1613 }
1614 }
1615
1617 /* Aircraft units changed from 8 mph to 1 km-ish/h */
1618 for (Aircraft *v : Aircraft::Iterate()) {
1619 if (v->subtype <= AIR_AIRCRAFT) {
1620 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
1621 v->cur_speed *= 128;
1622 v->cur_speed /= 10;
1623 v->acceleration = avi->acceleration;
1624 }
1625 }
1626 }
1627
1629 /* Perform conversion of very old face bits. */
1630 for (Company *c : Company::Iterate()) {
1631 c->face = ConvertFromOldCompanyManagerFace(c->face.bits);
1632 }
1634 /* Convert old gender and ethnicity bits to face style. */
1635 for (Company *c : Company::Iterate()) {
1636 SetCompanyManagerFaceStyle(c->face, GB(c->face.bits, 0, 2));
1637 }
1638 } else {
1639 /* Look up each company face style by its label. */
1640 for (Company *c : Company::Iterate()) {
1641 auto style = FindCompanyManagerFaceLabel(c->face.style_label);
1642 if (style.has_value()) {
1643 SetCompanyManagerFaceStyle(c->face, *style);
1644 } else {
1645 /* Style no longer exists, pick an entirely new face. */
1647 }
1648 }
1649 }
1650
1652 for (auto t : Map::Iterate()) {
1653 if (IsTileType(t, TileType::Object) && t.m5() == OBJECT_STATUE) {
1654 t.m2() = CalcClosestTownFromTile(t)->index.base();
1655 }
1656 }
1657 }
1658
1659 /* A setting containing the proportion of towns that grow twice as
1660 * fast was added in version 54. From version 56 this is now saved in the
1661 * town as cities can be built specifically in the scenario editor. */
1663 for (Town *t : Town::Iterate()) {
1664 if (_settings_game.economy.larger_towns != 0 && (t->index % _settings_game.economy.larger_towns) == 0) {
1665 t->larger_town = true;
1666 }
1667 }
1668 }
1669
1671 /* Added a FIFO queue of vehicles loading at stations */
1672 for (Vehicle *v : Vehicle::Iterate()) {
1673 if ((v->type != VehicleType::Train || Train::From(v)->IsFrontEngine()) && // for all locs
1674 !v->vehstatus.Any({VehState::Stopped, VehState::Crashed}) && // not stopped or crashed
1675 v->current_order.IsType(OT_LOADING)) { // loading
1676 Station::Get(v->last_station_visited)->loading_vehicles.push_back(v);
1677
1678 /* The loading finished flag is *only* set when actually completely
1679 * finished. Because the vehicle is loading, it is not finished. */
1680 v->vehicle_flags.Reset(VehicleFlag::LoadingFinished);
1681 }
1682 }
1684 /* For some reason non-loading vehicles could be in the station's loading vehicle list */
1685
1686 for (Station *st : Station::Iterate()) {
1687 for (auto iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end(); /* nothing */) {
1688 Vehicle *v = *iter;
1689 if (!v->current_order.IsType(OT_LOADING)) {
1690 iter = st->loading_vehicles.erase(iter);
1691 } else {
1692 ++iter;
1693 }
1694 }
1695 }
1696 }
1697
1699 /* Setting difficulty industry_density other than zero get bumped to +1
1700 * since a new option (very low at position 1) has been added */
1701 if (_settings_game.difficulty.industry_density > IndustryDensity::FundedOnly) {
1702 _settings_game.difficulty.industry_density = static_cast<IndustryDensity>(to_underlying(_settings_game.difficulty.industry_density) + 1);
1703 }
1704
1705 /* Same goes for number of towns, although no test is needed, just an increment */
1706 _settings_game.difficulty.number_towns++;
1707 }
1708
1710 /* Since now we allow different signal types and variants on a single tile.
1711 * Move signal states to m4 to make room and clone the signal type/variant. */
1712 for (auto t : Map::Iterate()) {
1713 if (IsTileType(t, TileType::Railway) && HasSignals(t)) {
1714 /* move signal states */
1715 SetSignalStates(t, GB(t.m2(), 4, 4));
1716 SB(t.m2(), 4, 4, 0);
1717 /* clone signal type and variant */
1718 SB(t.m2(), 4, 3, GB(t.m2(), 0, 3));
1719 }
1720 }
1721 }
1722
1724 /* In some old savegames a bit was cleared when it should not be cleared */
1725 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
1726 if (rv->state == 250 || rv->state == 251) {
1727 SetBit(rv->state, 2);
1728 }
1729 }
1730 }
1731
1733 /* Added variables to support newindustries */
1734 for (Industry *i : Industry::Iterate()) i->founder = OWNER_NONE;
1735 }
1736
1737 /* From version 82, old style canals (above sealevel (0), WATER owner) are no longer supported.
1738 Replace the owner for those by OWNER_NONE. */
1740 for (const auto t : Map::Iterate()) {
1741 if (IsTileType(t, TileType::Water) &&
1743 GetTileOwner(t) == OWNER_WATER &&
1744 TileHeight(t) != 0) {
1746 }
1747 }
1748 }
1749
1750 /*
1751 * Add the 'previous' owner to the ship depots so we can reset it with
1752 * the correct values when it gets destroyed. This prevents that
1753 * someone can remove canals owned by somebody else and it prevents
1754 * making floods using the removal of ship depots.
1755 */
1757 for (auto t : Map::Iterate()) {
1758 if (IsShipDepotTile(t)) {
1759 t.m4() = (TileHeight(t) == 0 ? OWNER_WATER : OWNER_NONE).base();
1760 }
1761 }
1762 }
1763
1765 for (Station *st : Station::Iterate()) {
1766 for (GoodsEntry &ge : st->goods) {
1767 ge.last_speed = 0;
1769 }
1770 }
1771 }
1772
1773 /* At version 78, industry cargo types can be changed, and are stored with the industry. For older save versions
1774 * copy the IndustrySpec's cargo types over to the Industry. */
1776 for (Industry *i : Industry::Iterate()) {
1777 const IndustrySpec *indsp = GetIndustrySpec(i->type);
1778 for (uint j = 0; j < std::size(i->produced); j++) {
1779 i->produced[j].cargo = indsp->produced_cargo[j];
1780 }
1781 for (uint j = 0; j < std::size(i->accepted); j++) {
1782 i->accepted[j].cargo = indsp->accepts_cargo[j];
1783 }
1784 }
1785 }
1786
1787 /* Industry cargo slots were fixed size before (and including) SaveLoadVersion::VehicleEconomyAge (either 2/3 or 16/16),
1788 * after this they are dynamic. Trim excess slots. */
1790 for (Industry *i : Industry::Iterate()) {
1792 }
1793 }
1794
1795 /* Before version 81, the density of grass was always stored as zero, and
1796 * grassy trees were always drawn fully grassy. Furthermore, trees on rough
1797 * land used to have zero density, now they have full density. Therefore,
1798 * make all grassy/rough land trees have a density of 3. */
1800 for (auto t : Map::Iterate()) {
1801 if (GetTileType(t) == TileType::Trees) {
1802 TreeGround ground_type = (TreeGround)GB(t.m2(), 4, 2);
1803 if (ground_type != TreeGround::SnowOrDesert) SB(t.m2(), 6, 2, 3);
1804 }
1805 }
1806 }
1807
1808
1810 /* Rework of orders. */
1811 for (OrderList *orderlist : OrderList::Iterate()) {
1812 for (Order &o : orderlist->GetOrders()) {
1813 o.ConvertFromOldSavegame();
1814 }
1815 }
1816
1817 for (Vehicle *v : Vehicle::Iterate()) {
1818 if (v->orders != nullptr && v->GetFirstOrder() != nullptr && v->GetFirstOrder()->IsType(OT_NOTHING)) {
1819 v->orders->FreeChain();
1820 v->orders = nullptr;
1821 }
1822
1823 v->current_order.ConvertFromOldSavegame();
1824 if (v->type == VehicleType::Road && v->IsPrimaryVehicle() && v->FirstShared() == v) {
1825 for (Order &order : v->Orders()) order.SetNonStopType(OrderNonStopFlag::NonStop);
1826 }
1827 }
1829 /* Unload and transfer are now mutual exclusive. */
1830 for (OrderList *orderlist : OrderList::Iterate()) {
1831 for (Order &order : orderlist->GetOrders()) {
1832 if (order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load.
1833 order.SetUnloadType(OrderUnloadType::Transfer);
1834 order.SetLoadType(OrderLoadType::NoLoad);
1835 }
1836 }
1837 }
1838
1839 for (Vehicle *v : Vehicle::Iterate()) {
1840 if (v->current_order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load.
1841 v->current_order.SetUnloadType(OrderUnloadType::Transfer);
1842 v->current_order.SetLoadType(OrderLoadType::NoLoad);
1843 }
1844 }
1846 /* OrderDepotActionFlags were moved, instead of starting at bit 4 they now start at bit 3. */
1847 for (OrderList *orderlist : OrderList::Iterate()) {
1848 for (Order &order : orderlist->GetOrders()) {
1849 if (!order.IsType(OT_GOTO_DEPOT)) continue;
1850 order.SetDepotActionType(static_cast<OrderDepotActionFlags>(order.GetDepotActionType().base() >> 1));
1851 }
1852 }
1853
1854 for (Vehicle *v : Vehicle::Iterate()) {
1855 if (!v->current_order.IsType(OT_GOTO_DEPOT)) continue;
1856 v->current_order.SetDepotActionType(static_cast<OrderDepotActionFlags>(v->current_order.GetDepotActionType().base() >> 1));
1857 }
1858 }
1859
1860 /* The water class was moved/unified. */
1862 for (auto t : Map::Iterate()) {
1863 switch (GetTileType(t)) {
1864 case TileType::Station:
1865 switch (GetStationType(t)) {
1867 case StationType::Dock:
1868 case StationType::Buoy:
1869 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1870 SB(t.m3(), 0, 2, 0);
1871 break;
1872
1873 default:
1875 break;
1876 }
1877 break;
1878
1879 case TileType::Water:
1880 SetWaterClass(t, (WaterClass)GB(t.m3(), 0, 2));
1881 SB(t.m3(), 0, 2, 0);
1882 break;
1883
1884 case TileType::Object:
1886 break;
1887
1888 default:
1889 /* No water class. */
1890 break;
1891 }
1892 }
1893 }
1894
1896 for (auto t : Map::Iterate()) {
1897 /* Move river flag and update canals to use water class */
1898 if (IsTileType(t, TileType::Water)) {
1899 if (GetWaterClass(t) != WaterClass::River) {
1900 if (IsWater(t)) {
1901 Owner o = GetTileOwner(t);
1902 if (o == OWNER_WATER) {
1903 MakeSea(t);
1904 } else {
1905 MakeCanal(t, o, Random());
1906 }
1907 } else if (IsShipDepot(t)) {
1908 Owner o = (Owner)t.m4(); // Original water owner
1910 }
1911 }
1912 }
1913 }
1914
1915 /* Update locks, depots, docks and buoys to have a water class based
1916 * on its neighbouring tiles. Done after river and canal updates to
1917 * ensure neighbours are correct. */
1918 for (const auto t : Map::Iterate()) {
1919 if (!IsTileFlat(t)) continue;
1920
1923 }
1924 }
1925
1927 for (const auto t : Map::Iterate()) {
1928 /* skip oil rigs at borders! */
1929 if ((IsTileType(t, TileType::Water) || IsBuoyTile(t)) &&
1930 (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1)) {
1931 /* Some version 86 savegames have wrong water class at map borders (under buoy, or after removing buoy).
1932 * This conversion has to be done before buoys with invalid owner are removed. */
1934 }
1935
1937 Owner o = GetTileOwner(t);
1938 if (o < MAX_COMPANIES && !Company::IsValidID(o)) {
1939 AutoRestoreBackup cur_company(_current_company, o);
1941 }
1942 if (IsBuoyTile(t)) {
1943 /* reset buoy owner to OWNER_NONE in the station struct
1944 * (even if it is owned by active company) */
1946 }
1947 } else if (IsTileType(t, TileType::Road)) {
1948 /* works for all RoadTileType */
1949 for (RoadTramType rtt : ROADTRAMTYPES_ALL) {
1950 /* update even non-existing road types to update tile owner too */
1951 Owner o = GetRoadOwner(t, rtt);
1952 if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
1953 }
1954 if (IsLevelCrossing(t)) {
1956 }
1957 } else if (IsPlainRailTile(t)) {
1959 }
1960 }
1961 }
1962
1964 /* Profits are now with 8 bit fract */
1965 for (Vehicle *v : Vehicle::Iterate()) {
1966 v->profit_this_year <<= 8;
1967 v->profit_last_year <<= 8;
1968 v->running_ticks = 0;
1969 }
1970 }
1971
1973 /* Increase HouseAnimationFrame from 5 to 7 bits */
1974 for (auto t : Map::Iterate()) {
1976 SB(t.m6(), 2, 6, GB(t.m6(), 3, 5));
1977 SB(t.m3(), 5, 1, 0);
1978 }
1979 }
1980 }
1981
1983 GroupStatistics::UpdateAfterLoad(); // Ensure statistics pool is initialised before trying to delete vehicles
1984 /* Remove all trams from savegames without tram support.
1985 * There would be trams without tram track under causing crashes sooner or later. */
1986 for (RoadVehicle *v : RoadVehicle::Iterate()) {
1987 if (v->First() == v && EngInfo(v->engine_type)->misc_flags.Test(EngineMiscFlag::RoadIsTram)) {
1988 ShowErrorMessage(GetEncodedString(STR_WARNING_LOADGAME_REMOVED_TRAMS), {}, WarningLevel::Critical);
1989 delete v;
1990 }
1991 }
1992 }
1993
1995 for (auto t : Map::Iterate()) {
1996 /* Set newly introduced WaterClass of industry tiles */
1997 if (IsTileType(t, TileType::Station) && IsOilRig(t)) {
1999 }
2003 } else {
2005 }
2006 }
2007
2008 /* Replace "house construction year" with "house age" */
2011 }
2012 }
2013 }
2014
2015 /* Move the signal variant back up one bit for PBS. We don't convert the old PBS
2016 * format here, as an old layout wouldn't work properly anyway. To be safe, we
2017 * clear any possible PBS reservations as well. */
2019 for (auto t : Map::Iterate()) {
2020 switch (GetTileType(t)) {
2021 case TileType::Railway:
2022 if (HasSignals(t)) {
2023 /* move the signal variant */
2026 ClrBit(t.m2(), 2);
2027 ClrBit(t.m2(), 6);
2028 }
2029
2030 /* Clear PBS reservation on track */
2031 if (IsRailDepot(t)) {
2032 SetDepotReservation(t, false);
2033 } else {
2034 SetTrackReservation(t, {});
2035 }
2036 break;
2037
2038 case TileType::Road: // Clear PBS reservation on crossing
2039 if (IsLevelCrossing(t)) SetCrossingReservation(t, false);
2040 break;
2041
2042 case TileType::Station: // Clear PBS reservation on station
2043 if (HasStationRail(t)) SetRailStationReservation(t, false);
2044 break;
2045
2046 case TileType::TunnelBridge: // Clear PBS reservation on tunnels/bridges
2048 break;
2049
2050 default: break;
2051 }
2052 }
2053 }
2054
2055 /* Reserve all tracks trains are currently on. */
2057 for (const Train *t : Train::Iterate()) {
2058 if (t->First() == t) t->ReserveTrackUnderConsist();
2059 }
2060 }
2061
2063 /* Non-town-owned roads now store the closest town */
2065
2066 /* signs with invalid owner left from older savegames */
2067 for (Sign *si : Sign::Iterate()) {
2068 if (si->owner != OWNER_NONE && !Company::IsValidID(si->owner)) si->owner = OWNER_NONE;
2069 }
2070
2071 /* Station can get named based on an industry type, but the current ones
2072 * are not, so mark them as if they are not named by an industry. */
2073 for (Station *st : Station::Iterate()) {
2074 st->indtype = IT_INVALID;
2075 }
2076 }
2077
2079 for (Aircraft *a : Aircraft::Iterate()) {
2080 /* Set engine_type of shadow and rotor */
2081 if (!a->IsNormalAircraft()) {
2082 a->engine_type = a->First()->engine_type;
2083 }
2084 }
2085
2086 /* More companies ... */
2087 for (Company *c : Company::Iterate()) {
2088 if (c->bankrupt_asked.base() == 0xFF) c->bankrupt_asked.Set();
2089 }
2090
2091 for (Engine *e : Engine::Iterate()) {
2092 if (e->company_avail.base() == 0xFF) e->company_avail.Set();
2093 }
2094
2095 for (Town *t : Town::Iterate()) {
2096 if (t->have_ratings.base() == 0xFF) t->have_ratings.Set();
2097 t->ratings.fill(RATING_INITIAL);
2098 }
2099 }
2100
2102 for (auto t : Map::Iterate()) {
2103 /* Check for HQ bit being set, instead of using map accessor,
2104 * since we've already changed it code-wise */
2105 if (IsTileType(t, TileType::Object) && HasBit(t.m5(), 7)) {
2106 /* Move size and part identification of HQ out of the m5 attribute,
2107 * on new locations */
2108 t.m3() = GB(t.m5(), 0, 5);
2109 t.m5() = OBJECT_HQ;
2110 }
2111 }
2112 }
2114 for (auto t : Map::Iterate()) {
2115 if (!IsTileType(t, TileType::Object)) continue;
2116
2117 /* Reordering/generalisation of the object bits. */
2118 ObjectType type = t.m5();
2119 SB(t.m6(), 2, 4, type == OBJECT_HQ ? GB(t.m3(), 2, 3) : 0);
2120 t.m3() = type == OBJECT_HQ ? GB(t.m3(), 1, 1) | GB(t.m3(), 0, 1) << 4 : 0;
2121
2122 /* Make sure those bits are clear as well! */
2123 t.m4() = 0;
2124 t.m7() = 0;
2125 }
2126 }
2127
2129 /* Make real objects for object tiles. */
2130 for (auto t : Map::Iterate()) {
2131 if (!IsTileType(t, TileType::Object)) continue;
2132
2133 if (Town::GetNumItems() == 0) {
2134 /* No towns, so remove all objects! */
2135 DoClearSquare(t);
2136 } else {
2137 uint offset = t.m3();
2138
2139 /* Also move the animation state. */
2140 t.m3() = GB(t.m6(), 2, 4);
2141 SB(t.m6(), 2, 4, 0);
2142
2143 if (offset == 0) {
2144 /* No offset, so make the object. */
2145 ObjectType type = t.m5();
2146 int size = type == OBJECT_HQ ? 2 : 1;
2147
2148 if (!Object::CanAllocateItem()) {
2149 /* Nice... you managed to place 64k lighthouses and
2150 * antennae on the map... boohoo. */
2151 SlError(STR_ERROR_TOO_MANY_OBJECTS);
2152 }
2153
2154 Object *o = Object::Create();
2155 o->location.tile = (TileIndex)t;
2156 o->location.w = size;
2157 o->location.h = size;
2159 o->town = type == OBJECT_STATUE ? Town::Get(t.m2()) : CalcClosestTownFromTile(t, UINT_MAX);
2160 t.m2() = o->index.base();
2161 } else {
2162 /* We're at an offset, so get the ID from our "root". */
2163 Tile northern_tile = t - TileXY(GB(offset, 0, 4), GB(offset, 4, 4));
2164 assert(IsTileType(northern_tile, TileType::Object));
2165 t.m2() = northern_tile.m2();
2166 }
2167 }
2168 }
2169 }
2170
2172 /* allow_town_roads is added, set it if town_layout wasn't TL_NO_ROADS */
2173 uint8_t old_town_layout = to_underlying(_settings_game.economy.town_layout);
2174 if (old_town_layout == 0) { // was TL_NO_ROADS
2175 _settings_game.economy.allow_town_roads = false;
2176 _settings_game.economy.town_layout = TownLayout::BetterRoads;
2177 } else {
2178 _settings_game.economy.allow_town_roads = true;
2179 _settings_game.economy.town_layout = static_cast<TownLayout>(old_town_layout - 1);
2180 }
2181
2182 /* Initialize layout of all towns. Older versions were using different
2183 * generator for random town layout, use it if needed. */
2184 for (Town *t : Town::Iterate()) {
2185 if (_settings_game.economy.town_layout != TownLayout::Random) {
2186 t->layout = _settings_game.economy.town_layout;
2187 continue;
2188 }
2189
2190 /* Use old layout randomizer code */
2191 uint8_t layout = TileHash(TileX(t->xy), TileY(t->xy)) % 6;
2192 switch (layout) {
2193 default: break;
2194 case 5: layout = 1; break;
2195 case 0: layout = 2; break;
2196 }
2197 t->layout = static_cast<TownLayout>(layout - 1);
2198 }
2199 }
2200
2202 /* There could be (deleted) stations with invalid owner, set owner to OWNER NONE.
2203 * The conversion affects oil rigs and buoys too, but it doesn't matter as
2204 * they have st->owner == OWNER_NONE already. */
2205 for (Station *st : Station::Iterate()) {
2206 if (!Company::IsValidID(st->owner)) st->owner = OWNER_NONE;
2207 }
2208 }
2209
2210 /* Trains could now stop in a specific location. */
2212 for (OrderList *orderlist : OrderList::Iterate()) {
2213 for (Order &o : orderlist->GetOrders()) {
2214 if (o.IsType(OT_GOTO_STATION)) o.SetStopLocation(OrderStopLocation::FarEnd);
2215 }
2216 }
2217 }
2218
2221 for (Company *c : Company::Iterate()) {
2222 c->settings.vehicle = _old_vds;
2223 }
2224 }
2225
2227 /* Tile for no orders is now INVALID_TILE instead of 0. */
2228 for (Vehicle *v : Vehicle::Iterate()) {
2229 if (v->dest_tile == 0) v->SetDestTile(INVALID_TILE);
2230 }
2231 }
2232
2234 /* Delete small ufos heading for non-existing vehicles */
2236 if (v->subtype == 2 /* ST_SMALL_UFO */ && v->state != 0) {
2237 const Vehicle *u = Vehicle::GetIfValid(v->dest_tile.base());
2238 if (u == nullptr || u->type != VehicleType::Road || !RoadVehicle::From(u)->IsFrontEngine()) {
2239 delete v;
2240 }
2241 }
2242 }
2243
2244 /* We didn't store cargo payment yet, so make them for vehicles that are
2245 * currently at a station and loading/unloading. If they don't get any
2246 * payment anymore they just removed in the next load/unload cycle.
2247 * However, some 0.7 versions might have cargo payment. For those we just
2248 * add cargopayment for the vehicles that don't have it.
2249 */
2250 for (Station *st : Station::Iterate()) {
2251 for (Vehicle *v : st->loading_vehicles) {
2252 /* There are always as many CargoPayments as Vehicles. We need to make the
2253 * assert() in Pool::GetNew() happy by calling CanAllocateItem(). */
2256 if (v->cargo_payment == nullptr) v->cargo_payment = CargoPayment::Create(v);
2257 }
2258 }
2259 }
2260
2262 /* Animated tiles would sometimes not be actually animated or
2263 * in case of old savegames duplicate. */
2264
2265 extern std::vector<TileIndex> _animated_tiles;
2266
2267 for (auto tile = _animated_tiles.begin(); tile < _animated_tiles.end(); /* Nothing */) {
2268 /* Remove if tile is not animated */
2269 bool remove = !MayAnimateTile(*tile);
2270
2271 /* and remove if duplicate */
2272 for (auto j = _animated_tiles.begin(); !remove && j < tile; j++) {
2273 remove = *tile == *j;
2274 }
2275
2276 if (remove) {
2277 tile = _animated_tiles.erase(tile);
2278 } else {
2279 tile++;
2280 }
2281 }
2282 }
2283
2285 for (auto t : Map::Iterate()) {
2286 if (!IsTileType(t, TileType::Water)) continue;
2287 SetNonFloodingWaterTile(t, false);
2288 }
2289 }
2290
2292 /* Animated tile state is stored in the map array, allowing
2293 * quicker addition and deletion of animated tiles. */
2294
2295 extern std::vector<TileIndex> _animated_tiles;
2296
2297 for (auto t : Map::Iterate()) {
2298 /* Ensure there is no spurious animated tile state. */
2300 }
2301
2302 /* Set animated flag for all valid animated tiles. */
2303 for (const TileIndex &tile : _animated_tiles) {
2305 }
2306 }
2307
2309 /* The train station tile area was added, but for really old (TTDPatch) it's already valid. */
2310 for (Waypoint *wp : Waypoint::Iterate()) {
2311 if (wp->facilities.Test(StationFacility::Train)) {
2312 wp->train_station.tile = wp->xy;
2313 wp->train_station.w = 1;
2314 wp->train_station.h = 1;
2315 } else {
2316 wp->train_station.tile = INVALID_TILE;
2317 wp->train_station.w = 0;
2318 wp->train_station.h = 0;
2319 }
2320 }
2321 }
2322
2324 /* Convert old subsidies */
2325 for (Subsidy *s : Subsidy::Iterate()) {
2326 if (s->remaining < 12) {
2327 /* Converting nonawarded subsidy */
2328 s->remaining = 12 - s->remaining; // convert "age" to "remaining"
2329 s->awarded = CompanyID::Invalid(); // not awarded to anyone
2330 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2331 switch (cs->town_acceptance_effect) {
2334 /* Town -> Town */
2335 s->src.type = s->dst.type = SourceType::Town;
2336 if (Town::IsValidID(s->src.ToTownID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2337 break;
2340 /* Industry -> Town */
2341 s->src.type = SourceType::Industry;
2342 s->dst.type = SourceType::Town;
2343 if (Industry::IsValidID(s->src.ToIndustryID()) && Town::IsValidID(s->dst.ToTownID())) continue;
2344 break;
2345 default:
2346 /* Industry -> Industry */
2347 s->src.type = s->dst.type = SourceType::Industry;
2348 if (Industry::IsValidID(s->src.ToIndustryID()) && Industry::IsValidID(s->dst.ToIndustryID())) continue;
2349 break;
2350 }
2351 } else {
2352 /* Do our best for awarded subsidies. The original source or destination industry
2353 * can't be determined anymore for awarded subsidies, so invalidate them.
2354 * Town -> Town subsidies are converted using simple heuristic */
2355 s->remaining = 24 - s->remaining; // convert "age of awarded subsidy" to "remaining"
2356 const CargoSpec *cs = CargoSpec::Get(s->cargo_type);
2357 switch (cs->town_acceptance_effect) {
2360 /* Town -> Town */
2361 const Station *ss = Station::GetIfValid(s->src.id);
2362 const Station *sd = Station::GetIfValid(s->dst.id);
2363 if (ss != nullptr && sd != nullptr && ss->owner == sd->owner &&
2365 s->src.type = s->dst.type = SourceType::Town;
2366 s->src.SetIndex(ss->town->index);
2367 s->dst.SetIndex(sd->town->index);
2368 s->awarded = ss->owner;
2369 continue;
2370 }
2371 break;
2372 }
2373 default:
2374 break;
2375 }
2376 }
2377 /* Awarded non-town subsidy or invalid source/destination, invalidate */
2378 delete s;
2379 }
2380 }
2381
2383 /* Recompute inflation based on old unround loan limit
2384 * Note: Max loan is 500000. With an inflation of 4% across 170 years
2385 * that results in a max loan of about 0.7 * 2^31.
2386 * So taking the 16 bit fractional part into account there are plenty of bits left
2387 * for unmodified savegames ...
2388 */
2389 uint64_t aimed_inflation = (_economy.old_max_loan_unround << 16 | _economy.old_max_loan_unround_fract) / _settings_game.difficulty.max_loan;
2390
2391 /* ... well, just clamp it then. */
2392 if (aimed_inflation > MAX_INFLATION) aimed_inflation = MAX_INFLATION;
2393
2394 /* Simulate the inflation, so we also get the payment inflation */
2395 while (_economy.inflation_prices < aimed_inflation) {
2396 if (AddInflation(false)) break;
2397 }
2398 }
2399
2401 for (const Depot *d : Depot::Iterate()) {
2402 Tile tile = d->xy;
2403 /* At some point, invalid depots were saved into the game (possibly those removed in the past?)
2404 * Remove them here, so they don't cause issues further down the line */
2405 if (!IsDepotTile(tile)) {
2406 Debug(sl, 0, "Removing invalid depot {} at {}, {}", d->index, TileX(d->xy), TileY(d->xy));
2407 delete d;
2408 d = nullptr;
2409 continue;
2410 }
2411 tile.m2() = d->index.base();
2412 if (IsTileType(tile, TileType::Water)) Tile(GetOtherShipDepotTile(tile)).m2() = d->index.base();
2413 }
2414 }
2415
2416 /* The behaviour of force_proceed has been changed. Now
2417 * it counts signals instead of some random time out. */
2419 for (Train *t : Train::Iterate()) {
2420 if (t->force_proceed != TFP_NONE) {
2421 t->force_proceed = TFP_STUCK;
2422 }
2423 }
2424 }
2425
2426 /* The bits for the tree ground and tree density have
2427 * been swapped (m2 bits 7..6 and 5..4. */
2429 for (auto t : Map::Iterate()) {
2430 if (IsTileType(t, TileType::Clear)) {
2431 if (GetClearGround(t) == ClearGround{4}) { // CLEAR_SNOW becomes ClearGround::Grass with IsSnowTile() set.
2433 SetBit(t.m3(), 4);
2434 } else {
2435 ClrBit(t.m3(), 4);
2436 }
2437 }
2438 if (IsTileType(t, TileType::Trees)) {
2439 uint density = GB(t.m2(), 6, 2);
2440 uint ground = GB(t.m2(), 4, 2);
2441 t.m2() = ground << 6 | density << 4;
2442 }
2443 }
2444 }
2445
2446 /* Wait counter and load/unload ticks got split. */
2448 for (Aircraft *a : Aircraft::Iterate()) {
2449 a->turn_counter = a->current_order.IsType(OT_LOADING) ? 0 : a->load_unload_ticks;
2450 }
2451
2452 for (Train *t : Train::Iterate()) {
2453 t->wait_counter = t->current_order.IsType(OT_LOADING) ? 0 : t->load_unload_ticks;
2454 }
2455 }
2456
2457 /* Airport tile animation uses animation frame instead of other graphics id */
2459 struct AirportTileConversion {
2460 uint8_t old_start;
2461 uint8_t num_frames;
2462 };
2463 static const AirportTileConversion atcs[] = {
2464 {31, 12}, // APT_RADAR_GRASS_FENCE_SW
2465 {50, 4}, // APT_GRASS_FENCE_NE_FLAG
2466 {62, 2}, // 1 unused tile
2467 {66, 12}, // APT_RADAR_FENCE_SW
2468 {78, 12}, // APT_RADAR_FENCE_NE
2469 {101, 10}, // 9 unused tiles
2470 {111, 8}, // 7 unused tiles
2471 {119, 15}, // 14 unused tiles (radar)
2472 {140, 4}, // APT_GRASS_FENCE_NE_FLAG_2
2473 };
2474 for (const auto t : Map::Iterate()) {
2475 if (IsAirportTile(t)) {
2476 StationGfx old_gfx = GetStationGfx(t);
2477 uint8_t offset = 0;
2478 for (const auto &atc : atcs) {
2479 if (old_gfx < atc.old_start) {
2480 SetStationGfx(t, old_gfx - offset);
2481 break;
2482 }
2483 if (old_gfx < atc.old_start + atc.num_frames) {
2484 SetAnimationFrame(t, old_gfx - atc.old_start);
2485 SetStationGfx(t, atc.old_start - offset);
2486 break;
2487 }
2488 offset += atc.num_frames - 1;
2489 }
2490 }
2491 }
2492 }
2493
2494 /* Oilrig was moved from id 15 to 9. */
2496 for (Station *st : Station::Iterate()) {
2497 if (st->airport.tile != INVALID_TILE && st->airport.type == 15) {
2498 st->airport.type = AT_OILRIG;
2499 }
2500 }
2501 }
2502
2504 for (Station *st : Station::Iterate()) {
2505 if (st->airport.tile != INVALID_TILE) {
2506 st->airport.w = st->airport.GetSpec()->size_x;
2507 st->airport.h = st->airport.GetSpec()->size_y;
2508 }
2509 }
2510 }
2511
2513 for (const auto t : Map::Iterate()) {
2514 /* Reset tropic zone for VOID tiles, they shall not have any. */
2516 }
2517
2518 /* We need to properly number/name the depots.
2519 * The first step is making sure none of the depots uses the
2520 * 'default' names, after that we can assign the names. */
2521 for (Depot *d : Depot::Iterate()) d->town_cn = UINT16_MAX;
2522
2523 for (Depot *d : Depot::Iterate()) MakeDefaultName(d);
2524 }
2525
2527 for (Depot *d : Depot::Iterate()) d->build_date = TimerGameCalendar::date;
2528 }
2529
2531 for (Station *st : Station::Iterate()) {
2532 if (st->facilities.Test(StationFacility::Airport)) st->airport.rotation = Direction::N;
2533 }
2534 }
2535
2536 /* In old versions it was possible to remove an airport while a plane was
2537 * taking off or landing. This gives all kind of problems when building
2538 * another airport in the same station so we don't allow that anymore.
2539 * For old savegames with such aircraft we just throw them in the air and
2540 * treat the aircraft like they were flying already. */
2542 for (Aircraft *v : Aircraft::Iterate()) {
2543 if (!v->IsNormalAircraft()) continue;
2545 if (st == nullptr && v->state != FLYING) {
2546 v->state = FLYING;
2549 /* get aircraft back on running altitude */
2550 if (!v->vehstatus.Test(VehState::Crashed)) {
2551 GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
2552 SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
2553 }
2554 }
2555 }
2556 }
2557
2558 /* Move the animation frame to the same location (m7) for all objects. */
2560 for (auto t : Map::Iterate()) {
2561 switch (GetTileType(t)) {
2562 case TileType::House:
2563 if (GetHouseType(t) >= NEW_HOUSE_OFFSET) {
2564 uint per_proc = t.m7();
2565 t.m7() = GB(t.m6(), 2, 6) | (GB(t.m3(), 5, 1) << 6);
2566 SB(t.m3(), 5, 1, 0);
2567 SB(t.m6(), 2, 6, std::min(per_proc, 63U));
2568 }
2569 break;
2570
2571 case TileType::Industry: {
2572 uint rand = t.m7();
2573 t.m7() = t.m3();
2574 t.m3() = rand;
2575 break;
2576 }
2577
2578 case TileType::Object:
2579 t.m7() = t.m3();
2580 t.m3() = 0;
2581 break;
2582
2583 default:
2584 /* For stations/airports it's already at m7 */
2585 break;
2586 }
2587 }
2588 }
2589
2590 /* Add (random) colour to all objects. */
2592 for (Object *o : Object::Iterate()) {
2593 Owner owner = GetTileOwner(o->location.tile);
2594 o->recolour_offset = (owner == OWNER_NONE) ? GB(Random(), 0, 4) : to_underlying(Company::Get(owner)->livery[LiveryScheme::Default].colour1);
2595 }
2596 }
2597
2599 for (const auto t : Map::Iterate()) {
2600 if (!IsTileType(t, TileType::Station)) continue;
2601 if (!IsBuoy(t) && !IsOilRig(t) && !(IsDock(t) && IsTileFlat(t))) {
2603 }
2604 }
2605
2606 /* Waypoints with custom name may have a non-unique town_cn,
2607 * renumber those. First set all affected waypoints to the
2608 * highest possible number to get them numbered in the
2609 * order they have in the pool. */
2610 for (Waypoint *wp : Waypoint::Iterate()) {
2611 if (!wp->name.empty()) wp->town_cn = UINT16_MAX;
2612 }
2613
2614 for (Waypoint *wp : Waypoint::Iterate()) {
2615 if (!wp->name.empty()) MakeDefaultName(wp);
2616 }
2617 }
2618
2620 _industry_builder.Reset(); // Initialize industry build data.
2621
2622 /* The moment vehicles go from hidden to visible changed. This means
2623 * that vehicles don't always get visible anymore causing things to
2624 * get messed up just after loading the savegame. This fixes that. */
2625 for (Vehicle *v : Vehicle::Iterate()) {
2626 /* Not all vehicle types can be inside a tunnel. Furthermore,
2627 * testing IsTunnelTile() for invalid tiles causes a crash. */
2628 if (!v->IsGroundVehicle()) continue;
2629
2630 /* Is the vehicle in a tunnel? */
2631 if (!IsTunnelTile(v->tile)) continue;
2632
2633 /* Is the vehicle actually at a tunnel entrance/exit? */
2634 TileIndex vtile = TileVirtXY(v->x_pos, v->y_pos);
2635 if (!IsTunnelTile(vtile)) continue;
2636
2637 /* Are we actually in this tunnel? Or maybe a lower tunnel? */
2638 if (GetSlopePixelZ(v->x_pos, v->y_pos, true) != v->z_pos) continue;
2639
2640 /* What way are we going? */
2641 const DiagDirection dir = GetTunnelBridgeDirection(vtile);
2642 const DiagDirection vdir = DirToDiagDir(v->direction);
2643
2644 /* Have we passed the visibility "switch" state already? */
2645 uint8_t pos = (DiagDirToAxis(vdir) == Axis::X ? v->x_pos : v->y_pos) & TILE_UNIT_MASK;
2646 uint8_t frame = (vdir == DiagDirection::NE || vdir == DiagDirection::NW) ? TILE_SIZE - 1 - pos : pos;
2648
2649 /* Should the vehicle be hidden or not? */
2650 bool hidden;
2651 if (dir == vdir) { // Entering tunnel
2652 hidden = frame >= _tunnel_visibility_frame[dir];
2653 v->tile = vtile;
2654 } else if (dir == ReverseDiagDir(vdir)) { // Leaving tunnel
2655 hidden = frame < TILE_SIZE - _tunnel_visibility_frame[dir];
2656 /* v->tile changes at the moment when the vehicle leaves the tunnel. */
2657 v->tile = hidden ? GetOtherTunnelBridgeEnd(vtile) : vtile;
2658 } else {
2659 /* We could get here in two cases:
2660 * - for road vehicles, it is reversing at the end of the tunnel
2661 * - it is crashed in the tunnel entry (both train or RV destroyed by UFO)
2662 * Whatever case it is, do not change anything and use the old values.
2663 * Especially changing RV's state would break its reversing in the middle. */
2664 continue;
2665 }
2666
2667 if (hidden) {
2668 v->vehstatus.Set(VehState::Hidden);
2669
2670 switch (v->type) {
2673 default: NOT_REACHED();
2674 }
2675 } else {
2676 v->vehstatus.Reset(VehState::Hidden);
2677
2678 switch (v->type) {
2679 case VehicleType::Train: Train::From(v)->track = DiagDirToDiagTrack(vdir); break;
2681 default: NOT_REACHED();
2682 }
2683 }
2684 }
2685 }
2686
2688 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
2689 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) continue;
2690
2691 bool loading = rv->current_order.IsType(OT_LOADING) || rv->current_order.IsType(OT_LEAVESTATION);
2692 if (HasBit(rv->state, RVS_IN_ROAD_STOP)) {
2693 extern const uint8_t _road_stop_stop_frame[];
2694 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)]);
2695 } else if (HasBit(rv->state, RVS_IN_DT_ROAD_STOP)) {
2696 SB(rv->state, RVS_ENTERED_STOP, 1, loading || rv->frame > RVC_DRIVE_THROUGH_STOP_FRAME);
2697 }
2698 }
2699 }
2700
2702 /* The train's pathfinder lost flag got moved. */
2703 for (Train *t : Train::Iterate()) {
2704 if (!t->flags.Test(VehicleRailFlag{5})) continue;
2705
2706 t->flags.Reset(VehicleRailFlag{5});
2707 t->vehicle_flags.Set(VehicleFlag::PathfinderLost);
2708 }
2709
2710 /* Introduced terraform/clear limits. */
2711 for (Company *c : Company::Iterate()) {
2712 c->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
2713 c->clear_limit = _settings_game.construction.clear_frame_burst << 16;
2714 }
2715 }
2716
2717
2719 /*
2720 * The logic of GetPartialPixelZ has been changed, so the resulting Zs on
2721 * the map are consistent. This requires that the Z position of some
2722 * vehicles is updated to reflect this new situation.
2723 *
2724 * This needs to be before SaveLoadVersion::TrackRealAndAutoOrders, because that performs asserts using
2725 * GetSlopePixelZ which internally uses GetPartialPixelZ.
2726 */
2727 for (Vehicle *v : Vehicle::Iterate()) {
2728 if (v->IsGroundVehicle() && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2729 /* Vehicle is on the ground, and not in a wormhole. */
2730 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2731 }
2732 }
2733 }
2734
2736 for (Vehicle *v : Vehicle::Iterate()) {
2737 switch (v->type) {
2738 case VehicleType::Train: {
2739 Train *t = Train::From(v);
2740
2741 /* Clear old GOINGUP / GOINGDOWN flags.
2742 * It was changed in savegame version 139, but savegame
2743 * version 158 doesn't use these bits, so it doesn't hurt
2744 * to clear them unconditionally. */
2747
2748 /* Clear both bits first. */
2750
2751 /* Crashed vehicles can't be going up/down. */
2752 if (t->vehstatus.Test(VehState::Crashed)) break;
2753
2754 /* Only X/Y tracks can be sloped. */
2755 if (t->track != Track::X && t->track != Track::Y) break;
2756
2758 break;
2759 }
2760 case VehicleType::Road: {
2763
2764 /* Crashed vehicles can't be going up/down. */
2765 if (rv->vehstatus.Test(VehState::Crashed)) break;
2766
2767 if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break;
2768
2769 TrackStatus ts = GetTileTrackStatus(rv->tile, TransportType::Road, GetRoadTramType(rv->roadtype));
2771
2772 /* Only X/Y tracks can be sloped. */
2773 if (trackbits != Track::X && trackbits != Track::Y) break;
2774
2775 Direction dir = rv->direction;
2776
2777 /* Test if we are reversing. */
2778 Axis a = trackbits == Track::X ? Axis::X : Axis::Y;
2779 if (AxisToDirection(a) != dir &&
2780 AxisToDirection(a) != ReverseDir(dir)) {
2781 /* When reversing, the road vehicle is on the edge of the tile,
2782 * so it can be safely compared to the middle of the tile. */
2783 dir = Direction::Invalid;
2784 }
2785
2786 rv->gv_flags |= FixVehicleInclination(rv, dir);
2787 break;
2788 }
2789 case VehicleType::Ship:
2790 break;
2791
2792 default:
2793 continue;
2794 }
2795
2796 if (IsBridgeTile(v->tile) && TileVirtXY(v->x_pos, v->y_pos) == v->tile) {
2797 /* In old versions, z_pos was 1 unit lower on bridge heads.
2798 * However, this invalid state could be converted to new savegames
2799 * by loading and saving the game in a new version. */
2800 v->z_pos = GetSlopePixelZ(v->x_pos, v->y_pos, true);
2802 if (v->type == VehicleType::Train && !v->vehstatus.Test(VehState::Crashed) &&
2803 v->direction != DiagDirToDir(dir)) {
2804 /* If the train has left the bridge, it shouldn't have
2805 * track == Track::Wormhole - this could happen
2806 * when the train was reversed while on the last "tick"
2807 * on the ramp before leaving the ramp to the bridge. */
2809 }
2810 }
2811
2812 /* If the vehicle is really above v->tile (not in a wormhole),
2813 * it should have set v->z_pos correctly. */
2814 assert(v->tile != TileVirtXY(v->x_pos, v->y_pos) || v->z_pos == GetSlopePixelZ(v->x_pos, v->y_pos, true));
2815 }
2816
2817 /* Fill Vehicle::cur_real_order_index */
2818 for (Vehicle *v : Vehicle::Iterate()) {
2819 if (!v->IsPrimaryVehicle()) continue;
2820
2821 /* Older versions are less strict with indices being in range and fix them on the fly */
2822 if (v->cur_implicit_order_index >= v->GetNumOrders()) v->cur_implicit_order_index = 0;
2823
2824 v->cur_real_order_index = v->cur_implicit_order_index;
2825 v->UpdateRealOrderIndex();
2826 }
2827 }
2828
2830 /* If the savegame is old (before version 100), then the value of 255
2831 * for these settings did not mean "disabled". As such everything
2832 * before then did reverse.
2833 * To simplify stuff we disable all turning around or we do not
2834 * disable anything at all. So, if some reversing was disabled we
2835 * will keep reversing disabled, otherwise it'll be turned on. */
2836 _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);
2837
2838 for (Train *t : Train::Iterate()) {
2839 _settings_game.vehicle.max_train_length = std::max<uint8_t>(_settings_game.vehicle.max_train_length, CeilDiv(t->gcache.cached_total_length, TILE_SIZE));
2840 }
2841 }
2842
2844 /* Setting difficulty industry_density other than zero get bumped to +1
2845 * since a new option (minimal at position 1) has been added */
2846 if (_settings_game.difficulty.industry_density > IndustryDensity::FundedOnly) {
2847 _settings_game.difficulty.industry_density = static_cast<IndustryDensity>(to_underlying(_settings_game.difficulty.industry_density) + 1);
2848 }
2849 }
2850
2852 /* Before savegame version 161, persistent storages were not stored in a pool. */
2853
2855 for (Industry *ind : Industry::Iterate()) {
2856 assert(ind->psa != nullptr);
2857
2858 /* Check if the old storage was empty. */
2859 bool is_empty = true;
2860 for (uint i = 0; i < sizeof(ind->psa->storage); i++) {
2861 if (ind->psa->GetValue(i) != 0) {
2862 is_empty = false;
2863 break;
2864 }
2865 }
2866
2867 if (!is_empty) {
2868 ind->psa->grfid = _industry_mngr.GetGRFID(ind->type);
2869 } else {
2870 delete ind->psa;
2871 ind->psa = nullptr;
2872 }
2873 }
2874 }
2875
2877 for (Station *st : Station::Iterate()) {
2878 if (!st->facilities.Test(StationFacility::Airport)) continue;
2879 assert(st->airport.psa != nullptr);
2880
2881 /* Check if the old storage was empty. */
2882 bool is_empty = true;
2883 for (uint i = 0; i < sizeof(st->airport.psa->storage); i++) {
2884 if (st->airport.psa->GetValue(i) != 0) {
2885 is_empty = false;
2886 break;
2887 }
2888 }
2889
2890 if (!is_empty) {
2891 st->airport.psa->grfid = _airport_mngr.GetGRFID(st->airport.type);
2892 } else {
2893 delete st->airport.psa;
2894 st->airport.psa = nullptr;
2895
2896 }
2897 }
2898 }
2899 }
2900
2901 /* This triggers only when old snow_lines were copied into the snow_line_height. */
2903 _settings_game.game_creation.snow_line_height /= TILE_HEIGHT;
2904 }
2905
2907 /* We store 4 fences in the field tiles instead of only SE and SW. */
2908 for (auto t : Map::Iterate()) {
2909 if (!IsTileType(t, TileType::Clear) && !IsTileType(t, TileType::Trees)) continue;
2911 uint fence = GB(t.m4(), 5, 3);
2912 if (fence != 0 && IsTileType(TileAddXY(t, 1, 0), TileType::Clear) && IsClearGround(TileAddXY(t, 1, 0), ClearGround::Fields)) {
2913 SetFence(TileAddXY(t, 1, 0), DiagDirection::NE, fence);
2914 }
2915 fence = GB(t.m4(), 2, 3);
2916 if (fence != 0 && IsTileType(TileAddXY(t, 0, 1), TileType::Clear) && IsClearGround(TileAddXY(t, 0, 1), ClearGround::Fields)) {
2917 SetFence(TileAddXY(t, 0, 1), DiagDirection::NW, fence);
2918 }
2919 SB(t.m4(), 2, 3, 0);
2920 SB(t.m4(), 5, 3, 0);
2921 }
2922 }
2923
2925 /* Vehicles used to be reversed immediately when entering depot.
2926 * Now they are reversed when the whole consist has entered.
2927 * Find trains in the process of entering a depot and un-reverse them. */
2928 for (Train *t : Train::Iterate()) {
2929 if (!t->IsPrimaryVehicle()) continue;
2930
2931 /* Front not in depot -> consist not entering depot */
2932 if (t->track != Track::Depot) continue;
2933 /* Back in depot -> consist completely in depot */
2934 if (t->Last()->track == Track::Depot) continue;
2935 for (Train *u = t; u->track == Track::Depot; u = u->Next()) {
2936 u->direction = ReverseDir(u->direction);
2937 }
2938 }
2939
2940 /* Update the setting for train flipping. */
2941 _settings_game.difficulty.train_flip_reverse_allowed = _settings_game.difficulty.line_reverse_mode ? TrainFlipReversingAllowed::EndOfLineOnly : TrainFlipReversingAllowed::All;
2942 }
2943
2945 for (Town *t : Town::Iterate()) {
2946 /* Set the default cargo requirement for town growth */
2947 switch (_settings_game.game_creation.landscape) {
2950 break;
2951
2955 break;
2956
2957 default:
2958 break;
2959 }
2960 }
2961 }
2962
2964 /* Adjust zoom level to account for new levels */
2965 _saved_scrollpos_zoom += ZOOM_BASE_SHIFT;
2966 _saved_scrollpos_x *= ZOOM_BASE;
2967 _saved_scrollpos_y *= ZOOM_BASE;
2968 }
2969
2970 /* When any NewGRF has been changed the availability of some vehicles might
2971 * have been changed too. e->company_avail must be set to 0 in that case
2972 * which is done by StartupEngines(). */
2974
2975 /* The road owner of standard road stops was not properly accounted for. */
2977 for (const auto t : Map::Iterate()) {
2978 if (!IsBayRoadStopTile(t)) continue;
2979 Owner o = GetTileOwner(t);
2982 }
2983 }
2984
2986 /* Introduced tree planting limit. */
2987 for (Company *c : Company::Iterate()) c->tree_limit = _settings_game.construction.tree_frame_burst << 16;
2988 }
2989
2991 /* Fix too high inflation rates */
2992 if (_economy.inflation_prices > MAX_INFLATION) _economy.inflation_prices = MAX_INFLATION;
2993 if (_economy.inflation_payment > MAX_INFLATION) _economy.inflation_payment = MAX_INFLATION;
2994
2995 /* We have to convert the quarters of bankruptcy into months of bankruptcy */
2996 for (Company *c : Company::Iterate()) {
2997 c->months_of_bankruptcy = 3 * c->months_of_bankruptcy;
2998 }
2999 }
3000
3002 /* Aircraft acceleration variable was bonkers */
3003 for (Aircraft *v : Aircraft::Iterate()) {
3004 if (v->subtype <= AIR_AIRCRAFT) {
3005 const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
3006 v->acceleration = avi->acceleration;
3007 }
3008 }
3009
3010 /* Blocked tiles could be reserved due to a bug, which causes
3011 * other places to assert upon e.g. station reconstruction. */
3012 for (const auto t : Map::Iterate()) {
3014 SetRailStationReservation(t, false);
3015 }
3016 }
3017 }
3018
3020 /* The global units configuration is split up in multiple configurations. */
3021 extern uint8_t _old_units;
3022 _settings_game.locale.units_velocity = Clamp(_old_units, 0, 2);
3023 _settings_game.locale.units_power = Clamp(_old_units, 0, 2);
3024 _settings_game.locale.units_weight = Clamp(_old_units, 1, 2);
3025 _settings_game.locale.units_volume = Clamp(_old_units, 1, 2);
3026 _settings_game.locale.units_force = 2;
3027 _settings_game.locale.units_height = Clamp(_old_units, 0, 2);
3028 }
3029
3031 /* Match nautical velocity with land velocity units. */
3032 _settings_game.locale.units_velocity_nautical = _settings_game.locale.units_velocity;
3033 }
3034
3036 /* Move ObjectType from map to pool */
3037 for (auto t : Map::Iterate()) {
3038 if (IsTileType(t, TileType::Object)) {
3039 Object *o = Object::Get(t.m2());
3040 o->type = t.m5();
3041 t.m5() = 0; // zero upper bits of (now bigger) ObjectID
3042 }
3043 }
3044 }
3045
3046 /* Beyond this point, tile types which can be accessed by vehicles must be in a valid state. */
3047
3048 /* Update all vehicles: Phase 2 */
3050
3051 /* The center of train vehicles was changed, fix up spacing. */
3053
3054 /* In version 2.2 of the savegame, we have new airports, so status of all aircraft is reset.
3055 * This has to be called after all map array updates */
3057
3059 /* Fix articulated road vehicles.
3060 * Some curves were shorter than other curves.
3061 * Now they have the same length, but that means that trailing articulated parts will
3062 * take longer to go through the curve than the parts in front which already left the curve.
3063 * So, make articulated parts catch up. */
3064 bool roadside = _settings_game.vehicle.road_side == RoadVehicleDrivingSide::Right;
3065 std::vector<uint> skip_frames;
3066 for (RoadVehicle *v : RoadVehicle::Iterate()) {
3067 if (!v->IsFrontEngine()) continue;
3068 skip_frames.clear();
3069 TileIndex prev_tile = v->tile;
3070 uint prev_tile_skip = 0;
3071 uint cur_skip = 0;
3072 for (RoadVehicle *u = v; u != nullptr; u = u->Next()) {
3073 if (u->tile != prev_tile) {
3074 prev_tile_skip = cur_skip;
3075 prev_tile = u->tile;
3076 } else {
3077 cur_skip = prev_tile_skip;
3078 }
3079
3080 uint &this_skip = skip_frames.emplace_back(prev_tile_skip);
3081
3082 /* The following 3 curves now take longer than before */
3083 switch (u->state) {
3084 case 2:
3085 cur_skip++;
3086 if (u->frame <= (roadside ? 9 : 5)) this_skip = cur_skip;
3087 break;
3088
3089 case 4:
3090 cur_skip++;
3091 if (u->frame <= (roadside ? 5 : 9)) this_skip = cur_skip;
3092 break;
3093
3094 case 5:
3095 cur_skip++;
3096 if (u->frame <= (roadside ? 4 : 2)) this_skip = cur_skip;
3097 break;
3098
3099 default:
3100 break;
3101 }
3102 }
3103 while (cur_skip > skip_frames[0]) {
3104 RoadVehicle *u = v;
3105 RoadVehicle *prev = nullptr;
3106 for (uint sf : skip_frames) {
3107 if (sf >= cur_skip) IndividualRoadVehicleController(u, prev);
3108
3109 prev = u;
3110 u = u->Next();
3111 }
3112 cur_skip--;
3113 }
3114 }
3115 }
3116
3118 for (OrderList *orderlist : OrderList::Iterate()) {
3119 for (Order &order : orderlist->GetOrders()) {
3120 order.SetTravelTimetabled(order.GetTravelTime() > 0);
3121 order.SetWaitTimetabled(order.GetWaitTime() > 0);
3122 }
3123 orderlist->RecalculateTimetableDuration();
3124 }
3125 }
3126
3127 /*
3128 * Only keep order-backups for network clients (and when replaying).
3129 * If we are a network server or not networking, then we just loaded a previously
3130 * saved-by-server savegame. There are no clients with a backup, so clear it.
3131 * Furthermore before savegame version SaveLoadVersion::FixOrderBackup the actual content was always corrupt.
3132 */
3134#ifndef DEBUG_DUMP_COMMANDS
3135 /* Note: We cannot use CleanPool since that skips part of the destructor
3136 * and then leaks un-reachable Orders in the order pool. */
3137 for (OrderBackup *ob : OrderBackup::Iterate()) {
3138 delete ob;
3139 }
3140#endif
3141 }
3142
3144 /* Convert towns growth_rate and grow_counter to ticks */
3145 for (Town *t : Town::Iterate()) {
3146 /* 0x8000 = TOWN_GROWTH_RATE_CUSTOM previously */
3147 if (t->growth_rate & 0x8000) t->flags.Set(TownFlag::CustomGrowth);
3148 if (t->growth_rate != TOWN_GROWTH_RATE_NONE) {
3149 t->growth_rate = TownTicksToGameTicks(t->growth_rate & ~0x8000);
3150 }
3151 /* Add t->index % TOWN_GROWTH_TICKS to spread growth across ticks. */
3152 t->grow_counter = TownTicksToGameTicks(t->grow_counter) + t->index % Ticks::TOWN_GROWTH_TICKS;
3153 }
3154 }
3155
3157 /* Make sure added industry cargo slots are cleared */
3158 for (Industry *i : Industry::Iterate()) {
3159 /* Make sure last_cargo_accepted_at is copied to elements for every valid input cargo.
3160 * The loading routine should put the original singular value into the first array element. */
3161 for (auto &a : i->accepted) {
3162 if (IsValidCargoType(a.cargo)) {
3163 a.last_accepted = i->GetAccepted(0).last_accepted;
3164 } else {
3165 a.last_accepted = EconomyTime::MIN_DATE;
3166 }
3167 }
3168 }
3169 }
3170
3172 /* Move ships from lock slope to upper or lower position. */
3173 for (Ship *s : Ship::Iterate()) {
3174 /* Suitable tile? */
3175 if (!IsTileType(s->tile, TileType::Water) || !IsLock(s->tile) || GetLockPart(s->tile) != LockPart::Middle) continue;
3176
3177 /* We don't need to adjust position when at the tile centre */
3178 int x = s->x_pos & 0xF;
3179 int y = s->y_pos & 0xF;
3180 if (x == 8 && y == 8) continue;
3181
3182 /* Test if ship is on the second half of the tile */
3183 bool second_half;
3184 DiagDirection shipdiagdir = DirToDiagDir(s->direction);
3185 switch (shipdiagdir) {
3186 default: NOT_REACHED();
3187 case DiagDirection::NE: second_half = x < 8; break;
3188 case DiagDirection::NW: second_half = y < 8; break;
3189 case DiagDirection::SW: second_half = x > 8; break;
3190 case DiagDirection::SE: second_half = y > 8; break;
3191 }
3192
3193 DiagDirection slopediagdir = GetInclinedSlopeDirection(GetTileSlope(s->tile));
3194
3195 /* Heading up slope == passed half way */
3196 if ((shipdiagdir == slopediagdir) == second_half) {
3197 /* On top half of lock */
3198 s->z_pos = GetTileMaxZ(s->tile) * (int)TILE_HEIGHT;
3199 } else {
3200 /* On lower half of lock */
3201 s->z_pos = GetTileZ(s->tile) * (int)TILE_HEIGHT;
3202 }
3203 }
3204 }
3205
3207 /* Ensure the original cargo generation mode is used */
3208 _settings_game.economy.town_cargogen_mode = TownCargoGenMode::Original;
3209 }
3210
3212 /* Ensure the original neutral industry/station behaviour is used */
3213 _settings_game.station.serve_neutral_industries = true;
3214
3215 /* Link oil rigs to their industry and back. */
3216 for (Station *st : Station::Iterate()) {
3217 if (IsTileType(st->xy, TileType::Station) && IsOilRig(st->xy)) {
3218 /* Industry tile is always adjacent during construction by TileDiffXY(0, 1) */
3219 st->industry = Industry::GetByTile(st->xy + TileDiffXY(0, 1));
3220 st->industry->neutral_station = st;
3221 }
3222 }
3223 } else {
3224 /* Link neutral station back to industry, as this is not saved. */
3225 for (Industry *ind : Industry::Iterate()) if (ind->neutral_station != nullptr) ind->neutral_station->industry = ind;
3226 }
3227
3229 /* Update water class for trees. */
3230 for (const auto t : Map::Iterate()) {
3232 }
3233 }
3234
3235 /* Update structures for multitile docks */
3237 for (const auto t : Map::Iterate()) {
3238 /* Clear docking tile flag from relevant tiles as it
3239 * was not previously cleared. */
3241 SetDockingTile(t, false);
3242 }
3243 /* Add docks and oilrigs to Station::ship_station. */
3244 if (IsTileType(t, TileType::Station)) {
3245 if (IsDock(t) || IsOilRig(t)) Station::GetByTile(t)->ship_station.Add(t);
3246 }
3247 }
3248 }
3249
3251 /* Placing objects on docking tiles was not updating adjacent station's docking tiles. */
3252 for (Station *st : Station::Iterate()) {
3253 if (st->ship_station.tile != INVALID_TILE) UpdateStationDockingTiles(st);
3254 }
3255 }
3256
3257 /* Make sure all industries exclusive supplier/consumer set correctly. */
3259 for (Industry *i : Industry::Iterate()) {
3260 i->exclusive_supplier = INVALID_OWNER;
3261 i->exclusive_consumer = INVALID_OWNER;
3262 }
3263 }
3264
3266 /* Propagate wagon removal flag for compatibility */
3267 /* Temporary bitmask of company wagon removal setting */
3268 CompanyMask wagon_removal{};
3269 for (const Company *c : Company::Iterate()) {
3270 if (c->settings.renew_keep_length) wagon_removal.Set(c->index);
3271 }
3272 for (Group *g : Group::Iterate()) {
3273 if (g->flags.Any()) {
3274 /* Convert old replace_protection value to flag. */
3276 }
3277 if (wagon_removal.Test(g->owner)) g->flags.Set(GroupFlag::ReplaceWagonRemoval);
3278 }
3279 }
3280
3281 /* Use current order time to approximate last loading time */
3283 for (Vehicle *v : Vehicle::Iterate()) {
3284 v->last_loading_tick = std::max(TimerGameTick::counter, static_cast<uint64_t>(v->current_order_time)) - v->current_order_time;
3285 }
3286 }
3287
3288 /* Road stops is 'only' updating some caches, but they are needed for PF calls in SaveLoadVersion::MultitrackLevelCrossings teleporting. */
3290
3291 /* Road vehicles stopped on multitrack level crossings need teleporting to a depot
3292 * to avoid crashing into the side of the train they're waiting for. */
3294 /* Teleport road vehicles to the nearest depot. */
3295 for (RoadVehicle *rv : RoadVehicle::Iterate()) {
3296 /* Ignore trailers of articulated vehicles. */
3297 if (rv->IsArticulatedPart()) continue;
3298
3299 /* Ignore moving vehicles. */
3300 if (rv->cur_speed > 0) continue;
3301
3302 /* Ignore crashed vehicles. */
3303 if (rv->vehstatus.Test(VehState::Crashed)) continue;
3304
3305 /* Ignore vehicles not on level crossings. */
3306 TileIndex cur_tile = rv->tile;
3307 if (!IsLevelCrossingTile(cur_tile)) continue;
3308
3309 ClosestDepot closest_depot = rv->FindClosestDepot();
3310
3311 /* Try to find a depot with a distance limit of 512 tiles (Manhattan distance). */
3312 if (closest_depot.found && DistanceManhattan(rv->tile, closest_depot.location) < 512u) {
3313 /* Teleport all parts of articulated vehicles. */
3314 for (RoadVehicle *u = rv; u != nullptr; u = u->Next()) {
3315 u->tile = closest_depot.location;
3316 int x = TileX(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3317 int y = TileY(closest_depot.location) * TILE_SIZE + TILE_SIZE / 2;
3318 u->x_pos = x;
3319 u->y_pos = y;
3320 u->z_pos = GetSlopePixelZ(x, y, true);
3321
3322 u->vehstatus.Set(VehState::Hidden);
3323 u->state = RVSB_IN_DEPOT;
3324 u->UpdatePosition();
3325 }
3326 RoadVehLeaveDepot(rv, false);
3327 }
3328 }
3329
3331 /* Reset unused tree counters to reduce the savegame size. */
3332 for (auto t : Map::Iterate()) {
3333 if (IsTileType(t, TileType::Trees)) {
3334 SB(t.m2(), 0, 4, 0);
3335 }
3336 }
3337 }
3338
3339 /* Refresh all level crossings to bar adjacent crossing tiles, if needed. */
3340 for (const auto tile : Map::Iterate()) {
3341 if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile, false);
3342 }
3343 }
3344
3345 /* Compute station catchment areas. This is needed here in case UpdateStationAcceptance is called below. */
3347
3348 /* Station acceptance is some kind of cache */
3350 for (Station *st : Station::Iterate()) UpdateStationAcceptance(st, false);
3351 }
3352
3355 }
3356
3358 /* For older savegames, we don't now the actual interval; so set it to the newgame value. */
3359 _settings_game.difficulty.competitors_interval = _settings_newgame.difficulty.competitors_interval;
3360
3361 /* We did load the "period" of the timer, but not the fired/elapsed. We can deduce that here. */
3363 _new_competitor_timeout.storage.elapsed = 0;
3364 _new_competitor_timeout.fired = _new_competitor_timeout.period.value == 0;
3365 }
3366
3368 /* Set service date provided to NewGRF. */
3369 for (Vehicle *v : Vehicle::Iterate()) {
3370 v->date_of_last_service_newgrf = TimerGameCalendar::Date{v->date_of_last_service.base()};
3371 }
3372 }
3373
3375 /* NewGRF acceleration information was added to ships. */
3376 for (Ship *s : Ship::Iterate()) {
3377 if (s->acceleration == 0) s->acceleration = ShipVehInfo(s->engine_type)->acceleration;
3378 }
3379 }
3380
3382 for (Company *c : Company::Iterate()) {
3383 c->max_loan = COMPANY_MAX_LOAN_DEFAULT;
3384 }
3385 }
3386
3388 ScriptObject::InitializeRandomizers();
3389 }
3390
3392 for (Company *c : Company::Iterate()) {
3393 c->inaugurated_year_calendar = _settings_game.game_creation.starting_year;
3394 }
3395 }
3396
3398 /* Between these two versions (actually from f8b1e303 to 77236258) EngineFlags had an off-by-one. Depending
3399 * on when the save was started, this may or may not affect existing engines. Here we try to detect invalid flags
3400 * and reset them to what they should be. */
3401 for (Engine *e : Engine::Iterate()) {
3402 if (e->flags.Test(EngineFlag::Available)) continue;
3403 if (e->flags.Test(EngineFlag{2}) || (e->flags.Test(EngineFlag::ExclusivePreview) && e->preview_asked.None())) {
3404 e->flags = EngineFlags(e->flags.base() >> 1U);
3405 }
3406 }
3407 }
3408
3410 /* Default waypoints were built with an incorrect layout that prevents building bridges over them. */
3411 for (auto tile : Map::Iterate()) {
3412 if (!IsRailWaypointTile(tile)) continue; // Not a waypoint.
3413 if (GetCustomStationSpecIndex(tile) > 0) continue; // Not a default waypoint.
3414 SetStationGfx(tile, GetStationGfx(tile) & 1);
3415 }
3416 }
3417
3418 for (Company *c : Company::Iterate()) {
3420 }
3421
3422 /* Update free group numbers data for each company, required regardless of savegame version. */
3423 for (Group *g : Group::Iterate()) {
3424 Company *c = Company::Get(g->owner);
3426 /* Use the index as group number when converting old savegames. */
3427 g->number = c->freegroups.UseID(g->index.base());
3428 } else {
3429 c->freegroups.UseID(g->number);
3430 }
3431 }
3432
3436
3437 _gamelog.PrintDebug(1);
3438
3440 /* Restore the signals */
3442
3444
3446
3447 /* Start the scripts. This MUST happen after everything else except
3448 * starting a new company. */
3449 StartScripts();
3450
3451 /* If Load Scenario / New (Scenario) Game is used,
3452 * a company does not exist yet. So create one here.
3453 * 1 exception: network-games. Those can have 0 companies
3454 * But this exception is not true for non-dedicated network servers! */
3456 CompanyID first_human_company = GetFirstPlayableCompanyID();
3457 if (!Company::IsValidID(first_human_company)) {
3458 Company *c = DoStartupNewCompany(false, first_human_company);
3459 c->settings = _settings_client.company;
3460 }
3461 }
3462
3463 return true;
3464}
3465
3475{
3476 /* reload grf data */
3480 /* reload vehicles */
3481 ResetVehicleHash();
3487 /* update station graphics */
3488 AfterLoadStations();
3489 /* Update company statistics. */
3491 /* Check and update house and town values */
3493 /* Delete news referring to no longer existing entities */
3495 /* Update livery selection windows */
3496 for (CompanyID i = CompanyID::Begin(); i < MAX_COMPANIES; ++i) InvalidateWindowData(WindowClass::CompanyLivery, i);
3497 /* Update company infrastructure counts. */
3498 InvalidateWindowClassesData(WindowClass::CompanyInfrastructure);
3499 InvalidateWindowClassesData(WindowClass::BuildToolbar);
3500 InvalidateAllPickerWindows();
3501 /* redraw the whole screen */
3504}
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.
static constexpr IndustryGfx GFX_GOLD_MINE_TOWER_ANIMATED
static constexpr IndustryGfx GFX_OILWELL_ANIMATED_1
static constexpr IndustryGfx GFX_POWERPLANT_SPARKS
static constexpr IndustryGfx GFX_OILWELL_ANIMATED_2
static constexpr IndustryGfx GFX_COPPER_MINE_TOWER_ANIMATED
static constexpr IndustryGfx GFX_COAL_MINE_TOWER_ANIMATED
static constexpr IndustryGfx GFX_OILRIG_1
static constexpr IndustryGfx GFX_OILWELL_ANIMATED_3
@ 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:1337
@ 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:1351
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:410
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:402
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.