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

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;
42 static byte _old_vehicle_multiplier;
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);
51 SetTileType(0, MP_WATER);
52 SetTileOwner(0, OWNER_WATER);
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) {
93 SetTileType(t, MP_WATER);
94 SetTileOwner(t, OWNER_WATER);
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
171 void FixOldVehicles()
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) {
194 RoadVehicle *rv = RoadVehicle::From(v);
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. */
199 SetBit(rv->state, RVS_IN_DT_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 */
211 if (!IsCompanyBuildableVehicleType(v) ||
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)
228 SetTileType(t, MP_RAILWAY);
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 */
403 _date += DAYS_TILL_ORIGINAL_BASE_YEAR;
404 StartupOneEngine(e, aging_date, 0);
405 CalcEngineReliability(e, false);
406 e->intro_date -= DAYS_TILL_ORIGINAL_BASE_YEAR;
407 _date -= DAYS_TILL_ORIGINAL_BASE_YEAR;
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;
422 e->reliability_spd_dec = oe->reliability_spd_dec;
423 e->reliability_start = oe->reliability_start;
424 e->reliability_max = oe->reliability_max;
425 e->reliability_final = oe->reliability_final;
426 e->duration_phase_1 = oe->duration_phase_1;
427 e->duration_phase_2 = oe->duration_phase_2;
428 e->duration_phase_3 = oe->duration_phase_3;
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
446 e->preview_company = INVALID_COMPANY;
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 */
501 _old_vehicle_multiplier = 1;
502 _ttdp_version = 0;
503 _old_extra_chunk_nums = 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 */
512 if (_old_vehicle_multiplier < 2) _old_vehicle_multiplier++;
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
845 i->random_colour = RemapTTOColour(i->random_colour);
846 }
847
848 Industry::IncIndustryTypeCount(i->type);
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 */
898 c->cur_economy.income = -c->cur_economy.income;
899 c->cur_economy.expenses = -c->cur_economy.expenses;
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;
1019 c->inaugurated_year -= ORIGINAL_BASE_YEAR;
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);
1462 _settings_game.difficulty.max_loan *= 1000;
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
1530 ClearGRFConfigList(&_grfconfig);
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
1538 AppendToGRFConfigList(&_grfconfig, c);
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 */
1545 AppendStaticGRFConfigs(&_grfconfig);
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 */
1771 _settings_game.game_creation.landscape = _settings_game.game_creation.landscape & 0xF;
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
1806 if (_settings_game.game_creation.town_name != 0) _settings_game.game_creation.town_name++;
1807
1808 _settings_game.game_creation.landscape = 0;
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