mirror of
https://github.com/vcmi/vcmi.git
synced 2025-09-16 09:26:28 +02:00
Pathfinding: use unique_ptr for hlp and fix few rules
This commit is contained in:
@@ -48,7 +48,7 @@ CPathfinder::CPathfinder(CPathsInfo &_out, CGameState *_gs, const CGHeroInstance
|
|||||||
throw std::runtime_error("Wrong checksum");
|
throw std::runtime_error("Wrong checksum");
|
||||||
}
|
}
|
||||||
|
|
||||||
hlp = new CPathfinderHelper(hero);
|
hlp = make_unique<CPathfinderHelper>(hero);
|
||||||
if(hlp->ti->bonusFlying)
|
if(hlp->ti->bonusFlying)
|
||||||
options.useFlying = true;
|
options.useFlying = true;
|
||||||
if(hlp->ti->bonusWaterWalking)
|
if(hlp->ti->bonusWaterWalking)
|
||||||
@@ -292,11 +292,25 @@ bool CPathfinder::isLayerAvailable(const ELayer &layer, const int &turn) const
|
|||||||
|
|
||||||
bool CPathfinder::isLayerTransitionPossible() const
|
bool CPathfinder::isLayerTransitionPossible() const
|
||||||
{
|
{
|
||||||
|
/// No layer transition allowed when previous node action is BATTLE
|
||||||
|
if(cp->action == CGPathNode::BATTLE)
|
||||||
|
return false;
|
||||||
|
|
||||||
if((cp->layer == ELayer::AIR || cp->layer == ELayer::WATER)
|
if((cp->layer == ELayer::AIR || cp->layer == ELayer::WATER)
|
||||||
&& dp->layer != ELayer::LAND)
|
&& dp->layer != ELayer::LAND)
|
||||||
{
|
{
|
||||||
|
/// Hero that fly or walking on water can only go into ground layer
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if(cp->layer == ELayer::AIR && dp->layer == ELayer::LAND)
|
||||||
|
{
|
||||||
|
/// Hero that fly can only land on accessible tiles
|
||||||
|
if(cp->accessible != CGPathNode::ACCESSIBLE &&
|
||||||
|
dp->accessible != CGPathNode::ACCESSIBLE)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(cp->layer == ELayer::LAND && dp->layer == ELayer::AIR)
|
else if(cp->layer == ELayer::LAND && dp->layer == ELayer::AIR)
|
||||||
{
|
{
|
||||||
if(options.lightweightFlyingMode && !isSourceInitialPosition())
|
if(options.lightweightFlyingMode && !isSourceInitialPosition())
|
||||||
@@ -421,6 +435,8 @@ bool CPathfinder::isMovementAfterDestPossible() const
|
|||||||
/// TODO: Investigate what kind of limitation is possible to apply on movement from visitable tiles
|
/// TODO: Investigate what kind of limitation is possible to apply on movement from visitable tiles
|
||||||
/// Likely in many cases we don't need to add visitable tile to queue when hero don't fly
|
/// Likely in many cases we don't need to add visitable tile to queue when hero don't fly
|
||||||
case CGPathNode::VISIT:
|
case CGPathNode::VISIT:
|
||||||
|
/// For now we only add visitable tile into queue when it's teleporter that allow transit
|
||||||
|
/// Movement from visitable tile when hero is standing on it is possible into any layer
|
||||||
if(CGTeleport::isTeleport(dt->topVisitableObj()))
|
if(CGTeleport::isTeleport(dt->topVisitableObj()))
|
||||||
{
|
{
|
||||||
/// For now we'll always allow transit over teleporters
|
/// For now we'll always allow transit over teleporters
|
||||||
@@ -430,7 +446,7 @@ bool CPathfinder::isMovementAfterDestPossible() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return true;
|
return false;
|
||||||
case CGPathNode::NORMAL:
|
case CGPathNode::NORMAL:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -441,6 +457,11 @@ bool CPathfinder::isMovementAfterDestPossible() const
|
|||||||
case CGPathNode::DISEMBARK:
|
case CGPathNode::DISEMBARK:
|
||||||
if(options.useEmbarkAndDisembark && !isDestinationGuarded())
|
if(options.useEmbarkAndDisembark && !isDestinationGuarded())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case CGPathNode::BATTLE:
|
||||||
|
/// Movement after BATTLE action only possible to guardian tile
|
||||||
|
if(isDestinationGuarded())
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -498,6 +519,7 @@ void CPathfinder::initializeGraph()
|
|||||||
node->reset();
|
node->reset();
|
||||||
|
|
||||||
auto accessibility = evaluateAccessibility(pos, tinfo);
|
auto accessibility = evaluateAccessibility(pos, tinfo);
|
||||||
|
/// TODO: Probably this shouldn't be handled by initializeGraph
|
||||||
if(blockNotAccessible
|
if(blockNotAccessible
|
||||||
&& (accessibility != CGPathNode::ACCESSIBLE || tinfo->terType == ETerrainType::WATER))
|
&& (accessibility != CGPathNode::ACCESSIBLE || tinfo->terType == ETerrainType::WATER))
|
||||||
accessibility = CGPathNode::BLOCKED;
|
accessibility = CGPathNode::BLOCKED;
|
||||||
@@ -521,7 +543,7 @@ void CPathfinder::initializeGraph()
|
|||||||
if(options.useFlying)
|
if(options.useFlying)
|
||||||
updateNode(pos, ELayer::AIR, tinfo, true);
|
updateNode(pos, ELayer::AIR, tinfo, true);
|
||||||
if(options.useWaterWalking)
|
if(options.useWaterWalking)
|
||||||
updateNode(pos, ELayer::WATER, tinfo, true);
|
updateNode(pos, ELayer::WATER, tinfo, false);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
updateNode(pos, ELayer::LAND, tinfo, false);
|
updateNode(pos, ELayer::LAND, tinfo, false);
|
||||||
|
@@ -129,7 +129,7 @@ private:
|
|||||||
|
|
||||||
CPathsInfo &out;
|
CPathsInfo &out;
|
||||||
const CGHeroInstance *hero;
|
const CGHeroInstance *hero;
|
||||||
CPathfinderHelper * hlp;
|
unique_ptr<CPathfinderHelper> hlp;
|
||||||
|
|
||||||
struct NodeComparer
|
struct NodeComparer
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user