Files
tekton/scenes/ui/lobby_room_list.gd
adtpdn decdb74ade chore: release version 2.3.5 and refactor lobby
Bump export_presets.cfg version to 2.3.5. Update CHANGELOG_DRAFT.md.
Refactor lobby.gd into LobbyChat, LobbyMainMenu, LobbyRoomList, LobbyRoom.
Move Nakama config to environment variables in nakama_manager.gd.
Derive auth_manager.gd encryption key from OS.get_unique_id().sha256_text().
Remove Steam email auth fallback. Require auth ticket.
Make GachaManager.pull() async in gacha_panel.gd.
Remove dummy wallet seeding. Add store_type to IAP payload.
Validate IAP receipts server-side in economy.lua.
Register gacha module in main.lua.
Clean backend_service.gd stubs.
Fix featured_banners type safety in gacha_manager.gd. Guards non-array responses.
Move tiles_armagedon_a1.res to assets/models/meshes/. Fix import fallback_path.
2026-05-22 12:08:11 +08:00

156 lines
5.7 KiB
GDScript

class_name LobbyRoomList
extends RefCounted
var lobby: Control
func _init(p_lobby: Control):
lobby = p_lobby
if lobby.refresh_btn:
lobby.refresh_btn.pressed.connect(_on_refresh_pressed)
if lobby.join_btn:
lobby.join_btn.pressed.connect(_on_join_pressed)
if lobby.back_btn:
lobby.back_btn.pressed.connect(_on_back_pressed)
LobbyManager.room_list_updated.connect(on_room_list_updated)
func _on_refresh_pressed() -> void:
if lobby.connection_status: lobby.connection_status.text = "Refreshing..."
if lobby.room_list: lobby.room_list.clear()
LobbyManager.refresh_room_list()
func _on_room_selected(index: int) -> void:
if index < LobbyManager.available_rooms.size():
var room = LobbyManager.available_rooms[index]
if LobbyManager.is_lan_mode:
var ip = room.get("ip", "")
if not ip.is_empty() and lobby.match_id_input:
lobby.match_id_input.text = ip
else:
var mid = room.get("match_id", "")
if not mid.is_empty() and lobby.match_id_input:
lobby.match_id_input.text = mid
func _on_room_activated(index: int) -> void:
_on_room_selected(index)
_on_join_pressed()
func _on_join_pressed() -> void:
if not lobby.match_id_input: return
var match_id = lobby.match_id_input.text.strip_edges()
if match_id.is_empty() and not LobbyManager.is_lan_mode:
var selected_items = [] if not lobby.room_list else lobby.room_list.get_selected_items()
if selected_items.size() == 0:
if lobby.connection_status: lobby.connection_status.text = "Please select a room or enter Match ID"
return
var selected_idx = selected_items[0]
if selected_idx < LobbyManager.available_rooms.size():
match_id = LobbyManager.available_rooms[selected_idx].get("match_id", "")
if AuthManager.is_guest:
if LobbyManager.local_player_name.is_empty() or LobbyManager.local_player_name == "Player":
LobbyManager.local_player_name = NameGenerator.generate_guest_name()
else:
LobbyManager.local_player_name = UserProfileManager.get_display_name()
if LobbyManager.is_lan_mode:
if match_id.is_empty():
var selected_items = [] if not lobby.room_list else lobby.room_list.get_selected_items()
if selected_items.size() > 0:
var idx = selected_items[0]
if idx < LobbyManager.available_rooms.size():
match_id = LobbyManager.available_rooms[idx].get("ip", "")
if match_id.is_empty():
if lobby.connection_status: lobby.connection_status.text = "Enter Host IP to join"
return
if lobby.connection_status: lobby.connection_status.text = "Connecting to %s..." % match_id
lobby._apply_loadout_character()
var ok = LobbyManager.join_room_lan(match_id)
if not ok:
if lobby.connection_status: lobby.connection_status.text = "Failed to connect to %s" % match_id
else:
if match_id.is_empty():
if lobby.connection_status: lobby.connection_status.text = "No room selected"
return
if lobby.connection_status: lobby.connection_status.text = "Joining Nakama room..."
lobby._apply_loadout_character()
LobbyManager.join_room(match_id)
func _on_back_pressed() -> void:
lobby._show_panel("main_menu")
if lobby.connection_status: lobby.connection_status.text = ""
func on_room_list_updated(rooms: Array) -> void:
if not lobby.room_list: return
lobby.room_list.clear()
if lobby.item_template:
var parent = lobby.item_template.get_parent()
for child in parent.get_children():
if child.has_meta("room_row"):
child.queue_free()
var filtered := rooms.filter(func(r):
return lobby._room_mode_filter.is_empty() or r.get("game_mode", "") == lobby._room_mode_filter
)
if lobby.item_template:
var parent = lobby.item_template.get_parent()
for i in range(filtered.size()):
var room = filtered[i]
var row = lobby.item_template.duplicate()
row.visible = true
row.set_meta("room_row", true)
row.set_meta("room_index", i)
var room_id_short = room.get("room_name", "???")
var host_name = room.get("host_name", "Unknown")
var player_count = room.get("player_count", 1)
var max_players = room.get("max_players", 8)
var mode = room.get("game_mode", "")
var mode_short = "FMD" if mode == "Freemode" else ("SNG" if mode == "Stop n Go" else mode.left(3).to_upper())
var hbox = row.get_node_or_null("PanelContainer/MarginContainer/HBoxContainer")
if hbox:
var lbl_id = hbox.get_child(0)
var lbl_host = hbox.get_child(1)
var lbl_mode = hbox.get_child(2)
var lbl_cap = hbox.get_child(3)
if lbl_id: lbl_id.text = room_id_short
if lbl_host: lbl_host.text = host_name
if lbl_mode: lbl_mode.text = mode_short
if lbl_cap: lbl_cap.text = "%d/%d" % [player_count, max_players]
parent.add_child(row)
var panel_box = row.get_node_or_null("PanelContainer")
if panel_box:
var idx = i
panel_box.gui_input.connect(func(event: InputEvent):
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
_on_room_selected(idx)
if event.double_click:
_on_room_activated(idx)
)
panel_box.mouse_filter = Control.MOUSE_FILTER_STOP
else:
for room in filtered:
var room_name = room.get("room_name", "Unknown")
var host_name = room.get("host_name", "Unknown")
var player_count = room.get("player_count", 1)
var max_players = room.get("max_players", 4)
var mode = room.get("game_mode", "")
var mode_tag = " [%s]" % mode if not mode.is_empty() else ""
lobby.room_list.add_item("%s - %s (%d/%d)%s" % [room_name, host_name, player_count, max_players, mode_tag])
var filter_note = " [Filter: %s]" % lobby._room_mode_filter if not lobby._room_mode_filter.is_empty() else ""
if filtered.size() == 0:
if lobby.connection_status: lobby.connection_status.text = "No rooms available%s" % filter_note
else:
if lobby.connection_status: lobby.connection_status.text = "Found %d room(s)%s" % [filtered.size(), filter_note]