feat: the rebuild gamemode of "Gauntlet"

This commit is contained in:
2026-06-10 02:12:25 +08:00
parent 2d857a490b
commit 5653473c12
28 changed files with 1313 additions and 254 deletions
+4 -8
View File
@@ -250,16 +250,12 @@ func _on_tab_changed(tab_index: int) -> void:
func _rpc(rpc_name: String, payload: Dictionary) -> Dictionary:
if not NakamaManager.client or not NakamaManager.session:
return {"error": "Not connected"}
var result = await NakamaManager.client.rpc_async(
NakamaManager.session, rpc_name, JSON.stringify(payload)
)
if result.is_exception():
var err: String = result.get_exception().message
var result = await BackendService.api_rpc_async(rpc_name, JSON.stringify(payload))
if result.get("success", false) == false:
var err: String = str(result.get("message", "Unknown error"))
_set_status(err, CLR_STATUS_ERR)
return {"error": err}
if result.payload:
return JSON.parse_string(result.payload)
return {}
return result.get("data", {})
func _set_status(msg: String, color: Color = CLR_DIM) -> void:
status_label.text = msg
+20 -22
View File
@@ -15,26 +15,24 @@ func _load_config():
status_lbl.text = "Not authenticated"
return
status_lbl.text = "Loading..."
var res = await NakamaManager.client.rpc_async(NakamaManager.session, "get_daily_reward_config_admin", "{}")
if res.is_exception():
status_lbl.text = "Error: " + res.get_exception().message
var result = await BackendService.get_daily_reward_config_admin()
if result.get("success", false) == false:
status_lbl.text = "Error: " + str(result.get("error", ""))
return
var json = JSON.new()
if json.parse(res.payload) == OK:
var config = json.get_data().get("config", {})
if config.is_empty():
# generate default 12 months for 2026/2027
var year = 2026
for m in range(1, 13):
var m_str = "%d-%02d" % [year, m]
var arr = []
for d in range(30):
arr.append(min(10 + d*5, 100)) # Reward is star currency, max 100
config[m_str] = arr
text_edit.text = JSON.stringify(config, "\t")
status_lbl.text = "Loaded"
var config = result.get("data", {}).get("config", {})
if config.is_empty():
# generate default 12 months for 2026/2027
var year = 2026
for m in range(1, 13):
var m_str = "%d-%02d" % [year, m]
var arr = []
for d in range(30):
arr.append(min(10 + d*5, 100)) # Reward is star currency, max 100
config[m_str] = arr
text_edit.text = JSON.stringify(config, "\t")
status_lbl.text = "Loaded"
func _on_save():
var json = JSON.new()
@@ -43,9 +41,9 @@ func _on_save():
return
status_lbl.text = "Saving..."
var req = { "config": json.get_data() }
var res = await NakamaManager.client.rpc_async(NakamaManager.session, "set_daily_reward_config", JSON.stringify(req))
if res.is_exception():
status_lbl.text = "Save error: " + res.get_exception().message
var config = json.get_data()
var result = await BackendService.set_daily_reward_config(config)
if result.get("success", false) == false:
status_lbl.text = "Save error: " + str(result.get("error", ""))
else:
status_lbl.text = "Config saved successfully!"
+24 -28
View File
@@ -39,34 +39,30 @@ func _fetch_state():
status_label.text = "Must be logged in to claim rewards."
return
var result = await NakamaManager.client.rpc_async(NakamaManager.session, "get_daily_reward_state", "{}")
if result.is_exception():
status_label.text = "Failed to load: " + result.get_exception().message
var result = await BackendService.get_daily_reward_state()
if result.get("success", false) == false:
status_label.text = "Failed to load: " + str(result.get("error", ""))
return
var json = JSON.new()
if json.parse(result.payload) == OK:
var data = json.get_data()
_month_rewards = data.get("month_rewards", [])
var state = data.get("state", {})
var data = result.get("data", {})
_month_rewards = data.get("month_rewards", [])
var state = data.get("state", {})
var claimed_list = state.get("claimed_days", [])
_claimed_days.clear()
for item in claimed_list:
_claimed_days.append(int(item))
var claimed_list = state.get("claimed_days", [])
_claimed_days.clear()
for item in claimed_list:
_claimed_days.append(int(item))
_can_claim = data.get("can_claim_today", false)
_today = data.get("today_date", "")
_today_index = data.get("today_index", 0)
_server_month = data.get("server_month", 1)
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
if _server_month >= 1 and _server_month <= 12:
month_label.text = months[_server_month - 1] + " Sign-in"
_update_ui()
else:
status_label.text = "Error parsing data."
_can_claim = data.get("can_claim_today", false)
_today = data.get("today_date", "")
_today_index = data.get("today_index", 0)
_server_month = data.get("server_month", 1)
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
if _server_month >= 1 and _server_month <= 12:
month_label.text = months[_server_month - 1] + " Sign-in"
_update_ui()
func _get_reward_display_data(type: String) -> Dictionary:
if type == "gold": return {"icon": "💰", "name": "Gold"}
@@ -145,9 +141,9 @@ func _on_claim_pressed():
claim_btn.text = "Claiming..."
status_label.text = ""
var result = await NakamaManager.client.rpc_async(NakamaManager.session, "claim_daily_reward", "{}")
if result.is_exception():
status_label.text = "Failed to claim: " + result.get_exception().message
var result = await BackendService.claim_daily_reward()
if result.get("success", false) == false:
status_label.text = "Failed to claim: " + str(result.get("error", ""))
claim_btn.disabled = false
claim_btn.text = "Sign In"
return
+18 -22
View File
@@ -72,11 +72,11 @@ func show_panel() -> void:
status_label.text = "Syncing scores..."
# Bulk-sync all users' storage stats to native leaderboard (server-side operation)
if NakamaManager.session:
var sync_result = await NakamaManager.client.rpc_async(NakamaManager.session, "sync_leaderboard", "{}")
if sync_result.is_exception():
push_error("[Leaderboard] sync_leaderboard RPC failed: ", sync_result.get_exception().message)
var sync_result = await BackendService.sync_leaderboard()
if sync_result.get("success", false) == false:
push_error("[Leaderboard] sync_leaderboard RPC failed: " + str(sync_result.get("error", "")))
else:
print("[Leaderboard] Server sync finished: ", sync_result.payload)
print("[Leaderboard] Server sync finished: ", sync_result.get("data", {}))
_fetch_leaderboard_data()
func _on_close_pressed() -> void:
@@ -150,29 +150,25 @@ func _fetch_native_leaderboard() -> Array:
func _fetch_via_rpc() -> void:
"""Fallback: call server RPC which reads the same native leaderboard."""
var result = await NakamaManager.client.rpc_async(NakamaManager.session, "get_leaderboard_stats", "{}")
var result = await BackendService.get_leaderboard_stats()
if result.is_exception():
if result.get("success", false) == false:
status_label.text = "Failed to load leaderboard"
push_error("[Leaderboard] RPC failed: ", result.get_exception().message)
push_error("[Leaderboard] RPC failed: " + str(result.get("error", "")))
return
var json := JSON.new()
if json.parse(result.payload) == OK:
var data = json.get_data()
if data.has("leaderboard") and data.leaderboard.size() > 0:
_apply_local_overrides(data.leaderboard)
leaderboard_data = data.leaderboard
_calculate_win_rates()
status_label.text = ""
_sort_by(current_sort_key)
if leaderboard_data.size() > 0:
_show_entry_preview(0)
else:
# No records exist yet — show a helpful hint
status_label.text = "No scores recorded yet.\nPlay a match to appear here!"
var data = result.get("data", {})
if data.has("leaderboard") and data.leaderboard.size() > 0:
_apply_local_overrides(data.leaderboard)
leaderboard_data = data.leaderboard
_calculate_win_rates()
status_label.text = ""
_sort_by(current_sort_key)
if leaderboard_data.size() > 0:
_show_entry_preview(0)
else:
status_label.text = "Error parsing server data"
# No records exist yet — show a helpful hint
status_label.text = "No scores recorded yet.\nPlay a match to appear here!"
func _calculate_win_rates() -> void:
for entry in leaderboard_data:
+5 -7
View File
@@ -645,11 +645,9 @@ func _setup_account_settings_ui() -> void:
"new_email": new_email_input.text,
"new_password": new_pass_input.text
}
var r = await NakamaManager.client.rpc_async(
NakamaManager.session, "change_credentials", JSON.stringify(payload)
)
if r.is_exception():
_set_status("Error: " + r.get_exception().message, Color.RED)
var r = await BackendService.api_rpc_async("change_credentials", JSON.stringify(payload))
if r.get("success", false) == false:
_set_status("Error: " + str(r.get("message", "Unknown error")), Color.RED)
else:
_set_status("Credentials updated!", Color(0.4, 1.0, 0.4))
acc_settings_dialog.hide()
@@ -671,8 +669,8 @@ func _setup_account_settings_ui() -> void:
)
func _on_reset_stats_confirmed() -> void:
var r = await NakamaManager.client.rpc_async(NakamaManager.session, "reset_stats", "{}")
if not r.is_exception():
var r = await BackendService.api_rpc_async("reset_stats", "{}")
if r.get("success", false) == true:
UserProfileManager.stats = {
"games_played": 0, "games_won": 0, "games_lost": 0,
"total_score": 0, "high_score": 0, "play_time_minutes": 0
+4 -5
View File
@@ -103,15 +103,14 @@ func _on_search_pressed() -> void:
return
_search_btn.disabled = true
var payload = JSON.stringify({"query": query})
var result = await NakamaManager.client.rpc_async(NakamaManager.session, "search_users", payload)
var result = await BackendService.search_users(query)
_search_btn.disabled = false
if result.is_exception():
push_warning("[Social] Search failed: " + result.get_exception().message)
if result.get("success", false) == false:
push_warning("[Social] Search failed: " + str(result.get("error", "")))
return
var response = JSON.parse_string(result.payload)
var response = result.get("data", {})
if not response or not response.has("users"):
return