37610242bf
Replace implicit randomness with seeded per-NPC RandomNumberGenerator streams so the same seed always produces the same scenario outcome. - Add SimulationClock (RefCounted): explicit fixed-step clock that converts frame delta into simulation ticks while preserving sub-tick remainder; replaces raw _process tick_timer accumulation - Add simulation_seed export (int=1337) to SimulationManager; drive per-NPC RNG streams via seed + npc_id + stream_id derivation (stream 0=init, stream 1=wander) - Add get_wander_offset(npc_id) to SimulationManager so wander targets are deterministic per seed; WorldViewManager calls it instead of local randf_range() - Add get_state_snapshot() and get_state_checksum() to SimulationManager for headless verification and future save/load - Convert SimNPC/SimVillage const DEBUG_LOGS to instance var debug_logs so headless tests can silence output without recompilation - Pass RandomNumberGenerator through SimNPC._init() instead of using global randf_range() for hunger/energy/position/scoring noise - Remove obsolete farm_zone and forest_zone exports from WorldViewManager and their marker/tree scene children from main.tscn; NPC gather tasks use ResourceNode exclusively - Rename TaskZone container to ActivityMarkers in main.tscn and update all scene paths (player, WVM, tests) to match - Add headless deterministic_simulation_test.gd: verifies clock accuracy, same-seed equality, different-seed divergence, and 24-tick scenario checksum without loading main.tscn
23 lines
476 B
GDScript
23 lines
476 B
GDScript
class_name SimulationClock
|
|
extends RefCounted
|
|
|
|
var tick_interval: float
|
|
var accumulator := 0.0
|
|
var elapsed_ticks := 0
|
|
|
|
func _init(interval: float = 1.0) -> void:
|
|
tick_interval = maxf(interval, 0.0001)
|
|
|
|
func advance(delta: float) -> int:
|
|
accumulator += maxf(delta, 0.0)
|
|
var ticks_due := 0
|
|
while accumulator >= tick_interval:
|
|
accumulator -= tick_interval
|
|
elapsed_ticks += 1
|
|
ticks_due += 1
|
|
return ticks_due
|
|
|
|
func reset() -> void:
|
|
accumulator = 0.0
|
|
elapsed_ticks = 0
|