diff --git a/scenes/ai/sleep_provider.gd b/scenes/ai/sleep_provider.gd index 4921426..bd25e0e 100644 --- a/scenes/ai/sleep_provider.gd +++ b/scenes/ai/sleep_provider.gd @@ -52,6 +52,12 @@ func find_best_for(pawn) -> Job: for bed in World.beds: if not bed.is_available(): continue + # Skip beds already targeted by another pawn's active job. This is the + # same deconfliction used by ConstructionProvider (Job.is_target_taken_by_other) + # and prevents all simultaneously-tired pawns from converging on the same + # nearest bed and then losing the race at claim time. + if Job.is_target_taken_by_other(bed, pawn): + continue var d: int = abs(bed.tile.x - pawn.tile.x) + abs(bed.tile.y - pawn.tile.y) if d < best_dist: best_dist = d @@ -73,6 +79,9 @@ func find_best_for(pawn) -> Job: var j := Job.new() if best_bed != null: j.label = "Sleep at %s" % target_tile + # Tag the job's target so other pawns see this bed as taken via + # Job.is_target_taken_by_other() before it is physically claimed. + j.target_node = best_bed else: j.label = "Sleep on the floor at %s" % target_tile