10 #include "../stdafx.h"
12 #include "../industry.h"
13 #include "../company_func.h"
14 #include "../aircraft.h"
15 #include "../roadveh.h"
18 #include "../signs_base.h"
19 #include "../station_base.h"
20 #include "../subsidy_base.h"
22 #include "../depot_base.h"
23 #include "../timer/timer_game_calendar.h"
24 #include "../timer/timer_game_calendar.h"
25 #include "../vehicle_func.h"
26 #include "../effectvehicle_base.h"
27 #include "../engine_func.h"
28 #include "../company_base.h"
29 #include "../disaster_vehicle.h"
30 #include "../timer/timer.h"
31 #include "../timer/timer_game_tick.h"
32 #include "../timer/timer_game_calendar.h"
36 #include "table/strings.h"
37 #include "../table/engines.h"
38 #include "../table/townname.h"
40 #include "../safeguards.h"
53 static void FixTTDMapArray()
61 case 0x53:
case 0x54: tile.m5() += 170 - 0x53;
break;
62 case 0x57:
case 0x58: tile.m5() += 168 - 0x57;
break;
63 case 0x55:
case 0x56: tile.m5() += 170 - 0x55;
break;
64 case 0x59:
case 0x5A: tile.m5() += 168 - 0x59;
break;
71 if (
GB(tile.m5(), 6, 2) == 1) {
74 tile.m4() = (tile.m4() >> 1) & 7;
84 if (
GB(tile.m3(), 0, 2) == 3) {
112 #define FIXNUM(x, y, z) (((((x) << 16) / (y)) + 1) << z)
114 static uint32_t RemapOldTownName(uint32_t townnameparts,
byte old_town_name_type)
116 switch (old_town_name_type) {
119 return townnameparts;
124 return FIXNUM(townnameparts - 86,
lengthof(_name_french_real), 0);
127 Debug(misc, 0,
"German Townnames are buggy ({})", townnameparts);
128 return townnameparts;
132 return FIXNUM(townnameparts,
lengthof(_name_spanish_real), 0);
138 return FIXNUM(townnameparts,
lengthof(_name_silly_1), 0) | FIXNUM(
GB(townnameparts, 16, 8),
lengthof(_name_silly_2), 16);
145 static void FixOldTowns()
149 if (
IsInsideMM(town->townnametype, 0x20C1, 0x20C3)) {
156 static StringID *_old_vehicle_names;
166 if ((
size_t)v->next == 0xFFFF) {
173 switch (v->spritenum) {
175 case 0xff: v->spritenum = 0xfe;
break;
176 default: v->spritenum >>= 1;
break;
180 if (v->type ==
VEH_EFFECT) v->subtype = v->subtype >> 1;
205 (v->IsPrimaryVehicle() && v->current_order.IsType(OT_NOTHING))) {
206 v->current_order.MakeDummy();
213 static bool FixTTOMapArray()
231 switch (
GB(tile.m5(), 6, 2)) {
235 tile.m4() = (~tile.m5() & 1) << 2;
236 SB(tile.m2(), 6, 2,
GB(tile.m5(), 3, 2));
238 tile.m5() =
HasBit(tile.m5(), 5) ? 2 : 1;
250 switch (
GB(tile.m5(), 4, 4)) {
252 if (tile.m2() == 4) tile.m2() = 5;
255 tile.m3() = tile.m1();
265 tile.m3() = tile.m2() & 0xC0;
267 if (tile.m2() >= 5) tile.m2()++;
271 tile.m3() =
GB(tile.m5(), 3, 3);
276 tile.m3() = (tile.m5() >= 0x08 && tile.m5() <= 0x0F) ? 1 : 0;
277 if (tile.m5() >= 8) tile.m5() -= 8;
278 if (tile.m5() >= 0x42) tile.m5()++;
282 tile.m3() = tile.m2() = 0;
286 tile.m2() = tile.m3() = tile.m5() = 0;
295 case 0x25:
case 0x27:
296 case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
300 if (tile.m5() >= 0x2C) tile.m5() += 3;
306 if (
HasBit(tile.m5(), 7)) {
308 tile.m5() = m5 & 0xE1;
309 if (
GB(m5, 1, 2) == 1) tile.m5() |= 0x02;
310 if (
GB(m5, 1, 2) == 3) tile.m2() |= 0xA0;
312 tile.m3() = (
GB(m5, 1, 2) == 3) ? 1 : 0;
314 tile.m3() =
HasBit(m5, 2) ? 0x10 : 0;
315 if (
GB(m5, 3, 2) == 3) tile.m3() |= 1;
316 if (
GB(m5, 3, 2) == 1) tile.m5() |= 0x08;
320 tile.m3() =
HasBit(tile.m5(), 3);
321 tile.m5() &=
HasBit(tile.m5(), 3) ? 0x03 : 0x07 ;
341 static Engine *_old_engines;
346 static const EngineID ttd_to_tto[] = {
347 0, 255, 255, 255, 255, 255, 255, 255, 5, 7, 8, 9, 10, 11, 12, 13,
348 255, 255, 255, 255, 255, 255, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
349 25, 26, 27, 29, 28, 30, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
350 255, 255, 255, 255, 255, 255, 255, 31, 255, 32, 33, 34, 35, 36, 37, 38,
351 39, 40, 41, 42, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
352 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
353 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
354 255, 255, 255, 255, 44, 45, 46, 255, 255, 255, 255, 47, 48, 255, 49, 50,
355 255, 255, 255, 255, 51, 52, 255, 53, 54, 255, 55, 56, 255, 57, 59, 255,
356 58, 60, 255, 61, 62, 255, 63, 64, 255, 65, 66, 255, 255, 255, 255, 255,
357 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
358 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
359 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 67, 68, 69, 70,
360 71, 255, 255, 76, 77, 255, 255, 78, 79, 80, 81, 82, 83, 84, 85, 86,
361 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 255,
362 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 102, 255, 255
366 static const EngineID tto_to_ttd[] = {
367 0, 0, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 15, 15, 22,
368 23, 24, 25, 26, 27, 29, 28, 30, 31, 32, 33, 34, 35, 36, 37, 55,
369 57, 59, 58, 60, 61, 62, 63, 64, 65, 66, 67, 116, 116, 117, 118, 123,
370 124, 126, 127, 132, 133, 135, 136, 138, 139, 141, 142, 144, 145, 147, 148, 150,
371 151, 153, 154, 204, 205, 206, 207, 208, 211, 212, 211, 212, 211, 212, 215, 216,
372 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232,
373 233, 234, 235, 236, 237, 238, 253
377 if (v->engine_type >=
lengthof(tto_to_ttd))
return false;
378 v->engine_type = tto_to_ttd[v->engine_type];
384 for (uint i = 0; i <
lengthof(_orig_rail_vehicle_info); i++, j++)
new (GetTempDataEngine(j))
Engine(
VEH_TRAIN, i);
385 for (uint i = 0; i <
lengthof(_orig_road_vehicle_info); i++, j++)
new (GetTempDataEngine(j))
Engine(
VEH_ROAD, i);
386 for (uint i = 0; i <
lengthof(_orig_ship_vehicle_info); i++, j++)
new (GetTempDataEngine(j))
Engine(
VEH_SHIP, i);
393 for (
EngineID i = 0; i < 256; i++) {
394 int oi = ttd_to_tto[i];
395 Engine *e = GetTempDataEngine(i);
413 Engine *oe = &_old_engines[oi];
431 for (uint j = 0; j <
lengthof(tto_to_ttd); j++) {
432 if (tto_to_ttd[j] == i && _old_engines[j].company_avail != 0) {
445 e->
name = std::string{};
451 static void FixTTOCompanies()
461 static const Colours tto_colour_remap[] = {
462 COLOUR_DARK_BLUE, COLOUR_GREY, COLOUR_YELLOW, COLOUR_RED,
463 COLOUR_PURPLE, COLOUR_DARK_GREEN, COLOUR_ORANGE, COLOUR_PALE_GREEN,
464 COLOUR_BLUE, COLOUR_GREEN, COLOUR_CREAM, COLOUR_BROWN,
465 COLOUR_WHITE, COLOUR_LIGHT_BLUE, COLOUR_MAUVE, COLOUR_PINK
468 if ((
size_t)tto >=
lengthof(tto_colour_remap))
return COLOUR_GREY;
470 return tto_colour_remap[tto];
473 static inline uint RemapTownIndex(uint x)
478 static inline uint RemapOrderIndex(uint x)
487 static uint32_t _old_town_index;
488 static uint16_t _old_string_id;
489 static uint16_t _old_string_id_2;
511 static void ReadTTDPatchFlags()
521 _bump_assert_value = 0;
549 if (ttdp2_header_first.m3() ==
'T' && ttdp2_header_first.m4() ==
'T' &&
550 ttdp2_header_second.m3() ==
'D' && ttdp2_header_second.m4() ==
'p') {
558 for (
TileIndex i = 0; i < 9; i++) ClearOldMap3(i);
567 OCL_SVAR( OC_TILE,
Town, xy ),
569 OCL_SVAR( OC_UINT16,
Town, townnametype ),
570 OCL_SVAR( OC_UINT32,
Town, townnameparts ),
571 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, grow_counter ),
575 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Town, flags ),
578 OCL_SVAR( OC_INT16,
Town, ratings[0] ),
579 OCL_SVAR( OC_INT16,
Town, ratings[1] ),
580 OCL_SVAR( OC_INT16,
Town, ratings[2] ),
581 OCL_SVAR( OC_INT16,
Town, ratings[3] ),
582 OCL_SVAR( OC_INT16,
Town, ratings[4] ),
583 OCL_SVAR( OC_INT16,
Town, ratings[5] ),
584 OCL_SVAR( OC_INT16,
Town, ratings[6] ),
585 OCL_SVAR( OC_INT16,
Town, ratings[7] ),
587 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, have_ratings ),
588 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, statues ),
590 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, time_until_rebuild ),
591 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, growth_rate ),
593 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].new_max ),
594 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].new_max ),
595 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].new_act ),
596 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].new_act ),
597 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].old_max ),
598 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].old_max ),
599 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].old_act ),
600 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].old_act ),
609 OCL_SVAR( OC_UINT8,
Town, road_build_months ),
610 OCL_SVAR( OC_UINT8,
Town, fund_buildings_months ),
620 if (!
LoadChunk(ls, t, town_chunk))
return false;
625 t->townnametype = t->townnametype == 0x10B6 ? 0x20C1 : t->townnametype + 0x2A00;
634 static uint16_t _old_order;
636 OCL_VAR ( OC_UINT16, 1, &_old_order ),
642 if (!
LoadChunk(ls,
nullptr, order_chunk))
return false;
647 if (o->
IsType(OT_NOTHING)) {
653 if (prev !=
nullptr) prev->
next = o;
663 OCL_VAR ( OC_TILE, 256, anim_list ),
667 if (!
LoadChunk(ls,
nullptr, anim_chunk))
return false;
670 for (
int i = 0; i < 256; i++) {
671 if (anim_list[i] == 0)
break;
679 OCL_SVAR( OC_TILE,
Depot, xy ),
680 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
687 if (!
LoadChunk(ls, d, depot_chunk))
return false;
690 d->town = RemapTown(d->xy);
698 static StationID _current_station_id;
699 static uint16_t _waiting_acceptance;
700 static uint8_t _cargo_source;
701 static uint8_t _cargo_periods;
704 OCL_VAR ( OC_UINT16, 1, &_waiting_acceptance ),
705 OCL_SVAR( OC_UINT8,
GoodsEntry, time_since_pickup ),
707 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
708 OCL_VAR ( OC_UINT8, 1, &_cargo_periods ),
723 if (!
LoadChunk(ls, ge, goods_chunk))
return false;
735 static const OldChunks station_chunk[] = {
736 OCL_SVAR( OC_TILE,
Station, xy ),
737 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
740 OCL_SVAR( OC_TILE,
Station, train_station.tile ),
741 OCL_SVAR( OC_TILE,
Station, airport.tile ),
743 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Station, train_station.w ),
748 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
752 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Station, had_vehicle_of_type ),
754 OCL_CHUNK( 12, LoadOldGood ),
756 OCL_SVAR( OC_UINT8,
Station, time_since_load ),
757 OCL_SVAR( OC_UINT8,
Station, time_since_unload ),
758 OCL_SVAR( OC_UINT8,
Station, delete_ctr ),
759 OCL_SVAR( OC_UINT8,
Station, owner ),
760 OCL_SVAR( OC_UINT8,
Station, facilities ),
762 OCL_SVAR(
OC_TTO | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
765 OCL_SVAR(
OC_TTD | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
775 _current_station_id = num;
777 if (!
LoadChunk(ls, st, station_chunk))
return false;
780 st->
town = RemapTown(st->
xy);
784 st->
string_id = STR_SV_STNAME + (_old_string_id - 0x180F);
806 static const OldChunks industry_chunk[] = {
807 OCL_SVAR( OC_TILE,
Industry, location.tile ),
808 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
809 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Industry, location.w ),
810 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Industry, location.h ),
815 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Industry, produced[0].waiting ),
816 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Industry, produced[1].waiting ),
818 OCL_SVAR( OC_UINT8,
Industry, produced[0].rate ),
819 OCL_SVAR( OC_UINT8,
Industry, produced[1].rate ),
823 OCL_SVAR( OC_UINT8,
Industry, prod_level ),
825 OCL_SVAR( OC_UINT16,
Industry, produced[0].history[THIS_MONTH].production ),
826 OCL_SVAR( OC_UINT16,
Industry, produced[1].history[THIS_MONTH].production ),
827 OCL_SVAR( OC_UINT16,
Industry, produced[0].history[THIS_MONTH].transported ),
828 OCL_SVAR( OC_UINT16,
Industry, produced[1].history[THIS_MONTH].transported ),
832 OCL_SVAR( OC_UINT16,
Industry, produced[0].history[LAST_MONTH].production ),
833 OCL_SVAR( OC_UINT16,
Industry, produced[1].history[LAST_MONTH].production ),
834 OCL_SVAR( OC_UINT16,
Industry, produced[0].history[LAST_MONTH].transported ),
835 OCL_SVAR( OC_UINT16,
Industry, produced[1].history[LAST_MONTH].transported ),
837 OCL_SVAR( OC_UINT8,
Industry, type ),
839 OCL_SVAR( OC_UINT8,
Industry, owner ),
840 OCL_SVAR( OC_UINT8,
Industry, random_colour ),
841 OCL_SVAR(
OC_TTD | OC_FILE_U8 | OC_VAR_I32,
Industry, last_prod_year ),
853 if (!
LoadChunk(ls, i, industry_chunk))
return false;
860 if (i->
type == 0x0A) i->
type = 0x12;
877 static int32_t _old_yearly;
879 static const OldChunks _company_yearly_chunk[] = {
880 OCL_VAR( OC_INT32, 1, &_old_yearly ),
888 for (uint i = 0; i < 13; i++) {
892 if (!
LoadChunk(ls,
nullptr, _company_yearly_chunk))
return false;
901 static const OldChunks _company_economy_chunk[] = {
921 for (uint i = 0; i < 24; i++) {
931 static const OldChunks _company_chunk[] = {
932 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
933 OCL_SVAR( OC_UINT32,
Company, name_2 ),
934 OCL_SVAR( OC_UINT32,
Company, face ),
935 OCL_VAR ( OC_UINT16, 1, &_old_string_id_2 ),
936 OCL_SVAR( OC_UINT32,
Company, president_name_2 ),
938 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, money ),
939 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, current_loan ),
941 OCL_SVAR( OC_UINT8,
Company, colour ),
942 OCL_SVAR( OC_UINT8,
Company, money_fraction ),
943 OCL_SVAR( OC_UINT8,
Company, months_of_bankruptcy ),
944 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Company, bankrupt_asked ),
945 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64,
Company, bankrupt_value ),
946 OCL_SVAR( OC_UINT16,
Company, bankrupt_timeout ),
951 OCL_CHUNK( 3, LoadOldCompanyYearly ),
952 OCL_CHUNK( 1, LoadOldCompanyEconomy ),
954 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Company, inaugurated_year),
955 OCL_SVAR( OC_TILE,
Company, last_build_coordinate ),
956 OCL_SVAR( OC_UINT8,
Company, num_valid_stat_ent ),
960 OCL_SVAR( OC_UINT8,
Company, block_preview ),
963 OCL_SVAR( OC_TILE,
Company, location_of_HQ ),
978 if (!
LoadChunk(ls, c, _company_chunk))
return false;
980 if (_old_string_id == 0) {
993 if (_old_string_id == 0 || _old_string_id == 0x4C00) {
994 _old_string_id = STR_SV_UNNAMED;
995 }
else if (
GB(_old_string_id, 8, 8) == 0x52) {
996 _old_string_id += 0x2A00;
1000 c->
name_1 = _old_string_id;
1003 switch (_old_string_id_2) {
1004 case 0x4CDA: _old_string_id_2 = SPECSTR_PRESIDENT_NAME;
break;
1005 case 0x0006: _old_string_id_2 = STR_SV_EMPTY;
break;
1006 default: _old_string_id_2 = _old_string_id_2 + 0x2A00;
break;
1012 if (num != 0) c->
is_ai =
true;
1020 c->
name_1 = STR_SV_UNNAMED;
1042 static uint32_t _old_order_ptr;
1043 static uint16_t _old_next_ptr;
1046 static const OldChunks vehicle_train_chunk[] = {
1047 OCL_SVAR( OC_UINT8,
Train, track ),
1048 OCL_SVAR( OC_UINT8,
Train, force_proceed ),
1049 OCL_SVAR( OC_UINT16,
Train, crash_anim_pos ),
1050 OCL_SVAR( OC_UINT8,
Train, railtype ),
1057 static const OldChunks vehicle_road_chunk[] = {
1062 OCL_SVAR( OC_UINT8,
RoadVehicle, overtaking_ctr ),
1071 static const OldChunks vehicle_ship_chunk[] = {
1072 OCL_SVAR( OC_UINT8,
Ship, state ),
1079 static const OldChunks vehicle_air_chunk[] = {
1080 OCL_SVAR( OC_UINT8,
Aircraft, pos ),
1081 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Aircraft, targetairport ),
1082 OCL_SVAR( OC_UINT16,
Aircraft, crashed_counter ),
1083 OCL_SVAR( OC_UINT8,
Aircraft, state ),
1090 static const OldChunks vehicle_effect_chunk[] = {
1099 static const OldChunks vehicle_disaster_chunk[] = {
1108 static const OldChunks vehicle_empty_chunk[] = {
1117 uint temp = ls->total_read;
1121 res =
LoadChunk(ls,
nullptr, vehicle_empty_chunk);
1135 if (ls->total_read - temp != 10) {
1136 Debug(oldloader, 0,
"Assert failed in VehicleUnion: invalid chunk size");
1143 static uint16_t _cargo_count;
1145 static const OldChunks vehicle_chunk[] = {
1146 OCL_SVAR( OC_UINT8,
Vehicle, subtype ),
1151 OCL_VAR ( OC_UINT32, 1, &_old_order_ptr ),
1152 OCL_VAR ( OC_UINT16, 1, &_old_order ),
1155 OCL_SVAR( OC_UINT8,
Vehicle, cur_implicit_order_index ),
1156 OCL_SVAR( OC_TILE,
Vehicle, dest_tile ),
1157 OCL_SVAR( OC_UINT16,
Vehicle, load_unload_ticks ),
1158 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, date_of_last_service ),
1159 OCL_SVAR( OC_UINT16,
Vehicle, service_interval ),
1160 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Vehicle, last_station_visited ),
1165 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Vehicle, x_pos ),
1166 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Vehicle, y_pos ),
1167 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32,
Vehicle, z_pos ),
1168 OCL_SVAR( OC_UINT8,
Vehicle, direction ),
1173 OCL_SVAR( OC_UINT8,
Vehicle, owner ),
1174 OCL_SVAR( OC_TILE,
Vehicle, tile ),
1175 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, sprite_cache.sprite_seq.seq[0].sprite ),
1179 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Vehicle, vehstatus ),
1181 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, cur_speed ),
1182 OCL_SVAR( OC_UINT8,
Vehicle, subspeed ),
1183 OCL_SVAR( OC_UINT8,
Vehicle, acceleration ),
1184 OCL_SVAR( OC_UINT8,
Vehicle, progress ),
1186 OCL_SVAR( OC_UINT8,
Vehicle, cargo_type ),
1188 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, cargo_cap ),
1189 OCL_VAR (
OC_TTD | OC_UINT16, 1, &_cargo_count ),
1190 OCL_VAR (
OC_TTO | OC_FILE_U8 | OC_VAR_U16, 1, &_cargo_count ),
1191 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
1192 OCL_VAR ( OC_UINT8, 1, &_cargo_periods ),
1196 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, age ),
1197 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, max_age ),
1198 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32,
Vehicle, build_year ),
1199 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Vehicle, unitnumber ),
1202 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, engine_type ),
1204 OCL_SVAR( OC_UINT8,
Vehicle, spritenum ),
1205 OCL_SVAR( OC_UINT8,
Vehicle, day_counter ),
1207 OCL_SVAR( OC_UINT8,
Vehicle, breakdowns_since_last_service ),
1208 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_ctr ),
1209 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_delay ),
1210 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_chance ),
1214 OCL_SVAR( OC_UINT16,
Vehicle, reliability ),
1215 OCL_SVAR( OC_UINT16,
Vehicle, reliability_spd_dec ),
1217 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Vehicle, profit_this_year ),
1218 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Vehicle, profit_last_year ),
1220 OCL_VAR ( OC_UINT16, 1, &_old_next_ptr ),
1222 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64,
Vehicle, value ),
1224 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1226 OCL_CHUNK( 1, LoadOldVehicleUnion ),
1243 ReadTTDPatchFlags();
1253 default:
return false;
1254 case 0x00 : v =
nullptr;
break;
1256 case 0x20 : v =
new (_current_vehicle_id)
Train();
break;
1257 case 0x21 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1258 case 0x22 : v =
new (_current_vehicle_id)
Ship();
break;
1259 case 0x23 : v =
new (_current_vehicle_id)
Aircraft();
break;
1260 case 0x24 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1264 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1265 if (v ==
nullptr)
continue;
1283 static const byte spriteset_rail[] = {
1284 0, 2, 4, 4, 8, 10, 12, 14, 16, 18, 20, 22, 40, 42, 44, 46,
1285 48, 52, 54, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 120, 122,
1286 124, 126, 128, 130, 132, 134, 136, 138, 140
1318 switch (_old_string_id) {
1320 case 0x0006: _old_string_id = STR_SV_EMPTY;
break;
1321 case 0x8495: _old_string_id = STR_SV_TRAIN_NAME;
break;
1322 case 0x8842: _old_string_id = STR_SV_ROAD_VEHICLE_NAME;
break;
1323 case 0x8C3B: _old_string_id = STR_SV_SHIP_NAME;
break;
1324 case 0x9047: _old_string_id = STR_SV_AIRCRAFT_NAME;
break;
1325 default: _old_string_id += 0x2A00;
break;
1328 _old_vehicle_names[_current_vehicle_id] = _old_string_id;
1333 case 0x00 : v =
nullptr;
break;
1334 case 0x10 : v =
new (_current_vehicle_id)
Train();
break;
1335 case 0x11 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1336 case 0x12 : v =
new (_current_vehicle_id)
Ship();
break;
1337 case 0x13 : v =
new (_current_vehicle_id)
Aircraft();
break;
1338 case 0x14 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1342 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1343 if (v ==
nullptr)
continue;
1345 _old_vehicle_names[_current_vehicle_id] =
RemapOldStringID(_old_string_id);
1348 if (v->
index != _current_vehicle_id) {
1349 Debug(oldloader, 0,
"Loading failed - vehicle-array is invalid");
1354 if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
1356 uint old_id = RemapOrderIndex(_old_order_ptr);
1368 StationID source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
1378 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1379 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Sign, x ),
1380 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Sign, y ),
1381 OCL_SVAR( OC_FILE_U16 | OC_VAR_I8,
Sign, z ),
1391 if (!
LoadChunk(ls, si, sign_chunk))
return false;
1393 if (_old_string_id != 0) {
1395 if (_old_string_id != 0x140A) si->name =
CopyFromOldName(_old_string_id + 0x2A00);
1407 static const OldChunks engine_chunk[] = {
1408 OCL_SVAR( OC_UINT16,
Engine, company_avail ),
1409 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Engine, intro_date ),
1410 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Engine, age ),
1411 OCL_SVAR( OC_UINT16,
Engine, reliability ),
1412 OCL_SVAR( OC_UINT16,
Engine, reliability_spd_dec ),
1413 OCL_SVAR( OC_UINT16,
Engine, reliability_start ),
1414 OCL_SVAR( OC_UINT16,
Engine, reliability_max ),
1415 OCL_SVAR( OC_UINT16,
Engine, reliability_final ),
1416 OCL_SVAR( OC_UINT16,
Engine, duration_phase_1 ),
1417 OCL_SVAR( OC_UINT16,
Engine, duration_phase_2 ),
1418 OCL_SVAR( OC_UINT16,
Engine, duration_phase_3 ),
1421 OCL_SVAR( OC_UINT8,
Engine, flags ),
1423 OCL_SVAR( OC_UINT8,
Engine, preview_wait ),
1438 Engine *e = GetTempDataEngine(num);
1443 static const OldChunks subsidy_chunk[] = {
1444 OCL_SVAR( OC_UINT8,
Subsidy, cargo_type ),
1445 OCL_SVAR( OC_UINT8,
Subsidy, remaining ),
1446 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Subsidy, src ),
1447 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Subsidy, dst ),
1455 bool ret =
LoadChunk(ls, s, subsidy_chunk);
1460 static const OldChunks game_difficulty_chunk[] = {
1509 for (
auto it = range.begin(); it != range.end(); ) {
1511 for (
int i = 0; i < 8; i += 2, ++it) (*it).m6() =
GB(b, i, 2);
1532 ReadTTDPatchFlags();
1537 uint16_t
id = ReadUint16(ls);
1538 uint32_t len = ReadUint32(ls);
1546 ReadUint32(ls);
ReadByte(ls); len -= 5;
1550 uint32_t grfid = ReadUint32(ls);
1570 Debug(oldloader, 3,
"Game saved with TTDPatch version {}.{}.{} r{}",
1571 GB(
_ttdp_version, 24, 8),
GB(
_ttdp_version, 20, 4),
GB(
_ttdp_version, 16, 4),
GB(
_ttdp_version, 0, 16));
1577 Debug(oldloader, 4,
"Skipping unknown extra chunk {}",
id);
1590 extern uint8_t _old_diff_level;
1591 extern uint8_t _old_units;
1600 OCL_ASSERT(
OC_TTD, 0x264 ),
1601 OCL_ASSERT(
OC_TTO, 0x264 ),
1603 OCL_CCHUNK(
OC_TTD, 70, LoadOldTown ),
1604 OCL_CCHUNK(
OC_TTO, 80, LoadOldTown ),
1606 OCL_ASSERT(
OC_TTD, 0x1C18 ),
1607 OCL_ASSERT(
OC_TTO, 0x1AC4 ),
1609 OCL_CCHUNK(
OC_TTD, 5000, LoadOldOrder ),
1610 OCL_CCHUNK(
OC_TTO, 3000, LoadOldOrder ),
1612 OCL_ASSERT(
OC_TTD, 0x4328 ),
1613 OCL_ASSERT(
OC_TTO, 0x3234 ),
1615 OCL_CHUNK( 1, LoadOldAnimTileList ),
1618 OCL_ASSERT(
OC_TTO, 0x3438 ),
1620 OCL_CCHUNK(
OC_TTD, 255, LoadOldDepot ),
1621 OCL_CCHUNK(
OC_TTO, 252, LoadOldDepot ),
1623 OCL_ASSERT(
OC_TTD, 0x4B26 ),
1624 OCL_ASSERT(
OC_TTO, 0x3A20 ),
1632 OCL_VAR ( OC_TILE, 1, &_cur_tileloop_tile ),
1634 OCL_ASSERT(
OC_TTO, 0x3A2E ),
1636 OCL_CNULL(
OC_TTO, 48 * 6 ),
1637 OCL_CNULL(
OC_TTD, 49 * 6 ),
1639 OCL_ASSERT(
OC_TTO, 0x3B4E ),
1641 OCL_CNULL(
OC_TTO, 11 * 8 ),
1642 OCL_CNULL(
OC_TTD, 12 * 8 ),
1644 OCL_ASSERT(
OC_TTD, 0x4CBA ),
1645 OCL_ASSERT(
OC_TTO, 0x3BA6 ),
1647 OCL_CHUNK( 1, LoadOldMapPart1 ),
1649 OCL_ASSERT(
OC_TTD, 0x48CBA ),
1650 OCL_ASSERT(
OC_TTO, 0x23BA6 ),
1652 OCL_CCHUNK(
OC_TTD, 250, LoadOldStation ),
1653 OCL_CCHUNK(
OC_TTO, 200, LoadOldStation ),
1655 OCL_ASSERT(
OC_TTO, 0x29E16 ),
1657 OCL_CCHUNK(
OC_TTD, 90, LoadOldIndustry ),
1658 OCL_CCHUNK(
OC_TTO, 100, LoadOldIndustry ),
1660 OCL_ASSERT(
OC_TTO, 0x2ADB6 ),
1662 OCL_CHUNK( 8, LoadOldCompany ),
1664 OCL_ASSERT(
OC_TTD, 0x547F2 ),
1665 OCL_ASSERT(
OC_TTO, 0x2C746 ),
1670 OCL_ASSERT(
OC_TTD, 0x6F0F2 ),
1671 OCL_ASSERT(
OC_TTO, 0x45746 ),
1676 OCL_ASSERT(
OC_TTO, 0x46A06 ),
1680 OCL_CHUNK( 40, LoadOldSign ),
1682 OCL_ASSERT(
OC_TTO, 0x48C36 ),
1684 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngine ),
1685 OCL_CCHUNK(
OC_TTO, 103, LoadOldEngine ),
1687 OCL_ASSERT(
OC_TTO, 0x496AC ),
1691 OCL_CHUNK( 8, LoadOldSubsidy ),
1693 OCL_ASSERT(
OC_TTO, 0x496CE ),
1699 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_x ),
1700 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_y ),
1701 OCL_VAR ( OC_FILE_U16 | OC_VAR_U8, 1, &_saved_scrollpos_zoom ),
1705 OCL_VAR ( OC_INT16, 1, &_economy.
fluct ),
1709 OCL_ASSERT(
OC_TTO, 0x496E4 ),
1711 OCL_CNULL(
OC_TTD, 144 ),
1713 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngineName ),
1715 OCL_CNULL(
OC_TTD, 144 ),
1720 OCL_VAR ( OC_UINT8, 1, &_old_units ),
1733 OCL_CHUNK( 1, LoadOldGameDifficulty ),
1735 OCL_ASSERT(
OC_TTD, 0x77130 ),
1737 OCL_VAR ( OC_UINT8, 1, &_old_diff_level ),
1748 OCL_ASSERT(
OC_TTD, 0x77179 ),
1749 OCL_ASSERT(
OC_TTO, 0x4971D ),
1751 OCL_CHUNK( 1, LoadOldMapPart2 ),
1753 OCL_ASSERT(
OC_TTD, 0x97179 ),
1754 OCL_ASSERT(
OC_TTO, 0x6971D ),
1757 OCL_CHUNK(1, LoadTTDPatchExtraChunks),
1764 Debug(oldloader, 3,
"Reading main chunk...");
1769 _old_vehicle_names =
nullptr;
1771 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1772 Debug(oldloader, 0,
"Loading failed");
1773 free(_old_vehicle_names);
1777 free(_old_vehicle_names);
1781 Debug(oldloader, 3,
"Done, converting game data...");
1796 Debug(oldloader, 3,
"Finished converting game data");
1797 Debug(oldloader, 1,
"TTD(Patch) savegame successfully converted");
1799 free(_old_vehicle_names);
1806 Debug(oldloader, 3,
"Reading main chunk...");
1810 std::array<byte, 103 *
sizeof(
Engine)> engines;
1811 _old_engines = (
Engine *)engines.data();
1812 std::array<StringID, 800> vehnames;
1813 _old_vehicle_names = vehnames.data();
1816 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1817 Debug(oldloader, 0,
"Loading failed");
1820 Debug(oldloader, 3,
"Done, converting game data...");
1828 Debug(oldloader, 0,
"Conversion failed");
1845 Debug(oldloader, 3,
"Finished converting game data");
1846 Debug(oldloader, 1,
"TTO savegame successfully converted");