稍微优化了一下签到系统和抽奖系统

This commit is contained in:
2025-07-12 21:08:36 +08:00
parent aa8707878e
commit 09b1f19a8f
10 changed files with 791 additions and 1184 deletions

View File

@@ -1,136 +1,31 @@
extends Panel
class_name DailyCheckInPanel
## 每日签到系统 - 后端对接版本
## 功能:与服务器对接的签到系统,支持实时数据同步
## 奖励平衡性已根据 crop_data.json 调整
signal check_in_completed(rewards: Dictionary)
signal check_in_failed(error_message: String)
# =============================================================================
# 信号定义 - 用于与后端系统通信
# =============================================================================
signal check_in_completed(rewards: Dictionary) # 签到完成信号
signal reward_claimed(reward_type: String, amount: int) # 奖励领取信号
signal check_in_data_loaded(data: 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'
# =============================================================================
# 数据存储
# =============================================================================
var check_in_data: Dictionary = {}
var today_date: String
var check_in_history: Dictionary = {}
var consecutive_days: int = 0
var has_checked_in_today: bool = false
# 网络管理器引用
@onready var main_game = get_node("/root/main")
@onready var lucky_draw_panel: LuckyDrawPanel = $'../LuckyDrawPanel'
@onready var daily_check_in_panel: DailyCheckInPanel = $'.'
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
@onready var item_store_panel: Panel = $'../ItemStorePanel'
@onready var item_bag_panel: Panel = $'../ItemBagPanel'
@onready var player_bag_panel: Panel = $'../PlayerBagPanel'
@onready var crop_warehouse_panel: Panel = $'../CropWarehousePanel'
@onready var crop_store_panel: Panel = $'../CropStorePanel'
@onready var player_ranking_panel: Panel = $'../PlayerRankingPanel'
@onready var login_panel: PanelContainer = $'../LoginPanel'
# =============================================================================
# 奖励配置系统 - 根据 crop_data.json 平衡调整
# =============================================================================
var reward_configs: Dictionary = {
"coins": {
"min": 200,
"max": 500,
"name": "钱币",
"color": "#FFD700",
"icon": "💰"
},
"exp": {
"min": 50,
"max": 120,
"name": "经验",
"color": "#00BFFF",
"icon": ""
},
# 种子配置根据 crop_data.json 的作物等级和价值设定
"seeds": {
"普通": [
{"name": "小麦", "color": "#F4A460", "icon": "🌱", "rarity_color": "#FFFFFF"},
{"name": "胡萝卜", "color": "#FFA500", "icon": "🌱", "rarity_color": "#FFFFFF"},
{"name": "土豆", "color": "#D2691E", "icon": "🌱", "rarity_color": "#FFFFFF"},
{"name": "稻谷", "color": "#DAA520", "icon": "🌱", "rarity_color": "#FFFFFF"}
],
"优良": [
{"name": "玉米", "color": "#FFD700", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "番茄", "color": "#FF6347", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "洋葱", "color": "#DDA0DD", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "大豆", "color": "#8FBC8F", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "豌豆", "color": "#90EE90", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "黄瓜", "color": "#32CD32", "icon": "🌱", "rarity_color": "#00FF00"},
{"name": "大白菜", "color": "#F0FFF0", "icon": "🌱", "rarity_color": "#00FF00"}
],
"稀有": [
{"name": "草莓", "color": "#FF69B4", "icon": "🌱", "rarity_color": "#0080FF"},
{"name": "花椰菜", "color": "#F5F5DC", "icon": "🌱", "rarity_color": "#0080FF"},
{"name": "柿子", "color": "#FF4500", "icon": "🌱", "rarity_color": "#0080FF"},
{"name": "蓝莓", "color": "#4169E1", "icon": "🌱", "rarity_color": "#0080FF"},
{"name": "树莓", "color": "#DC143C", "icon": "🌱", "rarity_color": "#0080FF"}
],
"史诗": [
{"name": "葡萄", "color": "#9370DB", "icon": "🌱", "rarity_color": "#8A2BE2"},
{"name": "南瓜", "color": "#FF8C00", "icon": "🌱", "rarity_color": "#8A2BE2"},
{"name": "芦笋", "color": "#9ACD32", "icon": "🌱", "rarity_color": "#8A2BE2"},
{"name": "茄子", "color": "#9400D3", "icon": "🌱", "rarity_color": "#8A2BE2"},
{"name": "向日葵", "color": "#FFD700", "icon": "🌱", "rarity_color": "#8A2BE2"},
{"name": "蕨菜", "color": "#228B22", "icon": "🌱", "rarity_color": "#8A2BE2"}
],
"传奇": [
{"name": "西瓜", "color": "#FF69B4", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "甘蔗", "color": "#DDA0DD", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "香草", "color": "#98FB98", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "甜菜", "color": "#DC143C", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "人参", "color": "#DAA520", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "富贵竹", "color": "#32CD32", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "芦荟", "color": "#9ACD32", "icon": "🌱", "rarity_color": "#FF8C00"},
{"name": "哈密瓜", "color": "#FFB6C1", "icon": "🌱", "rarity_color": "#FF8C00"}
]
}
}
# =============================================================================
# 系统初始化
# =============================================================================
func _ready() -> void:
visibility_changed.connect(_on_visibility_changed)
_initialize_system()
func _initialize_system() -> void:
"""初始化签到系统"""
daily_check_in_reward.hide()
today_date = Time.get_date_string_from_system()
_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", "")
@@ -140,71 +35,39 @@ func handle_daily_check_in_response(response: Dictionary) -> void:
consecutive_days = response.get("consecutive_days", 0)
has_checked_in_today = true
# 显示奖励
_show_reward_animation(rewards)
# 更新按钮状态
_set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1))
# 发送完成信号
check_in_completed.emit(rewards)
# 发送奖励信号
for reward_type in rewards.keys():
if reward_type == "seeds":
for seed_reward in rewards.seeds:
reward_claimed.emit("seed_" + seed_reward.name, seed_reward.quantity)
elif reward_type in ["coins", "exp", "bonus_coins", "bonus_exp"]:
reward_claimed.emit(reward_type, rewards[reward_type])
Toast.show(message, Color.GREEN)
print("签到成功: ", message)
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)
print("签到失败: ", message)
## 处理服务器签到数据响应
func handle_check_in_data_response(response: Dictionary) -> void:
var success = response.get("success", false)
if success:
check_in_data = response.get("check_in_data", {})
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)
today_date = response.get("current_date", Time.get_date_string_from_system())
# 更新显示
_update_display()
_check_daily_status()
# 发送数据加载完成信号
check_in_data_loaded.emit(check_in_data)
print("签到数据加载成功,连续签到:", consecutive_days, "")
else:
print("加载签到数据失败")
# =============================================================================
# 核心业务逻辑
# =============================================================================
## 检查今日签到状态
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)
@@ -214,41 +77,30 @@ func execute_check_in() -> void:
Toast.show("未连接到服务器,无法签到", Color.RED)
return
# 发送签到请求到服务器
tcp_network_manager_panel.sendDailyCheckIn()
daily_check_in_button.disabled = true
daily_check_in_button.text = "签到中..."
# 3秒后重新启用按钮防止网络超时
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 _show_reward_animation(rewards: Dictionary) -> void:
daily_check_in_reward.text = _format_reward_text(rewards)
daily_check_in_reward.show()
# 创建动画效果
var tween = create_tween()
tween.parallel().tween_method(_animate_reward_display, 0.0, 1.0, 0.5)
## 奖励显示动画
func _animate_reward_display(progress: float) -> void:
daily_check_in_reward.modulate.a = progress
var scale = 0.8 + (0.2 * progress)
daily_check_in_reward.scale = Vector2(scale, scale)
# =============================================================================
# UI显示格式化
# =============================================================================
## 格式化奖励显示文本
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
@@ -257,58 +109,32 @@ func _format_reward_text(rewards: Dictionary) -> String:
else:
text += "\n"
# 基础奖励
if rewards.has("coins"):
text += "[color=%s]%s +%d %s[/color]\n" % [
reward_configs.coins.color,
reward_configs.coins.icon,
rewards.coins,
reward_configs.coins.name
]
text += "[color=#FFD700]💰 +%d 金币[/color]\n" % rewards.coins
if rewards.has("exp"):
text += "[color=%s]%s +%d %s[/color]\n" % [
reward_configs.exp.color,
reward_configs.exp.icon,
rewards.exp,
reward_configs.exp.name
]
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)
# 从配置中找到对应的种子信息
var seed_info = _get_seed_info(seed_name, quality)
if seed_info:
text += "[color=%s]%s[/color] [color=%s]%s[/color] x%d [color=%s](%s)[/color]\n" % [
seed_info.color, seed_info.icon, seed_info.color, seed_name, quantity, seed_info.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=%s]%s +%d %s[/color] [color=#FFD700]✨[/color]\n" % [
reward_configs.coins.color,
reward_configs.coins.icon,
rewards.bonus_coins,
reward_configs.coins.name
]
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=%s]%s +%d %s[/color] [color=#FFD700]✨[/color]\n" % [
reward_configs.exp.color,
reward_configs.exp.icon,
rewards.bonus_exp,
reward_configs.exp.name
]
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
@@ -318,6 +144,8 @@ func _format_reward_text(rewards: Dictionary) -> String:
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
@@ -325,52 +153,18 @@ func _format_reward_text(rewards: Dictionary) -> String:
return text
## 获取种子信息
func _get_seed_info(seed_name: String, quality: String) -> Dictionary:
if quality in reward_configs.seeds:
for seed in reward_configs.seeds[quality]:
if seed.name == seed_name:
return seed
return {}
func _get_rarity_color(rarity: String) -> String:
match rarity:
"普通": return "#90EE90"
"优良": return "#87CEEB"
"稀有": return "#DDA0DD"
"史诗": return "#9932CC"
"传奇": return "#FF8C00"
_: return "#FFFFFF"
## 格式化历史记录文本
func _format_history_text(date: String, rewards: Dictionary) -> String:
var text = "[color=#87CEEB]📅 %s[/color] " % date
var reward_parts = []
if rewards.has("coins"):
reward_parts.append("[color=%s]%s %d[/color]" % [
reward_configs.coins.color,
reward_configs.coins.name,
rewards.coins
])
if rewards.has("exp"):
reward_parts.append("[color=%s]%s %d[/color]" % [
reward_configs.exp.color,
reward_configs.exp.name,
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 seed_info = _get_seed_info(seed_name, quality)
if seed_info:
reward_parts.append("[color=%s]%s x%d[/color]" % [
seed_info.color, seed_name, quantity
])
text += " ".join(reward_parts)
return text
## 更新显示内容
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:
@@ -380,61 +174,43 @@ func _update_display() -> void:
history_text += "\n"
if check_in_data.size() == 0:
if check_in_history.size() == 0:
history_text += "[center][color=#DDDDDD]暂无签到记录[/color][/center]"
else:
# 按日期排序显示历史记录
var sorted_dates = check_in_data.keys()
sorted_dates.sort()
sorted_dates.reverse() # 最新的在前
# 按时间排序显示历史记录
var sorted_times = check_in_history.keys()
sorted_times.sort()
sorted_times.reverse()
for date in sorted_dates:
var day_data = check_in_data[date]
var rewards = day_data.get("rewards", {})
var day_consecutive = day_data.get("consecutive_days", 1)
history_text += _format_history_text(date, rewards)
history_text += " [color=#90EE90](连续%d天)[/color]\n" % day_consecutive
history_text += "-----------------------------------------------------------------------------------------------------------------\n"
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:
execute_check_in()
#面板显示与隐藏切换处理
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
pass
else:
GlobalVariables.isZoomDisabled = false
pass
# =============================================================================
# 公共接口方法 - 供主游戏调用
# =============================================================================
## 刷新签到数据
# 公共接口
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,
"today_date": today_date
"consecutive_days": consecutive_days
}

View File

@@ -1,79 +1,46 @@
extends Panel
class_name LuckyDrawPanel
signal draw_completed(rewards: Array, draw_type: String)
signal draw_failed(error_message: String)
signal draw_completed(rewards: Array, draw_type: String) # 抽奖完成信号
signal reward_obtained(reward_type: String, amount: int) # 奖励获得信号
signal draw_failed(error_message: String) # 抽奖失败信号
#这个展示抽奖获得的奖励
@onready var lucky_draw_reward: RichTextLabel = $LuckyDrawReward
#这个是展示有哪些奖励选项最多15个奖励就在这里面随机挑选
@onready var grid: GridContainer = $Grid
#这个是奖励模板
@onready var reward_item: RichTextLabel = $Grid/RewardItem
@onready var main_game = get_node("/root/main")
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
var reward_templates: Array[RichTextLabel] = []
var current_rewards: Array = []
@onready var main_game = get_node("/root/main")
@onready var daily_check_in_panel: DailyCheckInPanel = $'../DailyCheckInPanel'
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
@onready var item_store_panel: Panel = $'../ItemStorePanel'
@onready var item_bag_panel: Panel = $'../ItemBagPanel'
@onready var player_bag_panel: Panel = $'../PlayerBagPanel'
@onready var crop_warehouse_panel: Panel = $'../CropWarehousePanel'
@onready var crop_store_panel: Panel = $'../CropStorePanel'
@onready var player_ranking_panel: Panel = $'../PlayerRankingPanel'
@onready var login_panel: PanelContainer = $'../LoginPanel'
# 15种不同的模板颜色
var template_colors: Array[Color] = [
Color(1.0, 0.8, 0.8, 1.0), # 淡红色
Color(0.8, 1.0, 0.8, 1.0), # 淡绿色
Color(0.8, 0.8, 1.0, 1.0), # 淡蓝色
Color(1.0, 1.0, 0.8, 1.0), # 淡黄色
Color(1.0, 0.8, 1.0, 1.0), # 淡紫色
Color(0.8, 1.0, 1.0, 1.0), # 淡青色
Color(1.0, 0.9, 0.8, 1.0), # 淡橙色
Color(0.9, 0.8, 1.0, 1.0), # 淡紫蓝色
Color(0.8, 1.0, 0.9, 1.0), # 淡薄荷色
Color(1.0, 0.8, 0.9, 1.0), # 淡粉色
Color(0.9, 1.0, 0.8, 1.0), # 淡柠檬色
Color(0.8, 0.9, 1.0, 1.0), # 淡天蓝色
Color(1.0, 0.95, 0.8, 1.0), # 淡香槟色
Color(0.85, 0.8, 1.0, 1.0), # 淡薰衣草色
Color(0.95, 1.0, 0.85, 1.0) # 淡春绿色
]
var seed_rewards: Dictionary = {}
var anticipation_tween: Tween = null
# 15种模板颜色
var template_colors: Array[Color] = [
Color(1.0, 0.8, 0.8, 1.0), Color(0.8, 1.0, 0.8, 1.0), Color(0.8, 0.8, 1.0, 1.0),
Color(1.0, 1.0, 0.8, 1.0), Color(1.0, 0.8, 1.0, 1.0), Color(0.8, 1.0, 1.0, 1.0),
Color(1.0, 0.9, 0.8, 1.0), Color(0.9, 0.8, 1.0, 1.0), Color(0.8, 1.0, 0.9, 1.0),
Color(1.0, 0.8, 0.9, 1.0), Color(0.9, 1.0, 0.8, 1.0), Color(0.8, 0.9, 1.0, 1.0),
Color(1.0, 0.95, 0.8, 1.0), Color(0.85, 0.8, 1.0, 1.0), Color(0.95, 1.0, 0.85, 1.0)
]
var base_rewards: Dictionary = {
"coins": {"name": "金币", "icon": "💰", "color": "#FFD700"},
"exp": {"name": "经验", "icon": "", "color": "#00BFFF"},
"empty": {"name": "谢谢惠顾", "icon": "😅", "color": "#CCCCCC"}
}
var seed_rewards: Dictionary = {}
# 抽奖费用配置
var draw_costs: Dictionary = {
"single": 800,
"five": 3600, # 800 * 5 * 0.9 = 3600
"ten": 6400 # 800 * 10 * 0.8 = 6400
"five": 3600,
"ten": 6400
}
var server_reward_pools: Dictionary = {}
func _ready() -> void:
visibility_changed.connect(_on_visibility_changed)
_initialize_system()
#初始化抽奖系统
func _initialize_system() -> void:
# 连接信号
if main_game:
draw_completed.connect(main_game._on_lucky_draw_completed)
draw_failed.connect(main_game._on_lucky_draw_failed)
@@ -83,21 +50,18 @@ func _initialize_system() -> void:
_generate_reward_templates()
_update_template_display()
#从主游戏加载作物数据并构建种子奖励
func _load_crop_data_and_build_rewards() -> void:
if main_game and main_game.has_method("get_crop_data"):
var crop_data = main_game.get_crop_data()
if crop_data:
_build_seed_rewards_from_crop_data(crop_data)
#根据 crop_data.json 构建种子奖励配置
func _build_seed_rewards_from_crop_data(crop_data: Dictionary) -> void:
seed_rewards.clear()
for crop_name in crop_data.keys():
var crop_info = crop_data[crop_name]
# 跳过测试作物和不能购买的作物
if crop_name == "测试作物" or not crop_info.get("能否购买", true):
continue
@@ -105,59 +69,43 @@ func _build_seed_rewards_from_crop_data(crop_data: Dictionary) -> void:
var rarity_color = _get_rarity_color(quality)
seed_rewards[crop_name] = {
"icon": "🌱",
"color": rarity_color,
"icon": "🌱",
"color": rarity_color,
"rarity": quality,
"level": crop_info.get("等级", 1),
"cost": crop_info.get("花费", 50)
}
#根据稀有度获取颜色
func _get_rarity_color(rarity: String) -> String:
match rarity:
"普通":
return "#90EE90"
"优良":
return "#87CEEB"
"稀有":
return "#DDA0DD"
"史诗":
return "#9932CC"
"传奇":
return "#FF8C00"
_:
return "#FFFFFF"
"普通": return "#90EE90"
"优良": return "#87CEEB"
"稀有": return "#DDA0DD"
"史诗": return "#9932CC"
"传奇": return "#FF8C00"
_: return "#FFFFFF"
## 生成15个奖励模板
func _generate_reward_templates() -> void:
# 清空现有模板
for child in grid.get_children():
if child != reward_item:
child.queue_free()
reward_templates.clear()
# 生成15个模板包括原有的一个
for i in range(15):
var template: RichTextLabel
if i == 0:
# 使用原有的模板
template = reward_item
else:
# 创建新的模板
template = reward_item.duplicate()
grid.add_child(template)
# 设置不同的颜色
template.self_modulate = template_colors[i]
template.bbcode_enabled = true
template.threaded = true
reward_templates.append(template)
## 更新模板显示
func _update_template_display() -> void:
var sample_rewards = _generate_sample_rewards()
@@ -170,16 +118,13 @@ func _update_template_display() -> void:
else:
template.hide()
## 生成示例奖励显示
func _generate_sample_rewards() -> Array:
var sample_rewards = []
# 添加基础奖励示例
sample_rewards.append({"type": "coins", "amount_range": [100, 300], "rarity": "普通"})
sample_rewards.append({"type": "exp", "amount_range": [50, 150], "rarity": "普通"})
sample_rewards.append({"type": "empty", "name": "谢谢惠顾", "rarity": "空奖"})
# 添加各品质种子示例
var quality_examples = ["普通", "优良", "稀有", "史诗", "传奇"]
for quality in quality_examples:
var example_seeds = []
@@ -188,26 +133,22 @@ func _generate_sample_rewards() -> Array:
example_seeds.append(seed_name)
if example_seeds.size() > 0:
var seed_name = example_seeds[0] # 取第一个作为示例
var seed_name = example_seeds[0]
sample_rewards.append({
"type": "seed",
"name": seed_name,
"type": "seed",
"name": seed_name,
"rarity": quality,
"amount_range": [1, 3] if quality != "传奇" else [1, 1]
})
# 添加礼包示例
sample_rewards.append({"type": "package", "name": "成长套餐", "rarity": "优良"})
sample_rewards.append({"type": "package", "name": "稀有礼包", "rarity": "稀有"})
sample_rewards.append({"type": "package", "name": "传奇大礼包", "rarity": "传奇"})
# 添加高级奖励示例
sample_rewards.append({"type": "coins", "amount_range": [1000, 2000], "rarity": "史诗"})
sample_rewards.append({"type": "exp", "amount_range": [500, 1000], "rarity": "传奇"})
return sample_rewards.slice(0, 15) # 只取前15个
return sample_rewards.slice(0, 15)
## 格式化模板文本
func _format_template_text(reward: Dictionary) -> String:
var text = "[center]"
@@ -251,44 +192,30 @@ func _format_template_text(reward: Dictionary) -> String:
text += "[/center]"
return text
## 执行网络抽奖
func _perform_network_draw(draw_type: String) -> void:
if not tcp_network_manager_panel or not tcp_network_manager_panel.is_connected_to_server():
_show_error_message("网络未连接,无法进行抽奖")
return
# 检查费用
var cost = draw_costs.get(draw_type, 800)
if main_game and main_game.money < cost:
_show_error_message("金币不足,需要 %d 金币" % cost)
return
# 发送抽奖请求
var success = tcp_network_manager_panel.sendLuckyDraw(draw_type)
if not success:
_show_error_message("发送抽奖请求失败")
return
# 显示等待动画
_show_waiting_animation(draw_type)
_show_waiting_animation()
## 显示等待动画
func _show_waiting_animation(draw_type: String) -> void:
# 禁用抽奖按钮
func _show_waiting_animation() -> void:
_set_draw_buttons_enabled(false)
# 隐藏结果区域
lucky_draw_reward.hide()
# 播放期待动画
_play_anticipation_animation()
## 处理服务器抽奖响应
func handle_lucky_draw_response(response: Dictionary) -> void:
# 停止期待动画
_stop_anticipation_animation()
# 重新启用按钮
_set_draw_buttons_enabled(true)
if response.get("success", false):
@@ -296,44 +223,30 @@ func handle_lucky_draw_response(response: Dictionary) -> void:
var draw_type = response.get("draw_type", "single")
var cost = response.get("cost", 0)
# 显示抽奖结果
_show_server_draw_results(rewards, draw_type, cost)
# 发送信号
draw_completed.emit(rewards, draw_type)
else:
var error_message = response.get("message", "抽奖失败")
_show_error_message(error_message)
draw_failed.emit(error_message)
## 显示服务器返回的抽奖结果
func _show_server_draw_results(rewards: Array, draw_type: String, cost: int) -> void:
current_rewards = rewards
# 显示结果动画已在handle_lucky_draw_response中停止
var result_text = _format_server_draw_results(rewards, draw_type, cost)
lucky_draw_reward.text = result_text
lucky_draw_reward.show()
# 播放结果动画
_play_result_animation()
## 格式化服务器抽奖结果文本
func _format_server_draw_results(rewards: Array, draw_type: String, cost: int) -> String:
var type_names = {
"single": "单抽",
"five": "五连抽",
"ten": "十连抽"
}
var type_names = {"single": "单抽", "five": "五连抽", "ten": "十连抽"}
var text = "[center][color=#FFD700]🎊 %s结果 🎊[/color][/center]\n" % type_names.get(draw_type, draw_type)
text += "[center][color=#87CEEB]消费 %d 金币[/color][/center]\n" % cost
# 统计稀有度
var stats = _count_server_reward_rarity(rewards)
# 显示稀有度统计
var stat_parts = []
if stats.legendary > 0:
stat_parts.append("[color=#FF8C00]🏆传奇x%d[/color]" % stats.legendary)
@@ -349,11 +262,9 @@ func _format_server_draw_results(rewards: Array, draw_type: String, cost: int) -
text += "\n"
# 显示具体奖励
for reward in rewards:
text += _format_single_server_reward(reward) + "\n"
# 鼓励文案
if stats.empty_only:
text += "[center][color=#87CEEB]💪 别灰心,下次一定能中大奖![/color][/center]"
elif stats.legendary > 0:
@@ -363,28 +274,16 @@ func _format_server_draw_results(rewards: Array, draw_type: String, cost: int) -
return text
## 统计服务器奖励稀有度
func _count_server_reward_rarity(rewards: Array) -> Dictionary:
var stats = {
"legendary": 0,
"epic": 0,
"rare": 0,
"package": 0,
"empty": 0,
"empty_only": false
}
var stats = {"legendary": 0, "epic": 0, "rare": 0, "package": 0, "empty": 0, "empty_only": false}
for reward in rewards:
var rarity = reward.get("rarity", "普通")
match rarity:
"传奇":
stats.legendary += 1
"史诗":
stats.epic += 1
"稀有":
stats.rare += 1
"空奖":
stats.empty += 1
"传奇": stats.legendary += 1
"史诗": stats.epic += 1
"稀有": stats.rare += 1
"空奖": stats.empty += 1
if reward.get("type") == "package":
stats.package += 1
@@ -392,21 +291,17 @@ func _count_server_reward_rarity(rewards: Array) -> Dictionary:
stats.empty_only = (stats.empty == rewards.size() and rewards.size() == 1)
return stats
## 格式化单个服务器奖励显示
func _format_single_server_reward(reward: Dictionary) -> String:
var text = ""
var reward_type = reward.get("type", "")
var rarity = reward.get("rarity", "普通")
var rarity_color = _get_rarity_color(rarity)
match reward_type:
"empty":
var reward_name = reward.get("name", "空奖励")
text = "[color=%s]😅 %s[/color]" % [rarity_color, reward_name]
return "[color=%s]😅 %s[/color]" % [rarity_color, reward.get("name", "空奖励")]
"package":
var reward_name = reward.get("name", "礼包")
text = "[color=%s]🎁 %s[/color]\n" % [rarity_color, reward_name]
var text = "[color=%s]🎁 %s[/color]\n" % [rarity_color, reward.get("name", "礼包")]
text += "[color=#DDDDDD]内含:[/color] "
var content_parts = []
@@ -417,50 +312,35 @@ func _format_single_server_reward(reward: Dictionary) -> String:
content_parts.append(part)
text += " ".join(content_parts)
return text
"coins":
var amount = reward.get("amount", 0)
text = "[color=%s]💰 金币 +%d[/color]" % [rarity_color, amount]
return "[color=%s]💰 金币 +%d[/color]" % [rarity_color, reward.get("amount", 0)]
"exp":
var amount = reward.get("amount", 0)
text = "[color=%s]⭐ 经验 +%d[/color]" % [rarity_color, amount]
return "[color=%s]⭐ 经验 +%d[/color]" % [rarity_color, reward.get("amount", 0)]
"seed":
var reward_name = reward.get("name", "种子")
var amount = reward.get("amount", 0)
text = "[color=%s]🌱 %s x%d[/color] [color=#CCCCCC](%s)[/color]" % [
rarity_color, reward_name, amount, rarity
return "[color=%s]🌱 %s x%d[/color] [color=#CCCCCC](%s)[/color]" % [
rarity_color, reward.get("name", "种子"), reward.get("amount", 0), rarity
]
_:
text = "[color=#CCCCCC]未知奖励[/color]"
return text
return "[color=#CCCCCC]未知奖励[/color]"
## 格式化礼包内容
func _format_package_content(content: Dictionary) -> String:
var content_type = content.get("type", "")
var amount = content.get("amount", 0)
match content_type:
"coins":
return "[color=#FFD700]💰%d[/color]" % amount
"exp":
return "[color=#00BFFF]⭐%d[/color]" % amount
"seed":
var seed_name = content.get("name", "种子")
return "[color=#90EE90]🌱%sx%d[/color]" % [seed_name, amount]
_:
return ""
"coins": return "[color=#FFD700]💰%d[/color]" % amount
"exp": return "[color=#00BFFF]⭐%d[/color]" % amount
"seed": return "[color=#90EE90]🌱%sx%d[/color]" % [content.get("name", "种子"), amount]
_: return ""
## 播放期待动画(简化版)
func _play_anticipation_animation() -> void:
"""播放期待动画"""
# 停止之前的动画
_stop_anticipation_animation()
# 创建简单的闪烁动画
anticipation_tween = create_tween()
anticipation_tween.set_loops()
@@ -468,72 +348,42 @@ func _play_anticipation_animation() -> void:
if template.visible:
anticipation_tween.parallel().tween_method(
func(progress: float): _anticipation_flash(template, progress),
0.0, 1.0, 0.5
0.0, 1.0, 0.8
)
func _anticipation_flash(template: RichTextLabel, progress: float) -> void:
"""期待动画闪烁效果"""
var flash_intensity = 1.0 + sin(progress * PI * 2) * 0.3
var flash_intensity = 1.0 + sin(progress * PI * 2) * 0.2
template.modulate = Color(flash_intensity, flash_intensity, flash_intensity, 1.0)
## 停止期待动画
func _stop_anticipation_animation() -> void:
if anticipation_tween:
anticipation_tween.kill()
anticipation_tween = null
# 恢复所有模板的正常颜色
for i in range(reward_templates.size()):
var template = reward_templates[i]
for template in reward_templates:
template.modulate = Color.WHITE
## 播放结果动画
func _play_result_animation() -> void:
var tween = create_tween()
# 奖励区域动画
lucky_draw_reward.modulate.a = 0.0
lucky_draw_reward.scale = Vector2(0.8, 0.8)
tween.parallel().tween_property(lucky_draw_reward, "modulate:a", 1.0, 0.5)
tween.parallel().tween_property(lucky_draw_reward, "scale", Vector2(1.0, 1.0), 0.5)
tween.tween_callback(func(): lucky_draw_reward.modulate.a = 1.0)
## 显示错误信息
func _show_error_message(message: String) -> void:
lucky_draw_reward.text = "[center][color=#FF6B6B]❌ %s[/color][/center]" % message
lucky_draw_reward.show()
# 2秒后隐藏错误信息
await get_tree().create_timer(2.0).timeout
lucky_draw_reward.hide()
# =============================================================================
# 事件处理
# =============================================================================
## 关闭面板
func _on_quit_button_pressed() -> void:
self.hide()
## 单次抽奖
func _on_lucky_draw_button_pressed() -> void:
_perform_network_draw("single")
## 五连抽
func _on_five_lucky_draw_button_pressed() -> void:
_perform_network_draw("five")
## 十连抽
func _on_ten_lucky_draw_button_pressed() -> void:
_perform_network_draw("ten")
## 设置抽奖按钮可用状态
func _set_draw_buttons_enabled(enabled: bool) -> void:
var buttons = [
$HBox/LuckyDrawButton,
$HBox/FiveLuckyDrawButton,
$HBox/FiveLuckyDrawButton,
$HBox/TenLuckyDrawButton
]
@@ -541,30 +391,33 @@ func _set_draw_buttons_enabled(enabled: bool) -> void:
if button:
button.disabled = not enabled
# =============================================================================
# 公共接口方法
# =============================================================================
# 事件处理
func _on_quit_button_pressed() -> void:
self.hide()
## 获取当前奖励结果
func _on_lucky_draw_button_pressed() -> void:
_perform_network_draw("single")
func _on_five_lucky_draw_button_pressed() -> void:
_perform_network_draw("five")
func _on_ten_lucky_draw_button_pressed() -> void:
_perform_network_draw("ten")
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
else:
GlobalVariables.isZoomDisabled = false
# 公共接口
func get_current_rewards() -> Array:
return current_rewards
## 清空抽奖结果
func clear_draw_results() -> void:
current_rewards.clear()
lucky_draw_reward.hide()
## 刷新奖励显示(当作物数据更新时调用)
func refresh_reward_display() -> void:
_load_crop_data_and_build_rewards()
_update_template_display()
#面板显示与隐藏切换处理
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
pass
else:
GlobalVariables.isZoomDisabled = false
pass