Files
Sprout-Farm/Script/SmallPanel/LandPanel.gd
2025-07-12 14:33:41 +08:00

638 lines
21 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 lucky_draw_panel: LuckyDrawPanel = $'../../BigPanel/LuckyDrawPanel'
@onready var daily_check_in_panel: DailyCheckInPanel = $'../../BigPanel/DailyCheckInPanel'
@onready var tcp_network_manager_panel: Panel = $'../../BigPanel/TCPNetworkManagerPanel'
@onready var item_store_panel: Panel = $'../../BigPanel/ItemStorePanel'
@onready var item_bag_panel: Panel = $'../../BigPanel/ItemBagPanel'
@onready var player_bag_panel: Panel = $'../../BigPanel/PlayerBagPanel'
@onready var crop_warehouse_panel: Panel = $'../../BigPanel/CropWarehousePanel'
@onready var crop_store_panel: Panel = $'../../BigPanel/CropStorePanel'
@onready var player_ranking_panel: Panel = $'../../BigPanel/PlayerRankingPanel'
@onready var login_panel: PanelContainer = $'../../BigPanel/LoginPanel'
#土地面板功能
@onready var quit_button :Button = $Quit_Button
@onready var dig_button: Button = $GroundFunctionGrid/Dig_Button
@onready var plant_button: Button = $GroundFunctionGrid/Plant_Button
@onready var harvest_button: Button = $GroundFunctionGrid/Harvest_Button
@onready var upgrade_button: Button = $GroundFunctionGrid/Upgrade_Button
#展示被点击土地上的作物信息如果没有作物就隐藏crop_inform_v_box
@onready var crop_inform_v_box: VBoxContainer = $InformVBox/CropInformVBox
@onready var progress_bar: ProgressBar = $InformVBox/CropInformVBox/ProgressBar #作物生长进度
@onready var cost: Label = $InformVBox/CropInformVBox/HBox1/cost #作物购买花费
@onready var earn: Label = $InformVBox/CropInformVBox/HBox1/earn #作物收益
@onready var growthtime: Label = $InformVBox/CropInformVBox/HBox1/growthtime #作物生长时间精确到天时分秒
@onready var experience: Label = $InformVBox/CropInformVBox/HBox1/experience #作物收获经验
@onready var canbuy: Label = $InformVBox/CropInformVBox/HBox2/canbuy #作物能否在商店购买
@onready var quality: Label = $InformVBox/CropInformVBox/HBox2/quality #作物品质
@onready var weatherability: Label = $InformVBox/CropInformVBox/HBox2/weatherability #作物耐候性
@onready var level: Label = $InformVBox/CropInformVBox/HBox2/level #作物等级
@onready var description: Label = $InformVBox/CropInformVBox/HBox3/description #作物描述
@onready var crop_texture_rect: TextureRect = $CropImageVBox/CropTextureRect #作物当前图片
#展示被点击土地的地块信息
@onready var ground_level: Label = $InformVBox/GroundInformVBox/GroundLevel #土地等级
@onready var ground_function: Label = $InformVBox/GroundInformVBox/GroundFunction #土地功能
func _ready():
self.hide()
dig_button.pressed.connect(self._on_dig_button_pressed)
upgrade_button.pressed.connect(self._on_upgrade_button_pressed)
plant_button.pressed.connect(self._on_plant_button_pressed)
harvest_button.pressed.connect(self._on_harvest_button_pressed)
upgrade_button.visible = true
_update_button_texts()
# 显示面板时更新按钮状态
func show_panel():
self.show()
_update_button_texts()
_update_button_availability()
_update_panel_information() # 添加更新面板信息
# 更新按钮可用性
func _update_button_availability():
if main_game.is_visiting_mode:
# 访问模式下禁用一些按钮
dig_button.hide()
upgrade_button.hide()
plant_button.hide()
# 启用允许的按钮
harvest_button.show()
else:
# 自己农场模式下启用所有按钮
dig_button.show()
upgrade_button.show()
plant_button.show()
harvest_button.show()
# 更新按钮文本
func _update_button_texts():
# 根据是否访问模式显示不同的按钮文本
if main_game.is_visiting_mode:
harvest_button.text = "偷菜"
else:
dig_button.text = "开垦"+"\n"+str(main_game.dig_money)
# 升级按钮动态显示
_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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
if tcp_network_manager_panel.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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
if tcp_network_manager_panel.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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
if tcp_network_manager_panel.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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
print("发送升级请求,地块索引: ", selected_lot_index, ",当前等级: ", current_level)
if tcp_network_manager_panel.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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
if tcp_network_manager_panel.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 tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server():
if tcp_network_manager_panel.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 _on_refresh_button_pressed() -> void:
_update_panel_information()
Toast.show("面板信息已刷新", Color.GREEN, 1.5, 1.0)
#面板显示与隐藏切换处理
func _on_visibility_changed():
if visible:
GlobalVariables.isZoomDisabled = true
pass
else:
GlobalVariables.isZoomDisabled = false
pass
#=================面板通用函数==========================
# 更新面板信息显示
func _update_panel_information():
if selected_lot_index < 0 or selected_lot_index >= main_game.farm_lots.size():
print("无效的地块索引:", selected_lot_index)
return
var lot = main_game.farm_lots[selected_lot_index]
# 更新土地信息
_update_ground_information(lot)
# 检查是否有作物
if lot.get("is_planted", false) and lot.get("crop_type", "") != "":
# 有作物,显示作物信息
crop_inform_v_box.show()
_update_crop_information(lot)
_update_crop_texture(lot)
else:
# 没有作物,隐藏作物信息框
crop_inform_v_box.hide()
crop_texture_rect.hide()
# 更新作物信息
func _update_crop_information(lot: Dictionary):
var crop_name = lot.get("crop_type", "")
var grow_time = float(lot.get("grow_time", 0))
var max_grow_time = float(lot.get("max_grow_time", 1))
var is_dead = lot.get("is_dead", false)
var is_watered = lot.get("已浇水", false)
var is_fertilized = lot.get("已施肥", false)
# 从作物数据中获取详细信息
if main_game.can_planted_crop.has(crop_name):
var crop_data = main_game.can_planted_crop[crop_name]
# 更新作物基本信息
cost.text = "花费:" + str(crop_data.get("花费", 0)) + ""
earn.text = "收益:" + str(crop_data.get("收益", 0)) + ""
experience.text = "经验:" + str(crop_data.get("经验", 0)) + ""
quality.text = "品质:" + str(crop_data.get("品质", "未知"))
weatherability.text = "耐候性:" + str(crop_data.get("耐候性", 0))
level.text = "等级:" + str(crop_data.get("等级", 1))
description.text = "描述:" + str(crop_data.get("描述", "无描述"))
# 更新生长时间显示
var total_seconds = int(crop_data.get("生长时间", 0))
var time_str = _format_time_display(total_seconds)
growthtime.text = "生长时间:" + time_str
# 更新能否购买
var can_buy = crop_data.get("能否购买", false)
canbuy.text = "可购买:" + ("" if can_buy else "")
else:
# 作物数据不存在,显示基本信息
cost.text = "花费:未知"
earn.text = "收益:未知"
experience.text = "经验:未知"
quality.text = "品质:未知"
weatherability.text = "耐候性:未知"
level.text = "等级:未知"
description.text = "描述:作物数据未找到"
growthtime.text = "生长时间:未知"
canbuy.text = "可购买:未知"
# 更新生长进度条
if is_dead:
progress_bar.value = 0
progress_bar.modulate = Color.RED
progress_bar.show()
elif max_grow_time > 0:
var progress = clamp(grow_time / max_grow_time, 0.0, 1.0) * 100
progress_bar.value = progress
# 根据生长状态设置进度条颜色
if progress >= 100:
progress_bar.modulate = Color.GREEN # 成熟
elif is_fertilized:
progress_bar.modulate = Color.YELLOW # 已施肥
elif is_watered:
progress_bar.modulate = Color.CYAN # 已浇水
else:
progress_bar.modulate = Color.WHITE # 正常生长
progress_bar.show()
else:
progress_bar.hide()
# 更新作物图片
func _update_crop_texture(lot: Dictionary):
var crop_name = lot.get("crop_type", "")
var grow_time = float(lot.get("grow_time", 0))
var max_grow_time = float(lot.get("max_grow_time", 1))
var is_dead = lot.get("is_dead", false)
if crop_name == "":
crop_texture_rect.hide()
return
crop_texture_rect.show()
# 如果作物已死亡,显示死亡状态
if is_dead:
crop_texture_rect.modulate = Color.GRAY
# 可以在这里设置死亡图片,暂时使用灰色调
else:
crop_texture_rect.modulate = Color.WHITE
# 计算生长进度
var progress = 0.0
if max_grow_time > 0:
progress = clamp(grow_time / max_grow_time, 0.0, 1.0)
# 获取对应的作物图片
var texture: Texture2D = null
if main_game.crop_texture_manager:
texture = main_game.crop_texture_manager.get_texture_by_progress(crop_name, progress)
if texture:
crop_texture_rect.texture = texture
else:
# 如果没有找到图片,尝试加载默认图片
var default_path = "res://assets/作物/默认/0.webp"
if ResourceLoader.exists(default_path):
crop_texture_rect.texture = load(default_path)
else:
crop_texture_rect.hide()
# 更新土地信息
func _update_ground_information(lot: Dictionary):
var land_level = int(lot.get("土地等级", 0))
var is_diged = lot.get("is_diged", false)
# 土地等级配置
var level_config = {
0: {"name": "普通土地", "color": Color.WHITE, "speed": "1倍"},
1: {"name": "黄土地", "color": Color(1.0, 1.0, 0.0), "speed": "2倍"},
2: {"name": "红土地", "color": Color(1.0, 0.41, 0.0), "speed": "4倍"},
3: {"name": "紫土地", "color": Color(0.55, 0.29, 0.97), "speed": "6倍"},
4: {"name": "黑土地", "color": Color(0.33, 0.4, 0.59), "speed": "10倍"}
}
if is_diged:
if level_config.has(land_level):
var config = level_config[land_level]
ground_level.text = "土地等级:" + config["name"] + " (Lv." + str(land_level) + ")"
ground_function.text = "生长速度:" + config["speed"]
ground_level.modulate = config["color"]
else:
ground_level.text = "土地等级:未知等级 (Lv." + str(land_level) + ")"
ground_function.text = "生长速度:未知"
ground_level.modulate = Color.WHITE
else:
ground_level.text = "土地状态:未开垦"
ground_function.text = "功能:需要开垦后才能使用"
ground_level.modulate = Color.GRAY
# 格式化时间显示
func _format_time_display(total_seconds: int) -> String:
var time_str = ""
# 定义时间单位换算
var SECONDS_PER_MINUTE = 60
var SECONDS_PER_HOUR = 3600
var SECONDS_PER_DAY = 86400
# 计算各时间单位
var days = total_seconds / SECONDS_PER_DAY
total_seconds %= SECONDS_PER_DAY
var hours = total_seconds / SECONDS_PER_HOUR
total_seconds %= SECONDS_PER_HOUR
var minutes = total_seconds / SECONDS_PER_MINUTE
var seconds = total_seconds % SECONDS_PER_MINUTE
# 构建时间字符串(只显示有值的单位)
if days > 0:
time_str += str(days) + ""
if hours > 0:
time_str += str(hours) + "小时"
if minutes > 0:
time_str += str(minutes) + "分钟"
if seconds > 0:
time_str += str(seconds) + ""
return time_str if time_str != "" else "0秒"