Files
gamedev-the-steward/simulation/SimulationManager.gd
T
2026-06-20 20:43:21 +02:00

121 lines
2.3 KiB
GDScript

extends Node
signal npc_task_changed(npc: SimNPC, old_task: String, new_task: String)
signal village_changed(village: SimVillage)
var village := SimVillage.new()
const DEBUG_LOGS := true
var npcs: Array[SimNPC] = []
var tick_interval := 1.2
var tick_timer := 0.0
var tick_count := 0
var names := [
"Amina", "Tarik", "Jasmin"
]
var professions := [
"farmer",
"woodcutter",
"guard",
"scholar",
"wanderer"
]
func _ready() -> void:
randomize()
generate_npcs()
print("--- Simulation started ---")
func _process(delta: float) -> void:
tick_timer += delta
if tick_timer >= tick_interval:
tick_timer -= tick_interval
simulate_tick()
func generate_npcs() -> void:
for i in range(names.size()):
var npc := SimNPC.new(
i,
names[i],
professions.pick_random(),
randf_range(1.0, 10.0),
randf_range(1.0, 10.0)
)
npcs.append(npc)
func simulate_tick() -> void:
tick_count += 1
print("--- Tick ", tick_count, " ---")
var village_was_changed := false
for npc in npcs:
var old_task := npc.current_task
var was_complete := npc.task_complete
npc.simulate_tick(village)
if old_task != npc.current_task:
npc_task_changed.emit(npc, old_task, npc.current_task)
if not was_complete and npc.task_complete:
village.apply_npc_task(npc)
village_was_changed = true
if DEBUG_LOGS:
print(
npc.npc_name,
" | ",
npc.profession,
" | task: ",
npc.current_task,
" | progress: ",
npc.task_progress,
"/",
npc.task_duration,
" | complete: ",
npc.task_complete,
" | hunger: ",
round(npc.hunger),
" | energy: ",
round(npc.energy)
)
if village_was_changed:
village_changed.emit(village)
if DEBUG_LOGS:
print(village.get_summary())
func eat_food(amount: float) -> void:
village.food -= amount
village_changed.emit(village)
func add_food(amount: float) -> void:
village.food += amount
village_changed.emit(village)
func add_wood(amount: float) -> void:
village.wood += amount
village_changed.emit(village)
func add_safety(amount: float) -> void:
village.safety = clamp(village.safety + amount, 0.0, 100.0)
village_changed.emit(village)
func add_knowledge(amount: float) -> void:
village.knowledge += amount
village_changed.emit(village)
func get_starving_count() -> int:
var count := 0
for npc in npcs:
if npc.is_starving:
count += 1
return count