mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-06 09:09:40 +02:00
TurnInfo: first step towards better abstraction
This commit is contained in:
@@ -109,7 +109,7 @@ void CPathfinder::calculatePaths()
|
|||||||
if(!movement)
|
if(!movement)
|
||||||
{
|
{
|
||||||
hlp->updateTurnInfo(++turn);
|
hlp->updateTurnInfo(++turn);
|
||||||
movement = hlp->getMaxMovePoints(cp->layer);
|
movement = hlp->getMaxMovePoints(cp->layer, turn);
|
||||||
}
|
}
|
||||||
|
|
||||||
//add accessible neighbouring nodes to the queue
|
//add accessible neighbouring nodes to the queue
|
||||||
@@ -140,7 +140,7 @@ void CPathfinder::calculatePaths()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
destAction = getDestAction();
|
destAction = getDestAction();
|
||||||
int cost = CPathfinderHelper::getMovementCost(hero, cp->coord, dp->coord, movement, hlp->ti);
|
int cost = CPathfinderHelper::getMovementCost(hero, cp->coord, dp->coord, movement, hlp->getTurnInfo(turn));
|
||||||
int remains = movement - cost;
|
int remains = movement - cost;
|
||||||
if(destAction == CGPathNode::EMBARK || destAction == CGPathNode::DISEMBARK)
|
if(destAction == CGPathNode::EMBARK || destAction == CGPathNode::DISEMBARK)
|
||||||
{
|
{
|
||||||
@@ -152,8 +152,8 @@ void CPathfinder::calculatePaths()
|
|||||||
{
|
{
|
||||||
//occurs rarely, when hero with low movepoints tries to leave the road
|
//occurs rarely, when hero with low movepoints tries to leave the road
|
||||||
hlp->updateTurnInfo(++turnAtNextTile);
|
hlp->updateTurnInfo(++turnAtNextTile);
|
||||||
int moveAtNextTile = hlp->getMaxMovePoints(i);
|
int moveAtNextTile = hlp->getMaxMovePoints(i, turnAtNextTile);
|
||||||
cost = CPathfinderHelper::getMovementCost(hero, cp->coord, dp->coord, moveAtNextTile, hlp->ti); //cost must be updated, movement points changed :(
|
cost = CPathfinderHelper::getMovementCost(hero, cp->coord, dp->coord, moveAtNextTile, hlp->getTurnInfo(turnAtNextTile)); //cost must be updated, movement points changed :(
|
||||||
remains = moveAtNextTile - cost;
|
remains = moveAtNextTile - cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,6 +701,20 @@ bool CPathfinder::canVisitObject() const
|
|||||||
return cp->layer == ELayer::LAND || cp->layer == ELayer::SAIL;
|
return cp->layer == ELayer::LAND || cp->layer == ELayer::SAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TurnInfo::TurnInfo(const CGHeroInstance * h, const int Turn)
|
||||||
|
: turn(Turn)
|
||||||
|
{
|
||||||
|
maxMovePointsLand = h->maxMovePoints(true);
|
||||||
|
maxMovePointsWater = h->maxMovePoints(false);
|
||||||
|
bonusFlying = h->getBonusAtTurn(Bonus::FLYING_MOVEMENT, turn);
|
||||||
|
bonusWaterWalking = h->getBonusAtTurn(Bonus::WATER_WALKING, turn);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TurnInfo::getMaxMovePoints(const EPathfindingLayer layer) const
|
||||||
|
{
|
||||||
|
return layer == EPathfindingLayer::SAIL ? maxMovePointsWater : maxMovePointsLand;
|
||||||
|
}
|
||||||
|
|
||||||
CPathfinderHelper::CPathfinderHelper(const CGHeroInstance * Hero)
|
CPathfinderHelper::CPathfinderHelper(const CGHeroInstance * Hero)
|
||||||
: ti(nullptr), hero(Hero)
|
: ti(nullptr), hero(Hero)
|
||||||
{
|
{
|
||||||
@@ -716,26 +730,20 @@ void CPathfinderHelper::updateTurnInfo(const int turn)
|
|||||||
ti = turnsInfo[turn];
|
ti = turnsInfo[turn];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ti = getTurnInfo(hero, turn);
|
ti = new TurnInfo(hero, turn);
|
||||||
turnsInfo.push_back(ti);
|
turnsInfo.push_back(ti);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CPathfinderHelper::getMaxMovePoints(const EPathfindingLayer layer) const
|
const TurnInfo * CPathfinderHelper::getTurnInfo(const int turn) const
|
||||||
{
|
{
|
||||||
return layer == EPathfindingLayer::SAIL ? ti->maxMovePointsWater : ti->maxMovePointsLand;
|
return turnsInfo[turn];
|
||||||
}
|
}
|
||||||
|
|
||||||
TurnInfo * CPathfinderHelper::getTurnInfo(const CGHeroInstance * h, const int turn)
|
int CPathfinderHelper::getMaxMovePoints(const EPathfindingLayer layer, const int turn) const
|
||||||
{
|
{
|
||||||
auto turnInfo = new TurnInfo;
|
return turnsInfo[turn]->getMaxMovePoints(layer);
|
||||||
turnInfo->turn = turn;
|
|
||||||
turnInfo->maxMovePointsLand = h->maxMovePoints(true);
|
|
||||||
turnInfo->maxMovePointsWater = h->maxMovePoints(false);
|
|
||||||
turnInfo->bonusFlying = h->getBonusAtTurn(Bonus::FLYING_MOVEMENT, turn);
|
|
||||||
turnInfo->bonusWaterWalking = h->getBonusAtTurn(Bonus::WATER_WALKING, turn);
|
|
||||||
return turnInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPathfinderHelper::getNeighbours(CGameState * gs, const TerrainTile & srct, const int3 & tile, std::vector<int3> & vec, const boost::logic::tribool & onLand, const bool limitCoastSailing)
|
void CPathfinderHelper::getNeighbours(CGameState * gs, const TerrainTile & srct, const int3 & tile, std::vector<int3> & vec, const boost::logic::tribool & onLand, const bool limitCoastSailing)
|
||||||
@@ -783,7 +791,7 @@ int CPathfinderHelper::getMovementCost(const CGHeroInstance * h, const int3 & sr
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(!ti)
|
if(!ti)
|
||||||
ti = getTurnInfo(h);
|
ti = new TurnInfo(h);
|
||||||
|
|
||||||
auto s = h->cb->getTile(src), d = h->cb->getTile(dst);
|
auto s = h->cb->getTile(src), d = h->cb->getTile(dst);
|
||||||
int ret = h->getTileCost(*d, *s, ti);
|
int ret = h->getTileCost(*d, *s, ti);
|
||||||
|
|||||||
@@ -199,6 +199,9 @@ struct TurnInfo
|
|||||||
int maxMovePointsWater;
|
int maxMovePointsWater;
|
||||||
const Bonus * bonusFlying;
|
const Bonus * bonusFlying;
|
||||||
const Bonus * bonusWaterWalking;
|
const Bonus * bonusWaterWalking;
|
||||||
|
|
||||||
|
TurnInfo(const CGHeroInstance * h, const int Turn = 0);
|
||||||
|
int getMaxMovePoints(const EPathfindingLayer layer) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DLL_LINKAGE CPathfinderHelper
|
class DLL_LINKAGE CPathfinderHelper
|
||||||
@@ -209,8 +212,8 @@ public:
|
|||||||
|
|
||||||
CPathfinderHelper(const CGHeroInstance * Hero);
|
CPathfinderHelper(const CGHeroInstance * Hero);
|
||||||
void updateTurnInfo(const int turn = 0);
|
void updateTurnInfo(const int turn = 0);
|
||||||
int getMaxMovePoints(const EPathfindingLayer layer) const;
|
const TurnInfo * getTurnInfo(const int turn) const;
|
||||||
static TurnInfo * getTurnInfo(const CGHeroInstance * h, const int turn = 0);
|
int getMaxMovePoints(const EPathfindingLayer layer, const int turn) const;
|
||||||
|
|
||||||
static void getNeighbours(CGameState * gs, const TerrainTile & srct, const int3 & tile, std::vector<int3> & vec, const boost::logic::tribool & onLand, const bool limitCoastSailing);
|
static void getNeighbours(CGameState * gs, const TerrainTile & srct, const int3 & tile, std::vector<int3> & vec, const boost::logic::tribool & onLand, const bool limitCoastSailing);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user