diff options
Diffstat (limited to 'src/saveload')
-rw-r--r-- | src/saveload/oldloader.cpp | 120 |
1 files changed, 67 insertions, 53 deletions
diff --git a/src/saveload/oldloader.cpp b/src/saveload/oldloader.cpp index 6c8103457..70d159202 100644 --- a/src/saveload/oldloader.cpp +++ b/src/saveload/oldloader.cpp @@ -26,6 +26,8 @@ #include "../strings_func.h" #include "../effectvehicle_base.h" #include "../string_func.h" +#include "../core/mem_func.hpp" +#include "../core/alloc_type.hpp" #include "table/strings.h" @@ -312,6 +314,67 @@ static void InitLoading(LoadgameState *ls) * Begin -- Stuff to fix the savegames to be OpenTTD compatible */ +static uint8 *_old_map3; + +static void FixOldMapArray() +{ + /* _old_map3 is moved to _m::m3 and _m::m4 */ + for (TileIndex t = 0; t < OLD_MAP_SIZE; t++) { + _m[t].m3 = _old_map3[t * 2]; + _m[t].m4 = _old_map3[t * 2 + 1]; + } + + for (TileIndex t = 0; t < OLD_MAP_SIZE; t++) { + switch (GetTileType(t)) { + case MP_STATION: + _m[t].m4 = 0; // We do not understand this TTDP station mapping (yet) + switch (_m[t].m5) { + /* We have drive through stops at a totally different place */ + case 0x53: case 0x54: _m[t].m5 += 170 - 0x53; break; // Bus drive through + case 0x57: case 0x58: _m[t].m5 += 168 - 0x57; break; // Truck drive through + case 0x55: case 0x56: _m[t].m5 += 170 - 0x55; break; // Bus tram stop + case 0x59: case 0x5A: _m[t].m5 += 168 - 0x59; break; // Truck tram stop + default: break; + } + break; + + case MP_RAILWAY: + /* We save presignals different from TTDPatch, convert them */ + if (GB(_m[t].m5, 6, 2) == 1) { // RAIL_TILE_SIGNALS + /* This byte is always zero in TTD for this type of tile */ + if (_m[t].m4) { // Convert the presignals to our own format + _m[t].m4 = (_m[t].m4 >> 1) & 7; + } + } + /* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just + * clear it for ourselves and let OTTD's rebuild PBS itself */ + _m[t].m4 &= 0xF; // Only keep the lower four bits; upper four is PBS + break; + + case MP_WATER: + /* if water class == 3, make river there */ + if (GB(_m[t].m3, 0, 2) == 3) { + SetTileType(t, MP_WATER); + SetTileOwner(t, OWNER_WATER); + _m[t].m2 = 0; + _m[t].m3 = 2; // WATER_CLASS_RIVER + _m[t].m4 = Random(); + _m[t].m5 = 0; + } + break; + + default: + break; + } + } + + /* Some old TTD(Patch) savegames could have buoys at tile 0 + * (without assigned station struct) */ + MemSetT(&_m[0], 0); + SetTileType(0, MP_WATER); + SetTileOwner(0, OWNER_WATER); +} + extern uint32 GetOldTownName(uint32 townnameparts, byte old_town_name_type); static void FixOldTowns() @@ -392,7 +455,6 @@ extern uint _animated_tile_count; extern char *_old_name_array; static byte _old_vehicle_multiplier; -static uint8 *_old_map3; static uint32 _old_town_index; static uint16 _old_string_id; static uint16 _old_string_id_2; @@ -1450,67 +1512,26 @@ static const OldChunks main_chunk[] = { static bool LoadOldMain(LoadgameState *ls) { - int i; - DEBUG(oldloader, 3, "Reading main chunk..."); /* Load the biggest chunk */ - _old_map3 = MallocT<byte>(OLD_MAP_SIZE * 2); + SmallStackSafeStackAlloc<byte, OLD_MAP_SIZE * 2> map3; + _old_map3 = map3.data; _old_vehicle_names = NULL; if (!LoadChunk(ls, NULL, main_chunk)) { DEBUG(oldloader, 0, "Loading failed"); - free(_old_map3); free(_old_vehicle_names); return false; } DEBUG(oldloader, 3, "Done, converting game data..."); + FixOldMapArray(); + /* Fix some general stuff */ _settings_game.game_creation.landscape = _settings_game.game_creation.landscape & 0xF; /* Remap some pointers */ _cur_town_ctr = REMAP_TOWN_IDX(_old_cur_town_ctr); - /* _old_map3 is changed in _map3_lo and _map3_hi */ - for (i = 0; i < OLD_MAP_SIZE; i++) { - _m[i].m3 = _old_map3[i * 2]; - _m[i].m4 = _old_map3[i * 2 + 1]; - } - - for (i = 0; i < OLD_MAP_SIZE; i ++) { - switch (GetTileType(i)) { - case MP_STATION: - _m[i].m4 = 0; // We do not understand this TTDP station mapping (yet) - switch (_m[i].m5) { - /* We have drive through stops at a totally different place */ - case 0x53: case 0x54: _m[i].m5 += 170 - 0x53; break; // Bus drive through - case 0x57: case 0x58: _m[i].m5 += 168 - 0x57; break; // Truck drive through - case 0x55: case 0x56: _m[i].m5 += 170 - 0x55; break; // Bus tram stop - case 0x59: case 0x5A: _m[i].m5 += 168 - 0x59; break; // Truck tram stop - default: break; - } - break; - - case MP_RAILWAY: - /* We save presignals different from TTDPatch, convert them */ - if (GetRailTileType(i) == RAIL_TILE_SIGNALS) { - /* This byte is always zero in TTD for this type of tile */ - if (_m[i].m4) /* Convert the presignals to our own format */ - _m[i].m4 = (_m[i].m4 >> 1) & 7; - } - /* TTDPatch stores PBS things in L6 and all elsewhere; so we'll just - * clear it for ourselves and let OTTD's rebuild PBS itself */ - _m[i].m4 &= 0xF; /* Only keep the lower four bits; upper four is PBS */ - break; - - case MP_WATER: - if (GetWaterClass(i) == 3) MakeRiver(i, Random()); - break; - - default: - break; - } - } - /* Make sure the available engines are really available, otherwise * we will get a "new vehicle"-spree. */ Engine *e; @@ -1531,7 +1552,6 @@ static bool LoadOldMain(LoadgameState *ls) DEBUG(oldloader, 3, "Finished converting game data"); DEBUG(oldloader, 1, "TTD(Patch) savegame successfully converted"); - free(_old_map3); free(_old_vehicle_names); return true; @@ -1582,12 +1602,6 @@ bool LoadOldSaveGame(const char *file) return false; } - /* Some old TTD(Patch) savegames could have buoys at tile 0 - * (without assigned station struct) - * MakeWater() can be used as long as sea has the same - * format as old savegames (eg. everything is zeroed) */ - MakeWater(0); - _pause_game = 2; return true; |