1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

multilevel support

This commit is contained in:
Laserlicht
2025-08-01 00:37:32 +02:00
parent 50a240a858
commit ecfe09f6b1
27 changed files with 156 additions and 107 deletions

View File

@@ -240,7 +240,16 @@ const int CMapFormatJson::VERSION_MINOR = 0;
const std::string CMapFormatJson::HEADER_FILE_NAME = "header.json";
const std::string CMapFormatJson::OBJECTS_FILE_NAME = "objects.json";
const std::string CMapFormatJson::TERRAIN_FILE_NAMES[2] = {"surface_terrain.json", "underground_terrain.json"};
std::string getTerrainFilename(int i)
{
if(i == 0)
return "surface_terrain.json";
else if(i == 1)
return "underground_terrain.json";
else
return "level-" + std::to_string(i + 1) + "_terrain.json";
}
CMapFormatJson::CMapFormatJson():
fileVersionMajor(0), fileVersionMinor(0),
@@ -844,7 +853,6 @@ void CMapLoaderJson::readHeader(const bool complete)
//loading mods
mapHeader->mods = ModVerificationInfo::jsonDeserializeList(header["mods"]);
//todo: multilevel map load support
{
auto levels = handler.enterStruct("mapLevels");
{
@@ -852,10 +860,7 @@ void CMapLoaderJson::readHeader(const bool complete)
handler.serializeInt("height", mapHeader->height);
handler.serializeInt("width", mapHeader->width);
}
{
auto underground = handler.enterStruct("underground");
mapHeader->twoLevel = !underground->getCurrent().isNull();
}
mapHeader->mapLevels = levels->getCurrent().Struct().size();
}
serializeHeader(handler);
@@ -993,14 +998,10 @@ void CMapLoaderJson::readTerrainLevel(const JsonNode & src, const int index)
void CMapLoaderJson::readTerrain()
{
for(int i = 0; i < map->mapLevels; i++)
{
const JsonNode surface = getFromArchive(TERRAIN_FILE_NAMES[0]);
readTerrainLevel(surface, 0);
}
if(map->twoLevel)
{
const JsonNode underground = getFromArchive(TERRAIN_FILE_NAMES[1]);
readTerrainLevel(underground, 1);
const JsonNode node = getFromArchive(getTerrainFilename(i));
readTerrainLevel(node, i);
}
}
@@ -1198,17 +1199,22 @@ void CMapSaverJson::writeHeader()
//write mods
header["mods"] = ModVerificationInfo::jsonSerializeList(mapHeader->mods);
//todo: multilevel map save support
JsonNode & levels = header["mapLevels"];
levels["surface"]["height"].Float() = mapHeader->height;
levels["surface"]["width"].Float() = mapHeader->width;
levels["surface"]["index"].Float() = 0;
auto getName = [](int level){
if(level == 0)
return std::string("surface");
else if(level == 1)
return std::string("underground");
else
return "level-" + std::to_string(level + 1);
};
if(mapHeader->twoLevel)
JsonNode & levels = header["mapLevels"];
for(int i = 0; i < map->mapLevels; i++)
{
levels["underground"]["height"].Float() = mapHeader->height;
levels["underground"]["width"].Float() = mapHeader->width;
levels["underground"]["index"].Float() = 1;
auto name = getName(i);
levels[name]["height"].Float() = mapHeader->height;
levels[name]["width"].Float() = mapHeader->width;
levels[name]["index"].Float() = i;
}
serializeHeader(handler);
@@ -1266,15 +1272,11 @@ JsonNode CMapSaverJson::writeTerrainLevel(const int index)
void CMapSaverJson::writeTerrain()
{
logGlobal->trace("Saving terrain");
//todo: multilevel map save support
JsonNode surface = writeTerrainLevel(0);
addToArchive(surface, TERRAIN_FILE_NAMES[0]);
if(map->twoLevel)
for(int i = 0; i < map->mapLevels; i++)
{
JsonNode underground = writeTerrainLevel(1);
addToArchive(underground, TERRAIN_FILE_NAMES[1]);
JsonNode node = writeTerrainLevel(i);
addToArchive(node, getTerrainFilename(i));
}
}