Add ready lobby and reconnect support

This commit is contained in:
Emporex committed 2026-10-04 04:31:52 +02:00
1 parent 19b1a67773
commit 32594c7f81
8 files changed
+215 -36

No files matched your search

+27 -1
View File
@@ -13,6 +13,9 @@ var matchmaking_state := "idle"
var matchmaking_mode := ""
var matchmaking_difficulty := 1
var private_room_code := ""
var local_ready := false
var lobby_players: Array = [null, null]
var reconnect_seconds := 0
var online_match = null
var online_mode := false
var player_slot := -1
@@ -28,6 +31,9 @@ func reset_coop_session(start_credits := COOP_START_CREDITS, reactor_lives := CO
player_slot = -1
latest_snapshot = {}
private_room_code = ""
local_ready = false
lobby_players = [null, null]
reconnect_seconds = 0
func spend_player_credits(player_index: int, amount: int) -> bool:
@@ -109,10 +115,21 @@ func cancel_search() -> void:
online_manager.cancel_matchmaking()
matchmaking_mode = ""
private_room_code = ""
local_ready = false
lobby_players = [null, null]
matchmaking_state = "idle"
state_changed.emit(matchmaking_state)
func toggle_lobby_ready() -> void:
if player_slot < 0 or matchmaking_state not in ["hosting", "matched", "lobby", "reconnected"]:
return
local_ready = not local_ready
var online_manager = get_parent().get_node_or_null("OnlineManager")
if online_manager:
await online_manager.set_lobby_ready(local_ready)
func _begin_online_search(mode: String) -> void:
if matchmaking_state == "idle" or matchmaking_mode != mode:
return
@@ -172,13 +189,17 @@ func _on_online_matchmaking_state_changed(value: String) -> void:
func _on_online_match_found(match_data) -> void:
online_match = match_data
online_mode = true
online_mode = false
matchmaking_state = "matched"
state_changed.emit(matchmaking_state)
func _on_online_snapshot(snapshot: Dictionary) -> void:
latest_snapshot = snapshot
var players = snapshot.get("players", [])
if players is Array and players.size() >= PLAYER_COUNT:
lobby_players = players.duplicate(true)
reconnect_seconds = int(snapshot.get("reconnect_seconds", 0))
var credits = snapshot.get("credits", [])
if credits is Array and credits.size() >= PLAYER_COUNT:
player_credits = [int(credits[0]), int(credits[1])]
@@ -189,6 +210,11 @@ func _on_online_snapshot(snapshot: Dictionary) -> void:
var resolved_slot := int(slots.get(online_manager.session.user_id, -1))
if resolved_slot >= 0 and resolved_slot != player_slot:
player_slot = resolved_slot
if player_slot >= 0 and player_slot < lobby_players.size() and lobby_players[player_slot] is Dictionary:
local_ready = bool(lobby_players[player_slot].get("ready", false))
if not bool(snapshot.get("started", false)) and player_slot >= 0 and matchmaking_state in ["hosting", "matched", "reconnected"]:
matchmaking_state = "lobby"
state_changed.emit(matchmaking_state)
if bool(snapshot.get("started", false)) and player_slot >= 0 and not online_mode:
online_mode = true
online_game_ready.emit(player_slot)