1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-27 21:49:10 +02:00

Check coastal tile OTF

This commit is contained in:
AlexVinS 2015-08-15 21:46:28 +03:00 committed by AlexVinS
parent a3c3f935b9
commit 6552acdff6
6 changed files with 35 additions and 11 deletions

View File

@ -736,7 +736,7 @@ BattleInfo * CGameState::setupBattle(int3 tile, const CArmedInstance *armies[2],
{
const TerrainTile &t = map->getTile(tile);
ETerrainType terrain = t.terType;
if(t.isCoastal() && !t.isWater())
if(map->isCoastalTile(tile)) //coastal tile is always ground
terrain = ETerrainType::SAND;
BFieldType terType = battleGetBattlefieldType(tile);
@ -1955,7 +1955,7 @@ BFieldType CGameState::battleGetBattlefieldType(int3 tile)
}
}
if(!t.isWater() && t.isCoastal())
if(map->isCoastalTile(tile)) //coastal tile is always ground
return BFieldType::SAND_SHORE;
switch(t.terType)

View File

@ -275,7 +275,7 @@ bool CPathfinder::isLayerTransitionPossible(const ELayer destLayer) const
break;
case ELayer::SAIL:
if(destLayer == ELayer::LAND && dt->isCoastal())
if(destLayer == ELayer::LAND && gs->map->isCoastalTile(dp->coord))
return true;
break;

View File

@ -141,11 +141,6 @@ CGObjectInstance * TerrainTile::topVisitableObj(bool excludeTop) const
return visitableObjects.back();
}
bool TerrainTile::isCoastal() const
{
return extTileFlags & 64;
}
EDiggingStatus TerrainTile::getDiggingStatus(const bool excludeTop) const
{
if(terType == ETerrainType::WATER || terType == ETerrainType::ROCK)
@ -322,6 +317,35 @@ CGHeroInstance * CMap::getHero(int heroID)
return nullptr;
}
bool CMap::isCoastalTile(const int3 & pos) const
{
//todo: refactoring: extract neighbor tile iterator and use it in GameState
static const int3 dirs[] = { int3(0,1,0),int3(0,-1,0),int3(-1,0,0),int3(+1,0,0),
int3(1,1,0),int3(-1,1,0),int3(1,-1,0),int3(-1,-1,0) };
if(!isInTheMap(pos))
{
logGlobal->errorStream() << "Coastal check outside of map :"<<pos;
return false;
}
if(isWaterTile(pos))
return false;
for (auto & dir : dirs)
{
const int3 hlp = pos + dir;
if(!isInTheMap(hlp))
continue;
const TerrainTile &hlpt = getTile(hlp);
if(hlpt.isWater())
return true;
}
return false;
}
bool CMap::isInTheMap(const int3 & pos) const
{
if(pos.x < 0 || pos.y < 0 || pos.z < 0 || pos.x >= width || pos.y >= height
@ -349,7 +373,7 @@ const TerrainTile & CMap::getTile(const int3 & tile) const
bool CMap::isWaterTile(const int3 &pos) const
{
return isInTheMap(pos) && getTile(pos).terType == ETerrainType::WATER;
return isInTheMap(pos) && getTile(pos).isWater();
}
bool CMap::checkForVisitableDir(const int3 & src, const TerrainTile *pom, const int3 & dst ) const

View File

@ -277,8 +277,10 @@ public:
CMapEditManager * getEditManager();
TerrainTile & getTile(const int3 & tile);
const TerrainTile & getTile(const int3 & tile) const;
bool isCoastalTile(const int3 & pos) const;
bool isInTheMap(const int3 & pos) const;
bool isWaterTile(const int3 & pos) const;
bool checkForVisitableDir( const int3 & src, const TerrainTile *pom, const int3 & dst ) const;
int3 guardingCreaturePosition (int3 pos) const;

View File

@ -70,7 +70,6 @@ struct DLL_LINKAGE TerrainTile
Obj topVisitableId(bool excludeTop = false) const;
CGObjectInstance * topVisitableObj(bool excludeTop = false) const;
bool isWater() const;
bool isCoastal() const;
EDiggingStatus getDiggingStatus(const bool excludeTop = true) const;
bool hasFavourableWinds() const;

View File

@ -478,7 +478,6 @@ void CDrawTerrainOperation::execute()
updateTerrainTypes();
updateTerrainViews();
//TODO add coastal bit to extTileFlags appropriately
}
void CDrawTerrainOperation::undo()