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

@ -246,6 +246,7 @@ func _on_priority_pressed(prio_index: int) -> void:
return
current_zone.priority = prio_index as StorageDestination.Priority
_update_priority_row()
EventBus.stockpile_layout_changed.emit()
Audit.log("stockpile_panel", "priority → %d" % prio_index)
@ -256,6 +257,7 @@ func _on_select_all_pressed() -> void:
# while this button's pressed signal is still emitting.
current_zone.accepted_types.clear()
call_deferred("_populate_chips")
EventBus.stockpile_layout_changed.emit()
Audit.log("stockpile_panel", "select_all → wildcard mode")
@ -272,6 +274,7 @@ func _on_clear_all_pressed() -> void:
current_zone.priority = StorageDestination.Priority.OFF
_update_priority_row()
call_deferred("_populate_chips")
EventBus.stockpile_layout_changed.emit()
Audit.log("stockpile_panel", "clear_all → priority OFF")
@ -363,6 +366,7 @@ func _on_chip_pressed(type: StringName) -> void:
# Defer the rebuild — don't free this chip while its pressed signal emits.
call_deferred("_populate_chips")
EventBus.stockpile_layout_changed.emit()
Audit.log("stockpile_panel", "chip toggled: %s → accepted_types size=%d" % [
type, current_zone.accepted_types.size()
])