161 lines
4.9 KiB
GDScript
161 lines
4.9 KiB
GDScript
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: Array = []
|
|
var _today_index: int = 0
|
|
var _server_month: int = 1
|
|
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)
|
|
|
|
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", {})
|
|
|
|
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."
|
|
|
|
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 _today_index < _month_rewards.size():
|
|
var r = _month_rewards[_today_index]
|
|
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 = _claimed_days.has(i)
|
|
var is_today = i == _today_index
|
|
|
|
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()
|