Files

126 lines
5.1 KiB
GDScript

extends SceneTree
const WorldSimulation = preload("res://src/simulation/world_simulation.gd")
func _initialize() -> void:
var first := _run_factory()
var second := _run_factory()
var mana_pause := _run_mana_pause_resume()
var bridge_result := _run_bridge_factory()
var failures: Array[String] = []
if int(first["refined"]) < 20:
failures.append("Expected at least 20 refined crystals, got %d." % int(first["refined"]))
if first["fingerprint"] != second["fingerprint"]:
failures.append("Identical fixed-tick runs produced different fingerprints.")
if int(first["items"]) != int(second["items"]):
failures.append("Identical runs produced different in-flight item counts.")
if not bool(mana_pause["stopped_without_mana"]):
failures.append("Machine produced output without a connected mana network.")
if not bool(mana_pause["paused_exactly"]):
failures.append("Disconnecting mana did not preserve the unfinished recipe.")
if not bool(mana_pause["resumed"]):
failures.append("Machine did not resume its unfinished recipe after mana reconnection.")
if int(bridge_result["refined"]) < 20:
failures.append("Bridge-bound machine did not sustain production.")
if failures.is_empty():
print("SIMULATION_SMOKE_OK refined=%d fingerprint=%s items=%d" % [
int(first["refined"]),
String(first["fingerprint"]),
int(first["items"]),
])
quit(0)
else:
for failure in failures:
push_error(failure)
quit(1)
func _run_factory() -> Dictionary:
var simulation := WorldSimulation.new()
simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0)
simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0)
simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 2), 0)
simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0)
simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0)
for _tick in range(1800):
simulation.step()
return {
"refined": simulation.get_refined_count(),
"fingerprint": simulation.state_fingerprint(),
"items": simulation.items.size(),
}
func _run_mana_pause_resume() -> Dictionary:
var simulation := WorldSimulation.new()
simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0)
var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0)
simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0)
for _tick in range(200):
simulation.step()
var stopped_without_mana: bool = (
simulation.get_refined_count() == 0
and simulation.buildings[machine_id]["status"] == &"no_mana"
)
simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 2), 0)
simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0)
for _tick in range(10):
simulation.step()
var remaining_before_disconnect: int = int(simulation.buildings[machine_id]["completion_tick"]) - simulation.tick_index
simulation.remove_building(Vector2i(0, 1))
var paused_remaining: int = int(simulation.buildings[machine_id]["remaining_ticks"])
for _tick in range(100):
simulation.step()
var paused_exactly: bool = (
simulation.get_refined_count() == 0
and paused_remaining == remaining_before_disconnect
and int(simulation.buildings[machine_id]["completion_tick"]) == -1
)
simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 1), 0)
for _tick in range(120):
simulation.step()
return {
"stopped_without_mana": stopped_without_mana,
"paused_exactly": paused_exactly,
"resumed": simulation.get_refined_count() > 0,
}
func _run_bridge_factory() -> Dictionary:
var simulation := WorldSimulation.new()
simulation.place_building(WorldSimulation.KIND_SOURCE, Vector2i(-3, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-2, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(-1, 0), 0)
var machine_id := simulation.place_building(WorldSimulation.KIND_MACHINE, Vector2i(0, 1), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(1, 0), 0)
simulation.place_building(WorldSimulation.KIND_BELT, Vector2i(2, 0), 0)
simulation.place_building(WorldSimulation.KIND_SINK, Vector2i(3, 0), 0)
simulation.place_building(WorldSimulation.KIND_MANA_SOURCE, Vector2i(0, 3), 0)
simulation.place_building(WorldSimulation.KIND_MANA_PIPE, Vector2i(0, 2), 0)
var configured := simulation.configure_machine_bridge(
machine_id,
Vector2i(-1, 0),
Vector2i(1, 0)
)
if not configured:
return {"refined": 0}
for _tick in range(1800):
simulation.step()
return {"refined": simulation.get_refined_count()}