From f4c6ad1d352c0aa485efa359b639edd13eb21629 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 24 Oct 2019 13:39:49 -0500 Subject: [PATCH] Added support for diagonal paths --- lib/director.rb | 2 +- lib/pathfinding/base_pathfinder.rb | 40 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/director.rb b/lib/director.rb index f6ed32d..d4d1772 100644 --- a/lib/director.rb +++ b/lib/director.rb @@ -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) diff --git a/lib/pathfinding/base_pathfinder.rb b/lib/pathfinding/base_pathfinder.rb index e93531f..7afe835 100644 --- a/lib/pathfinding/base_pathfinder.rb +++ b/lib/pathfinding/base_pathfinder.rb @@ -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 \ No newline at end of file