2026-08-11 16:04:40 +02:00
|
|
|
extends SceneTree
|
|
|
|
|
|
|
|
|
|
# Headless gameplay test: run with
|
|
|
|
|
# godot --headless -s res://tests/test_cargo_readout.gd
|
|
|
|
|
# Forgejo #15 (part 2 of #12): what the fleet is carrying has to be visible
|
|
|
|
|
# separately from what is banked.
|
|
|
|
|
#
|
|
|
|
|
# Since #14, ore is cargo until the fleet delivers it to the mothership. The
|
|
|
|
|
# banked readout does not move on pickup, so without a second readout mining
|
|
|
|
|
# looks broken - you gather ore and no number on screen changes.
|
|
|
|
|
#
|
|
|
|
|
# --headless has no GPU and draws no pixels, so this asserts on the two
|
|
|
|
|
# readouts' state, not on their appearance. tests/screenshot.sh covers
|
|
|
|
|
# whether they are legible.
|
|
|
|
|
#
|
|
|
|
|
# Verifies:
|
|
|
|
|
# 1. the banked readout keeps showing the BANK, not the total
|
|
|
|
|
# 2. the cargo readout shows the hold, and appears only while carrying
|
|
|
|
|
# 3. an empty hold hides it rather than parking a permanent 0 beside the
|
|
|
|
|
# real total
|
|
|
|
|
# 4. delivering moves the number from one readout to the other
|
|
|
|
|
# 5. the two are actually told apart on screen, rather than being the same
|
|
|
|
|
# number twice in the same colour at the same place
|
|
|
|
|
|
|
|
|
|
var game_state: Node
|
|
|
|
|
var scene: Node
|
|
|
|
|
var banked: Control
|
|
|
|
|
var cargo: Control
|
|
|
|
|
var stage: int = 0
|
2026-08-12 13:07:52 +02:00
|
|
|
var mothership_id: int = 0
|
2026-08-11 16:04:40 +02:00
|
|
|
var elapsed: float = 0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _initialize() -> void:
|
|
|
|
|
game_state = root.get_node("GameState")
|
|
|
|
|
game_state.buildings.clear()
|
|
|
|
|
game_state.extractors.clear()
|
|
|
|
|
game_state.rocks = 42
|
|
|
|
|
game_state.fleet_cargo = 0
|
2026-08-12 13:07:52 +02:00
|
|
|
# Banking is a transfer TO the mothership now (#24), and a transfer needs
|
|
|
|
|
# a building to aim at. Only the record is required - the transfer
|
|
|
|
|
# primitives work off GameState, not off the spawned node - so this stays
|
|
|
|
|
# a display test rather than becoming one about the building system.
|
|
|
|
|
mothership_id = game_state.add_building(GameState.BUILDING_MOTHERSHIP, Vector2.ZERO)
|
2026-08-11 16:04:40 +02:00
|
|
|
scene = load("res://Main.tscn").instantiate()
|
|
|
|
|
root.add_child(scene)
|
|
|
|
|
banked = scene.get_node("UI/ResourceCounter")
|
|
|
|
|
cargo = scene.get_node("UI/CargoCounter")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _process(delta: float) -> bool:
|
|
|
|
|
elapsed += delta
|
|
|
|
|
match stage:
|
|
|
|
|
0:
|
|
|
|
|
if elapsed < 0.2:
|
|
|
|
|
return false
|
|
|
|
|
# --- 3. nothing carried -> no cargo readout -----------------
|
|
|
|
|
if cargo.visible:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (cargo readout showing with an empty hold)")
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
if banked.amount != 42:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (banked readout shows %d, bank is 42)" % banked.amount)
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
print("empty hold -> cargo readout hidden, banked shows %d" % banked.amount)
|
|
|
|
|
|
|
|
|
|
game_state.collect_cargo(7)
|
|
|
|
|
elapsed = 0.0
|
|
|
|
|
stage = 1
|
|
|
|
|
return false
|
|
|
|
|
1:
|
|
|
|
|
if elapsed < 0.2:
|
|
|
|
|
return false
|
|
|
|
|
# --- 1 + 2. carried and banked are separate numbers ---------
|
|
|
|
|
if not cargo.visible:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (carrying 7 and the cargo readout is hidden)")
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
if cargo.amount != 7:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (cargo readout shows %d, hold is 7)" % cargo.amount)
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
if banked.amount != 42:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (banked readout moved to %d on a pickup - it is showing the total, not the bank)" % banked.amount)
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
print("carrying 7 -> cargo=%d banked=%d" % [cargo.amount, banked.amount])
|
|
|
|
|
|
|
|
|
|
# --- 5. genuinely distinguishable ---------------------------
|
|
|
|
|
if cargo.glow_color == banked.glow_color:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (both readouts drawn in the same colour)")
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
if cargo.position == banked.position:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (both readouts in the same place)")
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
print("distinct: colours %s vs %s, at %s vs %s" % [
|
|
|
|
|
cargo.glow_color, banked.glow_color, cargo.position, banked.position
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
# --- 4. delivery moves it across ----------------------------
|
2026-08-12 13:07:52 +02:00
|
|
|
game_state.transfer_to_building(mothership_id, game_state.fleet_cargo)
|
2026-08-11 16:04:40 +02:00
|
|
|
elapsed = 0.0
|
|
|
|
|
stage = 2
|
|
|
|
|
return false
|
|
|
|
|
2:
|
|
|
|
|
if elapsed < 0.2:
|
|
|
|
|
return false
|
|
|
|
|
if cargo.visible:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (cargo readout still showing after delivery)")
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
if banked.amount != 49:
|
|
|
|
|
print("TEST_CARGO_READOUT: FAIL (banked shows %d after delivering 7 into 42)" % banked.amount)
|
|
|
|
|
quit(1)
|
|
|
|
|
return true
|
|
|
|
|
print("delivered -> cargo hidden, banked shows %d" % banked.amount)
|
|
|
|
|
print("TEST_CARGO_READOUT: PASS")
|
|
|
|
|
quit(0)
|
|
|
|
|
return true
|
|
|
|
|
return false
|