Skip to content

Commit

Permalink
Better comments, remove dead code
Browse files Browse the repository at this point in the history
  • Loading branch information
IvanSavenko committed May 28, 2024
1 parent f7989f6 commit 3847e3e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 25 deletions.
2 changes: 1 addition & 1 deletion lib/pathfinder/CGPathNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ enum class EPathAccessibility : ui8
NOT_SET,
ACCESSIBLE, //tile can be entered and passed
VISITABLE, //tile can be entered as the last tile in path
GUARDED, //visitable, but in zone of control of nearby monster
GUARDED, //tile can be entered, but is in zone of control of nearby monster (may also contain visitable object, if any)
BLOCKVIS, //visitable from neighboring tile but not passable
FLYABLE, //can only be accessed in air layer
BLOCKED //tile can be neither entered nor visited
Expand Down
38 changes: 14 additions & 24 deletions lib/pathfinder/PathfindingRules.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,10 +267,11 @@ PathfinderBlockingRule::BlockingReason MovementAfterDestinationRule::getBlocking
return BlockingReason::DESTINATION_BLOCKED;

case EPathNodeAction::BATTLE:
// H3 rule: do not allow direct attack on wandering monsters if hero lands on visitable object
if (config->options.originalFlyRules && destination.nodeObject && source.node->layer == EPathfindingLayer::AIR)
return BlockingReason::DESTINATION_BLOCKED;

/// Movement after BATTLE action only possible from guarded tile to guardian tile
// Movement after BATTLE action only possible from guarded tile to guardian tile
if(destination.guarded)
{
if (pathfinderHelper->options.ignoreGuards)
Expand Down Expand Up @@ -303,7 +304,7 @@ PathfinderBlockingRule::BlockingReason MovementToDestinationRule::getBlockingRea

if(source.guarded)
{
if(source.node->layer != EPathfindingLayer::AIR
if(source.node->layer != EPathfindingLayer::AIR // zone of control is ignored when flying
&& !pathfinderConfig->options.ignoreGuards
&& (!destination.isGuardianTile || pathfinderHelper->getGuardiansCount(source.coord) > 1)) // Can step into tile of guard
{
Expand Down Expand Up @@ -378,44 +379,33 @@ void LayerTransitionRule::process(
break;

case EPathfindingLayer::SAIL:
//tile must be accessible -> exception: unblocked blockvis tiles -> clear but guarded by nearby monster coast
if((destination.node->accessible != EPathAccessibility::ACCESSIBLE && destination.node->accessible != EPathAccessibility::GUARDED)
|| destination.tile->visitable) //TODO: passableness problem -> town says it's passable (thus accessible) but we obviously can't disembark onto town gate
{
// have to disembark first before visiting objects on land
if (destination.tile->visitable)
destination.blocked = true;

//can disembark only on accessible tiles or tiles guarded by nearby monster
if((destination.node->accessible != EPathAccessibility::ACCESSIBLE && destination.node->accessible != EPathAccessibility::GUARDED))
destination.blocked = true;
}

break;

case EPathfindingLayer::AIR:
if(pathfinderConfig->options.originalFlyRules)
{
if(source.node->accessible != EPathAccessibility::ACCESSIBLE &&
source.node->accessible != EPathAccessibility::VISITABLE &&
destination.node->accessible != EPathAccessibility::VISITABLE &&
destination.node->accessible != EPathAccessibility::ACCESSIBLE)
if(source.node->accessible != EPathAccessibility::ACCESSIBLE && source.node->accessible != EPathAccessibility::VISITABLE)
{

if (destination.node->accessible == EPathAccessibility::BLOCKVIS)
{
// Can't visit 'blockvisit' objects on coast if hero will end up on water terrain
if (source.tile->blocked || !destination.tile->entrableTerrain(source.tile))
destination.blocked = true;
}

if (destination.node->accessible == EPathAccessibility::FLYABLE)
destination.blocked = true;
}

if(destination.node->accessible == EPathAccessibility::VISITABLE)
{
if (destination.node->accessible != EPathAccessibility::VISITABLE)
destination.blocked = true;
}
}
else if(destination.node->accessible != EPathAccessibility::ACCESSIBLE)
else
{
/// Hero that fly can only land on accessible tiles
if(destination.nodeObject)
// Hero that fly can only land on accessible tiles
if(destination.node->accessible != EPathAccessibility::ACCESSIBLE && destination.nodeObject)
destination.blocked = true;
}

Expand Down

0 comments on commit 3847e3e

Please sign in to comment.