1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Actually copy zone data from map generator template

* fixes https://bugs.vcmi.eu/view.php?id=2482
This commit is contained in:
AlexVinS 2018-03-05 17:05:17 +03:00
parent 4ee9d7f65a
commit 26aad17295
8 changed files with 470 additions and 362 deletions

View File

@ -18,6 +18,7 @@
#include "../StringConstants.h" #include "../StringConstants.h"
#include "../filesystem/Filesystem.h" #include "../filesystem/Filesystem.h"
#include "CZonePlacer.h" #include "CZonePlacer.h"
#include "CRmgTemplateZone.h"
#include "../mapObjects/CObjectClassesHandler.h" #include "../mapObjects/CObjectClassesHandler.h"
static const int3 dirs4[] = {int3(0,1,0),int3(0,-1,0),int3(-1,0,0),int3(+1,0,0)}; static const int3 dirs4[] = {int3(0,1,0),int3(0,-1,0),int3(-1,0,0),int3(+1,0,0)};
@ -273,10 +274,15 @@ void CMapGenerator::genZones()
editManager->drawTerrain(ETerrainType::GRASS, &rand); editManager->drawTerrain(ETerrainType::GRASS, &rand);
auto tmpl = mapGenOptions->getMapTemplate(); auto tmpl = mapGenOptions->getMapTemplate();
zones = tmpl->getZones(); //copy from template (refactor?) zones.clear();
//immediately set gen pointer before taking any actions on zones for(const auto & option : tmpl->getZones())
for (auto zone : zones) {
zone.second->setGenPtr(this); auto zone = new CRmgTemplateZone();
zone->setOptions(option.second);
zones[zone->getId()] = zone;
//todo: move to CRmgTemplateZone constructor
zone->setGenPtr(this);//immediately set gen pointer before taking any actions on zones
}
CZonePlacer placer(this); CZonePlacer placer(this);
placer.placeZones(mapGenOptions, &rand); placer.placeZones(mapGenOptions, &rand);
@ -474,8 +480,8 @@ void CMapGenerator::findZonesForQuestArts()
for (auto connection : mapGenOptions->getMapTemplate()->getConnections()) for (auto connection : mapGenOptions->getMapTemplate()->getConnections())
{ {
auto zoneA = connection.getZoneA(); auto zoneA = zones[connection.getZoneA()];
auto zoneB = connection.getZoneB(); auto zoneB = zones[connection.getZoneB()];
if (zoneA->getId() > zoneB->getId()) if (zoneA->getId() > zoneB->getId())
{ {
@ -492,8 +498,8 @@ void CMapGenerator::createDirectConnections()
{ {
for (auto connection : mapGenOptions->getMapTemplate()->getConnections()) for (auto connection : mapGenOptions->getMapTemplate()->getConnections())
{ {
auto zoneA = connection.getZoneA(); auto zoneA = zones[connection.getZoneA()];
auto zoneB = connection.getZoneB(); auto zoneB = zones[connection.getZoneB()];
//rearrange tiles in random order //rearrange tiles in random order
auto tilesCopy = zoneA->getTileInfo(); auto tilesCopy = zoneA->getTileInfo();
@ -572,8 +578,8 @@ void CMapGenerator::createConnections2()
{ {
for (auto & connection : connectionsLeft) for (auto & connection : connectionsLeft)
{ {
auto zoneA = connection.getZoneA(); auto zoneA = zones[connection.getZoneA()];
auto zoneB = connection.getZoneB(); auto zoneB = zones[connection.getZoneB()];
int3 guardPos(-1, -1, -1); int3 guardPos(-1, -1, -1);

View File

@ -13,9 +13,8 @@
#include "../GameConstants.h" #include "../GameConstants.h"
#include "../CRandomGenerator.h" #include "../CRandomGenerator.h"
#include "CMapGenOptions.h" #include "CMapGenOptions.h"
#include "CRmgTemplateZone.h"
#include "../int3.h" #include "../int3.h"
#include "CRmgTemplate.h" //for CRmgTemplateZoneConnection #include "CRmgTemplate.h"
class CMap; class CMap;
class CRmgTemplate; class CRmgTemplate;
@ -100,7 +99,7 @@ public:
void setZoneID(const int3& tile, TRmgTemplateZoneId zid); void setZoneID(const int3& tile, TRmgTemplateZoneId zid);
private: private:
std::list<CRmgTemplateZoneConnection> connectionsLeft; std::list<rmg::ZoneConnection> connectionsLeft;
std::map<TRmgTemplateZoneId, CRmgTemplateZone*> zones; std::map<TRmgTemplateZoneId, CRmgTemplateZone*> zones;
std::map<TFaction, ui32> zonesPerFaction; std::map<TFaction, ui32> zonesPerFaction;
ui32 zonesTotal; //zones that have their main town only ui32 zonesTotal; //zones that have their main town only

View File

@ -11,45 +11,323 @@
#include "StdInc.h" #include "StdInc.h"
#include "CRmgTemplate.h" #include "CRmgTemplate.h"
#include "CRmgTemplateZone.h"
#include "../mapping/CMap.h" #include "../mapping/CMap.h"
#include "../VCMI_Lib.h"
#include "../CTownHandler.h"
CRmgTemplateZoneConnection::CRmgTemplateZoneConnection() : zoneA(nullptr), zoneB(nullptr), guardStrength(0) namespace rmg
{
const std::set<ETerrainType> ZoneOptions::DEFAULT_TERRAIN_TYPES =
{
ETerrainType::DIRT,
ETerrainType::SAND,
ETerrainType::GRASS,
ETerrainType::SNOW,
ETerrainType::SWAMP,
ETerrainType::ROUGH,
ETerrainType::SUBTERRANEAN,
ETerrainType::LAVA
};
ZoneOptions::CTownInfo::CTownInfo()
: townCount(0),
castleCount(0),
townDensity(0),
castleDensity(0)
{ {
} }
CRmgTemplateZone * CRmgTemplateZoneConnection::getZoneA() const int ZoneOptions::CTownInfo::getTownCount() const
{
return townCount;
}
void ZoneOptions::CTownInfo::setTownCount(int value)
{
if(value < 0)
throw std::runtime_error("Negative value for town count not allowed.");
townCount = value;
}
int ZoneOptions::CTownInfo::getCastleCount() const
{
return castleCount;
}
void ZoneOptions::CTownInfo::setCastleCount(int value)
{
if(value < 0)
throw std::runtime_error("Negative value for castle count not allowed.");
castleCount = value;
}
int ZoneOptions::CTownInfo::getTownDensity() const
{
return townDensity;
}
void ZoneOptions::CTownInfo::setTownDensity(int value)
{
if(value < 0)
throw std::runtime_error("Negative value for town density not allowed.");
townDensity = value;
}
int ZoneOptions::CTownInfo::getCastleDensity() const
{
return castleDensity;
}
void ZoneOptions::CTownInfo::setCastleDensity(int value)
{
if(value < 0)
throw std::runtime_error("Negative value for castle density not allowed.");
castleDensity = value;
}
ZoneOptions::ZoneOptions()
: id(0),
type(ETemplateZoneType::PLAYER_START),
size(1),
owner(boost::none),
playerTowns(),
neutralTowns(),
matchTerrainToTown(true),
terrainTypes(DEFAULT_TERRAIN_TYPES),
townsAreSameType(false),
townTypes(),
monsterTypes(),
zoneMonsterStrength(EMonsterStrength::ZONE_NORMAL),
mines(),
treasureInfo(),
connections()
{
}
ZoneOptions & ZoneOptions::operator=(const ZoneOptions & other)
{
id = other.id;
type = other.type;
size = other.size;
owner = other.owner;
playerTowns = other.playerTowns;
neutralTowns = other.neutralTowns;
matchTerrainToTown = other.matchTerrainToTown;
terrainTypes = other.terrainTypes;
townsAreSameType = other.townsAreSameType;
townTypes = other.townTypes;
monsterTypes = other.monsterTypes;
zoneMonsterStrength = other.zoneMonsterStrength;
mines = other.mines;
treasureInfo = other.treasureInfo;
connections = other.connections;
return *this;
}
TRmgTemplateZoneId ZoneOptions::getId() const
{
return id;
}
void ZoneOptions::setId(TRmgTemplateZoneId value)
{
if(value <= 0)
throw std::runtime_error(boost::to_string(boost::format("Zone %d id should be greater than 0.") % id));
id = value;
}
ETemplateZoneType::ETemplateZoneType ZoneOptions::getType() const
{
return type;
}
void ZoneOptions::setType(ETemplateZoneType::ETemplateZoneType value)
{
type = value;
}
int ZoneOptions::getSize() const
{
return size;
}
void ZoneOptions::setSize(int value)
{
if(value <= 0)
throw std::runtime_error(boost::to_string(boost::format("Zone %d size needs to be greater than 0.") % id));
size = value;
}
boost::optional<int> ZoneOptions::getOwner() const
{
return owner;
}
void ZoneOptions::setOwner(boost::optional<int> value)
{
if(value && !(*value >= 0 && *value <= PlayerColor::PLAYER_LIMIT_I))
throw std::runtime_error(boost::to_string(boost::format ("Owner of zone %d has to be in range 0 to max player count.") % id));
owner = value;
}
const ZoneOptions::CTownInfo & ZoneOptions::getPlayerTowns() const
{
return playerTowns;
}
void ZoneOptions::setPlayerTowns(const CTownInfo & value)
{
playerTowns = value;
}
const ZoneOptions::CTownInfo & ZoneOptions::getNeutralTowns() const
{
return neutralTowns;
}
void ZoneOptions::setNeutralTowns(const CTownInfo & value)
{
neutralTowns = value;
}
bool ZoneOptions::getMatchTerrainToTown() const
{
return matchTerrainToTown;
}
void ZoneOptions::setMatchTerrainToTown(bool value)
{
matchTerrainToTown = value;
}
const std::set<ETerrainType> & ZoneOptions::getTerrainTypes() const
{
return terrainTypes;
}
void ZoneOptions::setTerrainTypes(const std::set<ETerrainType> & value)
{
assert(value.find(ETerrainType::WRONG) == value.end() && value.find(ETerrainType::BORDER) == value.end() &&
value.find(ETerrainType::WATER) == value.end() && value.find(ETerrainType::ROCK) == value.end());
terrainTypes = value;
}
bool ZoneOptions::getTownsAreSameType() const
{
return townsAreSameType;
}
void ZoneOptions::setTownsAreSameType(bool value)
{
townsAreSameType = value;
}
std::set<TFaction> ZoneOptions::getDefaultTownTypes() const
{
std::set<TFaction> defaultTowns;
auto towns = VLC->townh->getDefaultAllowed();
for(int i = 0; i < towns.size(); ++i)
{
if(towns[i]) defaultTowns.insert(i);
}
return defaultTowns;
}
const std::set<TFaction> & ZoneOptions::getTownTypes() const
{
return townTypes;
}
void ZoneOptions::setTownTypes(const std::set<TFaction> & value)
{
townTypes = value;
}
void ZoneOptions::setMonsterTypes(const std::set<TFaction> & value)
{
monsterTypes = value;
}
void ZoneOptions::setMonsterStrength(EMonsterStrength::EMonsterStrength val)
{
assert (vstd::iswithin(val, EMonsterStrength::ZONE_WEAK, EMonsterStrength::ZONE_STRONG));
zoneMonsterStrength = val;
}
void ZoneOptions::setMinesAmount(TResource res, ui16 amount)
{
mines[res] = amount;
}
std::map<TResource, ui16> ZoneOptions::getMinesInfo() const
{
return mines;
}
void ZoneOptions::addTreasureInfo(const CTreasureInfo & info)
{
treasureInfo.push_back(info);
}
const std::vector<CTreasureInfo> & ZoneOptions::getTreasureInfo() const
{
return treasureInfo;
}
void ZoneOptions::addConnection(TRmgTemplateZoneId otherZone)
{
connections.push_back (otherZone);
}
ZoneConnection::ZoneConnection()
: zoneA(-1),
zoneB(-1),
guardStrength(0)
{
}
TRmgTemplateZoneId ZoneConnection::getZoneA() const
{ {
return zoneA; return zoneA;
} }
void CRmgTemplateZoneConnection::setZoneA(CRmgTemplateZone * value) void ZoneConnection::setZoneA(TRmgTemplateZoneId value)
{ {
zoneA = value; zoneA = value;
} }
CRmgTemplateZone * CRmgTemplateZoneConnection::getZoneB() const TRmgTemplateZoneId ZoneConnection::getZoneB() const
{ {
return zoneB; return zoneB;
} }
void CRmgTemplateZoneConnection::setZoneB(CRmgTemplateZone * value) void ZoneConnection::setZoneB(TRmgTemplateZoneId value)
{ {
zoneB = value; zoneB = value;
} }
int CRmgTemplateZoneConnection::getGuardStrength() const int ZoneConnection::getGuardStrength() const
{ {
return guardStrength; return guardStrength;
} }
void CRmgTemplateZoneConnection::setGuardStrength(int value) void ZoneConnection::setGuardStrength(int value)
{ {
if(value < 0) throw std::runtime_error("Negative value for guard strength not allowed."); if(value < 0) throw std::runtime_error("Negative value for guard strength not allowed.");
guardStrength = value; guardStrength = value;
} }
}
using namespace rmg;//todo: remove
CRmgTemplate::CSize::CSize() : width(CMapHeader::MAP_SIZE_MIDDLE), height(CMapHeader::MAP_SIZE_MIDDLE), under(true) CRmgTemplate::CSize::CSize() : width(CMapHeader::MAP_SIZE_MIDDLE), height(CMapHeader::MAP_SIZE_MIDDLE), under(true)
{ {
@ -185,22 +463,22 @@ void CRmgTemplate::setCpuPlayers(const CPlayerCountRange & value)
cpuPlayers = value; cpuPlayers = value;
} }
const std::map<TRmgTemplateZoneId, CRmgTemplateZone *> & CRmgTemplate::getZones() const const std::map<TRmgTemplateZoneId, ZoneOptions *> & CRmgTemplate::getZones() const
{ {
return zones; return zones;
} }
void CRmgTemplate::setZones(const std::map<TRmgTemplateZoneId, CRmgTemplateZone *> & value) void CRmgTemplate::setZones(const std::map<TRmgTemplateZoneId, ZoneOptions *> & value)
{ {
zones = value; zones = value;
} }
const std::list<CRmgTemplateZoneConnection> & CRmgTemplate::getConnections() const const std::list<ZoneConnection> & CRmgTemplate::getConnections() const
{ {
return connections; return connections;
} }
void CRmgTemplate::setConnections(const std::list<CRmgTemplateZoneConnection> & value) void CRmgTemplate::setConnections(const std::list<ZoneConnection> & value)
{ {
connections = value; connections = value;
} }

View File

@ -11,27 +11,145 @@
#pragma once #pragma once
#include "../GameConstants.h" #include "../GameConstants.h"
#include "../ResourceSet.h"
#include "CMapGenOptions.h"
class CRmgTemplateZone; class JsonSerializeFormat;
/// The CRmgTemplateZoneConnection describes the connection between two zones. namespace ETemplateZoneType
class DLL_LINKAGE CRmgTemplateZoneConnection {
enum ETemplateZoneType
{
PLAYER_START,
CPU_START,
TREASURE,
JUNCTION
};
}
class DLL_LINKAGE CTreasureInfo
{ {
public: public:
CRmgTemplateZoneConnection(); ui32 min;
ui32 max;
ui16 density;
};
CRmgTemplateZone * getZoneA() const; namespace rmg
void setZoneA(CRmgTemplateZone * value); {
CRmgTemplateZone * getZoneB() const;
void setZoneB(CRmgTemplateZone * value); class DLL_LINKAGE ZoneConnection
{
public:
ZoneConnection();
TRmgTemplateZoneId getZoneA() const;
void setZoneA(TRmgTemplateZoneId value);
TRmgTemplateZoneId getZoneB() const;
void setZoneB(TRmgTemplateZoneId value);
int getGuardStrength() const; /// Default: 0 int getGuardStrength() const; /// Default: 0
void setGuardStrength(int value); void setGuardStrength(int value);
private: private:
CRmgTemplateZone * zoneA, * zoneB; TRmgTemplateZoneId zoneA;
TRmgTemplateZoneId zoneB;
int guardStrength; int guardStrength;
}; };
class DLL_LINKAGE ZoneOptions
{
public:
static const std::set<ETerrainType> DEFAULT_TERRAIN_TYPES;
class DLL_LINKAGE CTownInfo
{
public:
CTownInfo();
int getTownCount() const; /// Default: 0
void setTownCount(int value);
int getCastleCount() const; /// Default: 0
void setCastleCount(int value);
int getTownDensity() const; /// Default: 0
void setTownDensity(int value);
int getCastleDensity() const; /// Default: 0
void setCastleDensity(int value);
private:
int townCount, castleCount, townDensity, castleDensity;
};
ZoneOptions();
ZoneOptions & operator=(const ZoneOptions & other);
TRmgTemplateZoneId getId() const;
void setId(TRmgTemplateZoneId value);
ETemplateZoneType::ETemplateZoneType getType() const; /// Default: ETemplateZoneType::PLAYER_START
void setType(ETemplateZoneType::ETemplateZoneType value);
int getSize() const; /// Default: 1
void setSize(int value);
boost::optional<int> getOwner() const;
void setOwner(boost::optional<int> value);
const CTownInfo & getPlayerTowns() const;
void setPlayerTowns(const CTownInfo & value);
const CTownInfo & getNeutralTowns() const;
void setNeutralTowns(const CTownInfo & value);
bool getMatchTerrainToTown() const; /// Default: true
void setMatchTerrainToTown(bool value);
const std::set<ETerrainType> & getTerrainTypes() const; /// Default: all
void setTerrainTypes(const std::set<ETerrainType> & value);
bool getTownsAreSameType() const; /// Default: false
void setTownsAreSameType(bool value);
std::set<TFaction> getDefaultTownTypes() const;
const std::set<TFaction> & getTownTypes() const; /// Default: all
void setTownTypes(const std::set<TFaction> & value);
void setMonsterTypes(const std::set<TFaction> & value);
void setMonsterStrength(EMonsterStrength::EMonsterStrength val);
void setMinesAmount (TResource res, ui16 amount);
std::map<TResource, ui16> getMinesInfo() const;
void addTreasureInfo(const CTreasureInfo & info);
const std::vector<CTreasureInfo> & getTreasureInfo() const;
void addConnection(TRmgTemplateZoneId otherZone);
protected:
TRmgTemplateZoneId id;
ETemplateZoneType::ETemplateZoneType type;
int size;
boost::optional<int> owner;
CTownInfo playerTowns;
CTownInfo neutralTowns;
bool matchTerrainToTown;
std::set<ETerrainType> terrainTypes;
bool townsAreSameType;
std::set<TFaction> townTypes;
std::set<TFaction> monsterTypes;
EMonsterStrength::EMonsterStrength zoneMonsterStrength;
std::map<TResource, ui16> mines; //obligatory mines to spawn in this zone
std::vector<CTreasureInfo> treasureInfo;
std::vector<TRmgTemplateZoneId> connections; //list of adjacent zones
};
}
/// The CRmgTemplate describes a random map template. /// The CRmgTemplate describes a random map template.
class DLL_LINKAGE CRmgTemplate class DLL_LINKAGE CRmgTemplate
{ {
@ -81,10 +199,10 @@ public:
void setPlayers(const CPlayerCountRange & value); void setPlayers(const CPlayerCountRange & value);
const CPlayerCountRange & getCpuPlayers() const; const CPlayerCountRange & getCpuPlayers() const;
void setCpuPlayers(const CPlayerCountRange & value); void setCpuPlayers(const CPlayerCountRange & value);
const std::map<TRmgTemplateZoneId, CRmgTemplateZone *> & getZones() const; const std::map<TRmgTemplateZoneId, rmg::ZoneOptions *> & getZones() const;
void setZones(const std::map<TRmgTemplateZoneId, CRmgTemplateZone *> & value); void setZones(const std::map<TRmgTemplateZoneId, rmg::ZoneOptions *> & value);
const std::list<CRmgTemplateZoneConnection> & getConnections() const; const std::list<rmg::ZoneConnection> & getConnections() const;
void setConnections(const std::list<CRmgTemplateZoneConnection> & value); void setConnections(const std::list<rmg::ZoneConnection> & value);
void validate() const; /// Tests template on validity and throws exception on failure void validate() const; /// Tests template on validity and throws exception on failure
@ -92,6 +210,6 @@ private:
std::string name; std::string name;
CSize minSize, maxSize; CSize minSize, maxSize;
CPlayerCountRange players, cpuPlayers; CPlayerCountRange players, cpuPlayers;
std::map<TRmgTemplateZoneId, CRmgTemplateZone *> zones; std::map<TRmgTemplateZoneId, rmg::ZoneOptions *> zones;
std::list<CRmgTemplateZoneConnection> connections; std::list<rmg::ZoneConnection> connections;
}; };

View File

@ -20,6 +20,8 @@
#include "../GameConstants.h" #include "../GameConstants.h"
#include "../StringConstants.h" #include "../StringConstants.h"
using namespace rmg;
const std::map<std::string, CRmgTemplate *> & CRmgTemplateStorage::getTemplates() const const std::map<std::string, CRmgTemplate *> & CRmgTemplateStorage::getTemplates() const
{ {
return templates; return templates;
@ -49,10 +51,10 @@ void CRmgTemplateStorage::loadObject(std::string scope, std::string name, const
tpl->setCpuPlayers(parsePlayers(templateNode["cpu"].String())); tpl->setCpuPlayers(parsePlayers(templateNode["cpu"].String()));
// Parse zones // Parse zones
std::map<TRmgTemplateZoneId, CRmgTemplateZone *> zones; std::map<TRmgTemplateZoneId, ZoneOptions *> zones;
for (const auto & zonePair : templateNode["zones"].Struct()) for (const auto & zonePair : templateNode["zones"].Struct())
{ {
auto zone = new CRmgTemplateZone(); auto zone = new ZoneOptions();
auto zoneId = boost::lexical_cast<TRmgTemplateZoneId>(zonePair.first); auto zoneId = boost::lexical_cast<TRmgTemplateZoneId>(zonePair.first);
zone->setId(zoneId); zone->setId(zoneId);
@ -65,7 +67,7 @@ void CRmgTemplateStorage::loadObject(std::string scope, std::string name, const
zone->setNeutralTowns(parseTemplateZoneTowns(zoneNode["neutralTowns"])); zone->setNeutralTowns(parseTemplateZoneTowns(zoneNode["neutralTowns"]));
if (!zoneNode["matchTerrainToTown"].isNull()) //default : true if (!zoneNode["matchTerrainToTown"].isNull()) //default : true
zone->setMatchTerrainToTown(zoneNode["matchTerrainToTown"].Bool()); zone->setMatchTerrainToTown(zoneNode["matchTerrainToTown"].Bool());
zone->setTerrainTypes(parseTerrainTypes(zoneNode["terrainTypes"].Vector(), zone->getDefaultTerrainTypes())); zone->setTerrainTypes(parseTerrainTypes(zoneNode["terrainTypes"].Vector(), ZoneOptions::DEFAULT_TERRAIN_TYPES));
if (!zoneNode["townsAreSameType"].isNull()) //default : false if (!zoneNode["townsAreSameType"].isNull()) //default : false
zone->setTownsAreSameType((zoneNode["townsAreSameType"].Bool())); zone->setTownsAreSameType((zoneNode["townsAreSameType"].Bool()));
@ -119,7 +121,7 @@ void CRmgTemplateStorage::loadObject(std::string scope, std::string name, const
else else
{ {
delete zone; delete zone;
throw (rmgException("incorrect monster power")); throw (std::runtime_error("incorrect monster power"));
} }
if (!zoneNode["mines"].isNull()) if (!zoneNode["mines"].isNull())
@ -206,12 +208,12 @@ void CRmgTemplateStorage::loadObject(std::string scope, std::string name, const
tpl->setZones(zones); tpl->setZones(zones);
// Parse connections // Parse connections
std::list<CRmgTemplateZoneConnection> connections; std::list<ZoneConnection> connections;
for(const auto & connPair : templateNode["connections"].Vector()) for(const auto & connPair : templateNode["connections"].Vector())
{ {
CRmgTemplateZoneConnection conn; ZoneConnection conn;
conn.setZoneA(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["a"].String()))->second); conn.setZoneA(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["a"].String()))->second->getId());
conn.setZoneB(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["b"].String()))->second); conn.setZoneB(zones.find(boost::lexical_cast<TRmgTemplateZoneId>(connPair["b"].String()))->second->getId());
conn.setGuardStrength(connPair["guard"].Float()); conn.setGuardStrength(connPair["guard"].Float());
connections.push_back(conn); connections.push_back(conn);
} }
@ -220,8 +222,8 @@ void CRmgTemplateStorage::loadObject(std::string scope, std::string name, const
auto zones = tpl->getZones(); auto zones = tpl->getZones();
for (auto con : tpl->getConnections()) for (auto con : tpl->getConnections())
{ {
auto idA = con.getZoneA()->getId(); auto idA = con.getZoneA();
auto idB = con.getZoneB()->getId(); auto idB = con.getZoneB();
zones[idA]->addConnection(idB); zones[idA]->addConnection(idB);
zones[idB]->addConnection(idA); zones[idB]->addConnection(idA);
} }
@ -284,9 +286,9 @@ ETemplateZoneType::ETemplateZoneType CRmgTemplateStorage::parseZoneType(const st
return it->second; return it->second;
} }
CRmgTemplateZone::CTownInfo CRmgTemplateStorage::parseTemplateZoneTowns(const JsonNode & node) const ZoneOptions::CTownInfo CRmgTemplateStorage::parseTemplateZoneTowns(const JsonNode & node) const
{ {
CRmgTemplateZone::CTownInfo towns; ZoneOptions::CTownInfo towns;
towns.setTownCount(node["towns"].Float()); towns.setTownCount(node["towns"].Float());
towns.setCastleCount(node["castles"].Float()); towns.setCastleCount(node["castles"].Float());
towns.setTownDensity(node["townDensity"].Float()); towns.setTownDensity(node["townDensity"].Float());

View File

@ -11,7 +11,6 @@
#pragma once #pragma once
#include "CRmgTemplate.h" #include "CRmgTemplate.h"
#include "CRmgTemplateZone.h"
#include "../IHandlerBase.h" #include "../IHandlerBase.h"
class JsonNode; class JsonNode;
@ -36,7 +35,7 @@ public:
private: private:
CRmgTemplate::CSize parseMapTemplateSize(const std::string & text) const; CRmgTemplate::CSize parseMapTemplateSize(const std::string & text) const;
CRmgTemplateZone::CTownInfo parseTemplateZoneTowns(const JsonNode & node) const; rmg::ZoneOptions::CTownInfo parseTemplateZoneTowns(const JsonNode & node) const;
ETemplateZoneType::ETemplateZoneType parseZoneType(const std::string & type) const; ETemplateZoneType::ETemplateZoneType parseZoneType(const std::string & type) const;
std::set<TFaction> parseTownTypes(const JsonVector & townTypesVector, const std::set<TFaction> & defaultTownTypes) const; std::set<TFaction> parseTownTypes(const JsonVector & townTypesVector, const std::set<TFaction> & defaultTownTypes) const;
std::set<ETerrainType> parseTerrainTypes(const JsonVector & terTypeStrings, const std::set<ETerrainType> & defaultTerrainTypes) const; std::set<ETerrainType> parseTerrainTypes(const JsonVector & terTypeStrings, const std::set<ETerrainType> & defaultTerrainTypes) const;

View File

@ -27,64 +27,15 @@ class CMap;
class CMapEditManager; class CMapEditManager;
//class CGObjectInstance; //class CGObjectInstance;
CRmgTemplateZone::CTownInfo::CTownInfo() : townCount(0), castleCount(0), townDensity(0), castleDensity(0) using namespace rmg; //TODO: move all to namespace
{
}
void CRmgTemplateZone::addRoadNode(const int3& node) void CRmgTemplateZone::addRoadNode(const int3& node)
{ {
roadNodes.insert(node); roadNodes.insert(node);
} }
int CRmgTemplateZone::CTownInfo::getTownCount() const
{
return townCount;
}
void CRmgTemplateZone::CTownInfo::setTownCount(int value)
{
if(value < 0)
throw rmgException("Negative value for town count not allowed.");
townCount = value;
}
int CRmgTemplateZone::CTownInfo::getCastleCount() const
{
return castleCount;
}
void CRmgTemplateZone::CTownInfo::setCastleCount(int value)
{
if(value < 0)
throw rmgException("Negative value for castle count not allowed.");
castleCount = value;
}
int CRmgTemplateZone::CTownInfo::getTownDensity() const
{
return townDensity;
}
void CRmgTemplateZone::CTownInfo::setTownDensity(int value)
{
if(value < 0)
throw rmgException("Negative value for town density not allowed.");
townDensity = value;
}
int CRmgTemplateZone::CTownInfo::getCastleDensity() const
{
return castleDensity;
}
void CRmgTemplateZone::CTownInfo::setCastleDensity(int value)
{
if(value < 0)
throw rmgException("Negative value for castle density not allowed.");
castleDensity = value;
}
CTileInfo::CTileInfo():nearestObjectDistance(INT_MAX), terrain(ETerrainType::WRONG),roadType(ERoadType::NO_ROAD) CTileInfo::CTileInfo():nearestObjectDistance(INT_MAX), terrain(ETerrainType::WRONG),roadType(ERoadType::NO_ROAD)
{ {
occupied = ETileType::POSSIBLE; //all tiles are initially possible to place objects or passages occupied = ETileType::POSSIBLE; //all tiles are initially possible to place objects or passages
@ -152,21 +103,20 @@ void CTileInfo::setRoadType(ERoadType::ERoadType value)
} }
CRmgTemplateZone::CRmgTemplateZone() : CRmgTemplateZone::CRmgTemplateZone()
id(0), : ZoneOptions(),
type(ETemplateZoneType::PLAYER_START),
owner(boost::none),
size(1),
townsAreSameType(false),
matchTerrainToTown(true),
townType(ETownType::NEUTRAL), townType(ETownType::NEUTRAL),
terrainType (ETerrainType::GRASS), terrainType (ETerrainType::GRASS),
zoneMonsterStrength(EMonsterStrength::ZONE_NORMAL),
minGuardedValue(0), minGuardedValue(0),
questArtZone(nullptr), questArtZone(nullptr),
gen(nullptr) gen(nullptr)
{ {
terrainTypes = getDefaultTerrainTypes();
}
void CRmgTemplateZone::setOptions(const ZoneOptions * options)
{
ZoneOptions::operator=(*options);
} }
void CRmgTemplateZone::setGenPtr(CMapGenerator * Gen) void CRmgTemplateZone::setGenPtr(CMapGenerator * Gen)
@ -174,154 +124,6 @@ void CRmgTemplateZone::setGenPtr(CMapGenerator * Gen)
gen = Gen; gen = Gen;
} }
TRmgTemplateZoneId CRmgTemplateZone::getId() const
{
return id;
}
void CRmgTemplateZone::setId(TRmgTemplateZoneId value)
{
if(value <= 0)
throw rmgException(boost::to_string(boost::format("Zone %d id should be greater than 0.") %id));
id = value;
}
ETemplateZoneType::ETemplateZoneType CRmgTemplateZone::getType() const
{
return type;
}
void CRmgTemplateZone::setType(ETemplateZoneType::ETemplateZoneType value)
{
type = value;
}
int CRmgTemplateZone::getSize() const
{
return size;
}
void CRmgTemplateZone::setSize(int value)
{
if(value <= 0)
throw rmgException(boost::to_string(boost::format("Zone %d size needs to be greater than 0.") % id));
size = value;
}
boost::optional<int> CRmgTemplateZone::getOwner() const
{
return owner;
}
void CRmgTemplateZone::setOwner(boost::optional<int> value)
{
if(!(*value >= 0 && *value <= PlayerColor::PLAYER_LIMIT_I))
throw rmgException(boost::to_string(boost::format ("Owner of zone %d has to be in range 0 to max player count.") %id));
owner = value;
}
const CRmgTemplateZone::CTownInfo & CRmgTemplateZone::getPlayerTowns() const
{
return playerTowns;
}
void CRmgTemplateZone::setPlayerTowns(const CTownInfo & value)
{
playerTowns = value;
}
const CRmgTemplateZone::CTownInfo & CRmgTemplateZone::getNeutralTowns() const
{
return neutralTowns;
}
void CRmgTemplateZone::setNeutralTowns(const CTownInfo & value)
{
neutralTowns = value;
}
bool CRmgTemplateZone::getTownsAreSameType() const
{
return townsAreSameType;
}
void CRmgTemplateZone::setTownsAreSameType(bool value)
{
townsAreSameType = value;
}
const std::set<TFaction> & CRmgTemplateZone::getTownTypes() const
{
return townTypes;
}
void CRmgTemplateZone::setTownTypes(const std::set<TFaction> & value)
{
townTypes = value;
}
void CRmgTemplateZone::setMonsterTypes(const std::set<TFaction> & value)
{
monsterTypes = value;
}
std::set<TFaction> CRmgTemplateZone::getDefaultTownTypes() const
{
std::set<TFaction> defaultTowns;
auto towns = VLC->townh->getDefaultAllowed();
for(int i = 0; i < towns.size(); ++i)
{
if(towns[i]) defaultTowns.insert(i);
}
return defaultTowns;
}
bool CRmgTemplateZone::getMatchTerrainToTown() const
{
return matchTerrainToTown;
}
void CRmgTemplateZone::setMatchTerrainToTown(bool value)
{
matchTerrainToTown = value;
}
const std::set<ETerrainType> & CRmgTemplateZone::getTerrainTypes() const
{
return terrainTypes;
}
void CRmgTemplateZone::setTerrainTypes(const std::set<ETerrainType> & value)
{
assert(value.find(ETerrainType::WRONG) == value.end() && value.find(ETerrainType::BORDER) == value.end() &&
value.find(ETerrainType::WATER) == value.end() && value.find(ETerrainType::ROCK) == value.end());
terrainTypes = value;
}
std::set<ETerrainType> CRmgTemplateZone::getDefaultTerrainTypes() const
{
std::set<ETerrainType> terTypes;
static const ETerrainType::EETerrainType allowedTerTypes[] = {ETerrainType::DIRT, ETerrainType::SAND, ETerrainType::GRASS, ETerrainType::SNOW,
ETerrainType::SWAMP, ETerrainType::ROUGH, ETerrainType::SUBTERRANEAN, ETerrainType::LAVA};
for (auto & allowedTerType : allowedTerTypes)
terTypes.insert(allowedTerType);
return terTypes;
}
void CRmgTemplateZone::setMinesAmount (TResource res, ui16 amount)
{
mines[res] = amount;
}
std::map<TResource, ui16> CRmgTemplateZone::getMinesInfo() const
{
return mines;
}
void CRmgTemplateZone::addConnection(TRmgTemplateZoneId otherZone)
{
connections.push_back (otherZone);
}
void CRmgTemplateZone::setQuestArtZone(CRmgTemplateZone * otherZone) void CRmgTemplateZone::setQuestArtZone(CRmgTemplateZone * otherZone)
{ {
questArtZone = otherZone; questArtZone = otherZone;
@ -332,22 +134,6 @@ std::vector<TRmgTemplateZoneId> CRmgTemplateZone::getConnections() const
return connections; return connections;
} }
void CRmgTemplateZone::setMonsterStrength (EMonsterStrength::EMonsterStrength val)
{
assert (vstd::iswithin(val, EMonsterStrength::ZONE_WEAK, EMonsterStrength::ZONE_STRONG));
zoneMonsterStrength = val;
}
void CRmgTemplateZone::addTreasureInfo(CTreasureInfo & info)
{
treasureInfo.push_back(info);
}
std::vector<CTreasureInfo> CRmgTemplateZone::getTreasureInfo()
{
return treasureInfo;
}
std::set<int3>* CRmgTemplateZone::getFreePaths() std::set<int3>* CRmgTemplateZone::getFreePaths()
{ {
return &freePaths; return &freePaths;

View File

@ -14,7 +14,7 @@
#include "CMapGenerator.h" #include "CMapGenerator.h"
#include "float3.h" #include "float3.h"
#include "../int3.h" #include "../int3.h"
#include "../ResourceSet.h" //for TResource (?) #include "CRmgTemplate.h"
#include "../mapObjects/ObjectTemplate.h" #include "../mapObjects/ObjectTemplate.h"
#include <boost/heap/priority_queue.hpp> //A* #include <boost/heap/priority_queue.hpp> //A*
@ -23,18 +23,7 @@ class CTileInfo;
class int3; class int3;
class CGObjectInstance; class CGObjectInstance;
class ObjectTemplate; class ObjectTemplate;
class CRmgTemplateZoneConnection;
namespace ETemplateZoneType
{
enum ETemplateZoneType
{
PLAYER_START,
CPU_START,
TREASURE,
JUNCTION
};
}
namespace EObjectPlacingResult namespace EObjectPlacingResult
{ {
enum EObjectPlacingResult enum EObjectPlacingResult
@ -71,14 +60,6 @@ private:
ERoadType::ERoadType roadType; ERoadType::ERoadType roadType;
}; };
class DLL_LINKAGE CTreasureInfo
{
public:
ui32 min;
ui32 max;
ui16 density;
};
struct DLL_LINKAGE ObjectInfo struct DLL_LINKAGE ObjectInfo
{ {
ObjectTemplate templ; ObjectTemplate templ;
@ -105,57 +86,14 @@ struct DLL_LINKAGE CTreasurePileInfo
}; };
/// The CRmgTemplateZone describes a zone in a template. /// The CRmgTemplateZone describes a zone in a template.
class DLL_LINKAGE CRmgTemplateZone class DLL_LINKAGE CRmgTemplateZone : public rmg::ZoneOptions
{ {
public: public:
class DLL_LINKAGE CTownInfo
{
public:
CTownInfo();
int getTownCount() const; /// Default: 0
void setTownCount(int value);
int getCastleCount() const; /// Default: 0
void setCastleCount(int value);
int getTownDensity() const; /// Default: 0
void setTownDensity(int value);
int getCastleDensity() const; /// Default: 0
void setCastleDensity(int value);
private:
int townCount, castleCount, townDensity, castleDensity;
};
CRmgTemplateZone(); CRmgTemplateZone();
void setGenPtr(CMapGenerator * Gen); void setOptions(const rmg::ZoneOptions * options);
TRmgTemplateZoneId getId() const; /// Default: 0 void setGenPtr(CMapGenerator * Gen);
void setId(TRmgTemplateZoneId value);
ETemplateZoneType::ETemplateZoneType getType() const; /// Default: ETemplateZoneType::PLAYER_START
void setType(ETemplateZoneType::ETemplateZoneType value);
int getSize() const; /// Default: 1
void setSize(int value);
boost::optional<int> getOwner() const;
void setOwner(boost::optional<int> value);
const CTownInfo & getPlayerTowns() const;
void setPlayerTowns(const CTownInfo & value);
const CTownInfo & getNeutralTowns() const;
void setNeutralTowns(const CTownInfo & value);
bool getTownsAreSameType() const; /// Default: false
void setTownsAreSameType(bool value);
const std::set<TFaction> & getTownTypes() const; /// Default: all
void setTownTypes(const std::set<TFaction> & value);
void setMonsterTypes(const std::set<TFaction> & value);
std::set<TFaction> getDefaultTownTypes() const;
bool getMatchTerrainToTown() const; /// Default: true
void setMatchTerrainToTown(bool value);
const std::set<ETerrainType> & getTerrainTypes() const; /// Default: all
void setTerrainTypes(const std::set<ETerrainType> & value);
std::set<ETerrainType> getDefaultTerrainTypes() const;
void setMinesAmount (TResource res, ui16 amount);
std::map<TResource, ui16> getMinesInfo() const;
void setMonsterStrength (EMonsterStrength::EMonsterStrength val);
float3 getCenter() const; float3 getCenter() const;
void setCenter(const float3 &f); void setCenter(const float3 &f);
@ -198,11 +136,8 @@ public:
std::vector<int3> getAccessibleOffsets (const CGObjectInstance* object); std::vector<int3> getAccessibleOffsets (const CGObjectInstance* object);
bool areAllTilesAvailable(CGObjectInstance* obj, int3& tile, std::set<int3>& tilesBlockedByObject) const; bool areAllTilesAvailable(CGObjectInstance* obj, int3& tile, std::set<int3>& tilesBlockedByObject) const;
void addConnection(TRmgTemplateZoneId otherZone);
void setQuestArtZone(CRmgTemplateZone * otherZone); void setQuestArtZone(CRmgTemplateZone * otherZone);
std::vector<TRmgTemplateZoneId> getConnections() const; std::vector<TRmgTemplateZoneId> getConnections() const;
void addTreasureInfo(CTreasureInfo & info);
std::vector<CTreasureInfo> getTreasureInfo();
std::set<int3>* getFreePaths(); std::set<int3>* getFreePaths();
ObjectInfo getRandomObject (CTreasurePileInfo &info, ui32 desiredValue, ui32 maxValue, ui32 currentValue); ObjectInfo getRandomObject (CTreasurePileInfo &info, ui32 desiredValue, ui32 maxValue, ui32 currentValue);
@ -226,27 +161,13 @@ public:
boost::heap::priority_queue<TDistance, boost::heap::compare<NodeComparer>> createPiorityQueue(); boost::heap::priority_queue<TDistance, boost::heap::compare<NodeComparer>> createPiorityQueue();
private: private:
CMapGenerator * gen; CMapGenerator * gen;
//template info //template info
TRmgTemplateZoneId id;
ETemplateZoneType::ETemplateZoneType type;
int size;
boost::optional<int> owner;
CTownInfo playerTowns, neutralTowns;
bool townsAreSameType;
std::set<TFaction> townTypes;
std::set<TFaction> monsterTypes;
bool matchTerrainToTown;
std::set<ETerrainType> terrainTypes;
std::map<TResource, ui16> mines; //obligatory mines to spawn in this zone
si32 townType; si32 townType;
ETerrainType terrainType; ETerrainType terrainType;
CRmgTemplateZone * questArtZone; //artifacts required for Seer Huts will be placed here - or not if null CRmgTemplateZone * questArtZone; //artifacts required for Seer Huts will be placed here - or not if null
EMonsterStrength::EMonsterStrength zoneMonsterStrength;
std::vector<CTreasureInfo> treasureInfo;
std::vector<ObjectInfo> possibleObjects; std::vector<ObjectInfo> possibleObjects;
int minGuardedValue; int minGuardedValue;
@ -260,7 +181,6 @@ private:
float3 center; float3 center;
std::set<int3> tileinfo; //irregular area assined to zone std::set<int3> tileinfo; //irregular area assined to zone
std::set<int3> possibleTiles; //optimization purposes for treasure generation std::set<int3> possibleTiles; //optimization purposes for treasure generation
std::vector<TRmgTemplateZoneId> connections; //list of adjacent zones
std::set<int3> freePaths; //core paths of free tiles that all other objects will be linked to std::set<int3> freePaths; //core paths of free tiles that all other objects will be linked to
std::set<int3> roadNodes; //tiles to be connected with roads std::set<int3> roadNodes; //tiles to be connected with roads