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

148 lines
4.0 KiB
GDScript

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