fix six critical bugs from audit sprint

save/load round-trip: workbench bills, crop static-method, bed owner,
wolf target now all survive reload via Bill.from_dict reconstruction,
_spawn_crop using setup(), and a new _post_load_resolve_references pass.

PlantProvider: sow path added; consumes 1 grain on a TILLED crop tile.

CraftingProvider: ingredient2 supported via new KIND_DEPOSIT_AT_WB toil
and Workbench.deposited_inputs buffer. Cremation pyre now actually
consumes wood.

HaulingProvider: per-item haul_retry_count + haul_rejected after 3
orphan passes; new EventBus.stockpile_layout_changed resets rejects on
any player stockpile edit.

Storyteller: 14 stubbed event effects implemented. New buff registry
(add_buff/get_buff_multiplier/has_buff, day-prune, save/load) drives
seasonal/resource events. New request_pawn_spawn signal + WANDERER
table for arrivals. New SICK status + 3 mood thoughts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
megaproxy 2026-05-16 18:06:55 +01:00
parent 00cf8f445d
commit d9638a4ea4
19 changed files with 711 additions and 101 deletions

View file

@ -7,7 +7,7 @@ class_name StatusCatalog
##
## Phase 9 ships: bleeding(), downed().
## Phase 12 ships: wet(), cold().
## Phase 17 will add: sick(), infected().
## Phase 17 ships: sick(). infected() is post-MVP.
##
## Usage pattern:
## pawn.add_status(StatusCatalog.bleeding(2))
@ -109,3 +109,21 @@ static func cold(severity: int = 1) -> Status:
s.max_severity = 3
s.lifetime = Status.Lifetime.PERSISTENT
return s
## Returns a Sick status at the given severity (1 = Mild, 2 = Moderate, 3 = Severe).
## Severity is clamped to [1, 3]. Lifetime is EVENT — ticks_remaining drives
## self-clear after the illness duration. Doctor treatment clears it early.
## At severity 1: ~1 in-game day (4800 ticks at 20 Hz).
## At severity 2: ~2 in-game days. At severity 3: ~3 in-game days.
## Pawn._process_statuses() should apply a work-speed penalty while SICK is active.
static func sick(severity: int = 1) -> Status:
var s := Status.new()
s.id = &"sick"
s.kind = Status.Kind.SICK
s.label = "Sick"
s.severity = clampi(severity, 1, 3)
s.max_severity = 3
s.lifetime = Status.Lifetime.EVENT
s.ticks_remaining = 4800 * s.severity # scales with severity
return s