Added support for diagonal paths

This commit is contained in:
2019-10-24 13:39:49 -05:00
parent 75a03a7155
commit f4c6ad1d35
2 changed files with 41 additions and 1 deletions

View File

@@ -57,7 +57,7 @@ class IMICRTS
@players.find { |player| player.id == id }
end
def find_path(player:, entity:, goal:, travels_along: :ground, allow_diagonal: false, klass: IMICRTS::Pathfinder::BasePathfinder)
def find_path(player:, entity:, goal:, travels_along: :ground, allow_diagonal: true, klass: IMICRTS::Pathfinder::BasePathfinder)
if klass.cached_path(entity, goal, travels_along)
puts "using a cached path!" if true#Setting.enabled?(:debug_mode)
return klass.cached_path(entity, goal, travels_along)

View File

@@ -127,6 +127,22 @@ class IMICRTS
# TODO: Add diagonal nodes, if requested
if @allow_diagonal
# LEFT-UP
if node_above? && node_above_left?
add_node create_node(@current_node.tile.grid_position.x - 1, @current_node.tile.grid_position.y - 1, @current_node)
end
# LEFT-DOWN
if node_below? && node_below_left?
add_node create_node(@current_node.tile.grid_position.x - 1, @current_node.tile.grid_position.y + 1, @current_node)
end
# RIGHT-UP
if node_above? && node_above_right?
add_node create_node(@current_node.tile.grid_position.x + 1, @current_node.tile.grid_position.y - 1, @current_node)
end
# RIGHT-DOWN
if node_below? && node_below_right?
add_node create_node(@current_node.tile.grid_position.x + 1, @current_node.tile.grid_position.y + 1, @current_node)
end
end
@current_node = next_node
@@ -184,6 +200,30 @@ class IMICRTS
return fittest
end
def node_above?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y - 1)
end
def node_below?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x, node.tile.grid_position.y + 1)
end
def node_above_left?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y - 1)
end
def node_above_right?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y - 1)
end
def node_below_left?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x - 1, node.tile.grid_position.y + 1)
end
def node_below_right?(node = @current_node)
node && @map.tiles.dig(node.tile.grid_position.x + 1, node.tile.grid_position.y + 1)
end
end
end
end