extends Control signal closed @onready var close_btn = %CloseBtn @onready var grid_container = %GridContainer @onready var status_label = %StatusLabel @onready var claim_btn = %ClaimBtn @onready var slot_template = %RewardSlotTemplate @onready var month_label = %MonthLabel @onready var time_label = %TimeLabel @onready var reward_amount_label = %RewardAmount @onready var big_icon_label = $MainWindow/HBox/RightCol/MiddleDetails/VBox/BigIcon @onready var reward_name_label = $MainWindow/HBox/RightCol/MiddleDetails/VBox/RewardName var _month_rewards: Array = [] var _claimed_days: int = 0 var _can_claim: bool = false var _today: String = "" func _ready(): close_btn.pressed.connect(func(): hide() emit_signal("closed") ) claim_btn.pressed.connect(_on_claim_pressed) var time_dict = Time.get_datetime_dict_from_system() var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] month_label.text = months[time_dict.month - 1] + " Sign-in" func show_panel(): show() status_label.text = "Loading rewards..." claim_btn.disabled = true claim_btn.text = "Loading..." _fetch_state() func _fetch_state(): if not NakamaManager.session: 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 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", {}) _claimed_days = state.get("claimed_days", 0) _can_claim = data.get("can_claim_today", false) _today = data.get("today_date", "") _update_ui() else: status_label.text = "Error parsing data." func _get_reward_display_data(type: String) -> Dictionary: if type == "gold": return {"icon": "💰", "name": "Gold"} elif type == "frag_common": return {"icon": "🧩", "name": "Common Fragment"} elif type == "frag_uncommon": return {"icon": "📦", "name": "Uncommon Fragment"} elif type == "frag_rare": return {"icon": "💎", "name": "Rare Fragment"} return {"icon": "⭐", "name": "Star Currency"} func _update_ui(): for child in grid_container.get_children(): if child != slot_template: child.queue_free() var today_reward_amount = 0 var today_reward_type = "star" if _claimed_days < _month_rewards.size(): var r = _month_rewards[_claimed_days] if typeof(r) == TYPE_DICTIONARY: today_reward_amount = r.get("amount", 0) today_reward_type = r.get("type", "star") else: today_reward_amount = int(r) reward_amount_label.text = "x " + str(today_reward_amount) var r_data = _get_reward_display_data(today_reward_type) big_icon_label.text = r_data.icon reward_name_label.text = r_data.name for i in range(_month_rewards.size()): var reward_raw = _month_rewards[i] var reward_amount = 0 var reward_type = "star" if typeof(reward_raw) == TYPE_DICTIONARY: reward_amount = reward_raw.get("amount", 0) reward_type = reward_raw.get("type", "star") else: reward_amount = int(reward_raw) var r_slot_data = _get_reward_display_data(reward_type) var is_claimed = i < _claimed_days var is_today = i == _claimed_days var slot = slot_template.duplicate() slot.visible = true grid_container.add_child(slot) var day_lbl = slot.get_node("DayNumber") var amt_lbl = slot.get_node("Amount") var icon_lbl = slot.get_node("IconLabel") var claimed_overlay = slot.get_node("ClaimedOverlay") var today_border = slot.get_node("TodayBorder") day_lbl.text = str(i + 1) amt_lbl.text = str(reward_amount) icon_lbl.text = r_slot_data.icon claimed_overlay.visible = is_claimed today_border.visible = is_today if _can_claim: status_label.text = "" claim_btn.disabled = false claim_btn.text = "Sign In" else: status_label.text = "Come back tomorrow!" claim_btn.disabled = true claim_btn.text = "Signed-in" func _on_claim_pressed(): if not _can_claim or not NakamaManager.session: return claim_btn.disabled = true 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 claim_btn.disabled = false claim_btn.text = "Sign In" return # Refresh wallet if UserProfileManager.has_method("_reload_wallet"): UserProfileManager._reload_wallet() await get_tree().create_timer(1.0).timeout _fetch_state()