1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Large objects will not spawn at blocked tiles.

This commit is contained in:
DjWarmonger 2014-05-31 12:26:37 +02:00
parent 8e8b27087a
commit 3c6a1fb715

View File

@ -553,6 +553,10 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
sel.clearSelection();
for (auto tile : tileinfo)
{
//test code - block all the map to show paths clearly
//if (gen->isPossible(tile))
// gen->setOccupied(tile, ETileType::BLOCKED);
if (gen->shouldBeBlocked(tile)) //fill tiles that should be blocked with obstacles
{
auto obj = new CGObjectInstance();
@ -569,6 +573,16 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos)
{
//we need object apperance to deduce free tiles
if (obj->appearance.id == Obj::NO_OBJ)
{
auto templates = VLC->dobjinfo->pickCandidates(obj->ID, obj->subID, gen->map->getTile(getPos()).terType);
if (templates.empty())
throw rmgException(boost::to_string(boost::format("Did not find graphics for object (%d,%d) at %s") %obj->ID %obj->subID %pos));
obj->appearance = templates.front();
}
//si32 min_dist = sqrt(tileinfo.size()/density);
int best_distance = 0;
bool result = false;
@ -589,7 +603,8 @@ bool CRmgTemplateZone::findPlaceForObject(CMapGenerator* gen, CGObjectInstance*
bool allTilesAvailable = true;
for (auto blockingTile : obj->getBlockedOffsets())
{
if (!gen->isPossible(pos + blockingTile))
int3 t = tile + blockingTile;
if (!gen->map->isInTheMap(t) || !gen->isPossible(t))
{
allTilesAvailable = false; //if at least one tile is not possible, object can't be placed here
break;
@ -624,11 +639,15 @@ void CRmgTemplateZone::checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance*
throw rmgException(boost::to_string(boost::format("Tile %s of object %d at %s is outside the map") % tile() % object->id % object->pos()));
}
auto templates = VLC->dobjinfo->pickCandidates(object->ID, object->subID, gen->map->getTile(pos).terType);
if (templates.empty())
throw rmgException(boost::to_string(boost::format("Did not find graphics for object (%d,%d) at %s") %object->ID %object->subID %pos));
if (object->appearance.id == Obj::NO_OBJ)
{
auto templates = VLC->dobjinfo->pickCandidates(object->ID, object->subID, gen->map->getTile(pos).terType);
if (templates.empty())
throw rmgException(boost::to_string(boost::format("Did not find graphics for object (%d,%d) at %s") %object->ID %object->subID %pos));
object->appearance = templates.front();
object->appearance = templates.front();
}
gen->map->addBlockVisTiles(object);
gen->editManager->insertObject(object, pos);
logGlobal->traceStream() << boost::format ("Successfully inserted object (%d,%d) at pos %s") %object->ID %object->subID %pos();