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 "../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"
34 #include "table/strings.h"
35 #include "../table/engines.h"
36 #include "../table/townname.h"
38 #include "../safeguards.h"
44 static uint8 *_old_map3;
55 static void FixTTDMapArray()
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];
63 for (
TileIndex t = 0; t < OLD_MAP_SIZE; t++) {
69 case 0x53:
case 0x54:
_m[t].
m5 += 170 - 0x53;
break;
70 case 0x57:
case 0x58:
_m[t].
m5 += 168 - 0x57;
break;
71 case 0x55:
case 0x56:
_m[t].
m5 += 170 - 0x55;
break;
72 case 0x59:
case 0x5A:
_m[t].
m5 += 168 - 0x59;
break;
79 if (
GB(
_m[t].m5, 6, 2) == 1) {
92 if (
GB(
_m[t].m3, 0, 2) == 3) {
120 #define FIXNUM(x, y, z) (((((x) << 16) / (y)) + 1) << z)
122 static uint32 RemapOldTownName(uint32 townnameparts,
byte old_town_name_type)
124 switch (old_town_name_type) {
127 return townnameparts;
132 return FIXNUM(townnameparts - 86,
lengthof(_name_french_real), 0);
135 Debug(misc, 0,
"German Townnames are buggy ({})", townnameparts);
136 return townnameparts;
140 return FIXNUM(townnameparts,
lengthof(_name_spanish_real), 0);
146 return FIXNUM(townnameparts,
lengthof(_name_silly_1), 0) | FIXNUM(
GB(townnameparts, 16, 8),
lengthof(_name_silly_2), 16);
153 static void FixOldTowns()
157 if (
IsInsideMM(town->townnametype, 0x20C1, 0x20C3)) {
164 static StringID *_old_vehicle_names;
174 if ((
size_t)v->next == 0xFFFF) {
181 switch (v->spritenum) {
183 case 0xff: v->spritenum = 0xfe;
break;
184 default: v->spritenum >>= 1;
break;
188 if (v->type ==
VEH_EFFECT) v->subtype = v->subtype >> 1;
212 (v->IsPrimaryVehicle() && v->current_order.IsType(OT_NOTHING))) {
213 v->current_order.MakeDummy();
220 static bool FixTTOMapArray()
222 for (
TileIndex t = 0; t < OLD_MAP_SIZE; t++) {
238 switch (
GB(
_m[t].m5, 6, 2)) {
243 SB(
_m[t].m2, 6, 2,
GB(
_m[t].m5, 3, 2));
257 switch (
GB(
_m[t].m5, 4, 4)) {
259 if (
_m[t].m2 == 4)
_m[t].
m2 = 5;
274 if (
_m[t].m2 >= 5)
_m[t].
m2++;
283 _m[t].
m3 = (
_m[t].
m5 >= 0x08 &&
_m[t].
m5 <= 0x0F) ? 1 : 0;
284 if (
_m[t].m5 >= 8)
_m[t].
m5 -= 8;
285 if (
_m[t].m5 >= 0x42)
_m[t].
m5++;
302 case 0x25:
case 0x27:
303 case 0x28:
case 0x29:
case 0x2A:
case 0x2B:
307 if (
_m[t].m5 >= 0x2C)
_m[t].
m5 += 3;
315 _m[t].
m5 = m5 & 0xE1;
316 if (
GB(m5, 1, 2) == 1)
_m[t].m5 |= 0x02;
317 if (
GB(m5, 1, 2) == 3)
_m[t].m2 |= 0xA0;
319 _m[t].
m3 = (
GB(m5, 1, 2) == 3) ? 1 : 0;
322 if (
GB(m5, 3, 2) == 3)
_m[t].
m3 |= 1;
323 if (
GB(m5, 3, 2) == 1)
_m[t].
m5 |= 0x08;
348 static Engine *_old_engines;
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
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
384 if (v->engine_type >=
lengthof(tto_to_ttd))
return false;
385 v->engine_type = tto_to_ttd[v->engine_type];
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);
397 for (
EngineID i = 0; i < 256; i++) {
398 int oi = ttd_to_tto[i];
399 Engine *e = GetTempDataEngine(i);
416 Engine *oe = &_old_engines[oi];
434 for (uint j = 0; j <
lengthof(tto_to_ttd); j++) {
435 if (tto_to_ttd[j] == i && _old_engines[j].company_avail != 0) {
448 e->
name = std::string{};
454 static void FixTTOCompanies()
464 static const byte tto_colour_remap[] = {
465 COLOUR_DARK_BLUE, COLOUR_GREY, COLOUR_YELLOW, COLOUR_RED,
466 COLOUR_PURPLE, COLOUR_DARK_GREEN, COLOUR_ORANGE, COLOUR_PALE_GREEN,
467 COLOUR_BLUE, COLOUR_GREEN, COLOUR_CREAM, COLOUR_BROWN,
468 COLOUR_WHITE, COLOUR_LIGHT_BLUE, COLOUR_MAUVE, COLOUR_PINK
471 if ((
size_t)tto >=
lengthof(tto_colour_remap))
return COLOUR_GREY;
473 return tto_colour_remap[tto];
476 static inline uint RemapTownIndex(uint x)
481 static inline uint RemapOrderIndex(uint x)
489 static uint32 _old_town_index;
490 static uint16 _old_string_id;
491 static uint16 _old_string_id_2;
493 static void ReadTTDPatchFlags()
503 _bump_assert_value = 0;
522 for (uint i = 0; i < 17; i++) {
532 for (uint i = 0; i < 17; i++) _old_map3[i] = 0;
533 for (uint i = 0x1FE00; i < 0x20000; i++) _old_map3[i] = 0;
541 OCL_SVAR( OC_TILE,
Town, xy ),
543 OCL_SVAR( OC_UINT16,
Town, townnametype ),
544 OCL_SVAR( OC_UINT32,
Town, townnameparts ),
545 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, grow_counter ),
549 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Town, flags ),
552 OCL_SVAR( OC_INT16,
Town, ratings[0] ),
553 OCL_SVAR( OC_INT16,
Town, ratings[1] ),
554 OCL_SVAR( OC_INT16,
Town, ratings[2] ),
555 OCL_SVAR( OC_INT16,
Town, ratings[3] ),
556 OCL_SVAR( OC_INT16,
Town, ratings[4] ),
557 OCL_SVAR( OC_INT16,
Town, ratings[5] ),
558 OCL_SVAR( OC_INT16,
Town, ratings[6] ),
559 OCL_SVAR( OC_INT16,
Town, ratings[7] ),
561 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, have_ratings ),
562 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, statues ),
564 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, time_until_rebuild ),
565 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Town, growth_rate ),
567 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].new_max ),
568 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].new_max ),
569 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].new_act ),
570 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].new_act ),
571 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].old_max ),
572 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].old_max ),
573 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_PASSENGERS].old_act ),
574 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Town, supplied[CT_MAIL].old_act ),
583 OCL_SVAR( OC_UINT8,
Town, road_build_months ),
584 OCL_SVAR( OC_UINT8,
Town, fund_buildings_months ),
594 if (!
LoadChunk(ls, t, town_chunk))
return false;
599 t->townnametype = t->townnametype == 0x10B6 ? 0x20C1 : t->townnametype + 0x2A00;
608 static uint16 _old_order;
610 OCL_VAR ( OC_UINT16, 1, &_old_order ),
616 if (!
LoadChunk(ls,
nullptr, order_chunk))
return false;
621 if (o->
IsType(OT_NOTHING)) {
627 if (prev !=
nullptr) prev->
next = o;
637 OCL_VAR ( OC_TILE, 256, anim_list ),
641 if (!
LoadChunk(ls,
nullptr, anim_chunk))
return false;
644 for (
int i = 0; i < 256; i++) {
645 if (anim_list[i] == 0)
break;
653 OCL_SVAR( OC_TILE,
Depot, xy ),
654 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
661 if (!
LoadChunk(ls, d, depot_chunk))
return false;
675 static StationID _current_station_id;
676 static uint16 _waiting_acceptance;
677 static uint8 _cargo_source;
678 static uint8 _cargo_days;
681 OCL_VAR ( OC_UINT16, 1, &_waiting_acceptance ),
682 OCL_SVAR( OC_UINT8,
GoodsEntry, time_since_pickup ),
684 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
685 OCL_VAR ( OC_UINT8, 1, &_cargo_days ),
700 if (!
LoadChunk(ls, ge, goods_chunk))
return false;
705 ge->
cargo.
Append(
new CargoPacket(
GB(_waiting_acceptance, 0, 12), _cargo_days, (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, 0, 0),
712 static const OldChunks station_chunk[] = {
713 OCL_SVAR( OC_TILE,
Station, xy ),
714 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
717 OCL_SVAR( OC_TILE,
Station, train_station.tile ),
718 OCL_SVAR( OC_TILE,
Station, airport.tile ),
720 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Station, train_station.w ),
725 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
729 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Station, had_vehicle_of_type ),
731 OCL_CHUNK( 12, LoadOldGood ),
733 OCL_SVAR( OC_UINT8,
Station, time_since_load ),
734 OCL_SVAR( OC_UINT8,
Station, time_since_unload ),
735 OCL_SVAR( OC_UINT8,
Station, delete_ctr ),
736 OCL_SVAR( OC_UINT8,
Station, owner ),
737 OCL_SVAR( OC_UINT8,
Station, facilities ),
739 OCL_SVAR(
OC_TTO | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
742 OCL_SVAR(
OC_TTD | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
752 _current_station_id = num;
754 if (!
LoadChunk(ls, st, station_chunk))
return false;
761 st->
string_id = STR_SV_STNAME + (_old_string_id - 0x180F);
783 static const OldChunks industry_chunk[] = {
784 OCL_SVAR( OC_TILE,
Industry, location.tile ),
785 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
786 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Industry, location.w ),
787 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Industry, location.h ),
790 OCL_SVAR(
OC_TTD | OC_UINT16,
Industry, produced_cargo_waiting[0] ),
791 OCL_SVAR(
OC_TTD | OC_UINT16,
Industry, produced_cargo_waiting[1] ),
792 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Industry, produced_cargo_waiting[0] ),
793 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Industry, produced_cargo_waiting[1] ),
795 OCL_SVAR( OC_UINT8,
Industry, production_rate[0] ),
796 OCL_SVAR( OC_UINT8,
Industry, production_rate[1] ),
800 OCL_SVAR( OC_UINT8,
Industry, prod_level ),
802 OCL_SVAR( OC_UINT16,
Industry, this_month_production[0] ),
803 OCL_SVAR( OC_UINT16,
Industry, this_month_production[1] ),
804 OCL_SVAR( OC_UINT16,
Industry, this_month_transported[0] ),
805 OCL_SVAR( OC_UINT16,
Industry, this_month_transported[1] ),
807 OCL_SVAR( OC_UINT8,
Industry, last_month_pct_transported[0] ),
808 OCL_SVAR( OC_UINT8,
Industry, last_month_pct_transported[1] ),
810 OCL_SVAR( OC_UINT16,
Industry, last_month_production[0] ),
811 OCL_SVAR( OC_UINT16,
Industry, last_month_production[1] ),
812 OCL_SVAR( OC_UINT16,
Industry, last_month_transported[0] ),
813 OCL_SVAR( OC_UINT16,
Industry, last_month_transported[1] ),
815 OCL_SVAR( OC_UINT8,
Industry, type ),
817 OCL_SVAR( OC_UINT8,
Industry, owner ),
818 OCL_SVAR( OC_UINT8,
Industry, random_colour ),
819 OCL_SVAR(
OC_TTD | OC_FILE_U8 | OC_VAR_I32,
Industry, last_prod_year ),
831 if (!
LoadChunk(ls, i, industry_chunk))
return false;
838 if (i->
type == 0x0A) i->
type = 0x12;
856 static int32 _old_yearly;
858 static const OldChunks _company_yearly_chunk[] = {
859 OCL_VAR( OC_INT32, 1, &_old_yearly ),
867 for (uint i = 0; i < 13; i++) {
871 if (!
LoadChunk(ls,
nullptr, _company_yearly_chunk))
return false;
880 static const OldChunks _company_economy_chunk[] = {
890 static bool LoadOldCompanyEconomy(
LoadgameState *ls,
int num)
900 for (uint i = 0; i < 24; i++) {
910 static const OldChunks _company_chunk[] = {
911 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
912 OCL_SVAR( OC_UINT32,
Company, name_2 ),
913 OCL_SVAR( OC_UINT32,
Company, face ),
914 OCL_VAR ( OC_UINT16, 1, &_old_string_id_2 ),
915 OCL_SVAR( OC_UINT32,
Company, president_name_2 ),
917 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, money ),
918 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, current_loan ),
920 OCL_SVAR( OC_UINT8,
Company, colour ),
921 OCL_SVAR( OC_UINT8,
Company, money_fraction ),
922 OCL_SVAR( OC_UINT8,
Company, months_of_bankruptcy ),
923 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Company, bankrupt_asked ),
924 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64,
Company, bankrupt_value ),
925 OCL_SVAR( OC_UINT16,
Company, bankrupt_timeout ),
930 OCL_CHUNK( 3, LoadOldCompanyYearly ),
931 OCL_CHUNK( 1, LoadOldCompanyEconomy ),
933 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Company, inaugurated_year),
934 OCL_SVAR( OC_TILE,
Company, last_build_coordinate ),
935 OCL_SVAR( OC_UINT8,
Company, num_valid_stat_ent ),
939 OCL_SVAR( OC_UINT8,
Company, block_preview ),
942 OCL_SVAR( OC_TILE,
Company, location_of_HQ ),
959 if (!
LoadChunk(ls, c, _company_chunk))
return false;
961 if (_old_string_id == 0) {
974 if (_old_string_id == 0 || _old_string_id == 0x4C00) {
975 _old_string_id = STR_SV_UNNAMED;
976 }
else if (
GB(_old_string_id, 8, 8) == 0x52) {
977 _old_string_id += 0x2A00;
981 c->
name_1 = _old_string_id;
984 switch (_old_string_id_2) {
985 case 0x4CDA: _old_string_id_2 = SPECSTR_PRESIDENT_NAME;
break;
986 case 0x0006: _old_string_id_2 = STR_SV_EMPTY;
break;
987 default: _old_string_id_2 = _old_string_id_2 + 0x2A00;
break;
993 if (num != 0) c->
is_ai =
true;
1001 c->
name_1 = STR_SV_UNNAMED;
1023 static uint32 _old_order_ptr;
1024 static uint16 _old_next_ptr;
1027 static const OldChunks vehicle_train_chunk[] = {
1028 OCL_SVAR( OC_UINT8,
Train, track ),
1029 OCL_SVAR( OC_UINT8,
Train, force_proceed ),
1030 OCL_SVAR( OC_UINT16,
Train, crash_anim_pos ),
1031 OCL_SVAR( OC_UINT8,
Train, railtype ),
1038 static const OldChunks vehicle_road_chunk[] = {
1043 OCL_SVAR( OC_UINT8,
RoadVehicle, overtaking_ctr ),
1052 static const OldChunks vehicle_ship_chunk[] = {
1053 OCL_SVAR( OC_UINT8,
Ship, state ),
1060 static const OldChunks vehicle_air_chunk[] = {
1061 OCL_SVAR( OC_UINT8,
Aircraft, pos ),
1062 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Aircraft, targetairport ),
1063 OCL_SVAR( OC_UINT16,
Aircraft, crashed_counter ),
1064 OCL_SVAR( OC_UINT8,
Aircraft, state ),
1071 static const OldChunks vehicle_effect_chunk[] = {
1080 static const OldChunks vehicle_disaster_chunk[] = {
1089 static const OldChunks vehicle_empty_chunk[] = {
1098 uint temp = ls->total_read;
1102 res =
LoadChunk(ls,
nullptr, vehicle_empty_chunk);
1116 if (ls->total_read - temp != 10) {
1117 Debug(oldloader, 0,
"Assert failed in VehicleUnion: invalid chunk size");
1124 static uint16 _cargo_count;
1126 static const OldChunks vehicle_chunk[] = {
1127 OCL_SVAR( OC_UINT8,
Vehicle, subtype ),
1132 OCL_VAR ( OC_UINT32, 1, &_old_order_ptr ),
1133 OCL_VAR ( OC_UINT16, 1, &_old_order ),
1136 OCL_SVAR( OC_UINT8,
Vehicle, cur_implicit_order_index ),
1137 OCL_SVAR( OC_TILE,
Vehicle, dest_tile ),
1138 OCL_SVAR( OC_UINT16,
Vehicle, load_unload_ticks ),
1139 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, date_of_last_service ),
1140 OCL_SVAR( OC_UINT16,
Vehicle, service_interval ),
1141 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Vehicle, last_station_visited ),
1146 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Vehicle, x_pos ),
1147 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Vehicle, y_pos ),
1148 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32,
Vehicle, z_pos ),
1149 OCL_SVAR( OC_UINT8,
Vehicle, direction ),
1154 OCL_SVAR( OC_UINT8,
Vehicle, owner ),
1155 OCL_SVAR( OC_TILE,
Vehicle, tile ),
1156 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, sprite_cache.sprite_seq.seq[0].sprite ),
1160 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Vehicle, vehstatus ),
1162 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, cur_speed ),
1163 OCL_SVAR( OC_UINT8,
Vehicle, subspeed ),
1164 OCL_SVAR( OC_UINT8,
Vehicle, acceleration ),
1165 OCL_SVAR( OC_UINT8,
Vehicle, progress ),
1167 OCL_SVAR( OC_UINT8,
Vehicle, cargo_type ),
1169 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, cargo_cap ),
1170 OCL_VAR (
OC_TTD | OC_UINT16, 1, &_cargo_count ),
1171 OCL_VAR (
OC_TTO | OC_FILE_U8 | OC_VAR_U16, 1, &_cargo_count ),
1172 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
1173 OCL_VAR ( OC_UINT8, 1, &_cargo_days ),
1177 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, age ),
1178 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Vehicle, max_age ),
1179 OCL_SVAR( OC_FILE_U8 | OC_VAR_I32,
Vehicle, build_year ),
1180 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Vehicle, unitnumber ),
1183 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, engine_type ),
1185 OCL_SVAR( OC_UINT8,
Vehicle, spritenum ),
1186 OCL_SVAR( OC_UINT8,
Vehicle, day_counter ),
1188 OCL_SVAR( OC_UINT8,
Vehicle, breakdowns_since_last_service ),
1189 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_ctr ),
1190 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_delay ),
1191 OCL_SVAR( OC_UINT8,
Vehicle, breakdown_chance ),
1195 OCL_SVAR( OC_UINT16,
Vehicle, reliability ),
1196 OCL_SVAR( OC_UINT16,
Vehicle, reliability_spd_dec ),
1198 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Vehicle, profit_this_year ),
1199 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Vehicle, profit_last_year ),
1201 OCL_VAR ( OC_UINT16, 1, &_old_next_ptr ),
1203 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64,
Vehicle, value ),
1205 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1207 OCL_CHUNK( 1, LoadOldVehicleUnion ),
1224 ReadTTDPatchFlags();
1234 default:
return false;
1235 case 0x00 : v =
nullptr;
break;
1237 case 0x20 : v =
new (_current_vehicle_id)
Train();
break;
1238 case 0x21 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1239 case 0x22 : v =
new (_current_vehicle_id)
Ship();
break;
1240 case 0x23 : v =
new (_current_vehicle_id)
Aircraft();
break;
1241 case 0x24 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1245 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1246 if (v ==
nullptr)
continue;
1264 static const byte spriteset_rail[] = {
1265 0, 2, 4, 4, 8, 10, 12, 14, 16, 18, 20, 22, 40, 42, 44, 46,
1266 48, 52, 54, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 120, 122,
1267 124, 126, 128, 130, 132, 134, 136, 138, 140
1299 switch (_old_string_id) {
1301 case 0x0006: _old_string_id = STR_SV_EMPTY;
break;
1302 case 0x8495: _old_string_id = STR_SV_TRAIN_NAME;
break;
1303 case 0x8842: _old_string_id = STR_SV_ROAD_VEHICLE_NAME;
break;
1304 case 0x8C3B: _old_string_id = STR_SV_SHIP_NAME;
break;
1305 case 0x9047: _old_string_id = STR_SV_AIRCRAFT_NAME;
break;
1306 default: _old_string_id += 0x2A00;
break;
1309 _old_vehicle_names[_current_vehicle_id] = _old_string_id;
1314 case 0x00 : v =
nullptr;
break;
1315 case 0x10 : v =
new (_current_vehicle_id)
Train();
break;
1316 case 0x11 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1317 case 0x12 : v =
new (_current_vehicle_id)
Ship();
break;
1318 case 0x13 : v =
new (_current_vehicle_id)
Aircraft();
break;
1319 case 0x14 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1323 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1324 if (v ==
nullptr)
continue;
1326 _old_vehicle_names[_current_vehicle_id] =
RemapOldStringID(_old_string_id);
1329 if (v->
index != _current_vehicle_id) {
1330 Debug(oldloader, 0,
"Loading failed - vehicle-array is invalid");
1335 if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
1337 uint old_id = RemapOrderIndex(_old_order_ptr);
1345 StationID source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
1355 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1356 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Sign, x ),
1357 OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,
Sign, y ),
1358 OCL_SVAR( OC_FILE_U16 | OC_VAR_I8,
Sign, z ),
1368 if (!
LoadChunk(ls, si, sign_chunk))
return false;
1370 if (_old_string_id != 0) {
1372 if (_old_string_id != 0x140A) si->name =
CopyFromOldName(_old_string_id + 0x2A00);
1384 static const OldChunks engine_chunk[] = {
1385 OCL_SVAR( OC_UINT16,
Engine, company_avail ),
1386 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Engine, intro_date ),
1387 OCL_SVAR( OC_FILE_U16 | OC_VAR_U32,
Engine, age ),
1388 OCL_SVAR( OC_UINT16,
Engine, reliability ),
1389 OCL_SVAR( OC_UINT16,
Engine, reliability_spd_dec ),
1390 OCL_SVAR( OC_UINT16,
Engine, reliability_start ),
1391 OCL_SVAR( OC_UINT16,
Engine, reliability_max ),
1392 OCL_SVAR( OC_UINT16,
Engine, reliability_final ),
1393 OCL_SVAR( OC_UINT16,
Engine, duration_phase_1 ),
1394 OCL_SVAR( OC_UINT16,
Engine, duration_phase_2 ),
1395 OCL_SVAR( OC_UINT16,
Engine, duration_phase_3 ),
1398 OCL_SVAR( OC_UINT8,
Engine, flags ),
1400 OCL_SVAR( OC_UINT8,
Engine, preview_wait ),
1415 Engine *e = GetTempDataEngine(num);
1420 static const OldChunks subsidy_chunk[] = {
1421 OCL_SVAR( OC_UINT8,
Subsidy, cargo_type ),
1422 OCL_SVAR( OC_UINT8,
Subsidy, remaining ),
1423 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Subsidy, src ),
1424 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Subsidy, dst ),
1432 bool ret =
LoadChunk(ls, s, subsidy_chunk);
1437 static const OldChunks game_difficulty_chunk[] = {
1458 static bool LoadOldGameDifficulty(
LoadgameState *ls,
int num)
1473 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1476 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1481 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1483 _old_map3[i * 2 + 1] =
ReadByte(ls);
1485 for (uint i = 0; i < OLD_MAP_SIZE / 4; i++) {
1487 _me[i * 4 + 0].
m6 =
GB(b, 0, 2);
1488 _me[i * 4 + 1].
m6 =
GB(b, 2, 2);
1489 _me[i * 4 + 2].
m6 =
GB(b, 4, 2);
1490 _me[i * 4 + 3].
m6 =
GB(b, 6, 2);
1501 for (i = 0; i < OLD_MAP_SIZE; i++) {
1504 for (i = 0; i < OLD_MAP_SIZE; i++) {
1511 static bool LoadTTDPatchExtraChunks(
LoadgameState *ls,
int num)
1513 ReadTTDPatchFlags();
1518 uint16
id = ReadUint16(ls);
1519 uint32 len = ReadUint32(ls);
1527 ReadUint32(ls);
ReadByte(ls); len -= 5;
1531 uint32 grfid = ReadUint32(ls);
1551 Debug(oldloader, 3,
"Game saved with TTDPatch version {}.{}.{} r{}",
1552 GB(
_ttdp_version, 24, 8),
GB(
_ttdp_version, 20, 4),
GB(
_ttdp_version, 16, 4),
GB(
_ttdp_version, 0, 16));
1558 Debug(oldloader, 4,
"Skipping unknown extra chunk {}",
id);
1571 extern uint8 _old_diff_level;
1572 extern uint8 _old_units;
1576 OCL_VAR ( OC_FILE_U16 | OC_VAR_U32, 1, &
_date ),
1581 OCL_ASSERT(
OC_TTD, 0x264 ),
1582 OCL_ASSERT(
OC_TTO, 0x264 ),
1584 OCL_CCHUNK(
OC_TTD, 70, LoadOldTown ),
1585 OCL_CCHUNK(
OC_TTO, 80, LoadOldTown ),
1587 OCL_ASSERT(
OC_TTD, 0x1C18 ),
1588 OCL_ASSERT(
OC_TTO, 0x1AC4 ),
1590 OCL_CCHUNK(
OC_TTD, 5000, LoadOldOrder ),
1591 OCL_CCHUNK(
OC_TTO, 3000, LoadOldOrder ),
1593 OCL_ASSERT(
OC_TTD, 0x4328 ),
1594 OCL_ASSERT(
OC_TTO, 0x3234 ),
1596 OCL_CHUNK( 1, LoadOldAnimTileList ),
1599 OCL_ASSERT(
OC_TTO, 0x3438 ),
1601 OCL_CCHUNK(
OC_TTD, 255, LoadOldDepot ),
1602 OCL_CCHUNK(
OC_TTO, 252, LoadOldDepot ),
1604 OCL_ASSERT(
OC_TTD, 0x4B26 ),
1605 OCL_ASSERT(
OC_TTO, 0x3A20 ),
1613 OCL_VAR ( OC_TILE, 1, &_cur_tileloop_tile ),
1615 OCL_ASSERT(
OC_TTO, 0x3A2E ),
1617 OCL_CNULL(
OC_TTO, 48 * 6 ),
1618 OCL_CNULL(
OC_TTD, 49 * 6 ),
1620 OCL_ASSERT(
OC_TTO, 0x3B4E ),
1622 OCL_CNULL(
OC_TTO, 11 * 8 ),
1623 OCL_CNULL(
OC_TTD, 12 * 8 ),
1625 OCL_ASSERT(
OC_TTD, 0x4CBA ),
1626 OCL_ASSERT(
OC_TTO, 0x3BA6 ),
1628 OCL_CHUNK( 1, LoadOldMapPart1 ),
1630 OCL_ASSERT(
OC_TTD, 0x48CBA ),
1631 OCL_ASSERT(
OC_TTO, 0x23BA6 ),
1633 OCL_CCHUNK(
OC_TTD, 250, LoadOldStation ),
1634 OCL_CCHUNK(
OC_TTO, 200, LoadOldStation ),
1636 OCL_ASSERT(
OC_TTO, 0x29E16 ),
1638 OCL_CCHUNK(
OC_TTD, 90, LoadOldIndustry ),
1639 OCL_CCHUNK(
OC_TTO, 100, LoadOldIndustry ),
1641 OCL_ASSERT(
OC_TTO, 0x2ADB6 ),
1643 OCL_CHUNK( 8, LoadOldCompany ),
1645 OCL_ASSERT(
OC_TTD, 0x547F2 ),
1646 OCL_ASSERT(
OC_TTO, 0x2C746 ),
1651 OCL_ASSERT(
OC_TTD, 0x6F0F2 ),
1652 OCL_ASSERT(
OC_TTO, 0x45746 ),
1657 OCL_ASSERT(
OC_TTO, 0x46A06 ),
1661 OCL_CHUNK( 40, LoadOldSign ),
1663 OCL_ASSERT(
OC_TTO, 0x48C36 ),
1665 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngine ),
1666 OCL_CCHUNK(
OC_TTO, 103, LoadOldEngine ),
1668 OCL_ASSERT(
OC_TTO, 0x496AC ),
1672 OCL_CHUNK( 8, LoadOldSubsidy ),
1674 OCL_ASSERT(
OC_TTO, 0x496CE ),
1680 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_x ),
1681 OCL_VAR ( OC_FILE_I16 | OC_VAR_I32, 1, &_saved_scrollpos_y ),
1682 OCL_VAR ( OC_FILE_U16 | OC_VAR_U8, 1, &_saved_scrollpos_zoom ),
1686 OCL_VAR ( OC_INT16, 1, &_economy.
fluct ),
1690 OCL_ASSERT(
OC_TTO, 0x496E4 ),
1692 OCL_CNULL(
OC_TTD, 144 ),
1694 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngineName ),
1696 OCL_CNULL(
OC_TTD, 144 ),
1701 OCL_VAR ( OC_UINT8, 1, &_old_units ),
1714 OCL_CHUNK( 1, LoadOldGameDifficulty ),
1716 OCL_ASSERT(
OC_TTD, 0x77130 ),
1718 OCL_VAR ( OC_UINT8, 1, &_old_diff_level ),
1729 OCL_ASSERT(
OC_TTD, 0x77179 ),
1730 OCL_ASSERT(
OC_TTO, 0x4971D ),
1732 OCL_CHUNK( 1, LoadOldMapPart2 ),
1734 OCL_ASSERT(
OC_TTD, 0x97179 ),
1735 OCL_ASSERT(
OC_TTO, 0x6971D ),
1738 OCL_CHUNK(1, LoadTTDPatchExtraChunks),
1745 Debug(oldloader, 3,
"Reading main chunk...");
1750 std::array<byte, OLD_MAP_SIZE * 2> map3;
1751 _old_map3 = map3.data();
1752 _old_vehicle_names =
nullptr;
1754 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1755 Debug(oldloader, 0,
"Loading failed");
1756 free(_old_vehicle_names);
1760 free(_old_vehicle_names);
1764 Debug(oldloader, 3,
"Done, converting game data...");
1779 Debug(oldloader, 3,
"Finished converting game data");
1780 Debug(oldloader, 1,
"TTD(Patch) savegame successfully converted");
1782 free(_old_vehicle_names);
1789 Debug(oldloader, 3,
"Reading main chunk...");
1793 std::array<byte, 103 *
sizeof(
Engine)> engines;
1794 _old_engines = (
Engine *)engines.data();
1795 std::array<StringID, 800> vehnames;
1796 _old_vehicle_names = vehnames.data();
1799 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1800 Debug(oldloader, 0,
"Loading failed");
1803 Debug(oldloader, 3,
"Done, converting game data...");
1811 Debug(oldloader, 0,
"Conversion failed");
1828 Debug(oldloader, 3,
"Finished converting game data");
1829 Debug(oldloader, 1,
"TTO savegame successfully converted");