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.
This commit is contained in:
@@ -27,44 +27,44 @@ func _load_data() -> void:
|
||||
|
||||
func pull(banner_id: String, count: int) -> Array:
|
||||
if data.is_empty(): _load_data()
|
||||
var banner: Dictionary = data.get("banners", {}).get(banner_id, {})
|
||||
if banner.is_empty():
|
||||
push_error("[GachaManager] Unknown banner: " + banner_id)
|
||||
|
||||
if not NakamaManager.session:
|
||||
push_error("[GachaManager] Not authenticated")
|
||||
return []
|
||||
|
||||
var currency: String = banner.get("currency", "star")
|
||||
var cost_key: String = "pull_%d_cost" % count
|
||||
var cost: int = banner.get(cost_key, banner.get("pull_1_cost", 999) * count)
|
||||
var pity_at: int = banner.get("pity_at", 90)
|
||||
|
||||
# Deduct currency
|
||||
var bal: int = UserProfileManager.wallet.get(currency, 0)
|
||||
if bal < cost:
|
||||
push_warning("[GachaManager] Not enough %s (have %d need %d)" % [currency, bal, cost])
|
||||
var payload = JSON.stringify({
|
||||
"banner_id": banner_id,
|
||||
"count": count
|
||||
})
|
||||
|
||||
var result = await NakamaManager.client.rpc_async(
|
||||
NakamaManager.session,
|
||||
"perform_gacha_pull",
|
||||
payload
|
||||
)
|
||||
|
||||
if result.is_exception():
|
||||
var msg = result.get_exception().message
|
||||
push_error("[GachaManager] Gacha pull failed: " + msg)
|
||||
return []
|
||||
UserProfileManager.wallet[currency] = bal - cost
|
||||
UserProfileManager.save_wallet()
|
||||
|
||||
var results: Array = []
|
||||
for _i in range(count):
|
||||
var pity: int = pity_counters.get(banner_id, 0)
|
||||
var rarity: String
|
||||
if pity + 1 >= pity_at:
|
||||
rarity = "real_prize"
|
||||
pity_counters[banner_id] = 0
|
||||
else:
|
||||
rarity = _roll_rarity(banner.get("rates", {}))
|
||||
pity_counters[banner_id] = (pity + 1) if rarity != "real_prize" else 0
|
||||
|
||||
var item_id: String = _pick_from_pool(rarity, banner_id)
|
||||
var item_data: Dictionary = _resolve_item(item_id, rarity)
|
||||
results.append({
|
||||
"id": item_id,
|
||||
"rarity": rarity,
|
||||
"name": item_data.get("name", item_id)
|
||||
})
|
||||
|
||||
var parsed = JSON.parse_string(result.payload)
|
||||
if typeof(parsed) != TYPE_DICTIONARY or not parsed.has("results"):
|
||||
return []
|
||||
|
||||
var results: Array = parsed.get("results", [])
|
||||
|
||||
if parsed.has("new_pity"):
|
||||
pity_counters[banner_id] = int(parsed.new_pity)
|
||||
|
||||
if UserProfileManager.has_method("_reload_wallet"):
|
||||
await UserProfileManager._reload_wallet()
|
||||
|
||||
for res in results:
|
||||
var item_id = res.get("id", "")
|
||||
var rarity = res.get("rarity", "")
|
||||
_grant_item(item_id, rarity)
|
||||
|
||||
|
||||
pull_completed.emit(results)
|
||||
return results
|
||||
|
||||
|
||||
Reference in New Issue
Block a user