1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-01 00:45:26 +02:00

Fix penalties for FLYING_MOVEMENT and WATER_WALKING

This commit is contained in:
ArseniyShestakov
2015-10-23 20:50:52 +03:00
parent fc6f62e633
commit 6ebe2abc1a
4 changed files with 22 additions and 19 deletions

View File

@ -2112,19 +2112,22 @@ int CGameState::getMovementCost(const CGHeroInstance *h, const int3 &src, const
if(d.blocked && h->canFly())
{
bool freeFlying = h->getBonusesCount(Selector::typeSubtype(Bonus::FLYING_MOVEMENT, 1)) > 0;
if(!freeFlying)
{
if(h->hasBonusOfType(Bonus::FLYING_MOVEMENT, 1)) // base flying
ret *= 1.4; //40% penalty for movement over blocked tile
}
else if(h->hasBonusOfType(Bonus::FLYING_MOVEMENT, 2)) // advanced flying
ret *= 1.2;
}
else if (d.terType == ETerrainType::WATER)
else if(d.terType == ETerrainType::WATER)
{
if(h->boat && s.hasFavourableWinds() && d.hasFavourableWinds()) //Favourable Winds
ret *= 0.666;
else if (!h->boat && h->getBonusesCount(Selector::typeSubtype(Bonus::WATER_WALKING, 1)) > 0)
ret *= 1.4; //40% penalty for water walking
else if(!h->boat && h->canWalkOnSea())
{
if(h->hasBonusOfType(Bonus::WATER_WALKING, 1)) // base
ret *= 1.4; //40% penalty for water walking
else if(h->hasBonusOfType(Bonus::WATER_WALKING, 2)) // advanced
ret *= 1.2;
}
}
if(src.x != dest.x && src.y != dest.y) //it's diagonal move
@ -2144,7 +2147,7 @@ int CGameState::getMovementCost(const CGHeroInstance *h, const int3 &src, const
{
std::vector<int3> vec;
vec.reserve(8); //optimization
getNeighbours(d, dest, vec, s.terType != ETerrainType::WATER, true);
getNeighbours(d, dest, vec, s.terType != ETerrainType::WATER, true);
for(auto & elem : vec)
{
int fcost = getMovementCost(h, dest, elem, left, false);