feat: structured narrative event feed with per-NPC inspector timeline
Add narrative event types (task_started, npc_slept, npc_died, resource_depleted) alongside economic transfers. EconomicEventRecord gains create_narrative factory and human-readable description method. SimulationManager records task-start and sleep/death events, exposes get_npc_events() for per-NPC history queries. Inspector now shows a Recent timeline of the last 5 events for the selected NPC, plus displays carried wood count. Relax EconomicEventRecord validation to accept non-economic events. Update roadmap with completed milestones.
This commit is contained in:
@@ -150,17 +150,21 @@ func _check_economic_event_chain(manager: Node) -> void:
|
||||
SimulationIds.EVENT_STORAGE_WITHDRAWN,
|
||||
SimulationIds.EVENT_ITEM_CONSUMED
|
||||
]
|
||||
var transfer_events: Array[EconomicEventRecord] = []
|
||||
for event in manager.economic_events:
|
||||
if float(event.data["amount"]) > 0.0:
|
||||
transfer_events.append(event)
|
||||
_check(
|
||||
manager.economic_events.size() == expected_types.size(),
|
||||
transfer_events.size() == expected_types.size(),
|
||||
"Food transfer loop should emit one structured event per transfer"
|
||||
)
|
||||
if manager.economic_events.size() != expected_types.size():
|
||||
if transfer_events.size() != expected_types.size():
|
||||
return
|
||||
for index in expected_types.size():
|
||||
var event: EconomicEventRecord = manager.economic_events[index]
|
||||
var event: EconomicEventRecord = transfer_events[index]
|
||||
_check(
|
||||
(
|
||||
int(event.data["event_id"]) == index
|
||||
int(event.data["event_id"]) >= 0
|
||||
and StringName(event.data["event_type"]) == expected_types[index]
|
||||
and StringName(event.data["item_id"]) == SimulationIds.RESOURCE_FOOD
|
||||
),
|
||||
@@ -168,10 +172,10 @@ func _check_economic_event_chain(manager: Node) -> void:
|
||||
)
|
||||
_check(
|
||||
(
|
||||
is_equal_approx(float(manager.economic_events[0].data["amount"]), 2.0)
|
||||
and is_equal_approx(float(manager.economic_events[1].data["amount"]), 2.0)
|
||||
and is_equal_approx(float(manager.economic_events[2].data["amount"]), 1.0)
|
||||
and is_equal_approx(float(manager.economic_events[3].data["amount"]), 1.0)
|
||||
is_equal_approx(float(transfer_events[0].data["amount"]), 2.0)
|
||||
and is_equal_approx(float(transfer_events[1].data["amount"]), 2.0)
|
||||
and is_equal_approx(float(transfer_events[2].data["amount"]), 1.0)
|
||||
and is_equal_approx(float(transfer_events[3].data["amount"]), 1.0)
|
||||
),
|
||||
"Economic events should record exact transferred quantities"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user