From efa4df5aafef66377ae65bf2db07e5f97153b292 Mon Sep 17 00:00:00 2001 From: autocommit Date: Thu, 16 Apr 2026 14:15:02 -0700 Subject: [PATCH] =?UTF-8?q?feat(game-engine):=20=E2=9C=A8=20Add=20determin?= =?UTF-8?q?istic=20tiebreaker=20logic=20to=20A*=20and=20Dijkstra=20algorit?= =?UTF-8?q?hms=20to=20resolve=20pathfinding=20conflicts=20consistently?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- src/game/engine/src/map/pathfinder.gd | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/game/engine/src/map/pathfinder.gd b/src/game/engine/src/map/pathfinder.gd index 68abfd84..ae59f8d5 100644 --- a/src/game/engine/src/map/pathfinder.gd +++ b/src/game/engine/src/map/pathfinder.gd @@ -236,10 +236,20 @@ static func _reconstruct_path( static func _compare_open_entries(a: Array, b: Array) -> bool: - ## Sort comparator for A* open set: lower f_score first. - return a[0] < b[0] + ## Sort comparator for A* open set: lower f_score first, with + ## (g_score, x, y) tiebreakers so ties resolve deterministically + ## across processes (sort_custom is unstable). + if a[0] != b[0]: return a[0] < b[0] + if a[1] != b[1]: return a[1] < b[1] + var pa: Vector2i = a[2] + var pb: Vector2i = b[2] + return pa.x < pb.x if pa.x != pb.x else pa.y < pb.y static func _compare_frontier_entries(a: Array, b: Array) -> bool: - ## Sort comparator for Dijkstra frontier: lower cost first. - return a[0] < b[0] + ## Sort comparator for Dijkstra frontier: lower cost first, with + ## (x, y) tiebreakers for deterministic tie resolution. + if a[0] != b[0]: return a[0] < b[0] + var pa: Vector2i = a[1] + var pb: Vector2i = b[1] + return pa.x < pb.x if pa.x != pb.x else pa.y < pb.y