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

@ -280,6 +280,51 @@ static func cremated_friend() -> Thought:
return t
## ── Phase 17 — Storyteller event thoughts ──────────────────────────────────
## Positive mood boost after surviving a full year. Applied colony-wide by the
## "one_year_survived" milestone event.
## modifier=+6, max_stacks=1, EVENT, ~2 in-game days (9600 ticks at 20 Hz).
static func we_made_it() -> Thought:
var t := Thought.new()
t.id = &"we_made_it"
t.label = "We made it through a year"
t.modifier = 6
t.lifetime = Thought.Lifetime.EVENT
t.ticks_remaining = 9600
t.max_stacks = 1
return t
## Negative mood penalty after the colony turned away refugees.
## Applied colony-wide by the "refugee_family" wanderer event (refuse branch).
## modifier=-4, max_stacks=1, EVENT, ~1 in-game day (4800 ticks at 20 Hz).
static func refused_refugees() -> Thought:
var t := Thought.new()
t.id = &"refused_refugees"
t.label = "We turned away the refugees"
t.modifier = -4
t.lifetime = Thought.Lifetime.EVENT
t.ticks_remaining = 4800
t.max_stacks = 1
return t
## Positive mood boost when a newcomer joins the colony.
## Applied colony-wide (including the new pawn, after they are registered)
## by wanderer-accept events.
## modifier=+3, max_stacks=1, EVENT, ~1 in-game day (4800 ticks at 20 Hz).
static func hopeful_newcomer() -> Thought:
var t := Thought.new()
t.id = &"hopeful_newcomer"
t.label = "A new face among us"
t.modifier = 3
t.lifetime = Thought.Lifetime.EVENT
t.ticks_remaining = 4800
t.max_stacks = 1
return t
## Strong negative mood while a rotting corpse is present in the colony.
## PERSISTENT: synced from World.corpses each tick by Pawn._process_thoughts.
## Stacks up to 3 (severity scales with the number of rotting corpses, capped