前几天忘了上传了上传一下

This commit is contained in:
2025-07-09 17:37:10 +08:00
parent 3ccd7e93ed
commit 68a9508f4d
1526 changed files with 60713 additions and 9496 deletions

View File

@@ -0,0 +1,393 @@
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