Files
train-game/tests/solo_test.gd
2026-09-16 17:55:38 +02:00

192 lines
6.4 KiB
GDScript

extends Node
var main
var step := 0
var wait := 0.0
var ok := 0
var fail := 0
var m0 := 0
func chk(name: String, cond: bool, info := "") -> void:
if cond:
ok += 1
print(" OK %s %s" % [name, info])
else:
fail += 1
print(" FAIL %s %s" % [name, info])
func seated() -> int:
var n := 0
for p in main.passengers:
if p.state == 2:
n += 1
return n
func _unchecked() -> int:
var n := 0
for p in main.passengers:
if p.state == 2 and not p.ticket_checked:
n += 1
return n
func _key(code: int, down: bool) -> void:
var e := InputEventKey.new()
e.physical_keycode = code
e.keycode = code
e.pressed = down
Input.parse_input_event(e)
func _process(d):
if main == null:
main = get_tree().current_scene
return
if not main.started:
main._start_solo()
return
if wait > 0.0:
wait -= d
return
match step:
0:
print("== Test start ==")
chk("Zug gebaut", main.train.cars.size() == 3, "cars=%d" % main.train.cars.size())
chk("Sitze", main.train.seat_count() == 8)
chk("Ladekapazität", main.train.cargo_capacity() == 10)
chk("Am Bahnhof", main.train.docked_at == main.stations[0])
var wr = main.train.walk_range()
chk("Begehbarer Bereich", wr.y - wr.x > 25.0, "%.1f m" % (wr.y - wr.x))
chk("Spieler startet im Führerstand", main.train.locate(main.player.s)["index"] == 0)
for i in 6:
main.spawn_passenger(0, 2)
chk("Wartende", main.stations[0].waiting.size() == 6)
wait = 8.0
1:
chk("Eingestiegen", seated() == 6, "seated=%d" % seated())
m0 = main.money
for p in main.passengers:
if p.state == 2:
main._check_ticket(p, 1)
chk("Ticketgeld", main.money > m0, "+%d €" % (main.money - m0))
chk("Alle kontrolliert", _unchecked() == 0)
2:
m0 = main.money
var st = main.stations[0]
st.stock = 12.0
for i in 10:
main._srv_transfer_one(1)
chk("Ladung aufgenommen", main.train.total_cargo() == 10)
chk("Lager geleert", st.stock < 3.0, "stock=%.1f" % st.stock)
3:
main._park_at(main.stations[2])
wait = 0.3
4:
chk("Am Eisenwerk", main.train.docked_at == main.stations[2])
m0 = main.money
for i in 12:
main._srv_transfer_one(1)
chk("Ware verkauft", main.train.total_cargo() == 0)
chk("Erlös", main.money - m0 >= 100, "+%d €" % (main.money - m0))
wait = 8.0
5:
var still := 0
for p in main.passengers:
if p.state == 2 and p.dest_station == 2:
still += 1
chk("Ausgestiegen", still == 0)
chk("Ansehen gestiegen", main.reputation > 0, "rep=%d" % main.reputation)
main.money = 20000
main.reputation = 50
var n0 = main.train.consist.size()
main.buy_car("dining")
chk("Speisewagen gekauft", main.train.consist.size() == n0 + 1)
chk("Speisewagen erkannt", main.train.has_dining())
main.buy_car("saloon")
chk("Salonwagen gekauft", main.train.seat_count() == 22)
wait = 0.2
6:
var v0 = main.train.max_speed()
main.buy_loco("express")
chk("Lok getauscht", main.train.loco_id == "express")
chk("Schneller", main.train.max_speed() > v0)
chk("Ausbau", main.buy_upgrade("scanner"))
chk("Ausbau nicht doppelt", not main.buy_upgrade("scanner"))
var before = main.train.consist.size()
main.sell_car(0)
chk("Wagen verkauft", main.train.consist.size() == before - 1)
# Lok verkaufen: Dampf-Veteran springt ein, Geld kommt zurueck
var m_before = main.money
main.request("sell_loco")
chk("Lok verkauft", main.train.loco_id == "steam", "loco=%s" % main.train.loco_id)
chk("Rücknahme gutgeschrieben", main.money - m_before == 6600, "+%d €" % (main.money - m_before))
main.buy_loco("express")
# Speichern und Laden
main.save_game()
var saved_money = main.money
var saved_consist = main.train.consist.duplicate()
var saved_seg = main.train.seg
var saved_prog = main.train.progress
main.money = 1
main.train.consist = ["coach"] as Array[String]
main.train.loco_id = "steam"
main._rebuild_train()
chk("Spielstand geladen", main.load_game())
chk("Geld wiederhergestellt", main.money == saved_money, "%d vs %d" % [main.money, saved_money])
chk("Zug wiederhergestellt", main.train.consist == saved_consist and main.train.loco_id == "express",
"%s %s" % [main.train.loco_id, main.train.consist])
chk("Position wiederhergestellt", main.train.seg == saved_seg and absf(main.train.progress - saved_prog) < 0.5)
# Ziele
main.tickets_checked = 10
var m_goal = main.money
main._check_goals()
chk("Ziel erreicht", main.goals_done.has("tickets10"))
chk("Belohnung gezahlt", main.money - m_goal == 250, "+%d €" % (main.money - m_goal))
chk("Ziele der Reihe nach", not main.goals_done.has("cargo30") and not main.won)
var g = main.current_goal()
chk("Nächstes Ziel im HUD", String(g.get("text", "")).begins_with("30 Einheiten"), "%s" % g)
wait = 0.3
7:
chk("Spieler im Zug", main.train.locate(main.player.s)["index"] == 0)
main._srv_toggle_drive(1)
chk("Steuerung übernommen", main.driver_id == 1)
_key(KEY_W, true)
wait = 3.0
8:
chk("Zug fährt", main.train.speed > 3.0, "v=%.1f m/s" % main.train.speed)
var e: Vector3 = main.train.cars[0].global_transform.basis.get_euler()
chk("Wagen wackelt bei Fahrt", absf(e.z) > 0.0005 or absf(e.x) > 0.0005,
"roll=%.4f pitch=%.4f" % [e.z, e.x])
_key(KEY_W, false)
_key(KEY_S, true)
wait = 4.0
9:
chk("Zug bremst", main.train.speed < 0.01, "v=%.2f" % main.train.speed)
_key(KEY_S, false)
# Durch den ganzen Zug laufen: hinten anfangen, nach vorn gehen.
main._srv_toggle_drive(1)
chk("Steuerung abgegeben", main.driver_id == 0)
var span = main.train.walk_range()
main.player.s = span.x + 0.2
main.player.x = 0.0
main.player.yaw = 0.0
_key(KEY_W, true)
_key(KEY_SHIFT, true)
wait = 25.0
10:
_key(KEY_W, false)
_key(KEY_SHIFT, false)
var span2 = main.train.walk_range()
chk("Ganzer Zug begehbar", main.player.s > span2.y - 1.0,
"s=%.1f von %.1f" % [main.player.s, span2.y])
chk("Im Führerstand angekommen", main.train.locate(main.player.s)["index"] == 0)
main.player.x = 0.0
_key(KEY_D, true)
wait = 3.0
11:
_key(KEY_D, false)
chk("Wand hält den Spieler", absf(main.player.x) < 1.1, "x=%.2f" % main.player.x)
main.money = 200
chk("Kein Kauf ohne Geld", not main.buy_car("saloon"))
chk("Kein Kauf ohne Ansehen", not main.buy_upgrade("trolley") or main.reputation >= 20)
print("== %d ok, %d fail ==" % [ok, fail])
get_tree().quit(1 if fail > 0 else 0)
step += 1