mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-15 20:03:15 +02:00
Treasure piles won't be placed at free tiles.
This commit is contained in:
@@ -668,16 +668,11 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
|
||||
const double res_mindist = 5;
|
||||
|
||||
//TODO: just placeholder to chekc for possible locations
|
||||
auto obj = new CGResource();
|
||||
obj->ID = Obj::RESOURCE;
|
||||
obj->subID = static_cast<si32>(Res::ERes::GOLD);
|
||||
obj->amount = 0;
|
||||
do {
|
||||
|
||||
int3 pos;
|
||||
if ( ! findPlaceForObject(gen, obj, res_mindist, pos))
|
||||
if ( ! findPlaceForTreasurePile(gen, 5, pos))
|
||||
{
|
||||
delete obj;
|
||||
break;
|
||||
}
|
||||
createTreasurePile (gen, pos);
|
||||
@@ -706,6 +701,42 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRmgTemplateZone::findPlaceForTreasurePile(CMapGenerator* gen, si32 min_dist, int3 &pos)
|
||||
{
|
||||
//si32 min_dist = sqrt(tileinfo.size()/density);
|
||||
int best_distance = 0;
|
||||
bool result = false;
|
||||
|
||||
//logGlobal->infoStream() << boost::format("Min dist for density %f is %d") % density % min_dist;
|
||||
for(auto tile : tileinfo)
|
||||
{
|
||||
auto dist = gen->getTile(tile).getNearestObjectDistance();
|
||||
|
||||
if (gen->isPossible(tile) && (dist >= min_dist) && (dist > best_distance))
|
||||
{
|
||||
bool allTilesAvailable = true;
|
||||
gen->foreach_neighbour (tile, [&gen, &allTilesAvailable](int3 neighbour)
|
||||
{
|
||||
if (!(gen->isPossible(neighbour) || gen->isBlocked(neighbour)))
|
||||
{
|
||||
allTilesAvailable = false; //all present tiles must be already blocked or ready for new objects
|
||||
}
|
||||
});
|
||||
if (allTilesAvailable)
|
||||
{
|
||||
best_distance = dist;
|
||||
pos = tile;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (result)
|
||||
{
|
||||
gen->setOccupied(pos, ETileType::BLOCKED); //block that tile
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos)
|
||||
{
|
||||
//we need object apperance to deduce free tiles
|
||||
|
@@ -172,6 +172,7 @@ private:
|
||||
bool pointIsIn(int x, int y);
|
||||
void addAllPossibleObjects (CMapGenerator* gen); //add objects, including zone-specific, to possibleObjects
|
||||
bool findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos);
|
||||
bool findPlaceForTreasurePile(CMapGenerator* gen, si32 min_dist, int3 &pos);
|
||||
void checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos);
|
||||
void placeObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos);
|
||||
bool guardObject(CMapGenerator* gen, CGObjectInstance* object, si32 str);
|
||||
|
Reference in New Issue
Block a user