Files
Sprout-Farm/SproutFarm-Frontend/Script/BigPanel/DailyCheckInPanel.gd
2025-09-15 19:10:37 +08:00

226 lines
7.4 KiB
GDScript

extends Panel
class_name DailyCheckInPanel
signal check_in_completed(rewards: Dictionary)
signal check_in_failed(error_message: String)
@onready var daily_check_in_history: RichTextLabel = $Scroll/DailyCheckInHistory
@onready var daily_check_in_reward: RichTextLabel = $DailyCheckInReward
@onready var daily_check_in_button: Button = $DailyCheckInButton
@onready var main_game = get_node("/root/main")
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
@onready var confirm_dialog: ConfirmationDialog = $ConfirmDialog #确认弹窗
var check_in_history: Dictionary = {}
var consecutive_days: int = 0
var has_checked_in_today: bool = false
func _ready() -> void:
visibility_changed.connect(_on_visibility_changed)
_initialize_system()
func _initialize_system() -> void:
daily_check_in_reward.hide()
_update_display()
_check_daily_status()
if tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
tcp_network_manager_panel.sendGetCheckInData()
func handle_daily_check_in_response(response: Dictionary) -> void:
var success = response.get("success", false)
var message = response.get("message", "")
if success:
var rewards = response.get("rewards", {})
consecutive_days = response.get("consecutive_days", 0)
has_checked_in_today = true
# 显示奖励内容
_show_reward_content(rewards)
_set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1))
check_in_completed.emit(rewards)
Toast.show(message, Color.GREEN)
else:
has_checked_in_today = response.get("has_checked_in", false)
_set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1)) if has_checked_in_today else _set_button_state(true, "签到", Color(1, 1, 0.52549, 1))
check_in_failed.emit(message)
Toast.show(message, Color.RED)
func handle_check_in_data_response(response: Dictionary) -> void:
var success = response.get("success", false)
if success:
check_in_history = response.get("check_in_data", {})
consecutive_days = response.get("consecutive_days", 0)
has_checked_in_today = response.get("has_checked_in_today", false)
_update_display()
_check_daily_status()
func _check_daily_status() -> void:
if has_checked_in_today:
_set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1))
else:
_set_button_state(true, "签到", Color(1, 1, 0.52549, 1))
func _set_button_state(enabled: bool, text: String, color: Color) -> void:
daily_check_in_button.disabled = not enabled
daily_check_in_button.text = text
daily_check_in_button.modulate = color
func execute_check_in() -> void:
if has_checked_in_today:
Toast.show("今日已签到,请明日再来", Color.ORANGE)
return
if not tcp_network_manager_panel or not tcp_network_manager_panel.is_connected_to_server():
Toast.show("未连接到服务器,无法签到", Color.RED)
return
tcp_network_manager_panel.sendDailyCheckIn()
daily_check_in_button.disabled = true
daily_check_in_button.text = "签到中..."
await get_tree().create_timer(3.0).timeout
if daily_check_in_button.disabled and daily_check_in_button.text == "签到中...":
daily_check_in_button.disabled = false
daily_check_in_button.text = "签到"
func _format_reward_text(rewards: Dictionary) -> String:
var text = ""
text += "[center][color=#FF69B4]🔥 连续签到第%d天 🔥[/color][/center]\n" % consecutive_days
if consecutive_days > 1:
var multiplier = 1.0 + (consecutive_days - 1) * 0.1
multiplier = min(multiplier, 3.0)
text += "[center][color=#90EE90]奖励倍数: %.1fx[/color][/center]\n\n" % multiplier
else:
text += "\n"
if rewards.has("coins"):
text += "[color=#FFD700]💰 +%d 金币[/color]\n" % rewards.coins
if rewards.has("exp"):
text += "[color=#00BFFF]⭐ +%d 经验[/color]\n" % rewards.exp
if rewards.has("seeds") and rewards.seeds.size() > 0:
for seed_reward in rewards.seeds:
var seed_name = seed_reward.name
var quantity = seed_reward.quantity
var quality = seed_reward.quality
var rarity_color = _get_rarity_color(quality)
text += "[color=%s]🌱 %s x%d[/color] [color=%s](%s)[/color]\n" % [
rarity_color, seed_name, quantity, rarity_color, quality
]
if rewards.has("bonus_coins"):
text += "\n[color=#FFD700]🎁 连续签到奖励:[/color]\n"
text += "[color=#FFD700]💰 +%d 额外金币[/color] [color=#FFD700]✨[/color]\n" % rewards.bonus_coins
if rewards.has("bonus_exp"):
if not rewards.has("bonus_coins"):
text += "\n[color=#FFD700]🎁 连续签到奖励:[/color]\n"
text += "[color=#00BFFF]⭐ +%d 额外经验[/color] [color=#FFD700]✨[/color]\n" % rewards.bonus_exp
var next_bonus_day = 0
if consecutive_days < 3:
next_bonus_day = 3
elif consecutive_days < 7:
next_bonus_day = 7
elif consecutive_days < 14:
next_bonus_day = 14
elif consecutive_days < 21:
next_bonus_day = 21
elif consecutive_days < 30:
next_bonus_day = 30
if next_bonus_day > 0:
var days_needed = next_bonus_day - consecutive_days
text += "\n[center][color=#87CEEB]再签到%d天可获得特殊奖励![/color][/center]" % days_needed
return text
func _get_rarity_color(rarity: String) -> String:
match rarity:
"普通": return "#90EE90"
"优良": return "#87CEEB"
"稀有": return "#DDA0DD"
"史诗": return "#9932CC"
"传奇": return "#FF8C00"
_: return "#FFFFFF"
func _show_reward_content(rewards: Dictionary) -> void:
var reward_text = _format_reward_text(rewards)
daily_check_in_reward.text = reward_text
daily_check_in_reward.show()
func _update_display() -> void:
var history_text = "[center][color=#FFB6C1]📋 签到历史[/color][/center]\n"
if consecutive_days > 0:
history_text += "[center][color=#FF69B4]🔥 当前连续签到: %d天[/color][/center]\n" % consecutive_days
if consecutive_days >= 30:
history_text += "[center][color=#FFD700]⭐ 已达到最高连击等级! ⭐[/color][/center]\n"
else:
history_text += "[center][color=#DDDDDD]还未开始连续签到[/color][/center]\n"
history_text += "\n"
if check_in_history.size() == 0:
history_text += "[center][color=#DDDDDD]暂无签到记录[/color][/center]"
else:
# 按时间排序显示历史记录
var sorted_times = check_in_history.keys()
sorted_times.sort()
sorted_times.reverse()
for time_key in sorted_times:
var reward_text = check_in_history[time_key]
history_text += "[color=#87CEEB]%s[/color] [color=#90EE90]%s[/color]\n" % [time_key, reward_text]
history_text += "---------------------------------------------\n"
daily_check_in_history.text = history_text
# 事件处理
func _on_quit_button_pressed() -> void:
self.hide()
func _on_daily_check_in_button_pressed() -> void:
# 显示确认弹窗
confirm_dialog.title = "每日签到确认"
confirm_dialog.dialog_text = "确定要进行今日签到吗?\n签到可获得金币、经验和种子奖励!"
confirm_dialog.popup_centered()
# 连接确认信号(如果还没连接的话)
if not confirm_dialog.confirmed.is_connected(_on_confirm_check_in):
confirm_dialog.confirmed.connect(_on_confirm_check_in)
func _on_confirm_check_in() -> void:
execute_check_in()
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
else:
GlobalVariables.isZoomDisabled = false
# 公共接口
func refresh_check_in_data() -> void:
if tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
tcp_network_manager_panel.sendGetCheckInData()
func get_check_in_status() -> Dictionary:
return {
"has_checked_in_today": has_checked_in_today,
"consecutive_days": consecutive_days
}