192 lines
6.4 KiB
GDScript
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
|