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