diff --git a/src/engine/shared/map.cpp b/src/engine/shared/map.cpp index d14941e97..735f986de 100644 --- a/src/engine/shared/map.cpp +++ b/src/engine/shared/map.cpp @@ -83,24 +83,10 @@ bool CMap::Load(const char *pMapName) if(pLayer->m_Type == LAYERTYPE_TILES) { CMapItemLayerTilemap *pTilemap = reinterpret_cast(pLayer); - if(pTilemap->m_Version > 3) + if(pTilemap->m_Version >= CMapItemLayerTilemap::TILE_SKIP_MIN_VERSION) { - CTile *pTiles = static_cast(malloc(pTilemap->m_Width * pTilemap->m_Height * sizeof(CTile))); - - // extract original tile data - int i = 0; - CTile *pSavedTiles = static_cast(m_DataFile.GetData(pTilemap->m_Data)); - while(i < pTilemap->m_Width * pTilemap->m_Height) - { - for(unsigned Counter = 0; Counter <= pSavedTiles->m_Skip && i < pTilemap->m_Width * pTilemap->m_Height; Counter++) - { - pTiles[i] = *pSavedTiles; - pTiles[i++].m_Skip = 0; - } - - pSavedTiles++; - } - + CTile *pTiles = static_cast(malloc((size_t)pTilemap->m_Width * pTilemap->m_Height * sizeof(CTile))); + ExtractTiles(pTiles, (size_t)pTilemap->m_Width * pTilemap->m_Height, static_cast(m_DataFile.GetData(pTilemap->m_Data)), m_DataFile.GetDataSize(pTilemap->m_Data) / sizeof(CTile)); m_DataFile.ReplaceData(pTilemap->m_Data, reinterpret_cast(pTiles)); } } @@ -140,4 +126,20 @@ int CMap::MapSize() const return m_DataFile.MapSize(); } +void CMap::ExtractTiles(CTile *pDest, size_t DestSize, const CTile *pSrc, size_t SrcSize) +{ + size_t DestIndex = 0; + size_t SrcIndex = 0; + while(DestIndex < DestSize && SrcIndex < SrcSize) + { + for(unsigned Counter = 0; Counter <= pSrc[SrcIndex].m_Skip && DestIndex < DestSize; Counter++) + { + pDest[DestIndex] = pSrc[SrcIndex]; + pDest[DestIndex].m_Skip = 0; + DestIndex++; + } + SrcIndex++; + } +} + extern IEngineMap *CreateEngineMap() { return new CMap; } diff --git a/src/engine/shared/map.h b/src/engine/shared/map.h index 086567310..966c639f8 100644 --- a/src/engine/shared/map.h +++ b/src/engine/shared/map.h @@ -35,6 +35,8 @@ public: SHA256_DIGEST Sha256() const override; unsigned Crc() const override; int MapSize() const override; + + static void ExtractTiles(class CTile *pDest, size_t DestSize, const class CTile *pSrc, size_t SrcSize); }; #endif diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index 2f2d835e4..858cae526 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -624,7 +624,7 @@ public: void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc) override; void PrepareForSave(); - void ExtractTiles(CTile *pSavedTiles); + void ExtractTiles(int TilemapItemVersion, const CTile *pSavedTiles, size_t SavedTilesSize); void GetSize(float *pWidth, float *pHeight) override { diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp index 6acbcfc02..90253afd5 100644 --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -201,7 +201,7 @@ bool CEditorMap::Save(const char *pFileName) pLayerTiles->PrepareForSave(); CMapItemLayerTilemap Item; - Item.m_Version = 3; + Item.m_Version = CMapItemLayerTilemap::CURRENT_VERSION; Item.m_Layer.m_Version = 0; // was previously uninitialized, do not rely on it being 0 Item.m_Layer.m_Flags = pLayerTiles->m_Flags; @@ -736,11 +736,7 @@ bool CEditorMap::Load(const char *pFileName, int StorageType, const std::functio { void *pFrontData = DataFile.GetData(pTilemapItem->m_Front); unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Front); - if(pTilemapItem->m_Version > 3) - pTiles->ExtractTiles((CTile *)pFrontData); - else if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTile)) - mem_copy(pTiles->m_pTiles, pFrontData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTile)); - + pTiles->ExtractTiles(pTilemapItem->m_Version, (CTile *)pFrontData, Size); DataFile.UnloadData(pTilemapItem->m_Front); } else if(pTiles->m_Switch) @@ -795,10 +791,7 @@ bool CEditorMap::Load(const char *pFileName, int StorageType, const std::functio { void *pData = DataFile.GetData(pTilemapItem->m_Data); unsigned int Size = DataFile.GetDataSize(pTilemapItem->m_Data); - if(pTilemapItem->m_Version > 3) - pTiles->ExtractTiles((CTile *)pData); - else if(Size >= (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTile)) - mem_copy(pTiles->m_pTiles, pData, (size_t)pTiles->m_Width * pTiles->m_Height * sizeof(CTile)); + pTiles->ExtractTiles(pTilemapItem->m_Version, (CTile *)pData, Size); if(pTiles->m_Game && pTilemapItem->m_Version == MakeVersion(1, *pTilemapItem)) { diff --git a/src/game/editor/layer_tiles.cpp b/src/game/editor/layer_tiles.cpp index 9ce36da92..74db24929 100644 --- a/src/game/editor/layer_tiles.cpp +++ b/src/game/editor/layer_tiles.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include "editor.h" @@ -97,19 +98,13 @@ void CLayerTiles::PrepareForSave() } } -void CLayerTiles::ExtractTiles(CTile *pSavedTiles) +void CLayerTiles::ExtractTiles(int TilemapItemVersion, const CTile *pSavedTiles, size_t SavedTilesSize) { - int i = 0; - while(i < m_Width * m_Height) - { - for(unsigned Counter = 0; Counter <= pSavedTiles->m_Skip && i < m_Width * m_Height; Counter++) - { - m_pTiles[i] = *pSavedTiles; - m_pTiles[i++].m_Skip = 0; - } - - pSavedTiles++; - } + const size_t DestSize = (size_t)m_Width * m_Height; + if(TilemapItemVersion >= CMapItemLayerTilemap::TILE_SKIP_MIN_VERSION) + CMap::ExtractTiles(m_pTiles, DestSize, pSavedTiles, SavedTilesSize); + else if(SavedTilesSize >= DestSize) + mem_copy(m_pTiles, pSavedTiles, DestSize * sizeof(CTile)); } void CLayerTiles::MakePalette() diff --git a/src/game/mapitems.h b/src/game/mapitems.h index 73ed01105..8513a619f 100644 --- a/src/game/mapitems.h +++ b/src/game/mapitems.h @@ -300,7 +300,8 @@ struct CMapItemLayerTilemap { enum { - CURRENT_VERSION = 4 + CURRENT_VERSION = 3, + TILE_SKIP_MIN_VERSION = 4, // supported for loading but not saving }; CMapItemLayer m_Layer;