|
|
@@ -1036,7 +1036,7 @@ void CRmgTemplateZone::createObstacles(CMapGenerator* gen)
|
|
|
auto tryToPlaceObstacleHere = [this, gen](int3& tile)-> bool
|
|
|
{
|
|
|
auto temp = *RandomGeneratorUtil::nextItem(possibleObstacles, gen->rand);
|
|
|
- int3 obstaclePos = tile + temp.getBlockMapOffset();
|
|
|
+ int3 obstaclePos = tile - temp.getBlockMapOffset();
|
|
|
if (canObstacleBePlacedHere(gen, temp, obstaclePos)) //can be placed here
|
|
|
{
|
|
|
auto obj = VLC->objtypeh->getHandlerFor(temp.id, temp.subid)->create(temp);
|
|
|
@@ -1113,19 +1113,20 @@ bool CRmgTemplateZone::findPlaceForTreasurePile(CMapGenerator* gen, si32 min_dis
|
|
|
|
|
|
bool CRmgTemplateZone::canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplate &temp, int3 &pos)
|
|
|
{
|
|
|
+ if (!gen->map->isInTheMap(pos)) //blockmap may fit in the map, but botom-right corner does not
|
|
|
+ return false;
|
|
|
+
|
|
|
auto tilesBlockedByObject = temp.getBlockedOffsets();
|
|
|
|
|
|
- bool allTilesAvailable = true;
|
|
|
for (auto blockingTile : tilesBlockedByObject)
|
|
|
{
|
|
|
int3 t = pos + blockingTile;
|
|
|
if (!gen->map->isInTheMap(t) || !(gen->isPossible(t) || gen->shouldBeBlocked(t)))
|
|
|
{
|
|
|
- allTilesAvailable = false; //if at least one tile is not possible, object can't be placed here
|
|
|
- break;
|
|
|
+ return false; //if at least one tile is not possible, object can't be placed here
|
|
|
}
|
|
|
}
|
|
|
- return allTilesAvailable;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos)
|
|
|
@@ -1207,7 +1208,7 @@ bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance*
|
|
|
void CRmgTemplateZone::checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos)
|
|
|
{
|
|
|
if (!gen->map->isInTheMap(pos))
|
|
|
- throw rmgException(boost::to_string(boost::format("Position of object %d at %s is outside the map") % object->id % object->pos()));
|
|
|
+ throw rmgException(boost::to_string(boost::format("Position of object %d at %s is outside the map") % object->id % pos));
|
|
|
object->pos = pos;
|
|
|
|
|
|
if (object->isVisitable() && !gen->map->isInTheMap(object->visitablePos()))
|