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);
417 Engine *oe = &_old_engines[oi];
435 for (uint j = 0; j <
lengthof(tto_to_ttd); j++) {
436 if (tto_to_ttd[j] == i && _old_engines[j].company_avail != 0) {
449 e->
name = std::string{};
455 static void FixTTOCompanies()
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
472 if ((
size_t)tto >=
lengthof(tto_colour_remap))
return COLOUR_GREY;
474 return tto_colour_remap[tto];
477 static inline uint RemapTownIndex(uint x)
482 static inline uint RemapOrderIndex(uint x)
490 static uint32 _old_town_index;
491 static uint16 _old_string_id;
492 static uint16 _old_string_id_2;
494 static void ReadTTDPatchFlags()
504 _bump_assert_value = 0;
523 for (uint i = 0; i < 17; i++) {
533 for (uint i = 0; i < 17; i++) _old_map3[i] = 0;
534 for (uint i = 0x1FE00; i < 0x20000; i++) _old_map3[i] = 0;
542 OCL_SVAR( OC_TILE,
Town, xy ),
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 ),
550 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Town, flags ),
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] ),
562 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, have_ratings ),
563 OCL_SVAR( OC_FILE_U32 | OC_VAR_U16,
Town, statues ),
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 ),
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 ),
584 OCL_SVAR( OC_UINT8,
Town, road_build_months ),
585 OCL_SVAR( OC_UINT8,
Town, fund_buildings_months ),
595 if (!
LoadChunk(ls, t, town_chunk))
return false;
600 t->townnametype = t->townnametype == 0x10B6 ? 0x20C1 : t->townnametype + 0x2A00;
609 static uint16 _old_order;
611 OCL_VAR ( OC_UINT16, 1, &_old_order ),
617 if (!
LoadChunk(ls,
nullptr, order_chunk))
return false;
622 if (o->
IsType(OT_NOTHING)) {
628 if (prev !=
nullptr) prev->
next = o;
638 OCL_VAR ( OC_TILE, 256, anim_list ),
642 if (!
LoadChunk(ls,
nullptr, anim_chunk))
return false;
645 for (
int i = 0; i < 256; i++) {
646 if (anim_list[i] == 0)
break;
654 OCL_SVAR( OC_TILE,
Depot, xy ),
655 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
662 if (!
LoadChunk(ls, d, depot_chunk))
return false;
676 static StationID _current_station_id;
677 static uint16 _waiting_acceptance;
678 static uint8 _cargo_source;
679 static uint8 _cargo_days;
682 OCL_VAR ( OC_UINT16, 1, &_waiting_acceptance ),
683 OCL_SVAR( OC_UINT8,
GoodsEntry, time_since_pickup ),
685 OCL_VAR ( OC_UINT8, 1, &_cargo_source ),
686 OCL_VAR ( OC_UINT8, 1, &_cargo_days ),
701 if (!
LoadChunk(ls, ge, goods_chunk))
return false;
706 ge->
cargo.
Append(
new CargoPacket(
GB(_waiting_acceptance, 0, 12), _cargo_days, (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source, 0, 0),
713 static const OldChunks station_chunk[] = {
714 OCL_SVAR( OC_TILE,
Station, xy ),
715 OCL_VAR ( OC_UINT32, 1, &_old_town_index ),
718 OCL_SVAR( OC_TILE,
Station, train_station.tile ),
719 OCL_SVAR( OC_TILE,
Station, airport.tile ),
721 OCL_SVAR( OC_FILE_U8 | OC_VAR_U16,
Station, train_station.w ),
726 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
730 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Station, had_vehicle_of_type ),
732 OCL_CHUNK( 12, LoadOldGood ),
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 ),
740 OCL_SVAR(
OC_TTO | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
743 OCL_SVAR(
OC_TTD | OC_FILE_U16 | OC_VAR_U64,
Station, airport.flags ),
753 _current_station_id = num;
755 if (!
LoadChunk(ls, st, station_chunk))
return false;
762 st->
string_id = STR_SV_STNAME + (_old_string_id - 0x180F);
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 ),
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] ),
796 OCL_SVAR( OC_UINT8,
Industry, production_rate[0] ),
797 OCL_SVAR( OC_UINT8,
Industry, production_rate[1] ),
801 OCL_SVAR( OC_UINT8,
Industry, prod_level ),
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] ),
808 OCL_SVAR( OC_UINT8,
Industry, last_month_pct_transported[0] ),
809 OCL_SVAR( OC_UINT8,
Industry, last_month_pct_transported[1] ),
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] ),
816 OCL_SVAR( OC_UINT8,
Industry, type ),
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 ),
832 if (!
LoadChunk(ls, i, industry_chunk))
return false;
839 if (i->
type == 0x0A) i->
type = 0x12;
857 static int32 _old_yearly;
859 static const OldChunks _company_yearly_chunk[] = {
860 OCL_VAR( OC_INT32, 1, &_old_yearly ),
868 for (uint i = 0; i < 13; i++) {
872 if (!
LoadChunk(ls,
nullptr, _company_yearly_chunk))
return false;
881 static const OldChunks _company_economy_chunk[] = {
891 static bool LoadOldCompanyEconomy(
LoadgameState *ls,
int num)
901 for (uint i = 0; i < 24; i++) {
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 ),
918 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, money ),
919 OCL_SVAR( OC_FILE_I32 | OC_VAR_I64,
Company, current_loan ),
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 ),
931 OCL_CHUNK( 3, LoadOldCompanyYearly ),
932 OCL_CHUNK( 1, LoadOldCompanyEconomy ),
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 ),
940 OCL_SVAR( OC_UINT8,
Company, block_preview ),
943 OCL_SVAR( OC_TILE,
Company, location_of_HQ ),
960 if (!
LoadChunk(ls, c, _company_chunk))
return false;
962 if (_old_string_id == 0) {
975 if (_old_string_id == 0 || _old_string_id == 0x4C00) {
976 _old_string_id = STR_SV_UNNAMED;
977 }
else if (
GB(_old_string_id, 8, 8) == 0x52) {
978 _old_string_id += 0x2A00;
982 c->
name_1 = _old_string_id;
985 switch (_old_string_id_2) {
986 case 0x4CDA: _old_string_id_2 = SPECSTR_PRESIDENT_NAME;
break;
987 case 0x0006: _old_string_id_2 = STR_SV_EMPTY;
break;
988 default: _old_string_id_2 = _old_string_id_2 + 0x2A00;
break;
994 if (num != 0) c->
is_ai =
true;
1002 c->
name_1 = STR_SV_UNNAMED;
1024 static uint32 _old_order_ptr;
1025 static uint16 _old_next_ptr;
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 ),
1039 static const OldChunks vehicle_road_chunk[] = {
1044 OCL_SVAR( OC_UINT8,
RoadVehicle, overtaking_ctr ),
1053 static const OldChunks vehicle_ship_chunk[] = {
1054 OCL_SVAR( OC_UINT8,
Ship, state ),
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 ),
1072 static const OldChunks vehicle_effect_chunk[] = {
1081 static const OldChunks vehicle_disaster_chunk[] = {
1090 static const OldChunks vehicle_empty_chunk[] = {
1099 uint temp = ls->total_read;
1103 res =
LoadChunk(ls,
nullptr, vehicle_empty_chunk);
1117 if (ls->total_read - temp != 10) {
1118 Debug(oldloader, 0,
"Assert failed in VehicleUnion: invalid chunk size");
1125 static uint16 _cargo_count;
1127 static const OldChunks vehicle_chunk[] = {
1128 OCL_SVAR( OC_UINT8,
Vehicle, subtype ),
1133 OCL_VAR ( OC_UINT32, 1, &_old_order_ptr ),
1134 OCL_VAR ( OC_UINT16, 1, &_old_order ),
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 ),
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 ),
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 ),
1161 OCL_SVAR( OC_FILE_U16 | OC_VAR_U8,
Vehicle, vehstatus ),
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 ),
1168 OCL_SVAR( OC_UINT8,
Vehicle, cargo_type ),
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 ),
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 ),
1184 OCL_SVAR(
OC_TTO | OC_FILE_U8 | OC_VAR_U16,
Vehicle, engine_type ),
1186 OCL_SVAR( OC_UINT8,
Vehicle, spritenum ),
1187 OCL_SVAR( OC_UINT8,
Vehicle, day_counter ),
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 ),
1196 OCL_SVAR( OC_UINT16,
Vehicle, reliability ),
1197 OCL_SVAR( OC_UINT16,
Vehicle, reliability_spd_dec ),
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 ),
1202 OCL_VAR ( OC_UINT16, 1, &_old_next_ptr ),
1204 OCL_SVAR( OC_FILE_U32 | OC_VAR_I64,
Vehicle, value ),
1206 OCL_VAR ( OC_UINT16, 1, &_old_string_id ),
1208 OCL_CHUNK( 1, LoadOldVehicleUnion ),
1225 ReadTTDPatchFlags();
1235 default:
return false;
1236 case 0x00 : v =
nullptr;
break;
1238 case 0x20 : v =
new (_current_vehicle_id)
Train();
break;
1239 case 0x21 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1240 case 0x22 : v =
new (_current_vehicle_id)
Ship();
break;
1241 case 0x23 : v =
new (_current_vehicle_id)
Aircraft();
break;
1242 case 0x24 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1246 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1247 if (v ==
nullptr)
continue;
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
1300 switch (_old_string_id) {
1302 case 0x0006: _old_string_id = STR_SV_EMPTY;
break;
1303 case 0x8495: _old_string_id = STR_SV_TRAIN_NAME;
break;
1304 case 0x8842: _old_string_id = STR_SV_ROAD_VEHICLE_NAME;
break;
1305 case 0x8C3B: _old_string_id = STR_SV_SHIP_NAME;
break;
1306 case 0x9047: _old_string_id = STR_SV_AIRCRAFT_NAME;
break;
1307 default: _old_string_id += 0x2A00;
break;
1310 _old_vehicle_names[_current_vehicle_id] = _old_string_id;
1315 case 0x00 : v =
nullptr;
break;
1316 case 0x10 : v =
new (_current_vehicle_id)
Train();
break;
1317 case 0x11 : v =
new (_current_vehicle_id)
RoadVehicle();
break;
1318 case 0x12 : v =
new (_current_vehicle_id)
Ship();
break;
1319 case 0x13 : v =
new (_current_vehicle_id)
Aircraft();
break;
1320 case 0x14 : v =
new (_current_vehicle_id)
EffectVehicle();
break;
1324 if (!
LoadChunk(ls, v, vehicle_chunk))
return false;
1325 if (v ==
nullptr)
continue;
1327 _old_vehicle_names[_current_vehicle_id] =
RemapOldStringID(_old_string_id);
1330 if (v->
index != _current_vehicle_id) {
1331 Debug(oldloader, 0,
"Loading failed - vehicle-array is invalid");
1336 if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
1338 uint old_id = RemapOrderIndex(_old_order_ptr);
1346 StationID source = (_cargo_source == 0xFF) ? INVALID_STATION : _cargo_source;
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 ),
1369 if (!
LoadChunk(ls, si, sign_chunk))
return false;
1371 if (_old_string_id != 0) {
1373 if (_old_string_id != 0x140A) si->name =
CopyFromOldName(_old_string_id + 0x2A00);
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 ),
1399 OCL_SVAR( OC_UINT8,
Engine, flags ),
1401 OCL_SVAR( OC_UINT8,
Engine, preview_wait ),
1416 Engine *e = GetTempDataEngine(num);
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 ),
1433 bool ret =
LoadChunk(ls, s, subsidy_chunk);
1438 static const OldChunks game_difficulty_chunk[] = {
1459 static bool LoadOldGameDifficulty(
LoadgameState *ls,
int num)
1474 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1477 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1482 for (uint i = 0; i < OLD_MAP_SIZE; i++) {
1484 _old_map3[i * 2 + 1] =
ReadByte(ls);
1486 for (uint i = 0; i < OLD_MAP_SIZE / 4; i++) {
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);
1502 for (i = 0; i < OLD_MAP_SIZE; i++) {
1505 for (i = 0; i < OLD_MAP_SIZE; i++) {
1512 static bool LoadTTDPatchExtraChunks(
LoadgameState *ls,
int num)
1514 ReadTTDPatchFlags();
1519 uint16
id = ReadUint16(ls);
1520 uint32 len = ReadUint32(ls);
1528 ReadUint32(ls);
ReadByte(ls); len -= 5;
1532 uint32 grfid = 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));
1559 Debug(oldloader, 4,
"Skipping unknown extra chunk {}",
id);
1572 extern uint8 _old_diff_level;
1573 extern uint8 _old_units;
1577 OCL_VAR ( OC_FILE_U16 | OC_VAR_U32, 1, &
_date ),
1582 OCL_ASSERT(
OC_TTD, 0x264 ),
1583 OCL_ASSERT(
OC_TTO, 0x264 ),
1585 OCL_CCHUNK(
OC_TTD, 70, LoadOldTown ),
1586 OCL_CCHUNK(
OC_TTO, 80, LoadOldTown ),
1588 OCL_ASSERT(
OC_TTD, 0x1C18 ),
1589 OCL_ASSERT(
OC_TTO, 0x1AC4 ),
1591 OCL_CCHUNK(
OC_TTD, 5000, LoadOldOrder ),
1592 OCL_CCHUNK(
OC_TTO, 3000, LoadOldOrder ),
1594 OCL_ASSERT(
OC_TTD, 0x4328 ),
1595 OCL_ASSERT(
OC_TTO, 0x3234 ),
1597 OCL_CHUNK( 1, LoadOldAnimTileList ),
1600 OCL_ASSERT(
OC_TTO, 0x3438 ),
1602 OCL_CCHUNK(
OC_TTD, 255, LoadOldDepot ),
1603 OCL_CCHUNK(
OC_TTO, 252, LoadOldDepot ),
1605 OCL_ASSERT(
OC_TTD, 0x4B26 ),
1606 OCL_ASSERT(
OC_TTO, 0x3A20 ),
1614 OCL_VAR ( OC_TILE, 1, &_cur_tileloop_tile ),
1616 OCL_ASSERT(
OC_TTO, 0x3A2E ),
1618 OCL_CNULL(
OC_TTO, 48 * 6 ),
1619 OCL_CNULL(
OC_TTD, 49 * 6 ),
1621 OCL_ASSERT(
OC_TTO, 0x3B4E ),
1623 OCL_CNULL(
OC_TTO, 11 * 8 ),
1624 OCL_CNULL(
OC_TTD, 12 * 8 ),
1626 OCL_ASSERT(
OC_TTD, 0x4CBA ),
1627 OCL_ASSERT(
OC_TTO, 0x3BA6 ),
1629 OCL_CHUNK( 1, LoadOldMapPart1 ),
1631 OCL_ASSERT(
OC_TTD, 0x48CBA ),
1632 OCL_ASSERT(
OC_TTO, 0x23BA6 ),
1634 OCL_CCHUNK(
OC_TTD, 250, LoadOldStation ),
1635 OCL_CCHUNK(
OC_TTO, 200, LoadOldStation ),
1637 OCL_ASSERT(
OC_TTO, 0x29E16 ),
1639 OCL_CCHUNK(
OC_TTD, 90, LoadOldIndustry ),
1640 OCL_CCHUNK(
OC_TTO, 100, LoadOldIndustry ),
1642 OCL_ASSERT(
OC_TTO, 0x2ADB6 ),
1644 OCL_CHUNK( 8, LoadOldCompany ),
1646 OCL_ASSERT(
OC_TTD, 0x547F2 ),
1647 OCL_ASSERT(
OC_TTO, 0x2C746 ),
1652 OCL_ASSERT(
OC_TTD, 0x6F0F2 ),
1653 OCL_ASSERT(
OC_TTO, 0x45746 ),
1658 OCL_ASSERT(
OC_TTO, 0x46A06 ),
1662 OCL_CHUNK( 40, LoadOldSign ),
1664 OCL_ASSERT(
OC_TTO, 0x48C36 ),
1666 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngine ),
1667 OCL_CCHUNK(
OC_TTO, 103, LoadOldEngine ),
1669 OCL_ASSERT(
OC_TTO, 0x496AC ),
1673 OCL_CHUNK( 8, LoadOldSubsidy ),
1675 OCL_ASSERT(
OC_TTO, 0x496CE ),
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 ),
1687 OCL_VAR ( OC_INT16, 1, &_economy.
fluct ),
1691 OCL_ASSERT(
OC_TTO, 0x496E4 ),
1693 OCL_CNULL(
OC_TTD, 144 ),
1695 OCL_CCHUNK(
OC_TTD, 256, LoadOldEngineName ),
1697 OCL_CNULL(
OC_TTD, 144 ),
1702 OCL_VAR ( OC_UINT8, 1, &_old_units ),
1715 OCL_CHUNK( 1, LoadOldGameDifficulty ),
1717 OCL_ASSERT(
OC_TTD, 0x77130 ),
1719 OCL_VAR ( OC_UINT8, 1, &_old_diff_level ),
1730 OCL_ASSERT(
OC_TTD, 0x77179 ),
1731 OCL_ASSERT(
OC_TTO, 0x4971D ),
1733 OCL_CHUNK( 1, LoadOldMapPart2 ),
1735 OCL_ASSERT(
OC_TTD, 0x97179 ),
1736 OCL_ASSERT(
OC_TTO, 0x6971D ),
1739 OCL_CHUNK(1, LoadTTDPatchExtraChunks),
1746 Debug(oldloader, 3,
"Reading main chunk...");
1751 std::array<byte, OLD_MAP_SIZE * 2> map3;
1752 _old_map3 = map3.data();
1753 _old_vehicle_names =
nullptr;
1755 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1756 Debug(oldloader, 0,
"Loading failed");
1757 free(_old_vehicle_names);
1761 free(_old_vehicle_names);
1765 Debug(oldloader, 3,
"Done, converting game data...");
1780 Debug(oldloader, 3,
"Finished converting game data");
1781 Debug(oldloader, 1,
"TTD(Patch) savegame successfully converted");
1783 free(_old_vehicle_names);
1790 Debug(oldloader, 3,
"Reading main chunk...");
1794 std::array<byte, 103 *
sizeof(
Engine)> engines;
1795 _old_engines = (
Engine *)engines.data();
1796 std::array<StringID, 800> vehnames;
1797 _old_vehicle_names = vehnames.data();
1800 if (!
LoadChunk(ls,
nullptr, main_chunk)) {
1801 Debug(oldloader, 0,
"Loading failed");
1804 Debug(oldloader, 3,
"Done, converting game data...");
1812 Debug(oldloader, 0,
"Conversion failed");
1829 Debug(oldloader, 3,
"Finished converting game data");
1830 Debug(oldloader, 1,
"TTO savegame successfully converted");