mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-21 17:17:06 +02:00
Implemented configurable level of decorations for terrains
This commit is contained in:
parent
4ed283a357
commit
19e851ddff
@ -85,7 +85,8 @@
|
||||
"N", "N", "N",
|
||||
"N", "N", "N"
|
||||
],
|
||||
"mapping" : { "normal" : "49-72", "dirt" : "21-44", "sand" : "0-23", "water" : "20-32", "rock": "0-7", "hota" : "77-117" }
|
||||
"decoration" : true,
|
||||
"mapping" : { "normal" : "49-56,57-72", "dirt" : "21-28,29-44", "sand" : "0-11,12-23", "water" : "20-32", "rock": "0-7", "hota" : "77-101,102-117" }
|
||||
},
|
||||
// Mixed transitions
|
||||
{
|
||||
|
@ -125,9 +125,9 @@ void CMapEditManager::clearTerrain(CRandomGenerator * gen)
|
||||
execute(std::make_unique<CClearTerrainOperation>(map, gen ? gen : &(this->gen)));
|
||||
}
|
||||
|
||||
void CMapEditManager::drawTerrain(TerrainId terType, CRandomGenerator * gen)
|
||||
void CMapEditManager::drawTerrain(TerrainId terType, int decorationsPercentage, CRandomGenerator * gen)
|
||||
{
|
||||
execute(std::make_unique<CDrawTerrainOperation>(map, terrainSel, terType, gen ? gen : &(this->gen)));
|
||||
execute(std::make_unique<CDrawTerrainOperation>(map, terrainSel, terType, decorationsPercentage, gen ? gen : &(this->gen)));
|
||||
terrainSel.clearSelection();
|
||||
}
|
||||
|
||||
@ -143,8 +143,6 @@ void CMapEditManager::drawRiver(RiverId riverType, CRandomGenerator* gen)
|
||||
terrainSel.clearSelection();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CMapEditManager::insertObject(CGObjectInstance * obj)
|
||||
{
|
||||
execute(std::make_unique<CInsertObjectOperation>(map, obj));
|
||||
|
@ -70,7 +70,7 @@ public:
|
||||
void clearTerrain(CRandomGenerator * gen = nullptr);
|
||||
|
||||
/// Draws terrain at the current terrain selection. The selection will be cleared automatically.
|
||||
void drawTerrain(TerrainId terType, CRandomGenerator * gen = nullptr);
|
||||
void drawTerrain(TerrainId terType, int decorationsPercentage, CRandomGenerator * gen = nullptr);
|
||||
|
||||
/// Draws roads at the current terrain selection. The selection will be cleared automatically.
|
||||
void drawRoad(RoadId roadType, CRandomGenerator * gen = nullptr);
|
||||
|
@ -83,10 +83,11 @@ void CComposedOperation::addOperation(std::unique_ptr<CMapOperation>&& operation
|
||||
operations.push_back(std::move(operation));
|
||||
}
|
||||
|
||||
CDrawTerrainOperation::CDrawTerrainOperation(CMap * map, CTerrainSelection terrainSel, TerrainId terType, CRandomGenerator * gen):
|
||||
CDrawTerrainOperation::CDrawTerrainOperation(CMap * map, CTerrainSelection terrainSel, TerrainId terType, int decorationsPercentage, CRandomGenerator * gen):
|
||||
CMapOperation(map),
|
||||
terrainSel(std::move(terrainSel)),
|
||||
terType(terType),
|
||||
decorationsPercentage(decorationsPercentage),
|
||||
gen(gen)
|
||||
{
|
||||
|
||||
@ -286,14 +287,19 @@ void CDrawTerrainOperation::updateTerrainViews()
|
||||
// Get mapping
|
||||
const TerrainViewPattern& pattern = patterns[bestPattern][valRslt.flip];
|
||||
std::pair<int, int> mapping;
|
||||
if(valRslt.transitionReplacement.empty())
|
||||
|
||||
mapping = pattern.mapping[0];
|
||||
|
||||
if(pattern.decoration)
|
||||
{
|
||||
mapping = pattern.mapping[0];
|
||||
if (gen->nextInt(100) > decorationsPercentage)
|
||||
mapping = pattern.mapping[0];
|
||||
else
|
||||
mapping = pattern.mapping[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (!valRslt.transitionReplacement.empty())
|
||||
mapping = valRslt.transitionReplacement == TerrainViewPattern::RULE_DIRT ? pattern.mapping[0] : pattern.mapping[1];
|
||||
}
|
||||
|
||||
// Set terrain view
|
||||
auto & tile = map->getTile(pos);
|
||||
@ -555,12 +561,12 @@ CClearTerrainOperation::CClearTerrainOperation(CMap* map, CRandomGenerator* gen)
|
||||
{
|
||||
CTerrainSelection terrainSel(map);
|
||||
terrainSel.selectRange(MapRect(int3(0, 0, 0), map->width, map->height));
|
||||
addOperation(std::make_unique<CDrawTerrainOperation>(map, terrainSel, ETerrainId::WATER, gen));
|
||||
addOperation(std::make_unique<CDrawTerrainOperation>(map, terrainSel, ETerrainId::WATER, 0, gen));
|
||||
if(map->twoLevel)
|
||||
{
|
||||
terrainSel.clearSelection();
|
||||
terrainSel.selectRange(MapRect(int3(0, 0, 1), map->width, map->height));
|
||||
addOperation(std::make_unique<CDrawTerrainOperation>(map, terrainSel, ETerrainId::ROCK, gen));
|
||||
addOperation(std::make_unique<CDrawTerrainOperation>(map, terrainSel, ETerrainId::ROCK, 0, gen));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ private:
|
||||
class CDrawTerrainOperation : public CMapOperation
|
||||
{
|
||||
public:
|
||||
CDrawTerrainOperation(CMap * map, CTerrainSelection terrainSel, TerrainId terType, CRandomGenerator * gen);
|
||||
CDrawTerrainOperation(CMap * map, CTerrainSelection terrainSel, TerrainId terType, int decorationsPercentage, CRandomGenerator * gen);
|
||||
|
||||
void execute() override;
|
||||
void undo() override;
|
||||
@ -101,6 +101,7 @@ private:
|
||||
|
||||
CTerrainSelection terrainSel;
|
||||
TerrainId terType;
|
||||
int decorationsPercentage;
|
||||
CRandomGenerator* gen;
|
||||
std::set<int3> invalidatedTerViews;
|
||||
};
|
||||
|
@ -145,6 +145,7 @@ const std::string TerrainViewPattern::RULE_ANY = "?";
|
||||
TerrainViewPattern::TerrainViewPattern()
|
||||
: diffImages(false)
|
||||
, rotationTypesCount(0)
|
||||
, decoration(false)
|
||||
, minPoints(0)
|
||||
, maxPoints(std::numeric_limits<int>::max())
|
||||
{
|
||||
@ -209,6 +210,7 @@ CTerrainViewPatternConfig::CTerrainViewPatternConfig()
|
||||
// Read various properties
|
||||
pattern.id = ptrnNode["id"].String();
|
||||
assert(!pattern.id.empty());
|
||||
pattern.decoration = ptrnNode["decoration"].Bool();
|
||||
pattern.minPoints = static_cast<int>(ptrnNode["minPoints"].Float());
|
||||
pattern.maxPoints = static_cast<int>(ptrnNode["maxPoints"].Float());
|
||||
if (pattern.maxPoints == 0)
|
||||
|
@ -199,6 +199,8 @@ struct DLL_LINKAGE TerrainViewPattern
|
||||
/// If diffImages is true, different images/frames are used to place a rotated terrain view. If it's false
|
||||
/// the same frame will be used and rotated.
|
||||
bool diffImages;
|
||||
/// If true, then this pattern describes decoration tiles and should be used with specified probability
|
||||
bool decoration;
|
||||
/// The rotationTypesCount is only used if diffImages is true and holds the number how many rotation types(horizontal, etc...)
|
||||
/// are supported.
|
||||
int rotationTypesCount;
|
||||
|
@ -45,6 +45,11 @@ RmgMap::RmgMap(const CMapGenOptions& mapGenOptions) :
|
||||
getEditManager()->getUndoManager().setUndoRedoLimit(0);
|
||||
}
|
||||
|
||||
int RmgMap::getDecorationsPercentage() const
|
||||
{
|
||||
return 10; // arbitrary value to generate more readable map
|
||||
}
|
||||
|
||||
void RmgMap::foreach_neighbour(const int3 & pos, const std::function<void(int3 & pos)> & foo) const
|
||||
{
|
||||
for(const int3 &dir : int3::getDirs())
|
||||
@ -90,7 +95,7 @@ void RmgMap::initTiles(CMapGenerator & generator, CRandomGenerator & rand)
|
||||
|
||||
getEditManager()->clearTerrain(&rand);
|
||||
getEditManager()->getTerrainSelection().selectRange(MapRect(int3(0, 0, 0), mapGenOptions.getWidth(), mapGenOptions.getHeight()));
|
||||
getEditManager()->drawTerrain(ETerrainId::GRASS, &rand);
|
||||
getEditManager()->drawTerrain(ETerrainId::GRASS, getDecorationsPercentage(), &rand);
|
||||
|
||||
const auto * tmpl = mapGenOptions.getMapTemplate();
|
||||
zones.clear();
|
||||
|
@ -27,6 +27,8 @@ class playerInfo;
|
||||
class RmgMap
|
||||
{
|
||||
public:
|
||||
int getDecorationsPercentage() const;
|
||||
|
||||
mutable std::unique_ptr<CMap> mapInstance;
|
||||
std::shared_ptr<MapProxy> getMapProxy() const;
|
||||
CMap & getMap(const CMapGenerator *) const; //limited access
|
||||
|
@ -40,7 +40,7 @@ void MapProxy::drawTerrain(CRandomGenerator & generator, std::vector<int3> & til
|
||||
{
|
||||
Lock lock(mx);
|
||||
map.getEditManager()->getTerrainSelection().setSelection(tiles);
|
||||
map.getEditManager()->drawTerrain(terrain, &generator);
|
||||
map.getEditManager()->drawTerrain(terrain, map.getDecorationsPercentage(), &generator);
|
||||
}
|
||||
|
||||
void MapProxy::drawRivers(CRandomGenerator & generator, std::vector<int3> & tiles, TerrainId terrain)
|
||||
@ -57,4 +57,4 @@ void MapProxy::drawRoads(CRandomGenerator & generator, std::vector<int3> & tiles
|
||||
map.getEditManager()->drawRoad(roadType, &generator);
|
||||
}
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
@ -28,7 +28,7 @@ public:
|
||||
void insertObjects(std::set<CGObjectInstance*>& objects);
|
||||
void removeObject(CGObjectInstance* obj);
|
||||
|
||||
void drawTerrain(CRandomGenerator & generator, std::vector<int3> & tiles, TerrainId terrain);
|
||||
void drawTerrain(CRandomGenerator & generator, std::vector<int3> & tiles, TerrainId terrain);
|
||||
void drawRivers(CRandomGenerator & generator, std::vector<int3> & tiles, TerrainId terrain);
|
||||
void drawRoads(CRandomGenerator & generator, std::vector<int3> & tiles, RoadId roadType);
|
||||
|
||||
@ -39,4 +39,4 @@ private:
|
||||
RmgMap & map;
|
||||
};
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
Loading…
Reference in New Issue
Block a user