diff --git a/src/oldloader.cpp b/src/oldloader.cpp --- a/src/oldloader.cpp +++ b/src/oldloader.cpp @@ -24,6 +24,7 @@ #include "date_func.h" #include "vehicle_func.h" #include "variables.h" +#include "strings_func.h" #include "table/strings.h" @@ -84,6 +85,12 @@ enum OldChunkType { OC_TILE = OC_VAR_U32 | OC_FILE_U16, + /** + * Dereference the pointer once before writing to it, + * so we do not have to use big static arrays. + */ + OC_DEREFERENCE_POINTER = 1 << 31, + OC_END = 0 ///< End of the whole chunk, all 32bits set to zero }; @@ -201,10 +208,10 @@ static bool LoadChunk(LoadgameState *ls, byte *base_ptr = (byte*)base; while (chunk->type != OC_END) { - byte* ptr = (byte*)chunk->ptr; - uint i; + byte *ptr = (byte*)chunk->ptr; + if ((chunk->type & OC_DEREFERENCE_POINTER) != 0) ptr = *(byte**)ptr; - for (i = 0; i < chunk->amount; i++) { + for (uint i = 0; i < chunk->amount; i++) { if (ls->failed) return false; /* Handle simple types */ @@ -391,7 +398,7 @@ static void FixOldVehicles() extern TileIndex *_animated_tile_list; extern uint _animated_tile_count; -extern char _name_array[512][32]; +extern char *_old_name_array; static byte _old_vehicle_multiplier; static uint8 _old_map3[OLD_MAP_SIZE * 2]; @@ -1521,7 +1528,7 @@ static const OldChunks main_chunk[] = { OCL_ASSERT( 0x6F0F2 ), - OCL_VAR ( OC_UINT8, 32 * 500, &_name_array[0] ), + OCL_VAR ( OC_UINT8 | OC_DEREFERENCE_POINTER, 32 * 500, &_old_name_array ), OCL_NULL( 0x2000 ), ///< Old hash-table, no longer in use