diff --git a/client/mapHandler.cpp b/client/mapHandler.cpp index c11ca7ad7..922bc1103 100644 --- a/client/mapHandler.cpp +++ b/client/mapHandler.cpp @@ -172,7 +172,7 @@ void CMapHandler::initTerrainGraphics() } }; - //TODO: use if as a key + //TODO: use id as a key std::map terrainFiles; std::map riverFiles; std::map roadFiles; @@ -184,9 +184,9 @@ void CMapHandler::initTerrainGraphics() { riverFiles[river.fileName] = river.fileName; } - for(const auto * road : VLC->terrainTypeHandler->roads()) + for(const auto & road : VLC->terrainTypeHandler->roads()) { - roadFiles[road->fileName] = road->fileName; + roadFiles[road.fileName] = road.fileName; } loadFlipped(terrainAnimations, terrainImages, terrainFiles); diff --git a/lib/GameConstants.h b/lib/GameConstants.h index 491b42fe8..69913e496 100644 --- a/lib/GameConstants.h +++ b/lib/GameConstants.h @@ -859,6 +859,7 @@ namespace Road enum ERoad : ui8 { NO_ROAD = 0, + FIRST_REGULAR_ROAD = 1, DIRT_ROAD = 1, GRAVEL_ROAD = 2, COBBLESTONE_ROAD = 3, diff --git a/lib/Terrain.cpp b/lib/Terrain.cpp index 241e7e9af..2955b58fc 100644 --- a/lib/Terrain.cpp +++ b/lib/Terrain.cpp @@ -29,14 +29,6 @@ TerrainTypeHandler::TerrainTypeHandler() initTerrains(allConfigs); //maps will be populated inside } -TerrainTypeHandler::~TerrainTypeHandler() -{ - for (const auto * road : roadTypes) - { - delete road; - } -} - void TerrainTypeHandler::initTerrains(const std::vector & allConfigs) { std::vector> resolveLater; @@ -78,7 +70,7 @@ void TerrainTypeHandler::initTerrains(const std::vector & allConfig } else if (terr.second["type"].getType() == JsonNode::JsonType::DATA_VECTOR) { - for (const auto& node : terr.second["type"].Vector()) + for(const auto& node : terr.second["type"].Vector()) { //Set bits auto s = node.String(); @@ -197,7 +189,7 @@ void TerrainTypeHandler::initTerrains(const std::vector & allConfig } } - for (size_t i = Terrain::FIRST_REGULAR_TERRAIN; i < Terrain::ORIGINAL_TERRAIN_COUNT; i++) + for(size_t i = Terrain::FIRST_REGULAR_TERRAIN; i < Terrain::ORIGINAL_TERRAIN_COUNT; i++) { //Make sure that original terrains are loaded assert(objects(i).id != Terrain::WRONG); @@ -205,7 +197,7 @@ void TerrainTypeHandler::initTerrains(const std::vector & allConfig recreateTerrainMaps(); - for (auto& functor : resolveLater) + for(auto& functor : resolveLater) { functor(); } @@ -214,22 +206,21 @@ void TerrainTypeHandler::initTerrains(const std::vector & allConfig void TerrainTypeHandler::initRivers(const std::vector & allConfigs) { riverTypes.resize(River::ORIGINAL_RIVER_COUNT); //make space for original rivers - //First object will be default + //First object will be default NO_RIVER - for (auto & mod : allConfigs) + for(auto & mod : allConfigs) { if (!CResourceHandler::get(mod)->existsResource(ResourceID("config/rivers.json"))) continue; JsonNode rivs(mod, ResourceID("config/rivers.json")); - for (auto & river : rivs.Struct()) + for(auto & river : rivs.Struct()) { RiverType info; info.fileName = river.second["animation"].String(); info.code = river.second["code"].String(); info.deltaName = river.second["delta"].String(); - //info->movementCost = river.second["moveCost"].Integer(); if (!river.second["originalRiverId"].isNull()) { @@ -249,31 +240,31 @@ void TerrainTypeHandler::initRivers(const std::vector & allConfigs) void TerrainTypeHandler::initRoads(const std::vector & allConfigs) { - roadTypes.resize(Road::ORIGINAL_ROAD_COUNT, nullptr); //make space for original rivers - roadTypes[Road::NO_ROAD] = new RoadType(); //default + roadTypes.resize(Road::ORIGINAL_ROAD_COUNT); //make space for original rivers + //first object will be default NO_ROAD - for (auto & mod : allConfigs) + for(auto & mod : allConfigs) { if (!CResourceHandler::get(mod)->existsResource(ResourceID("config/roads.json"))) continue; JsonNode rds(mod, ResourceID("config/roads.json")); - for (auto & road : rds.Struct()) + for(auto & road : rds.Struct()) { - auto * info = new RoadType(); + RoadType info; - info->fileName = road.second["animation"].String(); - info->code = road.second["code"].String(); - info->movementCost = static_cast(road.second["moveCost"].Float()); + info.fileName = road.second["animation"].String(); + info.code = road.second["code"].String(); + info.movementCost = static_cast(road.second["moveCost"].Float()); if (!road.second["originalRoadId"].isNull()) { - info->id = static_cast(road.second["originalRoadId"].Float()); - roadTypes[info->id] = info; + info.id = static_cast(road.second["originalRoadId"].Float()); + roadTypes[info.id] = info; } else { - info->id = static_cast(roadTypes.size()); + info.id = static_cast(roadTypes.size()); roadTypes.push_back(info); } } @@ -286,7 +277,7 @@ void TerrainTypeHandler::recreateTerrainMaps() { //This assumes the vector will never be updated or reallocated in the future - for (size_t i = 0; i < objects.size(); i++) + for(size_t i = 0; i < objects.size(); i++) { const auto * terrainInfo = &objects[i]; @@ -298,9 +289,9 @@ void TerrainTypeHandler::recreateTerrainMaps() void TerrainTypeHandler::recreateRiverMaps() { - for (size_t i = River::FIRST_REGULAR_RIVER ; i < riverTypes.size(); i++) + for(size_t i = River::FIRST_REGULAR_RIVER ; i < riverTypes.size(); i++) { - const auto* riverInfo = &riverTypes[i]; + const auto * riverInfo = &riverTypes[i]; riverInfoByName[riverInfo->fileName] = riverInfo; riverInfoByCode[riverInfo->code] = riverInfo; @@ -310,10 +301,9 @@ void TerrainTypeHandler::recreateRiverMaps() void TerrainTypeHandler::recreateRoadMaps() { - for (const RoadType * roadInfo : roadTypes) + for(size_t i = Road::FIRST_REGULAR_ROAD ; i < roadTypes.size(); i++) { - if (roadInfo->id == Road::NO_ROAD) - continue; + const auto * roadInfo = &roadTypes[i]; roadInfoByName[roadInfo->fileName] = roadInfo; roadInfoByCode[roadInfo->code] = roadInfo; @@ -332,7 +322,7 @@ const std::vector& TerrainTypeHandler::rivers() const return riverTypes; } -const std::vector& TerrainTypeHandler::roads() const +const std::vector& TerrainTypeHandler::roads() const { return roadTypes; } @@ -498,4 +488,14 @@ RoadType::RoadType(const std::string& fileName, const std::string& code, TRoadId id(id), movementCost(GameConstants::BASE_MOVEMENT_COST) { +} + +RoadType& RoadType::operator=(const RoadType& other) +{ + fileName = other.fileName; + code = other.code; + id = other.id; + movementCost = other.movementCost; + + return *this; } \ No newline at end of file diff --git a/lib/Terrain.h b/lib/Terrain.h index 505e5c34f..1bc5939fb 100644 --- a/lib/Terrain.h +++ b/lib/Terrain.h @@ -119,6 +119,8 @@ public: RoadType(const std::string & fileName = "", const std::string& code = "", TRoadId id = Road::NO_ROAD); + RoadType& operator=(const RoadType & other); + template void serialize(Handler& h, const int version) { h & fileName; @@ -135,7 +137,7 @@ class DLL_LINKAGE TerrainTypeHandler //TODO: public IHandlerBase ? public: TerrainTypeHandler(); - ~TerrainTypeHandler(); + ~TerrainTypeHandler() {}; const std::vector & terrains() const; const TerrainType * getInfoByName(const std::string & terrainName) const; @@ -147,7 +149,7 @@ public: const RiverType * getRiverByCode(const std::string & riverCode) const; const RiverType * getRiverById(TRiverId id) const; - const std::vector & roads() const; + const std::vector & roads() const; const RoadType * getRoadByName(const std::string & roadName) const; const RoadType * getRoadByCode(const std::string & roadCode) const; const RoadType * getRoadById(TRoadId id) const; @@ -170,7 +172,7 @@ private: std::vector objects; std::vector riverTypes; - std::vector roadTypes; + std::vector roadTypes; std::unordered_map terrainInfoByName; std::unordered_map terrainInfoByCode; diff --git a/lib/mapping/CDrawRoadsOperation.cpp b/lib/mapping/CDrawRoadsOperation.cpp index 9982584b5..e87ea7cf2 100644 --- a/lib/mapping/CDrawRoadsOperation.cpp +++ b/lib/mapping/CDrawRoadsOperation.cpp @@ -336,7 +336,7 @@ std::string CDrawRiversOperation::getLabel() const void CDrawRoadsOperation::executeTile(TerrainTile & tile) { - tile.roadType = VLC->terrainTypeHandler->roads()[roadType]; + tile.roadType = const_cast(&VLC->terrainTypeHandler->roads()[roadType]); } void CDrawRiversOperation::executeTile(TerrainTile & tile) diff --git a/lib/mapping/CMap.cpp b/lib/mapping/CMap.cpp index b6f62d06b..43ff2b08e 100644 --- a/lib/mapping/CMap.cpp +++ b/lib/mapping/CMap.cpp @@ -128,7 +128,7 @@ TerrainTile::TerrainTile(): terView(0), riverType(const_cast(&VLC->terrainTypeHandler->rivers()[0])), riverDir(0), - roadType(VLC->terrainTypeHandler->roads()[0]), + roadType(const_cast(&VLC->terrainTypeHandler->roads()[0])), roadDir(0), extTileFlags(0), visitable(false), diff --git a/lib/mapping/MapFormatH3M.cpp b/lib/mapping/MapFormatH3M.cpp index fb2eb65eb..0bf3c66d8 100644 --- a/lib/mapping/MapFormatH3M.cpp +++ b/lib/mapping/MapFormatH3M.cpp @@ -939,7 +939,7 @@ void CMapLoaderH3M::readTerrain() tile.terView = reader.readUInt8(); tile.riverType = const_cast(&rivers[reader.readUInt8()]); tile.riverDir = reader.readUInt8(); - tile.roadType = roads[reader.readUInt8()]; + tile.roadType = const_cast(&roads[reader.readUInt8()]); tile.roadDir = reader.readUInt8(); tile.extTileFlags = reader.readUInt8(); tile.blocked = ((!tile.terType->isPassable() || tile.terType->id == Terrain::BORDER ) ? true : false); //underground tiles are always blocked