1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

Remove pointer to objects from TerrainTile

This commit is contained in:
Ivan Savenko
2025-03-19 14:40:45 +00:00
parent 63d00b080e
commit cd7732456a
26 changed files with 164 additions and 113 deletions

View File

@ -143,15 +143,10 @@ bool TerrainTile::isClear(const TerrainTile * from) const
return entrableTerrain(from) && !blocked();
}
Obj TerrainTile::topVisitableId(bool excludeTop) const
{
return topVisitableObj(excludeTop) ? topVisitableObj(excludeTop)->ID : Obj(Obj::NO_OBJ);
}
CGObjectInstance * TerrainTile::topVisitableObj(bool excludeTop) const
ObjectInstanceID TerrainTile::topVisitableObj(bool excludeTop) const
{
if(visitableObjects.empty() || (excludeTop && visitableObjects.size() == 1))
return nullptr;
return {};
if(excludeTop)
return visitableObjects[visitableObjects.size()-2];
@ -202,10 +197,10 @@ void CMap::removeBlockVisTiles(CGObjectInstance * obj, bool total)
{
TerrainTile & curt = terrain[zVal][xVal][yVal];
if(total || obj->visitableAt(int3(xVal, yVal, zVal)))
curt.visitableObjects -= obj;
curt.visitableObjects -= obj->id;
if(total || obj->blockingAt(int3(xVal, yVal, zVal)))
curt.blockingObjects -= obj;
curt.blockingObjects -= obj->id;
}
}
}
@ -224,10 +219,10 @@ void CMap::addBlockVisTiles(CGObjectInstance * obj)
{
TerrainTile & curt = terrain[zVal][xVal][yVal];
if(obj->visitableAt(int3(xVal, yVal, zVal)))
curt.visitableObjects.push_back(obj);
curt.visitableObjects.push_back(obj->id);
if(obj->blockingAt(int3(xVal, yVal, zVal)))
curt.blockingObjects.push_back(obj);
curt.blockingObjects.push_back(obj->id);
}
}
}
@ -300,12 +295,12 @@ bool CMap::checkForVisitableDir(const int3 & src, const TerrainTile * pom, const
{
if (!pom->entrableTerrain()) //rock is never accessible
return false;
for(auto * obj : pom->visitableObjects) //checking destination tile
for(const auto & objID : pom->visitableObjects) //checking destination tile
{
if(!vstd::contains(pom->blockingObjects, obj)) //this visitable object is not blocking, ignore
if(!vstd::contains(pom->blockingObjects, objID)) //this visitable object is not blocking, ignore
continue;
if (!obj->appearance->isVisitableFrom(src.x - dst.x, src.y - dst.y))
if (!getObject(objID)->appearance->isVisitableFrom(src.x - dst.x, src.y - dst.y))
return false;
}
return true;
@ -320,9 +315,10 @@ int3 CMap::guardingCreaturePosition (int3 pos) const
const TerrainTile &posTile = getTile(pos);
if (posTile.visitable())
{
for (CGObjectInstance* obj : posTile.visitableObjects)
for (const auto & objID : posTile.visitableObjects)
{
if (obj->ID == Obj::MONSTER)
const auto * object = getObject(objID);
if (object->ID == Obj::MONSTER)
return pos;
}
}
@ -340,12 +336,11 @@ int3 CMap::guardingCreaturePosition (int3 pos) const
const auto & tile = getTile(pos);
if (tile.visitable() && (tile.isWater() == water))
{
for (CGObjectInstance* obj : tile.visitableObjects)
for (const auto & objID : tile.visitableObjects)
{
if (obj->ID == Obj::MONSTER && checkForVisitableDir(pos, &posTile, originalPos)) // Monster being able to attack investigated tile
{
const auto * object = getObject(objID);
if (object->ID == Obj::MONSTER && checkForVisitableDir(pos, &posTile, originalPos)) // Monster being able to attack investigated tile
return pos;
}
}
}
}
@ -361,8 +356,9 @@ int3 CMap::guardingCreaturePosition (int3 pos) const
const CGObjectInstance * CMap::getObjectiveObjectFrom(const int3 & pos, Obj type)
{
for (CGObjectInstance * object : getTile(pos).visitableObjects)
for(const auto & objID : getTile(pos).visitableObjects)
{
const auto * object = getObject(objID);
if (object->ID == type)
return object;
}