bd1bdc417a
checkpoint / checkpoint (push) Successful in 1m33s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015jtxAiu5dAW4WxCNdGkrkJ
84 lines
2.8 KiB
GDScript
84 lines
2.8 KiB
GDScript
extends SceneTree
|
|
## One client process for the full networked game-flow test
|
|
## (scripts/run_game_multiplayer_test.sh): register -> POST /api/worlds/{id}/join
|
|
## -> Session.begin -> load scenes/game.tscn -> run networked.
|
|
##
|
|
## godot --headless --path . --script res://scripts/mp_game_flow_client.gd -- \
|
|
## --role a|b --world 1
|
|
##
|
|
## role b: joins, holds still, prints RESULT b in_world and stays ~40 s.
|
|
## role a: joins, moves forward, prints RESULT a remotes=<n> moved=<bool>;
|
|
## exits 0 iff it saw a remote player node AND moved.
|
|
|
|
var role := "b"
|
|
var world_id := 1
|
|
|
|
|
|
func _initialize() -> void:
|
|
var args := OS.get_cmdline_user_args()
|
|
for i in args.size():
|
|
if args[i] == "--role" and i + 1 < args.size():
|
|
role = args[i + 1]
|
|
elif args[i] == "--world" and i + 1 < args.size():
|
|
world_id = int(args[i + 1])
|
|
_run()
|
|
|
|
|
|
func _run() -> void:
|
|
await process_frame
|
|
var api := root.get_node("ApiClient")
|
|
var session := root.get_node("Session")
|
|
|
|
var uname := "mpflow_%s_%d" % [role, int(Time.get_unix_time_from_system() * 1000) % 1000000]
|
|
var reg: Dictionary = await api.register(uname, uname + "@e.com", "secret123", "1990-01-01")
|
|
if not reg.ok:
|
|
print("RESULT %s register_failed %s" % [role, reg.detail])
|
|
quit(1); return
|
|
|
|
var join: Dictionary = await api.join_world(world_id)
|
|
if not (join.ok and join.data is Dictionary):
|
|
print("RESULT %s join_failed status=%d %s" % [role, join.status, join.detail])
|
|
quit(1); return
|
|
var d: Dictionary = join.data
|
|
session.begin(world_id, str(d["host"]), int(d["port"]))
|
|
|
|
change_scene_to_file("res://scenes/game.tscn")
|
|
# Wait for the scene + NetworkClient connect (game.gd awaits internally).
|
|
for i in 180:
|
|
await process_frame
|
|
|
|
var game := current_scene
|
|
var netc = game.get_node_or_null("NetworkClient") if game else null
|
|
if netc == null or not netc.is_connected_to_server():
|
|
print("RESULT %s not_connected" % role)
|
|
quit(1); return
|
|
|
|
if role == "b":
|
|
print("RESULT b in_world")
|
|
for i in 1200:
|
|
await process_frame
|
|
quit(0); return
|
|
|
|
# role a: hold still briefly (confirm we don't fall through the floor),
|
|
# then move and look for a remote node.
|
|
var player = game.get_node("Player")
|
|
var min_y := 1000.0
|
|
for i in 30:
|
|
await process_frame
|
|
min_y = minf(min_y, player.global_position.y)
|
|
var on_floor: bool = min_y > -3.0
|
|
|
|
var start: Vector3 = player.global_position
|
|
var max_remotes := 0
|
|
for i in 120:
|
|
player._input_direction = Vector2(0, 1) # fake held forward
|
|
await process_frame
|
|
var n := 0
|
|
for c in game.get_children():
|
|
if c.name.begins_with("Remote_"):
|
|
n += 1
|
|
max_remotes = maxi(max_remotes, n)
|
|
var moved: bool = player.global_position.distance_to(start) > 1.0
|
|
print("RESULT a remotes=%d moved=%s on_floor=%s" % [max_remotes, str(moved), str(on_floor)])
|
|
quit(0 if (moved and max_remotes >= 1 and on_floor) else 1)
|