extends Node ## Netzwerktest. Rolle über: -- --host bzw. -- --client var main var role := "" var step := 0 var wait := 0.0 var ok := 0 var fail := 0 var m0 := 0 func _ready() -> void: for a in OS.get_cmdline_user_args(): if a == "--host": role = "host" elif a == "--client": role = "client" func chk(name: String, cond: bool, info := "") -> void: if cond: ok += 1 print("[%s] OK %s %s" % [role, name, info]) else: fail += 1 print("[%s] FAIL %s %s" % [role, name, info]) func _process(d): if main == null: main = get_tree().current_scene return if not main.started: if role == "host": main._start_host(7788) elif role == "client" and step == 0: main.menu._name.text = "Tester" main._start_join("127.0.0.1", 7788) step = 1 return if wait > 0.0: wait -= d return if role == "host": _host_step() else: _client_step() func _key(c: int, d: bool) -> void: var e := InputEventKey.new(); e.physical_keycode = c; e.keycode = c; e.pressed = d Input.parse_input_event(e) func _host_step() -> void: match step: 0: print("[host] Sitzung gestartet") for i in 4: main.spawn_passenger(0, 2) wait = 16.0 1: # Host faehrt los, der Client soll das weich sehen main._srv_toggle_drive(1) _key(KEY_W, true) wait = 20.0 2: _key(KEY_W, false) print("[host] Ende. money=%d driver=%d" % [main.money, main.driver_id]) get_tree().quit() step += 1 func _client_step() -> void: match step: 1: wait = 6.0 2: chk("Welt gebaut", main.stations.size() == 6) chk("Zug übernommen", main.train.cars.size() == 3, "cars=%d" % main.train.cars.size()) chk("Eigene Peer-ID", main.my_id > 1) chk("Fahrgäste sichtbar", main.passengers.size() >= 4, "n=%d" % main.passengers.size()) var seated := 0 for p in main.passengers: if p.state == 2: seated += 1 chk("Gäste sitzen", seated >= 4, "seated=%d" % seated) chk("Geld synchron", main.money == 1500) chk("Eigener Name beim Host angekommen", String(main.players[main.my_id]["name"]) == "Tester", "%s" % main.players[main.my_id]["name"]) var host_av = main.players.get(1, {}).get("avatar") chk("Avatar des Hosts sichtbar", host_av != null) main.request("drive") wait = 1.5 3: chk("Steuerung erhalten", main.driver_id == main.my_id) m0 = main.money var done := false for ci in main.train.cars.size(): for si in main.train.cars[ci].seats.size(): var occ = main.train.cars[ci].seats[si]["occupant"] if occ != null and not occ.ticket_checked: main.request("seat", "", ci, si) done = true break if done: break chk("Ticket-Anfrage gesendet", done) wait = 1.5 4: chk("Geld gestiegen", main.money > m0, "%d -> %d" % [m0, main.money]) main.request("buy_car", "coach") wait = 1.5 5: chk("Kauf synchron", main.train.consist.size() == 3) chk("Zug neu gebaut", main.train.cars.size() == 4) wait = 2.0 6: chk("Kein Selbstlauf ohne Gas", main.train.speed < 0.01) main.request("drive") # Steuerung abgeben, der Host faehrt gleich _measuring = true wait = 12.0 7: _measuring = false chk("Zug beim Client in Fahrt", _top_speed > 3.0, "v=%.1f" % _top_speed) chk("Zug beim Client ruckelfrei", _frames > 100 and _jumps * 20 < _frames, "%d Sprünge in %d Frames, größter %.2f m" % [_jumps, _frames, _worst]) print("[client] == %d ok, %d fail ==" % [ok, fail]) get_tree().quit(1 if fail > 0 else 0) step += 1 var _measuring := false var _last := Vector3.ZERO var _frames := 0 var _jumps := 0 var _worst := 0.0 var _top_speed := 0.0 func _physics_process(d: float) -> void: if not _measuring or main == null or not main.started: return var t = main.train var p: Vector3 = t.cars[0].global_position if _last != Vector3.ZERO and t.speed > 1.0: _frames += 1 var moved := p.distance_to(_last) var expected: float = t.speed * d _worst = maxf(_worst, absf(moved - expected)) if absf(moved - expected) > 0.6: _jumps += 1 _top_speed = maxf(_top_speed, t.speed) _last = p