mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-09 13:14:02 +02:00
Fix: Random map generator crashes when nativeTerrain is not specified in the mod
This commit is contained in:
parent
15d9c4438c
commit
30426b6a44
@ -708,6 +708,22 @@ void CTownHandler::loadPuzzle(CFaction &faction, const JsonNode &source)
|
|||||||
assert(faction.puzzleMap.size() == GameConstants::PUZZLE_MAP_PIECES);
|
assert(faction.puzzleMap.size() == GameConstants::PUZZLE_MAP_PIECES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ETerrainType::EETerrainType CTownHandler::getDefaultTerrainForAlignment(EAlignment::EAlignment alignment) const
|
||||||
|
{
|
||||||
|
ETerrainType::EETerrainType terrain = defaultGoodTerrain;
|
||||||
|
|
||||||
|
switch(alignment)
|
||||||
|
{
|
||||||
|
case EAlignment::EAlignment::EVIL:
|
||||||
|
terrain = defaultEvilTerrain;
|
||||||
|
break;
|
||||||
|
case EAlignment::EAlignment::NEUTRAL:
|
||||||
|
terrain = defaultNeutralTerrain;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return terrain;
|
||||||
|
}
|
||||||
|
|
||||||
CFaction * CTownHandler::loadFromJson(const JsonNode &source, const std::string & identifier)
|
CFaction * CTownHandler::loadFromJson(const JsonNode &source, const std::string & identifier)
|
||||||
{
|
{
|
||||||
auto faction = new CFaction();
|
auto faction = new CFaction();
|
||||||
@ -718,15 +734,22 @@ CFaction * CTownHandler::loadFromJson(const JsonNode &source, const std::string
|
|||||||
faction->creatureBg120 = source["creatureBackground"]["120px"].String();
|
faction->creatureBg120 = source["creatureBackground"]["120px"].String();
|
||||||
faction->creatureBg130 = source["creatureBackground"]["130px"].String();
|
faction->creatureBg130 = source["creatureBackground"]["130px"].String();
|
||||||
|
|
||||||
|
|
||||||
faction->nativeTerrain = ETerrainType(vstd::find_pos(GameConstants::TERRAIN_NAMES,
|
|
||||||
source["nativeTerrain"].String()));
|
|
||||||
int alignment = vstd::find_pos(EAlignment::names, source["alignment"].String());
|
int alignment = vstd::find_pos(EAlignment::names, source["alignment"].String());
|
||||||
if (alignment == -1)
|
if (alignment == -1)
|
||||||
faction->alignment = EAlignment::NEUTRAL;
|
faction->alignment = EAlignment::NEUTRAL;
|
||||||
else
|
else
|
||||||
faction->alignment = static_cast<EAlignment::EAlignment>(alignment);
|
faction->alignment = static_cast<EAlignment::EAlignment>(alignment);
|
||||||
|
|
||||||
|
auto nativeTerrain = source["nativeTerrain"];
|
||||||
|
int terrainNum = nativeTerrain.isNull()
|
||||||
|
? -1
|
||||||
|
: vstd::find_pos(GameConstants::TERRAIN_NAMES, nativeTerrain.String());
|
||||||
|
|
||||||
|
//Contructor is not called here, but operator=
|
||||||
|
faction->nativeTerrain = terrainNum < 0
|
||||||
|
? getDefaultTerrainForAlignment(faction->alignment)
|
||||||
|
: static_cast<ETerrainType::EETerrainType>(terrainNum);
|
||||||
|
|
||||||
if (!source["town"].isNull())
|
if (!source["town"].isNull())
|
||||||
{
|
{
|
||||||
faction->town = new CTown();
|
faction->town = new CTown();
|
||||||
|
@ -298,6 +298,11 @@ class DLL_LINKAGE CTownHandler : public IHandlerBase
|
|||||||
|
|
||||||
std::map<CTown *, JsonNode> warMachinesToLoad;
|
std::map<CTown *, JsonNode> warMachinesToLoad;
|
||||||
std::vector<BuildingRequirementsHelper> requirementsToLoad;
|
std::vector<BuildingRequirementsHelper> requirementsToLoad;
|
||||||
|
|
||||||
|
const static ETerrainType::EETerrainType defaultGoodTerrain = ETerrainType::EETerrainType::GRASS;
|
||||||
|
const static ETerrainType::EETerrainType defaultEvilTerrain = ETerrainType::EETerrainType::LAVA;
|
||||||
|
const static ETerrainType::EETerrainType defaultNeutralTerrain = ETerrainType::EETerrainType::ROUGH;
|
||||||
|
|
||||||
void initializeRequirements();
|
void initializeRequirements();
|
||||||
void initializeWarMachines();
|
void initializeWarMachines();
|
||||||
|
|
||||||
@ -320,6 +325,8 @@ class DLL_LINKAGE CTownHandler : public IHandlerBase
|
|||||||
|
|
||||||
void loadPuzzle(CFaction & faction, const JsonNode & source);
|
void loadPuzzle(CFaction & faction, const JsonNode & source);
|
||||||
|
|
||||||
|
ETerrainType::EETerrainType getDefaultTerrainForAlignment(EAlignment::EAlignment aligment) const;
|
||||||
|
|
||||||
CFaction * loadFromJson(const JsonNode & data, const std::string & identifier);
|
CFaction * loadFromJson(const JsonNode & data, const std::string & identifier);
|
||||||
|
|
||||||
void loadRandomFaction();
|
void loadRandomFaction();
|
||||||
|
@ -776,6 +776,12 @@ public:
|
|||||||
ETerrainType(EETerrainType _num = WRONG) : num(_num)
|
ETerrainType(EETerrainType _num = WRONG) : num(_num)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
ETerrainType& operator=(EETerrainType _num)
|
||||||
|
{
|
||||||
|
num = _num;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
ID_LIKE_CLASS_COMMON(ETerrainType, EETerrainType)
|
ID_LIKE_CLASS_COMMON(ETerrainType, EETerrainType)
|
||||||
|
|
||||||
EETerrainType num;
|
EETerrainType num;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user