1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

- Solved problems with sealed-off objects for once and all.

- Refactoring
This commit is contained in:
DjWarmonger
2015-06-03 21:57:22 +02:00
parent 923437bf76
commit 63d6cf168f
2 changed files with 13 additions and 10 deletions

View File

@@ -1466,7 +1466,7 @@ bool CRmgTemplateZone::createRequiredObjects(CMapGenerator* gen)
if (gen->map->isInTheMap(tile))
gen->setOccupied(tile, ETileType::BLOCKED);
}
accessibleOffset = getAccessibleOffset(gen, obj->appearance, pos, obj->getBlockedOffsets());
accessibleOffset = getAccessibleOffset(gen, obj->appearance, pos);
if (!accessibleOffset.valid())
{
logGlobal->warnStream() << boost::format("Cannot access required object at position %s, retrying") % pos;
@@ -1506,7 +1506,7 @@ bool CRmgTemplateZone::createRequiredObjects(CMapGenerator* gen)
for (auto tile : tiles)
{
//object must be accessible from at least one surounding tile
if (!isAccessibleFromAnywhere(gen, obj.first->appearance, tile, tilesBlockedByObject))
if (!isAccessibleFromAnywhere(gen, obj.first->appearance, tile))
continue;
//avoid borders
@@ -1817,13 +1817,15 @@ bool CRmgTemplateZone::canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplat
return true;
}
bool CRmgTemplateZone::isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const
bool CRmgTemplateZone::isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const
{
return getAccessibleOffset(gen, appearance, tile, tilesBlockedByObject).valid();
return getAccessibleOffset(gen, appearance, tile).valid();
}
int3 CRmgTemplateZone::getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const
int3 CRmgTemplateZone::getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const
{
auto tilesBlockedByObject = appearance.getBlockedOffsets();
int3 ret(-1, -1, -1);
for (int x = -1; x < 2; x++)
{
@@ -1891,7 +1893,7 @@ bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance*
for (auto tile : tileinfo)
{
//object must be accessible from at least one surounding tile
if (!isAccessibleFromAnywhere(gen, obj->appearance, tile, tilesBlockedByObject))
if (!isAccessibleFromAnywhere(gen, obj->appearance, tile))
continue;
auto ti = gen->getTile(tile);
@@ -2033,7 +2035,8 @@ bool CRmgTemplateZone::guardObject(CMapGenerator* gen, CGObjectInstance* object,
if (tiles.size())
{
guardTile = tiles.front();
//guardTile = tiles.front();
guardTile = getAccessibleOffset(gen, object->appearance, object->pos);
logGlobal->traceStream() << boost::format("Guard object at %s") % object->pos();
}
else
@@ -2091,7 +2094,7 @@ ObjectInfo CRmgTemplateZone::getRandomObject(CMapGenerator* gen, CTreasurePileIn
//objectsVisitableFromBottom++;
//there must be free tiles under object
auto blockedOffsets = oi.templ.getBlockedOffsets();
if (!isAccessibleFromAnywhere(gen, oi.templ, newVisitablePos, blockedOffsets))
if (!isAccessibleFromAnywhere(gen, oi.templ, newVisitablePos))
continue;
}

View File

@@ -232,8 +232,8 @@ private:
bool pointIsIn(int x, int y);
void addAllPossibleObjects (CMapGenerator* gen); //add objects, including zone-specific, to possibleObjects
bool isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const;
int3 getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const;
bool isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const;
int3 getAccessibleOffset(CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile) const;
bool findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos);
bool findPlaceForTreasurePile(CMapGenerator* gen, float min_dist, int3 &pos, int value);
bool canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplate &temp, int3 &pos);