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

334 lines
10 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends Panel
# 这是道具商店面板,用来展示各种道具
# 道具商店格子容器
@onready var store_grid: GridContainer = $ScrollContainer/Store_Grid
@onready var quit_button : Button = $QuitButton
@onready var refresh_button : Button = $RefreshButton
# 预添加常用的面板
@onready var main_game = get_node("/root/main")
@onready var lucky_draw_panel: LuckyDrawPanel = $'../LuckyDrawPanel'
@onready var daily_check_in_panel: DailyCheckInPanel = $'../DailyCheckInPanel'
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
@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'
@onready var batch_buy_popup: PanelContainer = $'../../DiaLog/BatchBuyPopup'
# 道具配置数据
var item_config : Dictionary = {}
# 准备函数
func _ready():
# 连接关闭按钮信号
quit_button.pressed.connect(self._on_quit_button_pressed)
# 连接可见性改变信号
visibility_changed.connect(_on_visibility_changed)
# 隐藏面板(初始默认隐藏)
self.hide()
# 初始化道具商店
func init_item_store():
# 从主游戏脚本获取道具配置数据
_load_item_config_from_main()
# 重置筛选状态为显示全部
current_filter_type = "全部"
update_item_store_ui()
# 更新道具商店UI
func update_item_store_ui():
# 清空道具商店格子
for child in store_grid.get_children():
child.queue_free()
print("更新道具商店UI道具种类", item_config.size(), ",当前筛选:", current_filter_type)
# 统计符合筛选条件的道具数量
var filtered_count = 0
# 为每个道具配置创建按钮
for item_name in item_config.keys():
# 检查是否符合筛选条件
if not _is_item_match_filter(item_name):
continue
var item_info = item_config[item_name]
var item_cost = item_info.get("花费", 0)
var item_desc = item_info.get("描述", "暂无描述")
# 创建道具按钮
var button = _create_item_button(item_name, item_cost, item_desc)
# 更新按钮文本显示价格
button.text = str(item_name + "\n价格:" + str(item_cost) + "")
# 连接购买点击事件
button.pressed.connect(func(): _on_store_item_selected(item_name, item_cost, item_desc))
store_grid.add_child(button)
filtered_count += 1
print("筛选后显示道具数量:", filtered_count)
# 创建道具按钮
func _create_item_button(item_name: String, item_cost: int, item_desc: String) -> Button:
# 使用橙色按钮作为道具商店按钮的样式
var button = main_game.item_button.duplicate()
# 确保按钮可见并可点击
button.visible = true
button.disabled = false
button.focus_mode = Control.FOCUS_ALL
# 设置按钮文本
button.text = item_name
# 添加工具提示
button.tooltip_text = str(
"道具: " + item_name + "\n" +
"价格: " + str(item_cost) + "\n" +
"描述: " + item_desc + "\n" +
"点击购买道具"
)
# 如果按钮有标题标签,设置标题
if button.has_node("Title"):
button.get_node("Title").text = "商店"
button.get_node("Title").modulate = Color.GOLD # 商店标题使用金色
# 更新按钮的道具图片
_update_button_item_image(button, item_name)
return button
# 从主游戏脚本获取道具配置数据
func _load_item_config_from_main():
# 从主游戏脚本的全局变量获取道具配置数据
if main_game.item_config_data.size() > 0:
item_config = main_game.item_config_data
print("道具商店:从主游戏脚本获取道具配置数据,道具种类:", item_config.size())
else:
print("道具商店:主游戏脚本中没有道具配置数据,使用空配置")
item_config = {}
# 商店道具点击处理 - 购买道具
func _on_store_item_selected(item_name: String, item_cost: int, item_desc: String):
# 检查玩家金钱是否足够至少能买1个
if main_game.money < item_cost:
Toast.show("金钱不足!需要 " + str(item_cost) + " 元,当前只有 " + str(main_game.money) + "", Color.RED, 3.0, 1.0)
return
# 显示批量购买弹窗
if batch_buy_popup:
batch_buy_popup.show_buy_popup(
item_name,
item_cost,
item_desc,
"item",
_on_confirm_buy_item,
_on_cancel_buy_item
)
else:
print("批量购买弹窗未找到")
# 显示购买确认对话框
func _show_buy_confirmation_dialog(item_name: String, item_cost: int, item_desc: String):
# 创建确认对话框
var confirm_dialog = AcceptDialog.new()
confirm_dialog.dialog_text = str(
"确认购买道具?\n\n" +
"道具名称: " + item_name + "\n" +
"购买价格: " + str(item_cost) + "\n" +
"道具描述: " + item_desc + "\n\n" +
"当前金钱: " + str(main_game.money) + "\n" +
"购买后余额: " + str(main_game.money - item_cost) + ""
)
confirm_dialog.title = "购买道具确认"
confirm_dialog.ok_button_text = "确认购买"
confirm_dialog.add_cancel_button("取消")
# 添加到场景
add_child(confirm_dialog)
# 连接信号
confirm_dialog.confirmed.connect(_on_confirm_buy_item.bind(item_name, item_cost, confirm_dialog))
confirm_dialog.canceled.connect(_on_cancel_buy_item.bind(confirm_dialog))
# 显示对话框
confirm_dialog.popup_centered()
# 确认购买道具(批量购买版本)
func _on_confirm_buy_item(item_name: String, unit_cost: int, quantity: int, buy_type: String):
var total_cost = unit_cost * quantity
# 再次检查金钱是否足够
if main_game.money < total_cost:
Toast.show("金钱不足!需要 " + str(total_cost) + " 元,当前只有 " + str(main_game.money) + "", Color.RED, 3.0, 1.0)
return
# 发送批量购买请求到服务器
_send_batch_buy_item_request(item_name, unit_cost, quantity)
# 取消购买道具(批量购买版本)
func _on_cancel_buy_item():
print("取消购买道具")
# 发送批量购买道具请求
func _send_batch_buy_item_request(item_name: String, unit_cost: int, quantity: int):
# 发送批量购买请求到服务器
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("sendBuyItem"):
if tcp_network_manager_panel.sendBuyItem(item_name, unit_cost, quantity):
# 服务器会处理批量购买逻辑,客户端等待响应
print("已发送批量购买道具请求:", item_name, " 数量:", quantity)
else:
Toast.show("购买请求发送失败", Color.RED, 2.0, 1.0)
else:
Toast.show("网络管理器不可用", Color.RED, 2.0, 1.0)
# 将道具添加到道具背包(客户端同步)
func _add_item_to_bag(item_name: String):
# 确保道具背包存在
if "道具背包" not in main_game:
main_game["道具背包"] = []
# 查找是否已存在该道具
var found = false
for item in main_game["道具背包"]:
if item.get("name") == item_name:
item["count"] += 1
found = true
break
# 如果不存在,添加新道具
if not found:
main_game["道具背包"].append({
"name": item_name,
"count": 1
})
# 更新按钮的道具图片
func _update_button_item_image(button: Button, item_name: String):
# 检查按钮是否有CropImage节点
var item_image = button.get_node_or_null("CropImage")
if not item_image:
print("道具商店按钮没有找到CropImage节点", button.name)
return
# 从配置文件获取道具图片路径
var texture = null
if item_config.has(item_name):
var item_info = item_config[item_name]
var image_path = item_info.get("道具图片", "")
if image_path != "" and ResourceLoader.exists(image_path):
# 尝试加载道具图片
texture = load(image_path)
if texture:
pass
else:
print("加载道具图片失败:", item_name, " -> ", image_path)
else:
print("道具图片路径无效或不存在:", item_name, " -> ", image_path)
# 如果没有找到道具图片,尝试使用默认道具图片
if not texture:
var default_item_path = "res://assets/道具图片/默认道具.webp"
if ResourceLoader.exists(default_item_path):
texture = load(default_item_path)
if texture:
print("使用默认道具图片:", item_name)
# 设置图片
if texture:
# CropImage是Sprite2D直接设置texture属性
item_image.texture = texture
item_image.visible = true
print("道具商店更新道具图片:", item_name)
else:
# 如果没有图片,隐藏图片节点
item_image.visible = false
print("道具商店无法获取道具图片:", item_name)
#=========================面板通用处理=========================
#手动刷新道具商店面板
func _on_refresh_button_pressed() -> void:
# 重新初始化道具商店
init_item_store()
Toast.show("道具商店已刷新", Color.GREEN, 2.0, 1.0)
# 关闭道具商店面板
func _on_quit_button_pressed() -> void:
self.hide()
pass
#面板显示与隐藏切换处理
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
# 面板显示时自动刷新数据
init_item_store()
pass
else:
GlobalVariables.isZoomDisabled = false
pass
#=========================面板通用处理=========================
#========================筛选功能============================
# 当前筛选类型
var current_filter_type: String = "全部"
#显示全部,既全部显示(默认)
func _on_all_filter_pressed() -> void:
current_filter_type = "全部"
update_item_store_ui()
Toast.show("显示全部道具", Color.GREEN, 2.0, 1.0)
#筛选宠物类型道具
func _on_pet_filter_pressed() -> void:
current_filter_type = "宠物道具"
update_item_store_ui()
Toast.show("筛选宠物道具", Color.GREEN, 2.0, 1.0)
#筛选作物类型道具
func _on_crop_filter_pressed() -> void:
current_filter_type = "作物道具"
update_item_store_ui()
Toast.show("筛选作物道具", Color.GREEN, 2.0, 1.0)
#筛选农场类型道具
func _on_farm_filter_pressed() -> void:
current_filter_type = "农场道具"
update_item_store_ui()
Toast.show("筛选农场道具", Color.GREEN, 2.0, 1.0)
# 检查道具是否符合当前筛选条件
func _is_item_match_filter(item_name: String) -> bool:
# 如果是显示全部直接返回true
if current_filter_type == "全部":
return true
# 检查道具配置中的类型
if item_config.has(item_name):
var item_info = item_config[item_name]
var item_type = item_info.get("类型", "")
return item_type == current_filter_type
# 如果没有配置信息,默认不显示
return false
#========================筛选功能============================