OpenTTD Source: src/saveload/oldloader_sl.cpp Source File

OpenTTD Source 14.0-RC3

oldloader_sl.cpp
Go to the documentation of this file.
1 /*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10 #include "../stdafx.h"
11 #include "../town.h"
12 #include "../industry.h"
13 #include "../company_func.h"
14 #include "../aircraft.h"
15 #include "../roadveh.h"
16 #include "../ship.h"
17 #include "../train.h"
18 #include "../signs_base.h"
19 #include "../station_base.h"
20 #include "../subsidy_base.h"
21 #include "../debug.h"
22 #include "../depot_base.h"
23 #include "../timer/timer_game_calendar.h"
24 #include "../timer/timer_game_calendar.h"
25 #include "../vehicle_func.h"
26 #include "../effectvehicle_base.h"
27 #include "../engine_func.h"
28 #include "../company_base.h"
29 #include "../disaster_vehicle.h"
30 #include "../timer/timer.h"
31 #include "../timer/timer_game_tick.h"
32 #include "../timer/timer_game_calendar.h"
33 #include "saveload_internal.h"
34 #include "oldloader.h"
35
36 #include "table/strings.h"
37 #include "../table/engines.h"
38 #include "../table/townname.h"
39
40 #include "../safeguards.h"
41
42 static bool _read_ttdpatch_flags;
43 static uint16_t _old_extra_chunk_nums;
44 static byte _old_vehicle_multiplier;
45
46 void FixOldMapArray()
47 {
48 /* TTO/TTD/TTDP savegames could have buoys at tile 0
49 * (without assigned station struct) */
50 MakeSea(0);
51 }
52
53 static void FixTTDMapArray()
54 {
55 for (auto tile : Map::Iterate()) {
56 switch (GetTileType(tile)) {
57 case MP_STATION:
58 tile.m4() = 0; // We do not understand this TTDP station mapping (yet)
59 switch (tile.m5()) {
60 /* We have drive through stops at a totally different place */
61 case 0x53: case 0x54: tile.m5() += 170 - 0x53; break; // Bus drive through
62 case 0x57: case 0x58: tile.m5() += 168 - 0x57; break; // Truck drive through
63 case 0x55: case 0x56: tile.m5() += 170 - 0x55; break; // Bus tram stop
64 case 0x59: case 0x5A: tile.m5() += 168 - 0x59; break; // Truck tram stop
65 default: break;
66 }
67 break;
68
69 case MP_RAILWAY:
70 /* We save presignals different from TTDPatch, convert them */
71 if (GB(tile.m5(), 6, 2) == 1) { // RAIL_TILE_SIGNALS
72 /* This byte is always zero in TTD for this type of tile */
73 if (tile.m4()) { // Convert the presignals to our own format
74 tile.m4() = (tile.m4() >> 1) & 7;
75 }
76 }
77 /* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just
78 * clear it for ourselves and let OTTD's rebuild PBS itself */
79 tile.m4() &= 0xF; // Only keep the lower four bits; upper four is PBS
80 break;
81
82 case MP_WATER:
83 /* if water class == 3, make river there */
84 if (GB(tile.m3(), 0, 2) == 3) {
85 SetTileType(tile, MP_WATER);
86 SetTileOwner(tile, OWNER_WATER);
87 tile.m2() = 0;
88 tile.m3() = 2; // WATER_CLASS_RIVER
89 tile.m4() = Random();
90 tile.m5() = 0;
91 }
92 break;
93
94 default:
95 break;
96 }
97 }
98
99 FixOldMapArray();
100 }
101
102 static void FixTTDDepots()
103 {
104 for (const Depot *d : Depot::Iterate(252)) {
105 if (!IsDepotTile(d->xy) || GetDepotIndex(d->xy) != d->index) {
107 delete d;
108 }
109 }
110 }
111
112 #define FIXNUM(x, y, z) (((((x) << 16) / (y)) + 1) << z)
113
114 static uint32_t RemapOldTownName(uint32_t townnameparts, byte old_town_name_type)
115 {
116 switch (old_town_name_type) {
117 case 0: case 3: // English, American
118 /* Already OK */
119 return townnameparts;
120
121 case 1: // French
122 /* For some reason 86 needs to be subtracted from townnameparts
123 * 0000 0000 0000 0000 0000 0000 1111 1111 */
124 return FIXNUM(townnameparts - 86, lengthof(_name_french_real), 0);
125
126 case 2: // German
127 Debug(misc, 0, "German Townnames are buggy ({})", townnameparts);
128 return townnameparts;
129
130 case 4: // Latin-American
131 /* 0000 0000 0000 0000 0000 0000 1111 1111 */
132 return FIXNUM(townnameparts, lengthof(_name_spanish_real), 0);
133
134 case 5: // Silly
135 /* NUM_SILLY_1 - lower 16 bits
136 * NUM_SILLY_2 - upper 16 bits without leading 1 (first 8 bytes)
137 * 1000 0000 2222 2222 0000 0000 1111 1111 */
138 return FIXNUM(townnameparts, lengthof(_name_silly_1), 0) | FIXNUM(GB(townnameparts, 16, 8), lengthof(_name_silly_2), 16);
139 }
140 return 0;
141 }
142
143 #undef FIXNUM
144
145 static void FixOldTowns()
146 {
147 /* Convert town-names if needed */
148 for (Town *town : Town::Iterate()) {
149 if (IsInsideMM(town->townnametype, 0x20C1, 0x20C3)) {
150 town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _settings_game.game_creation.town_name;
151 town->townnameparts = RemapOldTownName(town->townnameparts, _settings_game.game_creation.town_name);
152 }
153 }
154 }
155
156 static StringID *_old_vehicle_names;
157
163 void FixOldVehicles()
164 {
165 for (Vehicle *v : Vehicle::Iterate()) {
166 if ((size_t)v->next == 0xFFFF) {
167 v->next = nullptr;
168 } else {
169 v->next = Vehicle::GetIfValid((size_t)v->next);
170 }
171
172 /* For some reason we need to correct for this */
173 switch (v->spritenum) {
174 case 0xfd: break;
175 case 0xff: v->spritenum = 0xfe; break;
176 default: v->spritenum >>= 1; break;
177 }
178
179 /* Vehicle-subtype is different in TTD(Patch) */
180 if (v->type == VEH_EFFECT) v->subtype = v->subtype >> 1;
181
182 v->name = CopyFromOldName(_old_vehicle_names[v->index]);
183
184 /* We haven't used this bit for stations for ages */
185 if (v->type == VEH_ROAD) {
186 RoadVehicle *rv = RoadVehicle::From(v);
187 if (rv->state != RVSB_IN_DEPOT && rv->state != RVSB_WORMHOLE) {
188 ClrBit(rv->state, 2);
189 Tile tile(rv->tile);
190 if (IsTileType(tile, MP_STATION) && tile.m5() >= 168) {
191 /* Update the vehicle's road state to show we're in a drive through road stop. */
192 SetBit(rv->state, RVS_IN_DT_ROAD_STOP);
193 }
194 }
195 }
196
197 /* The subtype should be 0, but it sometimes isn't :( */
198 if (v->type == VEH_ROAD || v->type == VEH_SHIP) v->subtype = 0;
199
200 /* Sometimes primary vehicles would have a nothing (invalid) order
201 * or vehicles that could not have an order would still have a
202 * (loading) order which causes assertions and the like later on.
203 */
204 if (!IsCompanyBuildableVehicleType(v) ||
205 (v->IsPrimaryVehicle() && v->current_order.IsType(OT_NOTHING))) {
206 v->current_order.MakeDummy();
207 }
208
209 /* Shared orders are fixed in AfterLoadVehicles now */
210 }
211 }
212
213 static bool FixTTOMapArray()
214 {
215 for (auto tile : Map::Iterate()) {
216 TileType tt = GetTileType(tile);
217 if (tt == 11) {
218 /* TTO has a different way of storing monorail.
219 * Instead of using bits in m3 it uses a different tile type. */
220 tile.m3() = 1; // rail type = monorail (in TTD)
221 SetTileType(tile, MP_RAILWAY);
222 tile.m2() = 1; // set monorail ground to RAIL_GROUND_GRASS
223 tt = MP_RAILWAY;
224 }
225
226 switch (tt) {
227 case MP_CLEAR:
228 break;
229
230 case MP_RAILWAY:
231 switch (GB(tile.m5(), 6, 2)) {
232 case 0: // RAIL_TILE_NORMAL
233 break;
234 case 1: // RAIL_TILE_SIGNALS
235 tile.m4() = (~tile.m5() & 1) << 2; // signal variant (present only in OTTD)
236 SB(tile.m2(), 6, 2, GB(tile.m5(), 3, 2)); // signal status
237 tile.m3() |= 0xC0; // both signals are present
238 tile.m5() = HasBit(tile.m5(), 5) ? 2 : 1; // track direction (only X or Y)
239 tile.m5() |= 0x40; // RAIL_TILE_SIGNALS
240 break;
241 case 3: // RAIL_TILE_DEPOT
242 tile.m2() = 0;
243 break;
244 default:
245 return false;
246 }
247 break;
248
249 case MP_ROAD: // road (depot) or level crossing
250 switch (GB(tile.m5(), 4, 4)) {
251 case 0: // ROAD_TILE_NORMAL
252 if (tile.m2() == 4) tile.m2() = 5; // 'small trees' -> ROADSIDE_TREES
253 break;
254 case 1: // ROAD_TILE_CROSSING (there aren't monorail crossings in TTO)
255 tile.m3() = tile.m1(); // set owner of road = owner of rail
256 break;
257 case 2: // ROAD_TILE_DEPOT
258 break;
259 default:
260 return false;
261 }
262 break;
263
264 case MP_HOUSE:
265 tile.m3() = tile.m2() & 0xC0; // construction stage
266 tile.m2() &= 0x3F; // building type
267 if (tile.m2() >= 5) tile.m2()++; // skip "large office block on snow"
268 break;
269
270 case MP_TREES:
271 tile.m3() = GB(tile.m5(), 3, 3); // type of trees
272 tile.m5() &= 0xC7; // number of trees and growth status
273 break;
274
275 case MP_STATION:
276 tile.m3() = (tile.m5() >= 0x08 && tile.m5() <= 0x0F) ? 1 : 0; // monorail -> 1, others 0 (rail, road, airport, dock)
277 if (tile.m5() >= 8) tile.m5() -= 8; // shift for monorail
278 if (tile.m5() >= 0x42) tile.m5()++; // skip heliport
279 break;
280
281 case MP_WATER:
282 tile.m3() = tile.m2() = 0;
283 break;
284
285 case MP_VOID:
286 tile.m2() = tile.m3() = tile.m5() = 0;
287 break;
288
289 case MP_INDUSTRY:
290 tile.m3() = 0;
291 switch (tile.m5()) {
292 case 0x24: // farm silo
293 tile.m5() = 0x25;
294 break;
295 case 0x25: case 0x27: // farm
296 case 0x28: case 0x29: case 0x2A: case 0x2B: // factory
297 tile.m5()--;
298 break;
299 default:
300 if (tile.m5() >= 0x2C) tile.m5() += 3; // iron ore mine, steel mill or bank
301 break;
302 }
303 break;
304
305 case MP_TUNNELBRIDGE:
306 if (HasBit(tile.m5(), 7)) { // bridge
307 byte m5 = tile.m5();
308 tile.m5() = m5 & 0xE1; // copy bits 7..5, 1
309 if (GB(m5, 1, 2) == 1) tile.m5() |= 0x02; // road bridge
310 if (GB(m5, 1, 2) == 3) tile.m2() |= 0xA0; // monorail bridge -> tubular, steel bridge
311 if (!HasBit(m5, 6)) { // bridge head
312 tile.m3() = (GB(m5, 1, 2) == 3) ? 1 : 0; // track subtype (1 for monorail, 0 for others)
313 } else { // middle bridge part
314 tile.m3() = HasBit(m5, 2) ? 0x10 : 0; // track subtype on bridge
315 if (GB(m5, 3, 2) == 3) tile.m3() |= 1; // track subtype under bridge
316 if (GB(m5, 3, 2) == 1) tile.m5() |= 0x08; // set for road/water under (0 for rail/clear)
317 }
318 } else { // tunnel entrance/exit
319 tile.m2() = 0;
320 tile.m3() = HasBit(tile.m5(), 3); // monorail
321 tile.m5() &= HasBit(tile.m5(), 3) ? 0x03 : 0x07 ; // direction, transport type (== 0 for rail)
322 }
323 break;
324
325 case MP_OBJECT:
326 tile.m2() = 0;
327 tile.m3() = 0;
328 break;
329
330 default:
331 return false;
332
333 }
334 }
335
336 FixOldMapArray();
337
338 return true;
339 }
340
341 static Engine *_old_engines;
342
343 static bool FixTTOEngines()
344 {
346 static const EngineID ttd_to_tto[] = {
347 0, 255, 255, 255, 255, 255, 255, 255, 5, 7, 8, 9, 10, 11, 12, 13,
348 255, 255, 255, 255, 255, 255, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
349 25, 26, 27, 29, 28, 30, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
350 255, 255, 255, 255, 255, 255, 255, 31, 255, 32, 33, 34, 35, 36, 37, 38,
351 39, 40, 41, 42, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
352 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
353 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
354 255, 255, 255, 255, 44, 45, 46, 255, 255, 255, 255, 47, 48, 255, 49, 50,
355 255, 255, 255, 255, 51, 52, 255, 53, 54, 255, 55, 56, 255, 57, 59, 255,
356 58, 60, 255, 61, 62, 255, 63, 64, 255, 65, 66, 255, 255, 255, 255, 255,
357 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
358 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
359 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 67, 68, 69, 70,
360 71, 255, 255, 76, 77, 255, 255, 78, 79, 80, 81, 82, 83, 84, 85, 86,
361 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 255,
362 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 102, 255, 255
363 };
364
366 static const EngineID tto_to_ttd[] = {
367 0, 0, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 15, 15, 22,
368 23, 24, 25, 26, 27, 29, 28, 30, 31, 32, 33, 34, 35, 36, 37, 55,
369 57, 59, 58, 60, 61, 62, 63, 64, 65, 66, 67, 116, 116, 117, 118, 123,
370 124, 126, 127, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145, 147, 148, 150,
371 151, 153, 154, 204, 205, 206, 207, 208, 211, 212, 211, 212, 211, 212, 215, 216,
372 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
373 233, 234, 235, 236, 237, 238, 253
374 };
375
376 for (Vehicle *v : Vehicle::Iterate()) {
377 if (v->engine_type >= lengthof(tto_to_ttd)) return false;
378 v->engine_type = tto_to_ttd[v->engine_type];
379 }
380
381 /* Load the default engine set. Many of them will be overridden later */
382 {
383 uint j = 0;
384 for (uint i = 0; i < lengthof(_orig_rail_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_TRAIN, i);
385 for (uint i = 0; i < lengthof(_orig_road_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_ROAD, i);
386 for (uint i = 0; i < lengthof(_orig_ship_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_SHIP, i);
387 for (uint i = 0; i < lengthof(_orig_aircraft_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_AIRCRAFT, i);
388 }
389
390 TimerGameCalendar::Date aging_date = std::min(TimerGameCalendar::date + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::ConvertYMDToDate(2050, 0, 1));
391 TimerGameCalendar::YearMonthDay aging_ymd = TimerGameCalendar::ConvertDateToYMD(aging_date);
392
393 for (EngineID i = 0; i < 256; i++) {
394 int oi = ttd_to_tto[i];
395 Engine *e = GetTempDataEngine(i);
396
397 if (oi == 255) {
398 /* Default engine is used */
399 TimerGameCalendar::date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
400 StartupOneEngine(e, aging_ymd, 0);
401 CalcEngineReliability(e, false);
402 e->intro_date -= CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
403 TimerGameCalendar::date -= CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
404
405 /* Make sure for example monorail and maglev are available when they should be */
406 if (TimerGameCalendar::date >= e->intro_date && HasBit(e->info.climates, 0)) {
407 e->flags |= ENGINE_AVAILABLE;
408 e->company_avail = MAX_UVALUE(CompanyMask);
409 e->age = TimerGameCalendar::date > e->intro_date ? (TimerGameCalendar::date - e->intro_date).base() / 30 : 0;
410 }
411 } else {
412 /* Using data from TTO savegame */
413 Engine *oe = &_old_engines[oi];
414
415 e->intro_date = oe->intro_date;
416 e->age = oe->age;
417 e->reliability = oe->reliability;
418 e->reliability_spd_dec = oe->reliability_spd_dec;
419 e->reliability_start = oe->reliability_start;
420 e->reliability_max = oe->reliability_max;
421 e->reliability_final = oe->reliability_final;
422 e->duration_phase_1 = oe->duration_phase_1;
423 e->duration_phase_2 = oe->duration_phase_2;
424 e->duration_phase_3 = oe->duration_phase_3;
425 e->flags = oe->flags;
426
427 e->company_avail = 0;
428
429 /* One or more engines were remapped to this one. Make this engine available
430 * if at least one of them was available. */
431 for (uint j = 0; j < lengthof(tto_to_ttd); j++) {
432 if (tto_to_ttd[j] == i && _old_engines[j].company_avail != 0) {
433 e->company_avail = MAX_UVALUE(CompanyMask);
434 e->flags |= ENGINE_AVAILABLE;
435 break;
436 }
437 }
438
439 e->info.climates = 1;
440 }
441
442 e->preview_company = INVALID_COMPANY;
443 e->preview_asked = MAX_UVALUE(CompanyMask);
444 e->preview_wait = 0;
445 e->name = std::string{};
446 }
447
448 return true;
449 }
450
451 static void FixTTOCompanies()
452 {
453 for (Company *c : Company::Iterate()) {
454 c->cur_economy.company_value = CalculateCompanyValue(c); // company value history is zeroed
455 }
456 }
457
458 static inline Colours RemapTTOColour(Colours tto)
459 {
461 static const Colours tto_colour_remap[] = {
462 COLOUR_DARK_BLUE, COLOUR_GREY, COLOUR_YELLOW, COLOUR_RED,
463 COLOUR_PURPLE, COLOUR_DARK_GREEN, COLOUR_ORANGE, COLOUR_PALE_GREEN,
464 COLOUR_BLUE, COLOUR_GREEN, COLOUR_CREAM, COLOUR_BROWN,
465 COLOUR_WHITE, COLOUR_LIGHT_BLUE, COLOUR_MAUVE, COLOUR_PINK
466 };
467
468 if ((size_t)tto >= lengthof(tto_colour_remap)) return COLOUR_GREY; // this shouldn't happen
469
470 return tto_colour_remap[tto];
471 }
472
473 static inline uint RemapTownIndex(uint x)
474 {
475 return _savegame_type == SGT_TTO ? (x - 0x264) / 78 : (x - 0x264) / 94;
476 }
477
478 static inline uint RemapOrderIndex(uint x)
479 {
480 return _savegame_type == SGT_TTO ? (x - 0x1AC4) / 2 : (x - 0x1C18) / 2;
481 }
482
483 extern std::vector<TileIndex> _animated_tiles;
484 extern TimeoutTimer<TimerGameTick> _new_competitor_timeout;
485 extern char *_old_name_array;
486
487 static uint32_t _old_town_index;
488 static uint16_t _old_string_id;
489 static uint16_t _old_string_id_2;
490
491 static void ClearOldMap3(TileIndex t)
492 {
493 Tile tile(t);
494 tile.m3() = 0;
495 tile.m4() = 0;
496 }
497
498 static Town *RemapTown(TileIndex fallback)
499 {
500 /* In some cases depots, industries and stations could refer to a missing town. */
501 Town *t = Town::GetIfValid(RemapTownIndex(_old_town_index));
502 if (t == nullptr) {
503 /* In case the town that was refered to does not exist, find the closest.
504 * However, this needs the kd-tree to be present. */
505 RebuildTownKdtree();
506 t = CalcClosestTownFromTile(fallback);
507 }
508 return t;
509 }
510
511 static void ReadTTDPatchFlags()
512 {
513 if (_read_ttdpatch_flags) return;
514
515 _read_ttdpatch_flags = true;
516
517 /* Set default values */
518 _old_vehicle_multiplier = 1;
519 _ttdp_version = 0;
520 _old_extra_chunk_nums = 0;
521 _bump_assert_value = 0;
522
523 if (_savegame_type == SGT_TTO) return;
524
525 /* TTDPatch misuses old map3 (now m3/m4) for flags.. read them! */
526 _old_vehicle_multiplier = Tile(0).m3();
527 /* Somehow.... there was an error in some savegames, so 0 becomes 1
528 * and 1 becomes 2. The rest of the values are okay */
529 if (_old_vehicle_multiplier < 2) _old_vehicle_multiplier++;
530
531 _old_vehicle_names = MallocT<StringID>(_old_vehicle_multiplier * 850);
532
533 /* TTDPatch increases the Vehicle-part in the middle of the game,
534 * so if the multiplier is anything else but 1, the assert fails..
535 * bump the assert value so it doesn't!
536 * (1 multiplier == 850 vehicles
537 * 1 vehicle == 128 bytes */
538 _bump_assert_value = (_old_vehicle_multiplier - 1) * 850 * 128;
539
540 /* The first 17 bytes are used by TTDP1, which translates to the first 9 m3s and first 8 m4s. */
541 for (TileIndex i = 0; i <= 8; i++) { // check tile 0, too
542 Tile tile(i);
543 if (tile.m3() != 0 || (i != 8 && tile.m4() != 0)) _savegame_type = SGT_TTDP1;
544 }
545
546 /* Check if we have a modern TTDPatch savegame (has extra data all around) */
547 Tile ttdp2_header_first(Map::Size() - 3);
548 Tile ttdp2_header_second(Map::Size() - 2);
549 if (ttdp2_header_first.m3() == 'T' && ttdp2_header_first.m4() == 'T' &&
550 ttdp2_header_second.m3() == 'D' && ttdp2_header_second.m4() == 'p') {
551 _savegame_type = SGT_TTDP2;
552 }
553
554 Tile extra_chunk_tile = Tile(_savegame_type == SGT_TTDP2 ? Map::Size() - 1 : 1);
555 _old_extra_chunk_nums = extra_chunk_tile.m3() | extra_chunk_tile.m4() << 8;
556
557 /* Clean the misused places */
558 for (TileIndex i = 0; i < 9; i++) ClearOldMap3(i);
559 for (TileIndex i = TileXY(0, Map::MaxY()); i < Map::Size(); i++) ClearOldMap3(i);
560
561 if (_savegame_type == SGT_TTDP2) Debug(oldloader, 2, "Found TTDPatch game");
562
563 Debug(oldloader, 3, "Vehicle-multiplier is set to {} ({} vehicles)", _old_vehicle_multiplier, _old_vehicle_multiplier * 850);
564 }
565
566 static const OldChunks town_chunk[] = {
567 OCL_SVAR( OC_TILE, Town, xy ),
568 OCL_NULL( 2 ),
569 OCL_SVAR( OC_UINT16, Town, townnametype ),
570 OCL_SVAR( OC_UINT32, Town, townnameparts ),
571 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Town, grow_counter ),
572 OCL_NULL( 1 ),
573 OCL_NULL( 4 ),
574 OCL_NULL( 2 ),
575 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, Town, flags ),
576 OCL_NULL( 10 ),
577
578 OCL_SVAR( OC_INT16, Town, ratings[0] ),
579 OCL_SVAR( OC_INT16, Town, ratings[1] ),
580 OCL_SVAR( OC_INT16, Town, ratings[2] ),
581 OCL_SVAR( OC_INT16, Town, ratings[3] ),
582 OCL_SVAR( OC_INT16, Town, ratings[4] ),
583 OCL_SVAR( OC_INT16, Town, ratings[5] ),
584 OCL_SVAR( OC_INT16, Town, ratings[6] ),
585 OCL_SVAR( OC_INT16, Town, ratings[7] ),
586
587 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16, Town, have_ratings ),
588 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16, Town, statues ),
589 OCL_NULL( 2 ),
590 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Town, time_until_rebuild ),
591 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Town, growth_rate ),
592
593 /* Slots 0 and 2 are passengers and mail respectively for old saves. */
594 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].new_max ),
595 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].new_max ),
596 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].new_act ),
597 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].new_act ),
598 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].old_max ),
599 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].old_max ),
600 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].old_act ),
601 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].old_act ),
602
603 OCL_NULL( 2 ),
604
605 OCL_SVAR( OC_TTD | OC_UINT16, Town, received[TAE_FOOD].new_act ),
606 OCL_SVAR( OC_TTD | OC_UINT16, Town, received[TAE_WATER].new_act ),
607 OCL_SVAR( OC_TTD | OC_UINT16, Town, received[TAE_FOOD].old_act ),
608 OCL_SVAR( OC_TTD | OC_UINT16, Town, received[TAE_WATER].old_act ),
609
610 OCL_SVAR( OC_UINT8, Town, road_build_months ),
611 OCL_SVAR( OC_UINT8, Town, fund_buildings_months ),
612
613 OCL_CNULL( OC_TTD, 8 ),
614
615 OCL_END()
616 };
617
618 static bool LoadOldTown(LoadgameState *ls, int num)
619 {
620 Town *t = new (num) Town();
621 if (!LoadChunk(ls, t, town_chunk)) return false;
622
623 if (t->xy != 0) {
624 if (_savegame_type == SGT_TTO) {
625 /* 0x10B6 is auto-generated name, others are custom names */
626 t->townnametype = t->townnametype == 0x10B6 ? 0x20C1 : t->townnametype + 0x2A00;
627 }
628 } else {
629 delete t;
630 }
631
632 return true;
633 }
634
635 static uint16_t _old_order;
636 static const OldChunks order_chunk[] = {
637 OCL_VAR ( OC_UINT16, 1, &_old_order ),
638 OCL_END()
639 };
640
641 static bool LoadOldOrder(LoadgameState *ls, int num)
642 {
643 if (!LoadChunk(ls, nullptr, order_chunk)) return false;
644
645 Order *o = new (num) Order();
646 o->AssignOrder(UnpackOldOrder(_old_order));
647
648 if (o->IsType(OT_NOTHING)) {
649 delete o;
650 } else {
651 /* Relink the orders to each other (in the orders for one vehicle are behind each other,
652 * with an invalid order (OT_NOTHING) as indication that it is the last order */
653 Order *prev = Order::GetIfValid(num - 1);
654 if (prev != nullptr) prev->next = o;
655 }
656
657 return true;
658 }
659
660 static bool LoadOldAnimTileList(LoadgameState *ls, int)
661 {
662 TileIndex anim_list[256];
663 const OldChunks anim_chunk[] = {
664 OCL_VAR ( OC_TILE, 256, anim_list ),
665 OCL_END ()
666 };
667
668 if (!LoadChunk(ls, nullptr, anim_chunk)) return false;
669
670 /* The first zero in the loaded array indicates the end of the list. */
671 for (int i = 0; i < 256; i++) {
672 if (anim_list[i] == 0) break;
673 _animated_tiles.push_back(anim_list[i]);
674 }
675
676 return true;
677 }
678
679 static const OldChunks depot_chunk[] = {
680 OCL_SVAR( OC_TILE, Depot, xy ),
681 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
682 OCL_END()
683 };
684
685 static bool LoadOldDepot(LoadgameState *ls, int num)
686 {
687 Depot *d = new (num) Depot();
688 if (!LoadChunk(ls, d, depot_chunk)) return false;
689
690 if (d->xy != 0) {
691 d->town = RemapTown(d->xy);
692 } else {
693 delete d;
694 }
695
696 return true;
697 }
698
699 static StationID _current_station_id;
700 static uint16_t _waiting_acceptance;
701 static uint8_t _cargo_source;
702 static uint8_t _cargo_periods;
703
704 static const OldChunks goods_chunk[] = {
705 OCL_VAR ( OC_UINT16, 1, &_waiting_acceptance ),
706 OCL_SVAR( OC_UINT8, GoodsEntry, time_since_pickup ),
707 OCL_SVAR( OC_UINT8, GoodsEntry, rating ),
708 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
709 OCL_VAR ( OC_UINT8, 1, &_cargo_periods ),
710 OCL_SVAR( OC_UINT8, GoodsEntry, last_speed ),
711 OCL_SVAR( OC_UINT8, GoodsEntry, last_age ),
712
713 OCL_END()
714 };
715
716 static bool LoadOldGood(LoadgameState *ls, int num)
717 {
718 /* for TTO games, 12th (num == 11) goods entry is created in the Station constructor */
719 if (_savegame_type == SGT_TTO && num == 11) return true;
720
721 Station *st = Station::Get(_current_station_id);
722 GoodsEntry *ge = &st->goods[num];
723
724 if (!LoadChunk(ls, ge, goods_chunk)) return false;
725
726 SB(ge->status, GoodsEntry::GES_ACCEPTANCE, 1, HasBit(_waiting_acceptance, 15));
727 SB(ge->status, GoodsEntry::GES_RATING, 1, _cargo_source != 0xFF);
728 if (GB(_waiting_acceptance, 0, 12) != 0 && CargoPacket::CanAllocateItem()) {
729 ge->cargo.Append(new CargoPacket(GB(_waiting_acceptance, 0, 12), _cargo_periods, (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, INVALID_TILE, 0),
730 INVALID_STATION);
731 }
732
733 return true;
734 }
735
736 static const OldChunks station_chunk[] = {
737 OCL_SVAR( OC_TILE, Station, xy ),
738 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
739
740 OCL_NULL( 4 ),
741 OCL_SVAR( OC_TILE, Station, train_station.tile ),
742 OCL_SVAR( OC_TILE, Station, airport.tile ),
743 OCL_NULL( 2 ),
744 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Station, train_station.w ),
745
746 OCL_NULL( 1 ),
747 OCL_NULL( 2 ),
748
749 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
750
751 OCL_NULL( 4 ),
752
753 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, Station, had_vehicle_of_type ),
754
755 OCL_CHUNK( 12, LoadOldGood ),
756
757 OCL_SVAR( OC_UINT8, Station, time_since_load ),
758 OCL_SVAR( OC_UINT8, Station, time_since_unload ),
759 OCL_SVAR( OC_UINT8, Station, delete_ctr ),
760 OCL_SVAR( OC_UINT8, Station, owner ),
761 OCL_SVAR( OC_UINT8, Station, facilities ),
762 OCL_SVAR( OC_TTD | OC_UINT8, Station, airport.type ),
763 OCL_SVAR( OC_TTO | OC_FILE_U16 | OC_VAR_U64, Station, airport.flags ),
764 OCL_NULL( 3 ),
765 OCL_CNULL( OC_TTD, 1 ),
766 OCL_SVAR( OC_TTD | OC_FILE_U16 | OC_VAR_U64, Station, airport.flags ),
767 OCL_CNULL( OC_TTD, 2 ),
768 OCL_CNULL( OC_TTD, 4 ),
769
770 OCL_END()
771 };
772
773 static bool LoadOldStation(LoadgameState *ls, int num)
774 {
775 Station *st = new (num) Station();
776 _current_station_id = num;
777
778 if (!LoadChunk(ls, st, station_chunk)) return false;
779
780 if (st->xy != 0) {
781 st->town = RemapTown(st->xy);
782
783 if (_savegame_type == SGT_TTO) {
784 if (IsInsideBS(_old_string_id, 0x180F, 32)) {
785 st->string_id = STR_SV_STNAME + (_old_string_id - 0x180F); // automatic name
786 } else {
787 st->string_id = _old_string_id + 0x2800; // custom name
788 }
789
790 if (HasBit(st->airport.flags, 8)) {
791 st->airport.type = 1; // large airport
792 } else if (HasBit(st->airport.flags, 6)) {
793 st->airport.type = 3; // oil rig
794 } else {
795 st->airport.type = 0; // small airport
796 }
797 } else {
798 st->string_id = RemapOldStringID(_old_string_id);
799 }
800 } else {
801 delete st;
802 }
803
804 return true;
805 }
806
807 static const OldChunks industry_chunk[] = {
808 OCL_SVAR( OC_TILE, Industry, location.tile ),
809 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
810 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Industry, location.w ),
811 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Industry, location.h ),
812 OCL_NULL( 2 ),
813
814 OCL_SVAR( OC_TTD | OC_UINT16, Industry, produced[0].waiting ),
815 OCL_SVAR( OC_TTD | OC_UINT16, Industry, produced[1].waiting ),
816 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Industry, produced[0].waiting ),
817 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Industry, produced[1].waiting ),
818
819 OCL_SVAR( OC_UINT8, Industry, produced[0].rate ),
820 OCL_SVAR( OC_UINT8, Industry, produced[1].rate ),
821
822 OCL_NULL( 3 ),
823
824 OCL_SVAR( OC_UINT8, Industry, prod_level ),
825
826 OCL_SVAR( OC_UINT16, Industry, produced[0].history[THIS_MONTH].production ),
827 OCL_SVAR( OC_UINT16, Industry, produced[1].history[THIS_MONTH].production ),
828 OCL_SVAR( OC_UINT16, Industry, produced[0].history[THIS_MONTH].transported ),
829 OCL_SVAR( OC_UINT16, Industry, produced[1].history[THIS_MONTH].transported ),
830
831 OCL_NULL( 2 ),
832
833 OCL_SVAR( OC_UINT16, Industry, produced[0].history[LAST_MONTH].production ),
834 OCL_SVAR( OC_UINT16, Industry, produced[1].history[LAST_MONTH].production ),
835 OCL_SVAR( OC_UINT16, Industry, produced[0].history[LAST_MONTH].transported ),
836 OCL_SVAR( OC_UINT16, Industry, produced[1].history[LAST_MONTH].transported ),
837
838 OCL_SVAR( OC_UINT8, Industry, type ),
839 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Industry, counter ),
840 OCL_SVAR( OC_UINT8, Industry, owner ),
841 OCL_SVAR( OC_UINT8, Industry, random_colour ),
842 OCL_SVAR( OC_TTD | OC_FILE_U8 | OC_VAR_I32, Industry, last_prod_year ),
843 OCL_SVAR( OC_TTD | OC_UINT16, Industry, counter ),
844 OCL_SVAR( OC_TTD | OC_UINT8, Industry, was_cargo_delivered ),
845
846 OCL_CNULL( OC_TTD, 9 ),
847
848 OCL_END()
849 };
850
851 static bool LoadOldIndustry(LoadgameState *ls, int num)
852 {
853 Industry *i = new (num) Industry();
854 if (!LoadChunk(ls, i, industry_chunk)) return false;
855
856 if (i->location.tile != 0) {
857 i->town = RemapTown(i->location.tile);
858
859 if (_savegame_type == SGT_TTO) {
860 if (i->type > 0x06) i->type++; // Printing Works were added
861 if (i->type == 0x0A) i->type = 0x12; // Iron Ore Mine has different ID
862
863 TimerGameEconomy::YearMonthDay ymd = TimerGameEconomy::ConvertDateToYMD(TimerGameEconomy::date);
864 i->last_prod_year = ymd.year;
865
866 i->random_colour = RemapTTOColour(i->random_colour);
867 }
868
869 Industry::IncIndustryTypeCount(i->type);
870 } else {
871 delete i;
872 }
873
874 return true;
875 }
876
877 static CompanyID _current_company_id;
878 static int32_t _old_yearly;
879
880 static const OldChunks _company_yearly_chunk[] = {
881 OCL_VAR( OC_INT32, 1, &_old_yearly ),
882 OCL_END()
883 };
884
885 static bool LoadOldCompanyYearly(LoadgameState *ls, int num)
886 {
887 Company *c = Company::Get(_current_company_id);
888
889 for (uint i = 0; i < 13; i++) {
890 if (_savegame_type == SGT_TTO && i == 6) {
891 _old_yearly = 0; // property maintenance
892 } else {
893 if (!LoadChunk(ls, nullptr, _company_yearly_chunk)) return false;
894 }
895
896 c->yearly_expenses[num][i] = _old_yearly;
897 }
898
899 return true;
900 }
901
902 static const OldChunks _company_economy_chunk[] = {
903 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, CompanyEconomyEntry, income ),
904 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, CompanyEconomyEntry, expenses ),
905 OCL_SVAR( OC_INT32, CompanyEconomyEntry, delivered_cargo[NUM_CARGO - 1] ),
906 OCL_SVAR( OC_INT32, CompanyEconomyEntry, performance_history ),
907 OCL_SVAR( OC_TTD | OC_FILE_I32 | OC_VAR_I64, CompanyEconomyEntry, company_value ),
908
909 OCL_END()
910 };
911
912 static bool LoadOldCompanyEconomy(LoadgameState *ls, int)
913 {
914 Company *c = Company::Get(_current_company_id);
915
916 if (!LoadChunk(ls, &c->cur_economy, _company_economy_chunk)) return false;
917
918 /* Don't ask, but the number in TTD(Patch) are inversed to OpenTTD */
919 c->cur_economy.income = -c->cur_economy.income;
920 c->cur_economy.expenses = -c->cur_economy.expenses;
921
922 for (uint i = 0; i < 24; i++) {
923 if (!LoadChunk(ls, &c->old_economy[i], _company_economy_chunk)) return false;
924
925 c->old_economy[i].income = -c->old_economy[i].income;
926 c->old_economy[i].expenses = -c->old_economy[i].expenses;
927 }
928
929 return true;
930 }
931
932 static const OldChunks _company_chunk[] = {
933 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
934 OCL_SVAR( OC_UINT32, Company, name_2 ),
935 OCL_SVAR( OC_UINT32, Company, face ),
936 OCL_VAR ( OC_UINT16, 1, &_old_string_id_2 ),
937 OCL_SVAR( OC_UINT32, Company, president_name_2 ),
938
939 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Company, money ),
940 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Company, current_loan ),
941
942 OCL_SVAR( OC_UINT8, Company, colour ),
943 OCL_SVAR( OC_UINT8, Company, money_fraction ),
944 OCL_SVAR( OC_UINT8, Company, months_of_bankruptcy ),
945 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Company, bankrupt_asked ),
946 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64, Company, bankrupt_value ),
947 OCL_SVAR( OC_UINT16, Company, bankrupt_timeout ),
948
949 OCL_CNULL( OC_TTD, 4 ), // cargo_types
950 OCL_CNULL( OC_TTO, 2 ), // cargo_types
951
952 OCL_CHUNK( 3, LoadOldCompanyYearly ),
953 OCL_CHUNK( 1, LoadOldCompanyEconomy ),
954
955 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Company, inaugurated_year),
956 OCL_SVAR( OC_TILE, Company, last_build_coordinate ),
957 OCL_SVAR( OC_UINT8, Company, num_valid_stat_ent ),
958
959 OCL_NULL( 230 ), // Old AI
960
961 OCL_SVAR( OC_UINT8, Company, block_preview ),
962 OCL_CNULL( OC_TTD, 1 ), // Old AI
963 OCL_CNULL( OC_TTD, 1 ), // avail_railtypes
964 OCL_SVAR( OC_TILE, Company, location_of_HQ ),
965
966 OCL_CNULL( OC_TTD, 4 ), // Shares
967
968 OCL_CNULL( OC_TTD, 8 ), // junk at end of chunk
969
970 OCL_END()
971 };
972
973 static bool LoadOldCompany(LoadgameState *ls, int num)
974 {
975 Company *c = new (num) Company();
976
977 _current_company_id = (CompanyID)num;
978
979 if (!LoadChunk(ls, c, _company_chunk)) return false;
980
981 if (_old_string_id == 0) {
982 delete c;
983 return true;
984 }
985
986 if (_savegame_type == SGT_TTO) {
987 /* adjust manager's face */
988 if (HasBit(c->face, 27) && GB(c->face, 26, 1) == GB(c->face, 19, 1)) {
989 /* if face would be black in TTD, adjust tie colour and thereby face colour */
990 ClrBit(c->face, 27);
991 }
992
993 /* Company name */
994 if (_old_string_id == 0 || _old_string_id == 0x4C00) {
995 _old_string_id = STR_SV_UNNAMED; // "Unnamed"
996 } else if (GB(_old_string_id, 8, 8) == 0x52) {
997 _old_string_id += 0x2A00; // Custom name
998 } else {
999 _old_string_id = RemapOldStringID(_old_string_id += 0x240D); // Automatic name
1000 }
1001 c->name_1 = _old_string_id;
1002
1003 /* Manager name */
1004 switch (_old_string_id_2) {
1005 case 0x4CDA: _old_string_id_2 = SPECSTR_PRESIDENT_NAME; break; // automatic name
1006 case 0x0006: _old_string_id_2 = STR_SV_EMPTY; break; // empty name
1007 default: _old_string_id_2 = _old_string_id_2 + 0x2A00; break; // custom name
1008 }
1009 c->president_name_1 = _old_string_id_2;
1010
1011 c->colour = RemapTTOColour(c->colour);
1012
1013 if (num != 0) c->is_ai = true;
1014 } else {
1015 c->name_1 = RemapOldStringID(_old_string_id);
1016 c->president_name_1 = RemapOldStringID(_old_string_id_2);
1017
1018 if (num == 0) {
1019 /* If the first company has no name, make sure we call it UNNAMED */
1020 if (c->name_1 == 0) {
1021 c->name_1 = STR_SV_UNNAMED;
1022 }
1023 } else {
1024 /* Beside some multiplayer maps (1 on 1), which we don't official support,
1025 * all other companies are an AI.. mark them as such */
1026 c->is_ai = true;
1027 }
1028
1029 /* Sometimes it is better to not ask.. in old scenarios, the money
1030 * was always 893288 pounds. In the newer versions this is correct,
1031 * but correct for those oldies
1032 * Ps: this also means that if you had exact 893288 pounds, you will go back
1033 * to 100000.. this is a very VERY small chance ;) */
1034 if (c->money == 893288) c->money = c->current_loan = 100000;
1035 }
1036
1037 _company_colours[num] = c->colour;
1038 c->inaugurated_year -= EconomyTime::ORIGINAL_BASE_YEAR;
1039
1040 return true;
1041 }
1042
1043 static uint32_t _old_order_ptr;
1044 static uint16_t _old_next_ptr;
1045 static VehicleID _current_vehicle_id;
1046
1047 static const OldChunks vehicle_train_chunk[] = {
1048 OCL_SVAR( OC_UINT8, Train, track ),
1049 OCL_SVAR( OC_UINT8, Train, force_proceed ),
1050 OCL_SVAR( OC_UINT16, Train, crash_anim_pos ),
1051 OCL_SVAR( OC_UINT8, Train, railtype ),
1052
1053 OCL_NULL( 5 ),
1054
1055 OCL_END()
1056 };
1057
1058 static const OldChunks vehicle_road_chunk[] = {
1059 OCL_SVAR( OC_UINT8, RoadVehicle, state ),
1060 OCL_SVAR( OC_UINT8, RoadVehicle, frame ),
1061 OCL_SVAR( OC_UINT16, RoadVehicle, blocked_ctr ),
1062 OCL_SVAR( OC_UINT8, RoadVehicle, overtaking ),
1063 OCL_SVAR( OC_UINT8, RoadVehicle, overtaking_ctr ),
1064 OCL_SVAR( OC_UINT16, RoadVehicle, crashed_ctr ),
1065 OCL_SVAR( OC_UINT8, RoadVehicle, reverse_ctr ),
1066
1067 OCL_NULL( 1 ),
1068
1069 OCL_END()
1070 };
1071
1072 static const OldChunks vehicle_ship_chunk[] = {
1073 OCL_SVAR( OC_UINT8, Ship, state ),
1074
1075 OCL_NULL( 9 ),
1076
1077 OCL_END()
1078 };
1079
1080 static const OldChunks vehicle_air_chunk[] = {
1081 OCL_SVAR( OC_UINT8, Aircraft, pos ),
1082 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Aircraft, targetairport ),
1083 OCL_SVAR( OC_UINT16, Aircraft, crashed_counter ),
1084 OCL_SVAR( OC_UINT8, Aircraft, state ),
1085
1086 OCL_NULL( 5 ),
1087
1088 OCL_END()
1089 };
1090
1091 static const OldChunks vehicle_effect_chunk[] = {
1092 OCL_SVAR( OC_UINT16, EffectVehicle, animation_state ),
1093 OCL_SVAR( OC_UINT8, EffectVehicle, animation_substate ),
1094
1095 OCL_NULL( 7 ), // Junk
1096
1097 OCL_END()
1098 };
1099
1100 static const OldChunks vehicle_disaster_chunk[] = {
1101 OCL_SVAR( OC_UINT16, DisasterVehicle, image_override ),
1102 OCL_SVAR( OC_UINT16, DisasterVehicle, big_ufo_destroyer_target ),
1103
1104 OCL_NULL( 6 ),
1105
1106 OCL_END()
1107 };
1108
1109 static const OldChunks vehicle_empty_chunk[] = {
1110 OCL_NULL( 10 ),
1111
1112 OCL_END()
1113 };
1114
1115 static bool LoadOldVehicleUnion(LoadgameState *ls, int)
1116 {
1117 Vehicle *v = Vehicle::GetIfValid(_current_vehicle_id);
1118 uint temp = ls->total_read;
1119 bool res;
1120
1121 if (v == nullptr) {
1122 res = LoadChunk(ls, nullptr, vehicle_empty_chunk);
1123 } else {
1124 switch (v->type) {
1125 default: SlErrorCorrupt("Invalid vehicle type");
1126 case VEH_TRAIN : res = LoadChunk(ls, v, vehicle_train_chunk); break;
1127 case VEH_ROAD : res = LoadChunk(ls, v, vehicle_road_chunk); break;
1128 case VEH_SHIP : res = LoadChunk(ls, v, vehicle_ship_chunk); break;
1129 case VEH_AIRCRAFT: res = LoadChunk(ls, v, vehicle_air_chunk); break;
1130 case VEH_EFFECT : res = LoadChunk(ls, v, vehicle_effect_chunk); break;
1131 case VEH_DISASTER: res = LoadChunk(ls, v, vehicle_disaster_chunk); break;
1132 }
1133 }
1134
1135 /* This chunk size should always be 10 bytes */
1136 if (ls->total_read - temp != 10) {
1137 Debug(oldloader, 0, "Assert failed in VehicleUnion: invalid chunk size");
1138 return false;
1139 }
1140
1141 return res;
1142 }
1143
1144 static uint16_t _cargo_count;
1145
1146 static const OldChunks vehicle_chunk[] = {
1147 OCL_SVAR( OC_UINT8, Vehicle, subtype ),
1148
1149 OCL_NULL( 2 ),
1150 OCL_NULL( 2 ),
1151
1152 OCL_VAR ( OC_UINT32, 1, &_old_order_ptr ),
1153 OCL_VAR ( OC_UINT16, 1, &_old_order ),
1154
1155 OCL_NULL ( 1 ),
1156 OCL_SVAR( OC_UINT8, Vehicle, cur_implicit_order_index ),
1157 OCL_SVAR( OC_TILE, Vehicle, dest_tile ),
1158 OCL_SVAR( OC_UINT16, Vehicle, load_unload_ticks ),
1159 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, date_of_last_service ),
1160 OCL_SVAR( OC_UINT16, Vehicle, service_interval ),
1161 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Vehicle, last_station_visited ),
1162 OCL_SVAR( OC_TTD | OC_UINT8, Vehicle, tick_counter ),
1163 OCL_CNULL( OC_TTD, 2 ),
1164 OCL_CNULL( OC_TTO, 1 ),
1165
1166 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Vehicle, x_pos ),
1167 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Vehicle, y_pos ),
1168 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32, Vehicle, z_pos ),
1169 OCL_SVAR( OC_UINT8, Vehicle, direction ),
1170 OCL_NULL( 2 ),
1171 OCL_NULL( 2 ),
1172 OCL_NULL( 1 ),
1173
1174 OCL_SVAR( OC_UINT8, Vehicle, owner ),
1175 OCL_SVAR( OC_TILE, Vehicle, tile ),
1176 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, sprite_cache.sprite_seq.seq[0].sprite ),
1177
1178 OCL_NULL( 8 ),
1179
1180 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, Vehicle, vehstatus ),
1181 OCL_SVAR( OC_TTD | OC_UINT16, Vehicle, cur_speed ),
1182 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Vehicle, cur_speed ),
1183 OCL_SVAR( OC_UINT8, Vehicle, subspeed ),
1184 OCL_SVAR( OC_UINT8, Vehicle, acceleration ),
1185 OCL_SVAR( OC_UINT8, Vehicle, progress ),
1186
1187 OCL_SVAR( OC_UINT8, Vehicle, cargo_type ),
1188 OCL_SVAR( OC_TTD | OC_UINT16, Vehicle, cargo_cap ),
1189 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Vehicle, cargo_cap ),
1190 OCL_VAR ( OC_TTD | OC_UINT16, 1, &_cargo_count ),
1191 OCL_VAR ( OC_TTO | OC_FILE_U8 | OC_VAR_U16, 1, &_cargo_count ),
1192 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
1193 OCL_VAR ( OC_UINT8, 1, &_cargo_periods ),
1194
1195 OCL_SVAR( OC_TTO | OC_UINT8, Vehicle, tick_counter ),
1196
1197 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, age ),
1198 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Vehicle, max_age ),
1199 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32, Vehicle, build_year ),
1200 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Vehicle, unitnumber ),
1201
1202 OCL_SVAR( OC_TTD | OC_UINT16, Vehicle, engine_type ),
1203 OCL_SVAR( OC_TTO | OC_FILE_U8 | OC_VAR_U16, Vehicle, engine_type ),
1204
1205 OCL_SVAR( OC_UINT8, Vehicle, spritenum ),
1206 OCL_SVAR( OC_UINT8, Vehicle, day_counter ),
1207
1208 OCL_SVAR( OC_UINT8, Vehicle, breakdowns_since_last_service ),
1209 OCL_SVAR( OC_UINT8, Vehicle, breakdown_ctr ),
1210 OCL_SVAR( OC_UINT8, Vehicle, breakdown_delay ),
1211 OCL_SVAR( OC_UINT8, Vehicle, breakdown_chance ),
1212
1213 OCL_CNULL( OC_TTO, 1 ),
1214
1215 OCL_SVAR( OC_UINT16, Vehicle, reliability ),
1216 OCL_SVAR( OC_UINT16, Vehicle, reliability_spd_dec ),
1217
1218 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Vehicle, profit_this_year ),
1219 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64, Vehicle, profit_last_year ),
1220
1221 OCL_VAR ( OC_UINT16, 1, &_old_next_ptr ),
1222
1223 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64, Vehicle, value ),
1224
1225 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1226
1227 OCL_CHUNK( 1, LoadOldVehicleUnion ),
1228
1229 OCL_CNULL( OC_TTO, 24 ),
1230 OCL_CNULL( OC_TTD, 20 ),
1231
1232 OCL_END()
1233 };
1234
1241 bool LoadOldVehicle(LoadgameState *ls, int num)
1242 {
1243 /* Read the TTDPatch flags, because we need some info from it */
1244 ReadTTDPatchFlags();
1245
1246 for (uint i = 0; i < _old_vehicle_multiplier; i++) {
1247 _current_vehicle_id = num * _old_vehicle_multiplier + i;
1248
1249 Vehicle *v;
1250
1251 if (_savegame_type == SGT_TTO) {
1252 uint type = ReadByte(ls);
1253 switch (type) {
1254 default: return false;
1255 case 0x00 /* VEH_INVALID */: v = nullptr; break;
1256 case 0x25 /* MONORAIL */:
1257 case 0x20 /* VEH_TRAIN */: v = new (_current_vehicle_id) Train(); break;
1258 case 0x21 /* VEH_ROAD */: v = new (_current_vehicle_id) RoadVehicle(); break;
1259 case 0x22 /* VEH_SHIP */: v = new (_current_vehicle_id) Ship(); break;
1260 case 0x23 /* VEH_AIRCRAFT */: v = new (_current_vehicle_id) Aircraft(); break;
1261 case 0x24 /* VEH_EFFECT */: v = new (_current_vehicle_id) EffectVehicle(); break;
1262 case 0x26 /* VEH_DISASTER */: v = new (_current_vehicle_id) DisasterVehicle(); break;
1263 }
1264
1265 if (!LoadChunk(ls, v, vehicle_chunk)) return false;
1266 if (v == nullptr) continue;
1267 v->refit_cap = v->cargo_cap;
1268
1269 SpriteID sprite = v->sprite_cache.sprite_seq.seq[0].sprite;
1270 /* no need to override other sprites */
1271 if (IsInsideMM(sprite, 1460, 1465)) {
1272 sprite += 580; // aircraft smoke puff
1273 } else if (IsInsideMM(sprite, 2096, 2115)) {
1274 sprite += 977; // special effects part 1
1275 } else if (IsInsideMM(sprite, 2396, 2436)) {
1276 sprite += 1305; // special effects part 2
1277 } else if (IsInsideMM(sprite, 2516, 2539)) {
1278 sprite += 1385; // rotor or disaster-related vehicles
1279 }
1280 v->sprite_cache.sprite_seq.seq[0].sprite = sprite;
1281
1282 switch (v->type) {
1283 case VEH_TRAIN: {
1284 static const byte spriteset_rail[] = {
1285 0, 2, 4, 4, 8, 10, 12, 14, 16, 18, 20, 22, 40, 42, 44, 46,
1286 48, 52, 54, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 120, 122,
1287 124, 126, 128, 130, 132, 134, 136, 138, 140
1288 };
1289 if (v->spritenum / 2 >= lengthof(spriteset_rail)) return false;
1290 v->spritenum = spriteset_rail[v->spritenum / 2]; // adjust railway sprite set offset
1291 /* Should be the original values for monorail / rail, can't use RailType constants */
1292 Train::From(v)->railtype = static_cast<RailType>(type == 0x25 ? 1 : 0);
1293 break;
1294 }
1295
1296 case VEH_ROAD:
1297 if (v->spritenum >= 22) v->spritenum += 12;
1298 break;
1299
1300 case VEH_SHIP:
1301 v->spritenum += 2;
1302
1303 switch (v->spritenum) {
1304 case 2: // oil tanker && cargo type != oil
1305 if (v->cargo_type != 3) v->spritenum = 0; // make it a coal/goods ship
1306 break;
1307 case 4: // passenger ship && cargo type == mail
1308 if (v->cargo_type == 2) v->spritenum = 0; // make it a mail ship
1309 break;
1310 default:
1311 break;
1312 }
1313 break;
1314
1315 default:
1316 break;
1317 }
1318
1319 switch (_old_string_id) {
1320 case 0x0000: break; // empty (invalid vehicles)
1321 case 0x0006: _old_string_id = STR_SV_EMPTY; break; // empty (special vehicles)
1322 case 0x8495: _old_string_id = STR_SV_TRAIN_NAME; break; // "Train X"
1323 case 0x8842: _old_string_id = STR_SV_ROAD_VEHICLE_NAME; break; // "Road Vehicle X"
1324 case 0x8C3B: _old_string_id = STR_SV_SHIP_NAME; break; // "Ship X"
1325 case 0x9047: _old_string_id = STR_SV_AIRCRAFT_NAME; break; // "Aircraft X"
1326 default: _old_string_id += 0x2A00; break; // custom name
1327 }
1328
1329 _old_vehicle_names[_current_vehicle_id] = _old_string_id;
1330 } else {
1331 /* Read the vehicle type and allocate the right vehicle */
1332 switch (ReadByte(ls)) {
1333 default: SlErrorCorrupt("Invalid vehicle type");
1334 case 0x00 /* VEH_INVALID */: v = nullptr; break;
1335 case 0x10 /* VEH_TRAIN */: v = new (_current_vehicle_id) Train(); break;
1336 case 0x11 /* VEH_ROAD */: v = new (_current_vehicle_id) RoadVehicle(); break;
1337 case 0x12 /* VEH_SHIP */: v = new (_current_vehicle_id) Ship(); break;
1338 case 0x13 /* VEH_AIRCRAFT*/: v = new (_current_vehicle_id) Aircraft(); break;
1339 case 0x14 /* VEH_EFFECT */: v = new (_current_vehicle_id) EffectVehicle(); break;
1340 case 0x15 /* VEH_DISASTER*/: v = new (_current_vehicle_id) DisasterVehicle(); break;
1341 }
1342
1343 if (!LoadChunk(ls, v, vehicle_chunk)) return false;
1344 if (v == nullptr) continue;
1345
1346 _old_vehicle_names[_current_vehicle_id] = RemapOldStringID(_old_string_id);
1347
1348 /* This should be consistent, else we have a big problem... */
1349 if (v->index != _current_vehicle_id) {
1350 Debug(oldloader, 0, "Loading failed - vehicle-array is invalid");
1351 return false;
1352 }
1353 }
1354
1355 if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
1356 uint max = _savegame_type == SGT_TTO ? 3000 : 5000;
1357 uint old_id = RemapOrderIndex(_old_order_ptr);
1358 if (old_id < max) v->old_orders = Order::Get(old_id); // don't accept orders > max number of orders
1359 }
1360 v->current_order.AssignOrder(UnpackOldOrder(_old_order));
1361
1362 if (v->type == VEH_DISASTER) {
1363 DisasterVehicle::From(v)->state = UnpackOldOrder(_old_order).GetDestination();
1364 }
1365
1366 v->next = (Vehicle *)(size_t)_old_next_ptr;
1367
1368 if (_cargo_count != 0 && CargoPacket::CanAllocateItem()) {
1369 StationID source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
1370 TileIndex source_xy = (source != INVALID_STATION) ? Station::Get(source)->xy : (TileIndex)0;
1371 v->cargo.Append(new CargoPacket(_cargo_count, _cargo_periods, source, source_xy, 0));
1372 }
1373 }
1374
1375 return true;
1376 }
1377
1378 static const OldChunks sign_chunk[] = {
1379 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1380 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Sign, x ),
1381 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Sign, y ),
1382 OCL_SVAR( OC_FILE_U16 | OC_VAR_I8, Sign, z ),
1383
1384 OCL_NULL( 6 ),
1385
1386 OCL_END()
1387 };
1388
1389 static bool LoadOldSign(LoadgameState *ls, int num)
1390 {
1391 Sign *si = new (num) Sign();
1392 if (!LoadChunk(ls, si, sign_chunk)) return false;
1393
1394 if (_old_string_id != 0) {
1395 if (_savegame_type == SGT_TTO) {
1396 if (_old_string_id != 0x140A) si->name = CopyFromOldName(_old_string_id + 0x2A00);
1397 } else {
1398 si->name = CopyFromOldName(RemapOldStringID(_old_string_id));
1399 }
1400 si->owner = OWNER_NONE;
1401 } else {
1402 delete si;
1403 }
1404
1405 return true;
1406 }
1407
1408 static const OldChunks engine_chunk[] = {
1409 OCL_SVAR( OC_UINT16, Engine, company_avail ),
1410 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Engine, intro_date ),
1411 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Engine, age ),
1412 OCL_SVAR( OC_UINT16, Engine, reliability ),
1413 OCL_SVAR( OC_UINT16, Engine, reliability_spd_dec ),
1414 OCL_SVAR( OC_UINT16, Engine, reliability_start ),
1415 OCL_SVAR( OC_UINT16, Engine, reliability_max ),
1416 OCL_SVAR( OC_UINT16, Engine, reliability_final ),
1417 OCL_SVAR( OC_UINT16, Engine, duration_phase_1 ),
1418 OCL_SVAR( OC_UINT16, Engine, duration_phase_2 ),
1419 OCL_SVAR( OC_UINT16, Engine, duration_phase_3 ),
1420
1421 OCL_NULL( 1 ), // lifelength
1422 OCL_SVAR( OC_UINT8, Engine, flags ),
1423 OCL_NULL( 1 ), // preview_company_rank
1424 OCL_SVAR( OC_UINT8, Engine, preview_wait ),
1425
1426 OCL_CNULL( OC_TTD, 2 ),
1427
1428 OCL_END()
1429 };
1430
1431 static bool LoadOldEngine(LoadgameState *ls, int num)
1432 {
1433 Engine *e = _savegame_type == SGT_TTO ? &_old_engines[num] : GetTempDataEngine(num);
1434 return LoadChunk(ls, e, engine_chunk);
1435 }
1436
1437 static bool LoadOldEngineName(LoadgameState *ls, int num)
1438 {
1439 Engine *e = GetTempDataEngine(num);
1440 e->name = CopyFromOldName(RemapOldStringID(ReadUint16(ls)));
1441 return true;
1442 }
1443
1444 static const OldChunks subsidy_chunk[] = {
1445 OCL_SVAR( OC_UINT8, Subsidy, cargo_type ),
1446 OCL_SVAR( OC_UINT8, Subsidy, remaining ),
1447 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Subsidy, src ),
1448 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Subsidy, dst ),
1449
1450 OCL_END()
1451 };
1452
1453 static bool LoadOldSubsidy(LoadgameState *ls, int num)
1454 {
1455 Subsidy *s = new (num) Subsidy();
1456 bool ret = LoadChunk(ls, s, subsidy_chunk);
1457 if (!IsValidCargoID(s->cargo_type)) delete s;
1458 return ret;
1459 }
1460
1461 static const OldChunks game_difficulty_chunk[] = {
1462 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, max_no_competitors ),
1463 OCL_NULL( 2), // competitor_start_time
1464 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, number_towns ),
1465 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, industry_density ),
1466 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, DifficultySettings, max_loan ),
1467 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, initial_interest ),
1468 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, vehicle_costs ),
1469 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, competitor_speed ),
1470 OCL_NULL( 2), // competitor_intelligence
1471 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, vehicle_breakdowns ),
1472 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, subsidy_multiplier ),
1473 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, construction_cost ),
1474 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, terrain_type ),
1475 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, quantity_sea_lakes ),
1476 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, economy ),
1477 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, line_reverse_mode ),
1478 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, disasters ),
1479 OCL_END()
1480 };
1481
1482 static bool LoadOldGameDifficulty(LoadgameState *ls, int)
1483 {
1484 bool ret = LoadChunk(ls, &_settings_game.difficulty, game_difficulty_chunk);
1485 _settings_game.difficulty.max_loan *= 1000;
1486 return ret;
1487 }
1488
1489
1490 static bool LoadOldMapPart1(LoadgameState *ls, int)
1491 {
1492 if (_savegame_type == SGT_TTO) {
1493 Map::Allocate(OLD_MAP_SIZE, OLD_MAP_SIZE);
1494 }
1495
1496 for (auto t : Map::Iterate()) {
1497 t.m1() = ReadByte(ls);
1498 }
1499 for (auto t : Map::Iterate()) {
1500 t.m2() = ReadByte(ls);
1501 }
1502
1503 if (_savegame_type != SGT_TTO) {
1504 /* old map3 is split into to m3 and m4 */
1505 for (auto t : Map::Iterate()) {
1506 t.m3() = ReadByte(ls);
1507 t.m4() = ReadByte(ls);
1508 }
1509 auto range = Map::Iterate();
1510 for (auto it = range.begin(); it != range.end(); /* nothing. */) {
1511 byte b = ReadByte(ls);
1512 for (int i = 0; i < 8; i += 2, ++it) (*it).m6() = GB(b, i, 2);
1513 }
1514 }
1515
1516 return true;
1517 }
1518
1519 static bool LoadOldMapPart2(LoadgameState *ls, int)
1520 {
1521 for (auto t : Map::Iterate()) {
1522 t.type() = ReadByte(ls);
1523 }
1524 for (auto t : Map::Iterate()) {
1525 t.m5() = ReadByte(ls);
1526 }
1527
1528 return true;
1529 }
1530
1531 static bool LoadTTDPatchExtraChunks(LoadgameState *ls, int)
1532 {
1533 ReadTTDPatchFlags();
1534
1535 Debug(oldloader, 2, "Found {} extra chunk(s)", _old_extra_chunk_nums);
1536
1537 for (int i = 0; i != _old_extra_chunk_nums; i++) {
1538 uint16_t id = ReadUint16(ls);
1539 uint32_t len = ReadUint32(ls);
1540
1541 switch (id) {
1542 /* List of GRFIDs, used in the savegame. 0x8004 is the new ID
1543 * They are saved in a 'GRFID:4 active:1' format, 5 bytes for each entry */
1544 case 0x2:
1545 case 0x8004: {
1546 /* Skip the first element: TTDP hack for the Action D special variables (FFFF0000 01) */
1547 ReadUint32(ls); ReadByte(ls); len -= 5;
1548
1549 ClearGRFConfigList(&_grfconfig);
1550 while (len != 0) {
1551 uint32_t grfid = ReadUint32(ls);
1552
1553 if (ReadByte(ls) == 1) {
1554 GRFConfig *c = new GRFConfig("TTDP game, no information");
1555 c->ident.grfid = grfid;
1556
1557 AppendToGRFConfigList(&_grfconfig, c);
1558 Debug(oldloader, 3, "TTDPatch game using GRF file with GRFID {:08X}", BSWAP32(c->ident.grfid));
1559 }
1560 len -= 5;
1561 }
1562
1563 /* Append static NewGRF configuration */
1564 AppendStaticGRFConfigs(&_grfconfig);
1565 break;
1566 }
1567
1568 /* TTDPatch version and configuration */
1569 case 0x3:
1570 _ttdp_version = ReadUint32(ls);
1571 Debug(oldloader, 3, "Game saved with TTDPatch version {}.{}.{} r{}",
1572 GB(_ttdp_version, 24, 8), GB(_ttdp_version, 20, 4), GB(_ttdp_version, 16, 4), GB(_ttdp_version, 0, 16));
1573 len -= 4;
1574 while (len-- != 0) ReadByte(ls); // skip the configuration
1575 break;
1576
1577 default:
1578 Debug(oldloader, 4, "Skipping unknown extra chunk {}", id);
1579 while (len-- != 0) ReadByte(ls);
1580 break;
1581 }
1582 }
1583
1584 return true;
1585 }
1586
1587 extern TileIndex _cur_tileloop_tile;
1588 extern uint16_t _disaster_delay;
1589 extern byte _trees_tick_ctr;
1590 extern byte _age_cargo_skip_counter; // From misc_sl.cpp
1591 extern uint8_t _old_diff_level;
1592 extern uint8_t _old_units;
1593 static const OldChunks main_chunk[] = {
1594 OCL_ASSERT( OC_TTD, 0 ),
1595 OCL_ASSERT( OC_TTO, 0 ),
1596 OCL_VAR ( OC_FILE_U16 | OC_VAR_U32, 1, &TimerGameCalendar::date ),
1597 OCL_VAR ( OC_UINT16, 1, &TimerGameCalendar::date_fract ),
1598 OCL_NULL( 600 ),
1599 OCL_VAR ( OC_UINT32, 2, &_random.state ),
1600
1601 OCL_ASSERT( OC_TTD, 0x264 ),
1602 OCL_ASSERT( OC_TTO, 0x264 ),
1603
1604 OCL_CCHUNK( OC_TTD, 70, LoadOldTown ),
1605 OCL_CCHUNK( OC_TTO, 80, LoadOldTown ),
1606
1607 OCL_ASSERT( OC_TTD, 0x1C18 ),
1608 OCL_ASSERT( OC_TTO, 0x1AC4 ),
1609
1610 OCL_CCHUNK( OC_TTD, 5000, LoadOldOrder ),
1611 OCL_CCHUNK( OC_TTO, 3000, LoadOldOrder ),
1612
1613 OCL_ASSERT( OC_TTD, 0x4328 ),
1614 OCL_ASSERT( OC_TTO, 0x3234 ),
1615
1616 OCL_CHUNK( 1, LoadOldAnimTileList ),
1617 OCL_NULL( 4 ),
1618
1619 OCL_ASSERT( OC_TTO, 0x3438 ),
1620
1621 OCL_CCHUNK( OC_TTD, 255, LoadOldDepot ),
1622 OCL_CCHUNK( OC_TTO, 252, LoadOldDepot ),
1623
1624 OCL_ASSERT( OC_TTD, 0x4B26 ),
1625 OCL_ASSERT( OC_TTO, 0x3A20 ),
1626
1627 OCL_NULL( 4 ),
1628 OCL_NULL( 2 ),
1629 OCL_NULL( 2 ),
1630
1631 OCL_VAR ( OC_FILE_U16 | OC_VAR_U8, 1, &_age_cargo_skip_counter ),
1632 OCL_VAR ( OC_FILE_U16 | OC_VAR_U64, 1, &TimerGameTick::counter ),
1633 OCL_VAR ( OC_TILE, 1, &_cur_tileloop_tile ),
1634
1635 OCL_ASSERT( OC_TTO, 0x3A2E ),
1636
1637 OCL_CNULL( OC_TTO, 48 * 6 ),
1638 OCL_CNULL( OC_TTD, 49 * 6 ),
1639
1640 OCL_ASSERT( OC_TTO, 0x3B4E ),
1641
1642 OCL_CNULL( OC_TTO, 11 * 8 ),
1643 OCL_CNULL( OC_TTD, 12 * 8 ),
1644
1645 OCL_ASSERT( OC_TTD, 0x4CBA ),
1646 OCL_ASSERT( OC_TTO, 0x3BA6 ),
1647
1648 OCL_CHUNK( 1, LoadOldMapPart1 ),
1649
1650 OCL_ASSERT( OC_TTD, 0x48CBA ),
1651 OCL_ASSERT( OC_TTO, 0x23BA6 ),
1652
1653 OCL_CCHUNK( OC_TTD, 250, LoadOldStation ),
1654 OCL_CCHUNK( OC_TTO, 200, LoadOldStation ),
1655
1656 OCL_ASSERT( OC_TTO, 0x29E16 ),
1657
1658 OCL_CCHUNK( OC_TTD, 90, LoadOldIndustry ),
1659 OCL_CCHUNK( OC_TTO, 100, LoadOldIndustry ),
1660
1661 OCL_ASSERT( OC_TTO, 0x2ADB6 ),
1662
1663 OCL_CHUNK( 8, LoadOldCompany ),
1664
1665 OCL_ASSERT( OC_TTD, 0x547F2 ),
1666 OCL_ASSERT( OC_TTO, 0x2C746 ),
1667
1668 OCL_CCHUNK( OC_TTD, 850, LoadOldVehicle ),
1669 OCL_CCHUNK( OC_TTO, 800, LoadOldVehicle ),
1670
1671 OCL_ASSERT( OC_TTD, 0x6F0F2 ),
1672 OCL_ASSERT( OC_TTO, 0x45746 ),
1673
1674 OCL_VAR ( OC_TTD | OC_UINT8 | OC_DEREFERENCE_POINTER, 32 * 500, &_old_name_array ),
1675 OCL_VAR ( OC_TTO | OC_UINT8 | OC_DEREFERENCE_POINTER, 24 * 200, &_old_name_array ),
1676
1677 OCL_ASSERT( OC_TTO, 0x46A06 ),
1678
1679 OCL_NULL( 0x2000 ),
1680
1681 OCL_CHUNK( 40, LoadOldSign ),
1682
1683 OCL_ASSERT( OC_TTO, 0x48C36 ),
1684
1685 OCL_CCHUNK( OC_TTD, 256, LoadOldEngine ),
1686 OCL_CCHUNK( OC_TTO, 103, LoadOldEngine ),
1687
1688 OCL_ASSERT( OC_TTO, 0x496AC ),
1689
1690 OCL_NULL ( 2 ), // _vehicle_id_ctr_day
1691
1692 OCL_CHUNK( 8, LoadOldSubsidy ),
1693
1694 OCL_ASSERT( OC_TTO, 0x496CE ),
1695
1696 OCL_VAR ( OC_FILE_U16 | OC_VAR_U32, 1, &_new_competitor_timeout.period ),
1697
1698 OCL_CNULL( OC_TTO, 2 ),
1699
1700 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_x ),
1701 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_y ),
1702 OCL_VAR ( OC_FILE_U16 | OC_VAR_U8, 1, &_saved_scrollpos_zoom ),
1703
1704 OCL_NULL( 4 ),
1705 OCL_VAR ( OC_FILE_U32 | OC_VAR_I64, 1, &_economy.old_max_loan_unround ),
1706 OCL_VAR ( OC_INT16, 1, &_economy.fluct ),
1707
1708 OCL_VAR ( OC_UINT16, 1, &_disaster_delay ),
1709
1710 OCL_ASSERT( OC_TTO, 0x496E4 ),
1711
1712 OCL_CNULL( OC_TTD, 144 ),
1713
1714 OCL_CCHUNK( OC_TTD, 256, LoadOldEngineName ),
1715
1716 OCL_CNULL( OC_TTD, 144 ),
1717 OCL_NULL( 2 ),
1718 OCL_NULL( 1 ),
1719
1720 OCL_VAR ( OC_UINT8, 1, &_settings_game.locale.currency ),
1721 OCL_VAR ( OC_UINT8, 1, &_old_units ),
1722 OCL_VAR ( OC_FILE_U8 | OC_VAR_U32, 1, &_cur_company_tick_index ),
1723
1724 OCL_NULL( 2 ),
1725 OCL_NULL( 8 ),
1726
1727 OCL_VAR ( OC_UINT8, 1, &_economy.infl_amount ),
1728 OCL_VAR ( OC_UINT8, 1, &_economy.infl_amount_pr ),
1729 OCL_VAR ( OC_UINT8, 1, &_economy.interest_rate ),
1730 OCL_NULL( 1 ), // available airports
1731 OCL_VAR ( OC_UINT8, 1, &_settings_game.vehicle.road_side ),
1732 OCL_VAR ( OC_UINT8, 1, &_settings_game.game_creation.town_name ),
1733
1734 OCL_CHUNK( 1, LoadOldGameDifficulty ),
1735
1736 OCL_ASSERT( OC_TTD, 0x77130 ),
1737
1738 OCL_VAR ( OC_UINT8, 1, &_old_diff_level ),
1739
1740 OCL_VAR ( OC_TTD | OC_UINT8, 1, &_settings_game.game_creation.landscape ),
1741 OCL_VAR ( OC_TTD | OC_UINT8, 1, &_trees_tick_ctr ),
1742
1743 OCL_CNULL( OC_TTD, 1 ),
1744 OCL_VAR ( OC_TTD | OC_UINT8, 1, &_settings_game.game_creation.snow_line_height ),
1745
1746 OCL_CNULL( OC_TTD, 32 ),
1747 OCL_CNULL( OC_TTD, 36 ),
1748
1749 OCL_ASSERT( OC_TTD, 0x77179 ),
1750 OCL_ASSERT( OC_TTO, 0x4971D ),
1751
1752 OCL_CHUNK( 1, LoadOldMapPart2 ),
1753
1754 OCL_ASSERT( OC_TTD, 0x97179 ),
1755 OCL_ASSERT( OC_TTO, 0x6971D ),
1756
1757 /* Below any (if available) extra chunks from TTDPatch can follow */
1758 OCL_CHUNK(1, LoadTTDPatchExtraChunks),
1759
1760 OCL_END()
1761 };
1762
1763 bool LoadTTDMain(LoadgameState *ls)
1764 {
1765 Debug(oldloader, 3, "Reading main chunk...");
1766
1767 _read_ttdpatch_flags = false;
1768
1769 /* Load the biggest chunk */
1770 _old_vehicle_names = nullptr;
1771 try {
1772 if (!LoadChunk(ls, nullptr, main_chunk)) {
1773 Debug(oldloader, 0, "Loading failed");
1774 free(_old_vehicle_names);
1775 return false;
1776 }
1777 } catch (...) {
1778 free(_old_vehicle_names);
1779 throw;
1780 }
1781
1782 Debug(oldloader, 3, "Done, converting game data...");
1783
1784 FixTTDMapArray();
1785 FixTTDDepots();
1786
1787 /* Fix some general stuff */
1788 _settings_game.game_creation.landscape = _settings_game.game_creation.landscape & 0xF;
1789
1790 /* Fix the game to be compatible with OpenTTD */
1791 FixOldTowns();
1792 FixOldVehicles();
1793
1794 /* We have a new difficulty setting */
1795 _settings_game.difficulty.town_council_tolerance = Clamp(_old_diff_level, 0, 2);
1796
1797 Debug(oldloader, 3, "Finished converting game data");
1798 Debug(oldloader, 1, "TTD(Patch) savegame successfully converted");
1799
1800 free(_old_vehicle_names);
1801
1802 return true;
1803 }
1804
1805 bool LoadTTOMain(LoadgameState *ls)
1806 {
1807 Debug(oldloader, 3, "Reading main chunk...");
1808
1809 _read_ttdpatch_flags = false;
1810
1811 std::array<byte, 103 * sizeof(Engine)> engines; // we don't want to call Engine constructor here
1812 _old_engines = (Engine *)engines.data();
1813 std::array<StringID, 800> vehnames;
1814 _old_vehicle_names = vehnames.data();
1815
1816 /* Load the biggest chunk */
1817 if (!LoadChunk(ls, nullptr, main_chunk)) {
1818 Debug(oldloader, 0, "Loading failed");
1819 return false;
1820 }
1821 Debug(oldloader, 3, "Done, converting game data...");
1822
1823 if (_settings_game.game_creation.town_name != 0) _settings_game.game_creation.town_name++;
1824
1825 _settings_game.game_creation.landscape = 0;
1826 _trees_tick_ctr = 0xFF;
1827
1828 if (!FixTTOMapArray() || !FixTTOEngines()) {
1829 Debug(oldloader, 0, "Conversion failed");
1830 return false;
1831 }
1832
1833 FixOldTowns();
1834 FixOldVehicles();
1835 FixTTOCompanies();
1836
1837 /* We have a new difficulty setting */
1838 _settings_game.difficulty.town_council_tolerance = Clamp(_old_diff_level, 0, 2);
1839
1840 /* SVXConverter about cargo payment rates correction:
1841 * "increase them to compensate for the faster time advance in TTD compared to TTO
1842 * which otherwise would cause much less income while the annual running costs of
1843 * the vehicles stay the same" */
1844 _economy.inflation_payment = std::min(_economy.inflation_payment * 124 / 74, MAX_INFLATION);
1845
1846 Debug(oldloader, 3, "Finished converting game data");
1847 Debug(oldloader, 1, "TTO savegame successfully converted");
1848
1849 return true;
1850 }
VEH_AIRCRAFT
@ VEH_AIRCRAFT
Aircraft vehicle type.
Definition: vehicle_type.h:27
RoadVehicle
Buses, trucks and trams belong to this class.
Definition: roadveh.h:106
FixTTOEngines
static bool FixTTOEngines()
Definition: oldloader_sl.cpp:343
MP_CLEAR
@ MP_CLEAR
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition: tile_type.h:48
MP_HOUSE
@ MP_HOUSE
A house by a town.
Definition: tile_type.h:51
Engine::reliability_max
uint16_t reliability_max
Maximal reliability of the engine.
Definition: engine_base.h:44
OC_DEREFERENCE_POINTER
@ OC_DEREFERENCE_POINTER
Dereference the pointer once before writing to it, so we do not have to use big static arrays.
Definition: oldloader.h:77
CompanyProperties::is_ai
bool is_ai
If true, the company is (also) controlled by the computer (a NoAI program).
Definition: company_base.h:108
RoadVehicle::state
byte state
Definition: roadveh.h:108
LoadgameState
Definition: oldloader.h:19
Airport::flags
uint64_t flags
stores which blocks on the airport are taken. was 16 bit earlier on, then 32
Definition: station_base.h:293
Station::goods
GoodsEntry goods[NUM_CARGO]
Goods at this station.
Definition: station_base.h:471
oldloader.h
SetBit
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
Definition: bitmath_func.hpp:121
Order::IsType
bool IsType(OrderType type) const
Check whether this order is of the given type.
Definition: order_base.h:71
Pool::PoolItem<&_company_pool >::Get
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:339
TimerGameTick::counter
static TickCounter counter
Monotonic counter, in ticks, since start of game.
Definition: timer_game_tick.h:33
MutableSpriteCache::sprite_seq
VehicleSpriteSeq sprite_seq
Vehicle appearance.
Definition: vehicle_base.h:196
TimerGameConst< struct Calendar >::DAYS_TILL_ORIGINAL_BASE_YEAR
static constexpr TimerGame< struct Calendar >::Date DAYS_TILL_ORIGINAL_BASE_YEAR
The date of the first day of the original base year.
Definition: timer_game_common.h:184
TAE_FOOD
@ TAE_FOOD
Cargo behaves food/fizzy-drinks-like.
Definition: cargotype.h:28
IsInsideMM
constexpr bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
Definition: math_func.hpp:268
RemapOldStringID
StringID RemapOldStringID(StringID s)
Remap a string ID from the old format to the new format.
Definition: strings_sl.cpp:30
Pool::PoolItem<&_vehicle_pool >::GetIfValid
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:350
CalcEngineReliability
void CalcEngineReliability(Engine *e, bool new_month)
Update Engine::reliability and (if needed) update the engine GUIs.
Definition: engine.cpp:611
ClearGRFConfigList
void ClearGRFConfigList(GRFConfig **config)
Clear a GRF Config list, freeing all nodes.
Definition: newgrf_config.cpp:356
Vehicle::cargo_cap
uint16_t cargo_cap
total capacity
Definition: vehicle_base.h:339
TimerGameCalendar::date_fract
static DateFract date_fract
Fractional part of the day.
Definition: timer_game_calendar.h:35
_disaster_delay
uint16_t _disaster_delay
Delay counter for considering the next disaster.
Definition: disaster_vehicle.cpp:57
GameCreationSettings::landscape
byte landscape
the landscape we're currently in
Definition: settings_type.h:355
Engine::reliability_spd_dec
uint16_t reliability_spd_dec
Speed of reliability decay between services (per day).
Definition: engine_base.h:42
BaseStation::town
Town * town
The town this station is associated with.
Definition: base_station_base.h:73
_new_competitor_timeout
TimeoutTimer< TimerGameTick > _new_competitor_timeout
Start a new competitor company if possible.
Economy::interest_rate
byte interest_rate
Interest.
Definition: economy_type.h:46
ReadByte
byte ReadByte(LoadgameState *ls)
Reads a byte from the buffer and decompress if needed.
Definition: oldloader.cpp:76
Station
Station data structure.
Definition: station_base.h:442
Order::GetDestination
DestinationID GetDestination() const
Gets the destination of this order.
Definition: order_base.h:104
DifficultySettings
Settings related to the difficulty of the game.
Definition: settings_type.h:95
StringID
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
Economy::inflation_payment
uint64_t inflation_payment
Cumulated inflation of cargo payment since game start; 16 bit fractional part.
Definition: economy_type.h:52
Engine::company_avail
CompanyMask company_avail
Bit for each company whether the engine is available for that company.
Definition: engine_base.h:53
_read_ttdpatch_flags
static bool _read_ttdpatch_flags
Have we (tried to) read TTDPatch extra flags?
Definition: oldloader_sl.cpp:42
DifficultySettings::town_council_tolerance
byte town_council_tolerance
minimum required town ratings to be allowed to demolish stuff
Definition: settings_type.h:116
Vehicle::old_orders
Order * old_orders
Only used during conversion of old save games.
Definition: vehicle_base.h:354
GB
constexpr static debug_inline uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
Definition: bitmath_func.hpp:32
FixOldVehicles
void FixOldVehicles()
Convert the old style vehicles into something that resembles the old new style savegames.
Definition: oldloader_sl.cpp:163
Map::Allocate
static void Allocate(uint size_x, uint size_y)
(Re)allocates a map with the given dimension
Definition: map.cpp:41
Pool::PoolItem::index
Tindex index
Index of this pool item.
Definition: pool_type.hpp:238
_ttdp_version
uint32_t _ttdp_version
version of TTDP savegame (if applicable)
Definition: saveload.cpp:62
SlErrorCorrupt
void SlErrorCorrupt(const std::string &msg)
Error handler for corrupt savegames.
Definition: saveload.cpp:364
PalSpriteID::sprite
SpriteID sprite
The 'real' sprite.
Definition: gfx_type.h:23
Engine::reliability_final
uint16_t reliability_final
Final reliability of the engine.
Definition: engine_base.h:45
GameSettings::difficulty
DifficultySettings difficulty
settings related to the difficulty
Definition: settings_type.h:617
INVALID_TILE
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition: tile_type.h:95
SGT_TTDP1
@ SGT_TTDP1
TTDP savegame ( -//- ) (data at NW border)
Definition: saveload.h:408
MP_RAILWAY
@ MP_RAILWAY
A railway.
Definition: tile_type.h:49
Vehicle::next
Vehicle * next
pointer to the next vehicle in the chain
Definition: vehicle_base.h:244
GameCreationSettings::town_name
byte town_name
the town name generator used for town names
Definition: settings_type.h:354
Tile
Wrapper class to abstract away the way the tiles are stored.
Definition: map_func.h:25
_random
Randomizer _random
Random used in the game state calculations.
Definition: random_func.cpp:37
SpecializedStation< Station, false >::Get
static Station * Get(size_t index)
Gets station with given index.
Definition: base_station_base.h:259
GRFConfig::ident
GRFIdentifier ident
grfid and md5sum to uniquely identify newgrfs
Definition: newgrf_config.h:154
Order::AssignOrder
void AssignOrder(const Order &other)
Assign data to an order (from another order) This function makes sure that the index is maintained co...
Definition: order_cmd.cpp:273
Town::xy
TileIndex xy
town center tile
Definition: town.h:51
MP_INDUSTRY
@ MP_INDUSTRY
Part of an industry.
Definition: tile_type.h:56
Engine::preview_company
CompanyID preview_company
Company which is currently being offered a preview INVALID_COMPANY means no company.
Definition: engine_base.h:51
LoadOldVehicle
bool LoadOldVehicle(LoadgameState *ls, int num)
Load the vehicles of an old style savegame.
Definition: oldloader_sl.cpp:1241
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > >
CompanyProperties::face
CompanyManagerFace face
Face description of the president.
Definition: company_base.h:78
VehicleSettings::road_side
byte road_side
the side of the road vehicles drive on
Definition: settings_type.h:532
Tile::m5
debug_inline byte & m5()
General purpose.
Definition: map_func.h:161
Engine
Definition: engine_base.h:37
VEH_ROAD
@ VEH_ROAD
Road vehicle type.
Definition: vehicle_type.h:25
Vehicle
Vehicle data structure.
Definition: vehicle_base.h:240
Industry
Defines the internal data of a functional industry.
Definition: industry.h:68
Owner
Owner
Enum for all companies/owners.
Definition: company_type.h:18
CalculateCompanyValue
Money CalculateCompanyValue(const Company *c, bool including_loan=true)
Calculate the value of the company.
Definition: economy.cpp:149
Tile::m4
debug_inline byte & m4()
General purpose.
Definition: map_func.h:149
MP_ROAD
@ MP_ROAD
A tile with road (or tram tracks)
Definition: tile_type.h:50
Economy::fluct
int16_t fluct
Economy fluctuation status.
Definition: economy_type.h:45
_old_name_array
char * _old_name_array
Location to load the old names to.
Definition: strings_sl.cpp:52
GoodsEntry::status
byte status
Status of this cargo, see GoodsEntryStatus.
Definition: station_base.h:217
CompanyProperties::current_loan
Money current_loan
Amount of money borrowed from the bank.
Definition: company_base.h:82
CompanyEconomyEntry
Statistics about the economy.
Definition: company_base.h:24
_savegame_type
SavegameType _savegame_type
type of savegame we are loading
Definition: saveload.cpp:59
Debug
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
Definition: debug.h:37
MakeSea
void MakeSea(Tile t)
Make a sea tile.
Definition: water_map.h:423
BaseStation::string_id
StringID string_id
Default name (town area) of station.
Definition: base_station_base.h:70
GameSettings::game_creation
GameCreationSettings game_creation
settings used during the creation of a game (map)
Definition: settings_type.h:618
Aircraft
Aircraft, helicopters, rotors and their shadows belong to this class.
Definition: aircraft.h:74
GetTileType
static debug_inline TileType GetTileType(Tile tile)
Get the tiletype of a given tile.
Definition: tile_map.h:96
GoodsEntry::cargo
StationCargoList cargo
The cargo packets of cargo waiting in this station.
Definition: station_base.h:210
_company_colours
Colours _company_colours[MAX_COMPANIES]
NOSAVE: can be determined from company structs.
Definition: company_cmd.cpp:52
_old_extra_chunk_nums
static uint16_t _old_extra_chunk_nums
Number of extra TTDPatch chunks.
Definition: oldloader_sl.cpp:43
IsInsideBS
constexpr bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
Definition: math_func.hpp:252
Economy::infl_amount_pr
byte infl_amount_pr
inflation rate for payment rates
Definition: economy_type.h:48
Subsidy::cargo_type
CargoID cargo_type
Cargo type involved in this subsidy, INVALID_CARGO for invalid subsidy.
Definition: subsidy_base.h:23
Subsidy
Struct about subsidies, offered and awarded.
Definition: subsidy_base.h:22
_age_cargo_skip_counter
byte _age_cargo_skip_counter
Skip aging of cargo? Used before savegame version 162.
Definition: misc_sl.cpp:79
RailType
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:27
Industry::location
TileArea location
Location of the industry.
Definition: industry.h:96
BSWAP32
static uint32_t BSWAP32(uint32_t x)
Perform a 32 bits endianness bitswap on x.
Definition: bitmath_func.hpp:345
StartupOneEngine
void StartupOneEngine(Engine *e, const TimerGameCalendar::YearMonthDay &aging_ymd, uint32_t seed)
Start/initialise one engine.
Definition: engine.cpp:682
GRFConfig
Information about GRF, used in the game and (part of it) in savegames.
Definition: newgrf_config.h:147
Map::Iterate
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition: map_func.h:363
SGT_TTO
@ SGT_TTO
TTO savegame.
Definition: saveload.h:411
CalcClosestTownFromTile
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold=UINT_MAX)
Return the town closest to the given tile within threshold.
Definition: town_cmd.cpp:3726
Industry::type
IndustryType type
type of industry.
Definition: industry.h:104
Vehicle::tile
TileIndex tile
Current tile index.
Definition: vehicle_base.h:260
free
void free(const void *ptr)
Version of the standard free that accepts const pointers.
Definition: stdafx.h:379
LoadChunk
bool LoadChunk(LoadgameState *ls, void *base, const OldChunks *chunks)
Loads a chunk from the old savegame.
Definition: oldloader.cpp:110
Engine::intro_date
TimerGameCalendar::Date intro_date
Date of introduction of the engine.
Definition: engine_base.h:39
MP_OBJECT
@ MP_OBJECT
Contains objects such as transmitters and owned land.
Definition: tile_type.h:58
TimerGameCalendar::ConvertYMDToDate
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
Definition: timer_game_calendar.cpp:55
CompanyProperties::colour
Colours colour
Company colour.
Definition: company_base.h:85
CompanyProperties::money
Money money
Money owned by the company.
Definition: company_base.h:80
MP_WATER
@ MP_WATER
Water tile.
Definition: tile_type.h:54
VehicleCargoList::Append
void Append(CargoPacket *cp, MoveToAction action=MTA_KEEP)
Appends the given cargo packet.
Definition: cargopacket.cpp:260
Vehicle::cargo
VehicleCargoList cargo
The cargo this vehicle is carrying.
Definition: vehicle_base.h:341
Vehicle::current_order
Order current_order
The current order (+ status, like: loading)
Definition: vehicle_base.h:350
CopyFromOldName
std::string CopyFromOldName(StringID id)
Copy and convert old custom names to UTF-8.
Definition: strings_sl.cpp:61
Engine::preview_asked
CompanyMask preview_asked
Bit for each company which has already been offered a preview.
Definition: engine_base.h:50
Station::airport
Airport airport
Tile area the airport covers.
Definition: station_base.h:456
VEH_EFFECT
@ VEH_EFFECT
Effect vehicle type (smoke, explosions, sparks, bubbles)
Definition: vehicle_type.h:31
_settings_game
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:55
IsCompanyBuildableVehicleType
bool IsCompanyBuildableVehicleType(VehicleType type)
Is the given vehicle type buildable by a company?
Definition: vehicle_func.h:91
OC_TTO
@ OC_TTO
-//- TTO (default is neither of these)
Definition: oldloader.h:43
TimerGameCalendar::ConvertDateToYMD
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
Definition: timer_game_calendar.cpp:42
GameCreationSettings::snow_line_height
byte snow_line_height
the configured snow line height (deduced from "snow_coverage")
Definition: settings_type.h:346
_animated_tiles
std::vector< TileIndex > _animated_tiles
The table/list with animated tiles.
Definition: animated_tile.cpp:19
Train
'Train' is either a loco or a wagon.
Definition: train.h:89
VehicleID
uint32_t VehicleID
The type all our vehicle IDs have.
Definition: vehicle_type.h:16
MP_TUNNELBRIDGE
@ MP_TUNNELBRIDGE
Tunnel entry/exit and bridge heads.
Definition: tile_type.h:57
IsDepotTile
bool IsDepotTile(Tile tile)
Is the given tile a tile with a depot on it?
Definition: depot_map.h:41
Engine::duration_phase_1
uint16_t duration_phase_1
First reliability phase in months, increasing reliability from reliability_start to reliability_max.
Definition: engine_base.h:46
TimerGameEconomy::ConvertDateToYMD
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
Definition: timer_game_economy.cpp:46
Vehicle::sprite_cache
MutableSpriteCache sprite_cache
Cache of sprites and values related to recalculating them, see MutableSpriteCache.
Definition: vehicle_base.h:364
SetTileOwner
void SetTileOwner(Tile tile, Owner owner)
Sets the owner of a tile.
Definition: tile_map.h:198
SpriteID
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition: gfx_type.h:17
GetDepotIndex
DepotID GetDepotIndex(Tile t)
Get the index of which depot is attached to the tile.
Definition: depot_map.h:52
Engine::reliability
uint16_t reliability
Current reliability of the engine.
Definition: engine_base.h:41
ENGINE_AVAILABLE
@ ENGINE_AVAILABLE
This vehicle is available to everyone.
Definition: engine_type.h:183
_cur_company_tick_index
uint _cur_company_tick_index
used to generate a name for one company that doesn't have a name yet per tick
Definition: company_cmd.cpp:54
_old_vehicle_multiplier
static byte _old_vehicle_multiplier
TTDPatch vehicle multiplier.
Definition: oldloader_sl.cpp:44
DisasterVehicle
Disasters, like submarines, skyrangers and their shadows, belong to this class.
Definition: disaster_vehicle.h:37
FixTTDDepots
static void FixTTDDepots()
Definition: oldloader_sl.cpp:102
Industry::random_colour
Colours random_colour
randomized colour of the industry, for display purpose
Definition: industry.h:106
MP_TREES
@ MP_TREES
Tile got trees.
Definition: tile_type.h:52
Engine::reliability_start
uint16_t reliability_start
Initial reliability of the engine.
Definition: engine_base.h:43
Industry::town
Town * town
Nearest town.
Definition: industry.h:97
CompanyEconomyEntry::expenses
Money expenses
The amount of expenses.
Definition: company_base.h:26
CompanyProperties::inaugurated_year
TimerGameEconomy::Year inaugurated_year
Economy year of starting the company.
Definition: company_base.h:92
Ship
All ships have this type.
Definition: ship.h:24
GoodsEntry
Stores station stats for a single cargo.
Definition: station_base.h:166
Engine::name
std::string name
Custom name of engine.
Definition: engine_base.h:38
Pool::PoolItem<&_depot_pool >::Iterate
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:388
TimeoutTimer
A timeout timer will fire once after the interval.
Definition: timer.h:116
Map::MaxY
static uint MaxY()
Gets the maximum Y coordinate within the map, including MP_VOID.
Definition: map_func.h:306
CompanyProperties::cur_economy
CompanyEconomyEntry cur_economy
Economic data of the company of this quarter.
Definition: company_base.h:111
LocaleSettings::currency
byte currency
currency we currently use
Definition: settings_type.h:260
OldChunks
Definition: oldloader.h:87
MP_VOID
@ MP_VOID
Invisible tiles at the SW and SE border.
Definition: tile_type.h:55
AppendStaticGRFConfigs
void AppendStaticGRFConfigs(GRFConfig **dst)
Appends the static GRFs to a list of GRFs.
Definition: newgrf_config.cpp:426
CompanyProperties::yearly_expenses
std::array< Expenses, 3 > yearly_expenses
Expenses of the company for the last three years.
Definition: company_base.h:110
SpecializedVehicle< RoadVehicle, Type >::From
static RoadVehicle * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
Definition: vehicle_base.h:1206
TileType
TileType
The different types of tiles.
Definition: tile_type.h:47
Map::Size
static debug_inline uint Size()
Get the size of the map.
Definition: map_func.h:288
Industry::IncIndustryTypeCount
static void IncIndustryTypeCount(IndustryType type)
Increment the count of industries for this type.
Definition: industry.h:220
OrthogonalTileArea::tile
TileIndex tile
The base tile of the area.
Definition: tilearea_type.h:19
OWNER_NONE
@ OWNER_NONE
The tile has no ownership.
Definition: company_type.h:25
TAE_WATER
@ TAE_WATER
Cargo behaves water-like.
Definition: cargotype.h:27
MP_STATION
@ MP_STATION
A tile of a station.
Definition: tile_type.h:53
DifficultySettings::max_loan
uint32_t max_loan
the maximum initial loan
Definition: settings_type.h:103
GoodsEntry::GES_ACCEPTANCE
@ GES_ACCEPTANCE
Set when the station accepts the cargo currently for final deliveries.
Definition: station_base.h:173
Economy::infl_amount
byte infl_amount
inflation amount
Definition: economy_type.h:47
SetTileType
void SetTileType(Tile tile, TileType type)
Set the type of a tile.
Definition: tile_map.h:131
Pool::PoolItem<&_cargopacket_pool >::CanAllocateItem
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
Definition: pool_type.hpp:309
Sign
Definition: signs_base.h:21
MAX_UVALUE
#define MAX_UVALUE(type)
The largest value that can be entered in a variable.
Definition: stdafx.h:388
Economy::old_max_loan_unround
Money old_max_loan_unround
Old: Unrounded max loan.
Definition: economy_type.h:55
Engine::preview_wait
byte preview_wait
Daily countdown timer for timeout of offering the engine to the preview_company company.
Definition: engine_base.h:52
BaseStation::xy
TileIndex xy
Base tile of the station.
Definition: base_station_base.h:65
EffectVehicle
A special vehicle is one of the following:
Definition: effectvehicle_base.h:24
UnpackOldOrder
Order UnpackOldOrder(uint16_t packed)
Unpacks a order from savegames made with TTD(Patch)
Definition: order_sl.cpp:92
TileIndex
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition: tile_type.h:87
_trees_tick_ctr
byte _trees_tick_ctr
Determines when to consider building more trees.
Definition: tree_cmd.cpp:55
VEH_DISASTER
@ VEH_DISASTER
Disaster vehicle type.
Definition: vehicle_type.h:32
CompanyEconomyEntry::income
Money income
The amount of income.
Definition: company_base.h:25
CompanyProperties::president_name_1
StringID president_name_1
Name of the president if the user did not change it.
Definition: company_base.h:74
_grfconfig
GRFConfig * _grfconfig
First item in list of current GRF set up.
Definition: newgrf_config.cpp:164
saveload_internal.h
Depot
Definition: depot_base.h:20
Town
Town data structure.
Definition: town.h:50
lengthof
#define lengthof(x)
Return the length of an fixed size array.
Definition: stdafx.h:300
RVSB_WORMHOLE
@ RVSB_WORMHOLE
The vehicle is in a tunnel and/or bridge.
Definition: roadveh.h:39
CargoPacket
Container for cargo from the same location and time.
Definition: cargopacket.h:40
TileXY
static debug_inline TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
Definition: map_func.h:385
GRFIdentifier::grfid
uint32_t grfid
GRF ID (defined by Action 0x08)
Definition: newgrf_config.h:84
Randomizer::state
uint32_t state[2]
The state of the randomizer.
Definition: random_func.hpp:23
GameSettings::locale
LocaleSettings locale
settings related to used currency/unit system in the current game
Definition: settings_type.h:630
TimerGameConst< struct Economy >::ORIGINAL_BASE_YEAR
static constexpr TimerGame< struct Economy >::Year ORIGINAL_BASE_YEAR
The minimum starting year/base year of the original TTD.
Definition: timer_game_common.h:163
Airport::type
byte type
Type of this airport,.
Definition: station_base.h:294
OC_TTD
@ OC_TTD
chunk is valid ONLY for TTD savegames
Definition: oldloader.h:42
INVALID_COMPANY
@ INVALID_COMPANY
An invalid company.
Definition: company_type.h:30
Vehicle::cargo_type
CargoID cargo_type
type of cargo this vehicle is carrying
Definition: vehicle_base.h:337
IsValidCargoID
bool IsValidCargoID(CargoID t)
Test whether cargo type is not INVALID_CARGO.
Definition: cargo_type.h:107
Vehicle::spritenum
byte spritenum
currently displayed sprite index 0xfd == custom sprite, 0xfe == custom second head sprite 0xff == res...
Definition: vehicle_base.h:311
StationCargoList::Append
void Append(CargoPacket *cp, StationID next)
Appends the given cargo packet to the range of packets with the same next station.
Definition: cargopacket.cpp:684
Industry::last_prod_year
TimerGameEconomy::Year last_prod_year
last economy year of production
Definition: industry.h:107
RVS_IN_DT_ROAD_STOP
@ RVS_IN_DT_ROAD_STOP
The vehicle is in a drive-through road stop.
Definition: roadveh.h:46
SB
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.
Definition: bitmath_func.hpp:58
TimerGameCalendar::date
static Date date
Current date in days (day counter).
Definition: timer_game_calendar.h:34
GameSettings::vehicle
VehicleSettings vehicle
options for vehicles
Definition: settings_type.h:626
EngineID
uint16_t EngineID
Unique identification number of an engine.
Definition: engine_type.h:21
EngineInfo::climates
byte climates
Climates supported by the engine.
Definition: engine_type.h:150
IsTileType
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition: tile_map.h:150
VEH_TRAIN
@ VEH_TRAIN
Train vehicle type.
Definition: vehicle_type.h:24
BaseVehicle::type
VehicleType type
Type of vehicle.
Definition: vehicle_type.h:51
Clamp
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:79
RemapTTOColour
static Colours RemapTTOColour(Colours tto)
Definition: oldloader_sl.cpp:458
NUM_CARGO
static const CargoID NUM_CARGO
Maximum number of cargo types in a game.
Definition: cargo_type.h:74
Engine::flags
byte flags
Flags of the engine.
Definition: engine_base.h:49
Engine::duration_phase_2
uint16_t duration_phase_2
Second reliability phase in months, keeping reliability_max.
Definition: engine_base.h:47
VEH_SHIP
@ VEH_SHIP
Ship vehicle type.
Definition: vehicle_type.h:26
Company
Definition: company_base.h:129
RVSB_IN_DEPOT
@ RVSB_IN_DEPOT
The vehicle is in a depot.
Definition: roadveh.h:38
DisasterVehicle::state
uint16_t state
Action stage of the disaster vehicle.
Definition: disaster_vehicle.h:41
ClrBit
constexpr T ClrBit(T &x, const uint8_t y)
Clears a bit in a variable.
Definition: bitmath_func.hpp:151
MAX_INFLATION
static const uint64_t MAX_INFLATION
Maximum inflation (including fractional part) without causing overflows in int64_t price computations...
Definition: economy_type.h:229
CompanyProperties::old_economy
CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
Definition: company_base.h:112
OWNER_WATER
@ OWNER_WATER
The tile/execution is done by "water".
Definition: company_type.h:26
Tile::m3
debug_inline byte & m3()
General purpose.
Definition: map_func.h:137
Engine::duration_phase_3
uint16_t duration_phase_3
Third reliability phase in months, decaying to reliability_final.
Definition: engine_base.h:48
Order::next
Order * next
Pointer to next order. If nullptr, end of list.
Definition: order_base.h:59
Order
Definition: order_base.h:36
SGT_TTDP2
@ SGT_TTDP2
TTDP savegame in new format (data at SE border)
Definition: saveload.h:409
GoodsEntry::GES_RATING
@ GES_RATING
This indicates whether a cargo has a rating at the station.
Definition: station_base.h:183
AppendToGRFConfigList
void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el)
Appends an element to a list of GRFs.
Definition: newgrf_config.cpp:440
Vehicle::refit_cap
uint16_t refit_cap
Capacity left over from before last refit.
Definition: vehicle_base.h:340
CompanyProperties::name_1
StringID name_1
Name of the company if the user did not change it.
Definition: company_base.h:71
TimerGameEconomy::date
static Date date
Current date in days (day counter).
Definition: timer_game_economy.h:37
Engine::age
int32_t age
Age of the engine in months.
Definition: engine_base.h:40
HasBit
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
Definition: bitmath_func.hpp:103