sprint cleanup: corpse_cremated signal, recipe_count, save_system

D: Workbench._last_consumed_ingredient transient field captures the
carried item before queue_free so cremation_pyre.on_craft_complete can
emit corpse_cremated with the real ref. Falls back to proximity scan.
Pawn._on_corpse_cremated null-guarded.

E: removed redundant r.ingredient_count = 0 from recipe_catalog. Field
kept on Recipe for save round-trip compat; nothing reads it functionally.

F: save_system._spawn_workbench simplified from 15 lines to 6 — let
from_dict do all field restoration. Fixed workbench.from_dict to call
_complete() instead of bare _completed=true, which was skipping light
enable + beauty register + designation clear.

Stale ingredient1/2 buffering comment in job_runner._tick_craft fixed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
megaproxy 2026-05-16 18:23:22 +01:00
parent 2afca16299
commit cc6d60d044
6 changed files with 29 additions and 18 deletions

View file

@ -64,8 +64,12 @@ func on_craft_complete() -> void:
# Base Workbench cleanup (clears current_bill, resets work progress).
super.on_craft_complete()
# Find and consume the corpse that was hauled as ingredient.
var consumed_corpse = _find_consumed_corpse()
# Find the corpse that was hauled as ingredient. Prefer the transient
# reference set by JobRunner (reliable regardless of corpse tile position);
# fall back to proximity scan only if the field is somehow unset.
var consumed_corpse = _last_consumed_ingredient if _last_consumed_ingredient != null \
and is_instance_valid(_last_consumed_ingredient) \
else _find_consumed_corpse()
# Drop 1 ash item on an adjacent walkable tile (same pattern as
# Tree.fell() / Workbench output drops elsewhere in Phase 6).