Add ready lobby and reconnect support
This commit is contained in:
1 parent
19b1a67773
commit
32594c7f81
8 files changed
+215
-36
No files matched your search
+27
-1
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user