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

258 lines
8.7 KiB
GDScript

extends Panel
@onready var scare_crow_1: Button = $BuyScareCrowHbox/ScareCrow1 #稻草人类型1
@onready var scare_crow_2: Button = $BuyScareCrowHbox/ScareCrow2 #稻草人类型2
@onready var scare_crow_3: Button = $BuyScareCrowHbox/ScareCrow3 #稻草人类型3
@onready var scare_crow_input: LineEdit = $HBox/ScareCrowInput #稻草人的昵称
@onready var scare_crow_name_color_input: ColorPickerButton = $HBox/ScareCrowNameColorInput #稻草人昵称的颜色
@onready var talk_1: LineEdit = $ScareCrowTalksGrid/Talk1 #稻草人展示的第一句话
@onready var talk_2: LineEdit = $ScareCrowTalksGrid/Talk2 #稻草人展示的第二句话
@onready var talk_3: LineEdit = $ScareCrowTalksGrid/Talk3 #稻草人展示的第三句话
@onready var talk_4: LineEdit = $ScareCrowTalksGrid/Talk4 #稻草人展示的第四句话
@onready var quit_button: Button = $QuitButton #关闭面板按钮
@onready var sure_button: Button = $HBox2/SureButton #确认修改按钮
@onready var color_picker_button_1: ColorPickerButton = $ScareCrowTalksColorGrid/ColorPickerButton1 #第一句话颜色
@onready var color_picker_button_2: ColorPickerButton = $ScareCrowTalksColorGrid/ColorPickerButton2 #第二句话颜色
@onready var color_picker_button_3: ColorPickerButton = $ScareCrowTalksColorGrid/ColorPickerButton3 #第三句话颜色
@onready var color_picker_button_4: ColorPickerButton = $ScareCrowTalksColorGrid/ColorPickerButton4 #第四句话颜色
# 引用主游戏和网络管理器
@onready var main_game = get_node("/root/main")
@onready var tcp_network_manager_panel: Panel = $'../../BigPanel/TCPNetworkManagerPanel'
# 稻草人配置数据
var scare_crow_config = {}
var player_scare_crow_config = {}
# 稻草人按钮数组
var scare_crow_buttons = []
func _ready():
# 初始化按钮数组
scare_crow_buttons = [scare_crow_1, scare_crow_2, scare_crow_3]
# 连接信号
scare_crow_1.pressed.connect(_on_scare_crow_1_pressed)
scare_crow_2.pressed.connect(_on_scare_crow_2_pressed)
scare_crow_3.pressed.connect(_on_scare_crow_3_pressed)
quit_button.pressed.connect(_on_quit_button_pressed)
sure_button.pressed.connect(_on_sure_button_pressed)
# 连接可见性改变信号
visibility_changed.connect(_on_visibility_changed)
# 加载稻草人配置
load_scare_crow_config()
# 初始化UI
update_ui()
# 加载稻草人配置
func load_scare_crow_config():
var file = FileAccess.open("res://Server/config/scare_crow_config.json", FileAccess.READ)
if file:
var json_text = file.get_as_text()
file.close()
var json = JSON.new()
var parse_result = json.parse(json_text)
if parse_result == OK:
scare_crow_config = json.get_data()
print("稻草人配置加载成功")
else:
print("稻草人配置JSON解析失败")
else:
print("无法读取稻草人配置文件")
# 更新UI显示
func update_ui():
if not scare_crow_config.has("稻草人类型"):
return
# 更新稻草人按钮
var scare_crow_types = scare_crow_config["稻草人类型"]
var type_names = ["稻草人1", "稻草人2", "稻草人3"]
for i in range(min(3, scare_crow_buttons.size())):
var button = scare_crow_buttons[i]
var type_name = type_names[i]
if scare_crow_types.has(type_name):
var price = scare_crow_types[type_name]["价格"]
var is_owned = player_scare_crow_config.get("已拥有稻草人类型", []).has(type_name)
if is_owned:
button.text = type_name + " (已拥有)"
button.disabled = false
button.modulate = Color.GREEN
else:
button.text = type_name + " (" + str(price) + "金币)"
button.disabled = false
button.modulate = Color.WHITE
else:
button.text = "未知类型"
button.disabled = true
# 更新当前稻草人配置
if player_scare_crow_config.has("稻草人昵称"):
scare_crow_input.text = player_scare_crow_config["稻草人昵称"]
# 更新昵称颜色
if player_scare_crow_config.has("稻草人昵称颜色"):
scare_crow_name_color_input.color = Color(player_scare_crow_config["稻草人昵称颜色"])
if player_scare_crow_config.has("稻草人说的话"):
var talks = player_scare_crow_config["稻草人说的话"]
if talks.has("第一句话"):
talk_1.text = talks["第一句话"]["内容"]
color_picker_button_1.color = Color(talks["第一句话"]["颜色"])
if talks.has("第二句话"):
talk_2.text = talks["第二句话"]["内容"]
color_picker_button_2.color = Color(talks["第二句话"]["颜色"])
if talks.has("第三句话"):
talk_3.text = talks["第三句话"]["内容"]
color_picker_button_3.color = Color(talks["第三句话"]["颜色"])
if talks.has("第四句话"):
talk_4.text = talks["第四句话"]["内容"]
color_picker_button_4.color = Color(talks["第四句话"]["颜色"])
# 设置玩家稻草人配置
func set_player_scare_crow_config(config: Dictionary):
player_scare_crow_config = config
update_ui()
# 购买/选择稻草人1
func _on_scare_crow_1_pressed():
handle_scare_crow_selection("稻草人1")
# 购买/选择稻草人2
func _on_scare_crow_2_pressed():
handle_scare_crow_selection("稻草人2")
# 购买/选择稻草人3
func _on_scare_crow_3_pressed():
handle_scare_crow_selection("稻草人3")
# 处理稻草人选择
func handle_scare_crow_selection(type_name: String):
var owned_types = player_scare_crow_config.get("已拥有稻草人类型", [])
if owned_types.has(type_name):
# 已拥有,选择为当前展示类型
# 发送修改请求到服务器保存展示类型
var config_data = {
"稻草人展示类型": type_name
}
# 发送修改请求(不需要费用,只是切换展示类型)
tcp_network_manager_panel.send_modify_scare_crow_config(config_data, 0)
Toast.show("正在切换到" + type_name + "...", Color.CYAN)
else:
# 未拥有,购买
var price = scare_crow_config["稻草人类型"][type_name]["价格"]
if main_game.money >= price:
# 发送购买请求
tcp_network_manager_panel.send_buy_scare_crow(type_name, price)
else:
Toast.show("金币不足,需要" + str(price) + "金币", Color.RED)
# 确认修改按钮
func _on_sure_button_pressed():
# 检查网络连接
if not tcp_network_manager_panel.is_connected_to_server():
Toast.show("未连接到服务器", Color.RED)
return
# 获取修改费用
var modify_cost = scare_crow_config.get("修改稻草人配置花费", 300)
# 检查金币是否足够
if main_game.money < modify_cost:
Toast.show("金币不足,修改配置需要" + str(modify_cost) + "金币", Color.RED)
return
# 准备配置数据
var config_data = {
"稻草人昵称": scare_crow_input.text,
"稻草人昵称颜色": scare_crow_name_color_input.color.to_html(),
"稻草人说的话": {
"第一句话": {
"内容": talk_1.text,
"颜色": color_picker_button_1.color.to_html()
},
"第二句话": {
"内容": talk_2.text,
"颜色": color_picker_button_2.color.to_html()
},
"第三句话": {
"内容": talk_3.text,
"颜色": color_picker_button_3.color.to_html()
},
"第四句话": {
"内容": talk_4.text,
"颜色": color_picker_button_4.color.to_html()
}
}
}
# 发送修改请求
tcp_network_manager_panel.send_modify_scare_crow_config(config_data, modify_cost)
# 关闭面板按钮
func _on_quit_button_pressed():
hide()
# 处理购买稻草人响应
func handle_buy_scare_crow_response(success: bool, message: String, updated_data: Dictionary):
if success:
Toast.show(message, Color.GREEN)
# 更新玩家数据
if updated_data.has("钱币"):
main_game.money = updated_data["钱币"]
if updated_data.has("稻草人配置"):
player_scare_crow_config = updated_data["稻草人配置"]
# 更新UI
main_game._update_ui()
update_ui()
# 更新主游戏中的稻草人显示
if main_game.has_method("update_scare_crow_display"):
main_game.update_scare_crow_display()
else:
Toast.show(message, Color.RED)
# 处理修改稻草人配置响应
func handle_modify_scare_crow_config_response(success: bool, message: String, updated_data: Dictionary):
if success:
Toast.show(message, Color.GREEN)
# 更新玩家数据
if updated_data.has("钱币"):
main_game.money = updated_data["钱币"]
if updated_data.has("稻草人配置"):
player_scare_crow_config = updated_data["稻草人配置"]
# 更新UI
main_game._update_ui()
update_ui()
# 更新主游戏中的稻草人显示
if main_game.has_method("update_scare_crow_display"):
main_game.update_scare_crow_display()
else:
Toast.show(message, Color.RED)
# 面板显示时的处理
func _on_visibility_changed():
if visible:
# 请求最新的稻草人配置
if tcp_network_manager_panel.is_connected_to_server():
tcp_network_manager_panel.send_get_scare_crow_config()
GlobalVariables.isZoomDisabled = true
else:
GlobalVariables.isZoomDisabled = false