Files

121 lines
4.4 KiB
GDScript

extends SceneTree
const WorldSimulation = preload("res://src/simulation/world_simulation.gd")
func _initialize() -> void:
var packed := load("res://scenes/main.tscn") as PackedScene
var demo := packed.instantiate()
root.add_child.call_deferred(demo)
await process_frame
await process_frame
demo.call("_start_game")
_build_cells(demo, WorldSimulation.KIND_BELT, [
Vector2i(-5, 0),
Vector2i(-4, 0),
Vector2i(-3, 0),
Vector2i(-2, 0),
Vector2i(0, 0),
Vector2i(2, 0),
Vector2i(3, 0),
Vector2i(4, 0),
Vector2i(5, 0),
])
_build_cells(demo, WorldSimulation.KIND_MANA_PIPE, [
Vector2i(0, 4),
Vector2i(0, 3),
Vector2i(0, 2),
Vector2i(0, 1),
])
var simulation: WorldSimulation = demo.get("simulation")
var building_count_before_overlap := simulation.buildings.size()
demo.set("hovered_cell", Vector2i(-5, 0))
demo.set("hover_is_valid", true)
demo.call("_try_place_selected")
var overlap_was_rejected := simulation.buildings.size() == building_count_before_overlap
demo.call("_try_remove_hovered")
var removal_succeeded := simulation.get_building_at(Vector2i(-5, 0)).is_empty()
_build_cells(demo, WorldSimulation.KIND_BELT, [Vector2i(-5, 0)])
demo.call("_begin_bridge_config")
_click_bridge_cell(demo, Vector2i(-1, 1))
_click_bridge_cell(demo, Vector2i(-2, 0))
_click_bridge_cell(demo, Vector2i(0, 0))
demo.call("_begin_bridge_config")
_click_bridge_cell(demo, Vector2i(1, 1))
_click_bridge_cell(demo, Vector2i(0, 0))
_click_bridge_cell(demo, Vector2i(2, 0))
# Selecting a locked processor must expose inspection fields without
# mutating the running factory.
demo.set("hovered_cell", Vector2i(-1, 1))
demo.set("hover_is_valid", true)
demo.call("_try_place_selected")
var selected_id := int(demo.get("selected_building_id"))
var inspect_before := simulation.state_fingerprint()
var inspect_report: Dictionary = simulation.inspect_building(selected_id)
var inspect_mutated := inspect_before != simulation.state_fingerprint()
for _tick in range(1800):
simulation.step()
var anchor_machine_id := int(demo.get("anchor_machine_id"))
var charger_machine_id := int(demo.get("charger_machine_id"))
var machine: Dictionary = simulation.buildings[anchor_machine_id]
var charger: Dictionary = simulation.buildings[charger_machine_id]
var failures: Array[String] = []
if bool(demo.get("bridge_mode")):
failures.append("Bridge setup did not leave configuration mode.")
if not overlap_was_rejected:
failures.append("Grid placement allowed an overlapping building.")
if not removal_succeeded:
failures.append("Player removal did not clear grid occupancy.")
if not bool(machine["bridge_configured"]):
failures.append("Anchor machine did not retain bridge endpoints.")
if not bool(charger["bridge_configured"]):
failures.append("Charger did not retain bridge endpoints.")
if not bool(machine["mana_powered"]):
failures.append("Player-built mana pipe route did not power the refinery.")
if not bool(charger["mana_powered"]):
failures.append("Player-built mana pipe route did not power the charger.")
if selected_id != anchor_machine_id:
failures.append("Clicking the refinery did not select it for inspection.")
if inspect_report.is_empty() or inspect_report.get("recipe", {}).is_empty():
failures.append("Selection inspection did not return a recipe payload.")
if inspect_mutated:
failures.append("Inspection mutated simulation state.")
if simulation.get_charged_count() < 15:
failures.append("Completed player flow did not sustain charged-crystal output.")
if not simulation.is_demo_complete():
failures.append("Sustained charged-crystal intake did not mark the demo complete.")
if failures.is_empty():
print("DEMO_FLOW_OK charged=%d refine_bridge=%s->%s charger_bridge=%s->%s mana_network=%d" % [
simulation.get_charged_count(),
str(machine["input_cell"]),
str(machine["output_cell"]),
str(charger["input_cell"]),
str(charger["output_cell"]),
int(machine["mana_network"]),
])
quit(0)
else:
for failure in failures:
push_error(failure)
quit(1)
func _build_cells(demo: Node, kind: StringName, cells: Array[Vector2i]) -> void:
demo.call("_select_tool", kind)
for cell in cells:
demo.set("hovered_cell", cell)
demo.set("hover_is_valid", true)
demo.call("_try_place_selected")
func _click_bridge_cell(demo: Node, cell: Vector2i) -> void:
demo.set("hovered_cell", cell)
demo.set("hover_is_valid", true)
demo.call("_handle_bridge_click")