fix: enforce village resource invariants

This commit is contained in:
Rijad Zuzo
2026-07-09 23:10:18 +02:00
parent d6520c426a
commit 5cbab527bf
9 changed files with 136 additions and 42 deletions
+29 -18
View File
@@ -271,11 +271,11 @@ func simulate_tick() -> void:
):
village.apply_npc_task(npc)
elif completed_task == SimulationIds.ACTION_PATROL:
_consume_wood_for_work(npc, completed_task)
village.apply_npc_task(npc)
if _consume_wood_for_work(npc, completed_task):
village.apply_npc_task(npc)
elif completed_task == SimulationIds.ACTION_STUDY:
_consume_wood_for_work(npc, completed_task)
village.apply_npc_task(npc)
if _consume_wood_for_work(npc, completed_task):
village.apply_npc_task(npc)
elif debug_logs:
print(
"[SimulationManager] ",
@@ -711,23 +711,27 @@ func deposit_npc_wood(npc: SimNPC) -> float:
return deposited
func _consume_wood_for_work(npc: SimNPC, action_id: StringName) -> void:
func _consume_wood_for_work(npc: SimNPC, action_id: StringName) -> bool:
var woodpile := get_woodpile()
if woodpile == null:
return
return false
if woodpile.get_amount(SimulationIds.RESOURCE_WOOD) < 1.0:
return false
var consumed := woodpile.withdraw(SimulationIds.RESOURCE_WOOD, 1.0)
_sync_village_wood()
if consumed >= 1.0:
_record_economic_event(
SimulationIds.EVENT_ITEM_CONSUMED,
npc.id,
SimulationIds.STORAGE_VILLAGE_WOODPILE,
&"consumed",
SimulationIds.RESOURCE_WOOD,
consumed
)
if debug_logs:
print("[SimulationManager] %s consumed wood for %s" % [npc.npc_name, action_id])
if consumed < 1.0:
return false
_record_economic_event(
SimulationIds.EVENT_ITEM_CONSUMED,
npc.id,
SimulationIds.STORAGE_VILLAGE_WOODPILE,
&"consumed",
SimulationIds.RESOURCE_WOOD,
consumed
)
if debug_logs:
print("[SimulationManager] %s consumed wood for %s" % [npc.npc_name, action_id])
return true
func withdraw_to_npc(npc: SimNPC, item_id: StringName, amount: float) -> float:
@@ -898,7 +902,14 @@ func add_food(amount: float) -> void:
func add_wood(amount: float) -> void:
village.apply_resource_delta(&"wood", amount)
var woodpile := get_woodpile()
if woodpile == null:
return
if amount >= 0.0:
woodpile.deposit(SimulationIds.RESOURCE_WOOD, amount)
else:
woodpile.withdraw(SimulationIds.RESOURCE_WOOD, -amount)
_sync_village_wood()
village_changed.emit(village)