Bug-triage patch — fix torch builds, idle-pawn traps, floor render order
Three playtest-reported bugs fixed out-of-phase before Phase 18: * Furniture build-queue gap: Torch / Bed / Crate / Workbench / CremationPyre were missing World.register_build_site(self) in _ready, so newly-painted designations never entered ConstructionProvider's iteration. The seeded cabin pre-built everything via _spawn_complete_* helpers, masking the gap until a player painted a fresh furniture designation. * Wall-trap regression for bystanders + walk-through pawns: Wall._complete now dislodges any pawn on the tile via new Pathfinder.find_nearest_walkable BFS helper; Pawn._advance_walk re-checks next tile walkability before stepping, aborts walk + cancels job + lets Decision reroute. Phase 6's adjacent-stand fix only protected the BUILDING pawn. * Floor / Pawn Y-sort ambiguity: Floor was anchored at tile-center (same Y as Pawn), so Y-sort tiebreak fell to scene-tree order and Floor (spawned later) drew over Pawn. Moved Floor origin to top-of-tile so Floor.y < Pawn.y under Y-sort; _draw rect offsets compensate. All three verified via MCP runtime: torch built end-to-end, all 3 pawns working on different jobs with no idle traps, pawn renders over floor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d41778a483
commit
922f269a6c
9 changed files with 97 additions and 14 deletions
|
|
@ -217,6 +217,19 @@ func _complete() -> void:
|
|||
# Block pathfinding — wall is now impassable.
|
||||
if World.pathfinder != null:
|
||||
World.pathfinder.set_cell_walkable(tile, false)
|
||||
# Dislodge any pawn standing on this tile (Phase 6 wall-trap fix only
|
||||
# protected the BUILDING pawn via adjacent-stand; bystanders weren't
|
||||
# guarded, so a pawn idling on a queued build site would get stranded).
|
||||
for p in World.pawns:
|
||||
if p.tile == tile:
|
||||
var safe: Vector2i = World.pathfinder.find_nearest_walkable(tile)
|
||||
if safe != tile:
|
||||
p.tile = safe
|
||||
p.position = Vector2(safe.x * 16 + 8, safe.y * 16 + 8)
|
||||
p._path.clear()
|
||||
if p.job_runner != null:
|
||||
p.job_runner.cancel_job()
|
||||
Audit.log("wall", "dislodged %s from %s → %s on wall complete" % [p.pawn_name, tile, safe])
|
||||
|
||||
# Stamp the data-layer TileMap so room / roof / save logic sees the wall.
|
||||
World.mark_wall_tile(tile, wall_material)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue