1
0
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:
DjWarmonger
2014-06-07 09:09:50 +02:00
parent e4ea6727b7
commit 743d8dcf9f
2 changed files with 38 additions and 6 deletions

View File

@@ -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

View File

@@ -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);