Files
Sprout-Farm/GUI/LandPanel.gd
2025-06-28 14:39:37 +08:00

599 lines
20 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
#获取玩家要操作的地块序号
var selected_lot_index = 0
#预添加常用的面板
@onready var main_game = get_node("/root/main")
@onready var land_panel = get_node("/root/main/UI/LandPanel")
@onready var crop_store_panel = get_node("/root/main/UI/PlayerBagPanel")
@onready var player_ranking_panel = get_node("/root/main/UI/PlayerRankingPanel")
@onready var player_bag_panel = get_node("/root/main/UI/PlayerBagPanel")
@onready var network_manager = get_node("/root/main/UI/TCPNetworkManager")
@onready var quit_button :Button = $Quit_Button
@onready var dig_button: Button = $Grid/Dig_Button #开垦
@onready var water_button: Button = $Grid/Water_Button #浇水
@onready var fertilize_button: Button = $Grid/Fertilize_Button #施肥
@onready var upgrade_button: Button = $Grid/Upgrade_Button #升级
@onready var plant_button: Button = $Grid/Plant_Button #种植
@onready var remove_button: Button = $Grid/Remove_Button #铲除
@onready var harvest_button: Button = $Grid/Harvest_Button #收获
@onready var kill_insect_button: Button = $Grid/KillInsect_Button #杀虫
#下面这些来实时获取被点击地块的作物情况
@onready var crop_texture_rect: TextureRect = $TextureRect #这个显示作物当前图片
@onready var progress_bar: ProgressBar = $VBox/ProgressBar #显示作物当前生长进度
@onready var cost: Label = $VBox/HBox1/cost #显示花费
@onready var earn: Label = $VBox/HBox1/earn #显示收益
@onready var growthtime: Label = $VBox/HBox1/growthtime #生长时间
@onready var experience: Label = $VBox/HBox1/experience #收获经验
@onready var canbuy: Label = $VBox/HBox2/canbuy #能否购买
@onready var quality: Label = $VBox/HBox2/quality #作物品质
@onready var weatherability: Label = $VBox/HBox2/weatherability #耐候性
@onready var level: Label = $VBox/HBox2/level #种植等级
@onready var description: Label = $VBox/HBox3/description #描述
#没有作物直接一键隐藏这个
@onready var v_box: VBoxContainer = $VBox
func _ready():
self.hide()
quit_button.pressed.connect(self._on_quit_button_pressed)
dig_button.pressed.connect(self._on_dig_button_pressed)
water_button.pressed.connect(self._on_water_button_pressed)
fertilize_button.pressed.connect(self._on_fertilize_button_pressed)
upgrade_button.pressed.connect(self._on_upgrade_button_pressed)
plant_button.pressed.connect(self._on_plant_button_pressed)
remove_button.pressed.connect(self._on_remove_button_pressed)
harvest_button.pressed.connect(self._on_harvest_button_pressed)
# 显示浇水、施肥、升级按钮
water_button.visible = true
fertilize_button.visible = true
upgrade_button.visible = true
_update_button_texts()
# 显示面板时更新按钮状态
func show_panel():
self.show()
_update_button_texts()
_update_button_availability()
_update_crop_info()
# 更新按钮可用性
func _update_button_availability():
if main_game.is_visiting_mode:
# 访问模式下禁用一些按钮
dig_button.hide()
remove_button.hide()
upgrade_button.hide()
plant_button.hide()
# 启用允许的按钮
water_button.show()
fertilize_button.show()
harvest_button.show()
else:
# 自己农场模式下启用所有按钮
dig_button.show()
remove_button.show()
upgrade_button.show()
plant_button.show()
water_button.show()
fertilize_button.show()
harvest_button.show()
# 更新按钮文本
func _update_button_texts():
# 根据是否访问模式显示不同的按钮文本
if main_game.is_visiting_mode:
water_button.text = "帮助浇水"+"\n¥50"
fertilize_button.text = "帮助施肥"+"\n¥150"
harvest_button.text = "偷菜"
else:
dig_button.text = "开垦"+"\n"+str(main_game.dig_money)
remove_button.text = "铲除"+"\n¥500"
water_button.text = "浇水"+"\n¥50"
fertilize_button.text = "施肥"+"\n¥150"
# 升级按钮动态显示
_update_upgrade_button_text()
harvest_button.text = "收获"
# 更新升级按钮文本
func _update_upgrade_button_text():
if not main_game or not main_game.farm_lots:
upgrade_button.text = "升级\n¥1000"
return
if selected_lot_index >= 0 and selected_lot_index < main_game.farm_lots.size():
var lot = main_game.farm_lots[selected_lot_index]
var current_level = int(lot.get("土地等级", 0)) # 确保是整数
var upgrade_config = {
0: {"cost": 1000, "name": "黄土地"},
1: {"cost": 2000, "name": "红土地"},
2: {"cost": 4000, "name": "紫土地"},
3: {"cost": 8000, "name": "黑土地"}
}
if current_level >= 4:
upgrade_button.text = "已满级"
elif upgrade_config.has(current_level):
var config = upgrade_config[current_level]
upgrade_button.text = "升级到\n" + config["name"] + "\n" + str(config["cost"])
else:
upgrade_button.text = "等级异常\n" + str(current_level)
else:
upgrade_button.text = "选择地块"
#=====================================土地面板功能处理=========================================
#开垦
func _on_dig_button_pressed():
# 检查是否处于访问模式
if main_game.is_visiting_mode:
Toast.show("访问模式下无法开垦土地", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查玩家金钱是否足够
var dig_cost = main_game.dig_money
if main_game.money < dig_cost:
Toast.show("金钱不足,开垦土地需要 " + str(dig_cost) + " 金钱", Color.RED, 2.0, 1.0)
self.hide()
return
# 检查地块是否已经开垦
var lot = main_game.farm_lots[selected_lot_index]
if lot.get("is_diged", false):
Toast.show("此地块已经开垦过了", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 发送开垦土地请求到服务器
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendDigGround(selected_lot_index):
self.hide()
else:
Toast.show("发送开垦请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
Toast.show("网络未连接,无法开垦土地", Color.RED, 2.0, 1.0)
self.hide()
#浇水
func _on_water_button_pressed():
# 检查玩家金钱是否足够(无论是否访问模式都检查自己的钱)
var water_cost = 50
var my_money = main_game.money
# 如果是访问模式,需要检查自己的原始金钱数据
if main_game.is_visiting_mode:
my_money = main_game.original_player_data.get("money", 0)
if my_money < water_cost:
var action_text = "帮助浇水" if main_game.is_visiting_mode else "浇水"
Toast.show("金钱不足," + action_text + "需要 " + str(water_cost) + " 金钱", Color.RED, 2.0, 1.0)
self.hide()
return
# 检查地块状态
var lot = main_game.farm_lots[selected_lot_index]
if not lot.get("is_planted", false) or lot.get("crop_type", "") == "":
Toast.show("此地块没有种植作物", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查作物是否已死亡
if lot.get("is_dead", false):
Toast.show("死亡的作物无法浇水", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查是否已经成熟
if lot.get("grow_time", 0) >= lot.get("max_grow_time", 1):
Toast.show("作物已经成熟,无需浇水", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查是否已经浇过水
var current_time = Time.get_unix_time_from_system()
var last_water_time = lot.get("浇水时间", 0)
var water_cooldown = 3600 # 1小时冷却时间
if current_time - last_water_time < water_cooldown:
var remaining_time = water_cooldown - (current_time - last_water_time)
var remaining_minutes = int(remaining_time / 60)
var remaining_seconds = int(remaining_time) % 60
Toast.show("浇水冷却中,还需等待 " + str(remaining_minutes) + " 分钟 " + str(remaining_seconds) + "", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 发送浇水请求到服务器
var target_username = ""
if main_game.is_visiting_mode:
target_username = main_game.visited_player_data.get("user_name", "")
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendWaterCrop(selected_lot_index, target_username):
self.hide()
else:
Toast.show("发送浇水请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
var action_text = "帮助浇水" if main_game.is_visiting_mode else "浇水"
Toast.show("网络未连接,无法" + action_text, Color.RED, 2.0, 1.0)
self.hide()
#施肥
func _on_fertilize_button_pressed():
# 检查玩家金钱是否足够(无论是否访问模式都检查自己的钱)
var fertilize_cost = 150
var my_money = main_game.money
# 如果是访问模式,需要检查自己的原始金钱数据
if main_game.is_visiting_mode:
my_money = main_game.original_player_data.get("money", 0)
if my_money < fertilize_cost:
var action_text = "帮助施肥" if main_game.is_visiting_mode else "施肥"
Toast.show("金钱不足," + action_text + "需要 " + str(fertilize_cost) + " 金钱", Color.RED, 2.0, 1.0)
self.hide()
return
# 检查地块状态
var lot = main_game.farm_lots[selected_lot_index]
if not lot.get("is_planted", false) or lot.get("crop_type", "") == "":
Toast.show("此地块没有种植作物", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查作物是否已死亡
if lot.get("is_dead", false):
Toast.show("死亡的作物无法施肥", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查是否已经成熟
if lot.get("grow_time", 0) >= lot.get("max_grow_time", 1):
Toast.show("作物已经成熟,无需施肥", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查是否已经施过肥
if lot.get("已施肥", false):
Toast.show("此作物已经施过肥了", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 发送施肥请求到服务器
var target_username = ""
if main_game.is_visiting_mode:
target_username = main_game.visited_player_data.get("user_name", "")
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendFertilizeCrop(selected_lot_index, target_username):
self.hide()
else:
Toast.show("发送施肥请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
var action_text = "帮助施肥" if main_game.is_visiting_mode else "施肥"
Toast.show("网络未连接,无法" + action_text, Color.RED, 2.0, 1.0)
self.hide()
#升级
func _on_upgrade_button_pressed():
# 检查是否处于访问模式
if main_game.is_visiting_mode:
Toast.show("访问模式下无法升级", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查地块索引是否有效
if selected_lot_index < 0 or selected_lot_index >= main_game.farm_lots.size():
Toast.show("无效的地块选择", Color.RED, 2.0, 1.0)
self.hide()
return
# 获取地块数据
var lot = main_game.farm_lots[selected_lot_index]
# 检查地块是否已开垦
if not lot.get("is_diged", false):
Toast.show("此地块尚未开垦", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 获取当前土地等级和升级配置
var current_level = int(lot.get("土地等级", 0)) # 确保是整数
print("当前选择地块索引: ", selected_lot_index)
print("当前土地等级: ", current_level, " (类型: ", typeof(current_level), ")")
var upgrade_config = {
0: {"cost": 1000, "name": "黄土地", "speed": "2倍"},
1: {"cost": 2000, "name": "红土地", "speed": "4倍"},
2: {"cost": 4000, "name": "紫土地", "speed": "6倍"},
3: {"cost": 8000, "name": "黑土地", "speed": "10倍"}
}
# 检查是否已达到最高等级
if current_level >= 4:
Toast.show("此土地已达到最高等级(黑土地)", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查土地等级是否有效
if not upgrade_config.has(current_level):
Toast.show("土地等级数据异常,当前等级: " + str(current_level), Color.RED, 2.0, 1.0)
print("土地等级异常,当前等级: ", current_level, ",可用等级: ", upgrade_config.keys())
self.hide()
return
var config = upgrade_config[current_level]
var upgrade_cost = config["cost"]
var next_name = config["name"]
var speed_info = config["speed"]
# 检查玩家金钱是否足够
if main_game.money < upgrade_cost:
Toast.show("金钱不足,升级到" + next_name + "需要 " + str(upgrade_cost) + " 金钱", Color.RED, 2.0, 1.0)
self.hide()
return
# 发送升级请求到服务器
if network_manager and network_manager.is_connected_to_server():
print("发送升级请求,地块索引: ", selected_lot_index, ",当前等级: ", current_level)
if network_manager.sendUpgradeLand(selected_lot_index):
self.hide()
else:
Toast.show("发送升级请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
Toast.show("网络未连接,无法升级土地", Color.RED, 2.0, 1.0)
self.hide()
#种植
func _on_plant_button_pressed():
# 检查是否处于访问模式
if main_game.is_visiting_mode:
Toast.show("访问模式下无法种植", Color.ORANGE, 2.0, 1.0)
self.hide()
return
player_bag_panel.show()
self.hide()
pass
#铲除
func _on_remove_button_pressed():
# 检查是否处于访问模式
if main_game.is_visiting_mode:
Toast.show("访问模式下无法铲除作物", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查玩家金钱是否足够
var removal_cost = 500
if main_game.money < removal_cost:
Toast.show("金钱不足,铲除作物需要 " + str(removal_cost) + " 金钱", Color.RED, 2.0, 1.0)
self.hide()
return
# 检查地块是否有作物
var lot = main_game.farm_lots[selected_lot_index]
if not lot.get("is_planted", false) or lot.get("crop_type", "") == "":
Toast.show("此地块没有种植作物", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 发送铲除作物请求到服务器
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendRemoveCrop(selected_lot_index):
self.hide()
else:
Toast.show("发送铲除请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
Toast.show("网络未连接,无法铲除作物", Color.RED, 2.0, 1.0)
self.hide()
pass
#收获
func _on_harvest_button_pressed():
# 检查地块状态
var lot = main_game.farm_lots[selected_lot_index]
if not lot.get("is_planted", false) or lot.get("crop_type", "") == "":
Toast.show("此地块没有种植作物", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 检查作物是否成熟
if lot.get("grow_time", 0) < lot.get("max_grow_time", 1) and not lot.get("is_dead", false):
Toast.show("作物尚未成熟", Color.ORANGE, 2.0, 1.0)
self.hide()
return
# 发送收获请求到服务器
var target_username = ""
if main_game.is_visiting_mode:
target_username = main_game.visited_player_data.get("user_name", "")
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendHarvestCrop(selected_lot_index, target_username):
self.hide()
else:
Toast.show("发送收获请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
var action_text = "偷菜" if main_game.is_visiting_mode else "收获"
Toast.show("网络未连接,无法" + action_text, Color.RED, 2.0, 1.0)
self.hide()
pass
#=====================================土地面板功能处理=========================================
#关闭土地面板按钮
func _on_quit_button_pressed():
self.hide()
pass
# 更新作物信息显示
func _update_crop_info():
print("调试_update_crop_info 被调用selected_lot_index = ", selected_lot_index)
if not main_game or not main_game.farm_lots:
print("调试main_game 或 farm_lots 不存在")
v_box.hide()
crop_texture_rect.hide()
return
if selected_lot_index < 0 or selected_lot_index >= main_game.farm_lots.size():
print("调试selected_lot_index 无效: ", selected_lot_index, " / ", main_game.farm_lots.size())
v_box.hide()
crop_texture_rect.hide()
return
var lot = main_game.farm_lots[selected_lot_index]
print("调试:地块数据: ", lot)
# 检查地块是否有作物
if not lot.get("is_planted", false) or lot.get("crop_type", "") == "":
print("调试:地块没有作物")
v_box.hide()
crop_texture_rect.hide()
# 清除所有显示内容
crop_texture_rect.texture = null
progress_bar.value = 0
cost.text = ""
earn.text = ""
growthtime.text = ""
experience.text = ""
canbuy.text = ""
quality.text = ""
weatherability.text = ""
level.text = ""
description.text = ""
return
# 获取作物类型
var crop_type = lot.get("crop_type", "")
print("调试:作物类型: ", crop_type)
# 从网络管理器获取作物数据
var crop_data = null
if network_manager and network_manager.has_method("get_crop_data"):
crop_data = network_manager.get_crop_data()
# 如果没有作物数据,尝试从主游戏获取
if not crop_data and main_game and main_game.has_method("get_crop_data"):
crop_data = main_game.get_crop_data()
# 如果仍然没有作物数据,隐藏信息面板
if not crop_data or not crop_data.has(crop_type):
print("调试:没有作物数据或作物类型不存在: ", crop_type)
v_box.hide()
crop_texture_rect.hide()
return
print("调试:找到作物数据,开始显示作物信息")
# 显示作物信息面板
v_box.show()
crop_texture_rect.show()
# 获取作物信息
var crop_info = crop_data[crop_type]
print("调试:作物信息: ", crop_info)
# 更新作物图片
var crop_texture_path = "res://assets/作物/" + crop_type + "/0.webp"
if ResourceLoader.exists(crop_texture_path):
var texture = load(crop_texture_path)
crop_texture_rect.texture = texture
else:
# 如果没有序列帧,尝试加载单个图片
crop_texture_path = "res://assets/作物/" + crop_type + ".webp"
if ResourceLoader.exists(crop_texture_path):
var texture = load(crop_texture_path)
crop_texture_rect.texture = texture
else:
# 加载默认图片
crop_texture_path = "res://assets/作物/默认/0.webp"
if ResourceLoader.exists(crop_texture_path):
var texture = load(crop_texture_path)
crop_texture_rect.texture = texture
else:
crop_texture_rect.texture = null
# 更新进度条
var grow_time = lot.get("grow_time", 0)
var max_grow_time = lot.get("max_grow_time", 1)
var progress = float(grow_time) / float(max_grow_time) * 100.0
progress_bar.value = min(progress, 100.0)
# 更新作物信息标签
cost.text = "花费: ¥" + str(crop_info.get("花费", 0))
earn.text = "收益: ¥" + str(crop_info.get("收益", 0))
# 格式化生长时间
var growth_seconds = crop_info.get("生长时间", 0)
var growth_time_text = _format_time_seconds(growth_seconds)
growthtime.text = "生长时间: " + growth_time_text
experience.text = "经验: " + str(crop_info.get("经验", 0))
canbuy.text = "可购买: " + ("" if crop_info.get("能否购买", false) else "")
quality.text = "品质: " + str(crop_info.get("品质", "普通"))
weatherability.text = "耐候性: " + str(crop_info.get("耐候性", 0))
level.text = "等级要求: " + str(crop_info.get("等级", 1))
# 检查是否为杂草,显示特殊描述并控制收获按钮
var is_weed = crop_info.get("是否杂草", false)
if is_weed:
description.text = "描述: " + str(crop_info.get("描述", "无描述")) + " [杂草不能收获,只能铲除]"
# 隐藏收获按钮(杂草不能收获)
harvest_button.hide()
else:
description.text = "描述: " + str(crop_info.get("描述", "无描述"))
# 显示收获按钮并设置正常文本
harvest_button.show()
if main_game.is_visiting_mode:
harvest_button.text = "偷菜"
else:
harvest_button.text = "收获"
# 格式化时间(秒转换为时分秒)
func _format_time_seconds(seconds: int) -> String:
var hours = seconds / 3600
var minutes = (seconds % 3600) / 60
var secs = seconds % 60
if hours > 0:
return str(hours) + "" + str(minutes) + "" + str(secs) + ""
elif minutes > 0:
return str(minutes) + "" + str(secs) + ""
else:
return str(secs) + ""