feat: Implement core multiplayer features including user authentication, profile management, lobby, game mode managers, and leaderboard.

This commit is contained in:
2026-03-12 03:55:20 +08:00
parent 650d241a72
commit 4f6783b468
13 changed files with 1151 additions and 31 deletions
+101
View File
@@ -19,6 +19,16 @@ signal character_changed(player_id: int, character_name: String)
signal area_changed(area_name: String)
signal player_list_changed()
# Stop N Go settings signals
signal sng_go_duration_changed(duration: int)
signal sng_stop_duration_changed(duration: int)
signal sng_required_goals_changed(goals: int)
# Tekton Doors settings signals
signal doors_swap_time_changed(time: int)
signal doors_refresh_time_changed(time: int)
signal doors_required_goals_changed(goals: int)
# Room data structure
var current_room: Dictionary = {}
var players_in_room: Array = [] # [{id, name, is_ready}]
@@ -40,6 +50,16 @@ signal enable_cycle_timer_changed(enabled: bool)
var scarcity_mode: String = "Normal" # Normal, Aggressive, Chaos
signal scarcity_mode_changed(mode: String)
# Stop N Go settings
var sng_go_duration: int = 15
var sng_stop_duration: int = 4
var sng_required_goals: int = 8
# Tekton Doors settings
var doors_swap_time: int = 15
var doors_refresh_time: int = 25
var doors_required_goals: int = 8
# Character and area selection
var available_characters: Array[String] = ["Copper", "Dabro", "Gatot", "Pip", "Random"]
var available_areas: Array[String] = []
@@ -259,6 +279,68 @@ func sync_scarcity_mode(mode: String) -> void:
func get_scarcity_mode() -> String:
return scarcity_mode
# =============================================================================
# Stop N Go Settings
# =============================================================================
func set_sng_go_duration(duration: int) -> void:
sng_go_duration = duration
if is_host: rpc("sync_sng_go_duration", duration)
@rpc("authority", "call_local", "reliable")
func sync_sng_go_duration(duration: int) -> void:
sng_go_duration = duration
emit_signal("sng_go_duration_changed", duration)
func set_sng_stop_duration(duration: int) -> void:
sng_stop_duration = duration
if is_host: rpc("sync_sng_stop_duration", duration)
@rpc("authority", "call_local", "reliable")
func sync_sng_stop_duration(duration: int) -> void:
sng_stop_duration = duration
emit_signal("sng_stop_duration_changed", duration)
func set_sng_required_goals(goals: int) -> void:
sng_required_goals = goals
if is_host: rpc("sync_sng_required_goals", goals)
@rpc("authority", "call_local", "reliable")
func sync_sng_required_goals(goals: int) -> void:
sng_required_goals = goals
emit_signal("sng_required_goals_changed", goals)
# =============================================================================
# Tekton Doors Settings
# =============================================================================
func set_doors_swap_time(time: int) -> void:
doors_swap_time = time
if is_host: rpc("sync_doors_swap_time", time)
@rpc("authority", "call_local", "reliable")
func sync_doors_swap_time(time: int) -> void:
doors_swap_time = time
emit_signal("doors_swap_time_changed", time)
func set_doors_refresh_time(time: int) -> void:
doors_refresh_time = time
if is_host: rpc("sync_doors_refresh_time", time)
@rpc("authority", "call_local", "reliable")
func sync_doors_refresh_time(time: int) -> void:
doors_refresh_time = time
emit_signal("doors_refresh_time_changed", time)
func set_doors_required_goals(goals: int) -> void:
doors_required_goals = goals
if is_host: rpc("sync_doors_required_goals", goals)
@rpc("authority", "call_local", "reliable")
func sync_doors_required_goals(goals: int) -> void:
doors_required_goals = goals
emit_signal("doors_required_goals_changed", goals)
# =============================================================================
# Character Selection
# =============================================================================
@@ -430,6 +512,13 @@ func start_game() -> void:
rpc("sync_enable_cycle_timer", enable_cycle_timer)
# Sync scarcity mode
rpc("sync_scarcity_mode", scarcity_mode)
# Sync game mode features
rpc("sync_sng_go_duration", sng_go_duration)
rpc("sync_sng_stop_duration", sng_stop_duration)
rpc("sync_sng_required_goals", sng_required_goals)
rpc("sync_doors_swap_time", doors_swap_time)
rpc("sync_doors_refresh_time", doors_refresh_time)
rpc("sync_doors_required_goals", doors_required_goals)
# Sync game mode
rpc("sync_game_mode", game_mode)
@@ -492,6 +581,12 @@ func request_room_info(requester_id: int, requester_name: String, requester_char
rpc_id(requester_id, "sync_randomize_spawn", randomize_spawn)
rpc_id(requester_id, "sync_enable_cycle_timer", enable_cycle_timer)
rpc_id(requester_id, "sync_scarcity_mode", scarcity_mode)
rpc_id(requester_id, "sync_sng_go_duration", sng_go_duration)
rpc_id(requester_id, "sync_sng_stop_duration", sng_stop_duration)
rpc_id(requester_id, "sync_sng_required_goals", sng_required_goals)
rpc_id(requester_id, "sync_doors_swap_time", doors_swap_time)
rpc_id(requester_id, "sync_doors_refresh_time", doors_refresh_time)
rpc_id(requester_id, "sync_doors_required_goals", doors_required_goals)
rpc_id(requester_id, "sync_game_mode", game_mode)
rpc_id(requester_id, "sync_area", selected_area)
@@ -568,3 +663,9 @@ func reset() -> void:
selected_area = available_areas[0]
local_character_index = 0 # Default to "Copper"
enable_cycle_timer = false
sng_go_duration = 15
sng_stop_duration = 4
sng_required_goals = 8
doors_swap_time = 15
doors_refresh_time = 25
doors_required_goals = 8