394 lines
14 KiB
GDScript
394 lines
14 KiB
GDScript
extends Panel
|
||
|
||
@onready var water_button: Button = $HBox/WaterButton #给智慧树浇水
|
||
@onready var fertilize_button: Button = $HBox/FertilizeButton #给智慧树施肥
|
||
@onready var play_music_button: Button = $HBox/PlayMusicButton #给智慧树放音乐
|
||
@onready var kill_bug_button: Button = $HBox/KillBugButton #给智慧树杀虫
|
||
@onready var kill_grass_button: Button = $HBox/KillGrassButton #给智慧树除草
|
||
@onready var revive_button: Button = $HBox/ReviveButton #智慧树死亡后需点击此处复活花费1000元
|
||
|
||
@onready var talk_input: LineEdit = $VBox/HBox/TalkInput #输入要发送给陌生人的一句话
|
||
@onready var send_button: Button = $VBox/HBox/SendButton #发送按钮
|
||
|
||
@onready var level: Label = $Grid/Level #玩家智慧树等级
|
||
@onready var health: Label = $Grid/Health #玩家智慧树生命值
|
||
@onready var experience: Label = $Grid/Experience #玩家智慧树经验值
|
||
@onready var height: Label = $Grid/Height #玩家智慧树高度
|
||
|
||
@onready var quit_button: Button = $QuitButton #退出按钮
|
||
|
||
@onready var tcp_network_manager_panel: Panel = $'../../BigPanel/TCPNetworkManagerPanel' #客户端与服务端通信核心
|
||
@onready var login_panel: PanelContainer = $'../../BigPanel/LoginPanel' #登录时要加载玩家智慧树状态
|
||
|
||
@onready var accept_dialog: AcceptDialog = $'../../DiaLog/AcceptDialog'
|
||
|
||
# 主游戏节点引用
|
||
@onready var main_game = get_node("/root/main")
|
||
|
||
# 智慧树配置数据
|
||
var wisdom_tree_config = {
|
||
"智慧树显示的话": "",
|
||
"等级": 1,
|
||
"当前经验值": 0,
|
||
"最大经验值": 100,
|
||
"当前生命值": 100,
|
||
"最大生命值": 100,
|
||
"高度": 20
|
||
}
|
||
|
||
# 智慧树升级经验计算函数(使用动态公式)
|
||
func calculate_wisdom_tree_max_exp(level):
|
||
if level <= 1:
|
||
return 100
|
||
# 使用指数增长公式:基础经验 * (等级^1.5) * 1.2
|
||
var base_exp = 50
|
||
var exp_multiplier = 1.2
|
||
var level_factor = pow(level, 1.5)
|
||
var max_exp = int(base_exp * level_factor * exp_multiplier)
|
||
return max_exp
|
||
|
||
|
||
# 确保智慧树配置格式正确,兼容旧格式
|
||
func _ensure_config_format():
|
||
# 如果是旧格式,转换为新格式
|
||
if wisdom_tree_config.has("生命值") and not wisdom_tree_config.has("当前生命值"):
|
||
var old_health = wisdom_tree_config.get("生命值", 100)
|
||
wisdom_tree_config["当前生命值"] = old_health
|
||
wisdom_tree_config["最大生命值"] = 100
|
||
wisdom_tree_config.erase("生命值")
|
||
|
||
if wisdom_tree_config.has("经验") and not wisdom_tree_config.has("当前经验值"):
|
||
var old_exp = wisdom_tree_config.get("经验", 0)
|
||
wisdom_tree_config["当前经验值"] = old_exp
|
||
var level = wisdom_tree_config.get("等级", 1)
|
||
wisdom_tree_config["最大经验值"] = calculate_wisdom_tree_max_exp(level)
|
||
wisdom_tree_config.erase("经验")
|
||
|
||
# 确保所有必需字段存在
|
||
if not wisdom_tree_config.has("当前生命值"):
|
||
wisdom_tree_config["当前生命值"] = 100
|
||
if not wisdom_tree_config.has("最大生命值"):
|
||
wisdom_tree_config["最大生命值"] = 100
|
||
if not wisdom_tree_config.has("当前经验值"):
|
||
wisdom_tree_config["当前经验值"] = 0
|
||
if not wisdom_tree_config.has("最大经验值"):
|
||
var level = wisdom_tree_config.get("等级", 1)
|
||
wisdom_tree_config["最大经验值"] = calculate_wisdom_tree_max_exp(level)
|
||
if not wisdom_tree_config.has("等级"):
|
||
wisdom_tree_config["等级"] = 1
|
||
if not wisdom_tree_config.has("高度"):
|
||
wisdom_tree_config["高度"] = 20
|
||
if not wisdom_tree_config.has("智慧树显示的话"):
|
||
wisdom_tree_config["智慧树显示的话"] = ""
|
||
|
||
func _ready() -> void:
|
||
self.hide()
|
||
|
||
# 连接按钮信号
|
||
water_button.pressed.connect(_on_water_button_pressed)
|
||
fertilize_button.pressed.connect(_on_fertilize_button_pressed)
|
||
play_music_button.pressed.connect(_on_play_music_button_pressed)
|
||
kill_bug_button.pressed.connect(_on_kill_bug_button_pressed)
|
||
kill_grass_button.pressed.connect(_on_kill_grass_button_pressed)
|
||
revive_button.pressed.connect(_on_revive_button_pressed)
|
||
send_button.pressed.connect(_on_send_button_pressed)
|
||
quit_button.pressed.connect(_on_quit_button_pressed)
|
||
visibility_changed.connect(_on_visibility_changed)
|
||
|
||
# 加载智慧树数据
|
||
load_wisdom_tree_data()
|
||
|
||
# 更新UI显示
|
||
update_ui()
|
||
|
||
# 加载智慧树数据
|
||
func load_wisdom_tree_data():
|
||
if main_game and main_game.login_data.has("智慧树配置"):
|
||
wisdom_tree_config = main_game.login_data["智慧树配置"]
|
||
else:
|
||
# 如果没有数据,使用默认值
|
||
wisdom_tree_config = {
|
||
"智慧树显示的话": "",
|
||
"等级": 1,
|
||
"经验": 0,
|
||
"生命值": 100,
|
||
"高度": 20
|
||
}
|
||
|
||
# 更新UI显示
|
||
func update_ui():
|
||
# 确保配置数据格式正确,兼容旧格式
|
||
_ensure_config_format()
|
||
|
||
level.text = "等级: " + str(wisdom_tree_config["等级"])
|
||
var current_health = wisdom_tree_config["当前生命值"]
|
||
var max_health = wisdom_tree_config["最大生命值"]
|
||
health.text = "生命值: " + str(current_health) + "/" + str(max_health)
|
||
var current_exp = wisdom_tree_config["当前经验值"]
|
||
var max_exp = wisdom_tree_config["最大经验值"]
|
||
experience.text = "经验: " + str(current_exp) + "/" + str(max_exp)
|
||
height.text = "高度: " + str(wisdom_tree_config["高度"]) + "cm"
|
||
|
||
# 检查是否处于访问模式
|
||
var is_visiting_mode = main_game and main_game.is_visiting_mode
|
||
|
||
# 根据生命值设置颜色
|
||
if current_health <= 0:
|
||
health.modulate = Color.RED
|
||
revive_button.show()
|
||
# 智慧树死亡时禁用其他按钮
|
||
_set_buttons_enabled(false)
|
||
elif current_health <= max_health * 0.3: # 生命值低于30%
|
||
health.modulate = Color.ORANGE
|
||
revive_button.hide()
|
||
_set_buttons_enabled(not is_visiting_mode) # 访问模式下禁用按钮
|
||
else:
|
||
health.modulate = Color.GREEN
|
||
revive_button.hide()
|
||
_set_buttons_enabled(not is_visiting_mode) # 访问模式下禁用按钮
|
||
|
||
# 访问模式下的特殊处理
|
||
if is_visiting_mode:
|
||
revive_button.hide()
|
||
talk_input.editable = false
|
||
talk_input.placeholder_text = "访问模式下无法发送消息"
|
||
send_button.disabled = true
|
||
send_button.text = "访问模式"
|
||
else:
|
||
talk_input.editable = true
|
||
talk_input.placeholder_text = "在这里输入(*´∀ ˋ*)"
|
||
send_button.disabled = false
|
||
send_button.text = "发送"
|
||
|
||
# 获取下一等级需要的经验
|
||
func get_next_level_experience() -> int:
|
||
var current_level = wisdom_tree_config["等级"]
|
||
if current_level >= 20:
|
||
return 99999 # 最大等级
|
||
return calculate_wisdom_tree_max_exp(current_level + 1)
|
||
|
||
# 设置按钮启用状态
|
||
func _set_buttons_enabled(enabled: bool):
|
||
water_button.disabled = !enabled
|
||
fertilize_button.disabled = !enabled
|
||
play_music_button.disabled = !enabled
|
||
kill_bug_button.disabled = !enabled
|
||
kill_grass_button.disabled = !enabled
|
||
send_button.disabled = !enabled
|
||
|
||
# 显示操作确认弹窗
|
||
func show_operation_confirm(operation_type: String, cost: int, description: String):
|
||
if accept_dialog:
|
||
accept_dialog.set_dialog_title("确认操作")
|
||
accept_dialog.set_dialog_content("确定要" + description + "吗?\n费用:" + str(cost) + "金币")
|
||
accept_dialog.show()
|
||
|
||
# 连接确认信号
|
||
if not accept_dialog.confirmed.is_connected(_on_operation_confirmed):
|
||
accept_dialog.confirmed.connect(_on_operation_confirmed.bind(operation_type))
|
||
else:
|
||
# 断开之前的连接,重新连接
|
||
accept_dialog.confirmed.disconnect(_on_operation_confirmed)
|
||
accept_dialog.confirmed.connect(_on_operation_confirmed.bind(operation_type))
|
||
|
||
# 操作确认回调
|
||
func _on_operation_confirmed(operation_type: String):
|
||
# 发送操作请求到服务器
|
||
tcp_network_manager_panel.send_wisdom_tree_operation(operation_type)
|
||
|
||
# 浇水按钮
|
||
func _on_water_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] <= 0:
|
||
Toast.show("智慧树已死亡,请先复活!", Color.RED)
|
||
return
|
||
|
||
show_operation_confirm("water", 100, "给智慧树浇水")
|
||
|
||
# 施肥按钮
|
||
func _on_fertilize_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] <= 0:
|
||
Toast.show("智慧树已死亡,请先复活!", Color.RED)
|
||
return
|
||
|
||
show_operation_confirm("fertilize", 200, "给智慧树施肥")
|
||
|
||
# 除草按钮
|
||
func _on_kill_grass_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] <= 0:
|
||
Toast.show("智慧树已死亡,请先复活!", Color.RED)
|
||
return
|
||
|
||
show_operation_confirm("kill_grass", 150, "给智慧树除草")
|
||
|
||
# 杀虫按钮
|
||
func _on_kill_bug_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] <= 0:
|
||
Toast.show("智慧树已死亡,请先复活!", Color.RED)
|
||
return
|
||
|
||
show_operation_confirm("kill_bug", 150, "给智慧树杀虫")
|
||
|
||
# 放音乐按钮
|
||
func _on_play_music_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] <= 0:
|
||
Toast.show("智慧树已死亡,请先复活!", Color.RED)
|
||
return
|
||
|
||
show_operation_confirm("play_music", 100, "给智慧树放音乐")
|
||
|
||
# 复活按钮
|
||
func _on_revive_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法操作智慧树!", Color.YELLOW)
|
||
return
|
||
|
||
if wisdom_tree_config["当前生命值"] > 0:
|
||
Toast.show("智慧树还活着,不需要复活!", Color.YELLOW)
|
||
return
|
||
|
||
show_operation_confirm("revive", 1000, "复活智慧树")
|
||
|
||
# 发送消息按钮
|
||
func _on_send_button_pressed():
|
||
# 检查是否处于访问模式
|
||
if main_game and main_game.is_visiting_mode:
|
||
Toast.show("访问模式下无法发送消息!", Color.YELLOW)
|
||
return
|
||
|
||
var message = talk_input.text.strip_edges()
|
||
if message.is_empty():
|
||
Toast.show("请输入要发送的消息!", Color.YELLOW)
|
||
return
|
||
|
||
if message.length() > 100:
|
||
Toast.show("消息长度不能超过100个字符!", Color.RED)
|
||
return
|
||
|
||
# 发送消息到服务器
|
||
tcp_network_manager_panel.send_wisdom_tree_message(message)
|
||
|
||
# 清空输入框
|
||
talk_input.text = ""
|
||
|
||
# 退出按钮
|
||
func _on_quit_button_pressed():
|
||
self.hide()
|
||
|
||
# 处理智慧树操作响应
|
||
func handle_wisdom_tree_operation_response(success: bool, message: String, operation_type: String, updated_data: Dictionary):
|
||
if success:
|
||
# 更新智慧树配置
|
||
if updated_data.has("智慧树配置"):
|
||
wisdom_tree_config = updated_data["智慧树配置"]
|
||
# 同步更新MainGame中的智慧树配置
|
||
if main_game and main_game.login_data:
|
||
main_game.login_data["智慧树配置"] = wisdom_tree_config
|
||
|
||
# 更新玩家数据
|
||
if updated_data.has("money"):
|
||
main_game.money = updated_data["money"]
|
||
main_game._update_ui()
|
||
|
||
# 更新面板UI
|
||
update_ui()
|
||
|
||
# 同步更新MainGame中的智慧树显示
|
||
if main_game.has_method("update_wisdom_tree_display"):
|
||
main_game.update_wisdom_tree_display()
|
||
|
||
# 根据操作类型显示不同的提示
|
||
match operation_type:
|
||
"water":
|
||
Toast.show("浇水成功!" + message, Color.CYAN)
|
||
"fertilize":
|
||
Toast.show("施肥成功!" + message, Color.PURPLE)
|
||
"kill_grass":
|
||
Toast.show("除草成功!" + message, Color.GREEN)
|
||
"kill_bug":
|
||
Toast.show("杀虫成功!" + message, Color.GREEN)
|
||
"play_music":
|
||
Toast.show("放音乐成功!" + message, Color.MAGENTA)
|
||
# 放音乐时可能获得随机消息,需要特殊处理
|
||
if updated_data.has("random_message"):
|
||
var random_message = updated_data["random_message"]
|
||
if random_message != "":
|
||
# 更新智慧树显示的话
|
||
wisdom_tree_config["智慧树显示的话"] = random_message
|
||
if main_game and main_game.login_data:
|
||
main_game.login_data["智慧树配置"]["智慧树显示的话"] = random_message
|
||
# 再次更新MainGame显示
|
||
if main_game.has_method("update_wisdom_tree_display"):
|
||
main_game.update_wisdom_tree_display()
|
||
"revive":
|
||
Toast.show("智慧树复活成功!", Color.GOLD)
|
||
"get_random_message":
|
||
# 获取随机消息操作
|
||
if updated_data.has("random_message"):
|
||
var random_message = updated_data["random_message"]
|
||
if random_message != "":
|
||
# 更新智慧树显示的话
|
||
wisdom_tree_config["智慧树显示的话"] = random_message
|
||
if main_game and main_game.login_data:
|
||
main_game.login_data["智慧树配置"]["智慧树显示的话"] = random_message
|
||
# 更新MainGame显示
|
||
if main_game.has_method("update_wisdom_tree_display"):
|
||
main_game.update_wisdom_tree_display()
|
||
Toast.show("获得了新的智慧树消息!", Color.MAGENTA)
|
||
else:
|
||
Toast.show(message, Color.RED)
|
||
|
||
# 处理智慧树消息发送响应
|
||
func handle_wisdom_tree_message_response(success: bool, message: String, updated_data: Dictionary = {}):
|
||
if success:
|
||
# 更新玩家金钱
|
||
if updated_data.has("money"):
|
||
main_game.money = updated_data["money"]
|
||
main_game._update_ui()
|
||
|
||
Toast.show("消息发送成功!", Color.GREEN)
|
||
else:
|
||
Toast.show(message, Color.RED)
|
||
|
||
# 检查等级是否提升(此函数已不再需要,服务器端处理)
|
||
func check_level_up():
|
||
# 等级提升现在由服务器端处理,客户端只需要接收更新后的数据
|
||
pass
|
||
|
||
# 面板显示与隐藏切换处理
|
||
func _on_visibility_changed():
|
||
if visible:
|
||
GlobalVariables.isZoomDisabled = true
|
||
# 面板打开时主动请求最新的智慧树配置
|
||
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("send_get_wisdom_tree_config"):
|
||
tcp_network_manager_panel.send_get_wisdom_tree_config()
|
||
load_wisdom_tree_data()
|
||
update_ui()
|
||
else:
|
||
GlobalVariables.isZoomDisabled = false
|