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