mirror of
https://github.com/vcmi/vcmi.git
synced 2025-06-15 00:05:02 +02:00
TerrainTile now uses identifiers instead of pointers to VLC
This commit is contained in:
@ -131,32 +131,29 @@ void CCastleEvent::serializeJson(JsonSerializeFormat & handler)
|
||||
}
|
||||
|
||||
TerrainTile::TerrainTile():
|
||||
terType(nullptr),
|
||||
riverType(VLC->riverTypeHandler->getById(River::NO_RIVER)),
|
||||
roadType(VLC->roadTypeHandler->getById(Road::NO_ROAD)),
|
||||
riverType(River::NO_RIVER),
|
||||
roadType(Road::NO_ROAD),
|
||||
terView(0),
|
||||
riverDir(0),
|
||||
roadDir(0),
|
||||
extTileFlags(0),
|
||||
visitable(false),
|
||||
blocked(false)
|
||||
extTileFlags(0)
|
||||
{
|
||||
}
|
||||
|
||||
bool TerrainTile::entrableTerrain(const TerrainTile * from) const
|
||||
{
|
||||
return entrableTerrain(from ? from->terType->isLand() : true, from ? from->terType->isWater() : true);
|
||||
return entrableTerrain(from ? from->isLand() : true, from ? from->isWater() : true);
|
||||
}
|
||||
|
||||
bool TerrainTile::entrableTerrain(bool allowLand, bool allowSea) const
|
||||
{
|
||||
return terType->isPassable()
|
||||
&& ((allowSea && terType->isWater()) || (allowLand && terType->isLand()));
|
||||
return getTerrain()->isPassable()
|
||||
&& ((allowSea && isWater()) || (allowLand && isLand()));
|
||||
}
|
||||
|
||||
bool TerrainTile::isClear(const TerrainTile * from) const
|
||||
{
|
||||
return entrableTerrain(from) && !blocked;
|
||||
return entrableTerrain(from) && !blocked();
|
||||
}
|
||||
|
||||
Obj TerrainTile::topVisitableId(bool excludeTop) const
|
||||
@ -177,7 +174,7 @@ CGObjectInstance * TerrainTile::topVisitableObj(bool excludeTop) const
|
||||
|
||||
EDiggingStatus TerrainTile::getDiggingStatus(const bool excludeTop) const
|
||||
{
|
||||
if(terType->isWater() || !terType->isPassable())
|
||||
if(isWater() || !getTerrain()->isPassable())
|
||||
return EDiggingStatus::WRONG_TERRAIN;
|
||||
|
||||
int allowedBlocked = excludeTop ? 1 : 0;
|
||||
@ -194,9 +191,65 @@ bool TerrainTile::hasFavorableWinds() const
|
||||
|
||||
bool TerrainTile::isWater() const
|
||||
{
|
||||
return terType->isWater();
|
||||
return getTerrain()->isWater();
|
||||
}
|
||||
|
||||
bool TerrainTile::isLand() const
|
||||
{
|
||||
return getTerrain()->isLand();
|
||||
}
|
||||
|
||||
bool TerrainTile::visitable() const
|
||||
{
|
||||
return !visitableObjects.empty();
|
||||
}
|
||||
|
||||
bool TerrainTile::blocked() const
|
||||
{
|
||||
return !blockingObjects.empty();
|
||||
}
|
||||
|
||||
bool TerrainTile::hasRiver() const
|
||||
{
|
||||
return getRiverID() != RiverId::NO_RIVER;
|
||||
}
|
||||
|
||||
bool TerrainTile::hasRoad() const
|
||||
{
|
||||
return getRoadID() != RoadId::NO_ROAD;
|
||||
}
|
||||
|
||||
const TerrainType * TerrainTile::getTerrain() const
|
||||
{
|
||||
return terrainType.toEntity(VLC);
|
||||
}
|
||||
|
||||
const RiverType * TerrainTile::getRiver() const
|
||||
{
|
||||
return riverType.toEntity(VLC);
|
||||
}
|
||||
|
||||
const RoadType * TerrainTile::getRoad() const
|
||||
{
|
||||
return roadType.toEntity(VLC);
|
||||
}
|
||||
|
||||
TerrainId TerrainTile::getTerrainID() const
|
||||
{
|
||||
return terrainType;
|
||||
}
|
||||
|
||||
RiverId TerrainTile::getRiverID() const
|
||||
{
|
||||
return riverType;
|
||||
}
|
||||
|
||||
RoadId TerrainTile::getRoadID() const
|
||||
{
|
||||
return roadType;
|
||||
}
|
||||
|
||||
|
||||
CMap::CMap(IGameCallback * cb)
|
||||
: GameCallbackHolder(cb)
|
||||
, checksum(0)
|
||||
@ -243,15 +296,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.visitable = curt.visitableObjects.size();
|
||||
}
|
||||
|
||||
if(total || obj->blockingAt(int3(xVal, yVal, zVal)))
|
||||
{
|
||||
curt.blockingObjects -= obj;
|
||||
curt.blocked = curt.blockingObjects.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -270,15 +318,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.visitable = true;
|
||||
}
|
||||
|
||||
if(obj->blockingAt(int3(xVal, yVal, zVal)))
|
||||
{
|
||||
curt.blockingObjects.push_back(obj);
|
||||
curt.blocked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -381,7 +424,7 @@ int3 CMap::guardingCreaturePosition (int3 pos) const
|
||||
if (!isInTheMap(pos))
|
||||
return int3(-1, -1, -1);
|
||||
const TerrainTile &posTile = getTile(pos);
|
||||
if (posTile.visitable)
|
||||
if (posTile.visitable())
|
||||
{
|
||||
for (CGObjectInstance* obj : posTile.visitableObjects)
|
||||
{
|
||||
@ -401,7 +444,7 @@ int3 CMap::guardingCreaturePosition (int3 pos) const
|
||||
if (isInTheMap(pos))
|
||||
{
|
||||
const auto & tile = getTile(pos);
|
||||
if (tile.visitable && (tile.isWater() == water))
|
||||
if (tile.visitable() && (tile.isWater() == water))
|
||||
{
|
||||
for (CGObjectInstance* obj : tile.visitableObjects)
|
||||
{
|
||||
|
Reference in New Issue
Block a user