diff --git a/.cursor/rules/smy-rules.mdc b/.cursor/rules/smy-rules.mdc
new file mode 100644
index 0000000..b93c988
--- /dev/null
+++ b/.cursor/rules/smy-rules.mdc
@@ -0,0 +1,5 @@
+---
+description:
+globs:
+alwaysApply: false
+---
diff --git a/Components/GameBGMPlayer.gd b/Components/GameBGMPlayer.gd
new file mode 100644
index 0000000..2f763c6
--- /dev/null
+++ b/Components/GameBGMPlayer.gd
@@ -0,0 +1,166 @@
+extends Node
+
+## 简单背景音乐播放器 - 支持多平台导出
+## 自动加载音乐文件,支持顺序和随机循环播放
+
+# 播放模式
+enum PlayMode {
+ SEQUENTIAL, # 顺序循环
+ RANDOM # 随机循环
+}
+
+# 配置
+@export var play_mode: PlayMode = PlayMode.SEQUENTIAL # 播放模式
+@export var auto_start: bool = true # 自动开始播放
+
+# 预设音乐文件列表(用于导出版本)
+@export var music_files_list: Array[String] = [
+]
+
+# 内部变量
+var audio_player: AudioStreamPlayer
+var music_files: Array[String] = []
+var current_index: int = 0
+var played_indices: Array[int] = [] # 随机模式已播放的索引
+
+func _ready():
+ # 创建音频播放器
+ audio_player = AudioStreamPlayer.new()
+ add_child(audio_player)
+ audio_player.finished.connect(_on_music_finished)
+
+ # 加载音乐文件
+ _load_music_files()
+
+ # 自动开始播放
+ if auto_start and music_files.size() > 0:
+ play_next()
+
+func _load_music_files():
+ """加载音乐文件"""
+ music_files.clear()
+
+ # 在编辑器中尝试动态加载文件夹
+ if OS.has_feature("editor"):
+ _load_from_folder()
+
+ # 如果没有找到文件或者是导出版本,使用预设列表
+ if music_files.size() == 0:
+ _load_from_preset_list()
+
+func _load_from_folder():
+ """从文件夹动态加载(仅编辑器模式)"""
+ var music_folder = "res://audio/music/"
+ var dir = DirAccess.open(music_folder)
+
+ if dir:
+ dir.list_dir_begin()
+ var file_name = dir.get_next()
+
+ while file_name != "":
+ if not dir.current_is_dir():
+ var extension = file_name.get_extension().to_lower()
+ # 支持常见音频格式
+ if extension in ["mp3", "ogg", "wav"]:
+ music_files.append(music_folder + file_name)
+ print("动态加载音乐: ", file_name)
+ file_name = dir.get_next()
+
+ print("动态加载了 ", music_files.size(), " 首音乐")
+
+func _load_from_preset_list():
+ """从预设列表加载音乐"""
+ for file_path in music_files_list:
+ if ResourceLoader.exists(file_path):
+ music_files.append(file_path)
+ print("预设加载音乐: ", file_path.get_file())
+ else:
+ print("音乐文件不存在: ", file_path)
+
+ print("预设加载了 ", music_files.size(), " 首音乐")
+
+func play_next():
+ """播放下一首音乐"""
+ if music_files.size() == 0:
+ print("没有音乐文件可播放")
+ return
+
+ # 根据播放模式获取下一首音乐的索引
+ match play_mode:
+ PlayMode.SEQUENTIAL:
+ current_index = (current_index + 1) % music_files.size()
+ PlayMode.RANDOM:
+ current_index = _get_random_index()
+
+ # 播放音乐
+ _play_music(current_index)
+
+func _get_random_index() -> int:
+ """获取随机音乐索引(避免重复直到所有歌曲都播放过)"""
+ # 如果所有歌曲都播放过了,重置列表
+ if played_indices.size() >= music_files.size():
+ played_indices.clear()
+
+ # 获取未播放的歌曲索引
+ var available_indices: Array[int] = []
+ for i in range(music_files.size()):
+ if i not in played_indices:
+ available_indices.append(i)
+
+ # 随机选择一个
+ if available_indices.size() > 0:
+ var random_choice = available_indices[randi() % available_indices.size()]
+ played_indices.append(random_choice)
+ return random_choice
+
+ return 0
+
+func _play_music(index: int):
+ """播放指定索引的音乐"""
+ if index < 0 or index >= music_files.size():
+ return
+
+ var music_path = music_files[index]
+ var audio_stream = load(music_path)
+
+ if audio_stream:
+ audio_player.stream = audio_stream
+ audio_player.play()
+ print("正在播放: ", music_path.get_file())
+ else:
+ print("加载音乐失败: ", music_path)
+
+func _on_music_finished():
+ """音乐播放完成时自动播放下一首"""
+ play_next()
+
+# 公共接口方法
+func set_play_mode(mode: PlayMode):
+ """设置播放模式"""
+ play_mode = mode
+ played_indices.clear() # 重置随机播放历史
+ print("播放模式设置为: ", "顺序循环" if mode == PlayMode.SEQUENTIAL else "随机循环")
+
+func toggle_play_mode():
+ """切换播放模式"""
+ if play_mode == PlayMode.SEQUENTIAL:
+ set_play_mode(PlayMode.RANDOM)
+ else:
+ set_play_mode(PlayMode.SEQUENTIAL)
+
+func get_current_music_name() -> String:
+ """获取当前播放的音乐名称"""
+ if current_index >= 0 and current_index < music_files.size():
+ return music_files[current_index].get_file()
+ return ""
+
+# 运行时添加音乐文件(用于用户自定义音乐)
+func add_music_file(file_path: String) -> bool:
+ """添加音乐文件到播放列表"""
+ if ResourceLoader.exists(file_path):
+ music_files.append(file_path)
+ print("添加音乐: ", file_path.get_file())
+ return true
+ else:
+ print("音乐文件不存在: ", file_path)
+ return false
diff --git a/Components/GameBGMPlayer.gd.uid b/Components/GameBGMPlayer.gd.uid
new file mode 100644
index 0000000..de3e9e1
--- /dev/null
+++ b/Components/GameBGMPlayer.gd.uid
@@ -0,0 +1 @@
+uid://ca2chgx5w3g1y
diff --git a/Components/GameBGMPlayer2.gd b/Components/GameBGMPlayer2.gd
new file mode 100644
index 0000000..d6341e5
--- /dev/null
+++ b/Components/GameBGMPlayer2.gd
@@ -0,0 +1,131 @@
+extends Node
+
+## 简单背景音乐播放器
+## 自动加载指定文件夹的音乐文件,支持顺序和随机循环播放
+
+# 播放模式
+enum PlayMode {
+ SEQUENTIAL, # 顺序循环
+ RANDOM # 随机循环
+}
+
+# 配置
+@export var music_folder: String = "res://assets/音乐/" # 音乐文件夹路径
+@export var play_mode: PlayMode = PlayMode.SEQUENTIAL # 播放模式
+@export var auto_start: bool = true # 自动开始播放
+
+# 内部变量
+var audio_player: AudioStreamPlayer
+var music_files: Array[String] = []
+var current_index: int = 0
+var played_indices: Array[int] = [] # 随机模式已播放的索引
+
+func _ready():
+ # 创建音频播放器
+ audio_player = AudioStreamPlayer.new()
+ add_child(audio_player)
+ audio_player.finished.connect(_on_music_finished)
+
+ # 加载音乐文件
+ _load_music_files()
+
+ # 自动开始播放
+ if auto_start and music_files.size() > 0:
+ play_next()
+
+func _load_music_files():
+ """加载指定文件夹下的音乐文件"""
+ music_files.clear()
+
+ var dir = DirAccess.open(music_folder)
+ if dir:
+ dir.list_dir_begin()
+ var file_name = dir.get_next()
+
+ while file_name != "":
+ if not dir.current_is_dir():
+ var extension = file_name.get_extension().to_lower()
+ # 支持常见音频格式
+ if extension in ["mp3", "ogg", "wav"]:
+ music_files.append(music_folder + file_name)
+ print("加载音乐: ", file_name)
+ file_name = dir.get_next()
+
+ print("总共加载了 ", music_files.size(), " 首音乐")
+ else:
+ print("无法打开音乐文件夹: ", music_folder)
+
+func play_next():
+ """播放下一首音乐"""
+ if music_files.size() == 0:
+ print("没有音乐文件可播放")
+ return
+
+ # 根据播放模式获取下一首音乐的索引
+ match play_mode:
+ PlayMode.SEQUENTIAL:
+ current_index = (current_index + 1) % music_files.size()
+ PlayMode.RANDOM:
+ current_index = _get_random_index()
+
+ # 播放音乐
+ _play_music(current_index)
+
+func _get_random_index() -> int:
+ """获取随机音乐索引(避免重复直到所有歌曲都播放过)"""
+ # 如果所有歌曲都播放过了,重置列表
+ if played_indices.size() >= music_files.size():
+ played_indices.clear()
+
+ # 获取未播放的歌曲索引
+ var available_indices: Array[int] = []
+ for i in range(music_files.size()):
+ if i not in played_indices:
+ available_indices.append(i)
+
+ # 随机选择一个
+ if available_indices.size() > 0:
+ var random_choice = available_indices[randi() % available_indices.size()]
+ played_indices.append(random_choice)
+ return random_choice
+
+ return 0
+
+func _play_music(index: int):
+ """播放指定索引的音乐"""
+ if index < 0 or index >= music_files.size():
+ return
+
+ var music_path = music_files[index]
+ var audio_stream = load(music_path)
+
+ if audio_stream:
+ audio_player.stream = audio_stream
+ audio_player.play()
+ print("正在播放: ", music_path.get_file())
+ else:
+ print("加载音乐失败: ", music_path)
+
+func _on_music_finished():
+ """音乐播放完成时自动播放下一首"""
+ play_next()
+
+# 公共接口方法
+func set_play_mode(mode: PlayMode):
+ """设置播放模式"""
+ play_mode = mode
+ played_indices.clear() # 重置随机播放历史
+ print("播放模式设置为: ", "顺序循环" if mode == PlayMode.SEQUENTIAL else "随机循环")
+
+func toggle_play_mode():
+ """切换播放模式"""
+ if play_mode == PlayMode.SEQUENTIAL:
+ set_play_mode(PlayMode.RANDOM)
+ else:
+ set_play_mode(PlayMode.SEQUENTIAL)
+
+func get_current_music_name() -> String:
+ """获取当前播放的音乐名称"""
+ if current_index >= 0 and current_index < music_files.size():
+ return music_files[current_index].get_file()
+ return ""
diff --git a/Components/GameBGMPlayer2.gd.uid b/Components/GameBGMPlayer2.gd.uid
new file mode 100644
index 0000000..b511fa3
--- /dev/null
+++ b/Components/GameBGMPlayer2.gd.uid
@@ -0,0 +1 @@
+uid://cq0ug1c7nibf1
diff --git a/CopyItems/black_blue_crop.tscn b/CopyItems/black_blue_crop.tscn
index 3e8c7c1..7c68577 100644
--- a/CopyItems/black_blue_crop.tscn
+++ b/CopyItems/black_blue_crop.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=3 format=3 uid="uid://cm1e72lhd7j7v"]
+[gd_scene load_steps=2 format=3 uid="uid://cm1e72lhd7j7v"]
[ext_resource type="Script" uid="uid://c6ylh1o2kgqth" path="res://CopyItems/item_crop.gd" id="1_sgirt"]
-[ext_resource type="Texture2D" uid="uid://kdhowrc6av4g" path="res://assets/作物/默认/0.png" id="2_sgirt"]
[node name="BlackBlueCrop" type="Button"]
custom_minimum_size = Vector2(400, 400)
@@ -15,7 +14,6 @@ script = ExtResource("1_sgirt")
[node name="CropImage" type="Sprite2D" parent="."]
position = Vector2(199.569, 201.043)
scale = Vector2(0.260977, 0.259058)
-texture = ExtResource("2_sgirt")
[node name="Title" type="Label" parent="."]
modulate = Color(0, 0.152941, 0.984314, 1)
diff --git a/CopyItems/crop_item.tscn b/CopyItems/crop_item.tscn
index e606ee3..7fef4fe 100644
--- a/CopyItems/crop_item.tscn
+++ b/CopyItems/crop_item.tscn
@@ -1,55 +1,65 @@
-[gd_scene load_steps=4 format=3 uid="uid://bkivlkirrx6u8"]
+[gd_scene load_steps=7 format=3 uid="uid://bkivlkirrx6u8"]
-[ext_resource type="Texture2D" uid="uid://c4l0qn0p4yav8" path="res://assets/tu3.png" id="1_bns1c"]
+[ext_resource type="Texture2D" uid="uid://fibjlynv0vi2" path="res://assets/地块/土块1.png" id="1_bns1c"]
[ext_resource type="Script" uid="uid://xh5tr5co5kfu" path="res://GUI/SMY_ProgressBar.gd" id="2_1n4xp"]
-[ext_resource type="Texture2D" uid="uid://kdhowrc6av4g" path="res://assets/作物/默认/0.png" id="2_bns1c"]
+[ext_resource type="Texture2D" uid="uid://cil2qobuc0chj" path="res://assets/作物/默认/0.webp" id="2_bns1c"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_v46ok"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_s5pb0"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_cyybs"]
[node name="CropItem" type="Button"]
-self_modulate = Color(1, 1, 1, 0.435294)
+self_modulate = Color(1, 1, 1, 0)
custom_minimum_size = Vector2(100, 100)
offset_right = 40.0
offset_bottom = 40.0
[node name="ground_sprite" type="Sprite2D" parent="."]
+material = SubResource("ShaderMaterial_v46ok")
position = Vector2(50, 63)
-scale = Vector2(0.130329, 0.130329)
+scale = Vector2(0.135, 0.135)
texture = ExtResource("1_bns1c")
[node name="crop_sprite" type="Sprite2D" parent="."]
visible = false
-position = Vector2(50, 36)
-scale = Vector2(0.0660772, 0.0660772)
+material = SubResource("ShaderMaterial_s5pb0")
+position = Vector2(50, 34)
+scale = Vector2(0.06, 0.06)
texture = ExtResource("2_bns1c")
[node name="ProgressBar" type="ProgressBar" parent="."]
+material = SubResource("ShaderMaterial_cyybs")
layout_mode = 2
-offset_top = 86.0
-offset_right = 495.0
-offset_bottom = 159.0
+offset_left = 23.0
+offset_top = 78.0
+offset_right = 328.0
+offset_bottom = 151.0
scale = Vector2(0.2, 0.2)
theme_override_font_sizes/font_size = 50
script = ExtResource("2_1n4xp")
[node name="crop_name" type="Label" parent="."]
+modulate = Color(2, 2, 2, 1)
layout_mode = 2
+offset_top = -9.0
offset_right = 250.0
-offset_bottom = 42.0
+offset_bottom = 33.0
scale = Vector2(0.4, 0.4)
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 30
-text = "[普通-胡萝卜]"
horizontal_alignment = 1
vertical_alignment = 1
[node name="status_label" type="Label" parent="."]
modulate = Color(0.721569, 1, 1, 1)
layout_mode = 2
-offset_top = 17.0
+offset_top = 8.0
offset_right = 500.0
-offset_bottom = 86.0
+offset_bottom = 77.0
scale = Vector2(0.2, 0.2)
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 50
-text = "已浇水 已施肥 等级:1"
horizontal_alignment = 1
vertical_alignment = 1
diff --git a/Data/crop_data.json b/Data/crop_data.json
index 2db9dfa..feed37a 100644
--- a/Data/crop_data.json
+++ b/Data/crop_data.json
@@ -1,31 +1,78 @@
{
- "测试作物": {"花费": 1, "生长时间": 3, "收益": 9999, "品质": "普通", "描述": "测试作物", "耐候性": 10, "等级": 1, "经验": 999},
+ "测试作物": {"花费": 1, "生长时间": 5, "收益": 10000, "品质": "普通", "描述": "仅供测试使用的特殊作物", "耐候性": 10, "等级": 1, "经验": 999, "能否购买": false},
- "小麦": {"花费": 120, "生长时间": 120, "收益": 100, "品质": "普通", "描述": "基础作物,品质较低,适合新手种植", "耐候性": 10, "等级": 1, "经验": 10},
- "稻谷": {"花费": 100, "生长时间": 240, "收益": 120, "品质": "普通", "描述": "适合大规模种植的基础作物", "耐候性": 10, "等级": 1, "经验": 10},
- "玉米": {"花费": 70, "生长时间": 600, "收益": 90, "品质": "普通", "描述": "营养丰富的优良作物,适合稍有经验的玩家", "耐候性": 15, "等级": 2, "经验": 15},
- "土豆": {"花费": 75, "生长时间": 360, "收益": 90, "品质": "普通", "描述": "容易种植的耐寒作物", "耐候性": 12, "等级": 1, "经验": 10},
- "胡萝卜": {"花费": 60, "生长时间": 480, "收益": 80, "品质": "普通", "描述": "适合新手的健康作物", "耐候性": 12, "等级": 1, "经验": 10},
- "草莓": {"花费": 120, "生长时间": 960, "收益": 150, "品质": "优良", "描述": "营养丰富的果实,收益不错", "耐候性": 14, "等级": 2, "经验": 20},
- "番茄": {"花费": 100, "生长时间": 720, "收益": 130, "品质": "优良", "描述": "常见作物,适合小规模种植", "耐候性": 12, "等级": 2, "经验": 15},
- "大豆": {"花费": 90, "生长时间": 840, "收益": 110, "品质": "优良", "描述": "富含蛋白质的基础作物", "耐候性": 11, "等级": 2, "经验": 12},
+ "小麦": {"花费": 50, "生长时间": 300, "收益": 75, "品质": "普通", "描述": "最基础的粮食作物,生长快速,适合新手练习", "耐候性": 8, "等级": 1, "经验": 8, "能否购买": true},
+ "胡萝卜": {"花费": 40, "生长时间": 240, "收益": 65, "品质": "普通", "描述": "营养丰富的根茎类蔬菜,容易种植", "耐候性": 9, "等级": 1, "经验": 7, "能否购买": true},
+ "土豆": {"花费": 60, "生长时间": 480, "收益": 95, "品质": "普通", "描述": "耐寒的块茎作物,产量稳定", "耐候性": 12, "等级": 1, "经验": 10, "能否购买": true},
+ "稻谷": {"花费": 70, "生长时间": 600, "收益": 110, "品质": "普通", "描述": "重要的主粮作物,需要充足水分", "耐候性": 7, "等级": 1, "经验": 12, "能否购买": true},
- "蓝莓": {"花费": 150, "生长时间": 1200, "收益": 200, "品质": "稀有", "描述": "较为稀有的作物,市场价值较高", "耐候性": 18, "等级": 3, "经验": 25},
- "洋葱": {"花费": 85, "生长时间": 600, "收益": 105, "品质": "稀有", "描述": "烹饪常用的作物,适合中级种植", "耐候性": 10, "等级": 2, "经验": 10},
- "南瓜": {"花费": 180, "生长时间": 1440, "收益": 250, "品质": "稀有", "描述": "秋季收获的高收益作物", "耐候性": 20, "等级": 4, "经验": 30},
- "葡萄": {"花费": 200, "生长时间": 1200, "收益": 300, "品质": "稀有", "描述": "需要特殊管理的高收益作物", "耐候性": 15, "等级": 4, "经验": 35},
- "柿子": {"花费": 160, "生长时间": 1080, "收益": 240, "品质": "稀有", "描述": "富含营养的秋季作物", "耐候性": 18, "等级": 3, "经验": 28},
- "花椰菜": {"花费": 130, "生长时间": 960, "收益": 170, "品质": "稀有", "描述": "耐寒的高品质作物,适合经验丰富的玩家", "耐候性": 17, "等级": 3, "经验": 22},
- "芦笋": {"花费": 200, "生长时间": 1560, "收益": 280, "品质": "稀有", "描述": "市场需求量高的稀有作物", "耐候性": 15, "等级": 4, "经验": 30},
- "香草": {"花费": 250, "生长时间": 1800, "收益": 400, "品质": "史诗", "描述": "非常稀有且收益极高的作物", "耐候性": 22, "等级": 5, "经验": 40},
- "西瓜": {"花费": 240, "生长时间": 2400, "收益": 420, "品质": "史诗", "描述": "夏季丰产的高价值作物", "耐候性": 21, "等级": 5, "经验": 45},
- "甜菜": {"花费": 220, "生长时间": 2160, "收益": 350, "品质": "史诗", "描述": "营养丰富的根茎作物,收益较高", "耐候性": 20, "等级": 5, "经验": 38},
- "甘蔗": {"花费": 260, "生长时间": 3000, "收益": 450, "品质": "史诗", "描述": "需要充足水源的高价值作物", "耐候性": 18, "等级": 5, "经验": 50},
+ "玉米": {"花费": 80, "生长时间": 900, "收益": 130, "品质": "优良", "描述": "高产的谷物作物,营养价值高", "耐候性": 10, "等级": 2, "经验": 15, "能否购买": true},
+ "番茄": {"花费": 90, "生长时间": 720, "收益": 140, "品质": "优良", "描述": "多汁的果实,市场需求大", "耐候性": 8, "等级": 2, "经验": 16, "能否购买": true},
+ "洋葱": {"花费": 75, "生长时间": 840, "收益": 125, "品质": "优良", "描述": "调味蔬菜,储存时间长", "耐候性": 11, "等级": 2, "经验": 14, "能否购买": true},
+ "大豆": {"花费": 85, "生长时间": 1080, "收益": 145, "品质": "优良", "描述": "富含蛋白质的豆类作物", "耐候性": 9, "等级": 2, "经验": 18, "能否购买": true},
- "龙果": {"花费": 400, "生长时间": 4800, "收益": 600, "品质": "传奇", "描述": "极为稀有的热带作物,产量和价值都极高", "耐候性": 25, "等级": 6, "经验": 60},
- "松露": {"花费": 500, "生长时间": 7200, "收益": 700, "品质": "传奇", "描述": "极其珍贵的地下作物,市场价格极高", "耐候性": 23, "等级": 7, "经验": 80},
- "人参": {"花费": 450, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "需要耐心等待的珍贵药材", "耐候性": 22, "等级": 6, "经验": 75},
- "金橘": {"花费": 420, "生长时间": 4800, "收益": 620, "品质": "传奇", "描述": "少见的耐寒果树,市场需求量极大", "耐候性": 26, "等级": 7, "经验": 70}
-}
\ No newline at end of file
+
+ "草莓": {"花费": 120, "生长时间": 1440, "收益": 200, "品质": "稀有", "描述": "甜美的浆果,深受喜爱", "耐候性": 6, "等级": 3, "经验": 22, "能否购买": true},
+ "花椰菜": {"花费": 110, "生长时间": 1320, "收益": 185, "品质": "稀有", "描述": "营养丰富的十字花科蔬菜", "耐候性": 8, "等级": 3, "经验": 20, "能否购买": true},
+ "柿子": {"花费": 140, "生长时间": 1800, "收益": 230, "品质": "稀有", "描述": "秋季成熟的甜美果实", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "蓝莓": {"花费": 160, "生长时间": 2100, "收益": 260, "品质": "稀有", "描述": "抗氧化的超级食物", "耐候性": 7, "等级": 3, "经验": 28, "能否购买": true},
+ "栀子花": {"花费": 180, "生长时间": 2400, "收益": 300, "品质": "稀有", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "玫瑰花": {"花费": 190, "生长时间": 2520, "收益": 310, "品质": "稀有", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "菠萝": {"花费": 200, "生长时间": 2700, "收益": 340, "品质": "稀有", "描述": "热带水果之王", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "梨树": {"花费": 210, "生长时间": 2820, "收益": 350, "品质": "稀有", "描述": "春季开花的落叶果树", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "桃树": {"花费": 220, "生长时间": 2940, "收益": 360, "品质": "稀有", "描述": "粉色花海中的果实树种", "耐候性": 9, "等级": 3, "经验": 25, "能否购买": true},
+ "荔枝": {"花费": 230, "生长时间": 3060, "收益": 380, "品质": "稀有", "描述": "亚热带珍稀水果,果肉如凝脂", "耐候性": 8, "等级": 3, "经验": 26, "能否购买": true},
+ "芒果树": {"花费": 240, "生长时间": 3180, "收益": 400, "品质": "稀有", "描述": "热带阳光孕育的香甜果实", "耐候性": 10, "等级": 3, "经验": 27, "能否购买": true},
+ "糖果树": {"花费": 250, "生长时间": 3300, "收益": 420, "品质": "稀有", "描述": "传说中结出彩色糖果的魔法树", "耐候性": 7, "等级": 3, "经验": 25, "能否购买": true},
+ "面包树": {"花费": 260, "生长时间": 3420, "收益": 440, "品质": "稀有", "描述": "热带地区的淀粉质主食树种", "耐候性": 9, "等级": 3, "经验": 25, "能否购买": true},
+ "幸运草": {"花费": 150, "生长时间": 1560, "收益": 220, "品质": "稀有", "描述": "四片叶子的幸运象征植物", "耐候性": 6, "等级": 3, "经验": 20, "能否购买": true},
+ "幸运花": {"花费": 170, "生长时间": 1680, "收益": 240, "品质": "稀有", "描述": "绽放时带来好运的神秘花卉", "耐候性": 7, "等级": 3, "经验": 22, "能否购买": true},
+ "摇钱树": {"花费": 300, "生长时间": 3600, "收益": 500, "品质": "稀有", "描述": "传说中能结出金币的神树", "耐候性": 10, "等级": 3, "经验": 30, "能否购买": true},
+
+ "葡萄": {"花费": 200, "生长时间": 2700, "收益": 340, "品质": "史诗", "描述": "用于酿酒的珍贵果实", "耐候性": 9, "等级": 4, "经验": 35, "能否购买": true},
+ "南瓜": {"花费": 180, "生长时间": 3600, "收益": 320, "品质": "史诗", "描述": "大型瓜果,节庆装饰的首选", "耐候性": 12, "等级": 4, "经验": 38, "能否购买": true},
+ "芦笋": {"花费": 220, "生长时间": 3000, "收益": 370, "品质": "史诗", "描述": "高档蔬菜,营养价值极高", "耐候性": 8, "等级": 4, "经验": 40, "能否购买": true},
+ "茄子": {"花费": 190, "生长时间": 2400, "收益": 310, "品质": "史诗", "描述": "紫色的营养蔬菜", "耐候性": 10, "等级": 4, "经验": 32, "能否购买": true},
+
+
+ "西瓜": {"花费": 250, "生长时间": 4800, "收益": 450, "品质": "优良", "描述": "夏日消暑的大型水果", "耐候性": 6, "等级": 5, "经验": 50, "能否购买": true},
+ "甘蔗": {"花费": 280, "生长时间": 5400, "收益": 500, "品质": "优良", "描述": "制糖的重要原料", "耐候性": 5, "等级": 5, "经验": 55, "能否购买": true},
+ "香草": {"花费": 300, "生长时间": 6000, "收益": 550, "品质": "优良", "描述": "珍贵的调料植物", "耐候性": 7, "等级": 5, "经验": 60, "能否购买": true},
+ "甜菜": {"花费": 240, "生长时间": 4200, "收益": 420, "品质": "优良", "描述": "制糖的另一种选择", "耐候性": 11, "等级": 5, "经验": 45, "能否购买": true},
+ "百合花": {"花费": 260, "生长时间": 4800, "收益": 480, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+ "康乃馨": {"花费": 270, "生长时间": 5100, "收益": 510, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+ "郁金香": {"花费": 280, "生长时间": 5100, "收益": 510, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+
+
+ "人参": {"花费": 400, "生长时间": 7200, "收益": 720, "品质": "传奇", "描述": "珍贵的药用植物,需要耐心培养", "耐候性": 15, "等级": 6, "经验": 80, "能否购买": true},
+ "富贵竹": {"花费": 350, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "寓意吉祥的观赏植物", "耐候性": 12, "等级": 6, "经验": 75, "能否购买": true},
+ "芦荟": {"花费": 320, "生长时间": 6000, "收益": 600, "品质": "传奇", "描述": "具有药用价值的多肉植物", "耐候性": 18, "等级": 6, "经验": 70, "能否购买": true},
+ "哈密瓜": {"花费": 380, "生长时间": 7800, "收益": 700, "品质": "传奇", "描述": "甘甜的高级水果", "耐候性": 8, "等级": 6, "经验": 85, "能否购买": true},
+
+
+ "金橘": {"花费": 500, "生长时间": 10800, "收益": 900, "品质": "传奇", "描述": "金黄色的珍贵柑橘", "耐候性": 10, "等级": 7, "经验": 120, "能否购买": true},
+ "苹果树": {"花费": 450, "生长时间": 9600, "收益": 820, "品质": "传奇", "描述": "结果丰富的果树", "耐候性": 14, "等级": 7, "经验": 110, "能否购买": true},
+ "橘子树": {"花费": 480, "生长时间": 10200, "收益": 850, "品质": "传奇", "描述": "维生素C丰富的果树", "耐候性": 12, "等级": 7, "经验": 115, "能否购买": true},
+ "香蕉树": {"花费": 420, "生长时间": 8400, "收益": 780, "品质": "传奇", "描述": "热带水果之王", "耐候性": 5, "等级": 7, "经验": 100, "能否购买": true},
+
+
+ "向日葵": {"花费": 160, "生长时间": 3600, "收益": 280, "品质": "史诗", "描述": "向阳而生的美丽花朵", "耐候性": 13, "等级": 4, "经验": 35, "能否购买": true},
+ "树莓": {"花费": 140, "生长时间": 2700, "收益": 240, "品质": "稀有", "描述": "小巧精致的浆果", "耐候性": 9, "等级": 3, "经验": 30, "能否购买": true},
+ "豌豆": {"花费": 65, "生长时间": 720, "收益": 110, "品质": "优良", "描述": "嫩绿的豆荚蔬菜", "耐候性": 10, "等级": 2, "经验": 15, "能否购买": true},
+ "黄瓜": {"花费": 85, "生长时间": 1200, "收益": 150, "品质": "优良", "描述": "清脆爽口的瓜类", "耐候性": 8, "等级": 2, "经验": 18, "能否购买": true},
+ "大白菜": {"花费": 70, "生长时间": 900, "收益": 120, "品质": "优良", "描述": "北方冬季的主要蔬菜", "耐候性": 15, "等级": 2, "经验": 16, "能否购买": true},
+ "蕨菜": {"花费": 180, "生长时间": 2400, "收益": 300, "品质": "史诗", "描述": "野生山菜,口感独特", "耐候性": 16, "等级": 4, "经验": 35, "能否购买": true},
+
+
+ "龙果": {"花费": 800, "生长时间": 14400, "收益": 1500, "品质": "传奇", "描述": "传说中的神秘果实,蕴含强大能量", "耐候性": 25, "等级": 8, "经验": 200, "能否购买": true},
+ "松露": {"花费": 1000, "生长时间": 18000, "收益": 2000, "品质": "传奇", "描述": "地下的黑金,顶级料理的灵魂", "耐候性": 20, "等级": 8, "经验": 250, "能否购买": true},
+ "冬虫夏草": {"花费": 600, "生长时间": 12000, "收益": 1200, "品质": "传奇", "描述": "稀世珍宝,药王之称", "耐候性": 30, "等级": 7, "经验": 180, "能否购买": true},
+ "山葵": {"花费": 500, "生长时间": 10800, "收益": 1000, "品质": "优良", "描述": "日式料理的珍贵调料", "耐候性": 22, "等级": 7, "经验": 150, "能否购买": true},
+ "鱼腥草": {"花费": 300, "生长时间": 7200, "收益": 600, "品质": "稀有", "描述": "具有特殊药用价值的野菜", "耐候性": 18, "等级": 6, "经验": 90, "能否购买": true},
+
+
+ "杂交树1": {"花费": 1200, "生长时间": 21600, "收益": 2500, "品质": "传奇", "描述": "初中生物书最后的想象", "耐候性": 35, "等级": 9, "经验": 300, "能否购买": true},
+ "杂交树2": {"花费": 1500, "生长时间": 25200, "收益": 3000, "品质": "传奇", "描述": "初中生物书最后的想象", "耐候性": 40, "等级": 10, "经验": 400, "能否购买": true}
+}
\ No newline at end of file
diff --git a/GUI/AcceptDialog.gd b/GUI/AcceptDialog.gd
new file mode 100644
index 0000000..5020c6c
--- /dev/null
+++ b/GUI/AcceptDialog.gd
@@ -0,0 +1,87 @@
+extends AcceptDialog
+
+@export var dialog_min_size := Vector2(400, 200)
+@export var ok_text := "确认"
+@export var cancel_text := "取消"
+
+func _ready() -> void:
+ # 设置弹窗最小尺寸
+ self.set("rect_min_size", dialog_min_size)
+
+ # 设置标题和内容(可通过函数修改)
+ set_dialog_title("默认标题")
+ set_dialog_content("默认内容")
+
+ # 添加取消按钮
+ var cancel_btn = self.add_cancel_button(cancel_text)
+ _customize_button(cancel_btn)
+
+ # 获取并设置确认按钮
+ var ok_btn = self.get_ok_button()
+ ok_btn.text = ok_text
+ _customize_button(ok_btn)
+
+ # 设置按钮样式属性
+ self.add_theme_constant_override("buttons_min_height", 40)
+ self.add_theme_constant_override("buttons_min_width", 120)
+ self.add_theme_constant_override("buttons_separation", 16)
+
+ # 添加样式美化
+ _apply_custom_theme()
+
+func set_dialog_position(new_position :Vector2):
+ self.position = new_position
+ pass
+
+func set_dialog_title(title: String) -> void:
+ self.title = title
+
+
+func set_dialog_content(content: String) -> void:
+ self.dialog_text = content
+
+
+func set_ok_text(text: String) -> void:
+ ok_text = text
+ get_ok_button().text = text
+
+
+func set_cancel_text(text: String) -> void:
+ cancel_text = text
+ # 注意:add_cancel_button 只能调用一次,想动态更新需要重建按钮
+
+
+func _customize_button(button: Button) -> void:
+ button.custom_minimum_size = Vector2(120, 40)
+ button.add_theme_color_override("font_color", Color.WHITE)
+ button.add_theme_color_override("font_color_pressed", Color.WHITE)
+ button.add_theme_color_override("font_color_hover", Color.WHITE)
+ button.add_theme_color_override("bg_color", Color("3c82f6")) # 蓝色
+ button.add_theme_color_override("bg_color_hover", Color("2563eb"))
+ button.add_theme_color_override("bg_color_pressed", Color("1e40af"))
+ button.add_theme_color_override("bg_color_disabled", Color("94a3b8"))
+
+
+func _apply_custom_theme() -> void:
+ # 设置面板背景颜色
+ var panel_style := StyleBoxFlat.new()
+ panel_style.bg_color = Color("f8fafc") # very light gray
+ panel_style.set_border_width_all(2)
+ panel_style.border_color = Color("cbd5e1")
+
+ self.add_theme_stylebox_override("panel", panel_style) # ✅ 修正方法名
+
+ # 设置文字颜色(内容部分)
+ var label = self.get_label()
+ label.add_theme_color_override("font_color", Color("1e293b")) # 深灰蓝
+
+
+
+# 确认按钮点击
+func _on_confirmed() -> void:
+ print("确认按钮被点击")
+
+
+# 取消按钮点击
+func _on_canceled() -> void:
+ print("取消按钮被点击")
diff --git a/GUI/AcceptDialog.gd.uid b/GUI/AcceptDialog.gd.uid
new file mode 100644
index 0000000..9147bad
--- /dev/null
+++ b/GUI/AcceptDialog.gd.uid
@@ -0,0 +1 @@
+uid://ce8xcp770tolo
diff --git a/GUI/AcceptDialog.tscn b/GUI/AcceptDialog.tscn
new file mode 100644
index 0000000..9160854
--- /dev/null
+++ b/GUI/AcceptDialog.tscn
@@ -0,0 +1,15 @@
+[gd_scene load_steps=2 format=3 uid="uid://btp1h6hic2sin"]
+
+[ext_resource type="Script" path="res://GUI/AcceptDialog.gd" id="1_yc5jp"]
+
+[node name="AcceptDialog" type="AcceptDialog"]
+auto_translate_mode = 1
+title = "是否购买"
+initial_position = 1
+size = Vector2i(300, 200)
+visible = true
+ok_button_text = "确定"
+script = ExtResource("1_yc5jp")
+
+[connection signal="canceled" from="." to="." method="_on_canceled"]
+[connection signal="confirmed" from="." to="." method="_on_confirmed"]
diff --git a/GUI/DailyCheckInPanel.gd b/GUI/DailyCheckInPanel.gd
new file mode 100644
index 0000000..e2747ea
--- /dev/null
+++ b/GUI/DailyCheckInPanel.gd
@@ -0,0 +1,422 @@
+extends Panel
+class_name DailyCheckInPanel
+
+## 每日签到系统 - 后端对接版本
+## 功能:与服务器对接的签到系统,支持实时数据同步
+## 奖励平衡性已根据 crop_data.json 调整
+
+# =============================================================================
+# 信号定义 - 用于与后端系统通信
+# =============================================================================
+signal check_in_completed(rewards: Dictionary) # 签到完成信号
+signal reward_claimed(reward_type: String, amount: int) # 奖励领取信号
+signal check_in_data_loaded(data: Dictionary) # 签到数据加载完成信号
+signal check_in_failed(error_message: String) # 签到失败信号
+
+# =============================================================================
+# 节点引用
+# =============================================================================
+@onready var daily_check_in_history: RichTextLabel = $Scroll/DailyCheckInHistory
+@onready var daily_check_in_reward: RichTextLabel = $DailyCheckInReward
+@onready var daily_check_in_button: Button = $DailyCheckInButton
+
+# =============================================================================
+# 数据存储
+# =============================================================================
+var check_in_data: Dictionary = {}
+var today_date: String
+var consecutive_days: int = 0
+var has_checked_in_today: bool = false
+
+# 网络管理器引用
+var network_manager
+var main_game
+
+# =============================================================================
+# 奖励配置系统 - 根据 crop_data.json 平衡调整
+# =============================================================================
+var reward_configs: Dictionary = {
+ "coins": {
+ "min": 200,
+ "max": 500,
+ "name": "钱币",
+ "color": "#FFD700",
+ "icon": "💰"
+ },
+ "exp": {
+ "min": 50,
+ "max": 120,
+ "name": "经验",
+ "color": "#00BFFF",
+ "icon": "⭐"
+ },
+ # 种子配置根据 crop_data.json 的作物等级和价值设定
+ "seeds": {
+ "普通": [
+ {"name": "小麦", "color": "#F4A460", "icon": "🌱", "rarity_color": "#FFFFFF"},
+ {"name": "胡萝卜", "color": "#FFA500", "icon": "🌱", "rarity_color": "#FFFFFF"},
+ {"name": "土豆", "color": "#D2691E", "icon": "🌱", "rarity_color": "#FFFFFF"},
+ {"name": "稻谷", "color": "#DAA520", "icon": "🌱", "rarity_color": "#FFFFFF"}
+ ],
+ "优良": [
+ {"name": "玉米", "color": "#FFD700", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "番茄", "color": "#FF6347", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "洋葱", "color": "#DDA0DD", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "大豆", "color": "#8FBC8F", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "豌豆", "color": "#90EE90", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "黄瓜", "color": "#32CD32", "icon": "🌱", "rarity_color": "#00FF00"},
+ {"name": "大白菜", "color": "#F0FFF0", "icon": "🌱", "rarity_color": "#00FF00"}
+ ],
+ "稀有": [
+ {"name": "草莓", "color": "#FF69B4", "icon": "🌱", "rarity_color": "#0080FF"},
+ {"name": "花椰菜", "color": "#F5F5DC", "icon": "🌱", "rarity_color": "#0080FF"},
+ {"name": "柿子", "color": "#FF4500", "icon": "🌱", "rarity_color": "#0080FF"},
+ {"name": "蓝莓", "color": "#4169E1", "icon": "🌱", "rarity_color": "#0080FF"},
+ {"name": "树莓", "color": "#DC143C", "icon": "🌱", "rarity_color": "#0080FF"}
+ ],
+ "史诗": [
+ {"name": "葡萄", "color": "#9370DB", "icon": "🌱", "rarity_color": "#8A2BE2"},
+ {"name": "南瓜", "color": "#FF8C00", "icon": "🌱", "rarity_color": "#8A2BE2"},
+ {"name": "芦笋", "color": "#9ACD32", "icon": "🌱", "rarity_color": "#8A2BE2"},
+ {"name": "茄子", "color": "#9400D3", "icon": "🌱", "rarity_color": "#8A2BE2"},
+ {"name": "向日葵", "color": "#FFD700", "icon": "🌱", "rarity_color": "#8A2BE2"},
+ {"name": "蕨菜", "color": "#228B22", "icon": "🌱", "rarity_color": "#8A2BE2"}
+ ],
+ "传奇": [
+ {"name": "西瓜", "color": "#FF69B4", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "甘蔗", "color": "#DDA0DD", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "香草", "color": "#98FB98", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "甜菜", "color": "#DC143C", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "人参", "color": "#DAA520", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "富贵竹", "color": "#32CD32", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "芦荟", "color": "#9ACD32", "icon": "🌱", "rarity_color": "#FF8C00"},
+ {"name": "哈密瓜", "color": "#FFB6C1", "icon": "🌱", "rarity_color": "#FF8C00"}
+ ]
+ }
+}
+
+# =============================================================================
+# 系统初始化
+# =============================================================================
+func _ready() -> void:
+ _initialize_system()
+
+func _initialize_system() -> void:
+ """初始化签到系统"""
+ daily_check_in_reward.hide()
+ today_date = Time.get_date_string_from_system()
+
+ # 获取网络管理器和主游戏引用
+ network_manager = get_node("/root/main/UI/TCPNetworkManager")
+ main_game = get_node("/root/main")
+
+ _update_display()
+ _check_daily_status()
+
+ # 从服务器加载签到数据
+ if network_manager and network_manager.is_connected_to_server():
+ network_manager.sendGetCheckInData()
+
+# =============================================================================
+# 网络后端交互方法
+# =============================================================================
+
+## 处理服务器签到响应
+func handle_daily_check_in_response(response: Dictionary) -> void:
+ var success = response.get("success", false)
+ var message = response.get("message", "")
+
+ if success:
+ var rewards = response.get("rewards", {})
+ consecutive_days = response.get("consecutive_days", 0)
+ has_checked_in_today = true
+
+ # 显示奖励
+ _show_reward_animation(rewards)
+
+ # 更新按钮状态
+ _set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1))
+
+ # 发送完成信号
+ check_in_completed.emit(rewards)
+
+ # 发送奖励信号
+ for reward_type in rewards.keys():
+ if reward_type == "seeds":
+ for seed_reward in rewards.seeds:
+ reward_claimed.emit("seed_" + seed_reward.name, seed_reward.quantity)
+ elif reward_type in ["coins", "exp", "bonus_coins", "bonus_exp"]:
+ reward_claimed.emit(reward_type, rewards[reward_type])
+
+ Toast.show(message, Color.GREEN)
+ print("签到成功: ", message)
+ else:
+ has_checked_in_today = response.get("has_checked_in", false)
+ _set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1)) if has_checked_in_today else _set_button_state(true, "签到", Color(1, 1, 0.52549, 1))
+ check_in_failed.emit(message)
+ Toast.show(message, Color.RED)
+ print("签到失败: ", message)
+
+## 处理服务器签到数据响应
+func handle_check_in_data_response(response: Dictionary) -> void:
+ var success = response.get("success", false)
+
+ if success:
+ check_in_data = response.get("check_in_data", {})
+ consecutive_days = response.get("consecutive_days", 0)
+ has_checked_in_today = response.get("has_checked_in_today", false)
+ today_date = response.get("current_date", Time.get_date_string_from_system())
+
+ # 更新显示
+ _update_display()
+ _check_daily_status()
+
+ # 发送数据加载完成信号
+ check_in_data_loaded.emit(check_in_data)
+
+ print("签到数据加载成功,连续签到:", consecutive_days, "天")
+ else:
+ print("加载签到数据失败")
+
+# =============================================================================
+# 核心业务逻辑
+# =============================================================================
+
+## 检查今日签到状态
+func _check_daily_status() -> void:
+ if has_checked_in_today:
+ _set_button_state(false, "已签到", Color(0.7, 0.7, 0.7, 1))
+ else:
+ _set_button_state(true, "签到", Color(1, 1, 0.52549, 1))
+
+## 设置按钮状态
+func _set_button_state(enabled: bool, text: String, color: Color) -> void:
+ daily_check_in_button.disabled = not enabled
+ daily_check_in_button.text = text
+ daily_check_in_button.modulate = color
+
+## 执行签到
+func execute_check_in() -> void:
+ if has_checked_in_today:
+ Toast.show("今日已签到,请明日再来", Color.ORANGE)
+ return
+
+ if not network_manager or not network_manager.is_connected_to_server():
+ Toast.show("未连接到服务器,无法签到", Color.RED)
+ return
+
+ # 发送签到请求到服务器
+ network_manager.sendDailyCheckIn()
+ daily_check_in_button.disabled = true
+ daily_check_in_button.text = "签到中..."
+
+ # 3秒后重新启用按钮(防止网络超时)
+ await get_tree().create_timer(3.0).timeout
+ if daily_check_in_button.disabled and daily_check_in_button.text == "签到中...":
+ daily_check_in_button.disabled = false
+ daily_check_in_button.text = "签到"
+
+## 显示奖励动画
+func _show_reward_animation(rewards: Dictionary) -> void:
+ daily_check_in_reward.text = _format_reward_text(rewards)
+ daily_check_in_reward.show()
+
+ # 创建动画效果
+ var tween = create_tween()
+ tween.parallel().tween_method(_animate_reward_display, 0.0, 1.0, 0.5)
+
+## 奖励显示动画
+func _animate_reward_display(progress: float) -> void:
+ daily_check_in_reward.modulate.a = progress
+ var scale = 0.8 + (0.2 * progress)
+ daily_check_in_reward.scale = Vector2(scale, scale)
+
+# =============================================================================
+# UI显示格式化
+# =============================================================================
+
+## 格式化奖励显示文本
+func _format_reward_text(rewards: Dictionary) -> String:
+ var text = ""
+
+ # 显示连续签到信息
+ text += "[center][color=#FF69B4]🔥 连续签到第%d天 🔥[/color][/center]\n" % consecutive_days
+ if consecutive_days > 1:
+ var multiplier = 1.0 + (consecutive_days - 1) * 0.1
+ multiplier = min(multiplier, 3.0)
+ text += "[center][color=#90EE90]奖励倍数: %.1fx[/color][/center]\n\n" % multiplier
+ else:
+ text += "\n"
+
+ # 基础奖励
+ if rewards.has("coins"):
+ text += "[color=%s]%s +%d %s[/color]\n" % [
+ reward_configs.coins.color,
+ reward_configs.coins.icon,
+ rewards.coins,
+ reward_configs.coins.name
+ ]
+
+ if rewards.has("exp"):
+ text += "[color=%s]%s +%d %s[/color]\n" % [
+ reward_configs.exp.color,
+ reward_configs.exp.icon,
+ rewards.exp,
+ reward_configs.exp.name
+ ]
+
+ # 种子奖励
+ if rewards.has("seeds") and rewards.seeds.size() > 0:
+ for seed_reward in rewards.seeds:
+ var seed_name = seed_reward.name
+ var quantity = seed_reward.quantity
+ var quality = seed_reward.quality
+
+ # 从配置中找到对应的种子信息
+ var seed_info = _get_seed_info(seed_name, quality)
+ if seed_info:
+ text += "[color=%s]%s[/color] [color=%s]%s[/color] x%d [color=%s](%s)[/color]\n" % [
+ seed_info.color, seed_info.icon, seed_info.color, seed_name, quantity, seed_info.rarity_color, quality
+ ]
+
+ # 连续签到额外奖励
+ if rewards.has("bonus_coins"):
+ text += "\n[color=#FFD700]🎁 连续签到奖励:[/color]\n"
+ text += "[color=%s]%s +%d %s[/color] [color=#FFD700]✨[/color]\n" % [
+ reward_configs.coins.color,
+ reward_configs.coins.icon,
+ rewards.bonus_coins,
+ reward_configs.coins.name
+ ]
+
+ if rewards.has("bonus_exp"):
+ if not rewards.has("bonus_coins"):
+ text += "\n[color=#FFD700]🎁 连续签到奖励:[/color]\n"
+ text += "[color=%s]%s +%d %s[/color] [color=#FFD700]✨[/color]\n" % [
+ reward_configs.exp.color,
+ reward_configs.exp.icon,
+ rewards.bonus_exp,
+ reward_configs.exp.name
+ ]
+
+ # 下一个奖励预告
+ var next_bonus_day = 0
+ if consecutive_days < 3:
+ next_bonus_day = 3
+ elif consecutive_days < 7:
+ next_bonus_day = 7
+ elif consecutive_days < 14:
+ next_bonus_day = 14
+ elif consecutive_days < 21:
+ next_bonus_day = 21
+
+ if next_bonus_day > 0:
+ var days_needed = next_bonus_day - consecutive_days
+ text += "\n[center][color=#87CEEB]再签到%d天可获得特殊奖励![/color][/center]" % days_needed
+
+ return text
+
+## 获取种子信息
+func _get_seed_info(seed_name: String, quality: String) -> Dictionary:
+ if quality in reward_configs.seeds:
+ for seed in reward_configs.seeds[quality]:
+ if seed.name == seed_name:
+ return seed
+ return {}
+
+## 格式化历史记录文本
+func _format_history_text(date: String, rewards: Dictionary) -> String:
+ var text = "[color=#87CEEB]📅 %s[/color] " % date
+
+ var reward_parts = []
+ if rewards.has("coins"):
+ reward_parts.append("[color=%s]%s %d[/color]" % [
+ reward_configs.coins.color,
+ reward_configs.coins.name,
+ rewards.coins
+ ])
+
+ if rewards.has("exp"):
+ reward_parts.append("[color=%s]%s %d[/color]" % [
+ reward_configs.exp.color,
+ reward_configs.exp.name,
+ rewards.exp
+ ])
+
+ if rewards.has("seeds") and rewards.seeds.size() > 0:
+ for seed_reward in rewards.seeds:
+ var seed_name = seed_reward.name
+ var quantity = seed_reward.quantity
+ var quality = seed_reward.quality
+ var seed_info = _get_seed_info(seed_name, quality)
+ if seed_info:
+ reward_parts.append("[color=%s]%s x%d[/color]" % [
+ seed_info.color, seed_name, quantity
+ ])
+
+ text += " ".join(reward_parts)
+ return text
+
+## 更新显示内容
+func _update_display() -> void:
+ var history_text = "[center][color=#FFB6C1]📋 签到历史[/color][/center]\n"
+
+ # 显示连续签到状态
+ if consecutive_days > 0:
+ history_text += "[center][color=#FF69B4]🔥 当前连续签到: %d天[/color][/center]\n" % consecutive_days
+ if consecutive_days >= 30:
+ history_text += "[center][color=#FFD700]⭐ 已达到最高连击等级! ⭐[/color][/center]\n"
+ else:
+ history_text += "[center][color=#DDDDDD]还未开始连续签到[/color][/center]\n"
+
+ history_text += "\n"
+
+ if check_in_data.size() == 0:
+ history_text += "[center][color=#DDDDDD]暂无签到记录[/color][/center]"
+ else:
+ # 按日期排序显示历史记录
+ var sorted_dates = check_in_data.keys()
+ sorted_dates.sort()
+ sorted_dates.reverse() # 最新的在前
+
+ for date in sorted_dates:
+ var day_data = check_in_data[date]
+ var rewards = day_data.get("rewards", {})
+ var day_consecutive = day_data.get("consecutive_days", 1)
+
+ history_text += _format_history_text(date, rewards)
+ history_text += " [color=#90EE90](连续%d天)[/color]\n" % day_consecutive
+ history_text += "-----------------------------------------------------------------------------------------------------------------\n"
+
+ daily_check_in_history.text = history_text
+
+# =============================================================================
+# 事件处理
+# =============================================================================
+
+## 关闭面板按钮
+func _on_quit_button_pressed() -> void:
+ self.hide()
+
+## 签到按钮
+func _on_daily_check_in_button_pressed() -> void:
+ execute_check_in()
+
+# =============================================================================
+# 公共接口方法 - 供主游戏调用
+# =============================================================================
+
+## 刷新签到数据
+func refresh_check_in_data() -> void:
+ if network_manager and network_manager.is_connected_to_server():
+ network_manager.sendGetCheckInData()
+
+## 获取当前签到状态
+func get_check_in_status() -> Dictionary:
+ return {
+ "has_checked_in_today": has_checked_in_today,
+ "consecutive_days": consecutive_days,
+ "today_date": today_date
+ }
+
+
diff --git a/GUI/DailyCheckInPanel.gd.uid b/GUI/DailyCheckInPanel.gd.uid
new file mode 100644
index 0000000..68329e4
--- /dev/null
+++ b/GUI/DailyCheckInPanel.gd.uid
@@ -0,0 +1 @@
+uid://c0jfbtkh0mj5b
diff --git a/GUI/DailyCheckInPanel.tscn b/GUI/DailyCheckInPanel.tscn
new file mode 100644
index 0000000..a3c4bee
--- /dev/null
+++ b/GUI/DailyCheckInPanel.tscn
@@ -0,0 +1,76 @@
+[gd_scene load_steps=2 format=3 uid="uid://smypui0vyso5"]
+
+[ext_resource type="Script" uid="uid://c0jfbtkh0mj5b" path="res://游戏弹窗模板/DailyCheckInPanel.gd" id="1_fj7a7"]
+
+[node name="DailyCheckInPanel" type="Panel"]
+offset_right = 600.0
+offset_bottom = 720.0
+script = ExtResource("1_fj7a7")
+
+[node name="Title" type="Label" parent="."]
+layout_mode = 0
+offset_top = -1.0
+offset_right = 600.0
+offset_bottom = 41.0
+theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1)
+theme_override_font_sizes/font_size = 35
+text = "📅每日签到📅"
+horizontal_alignment = 1
+
+[node name="Label" type="Label" parent="."]
+modulate = Color(0.642982, 0.510828, 1, 1)
+layout_mode = 0
+offset_top = 419.0
+offset_right = 600.0
+offset_bottom = 468.0
+theme_override_font_sizes/font_size = 30
+text = "🎉签到奖励🎉"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="QuitButton" type="Button" parent="."]
+custom_minimum_size = Vector2(57, 57)
+layout_mode = 0
+offset_left = 543.0
+offset_top = 1.0
+offset_right = 600.0
+offset_bottom = 58.0
+theme_override_font_sizes/font_size = 35
+text = "X"
+
+[node name="DailyCheckInButton" type="Button" parent="."]
+modulate = Color(1, 1, 0.52549, 1)
+custom_minimum_size = Vector2(150, 70)
+layout_mode = 0
+offset_left = 243.0
+offset_top = 649.0
+offset_right = 393.0
+offset_bottom = 719.0
+theme_override_font_sizes/font_size = 35
+text = "签到"
+
+[node name="Scroll" type="ScrollContainer" parent="."]
+layout_mode = 0
+offset_top = 58.0
+offset_right = 600.0
+offset_bottom = 419.0
+
+[node name="DailyCheckInHistory" type="RichTextLabel" parent="Scroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+bbcode_enabled = true
+threaded = true
+
+[node name="DailyCheckInReward" type="RichTextLabel" parent="."]
+layout_mode = 0
+offset_top = 481.0
+offset_right = 600.0
+offset_bottom = 649.0
+theme_override_font_sizes/normal_font_size = 20
+bbcode_enabled = true
+text = "+500 经验,+400 钱币,+5 普通-番茄种子,+1 传奇-火龙果种子 "
+horizontal_alignment = 1
+
+[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"]
+[connection signal="pressed" from="DailyCheckInButton" to="." method="_on_daily_check_in_button_pressed"]
diff --git a/GUI/GameAboutPanel.gd b/GUI/GameAboutPanel.gd
new file mode 100644
index 0000000..322f5b9
--- /dev/null
+++ b/GUI/GameAboutPanel.gd
@@ -0,0 +1,10 @@
+extends Panel
+
+func _ready() -> void:
+ self.show()
+ pass
+
+
+func _on_quit_button_pressed() -> void:
+ self.hide()
+ pass
diff --git a/GUI/GameAboutPanel.gd.uid b/GUI/GameAboutPanel.gd.uid
new file mode 100644
index 0000000..39d0825
--- /dev/null
+++ b/GUI/GameAboutPanel.gd.uid
@@ -0,0 +1 @@
+uid://bob7a4vhw4nl3
diff --git a/GUI/GameSettingPanel.gd b/GUI/GameSettingPanel.gd
new file mode 100644
index 0000000..2628b13
--- /dev/null
+++ b/GUI/GameSettingPanel.gd
@@ -0,0 +1,9 @@
+extends Panel
+
+func _ready() -> void:
+ self.hide()
+ pass
+
+func _on_quit_button_pressed() -> void:
+ self.hide()
+ pass
diff --git a/GUI/GameSettingPanel.gd.uid b/GUI/GameSettingPanel.gd.uid
new file mode 100644
index 0000000..4834bc2
--- /dev/null
+++ b/GUI/GameSettingPanel.gd.uid
@@ -0,0 +1 @@
+uid://ct7rhywlql4y4
diff --git a/GUI/GameUpdatePanel.gd b/GUI/GameUpdatePanel.gd
new file mode 100644
index 0000000..96335c7
--- /dev/null
+++ b/GUI/GameUpdatePanel.gd
@@ -0,0 +1,162 @@
+extends Panel
+
+@onready var contents: RichTextLabel = $Scroll/Contents #更新内容
+@onready var refresh_button: Button = $RefreshButton #刷新按钮
+
+# HTTP请求节点
+var http_request: HTTPRequest
+
+# API配置
+const API_URL = "http://47.108.90.0:5003/api/game/mengyafarm/updates"
+
+func _ready() -> void:
+ self.hide()
+
+ # 创建HTTPRequest节点
+ http_request = HTTPRequest.new()
+ add_child(http_request)
+
+ # 连接HTTP请求完成信号
+ http_request.request_completed.connect(_on_request_completed)
+
+ # 连接刷新按钮信号
+ refresh_button.pressed.connect(_on_refresh_button_pressed)
+
+ # 初始加载更新数据
+ load_updates()
+
+func _on_quit_button_pressed() -> void:
+ HidePanel()
+
+func _on_refresh_button_pressed() -> void:
+ load_updates()
+
+func load_updates() -> void:
+ # 禁用刷新按钮,防止重复请求
+ refresh_button.disabled = true
+ refresh_button.text = "刷新中..."
+
+ # 显示加载中
+ contents.text = "[center][color=yellow]正在加载更新信息...[/color][/center]"
+
+ # 发起HTTP请求
+ var error = http_request.request(API_URL)
+ if error != OK:
+ _show_error("网络请求失败,错误代码: " + str(error))
+
+func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
+ # 恢复刷新按钮
+ refresh_button.disabled = false
+ refresh_button.text = "刷新"
+
+ # 检查请求结果
+ if result != HTTPRequest.RESULT_SUCCESS:
+ _show_error("网络连接失败")
+ return
+
+ if response_code != 200:
+ _show_error("服务器响应错误 (HTTP " + str(response_code) + ")")
+ return
+
+ # 解析JSON数据
+ var json_text = body.get_string_from_utf8()
+ if json_text.is_empty():
+ _show_error("服务器返回空数据")
+ return
+
+ var json = JSON.new()
+ var parse_result = json.parse(json_text)
+
+ if parse_result != OK:
+ _show_error("数据解析失败")
+ return
+
+ var data = json.data
+ if not data.has("updates"):
+ _show_error("数据格式错误")
+ return
+
+ # 显示更新内容
+ display_updates(data.updates)
+
+func _show_error(error_message: String) -> void:
+ refresh_button.disabled = false
+ refresh_button.text = "刷新"
+ contents.text = "[center][color=red]" + error_message + "\n\n请检查网络连接或稍后重试[/color][/center]"
+
+func display_updates(updates: Array) -> void:
+ if updates.is_empty():
+ contents.text = "[center][color=gray]暂无更新信息[/color][/center]"
+ return
+
+ var update_text = ""
+
+ for i in range(updates.size()):
+ var update = updates[i]
+
+ # 检查必要字段
+ if not update.has("title") or not update.has("version") or not update.has("content"):
+ continue
+
+ # 更新标题
+ update_text += "[color=cyan][font_size=22][b]" + str(update.title) + "[/b][/font_size][/color]\n"
+
+ # 版本和时间信息
+ update_text += "[color=green]版本: " + str(update.version) + "[/color]"
+
+ if update.has("timestamp"):
+ var formatted_time = _format_time(str(update.timestamp))
+ update_text += " [color=gray]时间: " + formatted_time + "[/color]"
+
+ if update.has("game_name"):
+ update_text += " [color=gray]游戏: " + str(update.game_name) + "[/color]"
+
+ update_text += "\n\n"
+
+ # 更新内容
+ var content = str(update.content)
+ # 处理换行符
+ content = content.replace("\\r\\n", "\n").replace("\\n", "\n")
+ # 高亮特殊符号
+ content = content.replace("✓", "[color=green]✓[/color]")
+ content = content.replace("修复:", "[color=yellow]修复:[/color]")
+ content = content.replace("添加", "[color=cyan]添加[/color]")
+ content = content.replace("修改", "[color=orange]修改[/color]")
+
+ update_text += "[color=white]" + content + "[/color]\n"
+
+ # 添加分隔线(除了最后一个更新)
+ if i < updates.size() - 1:
+ update_text += "\n[color=gray]" + "─".repeat(60) + "[/color]\n\n"
+
+ contents.text = update_text
+
+# 简单的时间格式化
+func _format_time(timestamp: String) -> String:
+ var parts = timestamp.split(" ")
+ if parts.size() >= 2:
+ var date_parts = parts[0].split("-")
+ var time_parts = parts[1].split(":")
+
+ if date_parts.size() >= 3 and time_parts.size() >= 2:
+ return date_parts[1] + "月" + date_parts[2] + "日 " + time_parts[0] + ":" + time_parts[1]
+
+ return timestamp
+
+# 显示面板时自动刷新
+func ShowPanel() -> void:
+ self.show()
+ load_updates()
+
+# 隐藏面板时取消正在进行的请求
+func HidePanel() -> void:
+ self.hide()
+ if http_request and http_request.get_http_client_status() != HTTPClient.STATUS_DISCONNECTED:
+ http_request.cancel_request()
+
+ # 恢复按钮状态
+ if refresh_button:
+ refresh_button.disabled = false
+ refresh_button.text = "刷新"
+
+
diff --git a/GUI/GameUpdatePanel.gd.uid b/GUI/GameUpdatePanel.gd.uid
new file mode 100644
index 0000000..a9c6fc6
--- /dev/null
+++ b/GUI/GameUpdatePanel.gd.uid
@@ -0,0 +1 @@
+uid://kj7v1uxk2i6h
diff --git a/GUI/LuckyDrawPanel.gd b/GUI/LuckyDrawPanel.gd
new file mode 100644
index 0000000..a6fd8e0
--- /dev/null
+++ b/GUI/LuckyDrawPanel.gd
@@ -0,0 +1,584 @@
+extends Panel
+class_name LuckyDrawPanel
+
+## 幸运抽奖系统 - 后端对接版本
+## 功能:与服务器对接的抽奖系统,支持实时数据同步和平衡调整
+## 奖励平衡性已根据 crop_data.json 调整
+
+# =============================================================================
+# 信号定义 - 用于与后端系统通信
+# =============================================================================
+signal draw_completed(rewards: Array, draw_type: String) # 抽奖完成信号
+signal reward_obtained(reward_type: String, amount: int) # 奖励获得信号
+signal draw_failed(error_message: String) # 抽奖失败信号
+
+# =============================================================================
+# 节点引用
+# =============================================================================
+#这个展示抽奖获得的奖励
+@onready var lucky_draw_reward: RichTextLabel = $LuckyDrawReward
+#这个是展示有哪些奖励选项,最多15个,奖励就在这里面随机挑选
+@onready var grid: GridContainer = $Grid
+#这个是奖励模板
+@onready var reward_item: RichTextLabel = $Grid/RewardItem
+
+# =============================================================================
+# 数据存储
+# =============================================================================
+var reward_templates: Array[RichTextLabel] = []
+var current_rewards: Array = []
+var network_manager = null
+var main_game = null
+
+# 15种不同的模板颜色
+var template_colors: Array[Color] = [
+ Color(1.0, 0.8, 0.8, 1.0), # 淡红色
+ Color(0.8, 1.0, 0.8, 1.0), # 淡绿色
+ Color(0.8, 0.8, 1.0, 1.0), # 淡蓝色
+ Color(1.0, 1.0, 0.8, 1.0), # 淡黄色
+ Color(1.0, 0.8, 1.0, 1.0), # 淡紫色
+ Color(0.8, 1.0, 1.0, 1.0), # 淡青色
+ Color(1.0, 0.9, 0.8, 1.0), # 淡橙色
+ Color(0.9, 0.8, 1.0, 1.0), # 淡紫蓝色
+ Color(0.8, 1.0, 0.9, 1.0), # 淡薄荷色
+ Color(1.0, 0.8, 0.9, 1.0), # 淡粉色
+ Color(0.9, 1.0, 0.8, 1.0), # 淡柠檬色
+ Color(0.8, 0.9, 1.0, 1.0), # 淡天蓝色
+ Color(1.0, 0.95, 0.8, 1.0), # 淡香槟色
+ Color(0.85, 0.8, 1.0, 1.0), # 淡薰衣草色
+ Color(0.95, 1.0, 0.85, 1.0) # 淡春绿色
+
+
+]
+
+# =============================================================================
+# 基础奖励配置 - 根据 crop_data.json 调整
+# =============================================================================
+var base_rewards: Dictionary = {
+ "coins": {"name": "金币", "icon": "💰", "color": "#FFD700"},
+ "exp": {"name": "经验", "icon": "⭐", "color": "#00BFFF"},
+ "empty": {"name": "谢谢惠顾", "icon": "😅", "color": "#CCCCCC"}
+}
+
+# 根据 crop_data.json 动态构建的种子奖励
+var seed_rewards: Dictionary = {}
+
+# 抽奖费用配置
+var draw_costs: Dictionary = {
+ "single": 800,
+ "five": 3600, # 800 * 5 * 0.9 = 3600
+ "ten": 6400 # 800 * 10 * 0.8 = 6400
+}
+
+# =============================================================================
+# 奖励池配置 - 根据后端数据动态更新
+# =============================================================================
+var server_reward_pools: Dictionary = {}
+
+# =============================================================================
+# 系统初始化
+# =============================================================================
+func _ready() -> void:
+ _initialize_system()
+
+func _initialize_system() -> void:
+ """初始化抽奖系统"""
+ # 获取网络管理器和主游戏引用
+ network_manager = get_node("/root/main/UI/TCPNetworkManager")
+ main_game = get_node("/root/main")
+
+ # 连接信号
+ if main_game:
+ draw_completed.connect(main_game._on_lucky_draw_completed)
+ draw_failed.connect(main_game._on_lucky_draw_failed)
+
+ lucky_draw_reward.hide()
+ _load_crop_data_and_build_rewards()
+ _generate_reward_templates()
+ _update_template_display()
+
+func _load_crop_data_and_build_rewards() -> void:
+ """从主游戏加载作物数据并构建种子奖励"""
+ if main_game and main_game.has_method("get_crop_data"):
+ var crop_data = main_game.get_crop_data()
+ if crop_data:
+ _build_seed_rewards_from_crop_data(crop_data)
+
+func _build_seed_rewards_from_crop_data(crop_data: Dictionary) -> void:
+ """根据 crop_data.json 构建种子奖励配置"""
+ seed_rewards.clear()
+
+ for crop_name in crop_data.keys():
+ var crop_info = crop_data[crop_name]
+
+ # 跳过测试作物和不能购买的作物
+ if crop_name == "测试作物" or not crop_info.get("能否购买", true):
+ continue
+
+ var quality = crop_info.get("品质", "普通")
+ var rarity_color = _get_rarity_color(quality)
+
+ seed_rewards[crop_name] = {
+ "icon": "🌱",
+ "color": rarity_color,
+ "rarity": quality,
+ "level": crop_info.get("等级", 1),
+ "cost": crop_info.get("花费", 50)
+ }
+
+func _get_rarity_color(rarity: String) -> String:
+ """根据稀有度获取颜色"""
+ match rarity:
+ "普通":
+ return "#90EE90"
+ "优良":
+ return "#87CEEB"
+ "稀有":
+ return "#DDA0DD"
+ "史诗":
+ return "#9932CC"
+ "传奇":
+ return "#FF8C00"
+ _:
+ return "#FFFFFF"
+
+# =============================================================================
+# 核心功能
+# =============================================================================
+
+## 生成15个奖励模板
+func _generate_reward_templates() -> void:
+ # 清空现有模板
+ for child in grid.get_children():
+ if child != reward_item:
+ child.queue_free()
+
+ reward_templates.clear()
+
+ # 生成15个模板(包括原有的一个)
+ for i in range(15):
+ var template: RichTextLabel
+
+ if i == 0:
+ # 使用原有的模板
+ template = reward_item
+ else:
+ # 创建新的模板
+ template = reward_item.duplicate()
+ grid.add_child(template)
+
+ # 设置不同的颜色
+ template.self_modulate = template_colors[i]
+ template.bbcode_enabled = true
+ template.threaded = true
+
+ reward_templates.append(template)
+
+## 更新模板显示
+func _update_template_display() -> void:
+ var sample_rewards = _generate_sample_rewards()
+
+ for i in range(reward_templates.size()):
+ var template = reward_templates[i]
+ if i < sample_rewards.size():
+ var reward = sample_rewards[i]
+ template.text = _format_template_text(reward)
+ template.show()
+ else:
+ template.hide()
+
+## 生成示例奖励显示
+func _generate_sample_rewards() -> Array:
+ var sample_rewards = []
+
+ # 添加基础奖励示例
+ sample_rewards.append({"type": "coins", "amount_range": [100, 300], "rarity": "普通"})
+ sample_rewards.append({"type": "exp", "amount_range": [50, 150], "rarity": "普通"})
+ sample_rewards.append({"type": "empty", "name": "谢谢惠顾", "rarity": "空奖"})
+
+ # 添加各品质种子示例
+ var quality_examples = ["普通", "优良", "稀有", "史诗", "传奇"]
+ for quality in quality_examples:
+ var example_seeds = []
+ for seed_name in seed_rewards.keys():
+ if seed_rewards[seed_name].rarity == quality:
+ example_seeds.append(seed_name)
+
+ if example_seeds.size() > 0:
+ var seed_name = example_seeds[0] # 取第一个作为示例
+ sample_rewards.append({
+ "type": "seed",
+ "name": seed_name,
+ "rarity": quality,
+ "amount_range": [1, 3] if quality != "传奇" else [1, 1]
+ })
+
+ # 添加礼包示例
+ sample_rewards.append({"type": "package", "name": "成长套餐", "rarity": "优良"})
+ sample_rewards.append({"type": "package", "name": "稀有礼包", "rarity": "稀有"})
+ sample_rewards.append({"type": "package", "name": "传奇大礼包", "rarity": "传奇"})
+
+ # 添加高级奖励示例
+ sample_rewards.append({"type": "coins", "amount_range": [1000, 2000], "rarity": "史诗"})
+ sample_rewards.append({"type": "exp", "amount_range": [500, 1000], "rarity": "传奇"})
+
+ return sample_rewards.slice(0, 15) # 只取前15个
+
+## 格式化模板文本
+func _format_template_text(reward: Dictionary) -> String:
+ var text = "[center]"
+
+ match reward.type:
+ "empty":
+ text += "[color=%s]%s[/color]\n" % [base_rewards.empty.color, base_rewards.empty.icon]
+ text += "[color=%s]%s[/color]" % [base_rewards.empty.color, reward.get("name", "谢谢惠顾")]
+
+ "package":
+ var rarity_color = _get_rarity_color(reward.get("rarity", "普通"))
+ text += "[color=%s]🎁[/color]\n" % [rarity_color]
+ text += "[color=%s]%s[/color]\n" % [rarity_color, reward.get("name", "礼包")]
+ text += "[color=#CCCCCC](%s)[/color]" % reward.get("rarity", "普通")
+
+ "coins":
+ var rarity_color = _get_rarity_color(reward.get("rarity", "普通"))
+ text += "[color=%s]%s[/color]\n" % [rarity_color, base_rewards.coins.icon]
+ if reward.has("amount_range"):
+ text += "[color=%s]%d-%d[/color]\n" % [rarity_color, reward.amount_range[0], reward.amount_range[1]]
+ text += "[color=%s]%s[/color]" % [rarity_color, base_rewards.coins.name]
+
+ "exp":
+ var rarity_color = _get_rarity_color(reward.get("rarity", "普通"))
+ text += "[color=%s]%s[/color]\n" % [rarity_color, base_rewards.exp.icon]
+ if reward.has("amount_range"):
+ text += "[color=%s]%d-%d[/color]\n" % [rarity_color, reward.amount_range[0], reward.amount_range[1]]
+ text += "[color=%s]%s[/color]" % [rarity_color, base_rewards.exp.name]
+
+ "seed":
+ if reward.has("name") and reward.name in seed_rewards:
+ var seed_info = seed_rewards[reward.name]
+ text += "[color=%s]%s[/color]\n" % [seed_info.color, seed_info.icon]
+ text += "[color=%s]%s[/color]\n" % [seed_info.color, reward.name]
+ if reward.has("amount_range"):
+ text += "[color=%s]x%d-%d[/color]\n" % [seed_info.color, reward.amount_range[0], reward.amount_range[1]]
+ text += "[color=#CCCCCC](%s)[/color]" % seed_info.rarity
+ else:
+ text += "[color=#90EE90]🌱[/color]\n"
+ text += "[color=#90EE90]种子[/color]"
+
+ text += "[/center]"
+ return text
+
+## 执行网络抽奖
+func _perform_network_draw(draw_type: String) -> void:
+ """通过网络请求执行抽奖"""
+ if not network_manager or not network_manager.is_connected_to_server():
+ _show_error_message("网络未连接,无法进行抽奖")
+ return
+
+ # 检查费用
+ var cost = draw_costs.get(draw_type, 800)
+ if main_game and main_game.money < cost:
+ _show_error_message("金币不足,需要 %d 金币" % cost)
+ return
+
+ # 发送抽奖请求
+ var success = network_manager.sendLuckyDraw(draw_type)
+ if not success:
+ _show_error_message("发送抽奖请求失败")
+ return
+
+ # 显示等待动画
+ _show_waiting_animation(draw_type)
+
+## 显示等待动画
+func _show_waiting_animation(draw_type: String) -> void:
+ """显示抽奖等待动画"""
+ # 禁用抽奖按钮
+ _set_draw_buttons_enabled(false)
+
+ # 隐藏结果区域
+ lucky_draw_reward.hide()
+
+ # 播放期待动画
+ _play_anticipation_animation()
+
+## 处理服务器抽奖响应
+func handle_lucky_draw_response(response: Dictionary) -> void:
+ """处理来自服务器的抽奖响应"""
+ # 停止期待动画
+ _stop_anticipation_animation()
+
+ # 重新启用按钮
+ _set_draw_buttons_enabled(true)
+
+ if response.get("success", false):
+ var rewards = response.get("rewards", [])
+ var draw_type = response.get("draw_type", "single")
+ var cost = response.get("cost", 0)
+
+ # 显示抽奖结果
+ _show_server_draw_results(rewards, draw_type, cost)
+
+ # 发送信号
+ draw_completed.emit(rewards, draw_type)
+
+ else:
+ var error_message = response.get("message", "抽奖失败")
+ _show_error_message(error_message)
+ draw_failed.emit(error_message)
+
+## 显示服务器返回的抽奖结果
+func _show_server_draw_results(rewards: Array, draw_type: String, cost: int) -> void:
+ """显示服务器返回的抽奖结果"""
+ current_rewards = rewards
+
+ # 显示结果(动画已在handle_lucky_draw_response中停止)
+ var result_text = _format_server_draw_results(rewards, draw_type, cost)
+ lucky_draw_reward.text = result_text
+ lucky_draw_reward.show()
+
+ # 播放结果动画
+ _play_result_animation()
+
+## 格式化服务器抽奖结果文本
+func _format_server_draw_results(rewards: Array, draw_type: String, cost: int) -> String:
+ var type_names = {
+ "single": "单抽",
+ "five": "五连抽",
+ "ten": "十连抽"
+ }
+
+ var text = "[center][color=#FFD700]🎊 %s结果 🎊[/color][/center]\n" % type_names.get(draw_type, draw_type)
+ text += "[center][color=#87CEEB]消费 %d 金币[/color][/center]\n" % cost
+
+ # 统计稀有度
+ var stats = _count_server_reward_rarity(rewards)
+
+ # 显示稀有度统计
+ var stat_parts = []
+ if stats.legendary > 0:
+ stat_parts.append("[color=#FF8C00]🏆传奇x%d[/color]" % stats.legendary)
+ if stats.epic > 0:
+ stat_parts.append("[color=#9932CC]💎史诗x%d[/color]" % stats.epic)
+ if stats.rare > 0:
+ stat_parts.append("[color=#DDA0DD]⭐稀有x%d[/color]" % stats.rare)
+ if stats.package > 0:
+ stat_parts.append("[color=#FF69B4]🎁礼包x%d[/color]" % stats.package)
+
+ if stat_parts.size() > 0:
+ text += "[center]%s[/center]\n" % " ".join(stat_parts)
+
+ text += "\n"
+
+ # 显示具体奖励
+ for reward in rewards:
+ text += _format_single_server_reward(reward) + "\n"
+
+ # 鼓励文案
+ if stats.empty_only:
+ text += "[center][color=#87CEEB]💪 别灰心,下次一定能中大奖![/color][/center]"
+ elif stats.legendary > 0:
+ text += "[center][color=#FF8C00]🎉 恭喜获得传奇奖励![/color][/center]"
+ elif stats.epic > 0:
+ text += "[center][color=#9932CC]✨ 史诗奖励,运气不错![/color][/center]"
+
+ return text
+
+## 统计服务器奖励稀有度
+func _count_server_reward_rarity(rewards: Array) -> Dictionary:
+ var stats = {
+ "legendary": 0,
+ "epic": 0,
+ "rare": 0,
+ "package": 0,
+ "empty": 0,
+ "empty_only": false
+ }
+
+ for reward in rewards:
+ var rarity = reward.get("rarity", "普通")
+ match rarity:
+ "传奇":
+ stats.legendary += 1
+ "史诗":
+ stats.epic += 1
+ "稀有":
+ stats.rare += 1
+ "空奖":
+ stats.empty += 1
+
+ if reward.get("type") == "package":
+ stats.package += 1
+
+ stats.empty_only = (stats.empty == rewards.size() and rewards.size() == 1)
+ return stats
+
+## 格式化单个服务器奖励显示
+func _format_single_server_reward(reward: Dictionary) -> String:
+ var text = ""
+ var reward_type = reward.get("type", "")
+ var rarity = reward.get("rarity", "普通")
+ var rarity_color = _get_rarity_color(rarity)
+
+ match reward_type:
+ "empty":
+ var reward_name = reward.get("name", "空奖励")
+ text = "[color=%s]😅 %s[/color]" % [rarity_color, reward_name]
+
+ "package":
+ var reward_name = reward.get("name", "礼包")
+ text = "[color=%s]🎁 %s[/color]\n" % [rarity_color, reward_name]
+ text += "[color=#DDDDDD]内含:[/color] "
+
+ var content_parts = []
+ if reward.has("contents"):
+ for content in reward.contents:
+ var part = _format_package_content(content)
+ if part != "":
+ content_parts.append(part)
+
+ text += " ".join(content_parts)
+
+ "coins":
+ var amount = reward.get("amount", 0)
+ text = "[color=%s]💰 金币 +%d[/color]" % [rarity_color, amount]
+
+ "exp":
+ var amount = reward.get("amount", 0)
+ text = "[color=%s]⭐ 经验 +%d[/color]" % [rarity_color, amount]
+
+ "seed":
+ var reward_name = reward.get("name", "种子")
+ var amount = reward.get("amount", 0)
+ text = "[color=%s]🌱 %s x%d[/color] [color=#CCCCCC](%s)[/color]" % [
+ rarity_color, reward_name, amount, rarity
+ ]
+
+ _:
+ text = "[color=#CCCCCC]未知奖励[/color]"
+
+ return text
+
+## 格式化礼包内容
+func _format_package_content(content: Dictionary) -> String:
+ var content_type = content.get("type", "")
+ var amount = content.get("amount", 0)
+
+ match content_type:
+ "coins":
+ return "[color=#FFD700]💰%d[/color]" % amount
+ "exp":
+ return "[color=#00BFFF]⭐%d[/color]" % amount
+ "seed":
+ var seed_name = content.get("name", "种子")
+ return "[color=#90EE90]🌱%sx%d[/color]" % [seed_name, amount]
+ _:
+ return ""
+
+## 播放期待动画(简化版)
+func _play_anticipation_animation() -> void:
+ """播放期待动画"""
+ # 停止之前的动画
+ _stop_anticipation_animation()
+
+ # 创建简单的闪烁动画
+ anticipation_tween = create_tween()
+ anticipation_tween.set_loops()
+
+ for template in reward_templates:
+ if template.visible:
+ anticipation_tween.parallel().tween_method(
+ func(progress: float): _anticipation_flash(template, progress),
+ 0.0, 1.0, 0.5
+ )
+
+var anticipation_tween: Tween = null
+
+func _anticipation_flash(template: RichTextLabel, progress: float) -> void:
+ """期待动画闪烁效果"""
+ var flash_intensity = 1.0 + sin(progress * PI * 2) * 0.3
+ template.modulate = Color(flash_intensity, flash_intensity, flash_intensity, 1.0)
+
+## 停止期待动画
+func _stop_anticipation_animation() -> void:
+ """停止期待动画"""
+ if anticipation_tween:
+ anticipation_tween.kill()
+ anticipation_tween = null
+
+ # 恢复所有模板的正常颜色
+ for i in range(reward_templates.size()):
+ var template = reward_templates[i]
+ template.modulate = Color.WHITE
+
+## 播放结果动画
+func _play_result_animation() -> void:
+ var tween = create_tween()
+
+ # 奖励区域动画
+ lucky_draw_reward.modulate.a = 0.0
+ lucky_draw_reward.scale = Vector2(0.8, 0.8)
+
+ tween.parallel().tween_property(lucky_draw_reward, "modulate:a", 1.0, 0.5)
+ tween.parallel().tween_property(lucky_draw_reward, "scale", Vector2(1.0, 1.0), 0.5)
+
+## 显示错误信息
+func _show_error_message(message: String) -> void:
+ """显示错误信息"""
+ lucky_draw_reward.text = "[center][color=#FF6B6B]❌ %s[/color][/center]" % message
+ lucky_draw_reward.show()
+
+ # 2秒后隐藏错误信息
+ await get_tree().create_timer(2.0).timeout
+ lucky_draw_reward.hide()
+
+# =============================================================================
+# 事件处理
+# =============================================================================
+
+## 关闭面板
+func _on_quit_button_pressed() -> void:
+ self.hide()
+
+## 单次抽奖
+func _on_lucky_draw_button_pressed() -> void:
+ _perform_network_draw("single")
+
+## 五连抽
+func _on_five_lucky_draw_button_pressed() -> void:
+ _perform_network_draw("five")
+
+## 十连抽
+func _on_ten_lucky_draw_button_pressed() -> void:
+ _perform_network_draw("ten")
+
+## 设置抽奖按钮可用状态
+func _set_draw_buttons_enabled(enabled: bool) -> void:
+ var buttons = [
+ $HBox/LuckyDrawButton,
+ $HBox/FiveLuckyDrawButton,
+ $HBox/TenLuckyDrawButton
+ ]
+
+ for button in buttons:
+ if button:
+ button.disabled = not enabled
+
+# =============================================================================
+# 公共接口方法
+# =============================================================================
+
+## 获取当前奖励结果
+func get_current_rewards() -> Array:
+ return current_rewards
+
+## 清空抽奖结果
+func clear_draw_results() -> void:
+ current_rewards.clear()
+ lucky_draw_reward.hide()
+
+## 刷新奖励显示(当作物数据更新时调用)
+func refresh_reward_display() -> void:
+ """刷新奖励显示"""
+ _load_crop_data_and_build_rewards()
+ _update_template_display()
diff --git a/GUI/LuckyDrawPanel.gd.uid b/GUI/LuckyDrawPanel.gd.uid
new file mode 100644
index 0000000..25cbe41
--- /dev/null
+++ b/GUI/LuckyDrawPanel.gd.uid
@@ -0,0 +1 @@
+uid://65e0rl31fx0i
diff --git a/GUI/LuckyDrawPanel.tscn b/GUI/LuckyDrawPanel.tscn
new file mode 100644
index 0000000..79bfd36
--- /dev/null
+++ b/GUI/LuckyDrawPanel.tscn
@@ -0,0 +1,101 @@
+[gd_scene load_steps=2 format=3 uid="uid://bndf1e4sgdjr6"]
+
+[ext_resource type="Script" uid="uid://65e0rl31fx0i" path="res://GUI/LuckyDrawPanel.gd" id="1_dcmen"]
+
+[node name="LuckyDrawPanel" type="Panel"]
+offset_right = 600.0
+offset_bottom = 720.0
+script = ExtResource("1_dcmen")
+
+[node name="Title" type="Label" parent="."]
+layout_mode = 0
+offset_top = -1.0
+offset_right = 600.0
+offset_bottom = 58.0
+theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1)
+theme_override_font_sizes/font_size = 35
+text = "幸运抽奖"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Label" type="Label" parent="."]
+modulate = Color(0.642982, 0.510828, 1, 1)
+layout_mode = 0
+offset_top = 419.0
+offset_right = 600.0
+offset_bottom = 468.0
+theme_override_font_sizes/font_size = 30
+text = "🎉获得奖励🎉"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="QuitButton" type="Button" parent="."]
+custom_minimum_size = Vector2(57, 57)
+layout_mode = 0
+offset_left = 543.0
+offset_top = 1.0
+offset_right = 600.0
+offset_bottom = 58.0
+theme_override_font_sizes/font_size = 35
+text = "X"
+
+[node name="LuckyDrawReward" type="RichTextLabel" parent="."]
+layout_mode = 0
+offset_top = 481.0
+offset_right = 600.0
+offset_bottom = 649.0
+theme_override_font_sizes/normal_font_size = 20
+bbcode_enabled = true
+text = "+500 经验,+400 钱币,+5 普通-番茄种子,+1 传奇-火龙果种子 "
+horizontal_alignment = 1
+
+[node name="Grid" type="GridContainer" parent="."]
+layout_mode = 0
+offset_top = 58.0
+offset_right = 600.0
+offset_bottom = 419.0
+columns = 5
+
+[node name="RewardItem" type="RichTextLabel" parent="Grid"]
+custom_minimum_size = Vector2(120, 120)
+layout_mode = 2
+text = "+50钱币
++100经验
++4番茄种子
++3火龙果种子"
+horizontal_alignment = 1
+vertical_alignment = 1
+threaded = true
+
+[node name="HBox" type="HBoxContainer" parent="."]
+layout_mode = 0
+offset_top = 649.0
+offset_right = 600.0
+offset_bottom = 719.0
+alignment = 1
+
+[node name="FiveLuckyDrawButton" type="Button" parent="HBox"]
+modulate = Color(0.623529, 1, 0.996078, 1)
+custom_minimum_size = Vector2(150, 70)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "五连抽"
+
+[node name="TenLuckyDrawButton" type="Button" parent="HBox"]
+modulate = Color(0.690196, 1, 0.52549, 1)
+custom_minimum_size = Vector2(150, 70)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "十连抽"
+
+[node name="LuckyDrawButton" type="Button" parent="HBox"]
+modulate = Color(1, 1, 0.52549, 1)
+custom_minimum_size = Vector2(150, 70)
+layout_mode = 2
+theme_override_font_sizes/font_size = 35
+text = "抽奖"
+
+[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"]
+[connection signal="pressed" from="HBox/FiveLuckyDrawButton" to="." method="_on_five_lucky_draw_button_pressed"]
+[connection signal="pressed" from="HBox/TenLuckyDrawButton" to="." method="_on_ten_lucky_draw_button_pressed"]
+[connection signal="pressed" from="HBox/LuckyDrawButton" to="." method="_on_lucky_draw_button_pressed"]
diff --git a/GUI/MainMenuPanel.gd b/GUI/MainMenuPanel.gd
new file mode 100644
index 0000000..484a6ad
--- /dev/null
+++ b/GUI/MainMenuPanel.gd
@@ -0,0 +1,42 @@
+extends Control
+#各种面板
+@onready var game_about_panel: Panel = $GameAboutPanel
+@onready var game_update_panel: Panel = $GameUpdatePanel
+@onready var game_setting_panel: Panel = $GameSettingPanel
+
+@onready var game_version_label: Label = $GUI/GameVersionLabel
+
+@export var smy :TextureRect
+
+func _ready():
+ game_version_label.text = "版本号:"+GlobalVariables.client_version
+ pass
+
+func SetGameVersionLabel(version :String):
+ game_version_label.text = version
+ pass
+
+#开始游戏
+func _on_start_game_button_pressed() -> void:
+ get_tree().change_scene_to_file('res://MainGame.tscn')
+ pass
+
+#游戏设置
+func _on_game_setting_button_pressed() -> void:
+ game_setting_panel.show()
+ pass
+
+#游戏更新
+func _on_game_update_button_pressed() -> void:
+ game_update_panel.ShowPanel( )
+ pass
+
+#游戏关于
+func _on_game_about_button_pressed() -> void:
+ game_about_panel.show()
+ pass
+
+#游戏结束
+func _on_exit_button_pressed() -> void:
+ get_tree().quit()
+ pass
diff --git a/GUI/MainMenuPanel.gd.uid b/GUI/MainMenuPanel.gd.uid
new file mode 100644
index 0000000..7264d9c
--- /dev/null
+++ b/GUI/MainMenuPanel.gd.uid
@@ -0,0 +1 @@
+uid://badqjgdfhg7vt
diff --git a/GUI/MainMenuPanel.tscn b/GUI/MainMenuPanel.tscn
new file mode 100644
index 0000000..bb48469
--- /dev/null
+++ b/GUI/MainMenuPanel.tscn
@@ -0,0 +1,268 @@
+[gd_scene load_steps=9 format=3 uid="uid://bypjb28h4ntdr"]
+
+[ext_resource type="Script" uid="uid://badqjgdfhg7vt" path="res://GUI/MainMenuPanel.gd" id="1_wpehy"]
+[ext_resource type="Texture2D" uid="uid://bhdqkhf0y2ply" path="res://assets/UI/背景1.jpg" id="2_fys16"]
+[ext_resource type="Script" path="res://GUI/GameSettingPanel.gd" id="2_n0pjj"]
+[ext_resource type="Texture2D" uid="uid://4kvddwqlodpg" path="res://assets/logo_title/logo1.png" id="3_sr106"]
+[ext_resource type="Script" path="res://GUI/GameAboutPanel.gd" id="3_y0inj"]
+[ext_resource type="Script" uid="uid://kj7v1uxk2i6h" path="res://GUI/GameUpdatePanel.gd" id="4_fys16"]
+[ext_resource type="Texture2D" uid="uid://b5of6puh4efui" path="res://assets/杂项/柚小青装饰品.png" id="5_eghpk"]
+[ext_resource type="Texture2D" uid="uid://cuuqapjbrsdy7" path="res://assets/UI/QQ群.jpg" id="5_y0inj"]
+
+[node name="MainMenuPanel" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_right = -2.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_wpehy")
+
+[node name="Background" type="TextureRect" parent="."]
+self_modulate = Color(1, 1, 1, 0.34902)
+layout_mode = 0
+offset_left = -131.0
+offset_top = -24.0
+offset_right = 1568.0
+offset_bottom = 734.0
+texture = ExtResource("2_fys16")
+
+[node name="GUI" type="Control" parent="."]
+anchors_preset = 0
+offset_right = 40.0
+offset_bottom = 40.0
+
+[node name="GameLogo" type="TextureRect" parent="GUI"]
+layout_mode = 0
+offset_left = 450.0
+offset_top = -24.0
+offset_right = 1730.0
+offset_bottom = 696.0
+scale = Vector2(0.4, 0.4)
+texture = ExtResource("3_sr106")
+stretch_mode = 2
+
+[node name="RichTextLabel" type="RichTextLabel" parent="GUI"]
+visible = false
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 88.0
+theme_override_font_sizes/normal_font_size = 40
+bbcode_enabled = true
+text = "萌芽农场"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="GameVersionLabel" type="Label" parent="GUI"]
+layout_mode = 0
+offset_top = 676.0
+offset_right = 188.0
+offset_bottom = 718.0
+theme_override_font_sizes/font_size = 30
+text = "版本号:v1.0.1"
+
+[node name="AddGroupLabel" type="Label" parent="GUI"]
+self_modulate = Color(1, 1, 0, 1)
+layout_mode = 0
+offset_left = 896.0
+offset_top = 205.0
+offset_right = 1226.0
+offset_bottom = 247.0
+theme_override_font_sizes/font_size = 30
+text = "加群获取最新开发动态!"
+
+[node name="QQGroupImage" type="TextureRect" parent="GUI/AddGroupLabel"]
+layout_mode = 0
+offset_left = 17.0
+offset_top = 43.0
+offset_right = 952.0
+offset_bottom = 1229.0
+scale = Vector2(0.3, 0.3)
+texture = ExtResource("5_y0inj")
+
+[node name="YouXiaoQing" type="TextureRect" parent="GUI/AddGroupLabel"]
+layout_mode = 0
+offset_left = 298.0
+offset_top = 82.0
+offset_right = 1233.0
+offset_bottom = 1268.0
+scale = Vector2(0.14, 0.14)
+texture = ExtResource("5_eghpk")
+
+[node name="VBox" type="VBoxContainer" parent="."]
+layout_mode = 0
+offset_top = 248.0
+offset_right = 1398.0
+offset_bottom = 720.0
+
+[node name="StartGameButton" type="Button" parent="VBox"]
+custom_minimum_size = Vector2(168, 63)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_font_sizes/font_size = 40
+text = "开始游戏"
+
+[node name="GameSettingButton" type="Button" parent="VBox"]
+custom_minimum_size = Vector2(168, 63)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_font_sizes/font_size = 40
+text = "设置"
+
+[node name="GameUpdateButton" type="Button" parent="VBox"]
+custom_minimum_size = Vector2(168, 63)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_font_sizes/font_size = 40
+text = "游戏更新"
+
+[node name="GameAboutButton" type="Button" parent="VBox"]
+custom_minimum_size = Vector2(168, 63)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_font_sizes/font_size = 40
+text = "关于"
+
+[node name="ExitButton" type="Button" parent="VBox"]
+custom_minimum_size = Vector2(168, 63)
+layout_mode = 2
+size_flags_horizontal = 4
+theme_override_font_sizes/font_size = 40
+text = "退出游戏"
+
+[node name="GameSettingPanel" type="Panel" parent="."]
+visible = false
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 720.0
+script = ExtResource("2_n0pjj")
+
+[node name="Title" type="Label" parent="GameSettingPanel"]
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 80.0
+theme_override_font_sizes/font_size = 45
+text = "游戏设置"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="QuitButton" type="Button" parent="GameSettingPanel"]
+custom_minimum_size = Vector2(60, 60)
+layout_mode = 0
+offset_left = 1340.0
+offset_right = 1400.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "X"
+
+[node name="Scroll" type="ScrollContainer" parent="GameSettingPanel"]
+layout_mode = 0
+offset_top = 80.0
+offset_right = 1400.0
+offset_bottom = 720.0
+
+[node name="Contents" type="RichTextLabel" parent="GameSettingPanel/Scroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="GameAboutPanel" type="Panel" parent="."]
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 720.0
+script = ExtResource("3_y0inj")
+
+[node name="Title" type="Label" parent="GameAboutPanel"]
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 80.0
+theme_override_font_sizes/font_size = 45
+text = "关于"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="QuitButton" type="Button" parent="GameAboutPanel"]
+custom_minimum_size = Vector2(60, 60)
+layout_mode = 0
+offset_left = 1340.0
+offset_right = 1400.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "X"
+
+[node name="Scroll" type="ScrollContainer" parent="GameAboutPanel"]
+layout_mode = 0
+offset_top = 80.0
+offset_right = 1400.0
+offset_bottom = 720.0
+
+[node name="Contents" type="RichTextLabel" parent="GameAboutPanel/Scroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_font_sizes/normal_font_size = 30
+text = "玩法介绍:
+1.版本要匹配,服务器版本一直在更新,请及时下载最新版客户端,否者无法登录游戏
+2.游戏目前适配Windows和安卓平台,未来也会适配Linux桌面版,IOS应该会有吧...?
+3.电脑Windows平台按住wsad或者方向键可以移动视角,鼠标滚轮可以缩放视角;安卓则为拖动和双指缩放
+3.注册账号一定一定要用QQ号,目前游戏的所有登录服务都是围绕着腾讯QQ来验证,注册时会向您输入的QQ号对应的QQ邮箱发送一封注册邮件。
+4.不要一上来就把钱用完了(比如某某人一上来就十连抽),可以去偷别人的菜
+
+致谢名单:
+虚空领主:(美术抠图)
+豆包:(万能的美术)"
+
+[node name="GameUpdatePanel" type="Panel" parent="."]
+visible = false
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 720.0
+script = ExtResource("4_fys16")
+
+[node name="Scroll" type="ScrollContainer" parent="GameUpdatePanel"]
+layout_mode = 0
+offset_top = 80.0
+offset_right = 1400.0
+offset_bottom = 720.0
+
+[node name="Contents" type="RichTextLabel" parent="GameUpdatePanel/Scroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+bbcode_enabled = true
+
+[node name="Title" type="Label" parent="GameUpdatePanel"]
+layout_mode = 0
+offset_right = 1398.0
+offset_bottom = 80.0
+theme_override_font_sizes/font_size = 45
+text = "游戏更新"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="QuitButton" type="Button" parent="GameUpdatePanel"]
+custom_minimum_size = Vector2(60, 60)
+layout_mode = 0
+offset_left = 1340.0
+offset_right = 1400.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "X"
+
+[node name="RefreshButton" type="Button" parent="GameUpdatePanel"]
+custom_minimum_size = Vector2(60, 60)
+layout_mode = 0
+offset_right = 78.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "刷新"
+
+[connection signal="pressed" from="VBox/StartGameButton" to="." method="_on_start_game_button_pressed"]
+[connection signal="pressed" from="VBox/GameSettingButton" to="." method="_on_game_setting_button_pressed"]
+[connection signal="pressed" from="VBox/GameUpdateButton" to="." method="_on_game_update_button_pressed"]
+[connection signal="pressed" from="VBox/GameAboutButton" to="." method="_on_game_about_button_pressed"]
+[connection signal="pressed" from="VBox/ExitButton" to="." method="_on_exit_button_pressed"]
+[connection signal="pressed" from="GameSettingPanel/QuitButton" to="GameSettingPanel" method="_on_quit_button_pressed"]
+[connection signal="pressed" from="GameAboutPanel/QuitButton" to="GameAboutPanel" method="_on_quit_button_pressed"]
+[connection signal="pressed" from="GameUpdatePanel/QuitButton" to="GameUpdatePanel" method="_on_quit_button_pressed"]
diff --git a/GUI/OneClickPlantPanel.gd b/GUI/OneClickPlantPanel.gd
new file mode 100644
index 0000000..beefe06
--- /dev/null
+++ b/GUI/OneClickPlantPanel.gd
@@ -0,0 +1,464 @@
+extends Panel
+#一键种植面板
+#通过不断地调用土地面板的种植功能来实现一键种植,减少玩家重复性工作
+#执行间隔为0.25秒
+#目前分为
+#全屏种植:从序列号0开始依次种植玩家选定植物,直到玩家种子用完为止,或者完成种植
+#行种植:需要玩家点击某个地块,然后从该行从左到右依次种植
+#列种植:需要玩家点击某个地块,然后从该列从上到下依次种植
+#九宫格种植:需要玩家点击某个地块,然后从该地块上下左右四周九个方向各自种植一个植物
+#十字法种植:需要玩家点击某个地块,然后从上下左右四个方向各自种植一个植物
+#注意,无论点击的是已经种植的地块,未开垦地块还是空地地块都不影响,因为点击只是为了确认一个具体位置
+#然后在一键种植过程中,如果遇到已种植地块,未开垦地块,还是这个方向根本就没有地块等非法操作,没有关系直接跳过即可
+#为了方便你确认位置和方向,我的客户端地块排列是10行,4-8列(目前是但不确定以后会不会更改排布,你最好留个接口)
+#你可以参考一下一键收获功能的原理实现
+#注意注意,以上操作都是在客户端完成,服务端不要添加什么操作
+#默认一键种植收费为种植作物的总和价格的20%+基础费用500
+#注意钱不够的问题
+
+@onready var full_screen_plant_btn: Button = $Grid/FullScreenPlantBtn #全屏种植
+@onready var one_row_plant_btn: Button = $Grid/OneRowPlantBtn #行种植
+@onready var one_column_plant_btn: Button = $Grid/OneColumnPlantBtn #列种植
+@onready var nine_square_plant_btn: Button = $Grid/NineSquarePlantBtn #九宫格种植
+@onready var cross_plant_btn: Button = $Grid/CrossPlantBtn #十字法种植
+
+# 引用主游戏和其他面板
+@onready var main_game = get_node("/root/main")
+@onready var player_bag_panel = get_node("/root/main/UI/PlayerBagPanel")
+@onready var network_manager = get_node("/root/main/UI/TCPNetworkManager")
+
+# 种植配置
+# 注意:地块的实际布局可能与代码设想的不同,这里提供可配置的接口
+const GRID_COLUMNS = 10 # 地块列数配置接口,可根据需要调整
+const GRID_ROWS_MIN = 4 # 最小行数
+const GRID_ROWS_MAX = 8 # 最大行数
+const BASE_COST = 500 # 基础费用
+const COST_RATE = 0.2 # 种植成本比例(20%)
+const PLANT_INTERVAL = 0.25 # 种植间隔时间
+
+# 种植状态变量
+var is_planting = false
+var selected_crop_name = ""
+var selected_crop_count = 0
+var plant_timer = 0.0
+var plant_queue = [] # 种植队列,存储要种植的地块索引
+var current_plant_index = 0
+
+# 等待用户点击地块的状态
+var is_waiting_for_lot_selection = false
+var pending_plant_type = ""
+
+func _ready():
+ self.hide()
+
+ # 连接按钮信号
+ full_screen_plant_btn.pressed.connect(_on_full_screen_plant_pressed)
+ one_row_plant_btn.pressed.connect(_on_one_row_plant_pressed)
+ one_column_plant_btn.pressed.connect(_on_one_column_plant_pressed)
+ nine_square_plant_btn.pressed.connect(_on_nine_square_plant_pressed)
+ cross_plant_btn.pressed.connect(_on_cross_plant_pressed)
+
+ # 设置按钮提示文本
+ _setup_button_tooltips()
+
+func _process(delta):
+ if is_planting:
+ plant_timer += delta
+ if plant_timer >= PLANT_INTERVAL:
+ plant_timer = 0.0
+ _process_plant_queue()
+
+# 全屏种植按钮处理
+func _on_full_screen_plant_pressed():
+ _request_crop_selection("全屏种植", "选择要种植的作物进行全屏种植")
+
+# 行种植按钮处理
+func _on_one_row_plant_pressed():
+ _start_lot_selection_mode("行种植")
+
+# 列种植按钮处理
+func _on_one_column_plant_pressed():
+ _start_lot_selection_mode("列种植")
+
+# 九宫格种植按钮处理
+func _on_nine_square_plant_pressed():
+ _start_lot_selection_mode("九宫格种植")
+
+# 十字法种植按钮处理
+func _on_cross_plant_pressed():
+ _start_lot_selection_mode("十字法种植")
+
+# 开始地块选择模式
+func _start_lot_selection_mode(plant_type: String):
+ is_waiting_for_lot_selection = true
+ pending_plant_type = plant_type
+
+ # 隐藏一键种植面板
+ self.hide()
+
+ # 显示提示信息
+ var tip_message = ""
+ match plant_type:
+ "行种植":
+ tip_message = "请点击一个地块来确定要种植的行"
+ "列种植":
+ tip_message = "请点击一个地块来确定要种植的列"
+ "九宫格种植":
+ tip_message = "请点击一个地块来确定九宫格种植的中心位置"
+ "十字法种植":
+ tip_message = "请点击一个地块来确定十字法种植的中心位置"
+ _:
+ tip_message = "请点击一个地块"
+
+ Toast.show(tip_message + "(按ESC键取消)", Color.CYAN)
+ print("进入地块选择模式:%s" % plant_type)
+
+# 处理地块选择(从MainGame调用)
+func on_lot_selected(lot_index: int):
+ if not is_waiting_for_lot_selection:
+ return false # 不是等待地块选择状态,返回false让MainGame正常处理
+
+ # 退出地块选择模式
+ is_waiting_for_lot_selection = false
+
+ # 设置选择的地块索引
+ main_game.selected_lot_index = lot_index
+
+ # 开始作物选择
+ _request_crop_selection(pending_plant_type, "选择要种植的作物进行" + pending_plant_type)
+
+ # 清空待处理的种植类型
+ pending_plant_type = ""
+
+ return true # 返回true表示已处理了地块选择
+
+# 请求作物选择
+func _request_crop_selection(plant_type: String, tip_message: String):
+ # 检查背包是否有种子
+ if main_game.player_bag.size() == 0:
+ Toast.show("背包中没有种子,请先去商店购买", Color.RED)
+ return
+
+ var has_seeds = false
+ for item in main_game.player_bag:
+ if item["count"] > 0:
+ has_seeds = true
+ break
+
+ if not has_seeds:
+ Toast.show("背包中没有可用的种子", Color.RED)
+ return
+
+ Toast.show(tip_message, Color.CYAN)
+ self.hide()
+
+ # 设置背包面板的种植模式回调
+ player_bag_panel.set_planting_mode(plant_type, self)
+ player_bag_panel.show()
+
+# 背包选择作物回调函数
+func on_crop_selected(crop_name: String, plant_type: String):
+ selected_crop_name = crop_name
+
+ # 检查背包中的作物数量
+ selected_crop_count = _get_crop_count_in_bag(crop_name)
+ if selected_crop_count <= 0:
+ Toast.show("背包中没有 " + crop_name + " 种子", Color.RED)
+ return
+
+ print("开始准备一键种植:")
+ print(" 选择作物:%s" % crop_name)
+ print(" 种植模式:%s" % plant_type)
+ print(" 背包数量:%d" % selected_crop_count)
+
+ # 根据种植类型生成种植队列
+ match plant_type:
+ "全屏种植":
+ _prepare_full_screen_plant()
+ "行种植":
+ _prepare_row_plant()
+ "列种植":
+ _prepare_column_plant()
+ "九宫格种植":
+ _prepare_nine_square_plant()
+ "十字法种植":
+ _prepare_cross_plant()
+ _:
+ Toast.show("未知的种植模式:" + plant_type, Color.RED)
+ print("错误:未知的种植模式:%s" % plant_type)
+
+# 获取背包中指定作物的数量
+func _get_crop_count_in_bag(crop_name: String) -> int:
+ for item in main_game.player_bag:
+ if item["name"] == crop_name:
+ return item["count"]
+ return 0
+
+# 准备全屏种植
+func _prepare_full_screen_plant():
+ plant_queue.clear()
+
+ # 从序列号0开始依次添加可种植的地块
+ for i in range(len(main_game.farm_lots)):
+ if _can_plant_at_index(i):
+ plant_queue.append(i)
+
+ _start_planting("全屏种植")
+
+# 准备行种植
+func _prepare_row_plant():
+ plant_queue.clear()
+ var target_row = _get_row_from_index(main_game.selected_lot_index)
+
+ # 添加同一行的所有可种植地块(从左到右)
+ for i in range(len(main_game.farm_lots)):
+ if _get_row_from_index(i) == target_row and _can_plant_at_index(i):
+ plant_queue.append(i)
+
+ _start_planting("行种植")
+
+# 准备列种植
+func _prepare_column_plant():
+ plant_queue.clear()
+ var target_column = _get_column_from_index(main_game.selected_lot_index)
+
+ # 添加同一列的所有可种植地块(从上到下)
+ for i in range(len(main_game.farm_lots)):
+ if _get_column_from_index(i) == target_column and _can_plant_at_index(i):
+ plant_queue.append(i)
+
+ _start_planting("列种植")
+
+# 准备九宫格种植
+func _prepare_nine_square_plant():
+ plant_queue.clear()
+ var center_row = _get_row_from_index(main_game.selected_lot_index)
+ var center_column = _get_column_from_index(main_game.selected_lot_index)
+
+ # 九宫格的相对位置偏移
+ var offsets = [
+ [-1, -1], [-1, 0], [-1, 1],
+ [0, -1], [0, 0], [0, 1],
+ [1, -1], [1, 0], [1, 1]
+ ]
+
+ for offset in offsets:
+ var row = center_row + offset[0]
+ var column = center_column + offset[1]
+ var index = _get_index_from_row_column(row, column)
+
+ if index != -1 and _can_plant_at_index(index):
+ plant_queue.append(index)
+
+ _start_planting("九宫格种植")
+
+# 准备十字法种植
+func _prepare_cross_plant():
+ plant_queue.clear()
+ var center_row = _get_row_from_index(main_game.selected_lot_index)
+ var center_column = _get_column_from_index(main_game.selected_lot_index)
+
+ # 十字法的相对位置偏移
+ var offsets = [
+ [0, 0], # 中心
+ [-1, 0], # 上
+ [1, 0], # 下
+ [0, -1], # 左
+ [0, 1] # 右
+ ]
+
+ for offset in offsets:
+ var row = center_row + offset[0]
+ var column = center_column + offset[1]
+ var index = _get_index_from_row_column(row, column)
+
+ if index != -1 and _can_plant_at_index(index):
+ plant_queue.append(index)
+
+ _start_planting("十字法种植")
+
+# 开始种植
+func _start_planting(plant_type: String):
+ if plant_queue.size() == 0:
+ Toast.show("没有可种植的地块", Color.YELLOW)
+ return
+
+ # 限制种植数量不超过背包中的种子数量
+ var max_plantable = min(plant_queue.size(), selected_crop_count)
+ if max_plantable < plant_queue.size():
+ plant_queue = plant_queue.slice(0, max_plantable)
+
+ # 计算总费用
+ var crop_data = main_game.can_planted_crop.get(selected_crop_name, {})
+ var crop_price = crop_data.get("花费", 0)
+ var total_crop_cost = crop_price * plant_queue.size()
+ var service_fee = int(total_crop_cost * COST_RATE) + BASE_COST
+ var total_cost = service_fee # 只收取服务费,种子费用由种植时扣除
+
+ print("一键种植费用计算:")
+ print(" 作物:%s,单价:%d 元" % [selected_crop_name, crop_price])
+ print(" 种植数量:%d 个地块" % plant_queue.size())
+ print(" 作物总成本:%d 元" % total_crop_cost)
+ print(" 服务费率:%.1f%%" % (COST_RATE * 100))
+ print(" 基础费用:%d 元" % BASE_COST)
+ print(" 总服务费:%d 元" % total_cost)
+ print(" 玩家当前金钱:%d 元" % main_game.money)
+
+ # 检查金钱是否足够支付服务费
+ if main_game.money < total_cost:
+ Toast.show("金钱不足!%s需要服务费 %d 元(当前:%d 元)" % [plant_type, total_cost, main_game.money], Color.RED)
+ return
+
+ # 扣除服务费
+ main_game.money -= total_cost
+ main_game._update_ui()
+
+ # 开始种植
+ is_planting = true
+ current_plant_index = 0
+ plant_timer = 0.0
+
+ # 更新按钮状态为种植中
+ _update_buttons_planting_state(true)
+
+ Toast.show("开始%s,预计种植 %d 个地块,服务费 %d 元" % [plant_type, plant_queue.size(), total_cost], Color.GREEN)
+ print("开始%s,种植队列: %s" % [plant_type, str(plant_queue)])
+
+# 处理种植队列
+func _process_plant_queue():
+ if current_plant_index >= plant_queue.size():
+ # 种植完成
+ _finish_planting()
+ return
+
+ var lot_index = plant_queue[current_plant_index]
+
+ # 检查是否还有种子和该地块是否仍可种植
+ if _get_crop_count_in_bag(selected_crop_name) > 0 and _can_plant_at_index(lot_index):
+ # 执行种植
+ _plant_at_index(lot_index)
+
+ current_plant_index += 1
+
+# 完成种植
+func _finish_planting():
+ is_planting = false
+ var planted_count = current_plant_index
+ var success_count = min(planted_count, selected_crop_count)
+
+ # 恢复按钮状态
+ _update_buttons_planting_state(false)
+
+ Toast.show("一键种植完成!成功种植 %d 个地块" % success_count, Color.GREEN)
+ print("一键种植完成,成功种植了 %d 个地块" % success_count)
+
+ # 清空队列
+ plant_queue.clear()
+ current_plant_index = 0
+
+# 在指定索引处种植
+func _plant_at_index(lot_index: int):
+ if network_manager and network_manager.sendPlantCrop(lot_index, selected_crop_name):
+ print("发送种植请求:地块 %d,作物 %s" % [lot_index, selected_crop_name])
+ else:
+ print("发送种植请求失败:地块 %d" % lot_index)
+
+# 检查指定索引的地块是否可以种植
+func _can_plant_at_index(index: int) -> bool:
+ if index < 0 or index >= len(main_game.farm_lots):
+ return false
+
+ var lot = main_game.farm_lots[index]
+
+ # 必须是已开垦且未种植的地块
+ return lot.get("is_diged", false) and not lot.get("is_planted", false)
+
+# 根据索引获取行号
+func _get_row_from_index(index: int) -> int:
+ if index < 0:
+ return -1
+ return index / GRID_COLUMNS
+
+# 根据索引获取列号
+func _get_column_from_index(index: int) -> int:
+ if index < 0:
+ return -1
+ return index % GRID_COLUMNS
+
+# 根据行列号获取索引
+func _get_index_from_row_column(row: int, column: int) -> int:
+ if row < 0 or column < 0 or column >= GRID_COLUMNS:
+ return -1
+
+ var index = row * GRID_COLUMNS + column
+ if index >= len(main_game.farm_lots):
+ return -1
+
+ return index
+
+# 设置按钮提示文本
+func _setup_button_tooltips():
+ full_screen_plant_btn.tooltip_text = "从第一个地块开始依次种植选定作物,直到种子用完或地块种完\n费用:种植总成本的20% + 500元基础费"
+ one_row_plant_btn.tooltip_text = "在选定地块所在的行中从左到右依次种植\n点击此按钮后,再点击农场中的任意地块确定行位置\n费用:种植总成本的20% + 500元基础费"
+ one_column_plant_btn.tooltip_text = "在选定地块所在的列中从上到下依次种植\n点击此按钮后,再点击农场中的任意地块确定列位置\n费用:种植总成本的20% + 500元基础费"
+ nine_square_plant_btn.tooltip_text = "以选定地块为中心的3x3九宫格范围内种植\n点击此按钮后,再点击农场中的任意地块确定中心位置\n费用:种植总成本的20% + 500元基础费"
+ cross_plant_btn.tooltip_text = "以选定地块为中心的十字形(上下左右+中心)种植\n点击此按钮后,再点击农场中的任意地块确定中心位置\n费用:种植总成本的20% + 500元基础费"
+
+# 更新按钮状态
+func _update_buttons_planting_state(planting: bool):
+ if planting:
+ # 种植中,禁用所有种植按钮
+ full_screen_plant_btn.disabled = true
+ one_row_plant_btn.disabled = true
+ one_column_plant_btn.disabled = true
+ nine_square_plant_btn.disabled = true
+ cross_plant_btn.disabled = true
+
+ full_screen_plant_btn.text = "种植中..."
+ one_row_plant_btn.text = "种植中..."
+ one_column_plant_btn.text = "种植中..."
+ nine_square_plant_btn.text = "种植中..."
+ cross_plant_btn.text = "种植中..."
+ else:
+ # 种植完成,恢复按钮状态
+ full_screen_plant_btn.disabled = false
+ one_row_plant_btn.disabled = false
+ one_column_plant_btn.disabled = false
+ nine_square_plant_btn.disabled = false
+ cross_plant_btn.disabled = false
+
+ full_screen_plant_btn.text = "全屏种植"
+ one_row_plant_btn.text = "行种植"
+ one_column_plant_btn.text = "列种植"
+ nine_square_plant_btn.text = "九宫格种植"
+ cross_plant_btn.text = "十字法种植"
+
+# 取消地块选择模式
+func cancel_lot_selection():
+ if is_waiting_for_lot_selection:
+ is_waiting_for_lot_selection = false
+ pending_plant_type = ""
+ Toast.show("已取消地块选择", Color.YELLOW)
+ print("用户取消了地块选择")
+ # 重新显示一键种植面板
+ self.show()
+
+# 停止当前种植过程
+func stop_planting():
+ if is_planting:
+ is_planting = false
+ Toast.show("一键种植已停止", Color.YELLOW)
+ print("用户停止了一键种植")
+ _finish_planting()
+
+#这个不用管
+func _on_quit_button_pressed() -> void:
+ # 如果正在种植,先停止种植
+ if is_planting:
+ stop_planting()
+ # 如果正在等待地块选择,取消选择
+ elif is_waiting_for_lot_selection:
+ cancel_lot_selection()
+ return # cancel_lot_selection已经重新显示了面板,不需要hide
+ self.hide()
+ pass
diff --git a/GUI/OneClickPlantPanel.gd.uid b/GUI/OneClickPlantPanel.gd.uid
new file mode 100644
index 0000000..5d02453
--- /dev/null
+++ b/GUI/OneClickPlantPanel.gd.uid
@@ -0,0 +1 @@
+uid://rlk8e51pibtm
diff --git a/GUI/crop_store_panel.gd b/GUI/crop_store_panel.gd
index c4184f5..f14d46e 100644
--- a/GUI/crop_store_panel.gd
+++ b/GUI/crop_store_panel.gd
@@ -73,6 +73,10 @@ func init_store():
for crop_name in main_game.can_planted_crop:
var crop = main_game.can_planted_crop[crop_name]
+ # 检查是否可以购买
+ if not crop.get("能否购买", true):
+ continue
+
# 只显示当前等级可以种植的作物
if crop["等级"] <= main_game.level:
var store_btn = _create_store_button(crop_name, crop["品质"])
@@ -192,8 +196,6 @@ func _on_store_buy_pressed(crop_name: String):
# 发送购买请求到服务器
if network_manager and network_manager.sendBuySeed(crop_name):
- # 购买请求已发送,等待服务器响应
- Toast.show("正在购买种子...", Color.YELLOW, 2.0, 1.0)
# 将种子添加到背包
var found = false
@@ -253,6 +255,10 @@ func _apply_filter_and_sort():
for crop_name in main_game.can_planted_crop:
var crop = main_game.can_planted_crop[crop_name]
+ # 检查是否可以购买
+ if not crop.get("能否购买", true):
+ continue
+
# 检查等级和品质过滤
if crop["等级"] > main_game.level:
continue
@@ -400,7 +406,7 @@ func _load_crop_textures(crop_name: String) -> Array:
# 尝试加载作物的序列帧(从0开始)
var frame_index = 0
while true:
- var texture_path = crop_path + str(frame_index) + ".png"
+ var texture_path = crop_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -440,7 +446,7 @@ func _load_default_textures() -> Array:
# 尝试加载默认图片序列帧
var frame_index = 0
while true:
- var texture_path = default_path + str(frame_index) + ".png"
+ var texture_path = default_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -453,7 +459,7 @@ func _load_default_textures() -> Array:
# 如果没有找到序列帧,尝试加载单个默认图片
if textures.size() == 0:
- var single_texture_path = default_path + "0.png"
+ var single_texture_path = default_path + "0.webp"
if ResourceLoader.exists(single_texture_path):
var texture = load(single_texture_path)
if texture:
diff --git a/GUI/land_panel.gd b/GUI/land_panel.gd
index aacb5cf..f8d69e1 100644
--- a/GUI/land_panel.gd
+++ b/GUI/land_panel.gd
@@ -39,13 +39,79 @@ func _ready():
_update_button_texts()
+# 显示面板时更新按钮状态
+func show_panel():
+ self.show()
+ _update_button_texts()
+ _update_button_availability()
+
+# 更新按钮可用性
+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():
- dig_button.text = "开垦"+"\n¥"+str(main_game.dig_money)
- remove_button.text = "铲除"+"\n¥500"
- water_button.text = "浇水"+"\n¥50"
- fertilize_button.text = "施肥"+"\n¥150"
- upgrade_button.text = "升级"+"\n¥1000"
+ # 根据是否访问模式显示不同的按钮文本
+ 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():
@@ -72,7 +138,6 @@ func _on_dig_button_pressed():
# 发送开垦土地请求到服务器
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendDigGround(selected_lot_index):
- Toast.show("正在开垦土地...", Color.YELLOW, 1.5, 1.0)
self.hide()
else:
Toast.show("发送开垦请求失败", Color.RED, 2.0, 1.0)
@@ -80,18 +145,20 @@ func _on_dig_button_pressed():
else:
Toast.show("网络未连接,无法开垦土地", Color.RED, 2.0, 1.0)
self.hide()
+
#浇水
func _on_water_button_pressed():
- # 检查是否处于访问模式
- if main_game.is_visiting_mode:
- Toast.show("访问模式下无法浇水", Color.ORANGE, 2.0, 1.0)
- self.hide()
- return
-
- # 检查玩家金钱是否足够
+ # 检查玩家金钱是否足够(无论是否访问模式都检查自己的钱)
var water_cost = 50
- if main_game.money < water_cost:
- Toast.show("金钱不足,浇水需要 " + str(water_cost) + " 金钱", Color.RED, 2.0, 1.0)
+ 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
@@ -115,34 +182,47 @@ func _on_water_button_pressed():
return
# 检查是否已经浇过水
- if lot.get("已浇水", false):
- Toast.show("今天已经浇过水了", Color.ORANGE, 2.0, 1.0)
+ 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):
- Toast.show("正在浇水...", Color.YELLOW, 1.5, 1.0)
+ if network_manager.sendWaterCrop(selected_lot_index, target_username):
self.hide()
else:
Toast.show("发送浇水请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
- Toast.show("网络未连接,无法浇水", Color.RED, 2.0, 1.0)
+ 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():
- # 检查是否处于访问模式
- if main_game.is_visiting_mode:
- Toast.show("访问模式下无法施肥", Color.ORANGE, 2.0, 1.0)
- self.hide()
- return
-
- # 检查玩家金钱是否足够
+ # 检查玩家金钱是否足够(无论是否访问模式都检查自己的钱)
var fertilize_cost = 150
- if main_game.money < fertilize_cost:
- Toast.show("金钱不足,施肥需要 " + str(fertilize_cost) + " 金钱", Color.RED, 2.0, 1.0)
+ 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
@@ -172,16 +252,21 @@ func _on_fertilize_button_pressed():
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):
- Toast.show("正在施肥...", Color.YELLOW, 1.5, 1.0)
+ if network_manager.sendFertilizeCrop(selected_lot_index, target_username):
self.hide()
else:
Toast.show("发送施肥请求失败", Color.RED, 2.0, 1.0)
self.hide()
else:
- Toast.show("网络未连接,无法施肥", Color.RED, 2.0, 1.0)
+ 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():
# 检查是否处于访问模式
@@ -190,31 +275,61 @@ func _on_upgrade_button_pressed():
self.hide()
return
- # 检查玩家金钱是否足够
- var upgrade_cost = 1000
- if main_game.money < upgrade_cost:
- Toast.show("金钱不足,升级土地需要 " + str(upgrade_cost) + " 金钱", Color.RED, 2.0, 1.0)
+ # 检查地块索引是否有效
+ 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 = lot.get("土地等级", 0)
- if current_level >= 1:
- Toast.show("此土地已经升级过了", Color.ORANGE, 2.0, 1.0)
+ # 获取当前土地等级和升级配置
+ 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):
- Toast.show("正在升级土地...", Color.YELLOW, 1.5, 1.0)
self.hide()
else:
Toast.show("发送升级请求失败", Color.RED, 2.0, 1.0)
@@ -222,6 +337,7 @@ func _on_upgrade_button_pressed():
else:
Toast.show("网络未连接,无法升级土地", Color.RED, 2.0, 1.0)
self.hide()
+
#种植
func _on_plant_button_pressed():
# 检查是否处于访问模式
@@ -258,7 +374,6 @@ func _on_remove_button_pressed():
# 发送铲除作物请求到服务器
if network_manager and network_manager.is_connected_to_server():
if network_manager.sendRemoveCrop(selected_lot_index):
- Toast.show("正在铲除作物...", Color.YELLOW, 1.5, 1.0)
self.hide()
else:
Toast.show("发送铲除请求失败", Color.RED, 2.0, 1.0)
@@ -267,17 +382,39 @@ func _on_remove_button_pressed():
Toast.show("网络未连接,无法铲除作物", Color.RED, 2.0, 1.0)
self.hide()
pass
+
#收获
func _on_harvest_button_pressed():
- # 检查是否处于访问模式
- if main_game.is_visiting_mode:
- Toast.show("访问模式下无法收获作物", Color.ORANGE, 2.0, 1.0)
+ # 检查地块状态
+ 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
- main_game._harvest_crop(selected_lot_index)
- self.hide()
+ # 检查作物是否成熟
+ 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()
diff --git a/GUI/login_panel.gd b/GUI/login_panel.gd
index f9f5840..9b1a5b2 100644
--- a/GUI/login_panel.gd
+++ b/GUI/login_panel.gd
@@ -65,14 +65,16 @@ func _on_login_button_pressed():
status_label.text = "未连接到服务器,正在尝试连接..."
status_label.modulate = Color.YELLOW
# 尝试自动连接到服务器
- tcp_network_manager._on_connection_button_pressed()
- await get_tree().create_timer(1.0).timeout
+ tcp_network_manager.connect_to_current_server()
+ await get_tree().create_timer(2.0).timeout
# 再次检查连接状态
if !tcp_network_manager.client.is_client_connected():
- status_label.text = "连接服务器失败,请检查网络设置!"
- status_label.modulate = Color.RED
- return
+ status_label.text = "连接服务器失败,正在尝试其他服务器..."
+ status_label.modulate = Color.YELLOW
+ # 等待自动服务器切换完成
+ await get_tree().create_timer(3.0).timeout
+
# 禁用按钮,防止重复点击
login_button.disabled = true
@@ -116,14 +118,16 @@ func _on_send_button_pressed():
status_label.text = "未连接到服务器,正在尝试连接..."
status_label.modulate = Color.YELLOW
# 尝试自动连接到服务器
- tcp_network_manager._on_connection_button_pressed()
- await get_tree().create_timer(1.0).timeout
+ tcp_network_manager.connect_to_current_server()
+ await get_tree().create_timer(2.0).timeout
# 再次检查连接状态
if !tcp_network_manager.client.is_client_connected():
- status_label.text = "连接服务器失败,请检查网络设置!"
- status_label.modulate = Color.RED
- return
+ status_label.text = "连接服务器失败,正在尝试其他服务器..."
+ status_label.modulate = Color.YELLOW
+ # 等待自动服务器切换完成
+ await get_tree().create_timer(3.0).timeout
+
# 禁用按钮,防止重复点击
send_button.disabled = true
@@ -192,14 +196,16 @@ func _on_register_button_pressed():
status_label.text = "未连接到服务器,正在尝试连接..."
status_label.modulate = Color.YELLOW
# 尝试自动连接到服务器
- tcp_network_manager._on_connection_button_pressed()
- await get_tree().create_timer(1.0).timeout
+ tcp_network_manager.connect_to_current_server()
+ await get_tree().create_timer(2.0).timeout
# 再次检查连接状态
if !tcp_network_manager.client.is_client_connected():
- status_label.text = "连接服务器失败,请检查网络设置!"
- status_label.modulate = Color.RED
- return
+ status_label.text = "连接服务器失败,正在尝试其他服务器..."
+ status_label.modulate = Color.YELLOW
+ # 等待自动服务器切换完成
+ await get_tree().create_timer(3.0).timeout
+
# 禁用按钮,防止重复点击
register_button.disabled = true
@@ -271,11 +277,15 @@ func _on_login_response_received(success: bool, message: String, user_data: Dict
status_label.text = "登录成功!正在加载游戏..."
status_label.modulate = Color.GREEN
+ # 保存登录数据到主游戏
+ main_game.login_data = user_data.duplicate()
+
# 更新主游戏数据
main_game.experience = user_data.get("experience", 0)
main_game.farm_lots = user_data.get("farm_lots", [])
main_game.level = user_data.get("level", 1)
main_game.money = user_data.get("money", 0)
+ main_game.stamina = user_data.get("体力值", 20)
main_game.show_farm_name.text = "农场名称:"+user_data.get("farm_name", "")
main_game.show_player_name.text = "玩家昵称:"+user_data.get("player_name", "")
farmname_input.text = user_data.get("farm_name", "")
@@ -293,6 +303,9 @@ func _on_login_response_received(success: bool, message: String, user_data: Dict
main_game._update_ui()
main_game._refresh_farm_lots()
player_bag_panel.update_player_bag_ui()
+
+ # 调用主游戏的登录成功处理函数
+ main_game.handle_login_success(user_data)
else:
status_label.text = "登录失败:" + message
status_label.modulate = Color.RED
diff --git a/GUI/player_bag_panel.gd b/GUI/player_bag_panel.gd
index 317b476..c52af1d 100644
--- a/GUI/player_bag_panel.gd
+++ b/GUI/player_bag_panel.gd
@@ -36,6 +36,11 @@ var current_filter_quality = ""
var current_sort_key = ""
var current_sort_ascending = true
+# 一键种植模式相关变量
+var is_planting_mode = false
+var planting_type = ""
+var one_click_plant_panel = null
+
# 准备函数
func _ready():
# 连接按钮信号
@@ -278,6 +283,16 @@ func _on_bag_seed_selected(crop_name):
Toast.show("访问模式下无法种植", Color.ORANGE, 2.0, 1.0)
return
+ # 检查是否是一键种植模式
+ if is_planting_mode:
+ # 一键种植模式下,回调给一键种植面板
+ if one_click_plant_panel and one_click_plant_panel.has_method("on_crop_selected"):
+ one_click_plant_panel.on_crop_selected(crop_name, planting_type)
+ # 退出种植模式
+ _exit_planting_mode()
+ self.hide()
+ return
+
# 从主场景获取当前选择的地块索引
selected_lot_index = main_game.selected_lot_index
@@ -344,13 +359,28 @@ func _plant_crop_from_bag(index, crop_name, seed_index):
# 发送种植请求到服务器
if network_manager and network_manager.sendPlantCrop(index, crop_name):
- # 种植请求已发送,等待服务器响应
- Toast.show("正在发送种植请求", Color.YELLOW, 2.0, 1.0)
# 关闭背包面板
hide()
+# 设置种植模式
+func set_planting_mode(plant_type: String, plant_panel):
+ is_planting_mode = true
+ planting_type = plant_type
+ one_click_plant_panel = plant_panel
+ print("进入种植模式:", plant_type)
+
+# 退出种植模式
+func _exit_planting_mode():
+ is_planting_mode = false
+ planting_type = ""
+ one_click_plant_panel = null
+ print("退出种植模式")
+
# 关闭面板
func _on_quit_button_pressed():
+ # 退出种植模式(如果当前在种植模式下)
+ if is_planting_mode:
+ _exit_planting_mode()
self.hide()
# 获取作物的最后一帧图片(用于背包显示)
@@ -389,7 +419,7 @@ func _load_crop_textures(crop_name: String) -> Array:
# 尝试加载作物的序列帧(从0开始)
var frame_index = 0
while true:
- var texture_path = crop_path + str(frame_index) + ".png"
+ var texture_path = crop_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -429,7 +459,7 @@ func _load_default_textures() -> Array:
# 尝试加载默认图片序列帧
var frame_index = 0
while true:
- var texture_path = default_path + str(frame_index) + ".png"
+ var texture_path = default_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -442,7 +472,7 @@ func _load_default_textures() -> Array:
# 如果没有找到序列帧,尝试加载单个默认图片
if textures.size() == 0:
- var single_texture_path = default_path + "0.png"
+ var single_texture_path = default_path + ".webp"
if ResourceLoader.exists(single_texture_path):
var texture = load(single_texture_path)
if texture:
diff --git a/GUI/player_ranking_item.tscn b/GUI/player_ranking_item.tscn
index 4731962..80b07a7 100644
--- a/GUI/player_ranking_item.tscn
+++ b/GUI/player_ranking_item.tscn
@@ -60,13 +60,21 @@ text = "访问"
layout_mode = 2
[node name="LastLoginTime" type="Label" parent="HBox2"]
+modulate = Color(0.811765, 1, 0.811765, 1)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 20
text = "最后在线:2025年12时09分35秒"
[node name="OnlineTime" type="Label" parent="HBox2"]
+modulate = Color(0.784314, 0.733333, 0.521569, 1)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 20
text = "累计在线时长:99时60分60秒"
+
+[node name="IsOnlineTime" type="Label" parent="HBox2"]
+layout_mode = 2
+size_flags_horizontal = 3
+theme_override_font_sizes/font_size = 20
+text = "正在检测中..."
diff --git a/GUI/player_ranking_panel.gd b/GUI/player_ranking_panel.gd
index b933d26..90cea8a 100644
--- a/GUI/player_ranking_panel.gd
+++ b/GUI/player_ranking_panel.gd
@@ -3,6 +3,8 @@ extends Panel
@onready var player_ranking_list : VBoxContainer = $Scroll/PlayerList
@onready var refresh_button : Button = $RefreshButton
@onready var quit_button : Button = $QuitButton
+@onready var register_player_num: Label = $RegisterPlayerNum #显示注册总人数
+
#预添加常用的面板
@onready var main_game = get_node("/root/main")
@@ -19,35 +21,72 @@ extends Panel
func _ready() -> void:
# 隐藏模板
player_info_template.visible = false
-
+
# 连接按钮信号
refresh_button.pressed.connect(_on_refresh_button_pressed)
quit_button.pressed.connect(_on_quit_button_pressed)
- # 初始加载排行榜
- request_player_rankings()
# 请求玩家排行榜数据
func request_player_rankings():
- if network_manager:
- network_manager.sendGetPlayerRankings()
+ if not network_manager:
+ print("网络管理器不可用")
+ register_player_num.text = "网络管理器不可用"
+ register_player_num.modulate = Color.RED
+ return false
+
+ if not network_manager.is_connected_to_server():
+ print("未连接到服务器")
+ register_player_num.text = "未连接服务器"
+ register_player_num.modulate = Color.RED
+ return false
+
+ var success = network_manager.sendGetPlayerRankings()
+ if not success:
+ print("发送排行榜请求失败")
+ register_player_num.text = "请求发送失败"
+ register_player_num.modulate = Color.RED
+ return false
+
+ return true
# 处理玩家排行榜响应
func handle_player_rankings_response(data):
+ # 重新启用刷新按钮
+ refresh_button.disabled = false
+ refresh_button.text = "刷新"
+
# 检查响应是否成功
if not data.get("success", false):
print("获取玩家排行榜失败:", data.get("message", "未知错误"))
+ register_player_num.text = "获取注册人数失败"
+ register_player_num.modulate = Color.RED
+ Toast.show("获取排行榜失败:" + data.get("message", "未知错误"), Color.RED)
return
+ # 显示注册总人数和在线人数
+ var total_registered = data.get("total_registered_players", 0)
+ var players_list = data.get("players", [])
+ var online_count = 0
+ for player in players_list:
+ if player.get("is_online", false):
+ online_count += 1
+
+ register_player_num.text = "总人数:" + str(int(total_registered)) + "| 在线:" + str(online_count)
+ register_player_num.modulate = Color.CYAN
+
# 清除现有的玩家条目(除了模板)
for child in player_ranking_list.get_children():
if child != player_info_template:
child.queue_free()
# 添加玩家条目
- var players = data.get("players", [])
+ var players = players_list
for player_data in players:
add_player_entry(player_data)
+
+ print("排行榜数据已更新,显示", players.size(), "个玩家,注册总人数:", total_registered)
+ Toast.show("排行榜已刷新!显示 " + str(players.size()) + " 个玩家", Color.GREEN)
# 添加单个玩家条目
func add_player_entry(player_data):
@@ -65,17 +104,28 @@ func add_player_entry(player_data):
var player_last_login_time = player_entry.get_node("HBox2/LastLoginTime")
var player_avatar = player_entry.get_node("HBox/PlayerAvatar")
var visit_button = player_entry.get_node("HBox/VisitButton")
+ var player_is_online_time = player_entry.get_node("HBox2/IsOnlineTime")
# 填充数据
var username = player_data.get("user_name", "未知")
var display_name = player_data.get("player_name", username)
player_name.text = display_name
- player_level.text = "等级: " + str(player_data.get("level", 0))
- player_money.text = "金币: " + str(player_data.get("money", 0))
- player_seed_num.text = "种子: " + str(player_data.get("seed_count", 0))
+ #都是整数,不要乱用浮点数
+ player_level.text = "等级: " + str(int(player_data.get("level", 0)))
+ player_money.text = "金币: " + str(int(player_data.get("money", 0)))
+ player_seed_num.text = "种子: " + str(int(player_data.get("seed_count", 0)))
player_online_time.text = "游玩时间: " + player_data.get("total_login_time", "0时0分0秒")
player_last_login_time.text = "最后登录: " + player_data.get("last_login_time", "未知")
+ # 设置在线状态显示
+ var is_online = player_data.get("is_online", false)
+ if is_online:
+ player_is_online_time.text = "🟢 在线"
+ player_is_online_time.modulate = Color.GREEN
+ else:
+ player_is_online_time.text = "🔴 离线"
+ player_is_online_time.modulate = Color.GRAY
+
# 尝试加载玩家头像(使用用户名/QQ号加载头像,而不是显示名)
if username.is_valid_int():
player_avatar.load_from_url("http://q1.qlogo.cn/g?b=qq&nk=" + username + "&s=100")
@@ -87,19 +137,55 @@ func add_player_entry(player_data):
func _on_visit_player_pressed(username):
print("访问玩家:", username)
+ # 检查网络连接
+ if not network_manager or not network_manager.is_connected_to_server():
+ Toast.show("未连接服务器,无法访问玩家", Color.RED)
+ return
+
+ # 检查是否尝试访问自己
+ if main_game and main_game.user_name == username:
+ Toast.show("不能访问自己的农场", Color.ORANGE)
+ return
+
# 发送访问玩家请求
if network_manager and network_manager.has_method("sendVisitPlayer"):
var success = network_manager.sendVisitPlayer(username)
if success:
+ Toast.show("正在访问 " + username + " 的农场...", Color.YELLOW)
print("已发送访问玩家请求:", username)
else:
+ Toast.show("发送访问请求失败", Color.RED)
print("发送访问玩家请求失败,网络未连接")
else:
+ Toast.show("网络管理器不可用", Color.RED)
print("网络管理器不可用")
# 刷新按钮点击
func _on_refresh_button_pressed():
+ # 检查网络连接
+ if not network_manager or not network_manager.is_connected_to_server():
+ register_player_num.text = "未连接服务器,无法刷新"
+ register_player_num.modulate = Color.RED
+ Toast.show("未连接服务器,无法刷新排行榜", Color.RED)
+ return
+
+ # 显示加载状态
+ register_player_num.text = "正在刷新注册人数..."
+ register_player_num.modulate = Color.YELLOW
+ refresh_button.disabled = true
+ refresh_button.text = "刷新中..."
+
+ # 请求排行榜数据
request_player_rankings()
+
+ # 5秒后重新启用按钮(防止卡住)
+ await get_tree().create_timer(5.0).timeout
+ if refresh_button.disabled:
+ refresh_button.disabled = false
+ refresh_button.text = "刷新"
+ if register_player_num.text == "正在刷新注册人数...":
+ register_player_num.text = "刷新超时,请重试"
+ register_player_num.modulate = Color.RED
# 退出按钮点击
func _on_quit_button_pressed():
diff --git a/GlobalScript/GlobalVariables.gd b/GlobalScript/GlobalVariables.gd
index 61510e1..21bcf31 100644
--- a/GlobalScript/GlobalVariables.gd
+++ b/GlobalScript/GlobalVariables.gd
@@ -1 +1,3 @@
extends Node
+
+const client_version :String = "1.0.3" #记录客户端版本
\ No newline at end of file
diff --git a/GlobalScript/Toast.gd b/GlobalScript/Toast.gd
index 53fc2b7..a125ad6 100644
--- a/GlobalScript/Toast.gd
+++ b/GlobalScript/Toast.gd
@@ -1,12 +1,152 @@
-# toast.gd
+# Toast.gd - 合并的Toast系统
extends Node
-const ToastScene = preload("res://components/ToastShow.tscn")
+# Toast节点缓存
+var toast_container: Control
+
+func _ready():
+ # 延迟创建Toast容器,避免在节点初始化期间添加子节点的冲突
+ setup_toast_container.call_deferred()
+
+func setup_toast_container():
+ # 防止重复创建
+ if toast_container and is_instance_valid(toast_container):
+ return
+
+ # 创建一个CanvasLayer来确保Toast始终在最顶层
+ var canvas_layer = CanvasLayer.new()
+ canvas_layer.name = "ToastCanvasLayer"
+ canvas_layer.layer = 100 # 设置一个很高的层级值
+
+ # 创建一个容器来放置所有Toast
+ toast_container = Control.new()
+ toast_container.name = "ToastContainer"
+ toast_container.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
+ toast_container.mouse_filter = Control.MOUSE_FILTER_IGNORE
+
+ # 将容器添加到CanvasLayer中
+ canvas_layer.add_child(toast_container)
+
+ # 尝试添加到main/UI节点,如果失败则添加到根节点
+ var ui_node = get_node_or_null("/root/main/UI")
+ if ui_node:
+ ui_node.add_child.call_deferred(canvas_layer)
+ print("Toast容器已添加到 main/UI 节点")
+ else:
+ # 如果没有UI节点,直接添加到根节点
+ get_tree().root.add_child.call_deferred(canvas_layer)
+ print("Toast容器已添加到根节点")
+
func show(text: String,
- color: Color = Color.WHITE,
- duration: float = 3.0,
- fade: float = 1.0) -> void:
- var toast = ToastScene.instantiate()
- # 延迟设置参数确保节点初始化完成
- toast.call_deferred("setup", text, color, duration, fade)
+ color: Color = Color.WHITE,
+ duration: float = 2.0,
+ fade_duration: float = 0.5) -> void:
+
+ # 确保容器存在且有效
+ if not toast_container or not is_instance_valid(toast_container) or not toast_container.get_parent():
+ setup_toast_container.call_deferred()
+ # 等待容器设置完成
+ await get_tree().process_frame
+ await get_tree().process_frame # 额外等待一帧确保完成
+
+ # 再次检查容器是否有效
+ if not toast_container or not is_instance_valid(toast_container):
+ print("警告:Toast容器初始化失败,无法显示Toast")
+ return
+
+ # 创建Toast UI
+ var toast_panel = create_toast_ui(text, color)
+ toast_container.add_child(toast_panel)
+
+ # 显示动画和自动消失
+ show_toast_animation(toast_panel, duration, fade_duration)
+
+func create_toast_ui(text: String, color: Color) -> PanelContainer:
+ # 创建主容器
+ var panel = PanelContainer.new()
+ panel.name = "Toast_" + str(Time.get_ticks_msec())
+
+ # 设置样式
+ var style_box = StyleBoxFlat.new()
+ style_box.bg_color = Color(0, 0, 0, 0.8) # 半透明黑色背景
+ style_box.corner_radius_top_left = 8
+ style_box.corner_radius_top_right = 8
+ style_box.corner_radius_bottom_left = 8
+ style_box.corner_radius_bottom_right = 8
+ style_box.content_margin_top = 12
+ style_box.content_margin_bottom = 12
+ style_box.content_margin_left = 16
+ style_box.content_margin_right = 16
+ panel.add_theme_stylebox_override("panel", style_box)
+
+ # 创建文本标签
+ var label = Label.new()
+ label.text = text
+ label.modulate = color
+ label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
+ label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
+
+ # 设置字体大小
+ label.add_theme_font_size_override("font_size", 16)
+
+ panel.add_child(label)
+
+ # 定位Toast(屏幕中央偏下)
+ position_toast(panel)
+
+ return panel
+
+func position_toast(toast_panel: PanelContainer):
+ # 设置位置为屏幕中央偏下
+ toast_panel.set_anchors_and_offsets_preset(Control.PRESET_CENTER)
+ toast_panel.position.y += 100 # 向下偏移
+
+ # 调整现有Toast的位置,避免重叠
+ var existing_toasts = []
+ for child in toast_container.get_children():
+ if child != toast_panel and child is PanelContainer:
+ existing_toasts.append(child)
+
+ # 向上堆叠
+ for i in range(existing_toasts.size()):
+ var existing_toast = existing_toasts[existing_toasts.size() - 1 - i]
+ var tween = create_tween()
+ tween.tween_property(existing_toast, "position:y",
+ existing_toast.position.y - 60, 0.3)
+
+func show_toast_animation(toast_panel: PanelContainer, duration: float, fade_duration: float):
+ # 初始状态:完全透明并稍微向上
+ toast_panel.modulate.a = 0.0
+ toast_panel.position.y += 20
+
+ # 淡入动画
+ var fade_in_tween = create_tween()
+ fade_in_tween.parallel().tween_property(toast_panel, "modulate:a", 1.0, 0.3)
+ fade_in_tween.parallel().tween_property(toast_panel, "position:y",
+ toast_panel.position.y - 20, 0.3)
+ fade_in_tween.set_ease(Tween.EASE_OUT)
+
+ # 等待显示时间
+ await get_tree().create_timer(duration).timeout
+
+ # 淡出动画
+ var fade_out_tween = create_tween()
+ fade_out_tween.tween_property(toast_panel, "modulate:a", 0.0, fade_duration)
+ await fade_out_tween.finished
+
+ # 移除节点
+ toast_panel.queue_free()
+
+# 便捷方法
+func show_success(text: String, duration: float = 2.0):
+ show(text, Color.GREEN, duration)
+
+func show_error(text: String, duration: float = 3.0):
+ show(text, Color.RED, duration)
+
+func show_warning(text: String, duration: float = 2.5):
+ show(text, Color.YELLOW, duration)
+
+func show_info(text: String, duration: float = 2.0):
+ show(text, Color.CYAN, duration)
diff --git a/GlobalScript/Toast.tscn b/GlobalScript/Toast.tscn
deleted file mode 100644
index a15a029..0000000
--- a/GlobalScript/Toast.tscn
+++ /dev/null
@@ -1,6 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://cvip7owyfmqav"]
-
-[ext_resource type="Script" uid="uid://336lik63ehtt" path="res://Components/Toast.gd" id="1_rdgmi"]
-
-[node name="Toast" type="Node"]
-script = ExtResource("1_rdgmi")
diff --git a/MainGame.gd b/MainGame.gd
index 428e331..9ad36e9 100644
--- a/MainGame.gd
+++ b/MainGame.gd
@@ -5,15 +5,41 @@ extends Node
@onready var crop_item : Button = $CopyNodes/CropItem
-@onready var show_money : Label = $UI/GUI/HBox/money # 显示当前剩余的钱
-@onready var show_experience : Label = $UI/GUI/HBox/experience # 显示当前玩家的经验
-@onready var show_level : Label = $UI/GUI/HBox/level # 显示当前玩家的等级
-@onready var show_tip : Label = $UI/GUI/HBox/tip # 显示小提示
-@onready var show_player_name : Label = $UI/GUI/HBox2/player_name # 显示玩家昵称
-@onready var show_farm_name : Label = $UI/GUI/HBox2/farm_name # 显示农场名称
-@onready var show_status_label : Label = $UI/GUI/HBox2/StatusLabel # 显示与服务器连接状态
+@onready var show_money : Label = $UI/GUI/GameInfoHBox1/money # 显示当前剩余的钱
+@onready var show_experience : Label = $UI/GUI/GameInfoHBox1/experience # 显示当前玩家的经验
+@onready var show_level : Label = $UI/GUI/GameInfoHBox1/level # 显示当前玩家的等级
+@onready var show_tip : Label = $UI/GUI/GameInfoHBox1/tip # 显示小提示
+@onready var show_like: Label = $UI/GUI/GameInfoHBox1/like # 显示别人给自己点赞的总赞数
+@onready var show_onlineplayer: Label = $UI/GUI/GameInfoHBox2/onlineplayer # 显示服务器在线人数
+
+@onready var show_player_name : Label = $UI/GUI/GameInfoHBox2/player_name # 显示玩家昵称
+@onready var show_farm_name : Label = $UI/GUI/GameInfoHBox2/farm_name # 显示农场名称
+@onready var show_status_label : Label = $UI/GUI/GameInfoHBox2/StatusLabel # 显示与服务器连接状态
+@onready var show_fps: Label = $UI/GUI/GameInfoHBox2/FPS # 显示游戏FPS
+@onready var show_hunger_value :Label = $UI/GUI/GameInfoHBox1/hunger_value # 显示玩家体力值
@onready var network_status_label :Label = get_node("/root/main/UI/TCPNetworkManager/StatusLabel")
-@onready var return_my_farm_button: Button = $UI/GUI/VBox/ReturnMyFarmButton
+
+#一堆按钮
+#访问其他人农场相关的按钮
+@onready var return_my_farm_button: Button = $UI/GUI/VisitVBox/ReturnMyFarmButton #返回我的农场
+@onready var like_button: Button = $UI/GUI/VisitVBox/LikeButton #给别人点赞
+
+#和农场操作相关的按钮
+@onready var one_click_harvestbutton: Button = $UI/GUI/FarmVBox/OneClickHarvestButton #一键收获
+@onready var one_click_plant_button: Button = $UI/GUI/FarmVBox/OneClickPlantButton #一键种植面板
+@onready var player_bag_button: Button = $UI/GUI/FarmVBox/PlayerBagButton #打开玩家背包
+@onready var add_new_ground_button: Button = $UI/GUI/FarmVBox/AddNewGroundButton #购买新地块
+@onready var open_store_button: Button = $UI/GUI/FarmVBox/OpenStoreButton #打开种子商店
+
+#其他一些按钮(暂未分类)
+@onready var setting_button: Button = $UI/GUI/OtherVBox/SettingButton #打开设置面板
+@onready var lucky_draw_button: Button = $UI/GUI/OtherVBox/LuckyDrawButton #幸运抽奖
+@onready var daily_check_in_button: Button = $UI/GUI/OtherVBox/DailyCheckInButton #每日签到
+@onready var player_ranking_button: Button = $UI/GUI/OtherVBox/PlayerRankingButton #打开玩家排行榜
+@onready var scare_crow_button: Button = $UI/GUI/OtherVBox/ScareCrowButton #打开稻草人面板按钮
+@onready var my_pet_button: Button = $UI/GUI/OtherVBox/MyPetButton #打开宠物面板按钮
+@onready var return_main_menu_button: Button = $UI/GUI/OtherVBox/ReturnMainMenuButton #返回主菜单按钮
+@onready var new_player_gift_button: Button = $UI/GUI/OtherVBox/NewPlayerGiftButton #领取新手大礼包按钮
@onready var crop_grid_container : GridContainer = $UI/CropStorePanel/ScrollContainer/Crop_Grid #种子商店格子
@@ -28,20 +54,31 @@ extends Node
@onready var red_bar : Button = $CopyNodes/RedCrop #神圣
#各种面板
-@onready var land_panel : Panel = $UI/LandPanel#地块面板
-@onready var login_panel : PanelContainer = $UI/LoginPanel#登录注册面板
-@onready var crop_store_panel : Panel = $UI/CropStorePanel#种子商店面板
-@onready var player_bag_panel : Panel = $UI/PlayerBagPanel#玩家背包面板
-@onready var network_manager : Panel = $UI/TCPNetworkManager#网络管理器
-@onready var player_ranking_panel : Panel = $UI/PlayerRankingPanel#玩家排行榜面板
+@onready var land_panel : Panel = $UI/LandPanel #地块面板
+@onready var login_panel : PanelContainer = $UI/LoginPanel #登录注册面板
+@onready var crop_store_panel : Panel = $UI/CropStorePanel #种子商店面板
+@onready var player_bag_panel : Panel = $UI/PlayerBagPanel #玩家背包面板
+@onready var network_manager : Panel = $UI/TCPNetworkManager #网络管理器
+@onready var player_ranking_panel : Panel = $UI/PlayerRankingPanel #玩家排行榜面板
+@onready var daily_check_in_panel: DailyCheckInPanel = $UI/DailyCheckInPanel #每日签到面板
+@onready var lucky_draw_panel: LuckyDrawPanel = $UI/LuckyDrawPanel #幸运抽签面板
+@onready var one_click_plant_panel: Panel = $UI/OneClickPlantPanel #一键种植面板
+
+@onready var game_info_h_box_1: HBoxContainer = $UI/GUI/GameInfoHBox1
+@onready var game_info_h_box_2: HBoxContainer = $UI/GUI/GameInfoHBox2
+@onready var farm_v_box: VBoxContainer = $UI/GUI/FarmVBox
+@onready var visit_v_box: VBoxContainer = $UI/GUI/VisitVBox
+@onready var other_v_box: VBoxContainer = $UI/GUI/OtherVBox
+@onready var accept_dialog: AcceptDialog = $UI/AcceptDialog
var money: int = 500 # 默认每个人初始为100元
var experience: float = 0.0 # 初始每个玩家的经验为0
var grow_speed: float = 1 # 作物生长速度
var level: int = 1 # 初始玩家等级为1
var dig_money : int = 1000 #开垦费用
+var stamina: int = 20 # 玩家体力值,默认20点
#临时变量
@@ -58,6 +95,8 @@ var start_game : bool = false
var player_bag : Array = []
#农作物种类JSON
var can_planted_crop : Dictionary = {}
+# 新手大礼包领取状态
+var new_player_gift_claimed : bool = false
# 当前被选择的地块索引
var selected_lot_index : int = -1
var farm_lots : Array = [] # 用于保存每个地块的状态
@@ -73,13 +112,37 @@ var visited_player_data : Dictionary = {} # 被访问玩家的数据
var crop_textures_cache : Dictionary = {} # 缓存已加载的作物图片
var crop_frame_counts : Dictionary = {} # 记录每种作物的帧数
-const client_version :String = "1.0.1" #记录客户端版本
+# FPS显示相关变量
+var fps_timer: float = 0.0 # FPS更新计时器
+var fps_update_interval: float = 0.5 # FPS更新间隔
+var frame_count: int = 0 # 帧数计数器
+var current_fps: float = 0.0 # 当前FPS值
+
+var client_version :String = GlobalVariables.client_version #记录客户端版本
# 准备阶段
func _ready():
+ #未登录时隐藏所有UI
+ game_info_h_box_1.hide()
+ game_info_h_box_2.hide()
+ farm_v_box.hide()
+ visit_v_box.hide()
+ other_v_box.hide()
+
+ # 隐藏面板
+ crop_store_panel.hide()
+ player_bag_panel.hide()
+ lucky_draw_panel.hide()
+ daily_check_in_panel.hide()
+ player_ranking_panel.hide()
+ one_click_plant_panel.hide()
+ accept_dialog.hide()
+
print("萌芽农场客户端 v" + client_version + " 启动")
+
+
_update_ui()
_create_farm_buttons() # 创建地块按钮
_update_farm_lots_state() # 初始更新地块状态
@@ -95,16 +158,54 @@ func _ready():
# 初始化商店
crop_store_panel.init_store()
- # 隐藏面板
- crop_store_panel.hide()
- player_bag_panel.hide()
+ # 连接AcceptDialog的确认信号
+ accept_dialog.confirmed.connect(_on_accept_dialog_confirmed)
+
+ # 启动在线人数更新定时器
+ _start_online_players_timer()
# 启动后稍等片刻尝试从服务器获取最新数据
await get_tree().create_timer(0.5).timeout
_try_load_from_server()
+
+func _process(delta: float) -> void:
+ # FPS计算和显示
+ fps_timer += delta
+ frame_count += 1
+
+ #更新一次FPS显示
+ if fps_timer >= fps_update_interval:
+ # 计算FPS:帧数 / 时间间隔
+ current_fps = frame_count / fps_timer
+
+ # 更新FPS显示,保留1位小数
+ show_fps.text = "FPS: " + str("%d" % current_fps)
+
+ # 根据FPS值设置颜色
+ if current_fps >= 50:
+ show_fps.modulate = Color.GREEN # 绿色:流畅
+ elif current_fps >= 30:
+ show_fps.modulate = Color.YELLOW # 黄色:一般
+ elif current_fps >= 20:
+ show_fps.modulate = Color.ORANGE # 橙色:较卡
+ else:
+ show_fps.modulate = Color.RED # 红色:卡顿
+
+ # 重置计数器
+ fps_timer = 0.0
+ frame_count = 0
+
+ # 检查ESC键取消一键种植地块选择模式
+ if Input.is_action_just_pressed("ui_cancel"):
+ if one_click_plant_panel and one_click_plant_panel.has_method("cancel_lot_selection"):
+ one_click_plant_panel.cancel_lot_selection()
+ pass
+
+
#每时每刻都更新
func _physics_process(delta):
+
#1秒计时器
update_timer += delta
if update_timer >= update_interval:
@@ -119,38 +220,19 @@ func _physics_process(delta):
#访客模式处理
if is_visiting_mode:
- return_my_farm_button.show()
+ farm_v_box.hide()
+ visit_v_box.show()
+ other_v_box.hide()
pass
else:
- return_my_farm_button.hide()
+ game_info_h_box_1.show()
+ game_info_h_box_2.show()
+ farm_v_box.show()
+ visit_v_box.hide()
+ other_v_box.show()
pass
pass
-func _on_open_store_button_pressed():
- # 如果处于访问模式,不允许打开商店
- if is_visiting_mode:
- Toast.show("访问模式下无法使用商店", Color.ORANGE)
- return
-
- # 确保商店面板已初始化
- crop_store_panel.init_store()
- # 显示商店面板
- crop_store_panel.show()
- # 确保在最前面显示
- crop_store_panel.move_to_front()
- pass
-
-func _on_player_ranking_button_pressed() -> void:
- player_ranking_panel.show()
- pass
-
-func _on_return_my_farm_button_pressed() -> void:
- # 如果当前处于访问模式,返回自己的农场
- if is_visiting_mode:
- return_to_my_farm()
- else:
- # 如果不在访问模式,这个按钮可能用于其他功能或者不做任何操作
- print("当前已在自己的农场")
@@ -175,132 +257,30 @@ func _handle_crop_update(update_data):
# 更新UI显示
_update_farm_lots_state()
-
-# 处理玩家动作到服务端响应消息
-func _handle_action_response(response_data):
- var action_type = response_data.get("action_type", "")
- var success = response_data.get("success", false)
- var message = response_data.get("message", "")
- var updated_data = response_data.get("updated_data", {})
+# 处理登录成功
+func handle_login_success(player_data: Dictionary):
+ """处理登录成功后的逻辑"""
+ print("登录成功,正在初始化游戏数据...")
- match action_type:
- "harvest_crop":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("experience"):
- experience = updated_data["experience"]
- if updated_data.has("level"):
- level = updated_data["level"]
-
- # 更新UI
- _update_ui()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
-
- "plant_crop":
- if success:
- # 更新玩家背包
- if updated_data.has("player_bag"):
- player_bag = updated_data["player_bag"]
-
- # 更新玩家背包UI
- player_bag_panel.update_player_bag_ui()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
-
- "buy_seed":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("player_bag"):
- player_bag = updated_data["player_bag"]
-
- # 更新UI
- _update_ui()
- player_bag_panel.update_player_bag_ui()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
+ # 更新新手大礼包状态
+ new_player_gift_claimed = player_data.get("new_player_gift_claimed", false)
+
+ # 根据新手大礼包状态控制按钮显示
+ var new_player_gift_button = find_child("NewPlayerGiftButton")
+ if new_player_gift_button:
+ if new_player_gift_claimed:
+ new_player_gift_button.hide()
+ else:
+ new_player_gift_button.show()
+
+ # 立即请求在线人数
+ if network_manager and network_manager.is_connected_to_server():
+ network_manager.sendGetOnlinePlayers()
+ print("登录成功后请求在线人数更新")
+
+ # 其他登录成功后的初始化逻辑可以在这里添加
+ start_game = true
- "dig_ground":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
-
- "remove_crop":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
-
- "water_crop":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.CYAN)
- else:
- Toast.show(message, Color.RED)
-
- "fertilize_crop":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.PURPLE)
- else:
- Toast.show(message, Color.RED)
-
- "upgrade_land":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.GOLD)
- else:
- Toast.show(message, Color.RED)
# 处理玩家排行榜响应
func _handle_player_rankings_response(data):
@@ -327,6 +307,7 @@ func _handle_visit_player_response(data):
"level": level,
"money": money,
"experience": experience,
+ "stamina": stamina,
"farm_lots": farm_lots.duplicate(true),
"player_bag": player_bag.duplicate(true)
}
@@ -339,14 +320,17 @@ func _handle_visit_player_response(data):
money = target_player_data.get("money", 0)
experience = target_player_data.get("experience", 0)
level = target_player_data.get("level", 1)
+ stamina = target_player_data.get("体力值", 20)
farm_lots = target_player_data.get("farm_lots", [])
player_bag = target_player_data.get("player_bag", [])
# 更新UI显示
show_player_name.text = "玩家昵称:" + target_player_data.get("player_name", "未知")
show_farm_name.text = "农场名称:" + target_player_data.get("farm_name", "未知农场")
- show_tip.text = "访问模式"
- show_tip.modulate = Color.ORANGE
+
+ # 显示被访问玩家的点赞数
+ var target_likes = target_player_data.get("total_likes", 0)
+ show_like.text = "总赞数:" + str(int(target_likes))
_update_ui()
@@ -380,14 +364,17 @@ func _handle_return_my_farm_response(data):
money = player_data.get("money", 500)
experience = player_data.get("experience", 0)
level = player_data.get("level", 1)
+ stamina = player_data.get("体力值", 20)
farm_lots = player_data.get("farm_lots", [])
player_bag = player_data.get("player_bag", [])
# 恢复UI显示
show_player_name.text = "玩家昵称:" + player_data.get("player_name", "未知")
show_farm_name.text = "农场名称:" + player_data.get("farm_name", "我的农场")
- show_tip.text = "欢迎回到自己的农场"
- show_tip.modulate = Color.WHITE
+
+ # 显示自己的点赞数
+ var my_likes = player_data.get("total_likes", 0)
+ show_like.text = "总赞数:" + str(int(my_likes))
# 退出访问模式
is_visiting_mode = false
@@ -412,8 +399,6 @@ func _handle_return_my_farm_response(data):
print("返回农场失败:", message)
-
-
#创建作物按钮
func _create_crop_button(crop_name: String, crop_quality: String) -> Button:
# 根据品质选择相应的进度条
@@ -447,7 +432,6 @@ func _create_crop_button(crop_name: String, crop_quality: String) -> Button:
return button
-
# 初始化农场地块按钮 - 只在游戏开始时调用一次
func _create_farm_buttons():
# 清空当前显示的地块
@@ -459,13 +443,10 @@ func _create_farm_buttons():
var button = crop_item.duplicate()
button.name = "FarmLot_" + str(i)
- # 根据是否处于访问模式连接不同的事件
- if is_visiting_mode:
- # 访问模式下,点击地块只显示提示信息
- button.connect("pressed", Callable(self, "_on_visit_item_selected").bind(i))
- else:
- # 正常模式下,连接正常的地块操作
- button.connect("pressed", Callable(self, "_on_item_selected").bind(i))
+
+
+
+ button.connect("pressed", Callable(self, "_on_item_selected").bind(i))
grid_container.add_child(button)
@@ -481,6 +462,7 @@ func _update_farm_lots_state():
var lot = farm_lots[i]
var button = grid_container.get_child(i)
var label = button.get_node("crop_name")
+ var ground_image = button.get_node("ground_sprite")
var status_label = button.get_node("status_label")
var progressbar = button.get_node("ProgressBar")
@@ -494,6 +476,8 @@ func _update_farm_lots_state():
if lot["is_dead"]:
label.modulate = Color.NAVY_BLUE
label.text = "[" + farm_lots[i]["crop_type"] + "已死亡" + "]"
+ # 死亡作物不显示tooltip
+ button.tooltip_text = ""
else:
# 正常生长逻辑
var crop_name = lot["crop_type"]
@@ -501,12 +485,35 @@ func _update_farm_lots_state():
var status_text = ""
# 添加状态标识
var status_indicators = []
- if lot.get("已浇水", false):
+
+ # 检查浇水状态(1小时内浇过水)
+ 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:
status_indicators.append("已浇水")#💧
+
if lot.get("已施肥", false):
status_indicators.append("已施肥")#🌱
- if lot.get("土地等级", 0) >= 1:
- status_indicators.append("等级:1")#⭐
+
+ # 土地等级颜色(不显示文本,只通过颜色区分)
+ var land_level = int(lot.get("土地等级", 0)) # 确保是整数
+ var level_config = {
+ 0: {"color": Color.WHITE}, # 默认土地:默认颜色
+ 1: {"color": Color(1.0, 1.0, 0.0)}, # 黄土地:ffff00
+ 2: {"color": Color(1.0, 0.41, 0.0)}, # 红土地:ff6900
+ 3: {"color": Color(0.55, 0.29, 0.97)}, # 紫土地:8e4af7
+ 4: {"color": Color(0.33, 0.4, 0.59)} # 黑土地:546596
+ }
+
+ if land_level in level_config:
+ var config = level_config[land_level]
+ ground_image.self_modulate = config["color"]
+ else:
+ # 未知等级,使用默认颜色
+ ground_image.self_modulate = Color.WHITE
+
if status_indicators.size() > 0:
status_text += " " + " ".join(status_indicators)
@@ -528,22 +535,94 @@ func _update_farm_lots_state():
progressbar.show()
progressbar.max_value = int(lot["max_grow_time"])
progressbar.value = int(lot["grow_time"]) # 直接设置值,不使用动画
+
+ # 添加作物详细信息到tooltip
+ if can_planted_crop.has(crop_name):
+ var crop = can_planted_crop[crop_name]
+ var crop_quality = crop.get("品质", "未知")
+
+ # 将成熟时间从秒转换为天时分秒格式
+ var total_seconds = int(crop["生长时间"])
+
+ # 定义时间单位换算
+ 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
+
+ # 构建时间字符串(只显示有值的单位)
+ var time_str = ""
+ 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) + "秒"
+
+ button.tooltip_text = str(
+ "作物: " + crop_name + "\n" +
+ "品质: " + crop_quality + "\n" +
+ "价格: " + str(crop["花费"]) + "元\n" +
+ "成熟时间: " + time_str + "\n" +
+ "收获收益: " + str(crop["收益"]) + "元\n" +
+ "需求等级: " + str(crop["等级"]) + "\n" +
+ "耐候性: " + str(crop["耐候性"]) + "\n" +
+ "经验: " + str(crop["经验"]) + "点\n" +
+ "描述: " + str(crop["描述"])
+ )
+ else:
+ # 如果作物数据不存在,显示基本信息
+ button.tooltip_text = "作物: " + crop_name + "\n" + "作物数据未找到"
else:
# 已开垦但未种植的地块显示为空地
- var land_text = "[空地"
- if lot.get("土地等级", 0) >= 1:
- status_label.text = "等级:1"
- land_text += "]"
+ var land_text = "[空地]"
+
+ # 土地等级颜色(空地也要显示土地等级颜色)
+ var land_level = int(lot.get("土地等级", 0)) # 确保是整数
+ var level_config = {
+ 0: {"color": Color.WHITE}, # 默认土地:默认颜色
+ 1: {"color": Color(1.0, 1.0, 0.0)}, # 黄土地:ffff00
+ 2: {"color": Color(1.0, 0.41, 0.0)}, # 红土地:ff6900
+ 3: {"color": Color(0.55, 0.29, 0.97)}, # 紫土地:8e4af7
+ 4: {"color": Color(0.33, 0.4, 0.59)} # 黑土地:546596
+ }
+
+ if land_level in level_config:
+ var config = level_config[land_level]
+ ground_image.self_modulate = config["color"]
+ else:
+ # 未知等级,使用默认颜色
+ ground_image.self_modulate = Color.WHITE
+
+ # 空地不显示状态标签
+ status_label.text = ""
label.modulate = Color.GREEN#绿色
label.text = land_text
progressbar.hide()
-
+ # 空地不显示tooltip
+ button.tooltip_text = ""
else:
# 未开垦的地块
label.modulate = Color.WEB_GRAY#深褐色
label.text = "[" + "未开垦" + "]"
progressbar.hide()
+ # 未开垦地块恢复默认颜色和状态
+ ground_image.self_modulate = Color.WHITE
+ status_label.text = ""
+ # 未开垦地块不显示tooltip
+ button.tooltip_text = ""
# 根据已开垦地块数量更新 dig_money
dig_money = digged_count * 1000
@@ -560,54 +639,35 @@ func _update_ui():
show_money.text = "当前金钱:" + str(money) + " 元"
show_experience.text = "当前经验:" + str(experience) + " 点"
show_level.text = "当前等级:" + str(level) + " 级"
+ show_hunger_value.text = "体力值:" + str(stamina)
+
+
+ # 根据当前模式显示点赞数
+ if is_visiting_mode:
+ var target_likes = visited_player_data.get("total_likes", 0)
+ show_like.text = "总赞数:" + str(int(target_likes))
+ else:
+ # 需要从登录数据中获取自己的点赞数
+ var my_likes = login_data.get("total_likes", 0)
+ show_like.text = "总赞数:" + str(int(my_likes))
# 处理地块点击事件
func _on_item_selected(index):
- # 如果处于访问模式,不允许操作
- if is_visiting_mode:
- Toast.show("访问模式下无法操作地块", Color.ORANGE)
- return
+ # 检查是否处于一键种植的地块选择模式
+ if one_click_plant_panel and one_click_plant_panel.has_method("on_lot_selected"):
+ if one_click_plant_panel.on_lot_selected(index):
+ # 一键种植面板已处理了这次点击,直接返回
+ return
- land_panel.show()
+ # 正常模式下,打开土地面板
+ land_panel.show_panel()
land_panel.selected_lot_index = index
selected_lot_index = index
# 更新按钮文本
if land_panel.has_method("_update_button_texts"):
land_panel._update_button_texts()
-# 处理访问模式下的地块点击事件
-func _on_visit_item_selected(index):
- # 显示被访问玩家的地块信息
- var lot = farm_lots[index]
- var info_text = ""
-
- if lot["is_diged"]:
- if lot["is_planted"]:
- if lot["is_dead"]:
- info_text = "地块 " + str(index + 1) + ": " + lot["crop_type"] + " (已死亡)"
- else:
- var crop_name = lot["crop_type"]
- var progress = float(lot["grow_time"]) / float(lot["max_grow_time"]) * 100.0
- var quality = "未知品质"
-
- # 获取作物品质
- if can_planted_crop.has(crop_name):
- quality = can_planted_crop[crop_name]["品质"]
-
- if lot["grow_time"] >= lot["max_grow_time"]:
- info_text = "地块 " + str(index + 1) + ": " + quality + "-" + crop_name + " (已成熟)"
- else:
- info_text = "地块 " + str(index + 1) + ": " + quality + "-" + crop_name + " (成熟度: " + str(int(progress)) + "%)"
- else:
- info_text = "地块 " + str(index + 1) + ": 空地 (已开垦)"
- else:
- info_text = "地块 " + str(index + 1) + ": 未开垦"
-
- Toast.show(info_text, Color.CYAN)
- print("查看地块信息: ", info_text)
-
-
# 收获作物
func _harvest_crop(index):
var lot = farm_lots[index]
@@ -615,14 +675,9 @@ func _harvest_crop(index):
# 发送收获请求到服务器
if network_manager and network_manager.sendHarvestCrop(index):
pass
- else:
- #print("作物还未成熟")
+ else:
Toast.show("作物还未成熟", Color.RED)
-
-
-
-
# 检查玩家是否可以升级
func _check_level_up():
var level_up_experience = 100 * level
@@ -643,7 +698,6 @@ func return_to_my_farm():
if network_manager and network_manager.has_method("sendReturnMyFarm"):
var success = network_manager.sendReturnMyFarm()
if success:
- Toast.show("正在返回自己的农场...", Color.YELLOW)
print("已发送返回自己农场的请求")
else:
Toast.show("网络未连接,无法返回农场", Color.RED)
@@ -775,7 +829,7 @@ func _load_crop_textures(crop_name: String) -> Array:
# 尝试加载作物的序列帧(从0开始)
var frame_index = 0
while true:
- var texture_path = crop_path + str(frame_index) + ".png"
+ var texture_path = crop_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -815,7 +869,7 @@ func _load_default_textures() -> Array:
# 尝试加载默认图片序列帧
var frame_index = 0
while true:
- var texture_path = default_path + str(frame_index) + ".png"
+ var texture_path = default_path + str(frame_index) + ".webp"
if ResourceLoader.exists(texture_path):
var texture = load(texture_path)
if texture:
@@ -828,7 +882,7 @@ func _load_default_textures() -> Array:
# 如果没有找到序列帧,尝试加载单个默认图片
if textures.size() == 0:
- var single_texture_path = default_path + "0.png"
+ var single_texture_path = default_path + "0.webp"
if ResourceLoader.exists(single_texture_path):
var texture = load(single_texture_path)
if texture:
@@ -924,7 +978,11 @@ func _preload_common_crop_textures():
_load_default_textures()
# 预加载一些常见作物(可以根据实际情况调整)
- var common_crops = ["草莓", "胡萝卜", "土豆", "玉米", "小麦", "番茄"]
+ var common_crops = [
+ "草莓","大白菜","大豆", "稻谷", "冬虫夏草", "番茄", "富贵竹", "甘蔗"
+ , "哈密瓜", "胡萝卜", "花椰菜", "黄瓜", "金橘", "橘子树", "蕨菜", "辣椒"
+ , "蓝莓", "龙果", "芦荟", "芦笋", "南瓜", "甘蔗", "苹果树", "葡萄"
+ ]
for crop_name in common_crops:
_load_crop_textures(crop_name)
@@ -971,3 +1029,517 @@ func _debug_refresh_all_crop_sprites():
var lot = farm_lots[i]
_update_lot_crop_sprite(button, lot)
print("作物图片刷新完成")
+
+#打开种子商店面板
+func _on_open_store_button_pressed():
+ # 如果处于访问模式,不允许打开商店
+ if is_visiting_mode:
+ Toast.show("访问模式下无法使用商店", Color.ORANGE)
+ return
+
+ # 确保商店面板已初始化
+ crop_store_panel.init_store()
+ # 显示商店面板
+ crop_store_panel.show()
+ # 确保在最前面显示
+ crop_store_panel.move_to_front()
+ pass
+#打开玩家排行榜面板
+func _on_player_ranking_button_pressed() -> void:
+ player_ranking_panel.show()
+ player_ranking_panel.request_player_rankings()
+ pass
+#访客模式下返回我的农场
+func _on_return_my_farm_button_pressed() -> void:
+ # 如果当前处于访问模式,返回自己的农场
+ if is_visiting_mode:
+ return_to_my_farm()
+ else:
+ # 如果不在访问模式,这个按钮可能用于其他功能或者不做任何操作
+ print("当前已在自己的农场")
+
+#添加新的地块,默认花费2000
+func _on_add_new_ground_button_pressed() -> void:
+ # 如果处于访问模式,不允许操作
+ if is_visiting_mode:
+ Toast.show("访问模式下无法购买新地块", Color.ORANGE)
+ return
+
+ # 检查是否有网络连接
+ if not network_manager.is_connected_to_server():
+ Toast.show("未连接服务器,无法购买新地块", Color.RED)
+ return
+
+ # 检查玩家金钱是否足够
+ var new_ground_cost = 2000
+ if money < new_ground_cost:
+ Toast.show("金钱不足!购买新地块需要 " + str(new_ground_cost) + " 元", Color.RED)
+ return
+
+ # 检查地块数量限制(可以根据需要设置最大地块数)
+ var max_lots = 80 # 假设最大100个地块
+ if farm_lots.size() >= max_lots:
+ Toast.show("已达到最大地块数量限制(" + str(max_lots) + "个)", Color.YELLOW)
+ return
+
+ # 显示确认弹窗
+ accept_dialog.set_dialog_title("购买新地块确认")
+ accept_dialog.set_dialog_content("购买一个新的未开垦地块\n花费 " + str(new_ground_cost) + " 元?\n\n当前地块数量:" + str(farm_lots.size()) + " 个")
+ accept_dialog.popup_centered()
+
+ # 标记当前操作为购买新地块
+ accept_dialog.set_meta("action_type", "buy_new_ground")
+
+#每日签到 奖励可以有钱币,经验,随机种子 连续签到奖励更多 连续签到只要不中断,奖励会随着签到的次数逐渐变得丰厚
+func _on_daily_check_in_button_pressed() -> void:
+ daily_check_in_panel.show()
+ # 刷新签到数据
+ if daily_check_in_panel.has_method("refresh_check_in_data"):
+ daily_check_in_panel.refresh_check_in_data()
+
+# 处理每日签到响应
+func _handle_daily_check_in_response(response: Dictionary) -> void:
+ # 更新玩家数据
+ var updated_data = response.get("updated_data", {})
+ if updated_data.has("money"):
+ money = updated_data["money"]
+ if updated_data.has("experience"):
+ experience = updated_data["experience"]
+ if updated_data.has("level"):
+ level = updated_data["level"]
+ if updated_data.has("player_bag"):
+ player_bag = updated_data["player_bag"]
+
+ # 更新UI
+ _update_ui()
+
+ # 更新玩家背包UI
+ if player_bag_panel and player_bag_panel.has_method("update_player_bag_ui"):
+ player_bag_panel.update_player_bag_ui()
+
+ # 向签到面板传递响应
+ if daily_check_in_panel and daily_check_in_panel.has_method("handle_check_in_response"):
+ daily_check_in_panel.handle_check_in_response(response)
+
+ # 显示签到结果通知
+ var success = response.get("success", false)
+ if success:
+ var rewards = response.get("rewards", {})
+ var consecutive_days = response.get("consecutive_days", 1)
+ var message = "签到成功!连续签到 %d 天" % consecutive_days
+ Toast.show(message, Color.GREEN)
+ else:
+ var error_message = response.get("message", "签到失败")
+ Toast.show(error_message, Color.RED)
+
+# 处理获取签到数据响应
+func _handle_check_in_data_response(response: Dictionary) -> void:
+ # 向签到面板传递响应
+ if daily_check_in_panel and daily_check_in_panel.has_method("handle_check_in_data_response"):
+ daily_check_in_panel.handle_check_in_data_response(response)
+
+#幸运抽奖 默认800元抽一次 五连抽打九折 十连抽打八折 奖励可以有钱币,经验,随机种子
+func _on_lucky_draw_button_pressed() -> void:
+ lucky_draw_panel.show()
+ # 刷新抽奖显示数据
+ if lucky_draw_panel.has_method("refresh_reward_display"):
+ lucky_draw_panel.refresh_reward_display()
+
+# 处理幸运抽奖响应
+func _handle_lucky_draw_response(response: Dictionary) -> void:
+ # 更新玩家数据
+ var updated_data = response.get("updated_data", {})
+ if updated_data.has("money"):
+ money = updated_data["money"]
+ if updated_data.has("experience"):
+ experience = updated_data["experience"]
+ if updated_data.has("level"):
+ level = updated_data["level"]
+ if updated_data.has("player_bag"):
+ player_bag = updated_data["player_bag"]
+
+ # 更新UI
+ _update_ui()
+
+ # 更新玩家背包UI
+ if player_bag_panel and player_bag_panel.has_method("update_player_bag_ui"):
+ player_bag_panel.update_player_bag_ui()
+
+ # 向抽奖面板传递响应
+ if lucky_draw_panel and lucky_draw_panel.has_method("handle_lucky_draw_response"):
+ lucky_draw_panel.handle_lucky_draw_response(response)
+
+ # 显示抽奖结果通知
+ var success = response.get("success", false)
+ if success:
+ var draw_type = response.get("draw_type", "single")
+ var cost = response.get("cost", 0)
+ var rewards = response.get("rewards", [])
+
+ var type_names = {
+ "single": "单抽",
+ "five": "五连抽",
+ "ten": "十连抽"
+ }
+
+ var message = "%s成功!消费 %d 金币,获得 %d 个奖励" % [
+ type_names.get(draw_type, draw_type), cost, rewards.size()
+ ]
+ Toast.show(message, Color.GREEN)
+
+ # 检查是否有传奇奖励
+ var has_legendary = false
+ for reward in rewards:
+ if reward.get("rarity") == "传奇":
+ has_legendary = true
+ break
+
+ if has_legendary:
+ Toast.show("🎉 恭喜获得传奇奖励!", Color.GOLD)
+ else:
+ var error_message = response.get("message", "抽奖失败")
+ Toast.show(error_message, Color.RED)
+
+# 幸运抽奖完成信号处理
+func _on_lucky_draw_completed(rewards: Array, draw_type: String) -> void:
+ # 可以在这里添加额外的处理逻辑,比如成就检查、特殊效果等
+ print("幸运抽奖完成:", draw_type, ",获得奖励:", rewards.size(), "个")
+
+# 幸运抽奖失败信号处理
+func _on_lucky_draw_failed(error_message: String) -> void:
+ print("幸运抽奖失败:", error_message)
+
+# 获取作物数据(供抽奖面板使用)
+func get_crop_data() -> Dictionary:
+ return can_planted_crop
+
+#打开设置面板 暂时没想到可以设置什么
+func _on_setting_button_pressed() -> void:
+ pass
+
+#一键收获 默认花费400元 可以一键收获已成熟作物
+func _on_one_click_harvestbutton_pressed() -> void:
+ # 如果处于访问模式,不允许操作
+ if is_visiting_mode:
+ Toast.show("访问模式下无法使用一键收获", Color.ORANGE)
+ return
+
+ # 检查是否有网络连接
+ if not network_manager.is_connected_to_server():
+ Toast.show("未连接服务器,无法使用一键收获", Color.RED)
+ return
+
+ # 统计有多少成熟的作物
+ var mature_crops_count = 0
+ for lot in farm_lots:
+ if lot["is_diged"] and lot["is_planted"] and not lot.get("is_dead", false):
+ if lot["grow_time"] >= lot["max_grow_time"]:
+ mature_crops_count += 1
+
+ # 如果没有成熟的作物
+ if mature_crops_count == 0:
+ Toast.show("没有可以收获的成熟作物", Color.YELLOW)
+ return
+
+ # 检查玩家金钱是否足够
+ var one_click_cost = 400
+ if money < one_click_cost:
+ Toast.show("金钱不足!一键收获需要 " + str(one_click_cost) + " 元", Color.RED)
+ return
+
+ # 显示确认弹窗
+ accept_dialog.set_dialog_title("一键收获确认")
+ accept_dialog.set_dialog_content("发现 " + str(mature_crops_count) + " 个成熟作物\n花费 " + str(one_click_cost) + " 元进行一键收获?")
+ accept_dialog.popup_centered()
+
+ # 标记当前操作为一键收获
+ accept_dialog.set_meta("action_type", "one_click_harvest")
+
+#访客模式下可以给别人点赞,然后总赞数显示在show_like节点上
+func _on_like_button_pressed() -> void:
+ # 检查是否处于访问模式
+ if not is_visiting_mode:
+ Toast.show("只能在访问其他玩家农场时点赞", Color.ORANGE)
+ return
+
+ # 检查是否有网络连接
+ if not network_manager.is_connected_to_server():
+ Toast.show("未连接服务器,无法点赞", Color.RED)
+ return
+
+ # 获取被访问玩家的用户名
+ var target_username = visited_player_data.get("user_name", "")
+ if target_username == "":
+ Toast.show("无法获取目标玩家信息", Color.RED)
+ return
+
+ # 发送点赞请求
+ if network_manager and network_manager.has_method("sendLikePlayer"):
+ var success = network_manager.sendLikePlayer(target_username)
+ if success:
+ print("已发送点赞请求给玩家:", target_username)
+ else:
+ Toast.show("网络未连接,无法点赞", Color.RED)
+ print("发送点赞请求失败,网络未连接")
+ else:
+ Toast.show("网络管理器不可用", Color.RED)
+ print("网络管理器不可用")
+
+# 处理点赞响应
+func _handle_like_player_response(data):
+ var success = data.get("success", false)
+ var message = data.get("message", "")
+
+ if success:
+ var target_likes = data.get("target_likes", 0)
+ Toast.show(message, Color.PINK)
+
+ # 更新被访问玩家的点赞数显示
+ if is_visiting_mode and visited_player_data:
+ visited_player_data["total_likes"] = target_likes
+ show_like.text = "总赞数:" + str(int(target_likes))
+
+ print("点赞成功,目标玩家总赞数:", target_likes)
+ else:
+ Toast.show(message, Color.RED)
+ print("点赞失败:", message)
+
+#打开我的宠物系统,这个比较复杂以后再实现
+func _on_my_pet_button_pressed() -> void:
+ pass
+
+#断开连接并返回主菜单界面
+func _on_return_main_menu_button_pressed() -> void:
+ # 显示确认弹窗
+ accept_dialog.set_dialog_title("返回主菜单确认")
+ accept_dialog.set_dialog_content("确定要断开连接并返回主菜单吗?\n\n注意:未保存的进度可能会丢失!")
+ accept_dialog.popup_centered()
+
+ # 标记当前操作为返回主菜单
+ accept_dialog.set_meta("action_type", "return_main_menu")
+
+# 处理AcceptDialog的确认信号
+func _on_accept_dialog_confirmed():
+ var action_type = accept_dialog.get_meta("action_type", "")
+
+ if action_type == "one_click_harvest":
+ # 执行一键收获逻辑
+ _execute_one_click_harvest()
+ elif action_type == "buy_new_ground":
+ # 执行购买新地块逻辑
+ _execute_buy_new_ground()
+ elif action_type == "return_main_menu":
+ # 执行返回主菜单逻辑
+ _execute_return_main_menu()
+ else:
+ # 处理其他类型的确认逻辑
+ pass
+
+# 执行一键收获逻辑
+func _execute_one_click_harvest():
+ var one_click_cost = 400
+ var harvested_count = 0
+ var success_count = 0
+
+ # 先扣除费用
+ money -= one_click_cost
+ _update_ui()
+
+ # 遍历所有地块,收获成熟作物
+ for i in range(len(farm_lots)):
+ var lot = farm_lots[i]
+ if lot["is_diged"] and lot["is_planted"] and not lot.get("is_dead", false):
+ if lot["grow_time"] >= lot["max_grow_time"]:
+ harvested_count += 1
+ # 发送收获请求到服务器
+ if network_manager and network_manager.sendHarvestCrop(i):
+ success_count += 1
+ # 添加小延迟避免服务器压力过大
+ await get_tree().create_timer(0.3).timeout
+
+ # 显示结果
+ if success_count > 0:
+ Toast.show("一键收获完成!成功收获 " + str(success_count) + " 个作物,花费 " + str(one_click_cost) + " 元", Color.GREEN)
+ print("一键收获完成,收获了 ", success_count, " 个作物")
+ else:
+ Toast.show("一键收获失败,请检查网络连接", Color.RED)
+ # 如果失败,退还费用
+ money += one_click_cost
+ _update_ui()
+
+# 执行购买新地块逻辑
+func _execute_buy_new_ground():
+ var new_ground_cost = 2000
+
+ # 发送购买新地块请求到服务器
+ if network_manager and network_manager.has_method("sendBuyNewGround"):
+ var success = network_manager.sendBuyNewGround()
+ if success:
+ print("已发送购买新地块请求")
+ else:
+ Toast.show("网络未连接,无法购买新地块", Color.RED)
+ print("发送购买新地块请求失败,网络未连接")
+ else:
+ Toast.show("网络管理器不可用", Color.RED)
+ print("网络管理器不可用")
+
+# 执行返回主菜单逻辑
+func _execute_return_main_menu():
+ # 断开与服务器的连接
+ if network_manager and network_manager.is_connected_to_server():
+ network_manager.client.disconnect_from_server()
+ print("已断开与服务器的连接")
+
+ # 直接切换到主菜单场景
+ get_tree().change_scene_to_file('res://GUI/MainMenuPanel.tscn')
+
+# 启动在线人数更新定时器
+func _start_online_players_timer():
+ # 初始显示连接中状态
+ _update_online_players_display(0, false, true)
+
+ # 立即请求一次在线人数
+ _request_online_players()
+
+ # 创建定时器,每60秒请求一次在线人数
+ var timer = Timer.new()
+ timer.wait_time = 60.0 # 60秒
+ timer.timeout.connect(_request_online_players)
+ timer.autostart = true
+ add_child(timer)
+ print("在线人数更新定时器已启动,每60秒更新一次")
+
+# 请求在线人数
+func _request_online_players():
+ if network_manager and network_manager.is_connected_to_server():
+ var success = network_manager.sendGetOnlinePlayers()
+ if success:
+ print("已发送在线人数请求")
+ else:
+ print("发送在线人数请求失败")
+ _update_online_players_display(0, false, false)
+ else:
+ print("未连接服务器,无法获取在线人数")
+ _update_online_players_display(0, false, false)
+
+# 处理在线人数响应
+func _handle_online_players_response(data):
+ var success = data.get("success", false)
+ if success:
+ var online_players = data.get("online_players", 0)
+ _update_online_players_display(online_players, true, false)
+ print("当前在线人数:", online_players)
+ else:
+ var message = data.get("message", "获取在线人数失败")
+ print("在线人数请求失败:", message)
+ _update_online_players_display(0, false, false)
+
+# 更新在线人数显示
+func _update_online_players_display(count: int, connected: bool, connecting: bool = false):
+ if connecting:
+ show_onlineplayer.text = "连接中..."
+ show_onlineplayer.modulate = Color.YELLOW
+ elif connected:
+ show_onlineplayer.text = "在线:" + str(count) + " 人"
+ show_onlineplayer.modulate = Color.GREEN
+ else:
+ show_onlineplayer.text = "离线"
+ show_onlineplayer.modulate = Color.RED
+
+# 显示玩家背包面板
+func _on_player_bag_button_pressed() -> void:
+ player_bag_panel.show()
+ pass
+
+#打开一键种植面板
+func _on_one_click_plant_button_pressed() -> void:
+ # 如果处于访问模式,不允许操作
+ if is_visiting_mode:
+ Toast.show("访问模式下无法使用一键种植", Color.ORANGE)
+ return
+
+ # 检查是否有网络连接
+ if not network_manager.is_connected_to_server():
+ Toast.show("未连接服务器,无法使用一键种植", Color.RED)
+ return
+
+ # 显示一键种植面板
+ one_click_plant_panel.show()
+ one_click_plant_panel.move_to_front()
+
+#新手玩家大礼包按钮点击,只能领取一次,领取后这个按钮对该账号永久隐藏
+func _on_new_player_gift_button_pressed() -> void:
+ # 检查网络连接
+ if not network_manager or not network_manager.is_connected_to_server():
+ Toast.show("网络未连接,无法领取新手大礼包", Color.RED, 2.0, 1.0)
+ return
+
+ # 显示确认对话框
+ var confirm_dialog = preload("res://GUI/AcceptDialog.gd").new()
+ add_child(confirm_dialog)
+
+ confirm_dialog.set_dialog_title("领取新手大礼包")
+ confirm_dialog.set_dialog_content("新手大礼包包含:\n• 6000金币\n• 1000经验\n• 龙果种子 x1\n• 杂交树1种子 x1\n• 杂交树2种子 x1\n\n每个账号只能领取一次,确定要领取吗?")
+ confirm_dialog.set_ok_text("领取")
+ confirm_dialog.set_cancel_text("取消")
+
+ # 连接信号
+ confirm_dialog.confirmed.connect(_on_confirm_claim_new_player_gift)
+ confirm_dialog.canceled.connect(_on_cancel_claim_new_player_gift.bind(confirm_dialog))
+
+ # 显示对话框
+ confirm_dialog.popup_centered()
+
+#确认领取新手大礼包
+func _on_confirm_claim_new_player_gift():
+ if network_manager and network_manager.sendClaimNewPlayerGift():
+ pass
+ else:
+ Toast.show("发送请求失败", Color.RED, 2.0, 1.0)
+
+#取消领取新手大礼包
+func _on_cancel_claim_new_player_gift(dialog):
+ if dialog:
+ dialog.queue_free()
+
+#处理新手大礼包响应
+func _handle_new_player_gift_response(data):
+ var success = data.get("success", false)
+ var message = data.get("message", "")
+ var updated_data = data.get("updated_data", {})
+
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ money = updated_data["money"]
+ if updated_data.has("experience"):
+ experience = updated_data["experience"]
+ if updated_data.has("level"):
+ level = updated_data["level"]
+ if updated_data.has("player_bag"):
+ player_bag = updated_data["player_bag"]
+ if updated_data.has("new_player_gift_claimed"):
+ new_player_gift_claimed = updated_data["new_player_gift_claimed"]
+
+ # 隐藏新手大礼包按钮
+ var new_player_gift_button = find_child("NewPlayerGiftButton")
+ if new_player_gift_button:
+ new_player_gift_button.hide()
+
+ # 更新UI
+ _update_ui()
+
+ # 显示成功消息
+ Toast.show(message, Color.GOLD, 3.0, 1.0)
+
+ print("新手大礼包领取成功!")
+ else:
+ # 如果已经领取过,也隐藏按钮
+ if message.find("已经领取过") >= 0:
+ new_player_gift_claimed = true
+ var new_player_gift_button = find_child("NewPlayerGiftButton")
+ if new_player_gift_button:
+ new_player_gift_button.hide()
+
+ # 显示错误消息
+ Toast.show(message, Color.RED, 2.0, 1.0)
diff --git a/MainGame.tscn b/MainGame.tscn
index 0fa0c47..654852e 100644
--- a/MainGame.tscn
+++ b/MainGame.tscn
@@ -1,9 +1,8 @@
-[gd_scene load_steps=25 format=3 uid="uid://dgh61dttaas5a"]
+[gd_scene load_steps=40 format=3 uid="uid://dgh61dttaas5a"]
[ext_resource type="Script" uid="uid://2pt11sfcaxf7" path="res://MainGame.gd" id="1_v3yaj"]
[ext_resource type="Texture2D" uid="uid://b4wi8yusmbbu8" path="res://assets/GUI/玩家昵称.png" id="2_ma1re"]
[ext_resource type="Script" uid="uid://cka0r4g8tbf0" path="res://GUI/login_panel.gd" id="2_mi4js"]
-[ext_resource type="Texture2D" uid="uid://cbjtfrej7iq3x" path="res://assets/background2.jpg" id="2_psm5w"]
[ext_resource type="Texture2D" uid="uid://clvhlo0mc3e7v" path="res://assets/GUI/农场名称.png" id="3_28psf"]
[ext_resource type="Script" uid="uid://bljtkxil64h14" path="res://GUI/land_panel.gd" id="3_401ut"]
[ext_resource type="PackedScene" uid="uid://bkivlkirrx6u8" path="res://CopyItems/crop_item.tscn" id="3_isiom"]
@@ -17,6 +16,7 @@
[ext_resource type="PackedScene" uid="uid://crd28qnymob7" path="res://GUI/player_ranking_item.tscn" id="5_yphxy"]
[ext_resource type="PackedScene" uid="uid://forqk66f354p" path="res://CopyItems/orange_crop.tscn" id="6_0v7qb"]
[ext_resource type="Texture2D" uid="uid://c6i00d35fnl12" path="res://assets/GUI/钱币.png" id="6_t0yo1"]
+[ext_resource type="Texture2D" uid="uid://mkqcp7mn2b0o" path="res://assets/GUI/点赞图标.png" id="6_uc6q1"]
[ext_resource type="Texture2D" uid="uid://ckqy5yq2ltax6" path="res://assets/GUI/小提示.png" id="7_6brkw"]
[ext_resource type="PackedScene" uid="uid://cpxiaqh0y6a5d" path="res://Network/TCPNetworkManager.tscn" id="7_401ut"]
[ext_resource type="PackedScene" uid="uid://cmdoymcviv0ai" path="res://CopyItems/pink_crop.tscn" id="7_qtrx8"]
@@ -24,6 +24,27 @@
[ext_resource type="PackedScene" uid="uid://d3ve4qeggsdqy" path="res://CopyItems/red_crop.tscn" id="8_led80"]
[ext_resource type="PackedScene" uid="uid://dagh3u5med30i" path="res://CopyItems/white_blue_crop.tscn" id="9_mi4js"]
[ext_resource type="Script" uid="uid://c7bxje0wvvgo4" path="res://game_camera.gd" id="10_o8l48"]
+[ext_resource type="Texture2D" uid="uid://bky1j7qmbnmlx" path="res://assets/GUI/玩家数图标.png" id="10_vygm6"]
+[ext_resource type="Texture2D" uid="uid://dr5gdk5ol2wbs" path="res://assets/土地面板图标/种植图标.png" id="12_n03md"]
+[ext_resource type="Texture2D" uid="uid://dpcxeffaqb7ui" path="res://assets/土地面板图标/开垦图标4.png" id="13_uc6q1"]
+[ext_resource type="Texture2D" uid="uid://d2gty44ikvair" path="res://assets/土地面板图标/铲除图标3.png" id="13_uhubb"]
+[ext_resource type="Texture2D" uid="uid://dqwfcpv8orlm7" path="res://assets/土地面板图标/收获图标2.png" id="14_uc6q1"]
+[ext_resource type="Texture2D" uid="uid://ba8ptjai2x5h7" path="res://assets/土地面板图标/浇水图标3.png" id="15_vygm6"]
+[ext_resource type="PackedScene" uid="uid://btp1h6hic2sin" path="res://GUI/AcceptDialog.tscn" id="16_0igvr"]
+[ext_resource type="Texture2D" uid="uid://2ul8g4qf1lif" path="res://assets/土地面板图标/施肥图标.png" id="16_2e153"]
+[ext_resource type="Script" uid="uid://dckw8dskfbnkp" path="res://background.gd" id="17_0igvr"]
+[ext_resource type="PackedScene" uid="uid://bndf1e4sgdjr6" path="res://GUI/LuckyDrawPanel.tscn" id="17_f21le"]
+[ext_resource type="PackedScene" uid="uid://smypui0vyso5" path="res://GUI/DailyCheckInPanel.tscn" id="18_m6fch"]
+[ext_resource type="Script" uid="uid://rlk8e51pibtm" path="res://GUI/OneClickPlantPanel.gd" id="18_n03md"]
+[ext_resource type="Texture2D" uid="uid://dg4o3wv1j0fx" path="res://assets/土地面板图标/升级图标2.png" id="19_uc6q1"]
+[ext_resource type="Script" uid="uid://ca2chgx5w3g1y" path="res://Components/GameBGMPlayer.gd" id="28_m6fch"]
+
+[sub_resource type="Environment" id="Environment_m6fch"]
+background_mode = 3
+ambient_light_energy = 0.0
+glow_enabled = true
+glow_bloom = 0.3
+glow_blend_mode = 0
[node name="main" type="Node"]
script = ExtResource("1_v3yaj")
@@ -34,117 +55,257 @@ script = ExtResource("1_v3yaj")
layout_mode = 3
anchors_preset = 0
-[node name="HBox2" type="HBoxContainer" parent="UI/GUI"]
+[node name="GameInfoHBox1" type="HBoxContainer" parent="UI/GUI"]
layout_mode = 0
-offset_top = 55.0
-offset_right = 1400.0
-offset_bottom = 111.0
+offset_right = 243143.0
+offset_bottom = 35.0
-[node name="player_name_image" type="TextureRect" parent="UI/GUI/HBox2"]
-layout_mode = 2
-texture = ExtResource("2_ma1re")
-expand_mode = 2
-
-[node name="player_name" type="Label" parent="UI/GUI/HBox2"]
-modulate = Color(1, 0.670588, 0.490196, 1)
-layout_mode = 2
-theme_override_font_sizes/font_size = 30
-text = "玩家昵称:树萌芽"
-
-[node name="farm_name_image" type="TextureRect" parent="UI/GUI/HBox2"]
-layout_mode = 2
-texture = ExtResource("3_28psf")
-expand_mode = 3
-
-[node name="farm_name" type="Label" parent="UI/GUI/HBox2"]
-modulate = Color(1, 0.858824, 0.623529, 1)
-layout_mode = 2
-theme_override_font_sizes/font_size = 30
-text = "农场名称:树萌芽的农场"
-
-[node name="status_label_image" type="TextureRect" parent="UI/GUI/HBox2"]
-layout_mode = 2
-texture = ExtResource("8_cgwad")
-expand_mode = 2
-
-[node name="StatusLabel" type="Label" parent="UI/GUI/HBox2"]
-layout_mode = 2
-theme_override_font_sizes/font_size = 30
-text = "服务器状态:正在检测中"
-
-[node name="HBox" type="HBoxContainer" parent="UI/GUI"]
-layout_mode = 0
-offset_right = 1400.0
-offset_bottom = 56.0
-
-[node name="experience_image" type="TextureRect" parent="UI/GUI/HBox"]
+[node name="experience_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
layout_mode = 2
texture = ExtResource("4_a6adi")
expand_mode = 2
-[node name="experience" type="Label" parent="UI/GUI/HBox"]
+[node name="experience" type="Label" parent="UI/GUI/GameInfoHBox1"]
modulate = Color(0, 1, 0, 1)
layout_mode = 2
-theme_override_font_sizes/font_size = 30
+theme_override_font_sizes/font_size = 25
text = "经验:999"
-[node name="level_image" type="TextureRect" parent="UI/GUI/HBox"]
+[node name="level_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
layout_mode = 2
texture = ExtResource("5_va67g")
expand_mode = 2
-[node name="level" type="Label" parent="UI/GUI/HBox"]
+[node name="level" type="Label" parent="UI/GUI/GameInfoHBox1"]
modulate = Color(0, 1, 1, 1)
layout_mode = 2
-theme_override_font_sizes/font_size = 30
+theme_override_font_sizes/font_size = 25
text = "等级:100"
-[node name="money_image" type="TextureRect" parent="UI/GUI/HBox"]
+[node name="money_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
layout_mode = 2
texture = ExtResource("6_t0yo1")
expand_mode = 2
-[node name="money" type="Label" parent="UI/GUI/HBox"]
+[node name="money" type="Label" parent="UI/GUI/GameInfoHBox1"]
modulate = Color(1, 1, 0, 1)
layout_mode = 2
-theme_override_font_sizes/font_size = 30
+theme_override_font_sizes/font_size = 25
text = "钱币:999"
-[node name="tip_image" type="TextureRect" parent="UI/GUI/HBox"]
+[node name="hungervalue_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
+layout_mode = 2
+texture = ExtResource("6_t0yo1")
+expand_mode = 2
+
+[node name="hunger_value" type="Label" parent="UI/GUI/GameInfoHBox1"]
+modulate = Color(0.88617, 0.748355, 0.764238, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 25
+text = "体力值:20"
+
+[node name="tip_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
layout_mode = 2
texture = ExtResource("7_6brkw")
expand_mode = 2
-[node name="tip" type="Label" parent="UI/GUI/HBox"]
+[node name="tip" type="Label" parent="UI/GUI/GameInfoHBox1"]
layout_mode = 2
theme_override_colors/font_color = Color(1, 0, 1, 1)
-theme_override_font_sizes/font_size = 30
+theme_override_font_sizes/font_size = 25
text = "游戏小提示"
-[node name="VBox" type="VBoxContainer" parent="UI/GUI"]
+[node name="like_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"]
+layout_mode = 2
+texture = ExtResource("6_uc6q1")
+expand_mode = 2
+
+[node name="like" type="Label" parent="UI/GUI/GameInfoHBox1"]
+layout_mode = 2
+theme_override_colors/font_color = Color(0.992157, 0.482353, 0.482353, 1)
+theme_override_font_sizes/font_size = 25
+text = "点赞数:0"
+
+[node name="GameInfoHBox2" type="HBoxContainer" parent="UI/GUI"]
layout_mode = 0
-offset_left = 5.0
-offset_top = 522.0
-offset_right = 253.0
-offset_bottom = 719.0
+offset_top = 42.0
+offset_right = 1400.0
+offset_bottom = 77.0
+
+[node name="player_name_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+texture = ExtResource("2_ma1re")
+expand_mode = 2
+
+[node name="player_name" type="Label" parent="UI/GUI/GameInfoHBox2"]
+modulate = Color(1, 0.670588, 0.490196, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 25
+text = "玩家昵称:树萌芽"
+
+[node name="farm_name_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+texture = ExtResource("3_28psf")
+expand_mode = 3
+
+[node name="farm_name" type="Label" parent="UI/GUI/GameInfoHBox2"]
+modulate = Color(1, 0.858824, 0.623529, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 25
+text = "农场名称:树萌芽的农场"
+
+[node name="status_label_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+texture = ExtResource("8_cgwad")
+expand_mode = 2
+
+[node name="StatusLabel" type="Label" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 25
+text = "服务器状态:正在检测中"
+
+[node name="FPS_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+texture = ExtResource("7_6brkw")
+expand_mode = 2
+
+[node name="FPS" type="Label" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+theme_override_colors/font_color = Color(0.68755, 0.948041, 0, 1)
+theme_override_font_sizes/font_size = 25
+text = "FPS:0"
+
+[node name="onlineplayer_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+texture = ExtResource("10_vygm6")
+expand_mode = 2
+
+[node name="onlineplayer" type="Label" parent="UI/GUI/GameInfoHBox2"]
+layout_mode = 2
+theme_override_colors/font_color = Color(0.423529, 1, 0.533333, 1)
+theme_override_font_sizes/font_size = 25
+text = "检测中..."
+
+[node name="FarmVBox" type="VBoxContainer" parent="UI/GUI"]
+layout_mode = 0
+offset_left = 2.0
+offset_top = 454.0
+offset_right = 250.0
+offset_bottom = 785.0
+scale = Vector2(0.8, 0.8)
alignment = 2
-[node name="ReturnMyFarmButton" type="Button" parent="UI/GUI/VBox"]
-visible = false
+[node name="PlayerBagButton" type="Button" parent="UI/GUI/FarmVBox"]
+modulate = Color(0.639216, 0.772549, 0.219608, 1)
layout_mode = 2
theme_override_font_sizes/font_size = 40
-text = "返回我的农场"
+text = "玩家背包"
-[node name="OpenStoreButton" type="Button" parent="UI/GUI/VBox"]
+[node name="OneClickHarvestButton" type="Button" parent="UI/GUI/FarmVBox"]
+modulate = Color(0.841258, 0.700703, 0.325362, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "一键收获"
+
+[node name="OneClickPlantButton" type="Button" parent="UI/GUI/FarmVBox"]
+modulate = Color(0.513945, 0.818793, 3.85046e-07, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "一键种植"
+
+[node name="AddNewGroundButton" type="Button" parent="UI/GUI/FarmVBox"]
+modulate = Color(1, 0.803922, 0.729412, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "添加新土地"
+
+[node name="OpenStoreButton" type="Button" parent="UI/GUI/FarmVBox"]
+modulate = Color(1, 0.564706, 0.647059, 1)
layout_mode = 2
theme_override_font_sizes/font_size = 40
text = "种子商店"
-[node name="PlayerRankingButton" type="Button" parent="UI/GUI/VBox"]
+[node name="VisitVBox" type="VBoxContainer" parent="UI/GUI"]
+layout_mode = 0
+offset_left = 4.00002
+offset_top = 77.0001
+offset_right = 252.0
+offset_bottom = 207.0
+scale = Vector2(0.8, 0.8)
+alignment = 2
+
+[node name="LikeButton" type="Button" parent="UI/GUI/VisitVBox"]
+modulate = Color(0.992157, 0.482353, 0.482353, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "点赞"
+
+[node name="ReturnMyFarmButton" type="Button" parent="UI/GUI/VisitVBox"]
+modulate = Color(1, 1, 0.721569, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "返回我的农场"
+
+[node name="OtherVBox" type="VBoxContainer" parent="UI/GUI"]
+layout_mode = 0
+offset_left = 1198.0
+offset_top = 77.0
+offset_right = 1446.0
+offset_bottom = 408.0
+scale = Vector2(0.8, 0.8)
+alignment = 2
+
+[node name="NewPlayerGiftButton" type="Button" parent="UI/GUI/OtherVBox"]
+modulate = Color(1, 1, 0.447059, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "新手礼包"
+
+[node name="SettingButton" type="Button" parent="UI/GUI/OtherVBox"]
+visible = false
+modulate = Color(0.345098, 0.764706, 1, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "设置"
+
+[node name="LuckyDrawButton" type="Button" parent="UI/GUI/OtherVBox"]
+modulate = Color(0.729412, 0.764706, 1, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "幸运抽奖"
+
+[node name="PlayerRankingButton" type="Button" parent="UI/GUI/OtherVBox"]
+modulate = Color(0.717647, 1, 0.576471, 1)
layout_mode = 2
theme_override_font_sizes/font_size = 40
text = "玩家排行榜"
+[node name="DailyCheckInButton" type="Button" parent="UI/GUI/OtherVBox"]
+modulate = Color(0.807843, 1, 1, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "每日签到"
+
+[node name="ReturnMainMenuButton" type="Button" parent="UI/GUI/OtherVBox"]
+modulate = Color(0.639216, 0.482353, 0.870588, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "返回主菜单"
+
+[node name="MyPetButton" type="Button" parent="UI/GUI/OtherVBox"]
+visible = false
+modulate = Color(0.992157, 0.482353, 0.870588, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "我的宠物"
+
+[node name="ScareCrowButton" type="Button" parent="UI/GUI/OtherVBox"]
+visible = false
+modulate = Color(0.937381, 0.612088, 0.36654, 1)
+layout_mode = 2
+theme_override_font_sizes/font_size = 40
+text = "我的稻草人"
+
[node name="LoginPanel" type="PanelContainer" parent="UI"]
offset_left = 486.0
offset_top = 143.0
@@ -293,7 +454,7 @@ layout_mode = 2
theme_override_font_sizes/font_size = 20
text = "注意:账号请直接使用您的QQ号,系统会直接向您的QQ
邮箱发送一串验证码进行注册验证,密码请设置的复杂一
-点,以免被暴力破解"
+点,以免被暴力破解("
horizontal_alignment = 1
vertical_alignment = 1
@@ -340,74 +501,207 @@ offset_bottom = 210.0
columns = 5
[node name="Dig_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(1, 0.419608, 0.352941, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(1, 0, 0, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "开垦"
+icon = ExtResource("13_uc6q1")
+icon_alignment = 1
+expand_icon = true
[node name="Plant_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(1, 0.682353, 0, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0.760784, 0.533333, 0.160784, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "种植"
+icon = ExtResource("12_n03md")
+icon_alignment = 1
+expand_icon = true
[node name="Remove_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(1, 1, 0, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0.870588, 0.870588, 0, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "铲除"
+icon = ExtResource("13_uhubb")
+icon_alignment = 1
+expand_icon = true
[node name="Harvest_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(0.223529, 1, 0.290196, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0.188235, 0.839216, 0.243137, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "收获"
+icon = ExtResource("14_uc6q1")
+icon_alignment = 1
+expand_icon = true
[node name="Water_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(0, 1, 1, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0, 0.87451, 0.87451, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "浇水"
+icon = ExtResource("15_vygm6")
+icon_alignment = 1
+expand_icon = true
[node name="Fertilize_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(0.592157, 0.337255, 1, 1)
custom_minimum_size = Vector2(80, 80)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0.509804, 0.301961, 0.85098, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "施肥"
+icon = ExtResource("16_2e153")
+icon_alignment = 1
+expand_icon = true
[node name="Upgrade_Button" type="Button" parent="UI/LandPanel/Grid"]
-modulate = Color(0.0784314, 0.470588, 1, 1)
custom_minimum_size = Vector2(100, 100)
layout_mode = 2
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
+theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
+theme_override_colors/font_color = Color(0.0705882, 0.411765, 0.87451, 1)
+theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
+theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 20
text = "升级"
+icon = ExtResource("19_uc6q1")
+icon_alignment = 1
+expand_icon = true
+
+[node name="OneClickPlantPanel" type="Panel" parent="UI"]
+visible = false
+offset_left = 475.0
+offset_top = 145.0
+offset_right = 991.0
+offset_bottom = 616.0
+script = ExtResource("18_n03md")
+
+[node name="Quit_Button" type="Button" parent="UI/OneClickPlantPanel"]
+layout_mode = 0
+offset_left = 465.0
+offset_right = 515.0
+offset_bottom = 50.0
+theme_override_font_sizes/font_size = 30
+text = "X"
+
+[node name="Title" type="Label" parent="UI/OneClickPlantPanel"]
+self_modulate = Color(0.431373, 0.498039, 1, 1)
+layout_mode = 2
+offset_right = 516.0
+offset_bottom = 42.0
+theme_override_font_sizes/font_size = 30
+text = "一键种植面板"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="Grid" type="GridContainer" parent="UI/OneClickPlantPanel"]
+layout_mode = 2
+offset_top = 46.0
+offset_right = 500.0
+offset_bottom = 210.0
+columns = 5
+
+[node name="FullScreenPlantBtn" type="Button" parent="UI/OneClickPlantPanel/Grid"]
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 2
+theme_override_colors/font_color = Color(1, 0, 0, 1)
+theme_override_font_sizes/font_size = 20
+text = "全屏种植"
+icon_alignment = 1
+expand_icon = true
+
+[node name="OneRowPlantBtn" type="Button" parent="UI/OneClickPlantPanel/Grid"]
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 2
+theme_override_colors/font_color = Color(1, 0.972549, 0, 1)
+theme_override_font_sizes/font_size = 20
+text = "行种植"
+icon_alignment = 1
+expand_icon = true
+
+[node name="OneColumnPlantBtn" type="Button" parent="UI/OneClickPlantPanel/Grid"]
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 2
+theme_override_colors/font_color = Color(0, 1, 0, 1)
+theme_override_font_sizes/font_size = 20
+text = "列种植"
+icon_alignment = 1
+expand_icon = true
+
+[node name="NineSquarePlantBtn" type="Button" parent="UI/OneClickPlantPanel/Grid"]
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 2
+theme_override_colors/font_color = Color(0, 1, 1, 1)
+theme_override_font_sizes/font_size = 20
+text = "九宫格
+种植"
+icon_alignment = 1
+expand_icon = true
+
+[node name="CrossPlantBtn" type="Button" parent="UI/OneClickPlantPanel/Grid"]
+custom_minimum_size = Vector2(100, 100)
+layout_mode = 2
+theme_override_colors/font_color = Color(1, 0.54902, 0, 1)
+theme_override_font_sizes/font_size = 20
+text = "十字法
+种植"
+icon_alignment = 1
+expand_icon = true
[node name="PlayerRankingPanel" type="Panel" parent="UI"]
visible = false
-offset_right = 1400.0
+offset_left = 2.0
+offset_right = 1402.0
offset_bottom = 720.0
script = ExtResource("4_yphxy")
-[node name="Scroll" type="ScrollContainer" parent="UI/PlayerRankingPanel"]
-layout_mode = 2
-offset_top = 68.0
-offset_right = 1400.0
-offset_bottom = 720.0
-size_flags_vertical = 3
-
-[node name="PlayerList" type="VBoxContainer" parent="UI/PlayerRankingPanel/Scroll"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-
-[node name="player_ranking_item" parent="UI/PlayerRankingPanel/Scroll/PlayerList" instance=ExtResource("5_yphxy")]
-layout_mode = 2
+[node name="RegisterPlayerNum" type="Label" parent="UI/PlayerRankingPanel"]
+self_modulate = Color(1, 0.701961, 1, 1)
+layout_mode = 0
+offset_left = 864.0
+offset_right = 1014.0
+offset_bottom = 42.0
+theme_override_font_sizes/font_size = 30
+text = "注册人数:"
[node name="Title" type="RichTextLabel" parent="UI/PlayerRankingPanel"]
layout_mode = 2
@@ -420,6 +714,34 @@ bbcode_enabled = true
text = "玩家排行榜"
horizontal_alignment = 1
+[node name="SearchLineEdit" type="LineEdit" parent="UI/PlayerRankingPanel"]
+layout_mode = 0
+offset_left = 143.0
+offset_top = 3.0
+offset_right = 426.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "输入要搜索的人"
+
+[node name="RefreshButton" type="Button" parent="UI/PlayerRankingPanel"]
+custom_minimum_size = Vector2(55, 55)
+layout_mode = 0
+offset_top = 3.0
+offset_right = 78.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "刷新"
+
+[node name="SearchButton" type="Button" parent="UI/PlayerRankingPanel"]
+custom_minimum_size = Vector2(55, 55)
+layout_mode = 0
+offset_left = 425.0
+offset_top = 3.0
+offset_right = 503.0
+offset_bottom = 60.0
+theme_override_font_sizes/font_size = 35
+text = "搜索"
+
[node name="QuitButton" type="Button" parent="UI/PlayerRankingPanel"]
custom_minimum_size = Vector2(55, 55)
layout_mode = 0
@@ -430,21 +752,89 @@ offset_bottom = 60.0
theme_override_font_sizes/font_size = 35
text = "X"
-[node name="RefreshButton" type="Button" parent="UI/PlayerRankingPanel"]
-custom_minimum_size = Vector2(55, 55)
+[node name="FiterAndSortHBox" type="HBoxContainer" parent="UI/PlayerRankingPanel"]
layout_mode = 0
-offset_left = 1.0
-offset_top = 3.0
-offset_right = 79.0
-offset_bottom = 60.0
-theme_override_font_sizes/font_size = 35
-text = "刷新"
+offset_top = 63.0
+offset_right = 1398.0
+offset_bottom = 120.0
+
+[node name="SortLabel" type="Label" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+layout_mode = 2
+size_flags_vertical = 1
+theme_override_font_sizes/font_size = 30
+text = "排序:"
+horizontal_alignment = 1
+vertical_alignment = 1
+
+[node name="MoneySortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(1, 1, 0.321569, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "钱币"
+
+[node name="SeedSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(0.329412, 1, 0.345098, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "种子数"
+
+[node name="LevelSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(0, 1, 1, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "等级"
+
+[node name="OnlineTimeSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(0.784314, 0.733333, 0.521569, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "在线时长"
+
+[node name="LoginTimeSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(0.811765, 1, 0.811765, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "登录时间"
+
+[node name="LikeNumSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(1, 0.513726, 1, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "点赞数"
+
+[node name="IsOnlineSortBtn" type="Button" parent="UI/PlayerRankingPanel/FiterAndSortHBox"]
+self_modulate = Color(0.691357, 0.691357, 0.691357, 1)
+custom_minimum_size = Vector2(158, 57)
+layout_mode = 2
+theme_override_font_sizes/font_size = 30
+text = "在线情况"
+
+[node name="Scroll" type="ScrollContainer" parent="UI/PlayerRankingPanel"]
+layout_mode = 2
+offset_top = 121.0
+offset_right = 1400.0
+offset_bottom = 720.0
+size_flags_vertical = 3
+
+[node name="PlayerList" type="VBoxContainer" parent="UI/PlayerRankingPanel/Scroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="player_ranking_item" parent="UI/PlayerRankingPanel/Scroll/PlayerList" instance=ExtResource("5_yphxy")]
+layout_mode = 2
[node name="CropStorePanel" type="Panel" parent="UI"]
visible = false
-offset_left = 1.0
-offset_right = 1400.0
-offset_bottom = 720.0
+offset_top = -1.0
+offset_right = 1399.0
+offset_bottom = 719.0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("3_qtrx8")
@@ -546,8 +936,8 @@ text = "X"
[node name="PlayerBagPanel" type="Panel" parent="UI"]
visible = false
-offset_left = 1.0
-offset_right = 1398.0
+self_modulate = Color(0.767349, 0.201783, 0, 1)
+offset_right = 1397.0
offset_bottom = 720.0
size_flags_horizontal = 3
size_flags_vertical = 3
@@ -655,17 +1045,37 @@ offset_right = 2.00012
offset_bottom = 143.0
scale = Vector2(0.7, 0.7)
+[node name="AcceptDialog" parent="UI" instance=ExtResource("16_0igvr")]
+visible = false
+
+[node name="LuckyDrawPanel" parent="UI" instance=ExtResource("17_f21le")]
+visible = false
+offset_left = 442.0
+offset_right = 1042.0
+
+[node name="DailyCheckInPanel" parent="UI" instance=ExtResource("18_m6fch")]
+visible = false
+offset_left = 442.0
+offset_top = 3.0
+offset_right = 1042.0
+offset_bottom = 723.0
+
[node name="BackgroundUI" type="CanvasLayer" parent="."]
layer = -1
-[node name="background" type="Sprite2D" parent="BackgroundUI"]
-modulate = Color(1, 1, 1, 0.372549)
+[node name="BackgroundSwitcher" type="Sprite2D" parent="BackgroundUI"]
+self_modulate = Color(0.5, 0.5, 0.5, 1)
show_behind_parent = true
z_index = -100
z_as_relative = false
-position = Vector2(702.875, 360)
-scale = Vector2(0.779157, 0.703125)
-texture = ExtResource("2_psm5w")
+position = Vector2(703, 360)
+scale = Vector2(0.92, 0.92)
+script = ExtResource("17_0igvr")
+
+[node name="Background2" type="Sprite2D" parent="BackgroundUI/BackgroundSwitcher"]
+self_modulate = Color(0.5, 0.5, 0.5, 1)
+
+[node name="Timer" type="Timer" parent="BackgroundUI/BackgroundSwitcher"]
[node name="GridContainer" type="GridContainer" parent="."]
z_as_relative = false
@@ -732,7 +1142,28 @@ bounds_max = Vector2(500, 500)
[node name="GameManager" type="Node" parent="."]
-[connection signal="pressed" from="UI/GUI/VBox/ReturnMyFarmButton" to="." method="_on_return_my_farm_button_pressed"]
-[connection signal="pressed" from="UI/GUI/VBox/OpenStoreButton" to="." method="_on_open_store_button_pressed"]
-[connection signal="pressed" from="UI/GUI/VBox/PlayerRankingButton" to="." method="_on_player_ranking_button_pressed"]
+[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
+environment = SubResource("Environment_m6fch")
+
+[node name="GameBGMPlayer" type="Node" parent="."]
+script = ExtResource("28_m6fch")
+play_mode = 1
+music_files_list = Array[String](["res://assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3", "res://assets/音乐/BanAM-Futatabi.mp3", "res://assets/音乐/MCMZebra-AlwaysandManyTimes.mp3", "res://assets/音乐/MicMusicbox-Ashitakasekki.mp3", "res://assets/音乐/Nemuネム-PromiseoftheWorld.mp3", "res://assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3", "res://assets/音乐/久石让-ふたたび.mp3", "res://assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3", "res://assets/音乐/日本群星-PromiseoftheWorld.mp3"])
+
+[connection signal="pressed" from="UI/GUI/FarmVBox/PlayerBagButton" to="." method="_on_player_bag_button_pressed"]
+[connection signal="pressed" from="UI/GUI/FarmVBox/OneClickHarvestButton" to="." method="_on_one_click_harvestbutton_pressed"]
+[connection signal="pressed" from="UI/GUI/FarmVBox/OneClickPlantButton" to="." method="_on_one_click_plant_button_pressed"]
+[connection signal="pressed" from="UI/GUI/FarmVBox/AddNewGroundButton" to="." method="_on_add_new_ground_button_pressed"]
+[connection signal="pressed" from="UI/GUI/FarmVBox/OpenStoreButton" to="." method="_on_open_store_button_pressed"]
+[connection signal="pressed" from="UI/GUI/VisitVBox/LikeButton" to="." method="_on_like_button_pressed"]
+[connection signal="pressed" from="UI/GUI/VisitVBox/ReturnMyFarmButton" to="." method="_on_return_my_farm_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/NewPlayerGiftButton" to="." method="_on_new_player_gift_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/SettingButton" to="." method="_on_setting_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/LuckyDrawButton" to="." method="_on_lucky_draw_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/PlayerRankingButton" to="." method="_on_player_ranking_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/DailyCheckInButton" to="." method="_on_daily_check_in_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/ReturnMainMenuButton" to="." method="_on_return_main_menu_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/MyPetButton" to="." method="_on_my_pet_button_pressed"]
+[connection signal="pressed" from="UI/GUI/OtherVBox/ScareCrowButton" to="." method="_on_my_pet_button_pressed"]
+[connection signal="pressed" from="UI/OneClickPlantPanel/Quit_Button" to="UI/OneClickPlantPanel" method="_on_quit_button_pressed"]
[connection signal="pressed" from="UI/CropStorePanel/QuitButton" to="." method="_on_quit_button_pressed"]
diff --git a/Network/TCPNetworkManager.gd b/Network/TCPNetworkManager.gd
index 5bc979a..1cded53 100644
--- a/Network/TCPNetworkManager.gd
+++ b/Network/TCPNetworkManager.gd
@@ -17,14 +17,27 @@ var client: TCPClient = TCPClient.new()
# 服务器配置 - 支持多个服务器地址
var server_configs = [
- {"host": "127.0.0.1", "port": 4040, "name": "本地服务器"},
- #{"host": "192.168.1.110", "port": 4040, "name": "局域网服务器"},
- #{"host": "47.108.90.0", "port": 4040, "name": "公网服务器"}#成都内网穿透
+ #{"host": "127.0.0.1", "port": 4040, "name": "本地"},
+ #{"host": "192.168.1.110", "port": 4040, "name": "局域网"},
+ #{"host": "47.108.90.0", "port": 4040, "name": "成都内网穿透"}#成都内网穿透
+ {"host": "47.108.90.0", "port": 6060, "name": "成都公网"}#成都服务器
]
var current_server_index = 0
var auto_retry = true
var retry_delay = 3.0
+var connection_timeout = 5.0 # 连接超时时间
+var is_trying_to_connect = false
+var connection_start_time = 0.0
+var has_tried_all_servers = false # 是否已尝试过所有服务器
+
+# 延迟测量相关变量
+var ping_start_time = 0.0
+var current_ping = -1 # -1表示尚未测量
+var ping_timer = 0.0
+var ping_interval = 3.0 # 每3秒ping一次
+var ping_timeout = 5.0 # ping超时时间
+var is_measuring_ping = false
func _ready():
# 创建TCP客户端实例
@@ -41,14 +54,71 @@ func _ready():
send_button.pressed.connect(_on_send_button_pressed)
# 初始设置
- status_label.text = "未连接"
+ status_label.text = "❌ 未连接"
+ status_label.modulate = Color.RED
response_label.text = "等待响应..."
connection_button.text = "连接"
+
+ # 初始化延迟测量变量
+ current_ping = -1
+ is_measuring_ping = false
+ ping_timer = 0.0
+
+# 每帧检查连接状态和超时
+func _process(delta):
+ # 检查连接超时
+ if is_trying_to_connect:
+ var elapsed_time = Time.get_unix_time_from_system() - connection_start_time
+ if elapsed_time > connection_timeout:
+ print("连接超时,尝试下一个服务器")
+ is_trying_to_connect = false
+ client.disconnect_from_server()
+
+ if auto_retry and not has_tried_all_servers:
+ try_next_server()
+ else:
+ status_label.text = "服务器连接失败"
+ status_label.modulate = Color.RED
+ has_tried_all_servers = false # 重置标志,允许下次重试
+
+ # 处理延迟测量
+ if client.is_client_connected():
+ ping_timer += delta
+ if ping_timer >= ping_interval and not is_measuring_ping:
+ ping_timer = 0.0
+ send_ping()
+
+ # 检查ping超时
+ if is_measuring_ping:
+ var ping_elapsed = Time.get_unix_time_from_system() - ping_start_time
+ if ping_elapsed > ping_timeout:
+ print("Ping超时,重置测量状态")
+ is_measuring_ping = false
+ current_ping = 999 # 显示为高延迟
+
+ # 更新状态显示
+ update_connection_status()
+ else:
+ # 未连接时重置延迟相关状态
+ current_ping = -1
+ is_measuring_ping = false
+ ping_timer = 0.0
+
+ # 更新状态显示
+ update_connection_status()
func _on_connected():
- status_label.text = "已连接"
+ print("成功连接到服务器: ", server_configs[current_server_index]["name"])
+ status_label.text = "已连接 测量中..."
status_label.modulate = Color.GREEN
connection_button.text = "断开"
+ is_trying_to_connect = false
+ has_tried_all_servers = false # 连接成功后重置标志
+
+ # 重置延迟测量
+ current_ping = -1
+ ping_timer = 0.0
+ is_measuring_ping = false
# 发送连接成功消息
client.send_data({
@@ -59,27 +129,58 @@ func _on_connected():
# 连接成功后立即请求作物数据
print("连接成功,正在请求最新作物数据...")
sendGetCropData()
+
+ # 连接成功后立即请求在线人数
+ print("连接成功,正在请求在线人数...")
+ sendGetOnlinePlayers()
+
+ # 立即开始第一次ping测量
+ send_ping()
func _on_connection_failed():
- status_label.text = "连接失败"
+ print("连接失败: ", server_configs[current_server_index]["name"])
+ status_label.text = "连接失败 - " + server_configs[current_server_index]["name"]
status_label.modulate = Color.RED
connection_button.text = "连接"
+ is_trying_to_connect = false
+
+ # 重置延迟测量
+ current_ping = -1
+ is_measuring_ping = false
+ ping_timer = 0.0
+
+ # 通知主游戏更新在线人数显示
+ if main_game and main_game.has_method("_update_online_players_display"):
+ main_game._update_online_players_display(0, false, false)
# 自动尝试下一个服务器
if auto_retry:
try_next_server()
func _on_connection_closed():
- status_label.text = "连接断开"
+ print("连接断开: ", server_configs[current_server_index]["name"])
+ status_label.text = "连接断开 "
status_label.modulate = Color.RED
connection_button.text = "连接"
+ is_trying_to_connect = false
- # 自动重连当前服务器
+ # 重置延迟测量
+ current_ping = -1
+ is_measuring_ping = false
+ ping_timer = 0.0
+
+ # 通知主游戏更新在线人数显示
+ if main_game and main_game.has_method("_update_online_players_display"):
+ main_game._update_online_players_display(0, false, false)
+
+ # 自动重连,优先尝试其他服务器
if auto_retry:
+ print("连接断开,准备重连...")
var timer = get_tree().create_timer(retry_delay)
await timer.timeout
if not client.is_client_connected():
- _on_connection_button_pressed()
+ # 先尝试下一个服务器,如果所有服务器都失败了再回到当前服务器
+ try_next_server()
func _on_data_received(data):
# 根据数据类型处理数据
@@ -91,67 +192,212 @@ func _on_data_received(data):
var message_type = data.get("type", "")
match message_type:
- "ping":
+ "ping": #ping是否在线
return
- "response":
+ "pong": #服务器回复pong响应
+ handle_pong_response()
return
- "login_response":
- # 处理登录响应
+ "response": #服务器通用响应
+ return
+ "login_response": #登录响应
var status = data.get("status", "")
var message = data.get("message", "")
var player_data = data.get("player_data", {})
if login_panel:
- # 调用登录面板的响应处理方法
login_panel._on_login_response_received(status == "success", message, player_data)
- "register_response":
- # 处理注册响应
+ "register_response": #注册响应
var status = data.get("status", "")
var message = data.get("message", "")
if login_panel:
- # 调用登录面板的响应处理方法
login_panel._on_register_response_received(status == "success", message)
- "verification_code_response":
- # 处理验证码发送响应
+ "verification_code_response": #验证码发送响应
var success = data.get("success", false)
var message = data.get("message", "")
if login_panel:
- # 调用登录面板的验证码响应处理方法
login_panel._on_verification_code_response(success, message)
- "verify_code_response":
- # 处理验证码验证响应
+ "verify_code_response": #验证码验证响应
var success = data.get("success", false)
var message = data.get("message", "")
if login_panel:
- # 调用登录面板的验证码验证响应处理方法
login_panel._on_verify_code_response(success, message)
- "crop_update":
- # 处理作物生长更新
+ "crop_update": #作物更新响应
if main_game:
main_game._handle_crop_update(data)
- "action_response":
- # 处理玩家动作响应
+ "action_response": #玩家操作响应
if main_game:
- main_game._handle_action_response(data)
- "play_time_response":
- # 处理玩家游玩时间响应
+ # 处理玩家动作到服务端响应消息
+ var action_type = data.get("action_type", "")
+ var success = data.get("success", false)
+ var message = data.get("message", "")
+ var updated_data = data.get("updated_data", {})
+
+ match action_type:
+ "harvest_crop":#处理收获作物响应
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("experience"):
+ main_game.experience = updated_data["experience"]
+ if updated_data.has("level"):
+ main_game.level = updated_data["level"]
+ if updated_data.has("体力值"):
+ main_game.stamina = updated_data["体力值"]
+
+ # 更新UI
+ main_game._update_ui()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "plant_crop":#处理种植作物响应
+ if success:
+ # 更新玩家背包
+ if updated_data.has("player_bag"):
+ main_game.player_bag = updated_data["player_bag"]
+
+ # 更新玩家背包UI
+ main_game.player_bag_panel.update_player_bag_ui()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "buy_seed":#处理购买种子响应
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("player_bag"):
+ main_game.player_bag = updated_data["player_bag"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game.player_bag_panel.update_player_bag_ui()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "dig_ground":#处理开垦土地
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game._update_farm_lots_state()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "remove_crop":#处理铲除作物
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game._update_farm_lots_state()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "water_crop":#处理浇水
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+ if updated_data.has("体力值"):
+ main_game.stamina = updated_data["体力值"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game._update_farm_lots_state()
+ Toast.show(message, Color.CYAN)
+ else:
+ Toast.show(message, Color.RED)
+ "fertilize_crop":#处理施肥
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+ if updated_data.has("体力值"):
+ main_game.stamina = updated_data["体力值"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game._update_farm_lots_state()
+ Toast.show(message, Color.PURPLE)
+ else:
+ Toast.show(message, Color.RED)
+ "upgrade_land":#处理升级土地
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+
+ # 更新UI
+ main_game._update_ui()
+ main_game._update_farm_lots_state()
+ Toast.show(message, Color.GOLD)
+ else:
+ Toast.show(message, Color.RED)
+ "buy_new_ground":#处理添加新土地
+ if success:
+ # 更新玩家数据
+ if updated_data.has("money"):
+ main_game.money = updated_data["money"]
+ if updated_data.has("farm_lots"):
+ main_game.farm_lots = updated_data["farm_lots"]
+
+ # 重新创建UI来显示新地块
+ main_game._create_farm_buttons()
+ main_game._update_farm_lots_state()
+ main_game._update_ui()
+ Toast.show(message, Color.GREEN)
+ else:
+ Toast.show(message, Color.RED)
+ "play_time_response": #游玩时间统计响应
if main_game and main_game.has_method("_handle_play_time_response"):
main_game._handle_play_time_response(data)
- "player_rankings_response":
- # 处理玩家排行榜响应
+ "player_rankings_response": #玩家排行榜响应
if main_game and main_game.has_method("_handle_player_rankings_response"):
main_game._handle_player_rankings_response(data)
- "crop_data_response":
- # 处理作物数据响应
+ "crop_data_response": #作物数据更新响应
if main_game and main_game.has_method("_handle_crop_data_response"):
main_game._handle_crop_data_response(data)
- "visit_player_response":
- # 处理访问玩家响应
+ "visit_player_response": #访问玩家响应
if main_game and main_game.has_method("_handle_visit_player_response"):
main_game._handle_visit_player_response(data)
- "return_my_farm_response":
- # 处理返回自己农场响应
+ "return_my_farm_response": #返回我的农场响应
if main_game and main_game.has_method("_handle_return_my_farm_response"):
main_game._handle_return_my_farm_response(data)
+ "like_player_response": #点赞玩家响应
+ if main_game and main_game.has_method("_handle_like_player_response"):
+ main_game._handle_like_player_response(data)
+ "online_players_response": #玩家在线响应
+ if main_game and main_game.has_method("_handle_online_players_response"):
+ main_game._handle_online_players_response(data)
+ "daily_check_in_response": #每日签到响应
+ if main_game and main_game.has_method("_handle_daily_check_in_response"):
+ main_game._handle_daily_check_in_response(data)
+ "check_in_data_response": #获取签到数据响应
+ if main_game and main_game.has_method("_handle_check_in_data_response"):
+ main_game._handle_check_in_data_response(data)
+ "lucky_draw_response": #幸运抽奖响应
+ if main_game and main_game.has_method("_handle_lucky_draw_response"):
+ main_game._handle_lucky_draw_response(data)
+ "new_player_gift_response": #新手大礼包响应
+ if main_game and main_game.has_method("_handle_new_player_gift_response"):
+ main_game._handle_new_player_gift_response(data)
+ "pong": #延迟检测响应
+ handle_pong_response(data)
_:
# 显示其他类型的消息
return
@@ -163,10 +409,28 @@ func _on_connection_button_pressed():
if client.is_client_connected():
# 断开连接
client.disconnect_from_server()
+ is_trying_to_connect = false
+ has_tried_all_servers = false
else:
- # 连接服务器
- status_label.text = "正在连接..."
- client.connect_to_server(server_configs[current_server_index]["host"], server_configs[current_server_index]["port"])
+ # 连接服务器,从当前服务器开始尝试
+ has_tried_all_servers = false
+ connect_to_current_server()
+
+# 连接到当前选择的服务器
+func connect_to_current_server():
+ var config = server_configs[current_server_index]
+ status_label.text = "正在连接 " + config["name"] + "..."
+ status_label.modulate = Color.YELLOW
+
+ print("=== 尝试连接服务器 ===")
+ print("服务器名称: ", config["name"])
+ print("服务器地址: ", config["host"], ":", config["port"])
+ print("服务器索引: ", current_server_index, "/", server_configs.size() - 1)
+
+ is_trying_to_connect = true
+ connection_start_time = Time.get_unix_time_from_system()
+
+ client.connect_to_server(config["host"], config["port"])
func _on_send_button_pressed():
if not client.is_client_connected():
@@ -210,13 +474,14 @@ func sendRegisterInfo(username, password, farmname, player_name="", verification
})
#发送收获作物信息
-func sendHarvestCrop(lot_index):
+func sendHarvestCrop(lot_index, target_username = ""):
if not client.is_client_connected():
return false
client.send_data({
"type": "harvest_crop",
"lot_index": lot_index,
+ "target_username": target_username,
"timestamp": Time.get_unix_time_from_system()
})
return true
@@ -359,25 +624,27 @@ func sendReturnMyFarm():
return true
#发送浇水作物信息
-func sendWaterCrop(lot_index):
+func sendWaterCrop(lot_index, target_username = ""):
if not client.is_client_connected():
return false
client.send_data({
"type": "water_crop",
"lot_index": lot_index,
+ "target_username": target_username,
"timestamp": Time.get_unix_time_from_system()
})
return true
#发送施肥作物信息
-func sendFertilizeCrop(lot_index):
+func sendFertilizeCrop(lot_index, target_username = ""):
if not client.is_client_connected():
return false
client.send_data({
"type": "fertilize_crop",
"lot_index": lot_index,
+ "target_username": target_username,
"timestamp": Time.get_unix_time_from_system()
})
return true
@@ -394,23 +661,137 @@ func sendUpgradeLand(lot_index):
})
return true
+#发送购买新地块请求
+func sendBuyNewGround():
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "buy_new_ground",
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送点赞玩家请求
+func sendLikePlayer(target_username):
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "like_player",
+ "target_username": target_username,
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送获取在线人数请求
+func sendGetOnlinePlayers():
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "request_online_players",
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送每日签到请求
+func sendDailyCheckIn():
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "daily_check_in",
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送获取签到数据请求
+func sendGetCheckInData():
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "get_check_in_data",
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送幸运抽奖请求
+func sendLuckyDraw(draw_type: String):
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "lucky_draw",
+ "draw_type": draw_type, # "single", "five", "ten"
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
+#发送新手大礼包请求
+func sendClaimNewPlayerGift():
+ if not client.is_client_connected():
+ return false
+
+ client.send_data({
+ "type": "claim_new_player_gift",
+ "timestamp": Time.get_unix_time_from_system()
+ })
+ return true
+
#检查是否连接到服务器
func is_connected_to_server():
return client.is_client_connected()
# 尝试连接下一个服务器
func try_next_server():
+ var original_index = current_server_index
current_server_index = (current_server_index + 1) % server_configs.size()
+
+ # 如果回到了原始服务器,说明所有服务器都尝试过了
+ if current_server_index == original_index:
+ if has_tried_all_servers:
+ print("=== 所有服务器连接失败 ===")
+ print("已尝试所有 ", server_configs.size(), " 个服务器")
+ for i in range(server_configs.size()):
+ print("- ", server_configs[i]["name"], " (", server_configs[i]["host"], ":", server_configs[i]["port"], ")")
+ status_label.text = "所有服务器连接失败"
+ status_label.modulate = Color.RED
+ is_trying_to_connect = false
+ return
+ else:
+ has_tried_all_servers = true
+
var config = server_configs[current_server_index]
- status_label.text = "尝试连接 " + config["name"]
- print("尝试连接服务器: ", config["name"], " (", config["host"], ":", config["port"], ")")
+ print("=== 切换到下一个服务器 ===")
+ print("从 ", server_configs[original_index]["name"], " 切换到 ", config["name"])
+ print("新服务器地址: ", config["host"], ":", config["port"])
- var timer = get_tree().create_timer(retry_delay)
+ var timer = get_tree().create_timer(1.0) # 稍微缩短等待时间
await timer.timeout
if not client.is_client_connected():
- client.connect_to_server(config["host"], config["port"])
+ connect_to_current_server()
+
+# 手动切换到指定服务器
+func switch_to_server(server_index: int):
+ if server_index >= 0 and server_index < server_configs.size():
+ current_server_index = server_index
+ has_tried_all_servers = false
+
+ if client.is_client_connected():
+ client.disconnect_from_server()
+
+ # 等待一下再连接新服务器
+ var timer = get_tree().create_timer(0.5)
+ await timer.timeout
+ connect_to_current_server()
+
+# 获取当前服务器信息
+func get_current_server_info() -> Dictionary:
+ return server_configs[current_server_index]
# 检查网络连接状态
func check_network_status():
@@ -421,4 +802,54 @@ func check_network_status():
# 尝试连接到当前配置的服务器
if not client.is_client_connected():
- _on_connection_button_pressed()
+ connect_to_current_server()
+
+# 发送ping消息测量延迟
+func send_ping():
+ if client.is_client_connected() and not is_measuring_ping:
+ is_measuring_ping = true
+ ping_start_time = Time.get_unix_time_from_system()
+
+ client.send_data({
+ "type": "ping",
+ "timestamp": ping_start_time
+ })
+
+# 处理服务器返回的pong消息
+func handle_pong_response(data = null):
+ if is_measuring_ping:
+ var current_time = Time.get_unix_time_from_system()
+ current_ping = int((current_time - ping_start_time) * 1000) # 转换为毫秒
+ is_measuring_ping = false
+ print("延迟: ", current_ping, "ms")
+
+ # 更新连接状态显示
+ update_connection_status()
+
+# 更新连接状态显示
+func update_connection_status():
+ if client.is_client_connected():
+ if current_ping >= 0 and not is_measuring_ping:
+ # 根据延迟设置颜色和显示文本
+ var ping_text = str(current_ping) + "ms"
+ var server_name = server_configs[current_server_index]["name"]
+
+ if current_ping < 30:
+ status_label.text = "✅ " + server_name + " " + ping_text
+ status_label.modulate = Color.GREEN
+ elif current_ping < 80:
+ status_label.text = "🟡 " + server_name + " " + ping_text
+ status_label.modulate = Color.YELLOW
+ elif current_ping < 150:
+ status_label.text = "🟠 " + server_name + " " + ping_text
+ status_label.modulate = Color.ORANGE
+ else:
+ status_label.text = "🔴 " + server_name + " " + ping_text
+ status_label.modulate = Color.RED
+ else:
+ var server_name = server_configs[current_server_index]["name"]
+ status_label.text = "🔄 " + server_name + " 测量中..."
+ status_label.modulate = Color.CYAN
+ else:
+ status_label.text = "❌ 未连接"
+ status_label.modulate = Color.RED
diff --git a/Server/BugFix_UI_Update_Missing.md b/Server/BugFix_UI_Update_Missing.md
deleted file mode 100644
index f8a3e6f..0000000
--- a/Server/BugFix_UI_Update_Missing.md
+++ /dev/null
@@ -1,241 +0,0 @@
-# Bug修复:开垦和铲除操作UI更新缺失
-
-## 问题描述
-
-在开垦土地和铲除作物操作完成后,客户端的UI没有正确更新,具体表现为:
-
-1. **金钱数量不更新**:操作完成后,显示的金钱数量仍然是操作前的数值
-2. **等级和经验不更新**:如果操作导致等级或经验变化,UI没有反映
-3. **地块状态不同步**:虽然服务器数据已更新,但客户端显示可能不一致
-
-## 问题根源
-
-### 原始问题分析
-
-客户端的 `_handle_action_response()` 方法只处理了以下操作类型:
-- `harvest_crop` - 收获作物 ✅
-- `plant_crop` - 种植作物 ✅
-- `buy_seed` - 购买种子 ✅
-- `dig_ground` - 开垦土地 ✅
-
-但是缺少了:
-- `remove_crop` - 铲除作物 ❌
-
-### 代码问题位置
-
-```gdscript
-# MainGame.gd 中的 _handle_action_response 方法
-func _handle_action_response(response_data):
- var action_type = response_data.get("action_type", "")
- var success = response_data.get("success", false)
- var message = response_data.get("message", "")
- var updated_data = response_data.get("updated_data", {})
-
- match action_type:
- "harvest_crop":
- # 处理收获响应 ✅
- "plant_crop":
- # 处理种植响应 ✅
- "buy_seed":
- # 处理购买响应 ✅
- "dig_ground":
- # 处理开垦响应 ✅
- # 缺少 "remove_crop" 的处理 ❌
-```
-
-## 修复方案
-
-### 1. 添加铲除作物响应处理
-
-在 `MainGame.gd` 的 `_handle_action_response()` 方法中添加对 `remove_crop` 操作的处理:
-
-```gdscript
-"remove_crop":
- if success:
- # 更新玩家数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 更新UI
- _update_ui()
- _update_farm_lots_state()
- Toast.show(message, Color.GREEN)
- else:
- Toast.show(message, Color.RED)
-```
-
-### 2. 优化客户端预验证
-
-为了提供更好的用户体验,在 `land_panel.gd` 中添加了更完善的预验证:
-
-#### 开垦操作预验证
-```gdscript
-# 检查玩家金钱是否足够
-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
-```
-
-#### 铲除操作预验证
-```gdscript
-# 检查玩家金钱是否足够
-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
-```
-
-### 3. 移除不必要的UI更新调用
-
-移除了 `land_panel.gd` 中不必要的 `main_game._update_ui()` 调用,因为服务器响应会统一处理UI更新。
-
-## 修复效果
-
-### 修复前的问题
-1. **开垦土地后**:
- - 金钱显示:1000元 → 1000元 ❌ (实际应该减少)
- - 地块状态:可能不同步
- - 用户体验:困惑,不知道操作是否成功
-
-2. **铲除作物后**:
- - 金钱显示:1000元 → 1000元 ❌ (实际应该减少500)
- - 地块状态:可能显示仍有作物
- - 用户体验:需要刷新页面才能看到变化
-
-### 修复后的正确行为
-1. **开垦土地后**:
- - 金钱显示:1000元 → 0元 ✅ (正确扣除1000)
- - 地块状态:立即显示为已开垦 ✅
- - 用户体验:即时反馈,操作流畅
-
-2. **铲除作物后**:
- - 金钱显示:1000元 → 500元 ✅ (正确扣除500)
- - 地块状态:立即显示为空地 ✅
- - 用户体验:即时反馈,操作流畅
-
-## 数据流程
-
-### 完整的操作流程
-1. **客户端预验证** → 检查金钱、地块状态等
-2. **发送请求** → 向服务器发送操作请求
-3. **服务器处理** → 验证并执行操作,更新数据
-4. **服务器响应** → 返回操作结果和更新后的数据
-5. **客户端处理响应** → 更新本地数据和UI显示
-6. **UI更新** → 刷新金钱、经验、地块状态等显示
-
-### 数据同步机制
-```gdscript
-# 服务器响应处理
-if success:
- # 1. 更新本地数据
- if updated_data.has("money"):
- money = updated_data["money"]
- if updated_data.has("farm_lots"):
- farm_lots = updated_data["farm_lots"]
-
- # 2. 刷新UI显示
- _update_ui() # 更新金钱、经验、等级显示
- _update_farm_lots_state() # 更新地块状态显示
-
- # 3. 显示成功提示
- Toast.show(message, Color.GREEN)
-```
-
-## 测试验证
-
-### 测试用例1:开垦土地UI更新
-1. 玩家有1000金钱
-2. 点击未开垦地块,选择开垦
-3. 操作成功后检查:
- - 金钱显示是否减少1000 ✅
- - 地块是否显示为已开垦 ✅
- - 是否显示成功提示 ✅
-
-### 测试用例2:铲除作物UI更新
-1. 玩家有1000金钱,地块有作物
-2. 点击地块,选择铲除
-3. 操作成功后检查:
- - 金钱显示是否减少500 ✅
- - 地块是否显示为空地 ✅
- - 是否显示成功提示 ✅
-
-### 测试用例3:操作失败时的UI状态
-1. 玩家金钱不足
-2. 尝试进行开垦或铲除操作
-3. 检查:
- - UI数据不应该改变 ✅
- - 显示错误提示 ✅
- - 操作被正确阻止 ✅
-
-### 测试用例4:网络异常时的处理
-1. 断开网络连接
-2. 尝试进行操作
-3. 检查:
- - 显示网络错误提示 ✅
- - UI状态保持不变 ✅
- - 不发送无效请求 ✅
-
-## 代码改进点
-
-### 1. 统一的响应处理
-所有游戏操作现在都有统一的响应处理机制:
-- 成功时更新数据和UI
-- 失败时显示错误信息
-- 保持数据一致性
-
-### 2. 改进的用户体验
-- 添加了操作进行中的提示("正在开垦土地...")
-- 提供了详细的错误信息
-- 即时的UI反馈
-
-### 3. 更好的错误处理
-- 客户端预验证减少无效请求
-- 网络错误的友好提示
-- 服务器错误的正确显示
-
-## 防止类似问题的建议
-
-### 1. 代码审查检查点
-- 新增操作类型时,确保在 `_handle_action_response` 中添加对应处理
-- 检查所有UI更新是否通过统一的响应处理机制
-- 验证客户端和服务器的数据同步
-
-### 2. 测试覆盖
-- 为每个新操作添加UI更新测试用例
-- 测试成功和失败场景的UI表现
-- 验证网络异常情况下的行为
-
-### 3. 开发规范
-- 所有游戏操作都应该通过服务器处理
-- 客户端只做预验证和UI更新
-- 保持数据流的一致性
-
-## 总结
-
-这个bug修复确保了:
-- ✅ **数据一致性**:客户端UI与服务器数据保持同步
-- ✅ **用户体验**:操作后立即看到结果反馈
-- ✅ **错误处理**:完善的错误提示和状态管理
-- ✅ **代码质量**:统一的响应处理机制
-- ✅ **可维护性**:清晰的数据流和处理逻辑
-
-通过这个修复,玩家在进行开垦和铲除操作时将获得与收获作物操作一致的流畅体验。
\ No newline at end of file
diff --git a/Server/BugFix_VisitorMode_LastLoginTime.md b/Server/BugFix_VisitorMode_LastLoginTime.md
deleted file mode 100644
index 298a9dd..0000000
--- a/Server/BugFix_VisitorMode_LastLoginTime.md
+++ /dev/null
@@ -1,184 +0,0 @@
-# Bug修复:访客模式下最后登录时间错误更新
-
-## 问题描述
-
-在原始代码中,当玩家处于访客模式访问其他玩家的农场时,被访问玩家的最后登录时间会被意外更新。这是一个严重的数据完整性问题,因为:
-
-1. **数据不准确**:被访问玩家实际上没有登录,但最后登录时间被更新了
-2. **逻辑错误**:只有玩家真正登录时,最后登录时间才应该被更新
-3. **影响统计**:这会影响玩家活跃度统计和排行榜数据的准确性
-
-## 问题根源
-
-### 原始问题代码
-
-```python
-def update_crops_growth(self):
- """更新所有玩家的作物生长状态"""
- # 获取所有玩家存档文件
- save_files = glob.glob(os.path.join("game_saves", "*.json"))
-
- for save_file in save_files:
- try:
- # 从文件名提取账号ID
- account_id = os.path.basename(save_file).split('.')[0]
-
- # 加载玩家数据
- player_data = self.load_player_data(account_id)
- # ... 更新作物生长状态 ...
-
- # 如果有作物更新,保存玩家数据
- if growth_updated:
- self.save_player_data(account_id, player_data) # 问题在这里!
-```
-
-**问题分析:**
-- 系统遍历所有玩家存档文件,包括离线玩家
-- 当保存玩家数据时,可能会触发其他逻辑更新最后登录时间
-- 访客模式下,被访问玩家的数据被加载和保存,导致时间戳更新
-
-## 修复方案
-
-### 1. 只更新在线玩家的作物生长状态
-
-```python
-def update_crops_growth(self):
- """更新所有玩家的作物生长状态"""
- # 只更新在线玩家的作物生长状态,避免影响离线玩家的数据
- for client_id, user_info in self.user_data.items():
- if not user_info.get("logged_in", False):
- continue
-
- username = user_info.get("username")
- if not username:
- continue
-
- try:
- # 加载玩家数据
- player_data = self.load_player_data(username)
- # ... 更新作物生长状态 ...
-
- # 如果有作物更新,保存玩家数据
- if growth_updated:
- self.save_player_data(username, player_data)
-```
-
-**修复要点:**
-- ✅ 只遍历在线玩家(`self.user_data`)
-- ✅ 检查玩家登录状态(`logged_in: True`)
-- ✅ 避免处理离线玩家的数据
-
-### 2. 优化访客模式的数据推送
-
-```python
-def _push_crop_update_to_player(self, account_id, player_data):
- # ... 现有代码 ...
-
- if visiting_mode and visiting_target:
- # 如果处于访问模式,发送被访问玩家的更新数据
- # 注意:这里只读取数据,不修改被访问玩家的数据
- target_player_data = self.load_player_data(visiting_target)
- if target_player_data:
- # 检查被访问玩家是否也在线
- target_client_id = None
- for cid, user_info in self.user_data.items():
- if user_info.get("username") == visiting_target and user_info.get("logged_in", False):
- target_client_id = cid
- break
-
- update_message = {
- "type": "crop_update",
- "farm_lots": target_player_data.get("farm_lots", []),
- "timestamp": time.time(),
- "is_visiting": True,
- "visited_player": visiting_target,
- "target_online": target_client_id is not None # 新增:标记被访问玩家是否在线
- }
-```
-
-**优化要点:**
-- ✅ 明确标注只读取数据,不修改
-- ✅ 检查被访问玩家是否在线
-- ✅ 提供在线状态信息给客户端
-
-## 修复效果
-
-### 修复前的问题
-1. **错误场景**:
- - 玩家A访问玩家B的农场
- - 系统更新所有玩家的作物生长状态
- - 玩家B的数据被加载、修改、保存
- - 玩家B的最后登录时间被意外更新
-
-2. **数据污染**:
- ```
- 玩家B实际最后登录:2024-01-01 10:00:00
- 被访问后错误更新为:2024-01-02 15:30:00 ❌ 错误!
- ```
-
-### 修复后的正确行为
-1. **正确场景**:
- - 玩家A访问玩家B的农场
- - 系统只更新在线玩家(玩家A)的作物生长状态
- - 玩家B的数据只被读取,不被修改
- - 玩家B的最后登录时间保持不变
-
-2. **数据准确**:
- ```
- 玩家B实际最后登录:2024-01-01 10:00:00
- 访问后仍然保持:2024-01-01 10:00:00 ✅ 正确!
- ```
-
-## 测试验证
-
-### 测试用例1:访客模式数据完整性
-1. 玩家A登录游戏
-2. 玩家A访问离线玩家B的农场
-3. 等待作物生长更新周期
-4. 检查玩家B的最后登录时间是否保持不变
-
-**预期结果**:玩家B的最后登录时间不应该改变
-
-### 测试用例2:在线玩家正常更新
-1. 玩家A和玩家B都在线
-2. 玩家A访问玩家B的农场
-3. 等待作物生长更新周期
-4. 检查两个玩家的作物是否正常生长
-
-**预期结果**:两个玩家的作物都应该正常生长
-
-### 测试用例3:离线玩家数据保护
-1. 确保有离线玩家的存档文件
-2. 在线玩家进行游戏操作
-3. 检查离线玩家的数据是否被意外修改
-
-**预期结果**:离线玩家的数据应该保持不变
-
-## 代码审查要点
-
-在未来的开发中,需要注意以下几点:
-
-1. **数据修改原则**:
- - 只修改当前在线玩家的数据
- - 访问其他玩家数据时,优先使用只读操作
- - 避免在定时任务中修改离线玩家数据
-
-2. **时间戳更新**:
- - 最后登录时间只在真正登录时更新
- - 避免在数据保存时自动更新时间戳
- - 区分数据修改和时间戳更新的逻辑
-
-3. **访客模式处理**:
- - 明确区分访客模式和正常模式
- - 访客模式下只读取数据,不修改
- - 提供足够的状态信息给客户端
-
-## 总结
-
-这个bug修复确保了:
-- ✅ 数据完整性:只有真正登录的玩家才会更新最后登录时间
-- ✅ 性能优化:只处理在线玩家的数据,减少不必要的文件操作
-- ✅ 逻辑正确:访客模式下不会影响被访问玩家的数据
-- ✅ 可维护性:代码逻辑更清晰,易于理解和维护
-
-通过这个修复,游戏的数据统计将更加准确,玩家的隐私和数据完整性得到更好的保护。
\ No newline at end of file
diff --git a/Server/Feature_RemoveCrop.md b/Server/Feature_RemoveCrop.md
deleted file mode 100644
index 6bbd508..0000000
--- a/Server/Feature_RemoveCrop.md
+++ /dev/null
@@ -1,277 +0,0 @@
-# 铲除作物功能实现
-
-## 功能概述
-
-实现了玩家可以花费500金钱铲除地块上的作物,将地块变成空地的功能。这个功能完全基于服务器端处理,确保数据的一致性和安全性。
-
-## 功能特点
-
-- **费用固定**:铲除任何作物都需要花费500金钱
-- **服务器验证**:所有验证和处理都在服务器端完成
-- **状态重置**:铲除后地块变成空地,可以重新种植
-- **访客保护**:访客模式下无法进行铲除操作
-- **实时更新**:操作完成后立即更新客户端显示
-
-## 实现架构
-
-### 1. 服务器端实现
-
-#### 消息路由
-```python
-elif message_type == "remove_crop":
- return self._handle_remove_crop(client_id, message)
-```
-
-#### 主处理方法
-```python
-def _handle_remove_crop(self, client_id, message):
- """处理铲除作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "铲除作物", "remove_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "remove_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "remove_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
- return self._send_action_error(client_id, "remove_crop", "此地块没有种植作物")
-
- # 处理铲除
- return self._process_crop_removal(client_id, player_data, username, lot, lot_index)
-```
-
-#### 铲除处理逻辑
-```python
-def _process_crop_removal(self, client_id, player_data, username, lot, lot_index):
- """处理铲除作物逻辑"""
- # 铲除费用
- removal_cost = 500
-
- # 检查玩家金钱是否足够
- if player_data["money"] < removal_cost:
- return self._send_action_error(client_id, "remove_crop", f"金钱不足,铲除作物需要 {removal_cost} 金钱")
-
- # 获取作物名称用于日志
- crop_type = lot.get("crop_type", "未知作物")
-
- # 执行铲除操作
- player_data["money"] -= removal_cost
- lot["is_planted"] = False
- lot["crop_type"] = ""
- lot["grow_time"] = 0
- lot["is_dead"] = False # 重置死亡状态
-
- # 保存玩家数据
- self.save_player_data(username, player_data)
-
- # 发送作物更新
- self._push_crop_update_to_player(username, player_data)
-
- self.log('INFO', f"玩家 {username} 铲除了地块 {lot_index} 的作物 {crop_type},花费 {removal_cost} 金钱", 'SERVER')
-
- return self.send_data(client_id, {
- "type": "action_response",
- "action_type": "remove_crop",
- "success": True,
- "message": f"成功铲除作物 {crop_type},花费 {removal_cost} 金钱",
- "updated_data": {
- "money": player_data["money"],
- "farm_lots": player_data["farm_lots"]
- }
- })
-```
-
-### 2. 网络通信
-
-#### 客户端发送请求
-```gdscript
-#发送铲除作物信息
-func sendRemoveCrop(lot_index):
- if not client.is_client_connected():
- return false
-
- client.send_data({
- "type": "remove_crop",
- "lot_index": lot_index,
- "timestamp": Time.get_unix_time_from_system()
- })
- return true
-```
-
-### 3. 客户端UI实现
-
-#### 按钮文本更新
-```gdscript
-# 更新按钮文本
-func _update_button_texts():
- dig_button.text = "开垦"+"\n花费:"+str(main_game.dig_money)
- remove_button.text = "铲除"+"\n花费:500"
-```
-
-#### 铲除操作处理
-```gdscript
-#铲除
-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):
- Toast.show("正在铲除作物...", Color.YELLOW, 1.5, 1.0)
- self.hide()
- else:
- Toast.show("发送铲除请求失败", Color.RED, 2.0, 1.0)
- self.hide()
- else:
- Toast.show("网络未连接,无法铲除作物", Color.RED, 2.0, 1.0)
- self.hide()
-```
-
-## 验证机制
-
-### 服务器端验证
-1. **用户登录验证**:确保用户已登录
-2. **地块索引验证**:检查地块索引是否有效
-3. **地块状态验证**:确保地块有作物可以铲除
-4. **金钱验证**:检查玩家金钱是否足够支付铲除费用
-
-### 客户端预验证
-1. **访问模式检查**:访客模式下禁止操作
-2. **金钱预检查**:提前检查金钱是否足够
-3. **地块状态预检查**:确保地块有作物
-4. **网络连接检查**:确保能够发送请求
-
-## 操作流程
-
-### 正常流程
-1. 玩家点击地块,显示操作面板
-2. 面板显示铲除按钮和费用信息
-3. 玩家点击铲除按钮
-4. 客户端进行预验证
-5. 发送铲除请求到服务器
-6. 服务器验证并处理请求
-7. 服务器返回操作结果
-8. 客户端更新UI显示
-
-### 错误处理
-- **金钱不足**:显示错误提示,不发送请求
-- **无作物**:显示提示信息,不发送请求
-- **访客模式**:显示权限提示,不发送请求
-- **网络错误**:显示网络错误提示
-- **服务器错误**:显示服务器返回的错误信息
-
-## 数据更新
-
-### 地块状态重置
-```python
-lot["is_planted"] = False # 取消种植状态
-lot["crop_type"] = "" # 清空作物类型
-lot["grow_time"] = 0 # 重置生长时间
-lot["is_dead"] = False # 重置死亡状态
-```
-
-### 玩家数据更新
-```python
-player_data["money"] -= removal_cost # 扣除金钱
-```
-
-### 实时同步
-- 服务器保存玩家数据到文件
-- 推送作物更新到客户端
-- 客户端接收并更新UI显示
-
-## 使用场景
-
-1. **清理死亡作物**:当作物死亡时,玩家可以花费金钱清理
-2. **重新规划农场**:玩家想要种植不同作物时
-3. **紧急处理**:当玩家需要快速清理地块时
-4. **策略调整**:根据市场需求调整种植策略
-
-## 安全考虑
-
-1. **服务器权威**:所有验证和处理都在服务器端
-2. **数据一致性**:确保客户端和服务器数据同步
-3. **防作弊**:客户端无法直接修改游戏数据
-4. **访问控制**:访客模式下无法进行破坏性操作
-
-## 扩展性
-
-该功能设计具有良好的扩展性:
-
-1. **费用可配置**:可以根据作物类型设置不同的铲除费用
-2. **条件扩展**:可以添加更多的铲除条件(如等级要求)
-3. **奖励机制**:可以在铲除时给予部分资源回收
-4. **工具系统**:可以引入铲子等工具来影响铲除效果
-
-## 测试用例
-
-### 测试用例1:正常铲除
-1. 玩家有足够金钱(≥500)
-2. 地块有作物
-3. 点击铲除按钮
-4. 验证:金钱减少500,地块变成空地
-
-### 测试用例2:金钱不足
-1. 玩家金钱不足(<500)
-2. 地块有作物
-3. 点击铲除按钮
-4. 验证:显示金钱不足提示,操作失败
-
-### 测试用例3:无作物地块
-1. 玩家有足够金钱
-2. 地块为空地
-3. 点击铲除按钮
-4. 验证:显示无作物提示,操作失败
-
-### 测试用例4:访客模式
-1. 玩家处于访客模式
-2. 点击铲除按钮
-3. 验证:显示权限提示,操作失败
-
-### 测试用例5:网络断开
-1. 网络连接断开
-2. 点击铲除按钮
-3. 验证:显示网络错误提示,操作失败
-
-## 总结
-
-铲除作物功能的实现遵循了以下设计原则:
-
-- ✅ **服务器权威**:所有关键逻辑在服务器端处理
-- ✅ **用户体验**:提供清晰的费用信息和操作反馈
-- ✅ **数据安全**:多层验证确保数据完整性
-- ✅ **错误处理**:完善的错误提示和处理机制
-- ✅ **代码复用**:利用现有的验证和处理框架
-- ✅ **可维护性**:清晰的代码结构和文档
-
-这个功能为玩家提供了更灵活的农场管理选项,同时保持了游戏的平衡性和数据安全性。
\ No newline at end of file
diff --git a/Server/Feature_Summary.md b/Server/Feature_Summary.md
deleted file mode 100644
index c243f8b..0000000
--- a/Server/Feature_Summary.md
+++ /dev/null
@@ -1,236 +0,0 @@
-# 萌芽农场新功能实现总结
-
-## 功能概述
-
-本次更新成功实现了三个重要的农场管理功能:浇水、施肥、升级土地。这些功能为玩家提供了更丰富的农场管理体验和策略选择。
-
-## 实现的功能
-
-### 1. 浇水功能 💧
-- **费用**:50金钱
-- **效果**:作物直接生长1%,如果达到100%直接成熟
-- **限制**:每天每块地只能浇水一次,每日自动重置
-- **状态显示**:浇过水的地块显示💧图标
-- **验证**:检查金钱、作物状态、是否已浇水等
-
-### 2. 施肥功能 🌱
-- **费用**:150金钱
-- **效果**:作物在10分钟内以双倍速度生长
-- **限制**:每个作物只能施肥一次
-- **状态显示**:施过肥的地块显示🌱图标
-- **时间管理**:10分钟后自动清除施肥状态
-
-### 3. 土地升级功能 ⭐
-- **费用**:1000金钱
-- **效果**:永久让这块土地的作物以1.5倍速度生长
-- **限制**:每块土地只能升级一次
-- **状态显示**:升级过的土地显示⭐图标
-- **持久性**:升级效果永久有效
-
-## 技术实现
-
-### 服务器端实现
-
-#### 1. 消息路由扩展
-```python
-# 在_handle_message中添加新的消息类型
-elif message_type == "water_crop":
- return self._handle_water_crop(client_id, message)
-elif message_type == "fertilize_crop":
- return self._handle_fertilize_crop(client_id, message)
-elif message_type == "upgrade_land":
- return self._handle_upgrade_land(client_id, message)
-```
-
-#### 2. 处理方法实现
-- `_handle_water_crop()` - 处理浇水请求
-- `_handle_fertilize_crop()` - 处理施肥请求
-- `_handle_upgrade_land()` - 处理升级请求
-- `_process_watering()` - 浇水逻辑处理
-- `_process_fertilizing()` - 施肥逻辑处理
-- `_process_land_upgrade()` - 升级逻辑处理
-
-#### 3. 作物生长系统增强
-```python
-# 计算生长速度倍数
-growth_multiplier = 1.0
-
-# 土地等级影响:1级土地提供1.5倍生长速度
-if land_level >= 1:
- growth_multiplier *= 1.5
-
-# 施肥影响:10分钟内双倍生长速度
-if fertilized and within_10_minutes:
- growth_multiplier *= 2.0
-```
-
-#### 4. 状态管理
-- 每日重置浇水状态
-- 施肥时间戳管理
-- 土地等级持久化
-
-### 客户端实现
-
-#### 1. 网络通信扩展
-```gdscript
-# 新增发送方法
-func sendWaterCrop(lot_index)
-func sendFertilizeCrop(lot_index)
-func sendUpgradeLand(lot_index)
-```
-
-#### 2. UI响应处理
-```gdscript
-# 在_handle_action_response中添加新的响应类型
-"water_crop", "fertilize_crop", "upgrade_land"
-```
-
-#### 3. 地块面板功能
-- 显示浇水、施肥、升级按钮
-- 添加费用显示
-- 实现预验证逻辑
-- 错误提示处理
-
-#### 4. 状态显示增强
-```gdscript
-# 添加状态标识
-if lot.get("已浇水", false):
- status_indicators.append("💧")
-if lot.get("已施肥", false):
- status_indicators.append("🌱")
-if lot.get("土地等级", 0) >= 1:
- status_indicators.append("⭐")
-```
-
-## 数据结构扩展
-
-### 地块数据结构
-```json
-{
- "crop_type": "作物名称",
- "grow_time": 当前生长时间,
- "max_grow_time": 最大生长时间,
- "is_planted": true/false,
- "is_diged": true/false,
- "is_dead": true/false,
- "已浇水": true/false,
- "已施肥": true/false,
- "土地等级": 0/1,
- "施肥时间": 时间戳
-}
-```
-
-### 玩家数据扩展
-```json
-{
- "last_water_reset_date": "2024-01-01",
- // ... 其他现有字段
-}
-```
-
-## 功能特性
-
-### 1. 效果叠加
-- 土地升级 + 施肥 = 3倍生长速度(1.5 × 2.0)
-- 浇水 + 施肥 + 升级 = 最大化生长效率
-
-### 2. 时间管理
-- 浇水:每日重置(基于日期)
-- 施肥:10分钟时效
-- 升级:永久有效
-
-### 3. 经济平衡
-- 浇水:低成本,即时效果
-- 施肥:中等成本,短期加速
-- 升级:高成本,长期投资
-
-### 4. 用户体验
-- 清晰的状态图标显示
-- 详细的错误提示
-- 即时的UI反馈
-- 流畅的操作体验
-
-## 安全性和验证
-
-### 1. 服务器端验证
-- 用户登录状态检查
-- 金钱充足性验证
-- 地块状态验证
-- 重复操作防护
-
-### 2. 客户端预验证
-- 减少无效请求
-- 提供即时反馈
-- 改善用户体验
-
-### 3. 数据一致性
-- 服务器权威验证
-- 客户端状态同步
-- 错误状态恢复
-
-## 扩展性设计
-
-### 1. 可配置参数
-- 浇水费用:50金钱(可调整)
-- 施肥费用:150金钱(可调整)
-- 升级费用:1000金钱(可调整)
-- 施肥持续时间:10分钟(可调整)
-
-### 2. 未来扩展可能
-- 多级土地升级
-- 不同类型的肥料
-- 天气系统影响
-- 季节性效果
-
-## 测试覆盖
-
-### 1. 功能测试
-- 正常操作流程
-- 边界条件测试
-- 错误处理验证
-
-### 2. 集成测试
-- 客户端-服务器通信
-- 数据同步验证
-- 状态持久化测试
-
-### 3. 用户体验测试
-- 操作流畅性
-- 提示信息准确性
-- 视觉反馈效果
-
-## 性能影响
-
-### 1. 服务器性能
-- 作物生长计算复杂度略有增加
-- 状态管理内存占用轻微增长
-- 网络消息量适度增加
-
-### 2. 客户端性能
-- UI更新频率保持稳定
-- 状态显示计算开销很小
-- 用户操作响应及时
-
-## 维护和监控
-
-### 1. 日志记录
-- 所有操作都有详细日志
-- 错误情况记录完整
-- 便于问题排查
-
-### 2. 数据监控
-- 功能使用频率统计
-- 经济系统平衡监控
-- 用户行为分析
-
-## 总结
-
-本次功能实现成功为萌芽农场游戏添加了三个重要的农场管理功能,显著提升了游戏的策略性和可玩性。实现过程中注重了:
-
-- **完整性**:从服务器到客户端的完整实现
-- **安全性**:多层验证和错误处理
-- **用户体验**:清晰的反馈和流畅的操作
-- **可维护性**:清晰的代码结构和文档
-- **扩展性**:为未来功能扩展预留空间
-
-这些功能为玩家提供了更多的农场管理选择,增加了游戏的深度和策略性,同时保持了良好的游戏平衡性。
\ No newline at end of file
diff --git a/Server/New_Features_Test_Guide.md b/Server/New_Features_Test_Guide.md
deleted file mode 100644
index 0519ecb..0000000
--- a/Server/New_Features_Test_Guide.md
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Server/README_Refactored.md b/Server/README_Refactored.md
deleted file mode 100644
index 7b17f75..0000000
--- a/Server/README_Refactored.md
+++ /dev/null
@@ -1,175 +0,0 @@
-# TCPGameServer 重构说明
-
-## 概述
-
-原始的 `TCPGameServer.py` 文件有 1569 行代码,包含大量相似的函数和重复的逻辑。为了提高代码的可维护性和可读性,我们对其进行了重构,将相似功能的函数分组整理。
-
-## 重构前后对比
-
-### 重构前的问题
-- 文件过大(1569行)
-- 函数分散,相似功能没有分组
-- 大量重复的验证逻辑
-- 缺乏清晰的代码结构
-- 难以维护和扩展
-
-### 重构后的改进
-- 代码行数减少到约 1200 行
-- 按功能模块清晰分组
-- 提取公共方法,减少重复代码
-- 增加详细的文档注释
-- 更好的代码组织结构
-
-## 代码结构分组
-
-### 1. 初始化和生命周期管理
-```python
-# ==================== 1. 初始化和生命周期管理 ====================
-- __init__() # 初始化服务器
-- start_crop_growth_timer() # 启动作物生长计时器
-- stop() # 停止服务器
-- _remove_client() # 移除客户端
-```
-
-### 2. 验证和检查方法
-```python
-# ==================== 2. 验证和检查方法 ====================
-- _check_client_version() # 检查客户端版本
-- _check_user_logged_in() # 检查用户登录状态
-- _validate_qq_number() # 验证QQ号格式
-```
-
-### 3. 数据管理方法
-```python
-# ==================== 3. 数据管理方法 ====================
-- load_player_data() # 加载玩家数据
-- save_player_data() # 保存玩家数据
-- _load_player_data_with_check() # 带检查的加载玩家数据
-- _load_crop_data() # 加载作物配置数据
-- _update_player_logout_time() # 更新玩家登出时间
-```
-
-### 4. 作物系统管理
-```python
-# ==================== 4. 作物系统管理 ====================
-- update_crops_growth() # 更新作物生长状态
-- _push_crop_update_to_player() # 推送作物更新给玩家
-```
-
-### 5. 消息处理路由
-```python
-# ==================== 5. 消息处理路由 ====================
-- _handle_message() # 消息路由分发
-```
-
-### 6. 用户认证处理
-```python
-# ==================== 6. 用户认证处理 ====================
-- _handle_greeting() # 处理问候消息
-- _handle_login() # 处理登录
-- _handle_register() # 处理注册
-- _handle_verification_code_request() # 处理验证码请求
-- _handle_verify_code() # 处理验证码验证
-```
-
-### 7. 游戏操作处理
-```python
-# ==================== 7. 游戏操作处理 ====================
-- _handle_harvest_crop() # 处理收获作物
-- _handle_plant_crop() # 处理种植作物
-- _handle_buy_seed() # 处理购买种子
-- _handle_dig_ground() # 处理开垦土地
-```
-
-### 8. 系统功能处理
-```python
-# ==================== 8. 系统功能处理 ====================
-- _handle_get_play_time() # 获取游玩时间
-- _handle_update_play_time() # 更新游玩时间
-- _handle_player_rankings_request() # 获取玩家排行榜
-- _handle_crop_data_request() # 获取作物数据
-- _handle_visit_player_request() # 访问其他玩家农场
-- _handle_return_my_farm_request() # 返回自己农场
-```
-
-### 9. 辅助方法
-```python
-# ==================== 辅助方法 ====================
-- _send_initial_login_data() # 发送登录初始数据
-- _send_register_error() # 发送注册错误响应
-- _send_action_error() # 发送游戏操作错误响应
-- _create_new_user() # 创建新用户
-- _process_harvest() # 处理作物收获逻辑
-- _process_planting() # 处理作物种植逻辑
-- _process_seed_purchase() # 处理种子购买逻辑
-- _process_digging() # 处理土地开垦逻辑
-```
-
-## 主要改进点
-
-### 1. 代码复用
-- 提取了公共的验证逻辑(如 `_check_user_logged_in`、`_check_client_version`)
-- 统一了错误处理方式(如 `_send_action_error`、`_send_register_error`)
-- 将复杂的业务逻辑提取为独立方法(如 `_process_harvest`、`_process_planting`)
-
-### 2. 清晰的分组
-- 按功能将方法分为8个主要组别
-- 每个组别有明确的职责边界
-- 便于查找和维护特定功能
-
-### 3. 统一的导入
-- 将所有导入语句集中在文件顶部
-- 按标准库、第三方库、本地模块的顺序组织
-
-### 4. 改进的文档
-- 为每个方法组添加了清晰的注释
-- 为主要方法添加了详细的文档字符串
-- 在类的开头添加了功能概述
-
-### 5. 错误处理优化
-- 统一了错误响应格式
-- 提取了公共的错误处理逻辑
-- 减少了重复的错误处理代码
-
-## 使用方法
-
-重构后的代码与原代码功能完全相同,使用方法不变:
-
-```python
-# 启动服务器
-python TCPGameServer_Refactored.py
-```
-
-## 迁移指南
-
-如果要从原始版本迁移到重构版本:
-
-1. 备份原始的 `TCPGameServer.py` 文件
-2. 将 `TCPGameServer_Refactored.py` 重命名为 `TCPGameServer.py`
-3. 确保所有依赖文件(如 `TCPServer.py`、`QQEmailSend.py`)仍然存在
-4. 测试所有功能是否正常工作
-
-## 维护建议
-
-1. **添加新功能时**:按照现有的分组结构,将新方法添加到相应的组别中
-2. **修改现有功能时**:优先考虑是否可以复用现有的辅助方法
-3. **错误处理**:使用统一的错误处理方法,保持响应格式一致
-4. **文档更新**:添加新功能时,记得更新相应的文档注释
-
-## 性能影响
-
-重构主要关注代码结构和可维护性,对运行时性能的影响微乎其微:
-- 方法调用层次略有增加,但影响可忽略
-- 代码逻辑保持不变,算法复杂度相同
-- 内存使用基本相同
-
-## 总结
-
-通过这次重构,我们成功地:
-- 减少了代码重复
-- 提高了代码可读性
-- 改善了代码组织结构
-- 便于后续维护和扩展
-- 保持了原有功能的完整性
-
-重构后的代码更加专业和易于维护,为后续的功能扩展奠定了良好的基础。
\ No newline at end of file
diff --git a/Server/TCPGameServer.py b/Server/TCPGameServer.py
index c8659e7..26e8187 100644
--- a/Server/TCPGameServer.py
+++ b/Server/TCPGameServer.py
@@ -7,82 +7,183 @@ import threading
import datetime
import re
-# 服务器配置
+"""
+萌芽农场TCP游戏服务器 - 代码结构说明
+====================================================================
+
+📁 代码组织结构:
+├── 1. 初始化和生命周期管理 - 服务器启动、停止、客户端管理
+├── 2. 验证和检查方法 - 版本检查、登录状态验证
+├── 3. 数据管理方法 - 玩家数据读写、缓存管理
+├── 4. 作物系统管理 - 作物生长、更新推送
+├── 5. 消息处理路由 - 客户端消息分发处理
+├── 6. 用户认证处理 - 登录、注册、验证码
+├── 7. 游戏操作处理 - 种植、收获、浇水等
+├── 8. 系统功能处理 - 签到、抽奖、排行榜
+└── 9. 性能优化功能 - 缓存优化、批量保存
+
+🔧 性能优化特性:
+- 内存缓存系统:减少磁盘I/O操作
+- 分层更新策略:在线玩家快速更新,离线玩家慢速更新
+- 批量数据保存:定时批量写入,提升性能
+- 智能缓存管理:LRU策略,自动清理过期数据
+
+🎮 游戏功能模块:
+- 用户系统:注册、登录、邮箱验证
+- 农场系统:种植、收获、浇水、施肥
+- 升级系统:经验获取、等级提升
+- 社交系统:访问农场、点赞互动
+- 奖励系统:每日签到、幸运抽奖
+- 排行系统:玩家排行榜展示
+
+📊 数据存储:
+- 玩家数据:JSON格式存储在game_saves目录
+- 配置文件:作物数据、初始模板等
+- 缓存策略:内存缓存 + 定时持久化
+
+🌐 网络通信:
+- 协议:TCP长连接
+- 数据格式:JSON消息
+- 消息类型:请求/响应模式
+
+
+====================================================================
+"""
+
+# ============================================================================
+# 服务器配置参数
+# ============================================================================
server_host: str = "0.0.0.0"
server_port: int = 4040
buffer_size: int = 4096
-server_version: str = "1.0.1" # 记录服务端版本
+server_version: str = "1.0.3" # 记录服务端版本
+# ============================================================================
+# TCP游戏服务器类
+# ============================================================================
class TCPGameServer(TCPServer):
"""
- TCP游戏服务器类
-
- 功能分组:
- 1. 初始化和生命周期管理
- 2. 验证和检查方法
- 3. 数据管理方法
- 4. 作物系统管理
- 5. 消息处理路由
- 6. 用户认证处理
- 7. 游戏操作处理
- 8. 系统功能处理
+ 萌芽农场TCP游戏服务器
"""
- # ==================== 1. 初始化和生命周期管理 ====================
-
+ #==========================初始化和生命周期管理==========================
+ #初始化操作
def __init__(self, server_host=server_host, server_port=server_port, buffer_size=buffer_size):
"""初始化TCP游戏服务器"""
super().__init__(server_host, server_port, buffer_size)
+
+ # 基础数据存储
self.user_data = {} # 存储用户相关数据
self.crop_timer = None # 作物生长计时器
- self.log('INFO', f"TCP游戏服务器初始化 - 版本: {server_version}", 'SERVER')
- # 启动作物生长计时器
+ # 性能优化相关配置
+ self._init_performance_settings()
+
+ self.log('INFO', f"萌芽农场TCP游戏服务器初始化完成 - 版本: {server_version}", 'SERVER')
+
+ # 启动定时器
self.start_crop_growth_timer()
+ self.start_batch_save_timer()
+ #初始化性能操作
+ def _init_performance_settings(self):
+ """初始化性能优化配置"""
+ self.player_cache = {} # 玩家数据内存缓存
+ self.dirty_players = set() # 需要保存到磁盘的玩家列表
+ self.last_save_time = time.time() # 上次批量保存时间
+ self.save_interval = 30 # 批量保存间隔(秒)
+ self.update_counter = 0 # 更新计数器
+ self.slow_update_interval = 10 # 慢速更新间隔(每10秒进行一次完整更新)
+ self.active_players_cache = {} # 活跃玩家缓存
+ self.cache_expire_time = 300 # 缓存过期时间(5分钟)
+
+ #启动作物生长计时器
def start_crop_growth_timer(self):
"""启动作物生长计时器,每秒更新一次"""
- # 更新作物生长状态
- self.update_crops_growth()
+ try:
+ self.update_crops_growth_optimized()
+ except Exception as e:
+ self.log('ERROR', f"作物生长更新时出错: {str(e)}", 'SERVER')
# 创建下一个计时器
self.crop_timer = threading.Timer(1.0, self.start_crop_growth_timer)
self.crop_timer.daemon = True
self.crop_timer.start()
+ #启动批量报错计时器
+ def start_batch_save_timer(self):
+ """启动批量保存计时器"""
+ try:
+ self.batch_save_dirty_players()
+ self.cleanup_expired_cache()
+ except Exception as e:
+ self.log('ERROR', f"批量保存时出错: {str(e)}", 'SERVER')
+
+ # 创建下一个批量保存计时器
+ batch_timer = threading.Timer(self.save_interval, self.start_batch_save_timer)
+ batch_timer.daemon = True
+ batch_timer.start()
+
+ #获取服务器统计信息
+ def get_server_stats(self):
+ """获取服务器统计信息"""
+ online_players = len([cid for cid in self.user_data if self.user_data[cid].get("logged_in", False)])
+ return {
+ "cached_players": len(self.player_cache),
+ "online_players": online_players,
+ "total_connections": len(self.clients)
+ }
+
+ #停止服务器
def stop(self):
"""停止服务器"""
+ self.log('INFO', "正在停止服务器...", 'SERVER')
+
# 停止作物生长计时器
if self.crop_timer:
self.crop_timer.cancel()
self.crop_timer = None
self.log('INFO', "作物生长计时器已停止", 'SERVER')
+ # 强制保存所有缓存数据
+ self.log('INFO', "正在保存所有玩家数据...", 'SERVER')
+ saved_count = self.force_save_all_data()
+ self.log('INFO', f"已保存 {saved_count} 个玩家的数据", 'SERVER')
+
+ # 显示服务器统计信息
+ stats = self.get_server_stats()
+ self.log('INFO', f"服务器统计 - 缓存玩家: {stats['cached_players']}, 在线玩家: {stats['online_players']}, 总连接: {stats['total_connections']}", 'SERVER')
+
# 调用父类方法完成实际停止
super().stop()
+ #==========================客户端连接管理==========================
+ #移除客户端
def _remove_client(self, client_id):
- """覆盖客户端移除方法,添加用户离开通知"""
- # 通知其他用户
+ """覆盖客户端移除方法,添加用户离开通知和数据保存"""
if client_id in self.clients:
- # 获取用户名以便记录日志
username = self.user_data.get(client_id, {}).get("username", client_id)
- # 如果用户已登录,更新总游玩时间并标记其登出
+ # 处理已登录用户的离开
if client_id in self.user_data and self.user_data[client_id].get("logged_in", False):
self._update_player_logout_time(client_id, username)
+
+ # 立即保存离线玩家的数据
+ if username and username in self.player_cache:
+ self.save_player_data_immediate(username)
+ self.dirty_players.discard(username)
+ self.log('INFO', f"已立即保存离线玩家 {username} 的数据", 'SERVER')
+
self.log('INFO', f"用户 {username} 登出", 'SERVER')
- self.broadcast(
- {
- "type": "user_left",
- "user_id": client_id,
- "timestamp": time.time(),
- "remaining_users": len(self.clients) - 1
- },
- exclude=[client_id]
- )
+ # 广播用户离开消息
+ self.broadcast({
+ "type": "user_left",
+ "user_id": client_id,
+ "timestamp": time.time(),
+ "remaining_users": len(self.clients) - 1
+ }, exclude=[client_id])
# 清理用户数据
if client_id in self.user_data:
@@ -90,25 +191,11 @@ class TCPGameServer(TCPServer):
self.log('INFO', f"用户 {username} 已离开游戏", 'SERVER')
- # 调用父类方法完成实际断开
super()._remove_client(client_id)
- # ==================== 2. 验证和检查方法 ====================
-
- def _check_client_version(self, client_version, action_name="操作"):
- """检查客户端版本是否与服务端匹配"""
- if client_version != server_version:
- self.log('WARNING', f"{action_name}失败: 版本不匹配 (客户端: {client_version}, 服务端: {server_version})", 'SERVER')
-
- response = {
- "success": False,
- "message": f"版本不匹配!客户端版本: {client_version}, 服务端版本: {server_version},请更新客户端"
- }
-
- return False, response
-
- return True, None
-
+
+ #==========================验证和检查方法==========================
+ #检查用户是否已登录的通用方法
def _check_user_logged_in(self, client_id, action_name, action_type=None):
"""检查用户是否已登录的通用方法"""
if client_id not in self.user_data or not self.user_data[client_id].get("logged_in", False):
@@ -129,37 +216,80 @@ class TCPGameServer(TCPServer):
return True, None
- def _validate_qq_number(self, qq_number):
- """验证QQ号格式"""
- return re.match(r'^\d{5,12}$', qq_number) is not None
-
- # ==================== 3. 数据管理方法 ====================
-
+
+ #==========================数据管理方法==========================
+ #加载玩家数据
def load_player_data(self, account_id):
- """从game_saves文件夹加载玩家数据"""
+ """从缓存或文件加载玩家数据(优化版本)"""
+ # 先检查内存缓存
+ if account_id in self.player_cache:
+ self._update_cache_access_time(account_id)
+ return self.player_cache[account_id]
+
+ # 缓存未命中,从文件读取
+ return self._load_player_data_from_file(account_id)
+
+ #更新缓存访问时间
+ def _update_cache_access_time(self, account_id):
+ """更新缓存访问时间"""
+ if account_id not in self.active_players_cache:
+ self.active_players_cache[account_id] = {}
+ self.active_players_cache[account_id]["last_access"] = time.time()
+
+ #从文件里加载玩家数据
+ def _load_player_data_from_file(self, account_id):
+ """从文件加载玩家数据"""
file_path = os.path.join("game_saves", f"{account_id}.json")
try:
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
- return json.load(file)
+ player_data = json.load(file)
+
+ # 存入缓存
+ self.player_cache[account_id] = player_data
+ self.active_players_cache[account_id] = {
+ "last_access": time.time(),
+ "is_online": account_id in self.user_data and self.user_data[account_id].get("logged_in", False)
+ }
+
+ return player_data
return None
except Exception as e:
self.log('ERROR', f"读取玩家 {account_id} 的数据时出错: {str(e)}", 'SERVER')
return None
+ #保存玩家数据到缓存
def save_player_data(self, account_id, player_data):
- """保存玩家数据到game_saves文件夹"""
+ """保存玩家数据到缓存"""
+ # 更新内存缓存
+ self.player_cache[account_id] = player_data
+
+ # 标记为脏数据,等待批量保存
+ self.dirty_players.add(account_id)
+
+ # 更新活跃缓存
+ self._update_cache_access_time(account_id)
+
+ return True
+
+ #保存玩家数据到磁盘
+ def save_player_data_immediate(self, account_id):
+ """立即保存玩家数据到磁盘"""
+ if account_id not in self.player_cache:
+ return False
+
file_path = os.path.join("game_saves", f"{account_id}.json")
try:
with open(file_path, 'w', encoding='utf-8') as file:
- json.dump(player_data, file, indent=2, ensure_ascii=False)
+ json.dump(self.player_cache[account_id], file, indent=2, ensure_ascii=False)
return True
except Exception as e:
self.log('ERROR', f"保存玩家 {account_id} 的数据时出错: {str(e)}", 'SERVER')
return False
+ #加载玩家数据
def _load_player_data_with_check(self, client_id, action_type=None):
"""加载玩家数据并进行错误检查的通用方法"""
username = self.user_data[client_id]["username"]
@@ -183,6 +313,7 @@ class TCPGameServer(TCPServer):
return player_data, username, None
+ #加载作物配置数据
def _load_crop_data(self):
"""加载作物配置数据"""
try:
@@ -192,6 +323,7 @@ class TCPGameServer(TCPServer):
self.log('ERROR', f"无法加载作物数据: {str(e)}", 'SERVER')
return {}
+ #更新玩家登录时间
def _update_player_logout_time(self, client_id, username):
"""更新玩家登出时间和总游玩时间"""
login_timestamp = self.user_data[client_id].get("login_timestamp", time.time())
@@ -201,37 +333,49 @@ class TCPGameServer(TCPServer):
self.user_data[client_id]["visiting_mode"] = False
self.user_data[client_id]["visiting_target"] = ""
- # 加载玩家数据
+ # 加载和更新玩家数据
player_data = self.load_player_data(username)
if player_data:
- # 解析现有的总游玩时间
- total_time_str = player_data.get("total_login_time", "0时0分0秒")
- time_parts = re.match(r"(?:(\d+)时)?(?:(\d+)分)?(?:(\d+)秒)?", total_time_str)
+ self._update_total_play_time(player_data, play_time_seconds)
+ self.save_player_data(username, player_data)
+ self.log('INFO', f"用户 {username} 本次游玩时间: {play_time_seconds} 秒,总游玩时间: {player_data['total_login_time']}", 'SERVER')
+
+ #更新总游玩时间
+ def _update_total_play_time(self, player_data, play_time_seconds):
+ """更新总游玩时间"""
+ total_time_str = player_data.get("total_login_time", "0时0分0秒")
+ time_parts = re.match(r"(?:(\d+)时)?(?:(\d+)分)?(?:(\d+)秒)?", total_time_str)
+
+ if time_parts:
+ hours = int(time_parts.group(1) or 0)
+ minutes = int(time_parts.group(2) or 0)
+ seconds = int(time_parts.group(3) or 0)
- if time_parts:
- hours = int(time_parts.group(1) or 0)
- minutes = int(time_parts.group(2) or 0)
- seconds = int(time_parts.group(3) or 0)
-
- # 计算新的总游玩时间
- total_seconds = hours * 3600 + minutes * 60 + seconds + play_time_seconds
- new_hours = total_seconds // 3600
- new_minutes = (total_seconds % 3600) // 60
- new_seconds = total_seconds % 60
-
- # 更新总游玩时间
- player_data["total_login_time"] = f"{new_hours}时{new_minutes}分{new_seconds}秒"
-
- # 保存玩家数据
- self.save_player_data(username, player_data)
-
- self.log('INFO', f"用户 {username} 本次游玩时间: {play_time_seconds} 秒,总游玩时间: {player_data['total_login_time']}", 'SERVER')
+ # 计算新的总游玩时间
+ total_seconds = hours * 3600 + minutes * 60 + seconds + play_time_seconds
+ new_hours = total_seconds // 3600
+ new_minutes = (total_seconds % 3600) // 60
+ new_seconds = total_seconds % 60
+
+ # 更新总游玩时间
+ player_data["total_login_time"] = f"{new_hours}时{new_minutes}分{new_seconds}秒"
- # ==================== 4. 作物系统管理 ====================
+ #==========================作物系统管理==========================
+ #优化的作物生长更新系统
+ def update_crops_growth_optimized(self):
+ """优化的作物生长更新系统"""
+ self.update_counter += 1
+
+ # 每秒快速更新在线玩家
+ self.update_online_players_crops()
+
+ # 每10秒进行一次慢速更新(离线玩家和深度检查)
+ if self.update_counter % self.slow_update_interval == 0:
+ self.update_offline_players_crops()
- def update_crops_growth(self):
- """更新所有玩家的作物生长状态"""
- # 只更新在线玩家的作物生长状态,避免影响离线玩家的数据
+ #快速更新在线玩家的作物
+ def update_online_players_crops(self):
+ """快速更新在线玩家的作物"""
for client_id, user_info in self.user_data.items():
if not user_info.get("logged_in", False):
continue
@@ -239,182 +383,244 @@ class TCPGameServer(TCPServer):
username = user_info.get("username")
if not username:
continue
-
+
try:
- # 加载玩家数据
player_data = self.load_player_data(username)
if not player_data:
continue
- # 检查是否有作物需要更新
- growth_updated = False
-
- # 获取当前日期,用于重置浇水状态
- current_date = datetime.datetime.now().strftime("%Y-%m-%d")
- last_reset_date = player_data.get("last_water_reset_date", "")
-
- # 如果是新的一天,重置所有地块的浇水状态
- if current_date != last_reset_date:
- for farm_lot in player_data.get("farm_lots", []):
- if farm_lot.get("已浇水", False):
- farm_lot["已浇水"] = False
- growth_updated = True
- player_data["last_water_reset_date"] = current_date
- self.log('INFO', f"重置玩家 {username} 的浇水状态(新的一天)", 'SERVER')
-
- # 遍历每个农场地块
- for farm_lot in player_data.get("farm_lots", []):
- # 如果地块有作物且未死亡
- if (farm_lot.get("crop_type") and farm_lot.get("is_planted") and
- not farm_lot.get("is_dead") and farm_lot["grow_time"] < farm_lot["max_grow_time"]):
-
- # 计算生长速度倍数
- growth_multiplier = 1.0
-
- # 土地等级影响:1级土地提供1.5倍生长速度
- land_level = farm_lot.get("土地等级", 0)
- if land_level >= 1:
- growth_multiplier *= 1.5
-
- # 施肥影响:10分钟内双倍生长速度
- if farm_lot.get("已施肥", False) and "施肥时间" in farm_lot:
- fertilize_time = farm_lot.get("施肥时间", 0)
- current_time = time.time()
- # 检查是否在10分钟(600秒)内
- if current_time - fertilize_time <= 600:
- growth_multiplier *= 2.0
- else:
- # 施肥效果过期,清除施肥状态
- farm_lot["已施肥"] = False
- if "施肥时间" in farm_lot:
- del farm_lot["施肥时间"]
-
- # 应用生长速度倍数
- growth_increase = int(growth_multiplier)
- if growth_increase < 1:
- growth_increase = 1
-
- # 增加生长时间
- farm_lot["grow_time"] += growth_increase
- growth_updated = True
-
- # 如果有作物更新,保存玩家数据
- if growth_updated:
+ if self.update_player_crops_fast(player_data, username):
self.save_player_data(username, player_data)
- # 向在线玩家推送更新
self._push_crop_update_to_player(username, player_data)
except Exception as e:
- self.log('ERROR', f"更新玩家 {username} 作物生长状态时出错: {str(e)}", 'SERVER')
+ self.log('ERROR', f"快速更新在线玩家 {username} 作物时出错: {str(e)}", 'SERVER')
+ #慢速更新离线玩家的作物
+ def update_offline_players_crops(self):
+ """慢速更新离线玩家的作物(每10秒一次)"""
+ import glob
+
+ try:
+ save_files = glob.glob(os.path.join("game_saves", "*.json"))
+ offline_count = 0
+ updated_count = 0
+
+ for save_file in save_files:
+ account_id = os.path.basename(save_file).split('.')[0]
+
+ # 跳过在线玩家
+ is_online = any(
+ user_info.get("username") == account_id and user_info.get("logged_in", False)
+ for user_info in self.user_data.values()
+ )
+
+ if is_online:
+ continue
+
+ offline_count += 1
+
+ player_data = self.load_player_data(account_id)
+ if not player_data:
+ continue
+
+ if self.update_player_crops_slow(player_data, account_id):
+ self.save_player_data(account_id, player_data)
+ updated_count += 1
+
+ if updated_count > 0:
+ self.log('INFO', f"慢速更新:检查了 {offline_count} 个离线玩家,更新了 {updated_count} 个", 'SERVER')
+
+ except Exception as e:
+ self.log('ERROR', f"慢速更新离线玩家作物时出错: {str(e)}", 'SERVER')
+
+ #快速更新单个玩家的作物
+ def update_player_crops_fast(self, player_data, account_id):
+ """快速更新单个玩家的作物(在线玩家用)"""
+ return self.update_player_crops_common(player_data, account_id, 1)
+
+ #慢速更新单个玩家的作物
+ def update_player_crops_slow(self, player_data, account_id):
+ """慢速更新单个玩家的作物(离线玩家用,补偿倍数)"""
+ return self.update_player_crops_common(player_data, account_id, self.slow_update_interval)
+
+ #通用的作物更新逻辑
+ def update_player_crops_common(self, player_data, account_id, time_multiplier):
+ """通用的作物更新逻辑"""
+ growth_updated = False
+
+ for farm_lot in player_data.get("farm_lots", []):
+ if (farm_lot.get("crop_type") and farm_lot.get("is_planted") and
+ not farm_lot.get("is_dead") and farm_lot["grow_time"] < farm_lot["max_grow_time"]):
+
+ # 计算生长速度倍数
+ growth_multiplier = 1.0
+
+ # 土地等级影响 - 根据不同等级应用不同倍数
+ land_level = farm_lot.get("土地等级", 0)
+ land_speed_multipliers = {
+ 0: 1.0, # 默认土地:正常生长速度
+ 1: 2.0, # 黄土地:2倍速
+ 2: 4.0, # 红土地:4倍速
+ 3: 6.0, # 紫土地:6倍速
+ 4: 10.0 # 黑土地:10倍速
+ }
+ growth_multiplier *= land_speed_multipliers.get(land_level, 1.0)
+
+ # 施肥影响
+ if farm_lot.get("已施肥", False) and "施肥时间" in farm_lot:
+ fertilize_time = farm_lot.get("施肥时间", 0)
+ current_time = time.time()
+ if current_time - fertilize_time <= 600: # 10分钟内
+ growth_multiplier *= 2.0
+ else:
+ # 施肥效果过期
+ farm_lot["已施肥"] = False
+ if "施肥时间" in farm_lot:
+ del farm_lot["施肥时间"]
+
+ # 应用生长速度倍数和时间补偿
+ growth_increase = int(growth_multiplier * time_multiplier)
+ if growth_increase < 1:
+ growth_increase = 1
+
+ farm_lot["grow_time"] += growth_increase
+ growth_updated = True
+
+ return growth_updated
+
+ #向在线玩家推送作物生长更新
def _push_crop_update_to_player(self, account_id, player_data):
"""向在线玩家推送作物生长更新"""
- # 查找对应的客户端ID
- client_id = None
- for cid, user_info in self.user_data.items():
- if user_info.get("username") == account_id and user_info.get("logged_in", False):
- client_id = cid
- break
+ client_id = self._find_client_by_username(account_id)
- # 如果玩家在线,检查是否处于访问模式
if client_id:
- # 检查玩家是否处于访问模式
visiting_mode = self.user_data[client_id].get("visiting_mode", False)
visiting_target = self.user_data[client_id].get("visiting_target", "")
if visiting_mode and visiting_target:
- # 如果处于访问模式,发送被访问玩家的更新数据
- # 注意:这里只读取数据,不修改被访问玩家的数据
- target_player_data = self.load_player_data(visiting_target)
- if target_player_data:
- # 检查被访问玩家是否也在线,如果在线则使用最新数据
- target_client_id = None
- for cid, user_info in self.user_data.items():
- if user_info.get("username") == visiting_target and user_info.get("logged_in", False):
- target_client_id = cid
- break
-
- # 如果被访问玩家在线,使用其最新的作物数据
- # 如果不在线,使用存档中的数据(可能不是最新的)
- update_message = {
- "type": "crop_update",
- "farm_lots": target_player_data.get("farm_lots", []),
- "timestamp": time.time(),
- "is_visiting": True,
- "visited_player": visiting_target,
- "target_online": target_client_id is not None
- }
- self.send_data(client_id, update_message)
- self.log('DEBUG', f"已向访问模式中的玩家 {account_id} 推送被访问玩家 {visiting_target} 的作物更新", 'SERVER')
+ self._send_visiting_update(client_id, visiting_target)
else:
- # 正常模式,发送自己的农场更新
- update_message = {
- "type": "crop_update",
- "farm_lots": player_data.get("farm_lots", []),
- "timestamp": time.time(),
- "is_visiting": False
- }
- self.send_data(client_id, update_message)
- self.log('DEBUG', f"已向玩家 {account_id} 推送作物更新", 'SERVER')
+ self._send_normal_update(client_id, player_data)
- # ==================== 5. 消息处理路由 ====================
+ #根据用户名查找客户端ID
+ def _find_client_by_username(self, username):
+ """根据用户名查找客户端ID"""
+ for cid, user_info in self.user_data.items():
+ if user_info.get("username") == username and user_info.get("logged_in", False):
+ return cid
+ return None
+ #发送访问模式的更新
+ def _send_visiting_update(self, client_id, visiting_target):
+ """发送访问模式的更新"""
+ target_player_data = self.load_player_data(visiting_target)
+ if target_player_data:
+ target_client_id = self._find_client_by_username(visiting_target)
+
+ update_message = {
+ "type": "crop_update",
+ "farm_lots": target_player_data.get("farm_lots", []),
+ "timestamp": time.time(),
+ "is_visiting": True,
+ "visited_player": visiting_target,
+ "target_online": target_client_id is not None
+ }
+ self.send_data(client_id, update_message)
+
+ #发送正常模式的更新
+ def _send_normal_update(self, client_id, player_data):
+ """发送正常模式的更新"""
+ update_message = {
+ "type": "crop_update",
+ "farm_lots": player_data.get("farm_lots", []),
+ "timestamp": time.time(),
+ "is_visiting": False
+ }
+ self.send_data(client_id, update_message)
+
+
+
+
+
+
+# =======================服务端与客户端通信注册==========================================
+ #服务端与客户端通用消息处理-这个是服务端与客户端通信的核心中的核心
def _handle_message(self, client_id, message):
"""接收客户端消息并路由到对应处理函数"""
message_type = message.get("type", "")
# 用户认证相关
- if message_type == "greeting":
+ if message_type == "greeting":#默认欢迎
return self._handle_greeting(client_id, message)
- elif message_type == "login":
+ elif message_type == "login":#玩家登录
return self._handle_login(client_id, message)
- elif message_type == "register":
+ elif message_type == "register":#玩家注册
return self._handle_register(client_id, message)
- elif message_type == "request_verification_code":
+ elif message_type == "request_verification_code":#验证码请求
return self._handle_verification_code_request(client_id, message)
- elif message_type == "verify_code":
+ elif message_type == "verify_code":#验证码
return self._handle_verify_code(client_id, message)
- # 游戏操作相关
- elif message_type == "harvest_crop":
+ #---------------------------------------------------------------------------
+ # 游戏操作相关
+ elif message_type == "harvest_crop":#收获作物
return self._handle_harvest_crop(client_id, message)
- elif message_type == "plant_crop":
+ elif message_type == "plant_crop":#种植作物
return self._handle_plant_crop(client_id, message)
- elif message_type == "buy_seed":
+ elif message_type == "buy_seed":#购买种子
return self._handle_buy_seed(client_id, message)
- elif message_type == "dig_ground":
+ elif message_type == "dig_ground":#开垦土地
return self._handle_dig_ground(client_id, message)
- elif message_type == "remove_crop":
+ elif message_type == "remove_crop":#铲除作物
return self._handle_remove_crop(client_id, message)
- elif message_type == "water_crop":
+ elif message_type == "water_crop":#浇水
return self._handle_water_crop(client_id, message)
- elif message_type == "fertilize_crop":
+ elif message_type == "fertilize_crop":#施肥
return self._handle_fertilize_crop(client_id, message)
- elif message_type == "upgrade_land":
+ elif message_type == "upgrade_land":#升级土地
return self._handle_upgrade_land(client_id, message)
-
- # 系统功能相关
- elif message_type == "get_play_time":
+ elif message_type == "buy_new_ground":#添加新的土地
+ return self._handle_buy_new_ground(client_id, message)
+ elif message_type == "like_player":#点赞玩家
+ return self._handle_like_player(client_id, message)
+ elif message_type == "request_online_players":#请求在线玩家
+ return self._handle_online_players_request(client_id, message)
+ elif message_type == "get_play_time":#获取游玩时间
return self._handle_get_play_time(client_id)
- elif message_type == "update_play_time":
+ elif message_type == "update_play_time":#更新游玩时间
return self._handle_update_play_time(client_id)
- elif message_type == "request_player_rankings":
+ elif message_type == "request_player_rankings":#请求玩家排行榜
return self._handle_player_rankings_request(client_id)
- elif message_type == "request_crop_data":
+ elif message_type == "request_crop_data":#请求作物数据
return self._handle_crop_data_request(client_id)
- elif message_type == "visit_player":
+ elif message_type == "visit_player":#拜访其他玩家农场
return self._handle_visit_player_request(client_id, message)
- elif message_type == "return_my_farm":
+ elif message_type == "return_my_farm":#返回我的农场
return self._handle_return_my_farm_request(client_id, message)
- elif message_type == "message":
+ elif message_type == "daily_check_in":#每日签到
+ return self._handle_daily_check_in_request(client_id, message)
+ elif message_type == "get_check_in_data":#获取签到数据
+ return self._handle_get_check_in_data_request(client_id, message)
+ elif message_type == "lucky_draw":#幸运抽奖
+ return self._handle_lucky_draw_request(client_id, message)
+ elif message_type == "claim_new_player_gift":#领取新手大礼包
+ return self._handle_new_player_gift_request(client_id, message)
+ elif message_type == "ping":#客户端ping请求
+ return self._handle_ping_request(client_id, message)
+ #---------------------------------------------------------------------------
+
+ elif message_type == "message":#处理聊天消息(暂未实现)
return self._handle_chat_message(client_id, message)
-
- # 未知类型,使用默认处理
else:
return super()._handle_message(client_id, message)
-
- # ==================== 6. 用户认证处理 ====================
-
+# ========================================================================
+
+
+
+
+#==========================用户认证相关==========================
+ #处理问候消息
def _handle_greeting(self, client_id, message):
"""处理问候消息"""
content = message.get("content", "")
@@ -448,6 +654,7 @@ class TCPGameServer(TCPServer):
self.log('INFO', f"用户 {client_id} 已加入游戏", 'SERVER')
return self.send_data(client_id, response)
+ #处理玩家登录
def _handle_login(self, client_id, message):
"""处理登录消息"""
username = message.get("username", "")
@@ -472,6 +679,11 @@ class TCPGameServer(TCPServer):
current_time = datetime.datetime.now()
player_data["last_login_time"] = current_time.strftime("%Y年%m月%d日%H时%M分%S秒")
+ # 检查并更新体力值
+ stamina_updated = self._check_and_update_stamina(player_data)
+ if stamina_updated:
+ self.log('INFO', f"玩家 {username} 体力值已更新:{player_data.get('体力值', 20)}", 'SERVER')
+
# 保存用户会话信息
self.user_data[client_id] = {
"username": username,
@@ -505,6 +717,31 @@ class TCPGameServer(TCPServer):
return self.send_data(client_id, response)
+ #辅助函数-发送登录后初始数据
+ def _send_initial_login_data(self, client_id, player_data):
+ """发送登录后的初始数据"""
+ # 立即向客户端发送一次作物状态
+ farm_lots = player_data.get("farm_lots", [])
+ initial_crop_update = {
+ "type": "crop_update",
+ "farm_lots": farm_lots,
+ "timestamp": time.time()
+ }
+ self.send_data(client_id, initial_crop_update)
+
+ # 发送最新的作物数据配置
+ crop_data = self._load_crop_data()
+ if crop_data:
+ crop_data_message = {
+ "type": "crop_data_response",
+ "success": True,
+ "crop_data": crop_data
+ }
+ self.send_data(client_id, crop_data_message)
+ self.log('INFO', f"已向登录用户发送作物数据配置", 'SERVER')
+
+
+ #处理注册消息
def _handle_register(self, client_id, message):
"""处理注册消息"""
username = message.get("username", "")
@@ -544,631 +781,11 @@ class TCPGameServer(TCPServer):
# 创建新用户
return self._create_new_user(client_id, username, password, farm_name, player_name)
- def _handle_verification_code_request(self, client_id, message):
- """处理验证码请求"""
- from QQEmailSend import EmailVerification
-
- qq_number = message.get("qq_number", "")
-
- # 验证QQ号
- if not self._validate_qq_number(qq_number):
- return self.send_data(client_id, {
- "type": "verification_code_response",
- "success": False,
- "message": "QQ号格式无效,请输入5-12位数字"
- })
-
- # 生成验证码
- verification_code = EmailVerification.generate_verification_code()
-
- # 发送验证码邮件
- success, send_message = EmailVerification.send_verification_email(qq_number, verification_code)
-
- if success:
- # 保存验证码
- EmailVerification.save_verification_code(qq_number, verification_code)
- self.log('INFO', f"已向QQ号 {qq_number} 发送验证码", 'SERVER')
-
- return self.send_data(client_id, {
- "type": "verification_code_response",
- "success": True,
- "message": "验证码已发送到您的QQ邮箱,请查收"
- })
- else:
- self.log('ERROR', f"发送验证码失败: {send_message}", 'SERVER')
- return self.send_data(client_id, {
- "type": "verification_code_response",
- "success": False,
- "message": f"发送验证码失败: {send_message}"
- })
-
- def _handle_verify_code(self, client_id, message):
- """处理验证码验证"""
- from QQEmailSend import EmailVerification
-
- qq_number = message.get("qq_number", "")
- input_code = message.get("code", "")
-
- if not input_code:
- return self.send_data(client_id, {
- "type": "verify_code_response",
- "success": False,
- "message": "验证码不能为空"
- })
-
- # 验证验证码
- success, verify_message = EmailVerification.verify_code(qq_number, input_code)
-
- if success:
- self.log('INFO', f"QQ号 {qq_number} 的验证码验证成功", 'SERVER')
- return self.send_data(client_id, {
- "type": "verify_code_response",
- "success": True,
- "message": "验证成功"
- })
- else:
- self.log('WARNING', f"QQ号 {qq_number} 的验证码验证失败: {verify_message}", 'SERVER')
- return self.send_data(client_id, {
- "type": "verify_code_response",
- "success": False,
- "message": verify_message
- })
-
- # ==================== 7. 游戏操作处理 ====================
-
- def _handle_harvest_crop(self, client_id, message):
- """处理收获作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "收获作物", "harvest_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "harvest_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "harvest_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
- return self._send_action_error(client_id, "harvest_crop", "此地块没有种植作物")
-
- if lot.get("is_dead", False):
- # 处理已死亡的作物
- lot["is_planted"] = False
- lot["crop_type"] = ""
- lot["grow_time"] = 0
-
- self.save_player_data(username, player_data)
- self._push_crop_update_to_player(username, player_data)
-
- return self.send_data(client_id, {
- "type": "action_response",
- "action_type": "harvest_crop",
- "success": True,
- "message": "已铲除死亡的作物",
- "updated_data": {
- "money": player_data["money"],
- "experience": player_data["experience"],
- "level": player_data["level"]
- }
- })
-
- if lot["grow_time"] < lot["max_grow_time"]:
- return self._send_action_error(client_id, "harvest_crop", "作物尚未成熟")
-
- # 处理收获
- return self._process_harvest(client_id, player_data, username, lot, lot_index)
-
- def _handle_plant_crop(self, client_id, message):
- """处理种植作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "种植作物", "plant_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "plant_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
- crop_name = message.get("crop_name", "")
-
- # 验证参数
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "plant_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_diged", False):
- return self._send_action_error(client_id, "plant_crop", "此地块尚未开垦")
-
- if lot.get("is_planted", False):
- return self._send_action_error(client_id, "plant_crop", "此地块已经种植了作物")
-
- # 处理种植
- return self._process_planting(client_id, player_data, username, lot, crop_name)
-
- def _handle_buy_seed(self, client_id, message):
- """处理购买种子请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "购买种子", "buy_seed")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "buy_seed")
- if not player_data:
- return self.send_data(client_id, response)
-
- crop_name = message.get("crop_name", "")
-
- # 加载作物配置
- crop_data = self._load_crop_data()
- if not crop_data:
- return self._send_action_error(client_id, "buy_seed", "服务器无法加载作物数据")
-
- # 检查作物是否存在
- if crop_name not in crop_data:
- return self._send_action_error(client_id, "buy_seed", "该种子不存在")
-
- # 处理购买
- return self._process_seed_purchase(client_id, player_data, username, crop_name, crop_data[crop_name])
-
- def _handle_dig_ground(self, client_id, message):
- """处理开垦土地请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "开垦土地", "dig_ground")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "dig_ground")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "dig_ground", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块是否已开垦
- if lot.get("is_diged", False):
- return self._send_action_error(client_id, "dig_ground", "此地块已经开垦过了")
-
- # 处理开垦
- return self._process_digging(client_id, player_data, username, lot, lot_index)
-
- def _handle_remove_crop(self, client_id, message):
- """处理铲除作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "铲除作物", "remove_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "remove_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "remove_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
- return self._send_action_error(client_id, "remove_crop", "此地块没有种植作物")
-
- # 处理铲除
- return self._process_crop_removal(client_id, player_data, username, lot, lot_index)
-
- def _handle_water_crop(self, client_id, message):
- """处理浇水作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "浇水作物", "water_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "water_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "water_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
- return self._send_action_error(client_id, "water_crop", "此地块没有种植作物")
-
- # 处理浇水
- return self._process_watering(client_id, player_data, username, lot, lot_index)
-
- def _handle_fertilize_crop(self, client_id, message):
- """处理施肥作物请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "施肥作物", "fertilize_crop")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "fertilize_crop")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "fertilize_crop", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块状态
- if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
- return self._send_action_error(client_id, "fertilize_crop", "此地块没有种植作物")
-
- # 处理施肥
- return self._process_fertilizing(client_id, player_data, username, lot, lot_index)
-
- def _handle_upgrade_land(self, client_id, message):
- """处理升级土地请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "升级土地", "upgrade_land")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "upgrade_land")
- if not player_data:
- return self.send_data(client_id, response)
-
- lot_index = message.get("lot_index", -1)
-
- # 验证地块索引
- if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
- return self._send_action_error(client_id, "upgrade_land", "无效的地块索引")
-
- lot = player_data["farm_lots"][lot_index]
-
- # 检查地块是否已开垦
- if not lot.get("is_diged", False):
- return self._send_action_error(client_id, "upgrade_land", "此地块尚未开垦")
-
- # 处理升级
- return self._process_land_upgrade(client_id, player_data, username, lot, lot_index)
-
- # ==================== 8. 系统功能处理 ====================
-
- def _handle_get_play_time(self, client_id):
- """处理获取游玩时间请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "获取游玩时间")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "play_time")
- if not player_data:
- return self.send_data(client_id, response)
-
- # 计算当前会话的游玩时间
- login_timestamp = self.user_data[client_id].get("login_timestamp", time.time())
- current_session_seconds = int(time.time() - login_timestamp)
-
- # 格式化当前会话时间
- current_hours = current_session_seconds // 3600
- current_minutes = (current_session_seconds % 3600) // 60
- current_seconds = current_session_seconds % 60
- current_session_time = f"{current_hours}时{current_minutes}分{current_seconds}秒"
-
- # 获取最后登录时间和总游玩时间
- last_login_time = player_data.get("last_login_time", "未知")
- total_login_time = player_data.get("total_login_time", "0时0分0秒")
-
- self.log('INFO', f"玩家 {username} 请求游玩时间统计", 'SERVER')
-
- return self.send_data(client_id, {
- "type": "play_time_response",
- "success": True,
- "last_login_time": last_login_time,
- "total_login_time": total_login_time,
- "current_session_time": current_session_time
- })
-
- def _handle_update_play_time(self, client_id):
- """处理更新游玩时间请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "更新游玩时间", "update_time")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "update_time")
- if not player_data:
- return self.send_data(client_id, response)
-
- # 计算当前会话的游玩时间
- login_timestamp = self.user_data[client_id].get("login_timestamp", time.time())
- play_time_seconds = int(time.time() - login_timestamp)
-
- # 解析现有的总游玩时间
- total_time_str = player_data.get("total_login_time", "0时0分0秒")
- time_parts = re.match(r"(?:(\d+)时)?(?:(\d+)分)?(?:(\d+)秒)?", total_time_str)
-
- if time_parts:
- hours = int(time_parts.group(1) or 0)
- minutes = int(time_parts.group(2) or 0)
- seconds = int(time_parts.group(3) or 0)
-
- # 计算新的总游玩时间
- total_seconds = hours * 3600 + minutes * 60 + seconds + play_time_seconds
- new_hours = total_seconds // 3600
- new_minutes = (total_seconds % 3600) // 60
- new_seconds = total_seconds % 60
-
- # 更新总游玩时间
- player_data["total_login_time"] = f"{new_hours}时{new_minutes}分{new_seconds}秒"
-
- # 保存玩家数据
- self.save_player_data(username, player_data)
-
- # 重置登录时间戳,以便下次计算
- self.user_data[client_id]["login_timestamp"] = time.time()
-
- self.log('INFO', f"已更新玩家 {username} 的游玩时间,当前游玩时间: {play_time_seconds} 秒,总游玩时间: {player_data['total_login_time']}", 'SERVER')
-
- return self.send_data(client_id, {
- "type": "update_time_response",
- "success": True,
- "message": "游玩时间已更新",
- "total_login_time": player_data["total_login_time"]
- })
- else:
- self.log('ERROR', f"解析玩家 {username} 的游玩时间失败", 'SERVER')
- return self.send_data(client_id, {
- "type": "update_time_response",
- "success": False,
- "message": "更新游玩时间失败,格式错误"
- })
-
- def _handle_player_rankings_request(self, client_id):
- """处理获取玩家排行榜的请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "获取玩家排行榜", "player_rankings")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取所有玩家存档文件
- save_files = glob.glob(os.path.join("game_saves", "*.json"))
- players_data = []
-
- for save_file in save_files:
- try:
- # 从文件名提取账号ID
- account_id = os.path.basename(save_file).split('.')[0]
-
- # 加载玩家数据
- with open(save_file, 'r', encoding='utf-8') as file:
- player_data = json.load(file)
-
- if player_data:
- # 统计背包中的种子数量
- seed_count = sum(item.get("count", 0) for item in player_data.get("player_bag", []))
-
- # 获取所需的玩家信息
- player_info = {
- "user_name": player_data.get("user_name", account_id),
- "player_name": player_data.get("player_name", player_data.get("user_name", account_id)),
- "farm_name": player_data.get("farm_name", ""),
- "level": player_data.get("level", 1),
- "money": player_data.get("money", 0),
- "experience": player_data.get("experience", 0),
- "seed_count": seed_count,
- "last_login_time": player_data.get("last_login_time", "未知"),
- "total_login_time": player_data.get("total_login_time", "0时0分0秒")
- }
-
- players_data.append(player_info)
- except Exception as e:
- self.log('ERROR', f"读取玩家 {account_id} 的数据时出错: {str(e)}", 'SERVER')
-
- # 按等级降序排序
- players_data.sort(key=lambda x: x["level"], reverse=True)
-
- self.log('INFO', f"玩家 {self.user_data[client_id].get('username')} 请求玩家排行榜,返回 {len(players_data)} 个玩家数据", 'SERVER')
-
- # 返回排行榜数据
- return self.send_data(client_id, {
- "type": "player_rankings_response",
- "success": True,
- "players": players_data
- })
-
- def _handle_crop_data_request(self, client_id):
- """处理客户端请求作物数据"""
- crop_data = self._load_crop_data()
-
- if crop_data:
- self.log('INFO', f"向客户端 {client_id} 发送作物数据", 'SERVER')
- return self.send_data(client_id, {
- "type": "crop_data_response",
- "success": True,
- "crop_data": crop_data
- })
- else:
- return self.send_data(client_id, {
- "type": "crop_data_response",
- "success": False,
- "message": "无法读取作物数据"
- })
-
- def _handle_visit_player_request(self, client_id, message):
- """处理访问其他玩家农场的请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "访问玩家农场", "visit_player")
- if not logged_in:
- return self.send_data(client_id, response)
-
- target_username = message.get("target_username", "")
-
- if not target_username:
- return self.send_data(client_id, {
- "type": "visit_player_response",
- "success": False,
- "message": "缺少目标用户名"
- })
-
- # 加载目标玩家数据
- target_player_data = self.load_player_data(target_username)
-
- if not target_player_data:
- return self.send_data(client_id, {
- "type": "visit_player_response",
- "success": False,
- "message": f"无法找到玩家 {target_username} 的数据"
- })
-
- # 返回目标玩家的农场数据(只返回可见的数据,不包含敏感信息如密码)
- safe_player_data = {
- "user_name": target_player_data.get("user_name", target_username),
- "player_name": target_player_data.get("player_name", target_username),
- "farm_name": target_player_data.get("farm_name", ""),
- "level": target_player_data.get("level", 1),
- "money": target_player_data.get("money", 0),
- "experience": target_player_data.get("experience", 0),
- "farm_lots": target_player_data.get("farm_lots", []),
- "player_bag": target_player_data.get("player_bag", []),
- "last_login_time": target_player_data.get("last_login_time", "未知"),
- "total_login_time": target_player_data.get("total_login_time", "0时0分0秒")
- }
-
- current_username = self.user_data[client_id]["username"]
- self.log('INFO', f"玩家 {current_username} 访问了玩家 {target_username} 的农场", 'SERVER')
-
- # 记录玩家的访问状态
- self.user_data[client_id]["visiting_mode"] = True
- self.user_data[client_id]["visiting_target"] = target_username
-
- return self.send_data(client_id, {
- "type": "visit_player_response",
- "success": True,
- "message": f"成功获取玩家 {target_username} 的农场数据",
- "player_data": safe_player_data,
- "is_visiting": True
- })
-
- def _handle_return_my_farm_request(self, client_id, message):
- """处理玩家返回自己农场的请求"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "返回自己农场", "return_my_farm")
- if not logged_in:
- return self.send_data(client_id, response)
-
- # 获取玩家数据
- player_data, username, response = self._load_player_data_with_check(client_id, "return_my_farm")
- if not player_data:
- return self.send_data(client_id, response)
-
- # 清除访问状态
- self.user_data[client_id]["visiting_mode"] = False
- self.user_data[client_id]["visiting_target"] = ""
-
- self.log('INFO', f"玩家 {username} 返回了自己的农场", 'SERVER')
-
- # 返回玩家自己的农场数据
- return self.send_data(client_id, {
- "type": "return_my_farm_response",
- "success": True,
- "message": "已返回自己的农场",
- "player_data": {
- "user_name": player_data.get("user_name", username),
- "player_name": player_data.get("player_name", username),
- "farm_name": player_data.get("farm_name", ""),
- "level": player_data.get("level", 1),
- "money": player_data.get("money", 0),
- "experience": player_data.get("experience", 0),
- "farm_lots": player_data.get("farm_lots", []),
- "player_bag": player_data.get("player_bag", [])
- },
- "is_visiting": False
- })
-
- def _handle_chat_message(self, client_id, message):
- """处理聊天消息"""
- # 检查用户是否已登录
- logged_in, response = self._check_user_logged_in(client_id, "发送聊天消息")
- if not logged_in:
- return self.send_data(client_id, response)
-
- content = message.get("content", "")
- if not content.strip():
- return self.send_data(client_id, {
- "type": "chat_response",
- "success": False,
- "message": "消息内容不能为空"
- })
-
- username = self.user_data[client_id]["username"]
-
- # 广播聊天消息给所有在线用户
- chat_message = {
- "type": "chat_message",
- "username": username,
- "content": content,
- "timestamp": time.time()
- }
-
- self.broadcast(chat_message)
- self.log('INFO', f"用户 {username} 发送聊天消息: {content}", 'SERVER')
-
- return True
-
- # ==================== 辅助方法 ====================
-
- def _send_initial_login_data(self, client_id, player_data):
- """发送登录后的初始数据"""
- # 立即向客户端发送一次作物状态
- farm_lots = player_data.get("farm_lots", [])
- initial_crop_update = {
- "type": "crop_update",
- "farm_lots": farm_lots,
- "timestamp": time.time()
- }
- self.send_data(client_id, initial_crop_update)
-
- # 发送最新的作物数据配置
- crop_data = self._load_crop_data()
- if crop_data:
- crop_data_message = {
- "type": "crop_data_response",
- "success": True,
- "crop_data": crop_data
- }
- self.send_data(client_id, crop_data_message)
- self.log('INFO', f"已向登录用户发送作物数据配置", 'SERVER')
+ #检查客户端版本是否与服务端匹配
+ #创建新用户
+
+ #辅助函数-发送注册错误处理
def _send_register_error(self, client_id, message):
"""发送注册错误响应"""
self.log('WARNING', f"注册失败: {message}", 'SERVER')
@@ -1178,15 +795,8 @@ class TCPGameServer(TCPServer):
"message": message
})
- def _send_action_error(self, client_id, action_type, message):
- """发送游戏操作错误响应"""
- return self.send_data(client_id, {
- "type": "action_response",
- "action_type": action_type,
- "success": False,
- "message": message
- })
-
+
+ #辅助函数-创建新用户
def _create_new_user(self, client_id, username, password, farm_name, player_name):
"""创建新用户"""
try:
@@ -1251,6 +861,206 @@ class TCPGameServer(TCPServer):
self.log('ERROR', f"注册用户 {username} 时出错: {str(e)}", 'SERVER')
return self._send_register_error(client_id, f"注册过程中出现错误: {str(e)}")
+ #辅助函数-客户端版本检查
+ def _check_client_version(self, client_version, action_name="操作"):
+ """检查客户端版本是否与服务端匹配"""
+ if client_version != server_version:
+ self.log('WARNING', f"{action_name}失败: 版本不匹配 (客户端: {client_version}, 服务端: {server_version})", 'SERVER')
+
+ response = {
+ "success": False,
+ "message": f"版本不匹配!客户端版本: {client_version},\n 服务端版本: {server_version},请更新客户端"
+ }
+ return False, response
+
+ return True, None
+
+ #处理验证码请求
+ def _handle_verification_code_request(self, client_id, message):
+ """处理验证码请求"""
+ from QQEmailSend import EmailVerification
+
+ qq_number = message.get("qq_number", "")
+
+ # 验证QQ号
+ if not self._validate_qq_number(qq_number):
+ return self.send_data(client_id, {
+ "type": "verification_code_response",
+ "success": False,
+ "message": "QQ号格式无效,请输入5-12位数字"
+ })
+
+ # 生成验证码
+ verification_code = EmailVerification.generate_verification_code()
+
+ # 发送验证码邮件
+ success, send_message = EmailVerification.send_verification_email(qq_number, verification_code)
+
+ if success:
+ # 保存验证码
+ EmailVerification.save_verification_code(qq_number, verification_code)
+ self.log('INFO', f"已向QQ号 {qq_number} 发送验证码", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "verification_code_response",
+ "success": True,
+ "message": "验证码已发送到您的QQ邮箱,请查收"
+ })
+ else:
+ self.log('ERROR', f"发送验证码失败: {send_message}", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "verification_code_response",
+ "success": False,
+ "message": f"发送验证码失败: {send_message}"
+ })
+
+ #处理验证码验证
+ def _handle_verify_code(self, client_id, message):
+ """处理验证码验证"""
+ from QQEmailSend import EmailVerification
+
+ qq_number = message.get("qq_number", "")
+ input_code = message.get("code", "")
+
+ if not input_code:
+ return self.send_data(client_id, {
+ "type": "verify_code_response",
+ "success": False,
+ "message": "验证码不能为空"
+ })
+
+ # 验证验证码
+ success, verify_message = EmailVerification.verify_code(qq_number, input_code)
+
+ if success:
+ self.log('INFO', f"QQ号 {qq_number} 的验证码验证成功", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "verify_code_response",
+ "success": True,
+ "message": "验证成功"
+ })
+ else:
+ self.log('WARNING', f"QQ号 {qq_number} 的验证码验证失败: {verify_message}", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "verify_code_response",
+ "success": False,
+ "message": verify_message
+ })
+
+ #验证QQ号格式
+
+ #辅助函数-验证QQ号格式
+ def _validate_qq_number(self, qq_number):
+ """验证QQ号格式"""
+ return re.match(r'^\d{5,12}$', qq_number) is not None
+
+#==========================用户认证相关==========================
+
+
+
+
+
+
+#==========================收获作物处理==========================
+ #处理收获作物请求
+ def _handle_harvest_crop(self, client_id, message):
+ """处理收获作物请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "收获作物", "harvest_crop")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取当前操作用户的数据
+ current_player_data, current_username, response = self._load_player_data_with_check(client_id, "harvest_crop")
+ if not current_player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+ target_username = message.get("target_username", "")
+
+ # 确定操作目标:如果有target_username就是访问模式(偷菜),否则是自己的农场
+ if target_username and target_username != current_username:
+ # 访问模式:偷菜(收益给自己,清空目标玩家的作物)
+ target_player_data = self.load_player_data(target_username)
+ if not target_player_data:
+ return self._send_action_error(client_id, "harvest_crop", f"无法找到玩家 {target_username} 的数据")
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(target_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "harvest_crop", "无效的地块索引")
+
+ target_lot = target_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not target_lot.get("is_planted", False) or not target_lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "harvest_crop", "此地块没有种植作物")
+
+ if target_lot.get("is_dead", False):
+ # 处理已死亡的作物(只清理,不给收益)
+ target_lot["is_planted"] = False
+ target_lot["crop_type"] = ""
+ target_lot["grow_time"] = 0
+
+ self.save_player_data(target_username, target_player_data)
+ self._push_crop_update_to_player(target_username, target_player_data)
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "harvest_crop",
+ "success": True,
+ "message": f"已帮助 {target_username} 清理死亡的作物",
+ "updated_data": {
+ "money": current_player_data["money"],
+ "experience": current_player_data["experience"],
+ "level": current_player_data["level"]
+ }
+ })
+
+ if target_lot["grow_time"] < target_lot["max_grow_time"]:
+ return self._send_action_error(client_id, "harvest_crop", "作物尚未成熟,无法偷菜")
+
+ # 处理偷菜
+ return self._process_steal_crop(client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index)
+ else:
+ # 正常模式:收获自己的作物
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(current_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "harvest_crop", "无效的地块索引")
+
+ lot = current_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "harvest_crop", "此地块没有种植作物")
+
+ if lot.get("is_dead", False):
+ # 处理已死亡的作物
+ lot["is_planted"] = False
+ lot["crop_type"] = ""
+ lot["grow_time"] = 0
+
+ self.save_player_data(current_username, current_player_data)
+ self._push_crop_update_to_player(current_username, current_player_data)
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "harvest_crop",
+ "success": True,
+ "message": "已铲除死亡的作物",
+ "updated_data": {
+ "money": current_player_data["money"],
+ "experience": current_player_data["experience"],
+ "level": current_player_data["level"]
+ }
+ })
+
+ if lot["grow_time"] < lot["max_grow_time"]:
+ return self._send_action_error(client_id, "harvest_crop", "作物尚未成熟")
+
+ # 处理正常收获
+ return self._process_harvest(client_id, current_player_data, current_username, lot, lot_index)
+
+ #辅助函数-处理作物收获
def _process_harvest(self, client_id, player_data, username, lot, lot_index):
"""处理作物收获逻辑"""
# 读取作物配置
@@ -1308,6 +1118,119 @@ class TCPGameServer(TCPServer):
}
})
+ #辅助函数-处理偷菜逻辑(访问模式下收获其他玩家作物的操作)
+ def _process_steal_crop(self, client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index):
+ """处理偷菜逻辑(收益给当前玩家,清空目标玩家的作物)"""
+ # 偷菜体力值消耗
+ stamina_cost = 2
+
+ # 检查并更新当前玩家的体力值
+ self._check_and_update_stamina(current_player_data)
+
+ # 检查体力值是否足够
+ if not self._check_stamina_sufficient(current_player_data, stamina_cost):
+ return self._send_action_error(client_id, "harvest_crop", f"体力值不足,偷菜需要 {stamina_cost} 点体力,当前体力:{current_player_data.get('体力值', 0)}")
+
+ # 读取作物配置
+ crop_data = self._load_crop_data()
+
+ # 获取作物收益和经验(偷菜获得的收益稍微少一些,比如80%)
+ crop_type = target_lot["crop_type"]
+ if crop_type in crop_data:
+ crop_income = int((crop_data[crop_type].get("收益", 100) + crop_data[crop_type].get("花费", 0)) * 0.8) # 偷菜获得80%收益
+ crop_exp = int(crop_data[crop_type].get("经验", 10) * 0.5) # 偷菜获得50%经验
+ else:
+ # 默认收益
+ crop_income = 80
+ crop_exp = 5
+
+ # 消耗当前玩家的体力值
+ stamina_success, stamina_message = self._consume_stamina(current_player_data, stamina_cost, "偷菜")
+ if not stamina_success:
+ return self._send_action_error(client_id, "harvest_crop", stamina_message)
+
+ # 更新当前玩家数据(获得收益)
+ current_player_data["money"] += crop_income
+ current_player_data["experience"] += crop_exp
+
+ # 检查当前玩家升级
+ level_up_experience = 100 * current_player_data["level"]
+ if current_player_data["experience"] >= level_up_experience:
+ current_player_data["level"] += 1
+ current_player_data["experience"] -= level_up_experience
+ self.log('INFO', f"玩家 {current_username} 升级到 {current_player_data['level']} 级", 'SERVER')
+
+ # 清理目标玩家的地块
+ target_lot["is_planted"] = False
+ target_lot["crop_type"] = ""
+ target_lot["grow_time"] = 0
+ target_lot["已浇水"] = False
+ target_lot["已施肥"] = False
+
+ # 清除施肥时间戳
+ if "施肥时间" in target_lot:
+ del target_lot["施肥时间"]
+
+ # 保存两个玩家的数据
+ self.save_player_data(current_username, current_player_data)
+ self.save_player_data(target_username, target_player_data)
+
+ # 向目标玩家推送作物更新(如果在线)
+ self._push_crop_update_to_player(target_username, target_player_data)
+
+ self.log('INFO', f"玩家 {current_username} 偷了玩家 {target_username} 地块 {lot_index} 的作物,获得 {crop_income} 金钱和 {crop_exp} 经验", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "harvest_crop",
+ "success": True,
+ "message": f"偷菜成功!从 {target_username} 那里获得 {crop_income} 金钱和 {crop_exp} 经验,{stamina_message}",
+ "updated_data": {
+ "money": current_player_data["money"],
+ "experience": current_player_data["experience"],
+ "level": current_player_data["level"],
+ "体力值": current_player_data["体力值"]
+ }
+ })
+#==========================收获作物处理==========================
+
+
+
+
+#==========================种植作物处理==========================
+ #处理种植作物请求
+ def _handle_plant_crop(self, client_id, message):
+ """处理种植作物请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "种植作物", "plant_crop")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "plant_crop")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+ crop_name = message.get("crop_name", "")
+
+ # 验证参数
+ if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "plant_crop", "无效的地块索引")
+
+ lot = player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not lot.get("is_diged", False):
+ return self._send_action_error(client_id, "plant_crop", "此地块尚未开垦")
+
+ if lot.get("is_planted", False):
+ return self._send_action_error(client_id, "plant_crop", "此地块已经种植了作物")
+
+ # 处理种植
+ return self._process_planting(client_id, player_data, username, lot, crop_name)
+
+ #辅助函数-处理作物种植逻辑
def _process_planting(self, client_id, player_data, username, lot, crop_name):
"""处理作物种植逻辑"""
# 读取作物配置
@@ -1371,7 +1294,40 @@ class TCPGameServer(TCPServer):
"player_bag": player_data["player_bag"]
}
})
+#==========================种植作物处理==========================
+
+
+
+
+#==========================购买种子处理==========================
+ #处理购买种子请求
+ def _handle_buy_seed(self, client_id, message):
+ """处理购买种子请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "购买种子", "buy_seed")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "buy_seed")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ crop_name = message.get("crop_name", "")
+
+ # 加载作物配置
+ crop_data = self._load_crop_data()
+ if not crop_data:
+ return self._send_action_error(client_id, "buy_seed", "服务器无法加载作物数据")
+
+ # 检查作物是否存在
+ if crop_name not in crop_data:
+ return self._send_action_error(client_id, "buy_seed", "该种子不存在")
+
+ # 处理购买
+ return self._process_seed_purchase(client_id, player_data, username, crop_name, crop_data[crop_name])
+ #处理种子购买逻辑
def _process_seed_purchase(self, client_id, player_data, username, crop_name, crop):
"""处理种子购买逻辑"""
# 检查玩家等级
@@ -1420,6 +1376,41 @@ class TCPGameServer(TCPServer):
}
})
+#==========================购买种子处理==========================
+
+
+
+
+#==========================开垦土地处理==========================
+ #处理开垦土地请求
+ def _handle_dig_ground(self, client_id, message):
+ """处理开垦土地请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "开垦土地", "dig_ground")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "dig_ground")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "dig_ground", "无效的地块索引")
+
+ lot = player_data["farm_lots"][lot_index]
+
+ # 检查地块是否已开垦
+ if lot.get("is_diged", False):
+ return self._send_action_error(client_id, "dig_ground", "此地块已经开垦过了")
+
+ # 处理开垦
+ return self._process_digging(client_id, player_data, username, lot, lot_index)
+
+ #辅助函数-处理土地开垦逻辑
def _process_digging(self, client_id, player_data, username, lot, lot_index):
"""处理土地开垦逻辑"""
# 计算开垦费用 - 基于已开垦地块数量
@@ -1453,6 +1444,41 @@ class TCPGameServer(TCPServer):
}
})
+#==========================开垦土地处理==========================
+
+
+
+
+#==========================铲除作物处理==========================
+ #处理铲除作物请求
+ def _handle_remove_crop(self, client_id, message):
+ """处理铲除作物请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "铲除作物", "remove_crop")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "remove_crop")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "remove_crop", "无效的地块索引")
+
+ lot = player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "remove_crop", "此地块没有种植作物")
+
+ # 处理铲除
+ return self._process_crop_removal(client_id, player_data, username, lot, lot_index)
+
+ #辅助函数-处理铲除作物逻辑
def _process_crop_removal(self, client_id, player_data, username, lot, lot_index):
"""处理铲除作物逻辑"""
# 铲除费用
@@ -1491,10 +1517,75 @@ class TCPGameServer(TCPServer):
}
})
+#==========================铲除作物处理==========================
+
+
+
+
+#==========================浇水作物处理==========================
+ #处理浇水请求
+ def _handle_water_crop(self, client_id, message):
+ """处理浇水作物请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "浇水作物", "water_crop")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取当前操作用户的数据
+ current_player_data, current_username, response = self._load_player_data_with_check(client_id, "water_crop")
+ if not current_player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+ target_username = message.get("target_username", "")
+
+ # 确定操作目标:如果有target_username就是访问模式,否则是自己的农场
+ if target_username and target_username != current_username:
+ # 访问模式:浇水别人的作物,但花自己的钱
+ target_player_data = self.load_player_data(target_username)
+ if not target_player_data:
+ return self._send_action_error(client_id, "water_crop", f"无法找到玩家 {target_username} 的数据")
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(target_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "water_crop", "无效的地块索引")
+
+ target_lot = target_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not target_lot.get("is_planted", False) or not target_lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "water_crop", "此地块没有种植作物")
+
+ # 处理访问模式浇水(花自己的钱,效果作用在目标玩家作物上)
+ return self._process_visiting_watering(client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index)
+ else:
+ # 正常模式:浇水自己的作物
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(current_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "water_crop", "无效的地块索引")
+
+ lot = current_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "water_crop", "此地块没有种植作物")
+
+ # 处理正常浇水
+ return self._process_watering(client_id, current_player_data, current_username, lot, lot_index)
+
+ #辅助函数-处理浇水逻辑
def _process_watering(self, client_id, player_data, username, lot, lot_index):
"""处理浇水逻辑"""
- # 浇水费用
+ # 浇水费用和体力值消耗
water_cost = 50
+ stamina_cost = 1
+
+ # 检查并更新体力值
+ self._check_and_update_stamina(player_data)
+
+ # 检查体力值是否足够
+ if not self._check_stamina_sufficient(player_data, stamina_cost):
+ return self._send_action_error(client_id, "water_crop", f"体力值不足,浇水需要 {stamina_cost} 点体力,当前体力:{player_data.get('体力值', 0)}")
# 检查玩家金钱是否足够
if player_data["money"] < water_cost:
@@ -1508,13 +1599,25 @@ class TCPGameServer(TCPServer):
if lot["grow_time"] >= lot["max_grow_time"]:
return self._send_action_error(client_id, "water_crop", "作物已经成熟,无需浇水")
- # 检查今天是否已经浇过水
- if lot.get("已浇水", False):
- return self._send_action_error(client_id, "water_crop", "今天已经浇过水了")
+ # 检查是否在1小时内已经浇过水(3600秒 = 1小时)
+ current_time = time.time()
+ last_water_time = lot.get("浇水时间", 0)
+ water_cooldown = 3600 # 1小时冷却时间
+
+ if current_time - last_water_time < water_cooldown:
+ remaining_time = water_cooldown - (current_time - last_water_time)
+ remaining_minutes = int(remaining_time // 60)
+ remaining_seconds = int(remaining_time % 60)
+ return self._send_action_error(client_id, "water_crop", f"浇水冷却中,还需等待 {remaining_minutes} 分钟 {remaining_seconds} 秒")
# 执行浇水操作
player_data["money"] -= water_cost
+ # 消耗体力值
+ stamina_success, stamina_message = self._consume_stamina(player_data, stamina_cost, "浇水")
+ if not stamina_success:
+ return self._send_action_error(client_id, "water_crop", stamina_message)
+
# 计算浇水效果:增加1%的生长进度
growth_increase = int(lot["max_grow_time"] * 0.01) # 1%的生长时间
if growth_increase < 1:
@@ -1526,8 +1629,8 @@ class TCPGameServer(TCPServer):
if lot["grow_time"] > lot["max_grow_time"]:
lot["grow_time"] = lot["max_grow_time"]
- # 标记已浇水
- lot["已浇水"] = True
+ # 记录浇水时间戳
+ lot["浇水时间"] = current_time
# 保存玩家数据
self.save_player_data(username, player_data)
@@ -1540,7 +1643,7 @@ class TCPGameServer(TCPServer):
self.log('INFO', f"玩家 {username} 给地块 {lot_index} 的 {crop_type} 浇水,花费 {water_cost} 金钱,生长进度: {progress:.1f}%", 'SERVER')
- message = f"浇水成功!{crop_type} 生长了 {growth_increase} 秒,当前进度: {progress:.1f}%"
+ message = f"浇水成功!{crop_type} 生长了 {growth_increase} 秒,当前进度: {progress:.1f}%,{stamina_message}"
if lot["grow_time"] >= lot["max_grow_time"]:
message += ",作物已成熟!"
@@ -1551,14 +1654,231 @@ class TCPGameServer(TCPServer):
"message": message,
"updated_data": {
"money": player_data["money"],
+ "体力值": player_data["体力值"],
"farm_lots": player_data["farm_lots"]
}
})
+ #处理访问模式浇水逻辑
+ def _process_visiting_watering(self, client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index):
+ """处理访问模式浇水逻辑(花自己的钱,效果作用在目标玩家作物上)"""
+ # 浇水费用和体力值消耗
+ water_cost = 50
+ stamina_cost = 1
+
+ # 检查并更新当前玩家的体力值
+ self._check_and_update_stamina(current_player_data)
+
+ # 检查体力值是否足够
+ if not self._check_stamina_sufficient(current_player_data, stamina_cost):
+ return self._send_action_error(client_id, "water_crop", f"体力值不足,帮助浇水需要 {stamina_cost} 点体力,当前体力:{current_player_data.get('体力值', 0)}")
+
+ # 检查当前玩家金钱是否足够
+ if current_player_data["money"] < water_cost:
+ return self._send_action_error(client_id, "water_crop", f"金钱不足,帮助浇水需要 {water_cost} 金钱")
+
+ # 检查目标作物是否已死亡
+ if target_lot.get("is_dead", False):
+ return self._send_action_error(client_id, "water_crop", "死亡的作物无法浇水")
+
+ # 检查是否已经成熟
+ if target_lot["grow_time"] >= target_lot["max_grow_time"]:
+ return self._send_action_error(client_id, "water_crop", "作物已经成熟,无需浇水")
+
+ # 检查是否在1小时内已经浇过水
+ current_time = time.time()
+ last_water_time = target_lot.get("浇水时间", 0)
+ water_cooldown = 3600 # 1小时冷却时间
+
+ if current_time - last_water_time < water_cooldown:
+ remaining_time = water_cooldown - (current_time - last_water_time)
+ remaining_minutes = int(remaining_time // 60)
+ remaining_seconds = int(remaining_time % 60)
+ return self._send_action_error(client_id, "water_crop", f"浇水冷却中,还需等待 {remaining_minutes} 分钟 {remaining_seconds} 秒")
+
+ # 执行浇水操作:扣除当前玩家的钱
+ current_player_data["money"] -= water_cost
+
+ # 消耗当前玩家的体力值
+ stamina_success, stamina_message = self._consume_stamina(current_player_data, stamina_cost, "帮助浇水")
+ if not stamina_success:
+ return self._send_action_error(client_id, "water_crop", stamina_message)
+
+ # 计算浇水效果:增加目标作物的生长进度
+ growth_increase = int(target_lot["max_grow_time"] * 0.01) # 1%的生长时间
+ if growth_increase < 1:
+ growth_increase = 1 # 至少增加1秒
+
+ target_lot["grow_time"] += growth_increase
+
+ # 确保不超过最大生长时间
+ if target_lot["grow_time"] > target_lot["max_grow_time"]:
+ target_lot["grow_time"] = target_lot["max_grow_time"]
+
+ # 记录浇水时间戳
+ target_lot["浇水时间"] = current_time
+
+ # 保存两个玩家的数据
+ self.save_player_data(current_username, current_player_data)
+ self.save_player_data(target_username, target_player_data)
+
+ # 向目标玩家推送作物更新(如果在线)
+ self._push_crop_update_to_player(target_username, target_player_data)
+
+ crop_type = target_lot.get("crop_type", "未知作物")
+ progress = (target_lot["grow_time"] / target_lot["max_grow_time"]) * 100
+
+ self.log('INFO', f"玩家 {current_username} 帮助玩家 {target_username} 给地块 {lot_index} 的 {crop_type} 浇水,花费 {water_cost} 金钱,生长进度: {progress:.1f}%", 'SERVER')
+
+ message = f"帮助浇水成功!{target_username} 的 {crop_type} 生长了 {growth_increase} 秒,当前进度: {progress:.1f}%,{stamina_message}"
+ if target_lot["grow_time"] >= target_lot["max_grow_time"]:
+ message += ",作物已成熟!"
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "water_crop",
+ "success": True,
+ "message": message,
+ "updated_data": {
+ "money": current_player_data["money"],
+ "体力值": current_player_data["体力值"]
+ }
+ })
+
+#==========================浇水作物处理==========================
+
+
+
+#==========================施肥作物处理==========================
+ #处理施肥请求
+ def _handle_fertilize_crop(self, client_id, message):
+ """处理施肥作物请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "施肥作物", "fertilize_crop")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取当前操作用户的数据
+ current_player_data, current_username, response = self._load_player_data_with_check(client_id, "fertilize_crop")
+ if not current_player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+ target_username = message.get("target_username", "")
+
+ # 确定操作目标:如果有target_username就是访问模式,否则是自己的农场
+ if target_username and target_username != current_username:
+ # 访问模式:施肥别人的作物,但花自己的钱
+ target_player_data = self.load_player_data(target_username)
+ if not target_player_data:
+ return self._send_action_error(client_id, "fertilize_crop", f"无法找到玩家 {target_username} 的数据")
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(target_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "fertilize_crop", "无效的地块索引")
+
+ target_lot = target_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not target_lot.get("is_planted", False) or not target_lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "fertilize_crop", "此地块没有种植作物")
+
+ # 处理访问模式施肥
+ return self._process_visiting_fertilizing(client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index)
+ else:
+ # 正常模式:施肥自己的作物
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(current_player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "fertilize_crop", "无效的地块索引")
+
+ lot = current_player_data["farm_lots"][lot_index]
+
+ # 检查地块状态
+ if not lot.get("is_planted", False) or not lot.get("crop_type", ""):
+ return self._send_action_error(client_id, "fertilize_crop", "此地块没有种植作物")
+
+ # 处理正常施肥
+ return self._process_fertilizing(client_id, current_player_data, current_username, lot, lot_index)
+
+ #辅助函数-处理访问模式施肥逻辑
+ def _process_visiting_fertilizing(self, client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index):
+ """处理访问模式施肥逻辑(花自己的钱,效果作用在目标玩家作物上)"""
+ # 施肥费用和体力值消耗
+ fertilize_cost = 150
+ stamina_cost = 1
+
+ # 检查并更新当前玩家的体力值
+ self._check_and_update_stamina(current_player_data)
+
+ # 检查体力值是否足够
+ if not self._check_stamina_sufficient(current_player_data, stamina_cost):
+ return self._send_action_error(client_id, "fertilize_crop", f"体力值不足,帮助施肥需要 {stamina_cost} 点体力,当前体力:{current_player_data.get('体力值', 0)}")
+
+ # 检查当前玩家金钱是否足够
+ if current_player_data["money"] < fertilize_cost:
+ return self._send_action_error(client_id, "fertilize_crop", f"金钱不足,帮助施肥需要 {fertilize_cost} 金钱")
+
+ # 检查目标作物是否已死亡
+ if target_lot.get("is_dead", False):
+ return self._send_action_error(client_id, "fertilize_crop", "死亡的作物无法施肥")
+
+ # 检查是否已经成熟
+ if target_lot["grow_time"] >= target_lot["max_grow_time"]:
+ return self._send_action_error(client_id, "fertilize_crop", "作物已经成熟,无需施肥")
+
+ # 检查是否已经施过肥
+ if target_lot.get("已施肥", False):
+ return self._send_action_error(client_id, "fertilize_crop", "此作物已经施过肥了")
+
+ # 执行施肥操作:扣除当前玩家的钱
+ current_player_data["money"] -= fertilize_cost
+
+ # 消耗当前玩家的体力值
+ stamina_success, stamina_message = self._consume_stamina(current_player_data, stamina_cost, "帮助施肥")
+ if not stamina_success:
+ return self._send_action_error(client_id, "fertilize_crop", stamina_message)
+
+ # 标记目标作物已施肥,施肥效果会在作物生长更新时生效
+ target_lot["已施肥"] = True
+
+ # 记录施肥时间戳,用于计算10分钟的双倍生长效果
+ target_lot["施肥时间"] = time.time()
+
+ # 保存两个玩家的数据
+ self.save_player_data(current_username, current_player_data)
+ self.save_player_data(target_username, target_player_data)
+
+ # 向目标玩家推送作物更新(如果在线)
+ self._push_crop_update_to_player(target_username, target_player_data)
+
+ crop_type = target_lot.get("crop_type", "未知作物")
+
+ self.log('INFO', f"玩家 {current_username} 帮助玩家 {target_username} 给地块 {lot_index} 的 {crop_type} 施肥,花费 {fertilize_cost} 金钱", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "fertilize_crop",
+ "success": True,
+ "message": f"帮助施肥成功!{target_username} 的 {crop_type} 将在10分钟内以双倍速度生长,{stamina_message}",
+ "updated_data": {
+ "money": current_player_data["money"],
+ "体力值": current_player_data["体力值"]
+ }
+ })
+
+ #辅助函数-处理施肥逻辑
def _process_fertilizing(self, client_id, player_data, username, lot, lot_index):
"""处理施肥逻辑"""
- # 施肥费用
+ # 施肥费用和体力值消耗
fertilize_cost = 150
+ stamina_cost = 1
+
+ # 检查并更新体力值
+ self._check_and_update_stamina(player_data)
+
+ # 检查体力值是否足够
+ if not self._check_stamina_sufficient(player_data, stamina_cost):
+ return self._send_action_error(client_id, "fertilize_crop", f"体力值不足,施肥需要 {stamina_cost} 点体力,当前体力:{player_data.get('体力值', 0)}")
# 检查玩家金钱是否足够
if player_data["money"] < fertilize_cost:
@@ -1579,6 +1899,11 @@ class TCPGameServer(TCPServer):
# 执行施肥操作
player_data["money"] -= fertilize_cost
+ # 消耗体力值
+ stamina_success, stamina_message = self._consume_stamina(player_data, stamina_cost, "施肥")
+ if not stamina_success:
+ return self._send_action_error(client_id, "fertilize_crop", stamina_message)
+
# 标记已施肥,施肥效果会在作物生长更新时生效
lot["已施肥"] = True
@@ -1599,30 +1924,84 @@ class TCPGameServer(TCPServer):
"type": "action_response",
"action_type": "fertilize_crop",
"success": True,
- "message": f"施肥成功!{crop_type} 将在10分钟内以双倍速度生长",
+ "message": f"施肥成功!{crop_type} 将在10分钟内以双倍速度生长,{stamina_message}",
"updated_data": {
"money": player_data["money"],
+ "体力值": player_data["体力值"],
"farm_lots": player_data["farm_lots"]
}
})
+#==========================施肥作物处理==========================
+
+
+
+
+#==========================升级土地处理==========================
+ #处理升级土地请求
+ def _handle_upgrade_land(self, client_id, message):
+ """处理升级土地请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "升级土地", "upgrade_land")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "upgrade_land")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ lot_index = message.get("lot_index", -1)
+
+ # 验证地块索引
+ if lot_index < 0 or lot_index >= len(player_data.get("farm_lots", [])):
+ return self._send_action_error(client_id, "upgrade_land", "无效的地块索引")
+
+ lot = player_data["farm_lots"][lot_index]
+
+ # 检查地块是否已开垦
+ if not lot.get("is_diged", False):
+ return self._send_action_error(client_id, "upgrade_land", "此地块尚未开垦")
+
+ # 处理升级
+ return self._process_land_upgrade(client_id, player_data, username, lot, lot_index)
+
+ #辅助函数-处理土地升级逻辑
def _process_land_upgrade(self, client_id, player_data, username, lot, lot_index):
"""处理土地升级逻辑"""
- # 升级费用
- upgrade_cost = 1000
+ # 土地升级配置
+ upgrade_config = {
+ 0: {"cost": 1000, "name": "黄土地", "speed": 2.0}, # 0级->1级:1000元,2倍速
+ 1: {"cost": 2000, "name": "红土地", "speed": 4.0}, # 1级->2级:2000元,4倍速
+ 2: {"cost": 4000, "name": "紫土地", "speed": 6.0}, # 2级->3级:4000元,6倍速
+ 3: {"cost": 8000, "name": "黑土地", "speed": 10.0} # 3级->4级:8000元,10倍速
+ }
+
+ # 获取当前土地等级
+ current_level = lot.get("土地等级", 0)
+
+ # 检查是否已达到最高等级
+ if current_level >= 4:
+ return self._send_action_error(client_id, "upgrade_land", "此土地已达到最高等级(黑土地)")
+
+ # 检查升级配置是否存在
+ if current_level not in upgrade_config:
+ return self._send_action_error(client_id, "upgrade_land", f"土地等级数据异常,当前等级: {current_level}")
+
+ # 获取升级配置
+ config = upgrade_config[current_level]
+ upgrade_cost = config["cost"]
+ next_name = config["name"]
+ next_level = current_level + 1
+ speed_multiplier = config["speed"]
# 检查玩家金钱是否足够
if player_data["money"] < upgrade_cost:
- return self._send_action_error(client_id, "upgrade_land", f"金钱不足,升级土地需要 {upgrade_cost} 金钱")
-
- # 检查土地是否已经升级
- current_level = lot.get("土地等级", 0)
- if current_level >= 1:
- return self._send_action_error(client_id, "upgrade_land", "此土地已经升级过了")
+ return self._send_action_error(client_id, "upgrade_land", f"金钱不足,升级到{next_name}需要 {upgrade_cost} 金钱")
# 执行升级操作
player_data["money"] -= upgrade_cost
- lot["土地等级"] = 1 # 升级到1级,提供1.5倍生长速度
+ lot["土地等级"] = next_level
# 保存玩家数据
self.save_player_data(username, player_data)
@@ -1630,45 +2009,1685 @@ class TCPGameServer(TCPServer):
# 发送作物更新
self._push_crop_update_to_player(username, player_data)
- self.log('INFO', f"玩家 {username} 升级了地块 {lot_index},花费 {upgrade_cost} 金钱", 'SERVER')
+ self.log('INFO', f"玩家 {username} 将地块 {lot_index} 升级到{next_level}级{next_name},花费 {upgrade_cost} 金钱", 'SERVER')
return self.send_data(client_id, {
"type": "action_response",
"action_type": "upgrade_land",
"success": True,
- "message": f"土地升级成功!此地块的作物将永久以1.5倍速度生长",
+ "message": f"土地升级成功!升级到{next_level}级{next_name},作物将以{speed_multiplier}倍速度生长",
"updated_data": {
"money": player_data["money"],
"farm_lots": player_data["farm_lots"]
}
})
+#==========================升级土地处理==========================
-# 使用示例
+
+#==========================购买新地块处理==========================
+ #处理购买新地块请求
+ def _handle_buy_new_ground(self, client_id, message):
+ """处理购买新地块请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "购买新地块", "buy_new_ground")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "buy_new_ground")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 处理购买新地块
+ return self._process_buy_new_ground(client_id, player_data, username)
+
+ #辅助函数-处理购买新地块逻辑
+ def _process_buy_new_ground(self, client_id, player_data, username):
+ """处理购买新地块逻辑"""
+ # 购买新地块费用
+ new_ground_cost = 2000
+
+ # 检查玩家金钱是否足够
+ if player_data["money"] < new_ground_cost:
+ return self._send_action_error(client_id, "buy_new_ground", f"金钱不足,购买新地块需要 {new_ground_cost} 金钱")
+
+ # 检查地块数量限制
+ max_lots = 1000 # 最大地块数量限制
+ current_lots = len(player_data.get("farm_lots", []))
+ if current_lots >= max_lots:
+ return self._send_action_error(client_id, "buy_new_ground", f"已达到最大地块数量限制({max_lots}个)")
+
+ # 执行购买操作
+ player_data["money"] -= new_ground_cost
+
+ # 创建新的未开垦地块
+ new_lot = {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": False,
+ "is_diged": False, # 新购买的地块默认未开垦
+ "is_planted": False,
+ "max_grow_time": 5,
+ "已浇水": False,
+ "已施肥": False,
+ "土地等级": 0
+ }
+
+ # 添加到农场地块数组
+ if "farm_lots" not in player_data:
+ player_data["farm_lots"] = []
+ player_data["farm_lots"].append(new_lot)
+
+ # 保存玩家数据
+ self.save_player_data(username, player_data)
+
+ # 发送作物更新
+ self._push_crop_update_to_player(username, player_data)
+
+ new_lot_index = len(player_data["farm_lots"])
+ self.log('INFO', f"玩家 {username} 成功购买新地块,花费 {new_ground_cost} 金钱,新地块位置:{new_lot_index}", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": "buy_new_ground",
+ "success": True,
+ "message": f"购买新地块成功!花费 {new_ground_cost} 元,新地块位置:{new_lot_index}",
+ "updated_data": {
+ "money": player_data["money"],
+ "farm_lots": player_data["farm_lots"]
+ }
+ })
+
+#==========================购买新地块处理==========================
+
+
+
+#==========================点赞玩家处理==========================
+ #处理玩家点赞请求
+ def _handle_like_player(self, client_id, message):
+ """处理点赞请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "点赞玩家", "like_player")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "like_player")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ target_username = message.get("target_username", "")
+
+ if not target_username:
+ return self.send_data(client_id, {
+ "type": "like_player_response",
+ "success": False,
+ "message": "缺少目标用户名"
+ })
+
+ # 不能给自己点赞
+ if target_username == username:
+ return self.send_data(client_id, {
+ "type": "like_player_response",
+ "success": False,
+ "message": "不能给自己点赞"
+ })
+
+ # 检查今天是否已经给这个玩家点过赞
+ current_date = datetime.datetime.now().strftime("%Y-%m-%d")
+
+ # 初始化点赞记录
+ if "daily_likes" not in player_data:
+ player_data["daily_likes"] = {}
+
+ # 检查今天的点赞记录
+ if current_date not in player_data["daily_likes"]:
+ player_data["daily_likes"][current_date] = []
+
+ if target_username in player_data["daily_likes"][current_date]:
+ return self.send_data(client_id, {
+ "type": "like_player_response",
+ "success": False,
+ "message": f"今天已经给 {target_username} 点过赞了"
+ })
+
+ # 加载目标玩家数据
+ target_player_data = self.load_player_data(target_username)
+
+ if not target_player_data:
+ return self.send_data(client_id, {
+ "type": "like_player_response",
+ "success": False,
+ "message": f"无法找到玩家 {target_username} 的数据"
+ })
+
+ # 记录点赞
+ player_data["daily_likes"][current_date].append(target_username)
+
+ # 更新目标玩家的点赞数量
+ target_player_data["total_likes"] = target_player_data.get("total_likes", 0) + 1
+
+ # 保存两个玩家的数据
+ self.save_player_data(username, player_data)
+ self.save_player_data(target_username, target_player_data)
+
+ self.log('INFO', f"玩家 {username} 点赞了玩家 {target_username},目标玩家总赞数:{target_player_data['total_likes']}", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "like_player_response",
+ "success": True,
+ "message": f"成功点赞玩家 {target_username}!",
+ "target_likes": target_player_data["total_likes"]
+ })
+
+#==========================点赞玩家处理==========================
+
+
+
+#==========================在线玩家处理==========================
+ #处理请求在线玩家请求
+ def _handle_online_players_request(self, client_id, message):
+ """处理获取在线玩家数量的请求"""
+ online_players = len([cid for cid in self.user_data if self.user_data[cid].get("logged_in", False)])
+ return self.send_data(client_id, {
+ "type": "online_players_response",
+ "success": True,
+ "online_players": online_players
+ })
+
+#==========================在线玩家处理==========================
+
+
+
+#==========================玩家体力值处理==========================
+ #检查并更新体力值
+ def _check_and_update_stamina(self, player_data):
+ """检查并更新体力值(每小时恢复1点,每天重置)"""
+ import datetime
+
+ current_time = time.time()
+ current_date = datetime.datetime.now().strftime("%Y-%m-%d")
+
+ # 初始化体力值相关字段
+ if "体力值" not in player_data:
+ player_data["体力值"] = 20
+ if "体力上次刷新时间" not in player_data:
+ player_data["体力上次刷新时间"] = current_date
+ if "体力上次恢复时间" not in player_data:
+ player_data["体力上次恢复时间"] = current_time
+
+ # 检查是否需要每日重置
+ last_refresh_date = player_data.get("体力上次刷新时间", "")
+ if last_refresh_date != current_date:
+ # 新的一天,重置体力值
+ player_data["体力值"] = 20
+ player_data["体力上次刷新时间"] = current_date
+ player_data["体力上次恢复时间"] = current_time
+ return True # 发生了重置
+
+ # 检查每小时恢复
+ last_recovery_time = player_data.get("体力上次恢复时间", current_time)
+ time_diff = current_time - last_recovery_time
+
+ # 如果超过1小时(3600秒),恢复体力值
+ if time_diff >= 3600:
+ hours_passed = int(time_diff // 3600)
+ current_stamina = player_data.get("体力值", 0)
+
+ # 体力值恢复,但不能超过20
+ new_stamina = min(20, current_stamina + hours_passed)
+ if new_stamina > current_stamina:
+ player_data["体力值"] = new_stamina
+ player_data["体力上次恢复时间"] = current_time
+ return True # 发生了恢复
+
+ return False # 没有变化
+
+ #消耗体力值
+ def _consume_stamina(self, player_data, amount, action_name):
+ """消耗体力值"""
+ current_stamina = player_data.get("体力值", 20)
+
+ if current_stamina < amount:
+ return False, f"体力值不足!{action_name}需要 {amount} 点体力,当前体力:{current_stamina}"
+
+ player_data["体力值"] = current_stamina - amount
+ return True, f"消耗 {amount} 点体力,剩余体力:{player_data['体力值']}"
+
+ #检查体力值是否足够
+ def _check_stamina_sufficient(self, player_data, amount):
+ """检查体力值是否足够"""
+ current_stamina = player_data.get("体力值", 20)
+ return current_stamina >= amount
+
+#==========================玩家体力值处理==========================
+
+
+
+#==========================玩家游玩时间处理==========================
+ #处理获取玩家游玩时间请求
+ def _handle_get_play_time(self, client_id):
+ """处理获取游玩时间请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "获取游玩时间")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "play_time")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 计算当前会话的游玩时间
+ login_timestamp = self.user_data[client_id].get("login_timestamp", time.time())
+ current_session_seconds = int(time.time() - login_timestamp)
+
+ # 格式化当前会话时间
+ current_hours = current_session_seconds // 3600
+ current_minutes = (current_session_seconds % 3600) // 60
+ current_seconds = current_session_seconds % 60
+ current_session_time = f"{current_hours}时{current_minutes}分{current_seconds}秒"
+
+ # 获取最后登录时间和总游玩时间
+ last_login_time = player_data.get("last_login_time", "未知")
+ total_login_time = player_data.get("total_login_time", "0时0分0秒")
+
+ self.log('INFO', f"玩家 {username} 请求游玩时间统计", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "play_time_response",
+ "success": True,
+ "last_login_time": last_login_time,
+ "total_login_time": total_login_time,
+ "current_session_time": current_session_time
+ })
+
+ #处理更新游玩时间请求
+ def _handle_update_play_time(self, client_id):
+ """处理更新游玩时间请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "更新游玩时间", "update_time")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "update_time")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 计算当前会话的游玩时间
+ login_timestamp = self.user_data[client_id].get("login_timestamp", time.time())
+ play_time_seconds = int(time.time() - login_timestamp)
+
+ # 解析现有的总游玩时间
+ total_time_str = player_data.get("total_login_time", "0时0分0秒")
+ time_parts = re.match(r"(?:(\d+)时)?(?:(\d+)分)?(?:(\d+)秒)?", total_time_str)
+
+ if time_parts:
+ hours = int(time_parts.group(1) or 0)
+ minutes = int(time_parts.group(2) or 0)
+ seconds = int(time_parts.group(3) or 0)
+
+ # 计算新的总游玩时间
+ total_seconds = hours * 3600 + minutes * 60 + seconds + play_time_seconds
+ new_hours = total_seconds // 3600
+ new_minutes = (total_seconds % 3600) // 60
+ new_seconds = total_seconds % 60
+
+ # 更新总游玩时间
+ player_data["total_login_time"] = f"{new_hours}时{new_minutes}分{new_seconds}秒"
+
+ # 保存玩家数据
+ self.save_player_data(username, player_data)
+
+ # 重置登录时间戳,以便下次计算
+ self.user_data[client_id]["login_timestamp"] = time.time()
+
+ self.log('INFO', f"已更新玩家 {username} 的游玩时间,当前游玩时间: {play_time_seconds} 秒,总游玩时间: {player_data['total_login_time']}", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "update_time_response",
+ "success": True,
+ "message": "游玩时间已更新",
+ "total_login_time": player_data["total_login_time"]
+ })
+ else:
+ self.log('ERROR', f"解析玩家 {username} 的游玩时间失败", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "update_time_response",
+ "success": False,
+ "message": "更新游玩时间失败,格式错误"
+ })
+#==========================玩家游玩时间处理==========================
+
+
+
+#==========================玩家排行榜处理==========================
+ #处理获取玩家排行榜请求
+ def _handle_player_rankings_request(self, client_id):
+ """处理获取玩家排行榜的请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "获取玩家排行榜", "player_rankings")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取所有玩家存档文件
+ save_files = glob.glob(os.path.join("game_saves", "*.json"))
+ players_data = []
+
+ # 统计注册总人数
+ total_registered_players = len(save_files)
+
+ for save_file in save_files:
+ try:
+ # 从文件名提取账号ID
+ account_id = os.path.basename(save_file).split('.')[0]
+
+ # 加载玩家数据
+ with open(save_file, 'r', encoding='utf-8') as file:
+ player_data = json.load(file)
+
+ if player_data:
+ # 统计背包中的种子数量
+ seed_count = sum(item.get("count", 0) for item in player_data.get("player_bag", []))
+
+ # 检查玩家是否在线
+ is_online = any(
+ user_info.get("username") == account_id and user_info.get("logged_in", False)
+ for user_info in self.user_data.values()
+ )
+
+ # 获取所需的玩家信息
+ player_info = {
+ "user_name": player_data.get("user_name", account_id),
+ "player_name": player_data.get("player_name", player_data.get("user_name", account_id)),
+ "farm_name": player_data.get("farm_name", ""),
+ "level": player_data.get("level", 1),
+ "money": player_data.get("money", 0),
+ "experience": player_data.get("experience", 0),
+ "体力值": player_data.get("体力值", 20),
+ "seed_count": seed_count,
+ "last_login_time": player_data.get("last_login_time", "未知"),
+ "total_login_time": player_data.get("total_login_time", "0时0分0秒"),
+ "is_online": is_online
+ }
+
+ players_data.append(player_info)
+ except Exception as e:
+ self.log('ERROR', f"读取玩家 {account_id} 的数据时出错: {str(e)}", 'SERVER')
+
+ # 按等级降序排序
+ players_data.sort(key=lambda x: x["level"], reverse=True)
+
+ # 统计在线玩家数量
+ online_count = sum(1 for player in players_data if player.get("is_online", False))
+
+ self.log('INFO', f"玩家 {self.user_data[client_id].get('username')} 请求玩家排行榜,返回 {len(players_data)} 个玩家数据,注册总人数:{total_registered_players},在线人数:{online_count}", 'SERVER')
+
+ # 返回排行榜数据(包含注册总人数)
+ return self.send_data(client_id, {
+ "type": "player_rankings_response",
+ "success": True,
+ "players": players_data,
+ "total_registered_players": total_registered_players
+ })
+#==========================玩家排行榜处理==========================
+
+
+
+#==========================作物数据处理==========================
+ #处理客户端请求作物数据
+ def _handle_crop_data_request(self, client_id):
+ """处理客户端请求作物数据"""
+ crop_data = self._load_crop_data()
+
+ if crop_data:
+ self.log('INFO', f"向客户端 {client_id} 发送作物数据", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "crop_data_response",
+ "success": True,
+ "crop_data": crop_data
+ })
+ else:
+ return self.send_data(client_id, {
+ "type": "crop_data_response",
+ "success": False,
+ "message": "无法读取作物数据"
+ })
+#==========================作物数据处理==========================
+
+
+
+#==========================访问其他玩家农场处理==========================
+ #处理访问其他玩家农场的请求
+ def _handle_visit_player_request(self, client_id, message):
+ """处理访问其他玩家农场的请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "访问玩家农场", "visit_player")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ target_username = message.get("target_username", "")
+
+ if not target_username:
+ return self.send_data(client_id, {
+ "type": "visit_player_response",
+ "success": False,
+ "message": "缺少目标用户名"
+ })
+
+ # 加载目标玩家数据
+ target_player_data = self.load_player_data(target_username)
+
+ if not target_player_data:
+ return self.send_data(client_id, {
+ "type": "visit_player_response",
+ "success": False,
+ "message": f"无法找到玩家 {target_username} 的数据"
+ })
+
+ # 返回目标玩家的农场数据(只返回可见的数据,不包含敏感信息如密码)
+ safe_player_data = {
+ "user_name": target_player_data.get("user_name", target_username),
+ "player_name": target_player_data.get("player_name", target_username),
+ "farm_name": target_player_data.get("farm_name", ""),
+ "level": target_player_data.get("level", 1),
+ "money": target_player_data.get("money", 0),
+ "experience": target_player_data.get("experience", 0),
+ "体力值": target_player_data.get("体力值", 20),
+ "farm_lots": target_player_data.get("farm_lots", []),
+ "player_bag": target_player_data.get("player_bag", []),
+ "last_login_time": target_player_data.get("last_login_time", "未知"),
+ "total_login_time": target_player_data.get("total_login_time", "0时0分0秒"),
+ "total_likes": target_player_data.get("total_likes", 0)
+ }
+
+ current_username = self.user_data[client_id]["username"]
+ self.log('INFO', f"玩家 {current_username} 访问了玩家 {target_username} 的农场", 'SERVER')
+
+ # 记录玩家的访问状态
+ self.user_data[client_id]["visiting_mode"] = True
+ self.user_data[client_id]["visiting_target"] = target_username
+
+ return self.send_data(client_id, {
+ "type": "visit_player_response",
+ "success": True,
+ "message": f"成功获取玩家 {target_username} 的农场数据",
+ "player_data": safe_player_data,
+ "is_visiting": True
+ })
+#==========================访问其他玩家农场处理==========================
+
+
+
+
+#==========================返回自己农场处理==========================
+ #处理玩家返回自己农场的请求
+ def _handle_return_my_farm_request(self, client_id, message):
+ """处理玩家返回自己农场的请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "返回自己农场", "return_my_farm")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "return_my_farm")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 清除访问状态
+ self.user_data[client_id]["visiting_mode"] = False
+ self.user_data[client_id]["visiting_target"] = ""
+
+ self.log('INFO', f"玩家 {username} 返回了自己的农场", 'SERVER')
+
+ # 返回玩家自己的农场数据
+ return self.send_data(client_id, {
+ "type": "return_my_farm_response",
+ "success": True,
+ "message": "已返回自己的农场",
+ "player_data": {
+ "user_name": player_data.get("user_name", username),
+ "player_name": player_data.get("player_name", username),
+ "farm_name": player_data.get("farm_name", ""),
+ "level": player_data.get("level", 1),
+ "money": player_data.get("money", 0),
+ "experience": player_data.get("experience", 0),
+ "体力值": player_data.get("体力值", 20),
+ "farm_lots": player_data.get("farm_lots", []),
+ "player_bag": player_data.get("player_bag", []),
+ "total_likes": player_data.get("total_likes", 0)
+ },
+ "is_visiting": False
+ })
+#==========================返回自己农场处理==========================
+
+
+
+
+#==========================PING延迟检测处理==========================
+ #处理ping请求
+ def _handle_ping_request(self, client_id, message):
+ """处理客户端ping请求,立即返回pong响应"""
+ timestamp = message.get("timestamp", time.time())
+
+ # 立即返回pong响应
+ pong_response = {
+ "type": "pong",
+ "timestamp": timestamp,
+ "server_time": time.time()
+ }
+
+ return self.send_data(client_id, pong_response)
+
+#==========================PING延迟检测处理==========================
+
+
+
+#==========================聊天消息处理==========================
+ #处理聊天消息(暂未完成)
+ def _handle_chat_message(self, client_id, message):
+ """处理聊天消息"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "发送聊天消息")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ content = message.get("content", "")
+ if not content.strip():
+ return self.send_data(client_id, {
+ "type": "chat_response",
+ "success": False,
+ "message": "消息内容不能为空"
+ })
+
+ username = self.user_data[client_id]["username"]
+
+ # 广播聊天消息给所有在线用户
+ chat_message = {
+ "type": "chat_message",
+ "username": username,
+ "content": content,
+ "timestamp": time.time()
+ }
+
+ self.broadcast(chat_message)
+ self.log('INFO', f"用户 {username} 发送聊天消息: {content}", 'SERVER')
+
+ return True
+
+#==========================聊天消息处理==========================
+
+
+
+
+#==========================每日签到处理==========================
+ #处理每日签到请求
+ def _handle_daily_check_in_request(self, client_id, message):
+ """处理每日签到请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "每日签到", "daily_check_in")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "daily_check_in")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 检查今日是否已签到
+ current_date = datetime.datetime.now().strftime("%Y-%m-%d")
+ check_in_data = player_data.get("daily_check_in", {})
+
+ if current_date in check_in_data:
+ return self.send_data(client_id, {
+ "type": "daily_check_in_response",
+ "success": False,
+ "message": "今日已签到,请明日再来",
+ "has_checked_in": True
+ })
+
+ # 计算连续签到天数
+ consecutive_days = self._calculate_consecutive_check_in_days(check_in_data, current_date)
+
+ # 生成签到奖励
+ rewards = self._generate_check_in_rewards(consecutive_days)
+
+ # 发放奖励
+ self._apply_check_in_rewards(player_data, rewards)
+
+ # 保存签到记录
+ if "daily_check_in" not in player_data:
+ player_data["daily_check_in"] = {}
+
+ player_data["daily_check_in"][current_date] = {
+ "rewards": rewards,
+ "consecutive_days": consecutive_days,
+ "timestamp": time.time()
+ }
+
+ # 保存玩家数据
+ self.save_player_data(username, player_data)
+
+ self.log('INFO', f"玩家 {username} 完成每日签到,连续 {consecutive_days} 天,获得奖励: {rewards}", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "daily_check_in_response",
+ "success": True,
+ "message": f"签到成功!连续签到 {consecutive_days} 天",
+ "rewards": rewards,
+ "consecutive_days": consecutive_days,
+ "updated_data": {
+ "money": player_data["money"],
+ "experience": player_data["experience"],
+ "level": player_data["level"],
+ "player_bag": player_data.get("player_bag", [])
+ }
+ })
+
+ #处理客户端获取签到数据请求
+ def _handle_get_check_in_data_request(self, client_id, message):
+ """处理获取签到数据请求"""
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "获取签到数据", "get_check_in_data")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "get_check_in_data")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ current_date = datetime.datetime.now().strftime("%Y-%m-%d")
+ check_in_data = player_data.get("daily_check_in", {})
+
+ # 计算连续签到天数
+ consecutive_days = self._calculate_consecutive_check_in_days(check_in_data, current_date)
+
+ # 检查今日是否已签到
+ has_checked_in_today = current_date in check_in_data
+
+ return self.send_data(client_id, {
+ "type": "check_in_data_response",
+ "success": True,
+ "check_in_data": check_in_data,
+ "consecutive_days": consecutive_days,
+ "has_checked_in_today": has_checked_in_today,
+ "current_date": current_date
+ })
+
+ #计算连续签到天数
+ def _calculate_consecutive_check_in_days(self, check_in_data, current_date):
+ """计算连续签到天数"""
+ if not check_in_data:
+ return 0
+
+ # 获取所有签到日期并排序
+ sorted_dates = sorted(check_in_data.keys())
+ if not sorted_dates:
+ return 0
+
+ # 从最新日期开始向前计算连续天数
+ consecutive_days = 0
+ current_datetime = datetime.datetime.strptime(current_date, "%Y-%m-%d")
+
+ # 如果今天已经签到,从今天开始计算,否则从昨天开始
+ if current_date in check_in_data:
+ check_date = current_datetime
+ else:
+ check_date = current_datetime - datetime.timedelta(days=1)
+
+ # 向前查找连续签到天数
+ while True:
+ date_string = check_date.strftime("%Y-%m-%d")
+ if date_string in check_in_data:
+ consecutive_days += 1
+ check_date -= datetime.timedelta(days=1)
+ else:
+ break
+
+ # 限制最大连续天数为30天,避免过度奖励
+ if consecutive_days >= 30:
+ break
+
+ return consecutive_days
+
+ #生成签到奖励
+ def _generate_check_in_rewards(self, consecutive_days):
+ """生成签到奖励"""
+ import random
+
+ # 加载作物配置
+ crop_data = self._load_crop_data()
+
+ rewards = {}
+
+ # 基础奖励倍数(根据连续签到天数)
+ base_multiplier = 1.0 + (consecutive_days - 1) * 0.1 # 每连续签到一天增加10%
+ max_multiplier = 3.0 # 最大3倍奖励
+ multiplier = min(base_multiplier, max_multiplier)
+
+ # 钱币奖励 (基础200-500,受连续签到影响)
+ base_coins = random.randint(200, 500)
+ rewards["coins"] = int(base_coins * multiplier)
+
+ # 经验奖励 (基础50-120,受连续签到影响)
+ base_exp = random.randint(50, 120)
+ rewards["exp"] = int(base_exp * multiplier)
+
+ # 种子奖励 (根据连续签到天数获得更好的种子)
+ seeds = self._generate_check_in_seeds(consecutive_days, crop_data)
+ if seeds:
+ rewards["seeds"] = seeds
+
+ # 连续签到特殊奖励
+ if consecutive_days >= 3:
+ rewards["bonus_coins"] = int(100 * (consecutive_days // 3))
+
+ if consecutive_days >= 7:
+ rewards["bonus_exp"] = int(200 * (consecutive_days // 7))
+
+ return rewards
+
+ #生成签到种子奖励
+ def _generate_check_in_seeds(self, consecutive_days, crop_data):
+ """生成签到种子奖励"""
+ import random
+
+ seeds = []
+
+ # 根据连续签到天数确定种子类型和数量
+ if consecutive_days <= 2:
+ # 1-2天:普通种子
+ common_seeds = ["小麦", "胡萝卜", "土豆", "稻谷"]
+ elif consecutive_days <= 5:
+ # 3-5天:优良种子
+ common_seeds = ["玉米", "番茄", "洋葱", "大豆", "豌豆", "黄瓜", "大白菜"]
+ elif consecutive_days <= 10:
+ # 6-10天:稀有种子
+ common_seeds = ["草莓", "花椰菜", "柿子", "蓝莓", "树莓"]
+ elif consecutive_days <= 15:
+ # 11-15天:史诗种子
+ common_seeds = ["葡萄", "南瓜", "芦笋", "茄子", "向日葵", "蕨菜"]
+ else:
+ # 16天以上:传奇种子
+ common_seeds = ["西瓜", "甘蔗", "香草", "甜菜", "人参", "富贵竹", "芦荟", "哈密瓜"]
+
+ # 生成1-3个种子
+ seed_count = random.randint(1, min(3, len(common_seeds)))
+ selected_seeds = random.sample(common_seeds, seed_count)
+
+ for seed_name in selected_seeds:
+ if seed_name in crop_data:
+ # 根据种子等级确定数量
+ seed_level = crop_data[seed_name].get("等级", 1)
+ if seed_level <= 2:
+ quantity = random.randint(2, 5)
+ elif seed_level <= 4:
+ quantity = random.randint(1, 3)
+ else:
+ quantity = 1
+
+ seeds.append({
+ "name": seed_name,
+ "quantity": quantity,
+ "quality": crop_data[seed_name].get("品质", "普通")
+ })
+
+ return seeds
+
+ #应用签到奖励到玩家数据
+ def _apply_check_in_rewards(self, player_data, rewards):
+ """应用签到奖励到玩家数据"""
+ # 应用钱币奖励
+ if "coins" in rewards:
+ player_data["money"] = player_data.get("money", 0) + rewards["coins"]
+
+ if "bonus_coins" in rewards:
+ player_data["money"] = player_data.get("money", 0) + rewards["bonus_coins"]
+
+ # 应用经验奖励
+ if "exp" in rewards:
+ player_data["experience"] = player_data.get("experience", 0) + rewards["exp"]
+
+ if "bonus_exp" in rewards:
+ player_data["experience"] = player_data.get("experience", 0) + rewards["bonus_exp"]
+
+ # 检查升级
+ level_up_experience = 100 * player_data.get("level", 1)
+ while player_data.get("experience", 0) >= level_up_experience:
+ player_data["level"] = player_data.get("level", 1) + 1
+ player_data["experience"] -= level_up_experience
+ level_up_experience = 100 * player_data["level"]
+
+ # 应用种子奖励
+ if "seeds" in rewards:
+ if "player_bag" not in player_data:
+ player_data["player_bag"] = []
+
+ for seed_reward in rewards["seeds"]:
+ seed_name = seed_reward["name"]
+ quantity = seed_reward["quantity"]
+ quality = seed_reward["quality"]
+
+ # 查找背包中是否已有该种子
+ found = False
+ for item in player_data["player_bag"]:
+ if item.get("name") == seed_name:
+ item["count"] += quantity
+ found = True
+ break
+
+ # 如果背包中没有,添加新条目
+ if not found:
+ player_data["player_bag"].append({
+ "name": seed_name,
+ "quality": quality,
+ "count": quantity
+ })
+
+#==========================每日签到处理==========================
+
+
+
+
+#==========================新手大礼包处理==========================
+
+ #处理新手大礼包请求
+ def _handle_new_player_gift_request(self, client_id, message):
+ """处理新手大礼包请求"""
+ try:
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "领取新手大礼包", "new_player_gift")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "new_player_gift")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ # 检查是否已经领取过新手大礼包
+ if player_data.get("new_player_gift_claimed", False):
+ return self.send_data(client_id, {
+ "type": "new_player_gift_response",
+ "success": False,
+ "message": "新手大礼包已经领取过了"
+ })
+
+ # 新手大礼包内容
+ gift_contents = {
+ "coins": 6000,
+ "experience": 1000,
+ "seeds": [
+ {"name": "龙果", "quality": "传奇", "count": 1},
+ {"name": "杂交树1", "quality": "传奇", "count": 1},
+ {"name": "杂交树2", "quality": "传奇", "count": 1}
+ ]
+ }
+
+ # 应用奖励
+ self._apply_new_player_gift_rewards(player_data, gift_contents)
+
+ # 标记已领取
+ player_data["new_player_gift_claimed"] = True
+
+ # 记录领取时间
+ player_data["new_player_gift_time"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+ # 保存玩家数据
+ self.save_player_data(username, player_data)
+
+ self.log('INFO', f"玩家 {username} 成功领取新手大礼包", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "new_player_gift_response",
+ "success": True,
+ "message": "新手大礼包领取成功!获得6000金币、1000经验和3个传奇种子",
+ "gift_contents": gift_contents,
+ "updated_data": {
+ "money": player_data["money"],
+ "experience": player_data["experience"],
+ "level": player_data["level"],
+ "player_bag": player_data.get("player_bag", []),
+ "new_player_gift_claimed": True
+ }
+ })
+
+ except Exception as e:
+ # 捕获所有异常,防止服务器崩溃
+ self.log('ERROR', f"处理新手大礼包请求时出错: {str(e)}", 'SERVER')
+
+ # 尝试获取用户名
+ try:
+ username = self.user_data[client_id].get("username", "未知用户")
+ except:
+ username = "未知用户"
+
+ # 发送错误响应
+ return self.send_data(client_id, {
+ "type": "new_player_gift_response",
+ "success": False,
+ "message": "服务器处理新手大礼包时出现错误,请稍后重试"
+ })
+
+ #应用新手大礼包奖励到玩家数据
+ def _apply_new_player_gift_rewards(self, player_data, gift_contents):
+ """应用新手大礼包奖励到玩家数据"""
+ # 应用金币奖励
+ if "coins" in gift_contents:
+ player_data["money"] = player_data.get("money", 0) + gift_contents["coins"]
+
+ # 应用经验奖励
+ if "experience" in gift_contents:
+ player_data["experience"] = player_data.get("experience", 0) + gift_contents["experience"]
+
+ # 检查升级
+ level_up_experience = 100 * player_data.get("level", 1)
+ while player_data.get("experience", 0) >= level_up_experience:
+ player_data["level"] = player_data.get("level", 1) + 1
+ player_data["experience"] -= level_up_experience
+ level_up_experience = 100 * player_data["level"]
+
+ # 应用种子奖励
+ if "seeds" in gift_contents:
+ if "player_bag" not in player_data:
+ player_data["player_bag"] = []
+
+ for seed_reward in gift_contents["seeds"]:
+ seed_name = seed_reward["name"]
+ quantity = seed_reward["count"]
+ quality = seed_reward["quality"]
+
+ # 查找背包中是否已有该种子
+ found = False
+ for item in player_data["player_bag"]:
+ if item.get("name") == seed_name:
+ item["count"] += quantity
+ found = True
+ break
+
+ # 如果背包中没有,添加新条目
+ if not found:
+ player_data["player_bag"].append({
+ "name": seed_name,
+ "quality": quality,
+ "count": quantity
+ })
+
+#==========================新手大礼包处理==========================
+
+
+
+
+#==========================幸运抽奖处理==========================
+
+ #处理幸运抽奖请求
+ def _handle_lucky_draw_request(self, client_id, message):
+ """处理幸运抽奖请求"""
+ try:
+ # 检查用户是否已登录
+ logged_in, response = self._check_user_logged_in(client_id, "幸运抽奖", "lucky_draw")
+ if not logged_in:
+ return self.send_data(client_id, response)
+
+ # 获取玩家数据
+ player_data, username, response = self._load_player_data_with_check(client_id, "lucky_draw")
+ if not player_data:
+ return self.send_data(client_id, response)
+
+ draw_type = message.get("draw_type", "single") # single, five, ten
+ draw_count = 1
+ base_cost = 800 # 基础抽奖费用
+
+ # 计算抽奖费用和数量
+ if draw_type == "single":
+ draw_count = 1
+ total_cost = base_cost
+ elif draw_type == "five":
+ draw_count = 5
+ total_cost = int(base_cost * 5 * 0.9) # 五连抽九折
+ elif draw_type == "ten":
+ draw_count = 10
+ total_cost = int(base_cost * 10 * 0.8) # 十连抽八折
+ else:
+ self.log('WARNING', f"玩家 {username} 使用了无效的抽奖类型: {draw_type}", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "lucky_draw_response",
+ "success": False,
+ "message": "无效的抽奖类型"
+ })
+
+ # 检查玩家金钱是否足够
+ if player_data.get("money", 0) < total_cost:
+ self.log('WARNING', f"玩家 {username} 金币不足进行{draw_type}抽奖,需要{total_cost},当前{player_data.get('money', 0)}", 'SERVER')
+ return self.send_data(client_id, {
+ "type": "lucky_draw_response",
+ "success": False,
+ "message": f"金钱不足,{draw_type}抽奖需要 {total_cost} 金币"
+ })
+
+ # 扣除金钱
+ player_data["money"] -= total_cost
+
+ # 生成奖励
+ rewards = self._generate_lucky_draw_rewards(draw_count, draw_type)
+
+ # 验证奖励格式
+ for reward in rewards:
+ if not reward.get("rarity"):
+ reward["rarity"] = "普通"
+ self.log('WARNING', f"奖励缺少稀有度字段,已设置为普通: {reward}", 'SERVER')
+
+ # 应用奖励到玩家数据
+ self._apply_lucky_draw_rewards(player_data, rewards)
+
+ # 记录抽奖历史
+ if "lucky_draw_history" not in player_data:
+ player_data["lucky_draw_history"] = []
+
+ draw_record = {
+ "date": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+ "type": draw_type,
+ "cost": total_cost,
+ "rewards": rewards
+ }
+ player_data["lucky_draw_history"].append(draw_record)
+
+ # 只保留最近100次记录
+ if len(player_data["lucky_draw_history"]) > 100:
+ player_data["lucky_draw_history"] = player_data["lucky_draw_history"][-100:]
+
+ # 保存玩家数据
+ self.save_player_data(username, player_data)
+
+ self.log('INFO', f"玩家 {username} 进行{draw_type}抽奖,花费 {total_cost} 金币,获得 {len(rewards)} 个奖励", 'SERVER')
+
+ return self.send_data(client_id, {
+ "type": "lucky_draw_response",
+ "success": True,
+ "message": f"{draw_type}抽奖成功!",
+ "draw_type": draw_type,
+ "cost": total_cost,
+ "rewards": rewards,
+ "updated_data": {
+ "money": player_data["money"],
+ "experience": player_data["experience"],
+ "level": player_data["level"],
+ "player_bag": player_data.get("player_bag", [])
+ }
+ })
+
+ except Exception as e:
+ # 捕获所有异常,防止服务器崩溃
+ self.log('ERROR', f"处理玩家抽奖请求时出错: {str(e)}", 'SERVER')
+
+ # 尝试获取用户名
+ try:
+ username = self.user_data[client_id].get("username", "未知用户")
+ except:
+ username = "未知用户"
+
+ # 发送错误响应
+ return self.send_data(client_id, {
+ "type": "lucky_draw_response",
+ "success": False,
+ "message": "服务器处理抽奖时出现错误,请稍后重试"
+ })
+
+ #生成幸运抽奖奖励
+ def _generate_lucky_draw_rewards(self, count: int, draw_type: str):
+ """生成幸运抽奖奖励"""
+ import random
+
+ # 加载作物配置
+ crop_data = self._load_crop_data()
+
+ rewards = []
+
+ # 根据 crop_data.json 构建奖励池
+ common_seeds = []
+ good_seeds = []
+ rare_seeds = []
+ epic_seeds = []
+ legendary_seeds = []
+
+ for crop_name, crop_info in crop_data.items():
+ if not crop_info.get("能否购买", True):
+ continue # 跳过不能购买的作物
+
+ quality = crop_info.get("品质", "普通")
+ if quality == "普通":
+ common_seeds.append(crop_name)
+ elif quality == "优良":
+ good_seeds.append(crop_name)
+ elif quality == "稀有":
+ rare_seeds.append(crop_name)
+ elif quality == "史诗":
+ epic_seeds.append(crop_name)
+ elif quality == "传奇":
+ legendary_seeds.append(crop_name)
+
+ # 十连抽保底机制:至少一个稀有以上
+ guaranteed_rare = (draw_type == "ten")
+ rare_given = False
+
+ for i in range(count):
+ # 生成单个奖励
+ reward = self._generate_single_lucky_reward(
+ common_seeds, good_seeds, rare_seeds, epic_seeds, legendary_seeds,
+ guaranteed_rare and i == count - 1 and not rare_given
+ )
+
+ # 检查是否给出了稀有奖励(使用安全的方式访问)
+ reward_rarity = reward.get("rarity", "普通")
+ if reward_rarity in ["稀有", "史诗", "传奇"]:
+ rare_given = True
+
+ rewards.append(reward)
+
+ return rewards
+
+ #生成单个抽奖奖励
+ def _generate_single_lucky_reward(self, common_seeds, good_seeds, rare_seeds, epic_seeds, legendary_seeds, force_rare=False):
+ """生成单个幸运抽奖奖励"""
+ import random
+
+ # 概率配置
+ if force_rare:
+ # 强制稀有:33%稀有,33%史诗,34%传奇
+ rand = random.random()
+ if rand < 0.33:
+ reward_type = "rare"
+ elif rand < 0.66:
+ reward_type = "epic"
+ else:
+ reward_type = "legendary"
+ else:
+ # 正常概率:45%普通,25%优良,15%空奖,12%稀有,2.5%史诗,0.5%传奇
+ rand = random.random()
+ if rand < 0.45:
+ reward_type = "common"
+ elif rand < 0.70:
+ reward_type = "good"
+ elif rand < 0.85:
+ reward_type = "empty"
+ elif rand < 0.97:
+ reward_type = "rare"
+ elif rand < 0.995:
+ reward_type = "epic"
+ else:
+ reward_type = "legendary"
+
+ reward = {}
+
+ if reward_type == "empty":
+ # 谢谢惠顾
+ empty_messages = ["谢谢惠顾", "下次再来", "再试一次", "继续努力"]
+ reward = {
+ "type": "empty",
+ "name": random.choice(empty_messages),
+ "rarity": "空奖",
+ "amount": 0
+ }
+
+ elif reward_type == "common":
+ # 普通奖励:金币、经验或普通种子
+ reward_choice = random.choice(["coins", "exp", "seed"])
+ if reward_choice == "coins":
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "普通",
+ "amount": random.randint(100, 300)
+ }
+ elif reward_choice == "exp":
+ reward = {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": random.randint(50, 150)
+ }
+ else: # seed
+ if common_seeds:
+ seed_name = random.choice(common_seeds)
+ reward = {
+ "type": "seed",
+ "name": seed_name,
+ "rarity": "普通",
+ "amount": random.randint(2, 4)
+ }
+ else:
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "普通",
+ "amount": random.randint(100, 300)
+ }
+
+ elif reward_type == "good":
+ # 优良奖励:更多金币经验或优良种子
+ reward_choice = random.choice(["coins", "exp", "seed", "package"])
+ if reward_choice == "coins":
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "优良",
+ "amount": random.randint(300, 600)
+ }
+ elif reward_choice == "exp":
+ reward = {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "优良",
+ "amount": random.randint(150, 300)
+ }
+ elif reward_choice == "seed":
+ if good_seeds:
+ seed_name = random.choice(good_seeds)
+ reward = {
+ "type": "seed",
+ "name": seed_name,
+ "rarity": "优良",
+ "amount": random.randint(1, 3)
+ }
+ else:
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "优良",
+ "amount": random.randint(300, 600)
+ }
+ else: # package
+ reward = {
+ "type": "package",
+ "name": "成长套餐",
+ "rarity": "优良",
+ "amount": 1,
+ "contents": [
+ {"type": "coins", "amount": random.randint(200, 400)},
+ {"type": "exp", "amount": random.randint(100, 200)},
+ {"type": "seed", "name": random.choice(common_seeds) if common_seeds else "小麦", "amount": random.randint(2, 3)}
+ ]
+ }
+
+ elif reward_type == "rare":
+ # 稀有奖励
+ reward_choice = random.choice(["coins", "exp", "seed", "package"])
+ if reward_choice == "coins":
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "稀有",
+ "amount": random.randint(600, 1000)
+ }
+ elif reward_choice == "exp":
+ reward = {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "稀有",
+ "amount": random.randint(300, 500)
+ }
+ elif reward_choice == "seed":
+ if rare_seeds:
+ seed_name = random.choice(rare_seeds)
+ reward = {
+ "type": "seed",
+ "name": seed_name,
+ "rarity": "稀有",
+ "amount": random.randint(1, 2)
+ }
+ else:
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "稀有",
+ "amount": random.randint(600, 1000)
+ }
+ else: # package
+ reward = {
+ "type": "package",
+ "name": "稀有礼包",
+ "rarity": "稀有",
+ "amount": 1,
+ "contents": [
+ {"type": "coins", "amount": random.randint(400, 700)},
+ {"type": "exp", "amount": random.randint(200, 350)},
+ {"type": "seed", "name": random.choice(good_seeds) if good_seeds else "番茄", "amount": random.randint(2, 3)}
+ ]
+ }
+
+ elif reward_type == "epic":
+ # 史诗奖励
+ reward_choice = random.choice(["coins", "exp", "seed", "package"])
+ if reward_choice == "coins":
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "史诗",
+ "amount": random.randint(1000, 1500)
+ }
+ elif reward_choice == "exp":
+ reward = {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "史诗",
+ "amount": random.randint(500, 800)
+ }
+ elif reward_choice == "seed":
+ if epic_seeds:
+ seed_name = random.choice(epic_seeds)
+ reward = {
+ "type": "seed",
+ "name": seed_name,
+ "rarity": "史诗",
+ "amount": 1
+ }
+ else:
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "史诗",
+ "amount": random.randint(1000, 1500)
+ }
+ else: # package
+ reward = {
+ "type": "package",
+ "name": "史诗礼包",
+ "rarity": "史诗",
+ "amount": 1,
+ "contents": [
+ {"type": "coins", "amount": random.randint(700, 1200)},
+ {"type": "exp", "amount": random.randint(350, 600)},
+ {"type": "seed", "name": random.choice(rare_seeds) if rare_seeds else "草莓", "amount": random.randint(1, 2)}
+ ]
+ }
+
+ else: # legendary
+ # 传奇奖励
+ reward_choice = random.choice(["coins", "exp", "seed", "package"])
+ if reward_choice == "coins":
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "传奇",
+ "amount": random.randint(1500, 2500)
+ }
+ elif reward_choice == "exp":
+ reward = {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "传奇",
+ "amount": random.randint(800, 1200)
+ }
+ elif reward_choice == "seed":
+ if legendary_seeds:
+ seed_name = random.choice(legendary_seeds)
+ reward = {
+ "type": "seed",
+ "name": seed_name,
+ "rarity": "传奇",
+ "amount": 1
+ }
+ else:
+ reward = {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "传奇",
+ "amount": random.randint(1500, 2500)
+ }
+ else: # package
+ reward = {
+ "type": "package",
+ "name": "传奇大礼包",
+ "rarity": "传奇",
+ "amount": 1,
+ "contents": [
+ {"type": "coins", "amount": random.randint(1000, 2000)},
+ {"type": "exp", "amount": random.randint(600, 1000)},
+ {"type": "seed", "name": random.choice(epic_seeds) if epic_seeds else "葡萄", "amount": 1},
+ {"type": "seed", "name": random.choice(rare_seeds) if rare_seeds else "草莓", "amount": random.randint(2, 3)}
+ ]
+ }
+
+ # 确保所有奖励都有基本字段
+ if not reward.get("rarity"):
+ reward["rarity"] = "普通"
+ if not reward.get("amount"):
+ reward["amount"] = 0
+ if not reward.get("type"):
+ reward["type"] = "empty"
+ if not reward.get("name"):
+ reward["name"] = "未知奖励"
+
+ return reward
+
+ #应用幸运抽奖奖励到玩家数据
+ def _apply_lucky_draw_rewards(self, player_data, rewards):
+ """应用幸运抽奖奖励到玩家数据"""
+ for reward in rewards:
+ reward_type = reward.get("type", "empty")
+
+ if reward_type == "empty":
+ continue # 空奖励不处理
+
+ elif reward_type == "coins":
+ player_data["money"] = player_data.get("money", 0) + reward.get("amount", 0)
+
+ elif reward_type == "exp":
+ player_data["experience"] = player_data.get("experience", 0) + reward.get("amount", 0)
+
+ # 检查升级
+ level_up_experience = 100 * player_data.get("level", 1)
+ while player_data.get("experience", 0) >= level_up_experience:
+ player_data["level"] = player_data.get("level", 1) + 1
+ player_data["experience"] -= level_up_experience
+ level_up_experience = 100 * player_data["level"]
+
+ elif reward_type == "seed":
+ if "player_bag" not in player_data:
+ player_data["player_bag"] = []
+
+ # 查找背包中是否已有该种子
+ found = False
+ for item in player_data["player_bag"]:
+ if item.get("name") == reward.get("name", ""):
+ item["count"] += reward.get("amount", 0)
+ found = True
+ break
+
+ # 如果背包中没有,添加新条目
+ if not found:
+ player_data["player_bag"].append({
+ "name": reward.get("name", "未知种子"),
+ "quality": reward.get("rarity", "普通"),
+ "count": reward.get("amount", 0)
+ })
+
+ elif reward_type == "package":
+ # 递归处理礼包内容
+ contents = reward.get("contents", [])
+ if contents:
+ # 为礼包内容添加默认的rarity字段
+ for content in contents:
+ if not content.get("rarity"):
+ content["rarity"] = reward.get("rarity", "普通")
+
+ # 递归处理礼包内容
+ self._apply_lucky_draw_rewards(player_data, contents)
+
+#==========================幸运抽奖处理==========================
+
+
+
+
+#==========================发送游戏操作错误处理==========================
+ #发送游戏操作错误
+ def _send_action_error(self, client_id, action_type, message):
+ """发送游戏操作错误响应"""
+ return self.send_data(client_id, {
+ "type": "action_response",
+ "action_type": action_type,
+ "success": False,
+ "message": message
+ })
+#==========================发送游戏操作错误处理==========================
+
+
+
+
+#==========================缓存数据处理==========================
+ #清理过期的缓存数据
+ def cleanup_expired_cache(self):
+ """清理过期的缓存数据"""
+ current_time = time.time()
+ expired_players = []
+
+ for account_id, cache_data in self.active_players_cache.items():
+ if current_time - cache_data.get("last_access", 0) > self.cache_expire_time:
+ expired_players.append(account_id)
+
+ for account_id in expired_players:
+ # 如果是脏数据,先保存
+ if account_id in self.dirty_players:
+ self.save_player_data_immediate(account_id)
+ self.dirty_players.discard(account_id)
+
+ # 移除过期缓存
+ self.player_cache.pop(account_id, None)
+ self.active_players_cache.pop(account_id, None)
+
+ if expired_players:
+ self.log('INFO', f"清理了 {len(expired_players)} 个过期缓存", 'SERVER')
+
+ #批量保存脏数据到磁盘
+ def batch_save_dirty_players(self):
+ """批量保存脏数据到磁盘"""
+ if not self.dirty_players:
+ return
+
+ saved_count = 0
+ for account_id in list(self.dirty_players):
+ try:
+ if self.save_player_data_immediate(account_id):
+ saved_count += 1
+ except Exception as e:
+ self.log('ERROR', f"保存玩家 {account_id} 数据时出错: {str(e)}", 'SERVER')
+
+ self.dirty_players.clear()
+ self.last_save_time = time.time()
+
+ if saved_count > 0:
+ self.log('INFO', f"批量保存了 {saved_count} 个玩家的数据", 'SERVER')
+
+ #强制保存所有缓存数据
+ def force_save_all_data(self):
+ """强制保存所有缓存数据(用于服务器关闭时)"""
+ saved_count = 0
+ for account_id in list(self.player_cache.keys()):
+ try:
+ if self.save_player_data_immediate(account_id):
+ saved_count += 1
+ except Exception as e:
+ self.log('ERROR', f"强制保存玩家 {account_id} 数据时出错: {str(e)}", 'SERVER')
+
+ self.dirty_players.clear()
+ self.log('INFO', f"强制保存完成,保存了 {saved_count} 个玩家的数据", 'SERVER')
+ return saved_count
+
+ #优化缓存大小,移除不活跃的数据
+ def optimize_cache_size(self):
+ """优化缓存大小,移除不活跃的数据"""
+ current_time = time.time()
+ removed_count = 0
+
+ # 如果缓存过大,移除最不活跃的数据
+ if len(self.player_cache) > 1000: # 缓存超过1000个玩家时进行清理
+ sorted_players = sorted(
+ self.active_players_cache.items(),
+ key=lambda x: x[1].get("last_access", 0)
+ )
+
+ # 移除最不活跃的50%
+ remove_count = len(sorted_players) // 2
+ for account_id, _ in sorted_players[:remove_count]:
+ if account_id in self.dirty_players:
+ self.save_player_data_immediate(account_id)
+ self.dirty_players.discard(account_id)
+
+ self.player_cache.pop(account_id, None)
+ self.active_players_cache.pop(account_id, None)
+ removed_count += 1
+
+ if removed_count > 0:
+ self.log('INFO', f"缓存优化:移除了 {removed_count} 个不活跃的缓存数据", 'SERVER')
+
+ return removed_count
+
+ #获取缓存命中信息(用于调试)
+ def get_cache_hit_info(self, account_id):
+ """获取缓存命中信息(用于调试)"""
+ return {
+ "in_memory_cache": account_id in self.player_cache,
+ "in_active_cache": account_id in self.active_players_cache,
+ "is_dirty": account_id in self.dirty_players,
+ "last_access": self.active_players_cache.get(account_id, {}).get("last_access", 0)
+ }
+
+#==========================缓存数据处理==========================
+
+# 主程序启动入口
if __name__ == "__main__":
import sys
try:
- print(f"萌芽农场游戏服务器 v{server_version}")
- print(f"服务器地址: {server_host}:{server_port}")
- print("=" * 50)
+ print("=" * 60)
+ print(f"🌱 萌芽农场游戏服务器 v{server_version} 🌱")
+ print("=" * 60)
+ print(f"📡 服务器地址: {server_host}:{server_port}")
+ print(f"📦 缓冲区大小: {buffer_size} bytes")
+ print(f"🔧 性能优化: 已启用")
+ print("=" * 60)
- # 创建自定义服务器
+ # 创建并启动游戏服务器
server = TCPGameServer()
- # 以阻塞方式启动服务器
+ # 在后台线程中启动服务器
server_thread = threading.Thread(target=server.start)
server_thread.daemon = True
server_thread.start()
- print("服务器已启动,按 Ctrl+C 停止服务器")
+ print("✅ 服务器启动成功!")
+ print("📋 功能列表:")
+ print(" ├── 用户注册/登录系统")
+ print(" ├── 作物种植与收获")
+ print(" ├── 浇水与施肥系统")
+ print(" ├── 每日签到奖励")
+ print(" ├── 幸运抽奖系统")
+ print(" ├── 玩家互动功能")
+ print(" └── 性能优化缓存")
+ print("=" * 60)
+ print("🔥 服务器运行中... 按 Ctrl+C 停止服务器")
+ print("=" * 60)
- # 运行直到按Ctrl+C
+ # 主循环:保持服务器运行
while True:
time.sleep(1)
except KeyboardInterrupt:
- print("\n程序被用户中断")
+ print("\n" + "=" * 60)
+ print("⚠️ 程序被用户中断")
+ print("💾 正在保存数据并关闭服务器...")
+
if 'server' in locals():
server.stop()
- sys.exit(0)
\ No newline at end of file
+
+ print("✅ 服务器已安全关闭")
+ print("👋 感谢使用萌芽农场服务器!")
+ print("=" * 60)
+ sys.exit(0)
+ except Exception as e:
+ print(f"\n❌ 服务器启动失败: {str(e)}")
+ print("🔧 请检查配置并重试")
+ sys.exit(1)
\ No newline at end of file
diff --git a/Server/__pycache__/CropSystem.cpython-313.pyc b/Server/__pycache__/CropSystem.cpython-313.pyc
new file mode 100644
index 0000000..dc2adc4
Binary files /dev/null and b/Server/__pycache__/CropSystem.cpython-313.pyc differ
diff --git a/Server/__pycache__/DataManager.cpython-313.pyc b/Server/__pycache__/DataManager.cpython-313.pyc
new file mode 100644
index 0000000..bb01c17
Binary files /dev/null and b/Server/__pycache__/DataManager.cpython-313.pyc differ
diff --git a/Server/__pycache__/QQEmailSend.cpython-313.pyc b/Server/__pycache__/QQEmailSend.cpython-313.pyc
index 0113ea2..7941ca8 100644
Binary files a/Server/__pycache__/QQEmailSend.cpython-313.pyc and b/Server/__pycache__/QQEmailSend.cpython-313.pyc differ
diff --git a/Server/__pycache__/TCPGameServer_New.cpython-313.pyc b/Server/__pycache__/TCPGameServer_New.cpython-313.pyc
new file mode 100644
index 0000000..1cc9b8e
Binary files /dev/null and b/Server/__pycache__/TCPGameServer_New.cpython-313.pyc differ
diff --git a/Server/__pycache__/TCPServer.cpython-313.pyc b/Server/__pycache__/TCPServer.cpython-313.pyc
index bb004a5..c215b84 100644
Binary files a/Server/__pycache__/TCPServer.cpython-313.pyc and b/Server/__pycache__/TCPServer.cpython-313.pyc differ
diff --git a/Server/__pycache__/UserAuth.cpython-313.pyc b/Server/__pycache__/UserAuth.cpython-313.pyc
new file mode 100644
index 0000000..17305d1
Binary files /dev/null and b/Server/__pycache__/UserAuth.cpython-313.pyc differ
diff --git a/Server/config/crop_data.json b/Server/config/crop_data.json
index b6fe0a0..feed37a 100644
--- a/Server/config/crop_data.json
+++ b/Server/config/crop_data.json
@@ -1,28 +1,78 @@
{
- "测试作物": {"花费": 1, "生长时间": 3, "收益": 9999, "品质": "普通", "描述": "测试作物", "耐候性": 10, "等级": 1, "经验": 999},
- "小麦": {"花费": 120, "生长时间": 120, "收益": 100, "品质": "普通", "描述": "基础作物,品质较低,适合新手种植", "耐候性": 10, "等级": 1, "经验": 10},
- "稻谷": {"花费": 100, "生长时间": 240, "收益": 120, "品质": "普通", "描述": "适合大规模种植的基础作物", "耐候性": 10, "等级": 1, "经验": 10},
- "玉米": {"花费": 70, "生长时间": 600, "收益": 90, "品质": "普通", "描述": "营养丰富的优良作物,适合稍有经验的玩家", "耐候性": 15, "等级": 2, "经验": 15},
- "土豆": {"花费": 75, "生长时间": 360, "收益": 90, "品质": "普通", "描述": "容易种植的耐寒作物", "耐候性": 12, "等级": 1, "经验": 10},
- "胡萝卜": {"花费": 60, "生长时间": 480, "收益": 80, "品质": "普通", "描述": "适合新手的健康作物", "耐候性": 12, "等级": 1, "经验": 10},
- "草莓": {"花费": 120, "生长时间": 960, "收益": 150, "品质": "优良", "描述": "营养丰富的果实,收益不错", "耐候性": 14, "等级": 2, "经验": 20},
- "番茄": {"花费": 100, "生长时间": 720, "收益": 130, "品质": "优良", "描述": "常见作物,适合小规模种植", "耐候性": 12, "等级": 2, "经验": 15},
- "大豆": {"花费": 90, "生长时间": 840, "收益": 110, "品质": "优良", "描述": "富含蛋白质的基础作物", "耐候性": 11, "等级": 2, "经验": 12},
- "蓝莓": {"花费": 150, "生长时间": 1200, "收益": 200, "品质": "稀有", "描述": "较为稀有的作物,市场价值较高", "耐候性": 18, "等级": 3, "经验": 25},
- "洋葱": {"花费": 85, "生长时间": 600, "收益": 105, "品质": "稀有", "描述": "烹饪常用的作物,适合中级种植", "耐候性": 10, "等级": 2, "经验": 10},
- "南瓜": {"花费": 180, "生长时间": 1440, "收益": 250, "品质": "稀有", "描述": "秋季收获的高收益作物", "耐候性": 20, "等级": 4, "经验": 30},
- "葡萄": {"花费": 200, "生长时间": 1200, "收益": 300, "品质": "稀有", "描述": "需要特殊管理的高收益作物", "耐候性": 15, "等级": 4, "经验": 35},
- "柿子": {"花费": 160, "生长时间": 1080, "收益": 240, "品质": "稀有", "描述": "富含营养的秋季作物", "耐候性": 18, "等级": 3, "经验": 28},
- "花椰菜": {"花费": 130, "生长时间": 960, "收益": 170, "品质": "稀有", "描述": "耐寒的高品质作物,适合经验丰富的玩家", "耐候性": 17, "等级": 3, "经验": 22},
- "芦笋": {"花费": 200, "生长时间": 1560, "收益": 280, "品质": "稀有", "描述": "市场需求量高的稀有作物", "耐候性": 15, "等级": 4, "经验": 30},
- "香草": {"花费": 250, "生长时间": 1800, "收益": 400, "品质": "史诗", "描述": "非常稀有且收益极高的作物", "耐候性": 22, "等级": 5, "经验": 40},
- "西瓜": {"花费": 240, "生长时间": 2400, "收益": 420, "品质": "史诗", "描述": "夏季丰产的高价值作物", "耐候性": 21, "等级": 5, "经验": 45},
- "甜菜": {"花费": 220, "生长时间": 2160, "收益": 350, "品质": "史诗", "描述": "营养丰富的根茎作物,收益较高", "耐候性": 20, "等级": 5, "经验": 38},
- "甘蔗": {"花费": 260, "生长时间": 3000, "收益": 450, "品质": "史诗", "描述": "需要充足水源的高价值作物", "耐候性": 18, "等级": 5, "经验": 50},
- "龙果": {"花费": 400, "生长时间": 4800, "收益": 600, "品质": "传奇", "描述": "极为稀有的热带作物,产量和价值都极高", "耐候性": 25, "等级": 6, "经验": 60},
- "松露": {"花费": 500, "生长时间": 7200, "收益": 700, "品质": "传奇", "描述": "极其珍贵的地下作物,市场价格极高", "耐候性": 23, "等级": 7, "经验": 80},
- "人参": {"花费": 450, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "需要耐心等待的珍贵药材", "耐候性": 22, "等级": 6, "经验": 75},
- "富贵竹": {"花费": 450, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "需要耐心等待的珍贵药材", "耐候性": 22, "等级": 6, "经验": 75},
- "芦荟": {"花费": 450, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "需要耐心等待的珍贵药材", "耐候性": 22, "等级": 6, "经验": 75},
- "金橘": {"花费": 420, "生长时间": 4800, "收益": 620, "品质": "传奇", "描述": "少见的耐寒果树,市场需求量极大", "耐候性": 26, "等级": 7, "经验": 70}
+ "测试作物": {"花费": 1, "生长时间": 5, "收益": 10000, "品质": "普通", "描述": "仅供测试使用的特殊作物", "耐候性": 10, "等级": 1, "经验": 999, "能否购买": false},
+
+
+ "小麦": {"花费": 50, "生长时间": 300, "收益": 75, "品质": "普通", "描述": "最基础的粮食作物,生长快速,适合新手练习", "耐候性": 8, "等级": 1, "经验": 8, "能否购买": true},
+ "胡萝卜": {"花费": 40, "生长时间": 240, "收益": 65, "品质": "普通", "描述": "营养丰富的根茎类蔬菜,容易种植", "耐候性": 9, "等级": 1, "经验": 7, "能否购买": true},
+ "土豆": {"花费": 60, "生长时间": 480, "收益": 95, "品质": "普通", "描述": "耐寒的块茎作物,产量稳定", "耐候性": 12, "等级": 1, "经验": 10, "能否购买": true},
+ "稻谷": {"花费": 70, "生长时间": 600, "收益": 110, "品质": "普通", "描述": "重要的主粮作物,需要充足水分", "耐候性": 7, "等级": 1, "经验": 12, "能否购买": true},
+
+
+ "玉米": {"花费": 80, "生长时间": 900, "收益": 130, "品质": "优良", "描述": "高产的谷物作物,营养价值高", "耐候性": 10, "等级": 2, "经验": 15, "能否购买": true},
+ "番茄": {"花费": 90, "生长时间": 720, "收益": 140, "品质": "优良", "描述": "多汁的果实,市场需求大", "耐候性": 8, "等级": 2, "经验": 16, "能否购买": true},
+ "洋葱": {"花费": 75, "生长时间": 840, "收益": 125, "品质": "优良", "描述": "调味蔬菜,储存时间长", "耐候性": 11, "等级": 2, "经验": 14, "能否购买": true},
+ "大豆": {"花费": 85, "生长时间": 1080, "收益": 145, "品质": "优良", "描述": "富含蛋白质的豆类作物", "耐候性": 9, "等级": 2, "经验": 18, "能否购买": true},
+
+
+ "草莓": {"花费": 120, "生长时间": 1440, "收益": 200, "品质": "稀有", "描述": "甜美的浆果,深受喜爱", "耐候性": 6, "等级": 3, "经验": 22, "能否购买": true},
+ "花椰菜": {"花费": 110, "生长时间": 1320, "收益": 185, "品质": "稀有", "描述": "营养丰富的十字花科蔬菜", "耐候性": 8, "等级": 3, "经验": 20, "能否购买": true},
+ "柿子": {"花费": 140, "生长时间": 1800, "收益": 230, "品质": "稀有", "描述": "秋季成熟的甜美果实", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "蓝莓": {"花费": 160, "生长时间": 2100, "收益": 260, "品质": "稀有", "描述": "抗氧化的超级食物", "耐候性": 7, "等级": 3, "经验": 28, "能否购买": true},
+ "栀子花": {"花费": 180, "生长时间": 2400, "收益": 300, "品质": "稀有", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "玫瑰花": {"花费": 190, "生长时间": 2520, "收益": 310, "品质": "稀有", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "菠萝": {"花费": 200, "生长时间": 2700, "收益": 340, "品质": "稀有", "描述": "热带水果之王", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "梨树": {"花费": 210, "生长时间": 2820, "收益": 350, "品质": "稀有", "描述": "春季开花的落叶果树", "耐候性": 10, "等级": 3, "经验": 25, "能否购买": true},
+ "桃树": {"花费": 220, "生长时间": 2940, "收益": 360, "品质": "稀有", "描述": "粉色花海中的果实树种", "耐候性": 9, "等级": 3, "经验": 25, "能否购买": true},
+ "荔枝": {"花费": 230, "生长时间": 3060, "收益": 380, "品质": "稀有", "描述": "亚热带珍稀水果,果肉如凝脂", "耐候性": 8, "等级": 3, "经验": 26, "能否购买": true},
+ "芒果树": {"花费": 240, "生长时间": 3180, "收益": 400, "品质": "稀有", "描述": "热带阳光孕育的香甜果实", "耐候性": 10, "等级": 3, "经验": 27, "能否购买": true},
+ "糖果树": {"花费": 250, "生长时间": 3300, "收益": 420, "品质": "稀有", "描述": "传说中结出彩色糖果的魔法树", "耐候性": 7, "等级": 3, "经验": 25, "能否购买": true},
+ "面包树": {"花费": 260, "生长时间": 3420, "收益": 440, "品质": "稀有", "描述": "热带地区的淀粉质主食树种", "耐候性": 9, "等级": 3, "经验": 25, "能否购买": true},
+ "幸运草": {"花费": 150, "生长时间": 1560, "收益": 220, "品质": "稀有", "描述": "四片叶子的幸运象征植物", "耐候性": 6, "等级": 3, "经验": 20, "能否购买": true},
+ "幸运花": {"花费": 170, "生长时间": 1680, "收益": 240, "品质": "稀有", "描述": "绽放时带来好运的神秘花卉", "耐候性": 7, "等级": 3, "经验": 22, "能否购买": true},
+ "摇钱树": {"花费": 300, "生长时间": 3600, "收益": 500, "品质": "稀有", "描述": "传说中能结出金币的神树", "耐候性": 10, "等级": 3, "经验": 30, "能否购买": true},
+
+ "葡萄": {"花费": 200, "生长时间": 2700, "收益": 340, "品质": "史诗", "描述": "用于酿酒的珍贵果实", "耐候性": 9, "等级": 4, "经验": 35, "能否购买": true},
+ "南瓜": {"花费": 180, "生长时间": 3600, "收益": 320, "品质": "史诗", "描述": "大型瓜果,节庆装饰的首选", "耐候性": 12, "等级": 4, "经验": 38, "能否购买": true},
+ "芦笋": {"花费": 220, "生长时间": 3000, "收益": 370, "品质": "史诗", "描述": "高档蔬菜,营养价值极高", "耐候性": 8, "等级": 4, "经验": 40, "能否购买": true},
+ "茄子": {"花费": 190, "生长时间": 2400, "收益": 310, "品质": "史诗", "描述": "紫色的营养蔬菜", "耐候性": 10, "等级": 4, "经验": 32, "能否购买": true},
+
+
+ "西瓜": {"花费": 250, "生长时间": 4800, "收益": 450, "品质": "优良", "描述": "夏日消暑的大型水果", "耐候性": 6, "等级": 5, "经验": 50, "能否购买": true},
+ "甘蔗": {"花费": 280, "生长时间": 5400, "收益": 500, "品质": "优良", "描述": "制糖的重要原料", "耐候性": 5, "等级": 5, "经验": 55, "能否购买": true},
+ "香草": {"花费": 300, "生长时间": 6000, "收益": 550, "品质": "优良", "描述": "珍贵的调料植物", "耐候性": 7, "等级": 5, "经验": 60, "能否购买": true},
+ "甜菜": {"花费": 240, "生长时间": 4200, "收益": 420, "品质": "优良", "描述": "制糖的另一种选择", "耐候性": 11, "等级": 5, "经验": 45, "能否购买": true},
+ "百合花": {"花费": 260, "生长时间": 4800, "收益": 480, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+ "康乃馨": {"花费": 270, "生长时间": 5100, "收益": 510, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+ "郁金香": {"花费": 280, "生长时间": 5100, "收益": 510, "品质": "优良", "描述": "美丽的观赏植物", "耐候性": 10, "等级": 5, "经验": 50, "能否购买": true},
+
+
+ "人参": {"花费": 400, "生长时间": 7200, "收益": 720, "品质": "传奇", "描述": "珍贵的药用植物,需要耐心培养", "耐候性": 15, "等级": 6, "经验": 80, "能否购买": true},
+ "富贵竹": {"花费": 350, "生长时间": 6600, "收益": 650, "品质": "传奇", "描述": "寓意吉祥的观赏植物", "耐候性": 12, "等级": 6, "经验": 75, "能否购买": true},
+ "芦荟": {"花费": 320, "生长时间": 6000, "收益": 600, "品质": "传奇", "描述": "具有药用价值的多肉植物", "耐候性": 18, "等级": 6, "经验": 70, "能否购买": true},
+ "哈密瓜": {"花费": 380, "生长时间": 7800, "收益": 700, "品质": "传奇", "描述": "甘甜的高级水果", "耐候性": 8, "等级": 6, "经验": 85, "能否购买": true},
+
+
+ "金橘": {"花费": 500, "生长时间": 10800, "收益": 900, "品质": "传奇", "描述": "金黄色的珍贵柑橘", "耐候性": 10, "等级": 7, "经验": 120, "能否购买": true},
+ "苹果树": {"花费": 450, "生长时间": 9600, "收益": 820, "品质": "传奇", "描述": "结果丰富的果树", "耐候性": 14, "等级": 7, "经验": 110, "能否购买": true},
+ "橘子树": {"花费": 480, "生长时间": 10200, "收益": 850, "品质": "传奇", "描述": "维生素C丰富的果树", "耐候性": 12, "等级": 7, "经验": 115, "能否购买": true},
+ "香蕉树": {"花费": 420, "生长时间": 8400, "收益": 780, "品质": "传奇", "描述": "热带水果之王", "耐候性": 5, "等级": 7, "经验": 100, "能否购买": true},
+
+
+ "向日葵": {"花费": 160, "生长时间": 3600, "收益": 280, "品质": "史诗", "描述": "向阳而生的美丽花朵", "耐候性": 13, "等级": 4, "经验": 35, "能否购买": true},
+ "树莓": {"花费": 140, "生长时间": 2700, "收益": 240, "品质": "稀有", "描述": "小巧精致的浆果", "耐候性": 9, "等级": 3, "经验": 30, "能否购买": true},
+ "豌豆": {"花费": 65, "生长时间": 720, "收益": 110, "品质": "优良", "描述": "嫩绿的豆荚蔬菜", "耐候性": 10, "等级": 2, "经验": 15, "能否购买": true},
+ "黄瓜": {"花费": 85, "生长时间": 1200, "收益": 150, "品质": "优良", "描述": "清脆爽口的瓜类", "耐候性": 8, "等级": 2, "经验": 18, "能否购买": true},
+ "大白菜": {"花费": 70, "生长时间": 900, "收益": 120, "品质": "优良", "描述": "北方冬季的主要蔬菜", "耐候性": 15, "等级": 2, "经验": 16, "能否购买": true},
+ "蕨菜": {"花费": 180, "生长时间": 2400, "收益": 300, "品质": "史诗", "描述": "野生山菜,口感独特", "耐候性": 16, "等级": 4, "经验": 35, "能否购买": true},
+
+
+ "龙果": {"花费": 800, "生长时间": 14400, "收益": 1500, "品质": "传奇", "描述": "传说中的神秘果实,蕴含强大能量", "耐候性": 25, "等级": 8, "经验": 200, "能否购买": true},
+ "松露": {"花费": 1000, "生长时间": 18000, "收益": 2000, "品质": "传奇", "描述": "地下的黑金,顶级料理的灵魂", "耐候性": 20, "等级": 8, "经验": 250, "能否购买": true},
+ "冬虫夏草": {"花费": 600, "生长时间": 12000, "收益": 1200, "品质": "传奇", "描述": "稀世珍宝,药王之称", "耐候性": 30, "等级": 7, "经验": 180, "能否购买": true},
+ "山葵": {"花费": 500, "生长时间": 10800, "收益": 1000, "品质": "优良", "描述": "日式料理的珍贵调料", "耐候性": 22, "等级": 7, "经验": 150, "能否购买": true},
+ "鱼腥草": {"花费": 300, "生长时间": 7200, "收益": 600, "品质": "稀有", "描述": "具有特殊药用价值的野菜", "耐候性": 18, "等级": 6, "经验": 90, "能否购买": true},
+
+
+ "杂交树1": {"花费": 1200, "生长时间": 21600, "收益": 2500, "品质": "传奇", "描述": "初中生物书最后的想象", "耐候性": 35, "等级": 9, "经验": 300, "能否购买": true},
+ "杂交树2": {"花费": 1500, "生长时间": 25200, "收益": 3000, "品质": "传奇", "描述": "初中生物书最后的想象", "耐候性": 40, "等级": 10, "经验": 400, "能否购买": true}
}
\ No newline at end of file
diff --git a/Server/config/initial_player_data_template.json b/Server/config/initial_player_data_template.json
index 11233ca..5e21eb0 100644
--- a/Server/config/initial_player_data_template.json
+++ b/Server/config/initial_player_data_template.json
@@ -2,6 +2,9 @@
"experience": 0,
"level": 1,
"money": 1000,
+ "体力值": 20,
+ "体力上次刷新时间": "",
+ "体力上次恢复时间": 0,
"farm_name": "农场",
"user_name": "shumengya",
"player_name": "玩家昵称",
diff --git a/Server/deployment_guide.md b/Server/deployment_guide.md
deleted file mode 100644
index e1f2676..0000000
--- a/Server/deployment_guide.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# 萌芽农场游戏服务器部署指南
-
-## 系统要求
-- Python 3.7 或更高版本
-- 稳定的互联网连接
-- 建议:2GB+ 内存,足够的磁盘空间存储玩家数据
-
-## 安装步骤
-
-### 1. 准备环境
-```bash
-# 在服务器上创建项目文件夹
-mkdir MengYaFarm
-cd MengYaFarm
-
-# 克隆或上传服务器代码到此文件夹
-# (手动上传文件或使用Git)
-```
-
-### 2. 安装依赖
-```bash
-# 创建虚拟环境(推荐)
-python -m venv venv
-# Linux/Mac激活虚拟环境
-source venv/bin/activate
-# Windows激活虚拟环境
-# venv\Scripts\activate
-
-# 安装依赖
-pip install -r requirements.txt
-```
-
-### 3. 配置服务器
-1. 确保已创建所需文件夹:
-```bash
-mkdir -p game_saves config
-```
-
-2. 创建初始玩家数据模板 (如果尚未存在):
-```bash
-# 在config目录中创建initial_player_data_template.json
-```
-
-3. 检查 TCPGameServer.py 中的服务器地址和端口配置:
-```python
-server_host: str = "0.0.0.0" # 使用0.0.0.0允许所有网络接口访问
-server_port: int = 9000 # 确保此端口在防火墙中开放
-```
-
-4. 如需使用QQ邮箱验证功能,请在QQEmailSend.py中更新发件邮箱配置:
-```python
-SENDER_EMAIL = 'your_qq_number@qq.com' # 发件人邮箱
-SENDER_AUTH_CODE = 'your_auth_code' # 授权码
-```
-
-### 4. 启动服务器
-```bash
-# 直接启动
-python Server/TCPGameServer.py
-
-# 或使用nohup在后台运行
-nohup python Server/TCPGameServer.py > server.log 2>&1 &
-```
-
-### 5. 监控与维护
-- 服务器日志会输出到控制台或server.log
-- 玩家数据存储在game_saves文件夹中
-- 定期备份game_saves文件夹以防数据丢失
-
-### 6. 防火墙配置
-确保服务器防火墙允许TCP 9000端口的入站连接:
-
-```bash
-# Ubuntu/Debian
-sudo ufw allow 9000/tcp
-
-# CentOS/RHEL
-sudo firewall-cmd --permanent --add-port=9000/tcp
-sudo firewall-cmd --reload
-```
-
-### 7. 系统服务配置 (可选)
-可以创建systemd服务使服务器自动启动:
-
-```bash
-# 创建服务文件
-sudo nano /etc/systemd/system/mengyafarm.service
-
-# 添加以下内容
-[Unit]
-Description=MengYa Farm Game Server
-After=network.target
-
-[Service]
-Type=simple
-User=your_username
-WorkingDirectory=/path/to/MengYaFarm
-ExecStart=/path/to/MengYaFarm/venv/bin/python /path/to/MengYaFarm/Server/TCPGameServer.py
-Restart=on-failure
-RestartSec=5
-
-[Install]
-WantedBy=multi-user.target
-
-# 启用并启动服务
-sudo systemctl enable mengyafarm.service
-sudo systemctl start mengyafarm.service
-```
-
-## 常见问题
-
-### 服务器无法启动
-- 检查Python版本
-- 确认所有依赖已正确安装
-- 检查端口是否被占用
-
-### 客户端无法连接
-- 确认服务器IP和端口配置正确
-- 检查防火墙设置
-- 验证网络连接
-
-### 发送验证码失败
-- 检查QQ邮箱和授权码设置
-- 确认SMTP服务器可访问
\ No newline at end of file
diff --git a/Server/game_saves/2143323382.json b/Server/game_saves/2143323382.json
deleted file mode 100644
index deaaf04..0000000
--- a/Server/game_saves/2143323382.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "experience": 0,
- "level": 1,
- "money": 1000,
- "farm_name": "柚大青の小农场",
- "player_name": "柚大青",
- "user_name": "2143323382",
- "user_password": "tyh@19900420",
- "last_login_time": "2025年05月25日16时43分38秒",
- "total_login_time": "0时0分29秒",
- "farm_lots": [
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": []
-}
\ No newline at end of file
diff --git a/Server/game_saves/2143323382.json.backup b/Server/game_saves/2143323382.json.backup
deleted file mode 100644
index fab514a..0000000
--- a/Server/game_saves/2143323382.json.backup
+++ /dev/null
@@ -1,414 +0,0 @@
-{
- "experience": 0,
- "level": 1,
- "money": 1000,
- "farm_name": "柚大青の小农场",
- "player_name": "柚大青",
- "user_name": "2143323382",
- "user_password": "tyh@19900420",
- "last_login_time": "2025年05月25日16时43分38秒",
- "total_login_time": "0时0分29秒",
- "farm_lots": [
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": []
-}
\ No newline at end of file
diff --git a/Server/game_saves/2221023030.json b/Server/game_saves/2221023030.json
deleted file mode 100644
index 23a4017..0000000
--- a/Server/game_saves/2221023030.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "experience": 1408,
- "level": 29,
- "money": 294776,
- "farm_name": "虚空农场",
- "user_name": "2221023030",
- "player_name": "虚空领主",
- "user_password": "wangpeng666",
- "last_login_time": "2025年05月25日21时37分28秒",
- "total_login_time": "0时13分51秒",
- "farm_lots": [
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"土豆","grow_time":360,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":360,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"土豆","quality":"普通","count":7},
- {"name":"测试作物","quality":"普通","count":30}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2221023030.json.backup b/Server/game_saves/2221023030.json.backup
deleted file mode 100644
index 78ce98d..0000000
--- a/Server/game_saves/2221023030.json.backup
+++ /dev/null
@@ -1,425 +0,0 @@
-{
- "experience": 1408,
- "level": 29,
- "money": 294776,
- "farm_name": "虚空农场",
- "user_name": "2221023030",
- "player_name": "虚空领主",
- "user_password": "wangpeng666",
- "last_login_time": "2025年05月25日21时37分28秒",
- "total_login_time": "0时13分51秒",
- "farm_lots": [
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "土豆",
- "grow_time": 360,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 360
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "土豆",
- "quality": "普通",
- "count": 7
- },
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 30
- }
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2427948832.json b/Server/game_saves/2427948832.json
deleted file mode 100644
index e7e7324..0000000
--- a/Server/game_saves/2427948832.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "experience": 2235,
- "level": 53,
- "money": 1222211,
- "farm_name": "神经病院",
- "user_name": "2427948832",
- "player_name": "唐大伟",
- "user_password": "mylc205823",
- "last_login_time": "2025年05月27日10时30分31秒",
- "total_login_time": "0时34分45秒",
- "farm_lots": [
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"洋葱","quality":"稀有","count":2},
- {"name":"测试作物","quality":"普通","count":219},
- {"name":"稻谷","quality":"普通","count":1}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2427948832.json.backup b/Server/game_saves/2427948832.json.backup
deleted file mode 100644
index 33a6b4b..0000000
--- a/Server/game_saves/2427948832.json.backup
+++ /dev/null
@@ -1,430 +0,0 @@
-{
- "experience": 2235,
- "level": 53,
- "money": 1222211,
- "farm_name": "神经病院",
- "user_name": "2427948832",
- "player_name": "唐大伟",
- "user_password": "mylc205823",
- "last_login_time": "2025年05月27日10时30分31秒",
- "total_login_time": "0时34分45秒",
- "farm_lots": [
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "洋葱",
- "quality": "稀有",
- "count": 2
- },
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 219
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 1
- }
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2634726358.json b/Server/game_saves/2634726358.json
deleted file mode 100644
index f307a52..0000000
--- a/Server/game_saves/2634726358.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "experience": 1485,
- "level": 17,
- "money": 106782,
- "farm_name": "嘻嘻",
- "user_name": "2634726358",
- "player_name": "哈哈",
- "user_password": "wxt20050712",
- "last_login_time": "2025年05月25日19时22分59秒",
- "total_login_time": "0时8分43秒",
- "farm_lots": [
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":240,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":240,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":240,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"番茄","quality":"优良","count":4},
- {"name":"测试作物","quality":"普通","count":3}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2634726358.json.backup b/Server/game_saves/2634726358.json.backup
deleted file mode 100644
index 65cb84e..0000000
--- a/Server/game_saves/2634726358.json.backup
+++ /dev/null
@@ -1,425 +0,0 @@
-{
- "experience": 1485,
- "level": 17,
- "money": 106782,
- "farm_name": "嘻嘻",
- "user_name": "2634726358",
- "player_name": "哈哈",
- "user_password": "wxt20050712",
- "last_login_time": "2025年05月25日19时22分59秒",
- "total_login_time": "0时8分43秒",
- "farm_lots": [
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 240
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 240
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 240
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "番茄",
- "quality": "优良",
- "count": 4
- },
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 3
- }
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2671387804.json b/Server/game_saves/2671387804.json
deleted file mode 100644
index c3272dc..0000000
--- a/Server/game_saves/2671387804.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "experience": 1678,
- "level": 38,
- "money": 537188,
- "farm_name": "杨亮的家",
- "user_name": "2671387804",
- "player_name": "杨亮的主人",
- "user_password": "woshiyangliang",
- "last_login_time": "2025年05月25日21时45分45秒",
- "total_login_time": "0时16分13秒",
- "farm_lots": [
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"小麦","grow_time":120,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":120,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"测试作物","grow_time":3,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"胡萝卜","quality":"普通","count":5},
- {"name":"土豆","quality":"普通","count":2},
- {"name":"稻谷","quality":"普通","count":1},
- {"name":"测试作物","quality":"普通","count":105}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2671387804.json.backup b/Server/game_saves/2671387804.json.backup
deleted file mode 100644
index f0a4ed1..0000000
--- a/Server/game_saves/2671387804.json.backup
+++ /dev/null
@@ -1,435 +0,0 @@
-{
- "experience": 1678,
- "level": 38,
- "money": 537188,
- "farm_name": "杨亮的家",
- "user_name": "2671387804",
- "player_name": "杨亮的主人",
- "user_password": "woshiyangliang",
- "last_login_time": "2025年05月25日21时45分45秒",
- "total_login_time": "0时16分13秒",
- "farm_lots": [
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "测试作物",
- "grow_time": 3,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "胡萝卜",
- "quality": "普通",
- "count": 5
- },
- {
- "name": "土豆",
- "quality": "普通",
- "count": 2
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 105
- }
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2809548669.json b/Server/game_saves/2809548669.json
deleted file mode 100644
index d4b06f8..0000000
--- a/Server/game_saves/2809548669.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "experience": 0,
- "level": 1,
- "money": 1000,
- "farm_name": "丿Dream丨天辰",
- "user_name": "2809548669",
- "player_name": "丿Dream丨天辰",
- "user_password": "asd123456",
- "last_login_time": "2025年05月25日22时06分21秒",
- "total_login_time": "0时0分15秒",
- "farm_lots": [
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":3,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": []
-}
\ No newline at end of file
diff --git a/Server/game_saves/2809548669.json.backup b/Server/game_saves/2809548669.json.backup
deleted file mode 100644
index b20b19a..0000000
--- a/Server/game_saves/2809548669.json.backup
+++ /dev/null
@@ -1,414 +0,0 @@
-{
- "experience": 0,
- "level": 1,
- "money": 1000,
- "farm_name": "丿Dream丨天辰",
- "user_name": "2809548669",
- "player_name": "丿Dream丨天辰",
- "user_password": "asd123456",
- "last_login_time": "2025年05月25日22时06分21秒",
- "total_login_time": "0时0分15秒",
- "farm_lots": [
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 3
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": []
-}
\ No newline at end of file
diff --git a/Server/game_saves/2973419538.json b/Server/game_saves/2973419538.json
deleted file mode 100644
index 1998eb1..0000000
--- a/Server/game_saves/2973419538.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "experience": 899,
- "level": 2,
- "money": 5026,
- "farm_name": "niuma",
- "user_name": "2973419538",
- "player_name": "niuma",
- "user_password": "247896",
- "last_login_time": "2025年05月27日15时45分58秒",
- "total_login_time": "0时2分5秒",
- "farm_lots": [
- {"crop_type":"小麦","grow_time":120,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":120,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"胡萝卜","grow_time":480,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":480,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"小麦","grow_time":120,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":120,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"土豆","grow_time":360,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":360,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"稻谷","grow_time":240,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":240,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"小麦","grow_time":120,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":120,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"测试作物","quality":"普通","count":3},
- {"name":"稻谷","quality":"普通","count":3},
- {"name":"土豆","quality":"普通","count":1}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/2973419538.json.backup b/Server/game_saves/2973419538.json.backup
deleted file mode 100644
index 0c35edc..0000000
--- a/Server/game_saves/2973419538.json.backup
+++ /dev/null
@@ -1,430 +0,0 @@
-{
- "experience": 899,
- "level": 2,
- "money": 5026,
- "farm_name": "niuma",
- "user_name": "2973419538",
- "player_name": "niuma",
- "user_password": "247896",
- "last_login_time": "2025年05月27日15时45分58秒",
- "total_login_time": "0时2分5秒",
- "farm_lots": [
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "土豆",
- "grow_time": 360,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 360
- },
- {
- "crop_type": "稻谷",
- "grow_time": 240,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 240
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 3
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 3
- },
- {
- "name": "土豆",
- "quality": "普通",
- "count": 1
- }
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/3205788256.json.backup b/Server/game_saves/3205788256.json.backup
deleted file mode 100644
index 83b4ddb..0000000
--- a/Server/game_saves/3205788256.json.backup
+++ /dev/null
@@ -1,930 +0,0 @@
-{
- "farm_lots": [
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "松露",
- "grow_time": 4295,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "人参",
- "grow_time": 4891,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800
- },
- {
- "crop_type": "芦荟",
- "grow_time": 301,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "番茄",
- "grow_time": 297,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 720
- },
- {
- "crop_type": "香草",
- "grow_time": 295,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800
- },
- {
- "crop_type": "芦笋",
- "grow_time": 294,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "甜菜",
- "grow_time": 292,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "人参",
- "grow_time": 4307,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 4299,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "人参",
- "grow_time": 4891,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800
- },
- {
- "crop_type": "稻谷",
- "grow_time": 240,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 240
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "西瓜",
- "grow_time": 2400,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2400
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "甜菜",
- "grow_time": 2160,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 120
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800
- },
- {
- "crop_type": "人参",
- "grow_time": 4891,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800
- },
- {
- "crop_type": "稻谷",
- "grow_time": 240,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 240
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480
- },
- {
- "crop_type": "甜菜",
- "grow_time": 2160,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160
- },
- {
- "crop_type": "西瓜",
- "grow_time": 2400,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2400
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960
- }
- ],
- "player_bag": [
- {
- "count": 272,
- "name": "金橘",
- "quality": "传奇"
- },
- {
- "name": "胡萝卜",
- "quality": "普通",
- "count": 9
- },
- {
- "name": "人参",
- "quality": "传奇",
- "count": 8
- },
- {
- "name": "松露",
- "quality": "传奇",
- "count": 8
- },
- {
- "name": "富贵竹",
- "quality": "传奇",
- "count": 17
- },
- {
- "name": "芦荟",
- "quality": "传奇",
- "count": 15
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 15
- },
- {
- "name": "小麦",
- "quality": "普通",
- "count": 3
- },
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 8
- },
- {
- "name": "番茄",
- "quality": "优良",
- "count": 16
- },
- {
- "name": "香草",
- "quality": "史诗",
- "count": 10
- },
- {
- "name": "龙果",
- "quality": "传奇",
- "count": 6
- },
- {
- "name": "甘蔗",
- "quality": "史诗",
- "count": 2
- },
- {
- "name": "甜菜",
- "quality": "史诗",
- "count": 2
- },
- {
- "name": "西瓜",
- "quality": "史诗",
- "count": 1
- },
- {
- "name": "葡萄",
- "quality": "稀有",
- "count": 2
- },
- {
- "name": "南瓜",
- "quality": "稀有",
- "count": 2
- },
- {
- "name": "玉米",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "土豆",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "草莓",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "大豆",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "蓝莓",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "洋葱",
- "quality": "稀有",
- "count": 2
- }
- ],
- "experience": 737,
- "farm_name": "树萌芽の大农场",
- "player_name": "树萌芽",
- "level": 41,
- "money": 5720,
- "last_login_time": "2025年05月27日18时32分31秒",
- "total_login_time": "104时17分5秒",
- "user_name": "3205788256",
- "user_password": "tyh@19900420"
-}
\ No newline at end of file
diff --git a/Server/game_saves/3346964708.json b/Server/game_saves/3346964708.json
deleted file mode 100644
index 070f7d0..0000000
--- a/Server/game_saves/3346964708.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- "experience": 4193,
- "level": 8,
- "money": 28470,
- "farm_name": "困困的鼠鼠",
- "user_name": "3346964708",
- "player_name": "OVO",
- "user_password": "123456",
- "last_login_time": "2025年05月26日23时53分53秒",
- "total_login_time": "0时7分6秒",
- "farm_lots": [
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"金橘","grow_time":4800,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":4800,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"小麦","grow_time":120,"is_dead":false,"is_diged":true,"is_planted":true,"max_grow_time":120,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":true,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0},
- {"crop_type":"","grow_time":0,"is_dead":false,"is_diged":false,"is_planted":false,"max_grow_time":5,"已浇水":false,"已施肥":false,"土地等级":0}
- ],
- "player_bag": [
- {"name":"测试作物","quality":"普通","count":3},
- {"name":"小麦","quality":"普通","count":3},
- {"name":"稻谷","quality":"普通","count":1},
- {"name":"玉米","quality":"普通","count":1},
- {"name":"土豆","quality":"普通","count":1},
- {"name":"胡萝卜","quality":"普通","count":1},
- {"name":"草莓","quality":"优良","count":1},
- {"name":"番茄","quality":"优良","count":1},
- {"name":"大豆","quality":"优良","count":1},
- {"name":"蓝莓","quality":"稀有","count":1},
- {"name":"洋葱","quality":"稀有","count":1},
- {"name":"南瓜","quality":"稀有","count":1},
- {"name":"葡萄","quality":"稀有","count":1},
- {"name":"柿子","quality":"稀有","count":1},
- {"name":"芦笋","quality":"稀有","count":1},
- {"name":"花椰菜","quality":"稀有","count":1},
- {"name":"香草","quality":"史诗","count":1},
- {"name":"西瓜","quality":"史诗","count":1},
- {"name":"甜菜","quality":"史诗","count":1},
- {"name":"甘蔗","quality":"史诗","count":1},
- {"name":"龙果","quality":"传奇","count":1},
- {"name":"松露","quality":"传奇","count":1},
- {"name":"人参","quality":"传奇","count":1},
- {"name":"富贵竹","quality":"传奇","count":1},
- {"name":"芦荟","quality":"传奇","count":1},
- {"name":"金橘","quality":"传奇","count":1}
- ]
-}
\ No newline at end of file
diff --git a/Server/game_saves/3346964708.json.backup b/Server/game_saves/3346964708.json.backup
deleted file mode 100644
index 7fd01d5..0000000
--- a/Server/game_saves/3346964708.json.backup
+++ /dev/null
@@ -1,545 +0,0 @@
-{
- "experience": 4193,
- "level": 8,
- "money": 28470,
- "farm_name": "困困的鼠鼠",
- "user_name": "3346964708",
- "player_name": "OVO",
- "user_password": "123456",
- "last_login_time": "2025年05月26日23时53分53秒",
- "total_login_time": "0时7分6秒",
- "farm_lots": [
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "金橘",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": true,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- },
- {
- "crop_type": "",
- "grow_time": 0,
- "is_dead": false,
- "is_diged": false,
- "is_planted": false,
- "max_grow_time": 5
- }
- ],
- "player_bag": [
- {
- "name": "测试作物",
- "quality": "普通",
- "count": 3
- },
- {
- "name": "小麦",
- "quality": "普通",
- "count": 3
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "玉米",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "土豆",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "胡萝卜",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "草莓",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "番茄",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "大豆",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "蓝莓",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "洋葱",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "南瓜",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "葡萄",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "柿子",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "芦笋",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "花椰菜",
- "quality": "稀有",
- "count": 1
- },
- {
- "name": "香草",
- "quality": "史诗",
- "count": 1
- },
- {
- "name": "西瓜",
- "quality": "史诗",
- "count": 1
- },
- {
- "name": "甜菜",
- "quality": "史诗",
- "count": 1
- },
- {
- "name": "甘蔗",
- "quality": "史诗",
- "count": 1
- },
- {
- "name": "龙果",
- "quality": "传奇",
- "count": 1
- },
- {
- "name": "松露",
- "quality": "传奇",
- "count": 1
- },
- {
- "name": "人参",
- "quality": "传奇",
- "count": 1
- },
- {
- "name": "富贵竹",
- "quality": "传奇",
- "count": 1
- },
- {
- "name": "芦荟",
- "quality": "传奇",
- "count": 1
- },
- {
- "name": "金橘",
- "quality": "传奇",
- "count": 1
- }
- ]
-}
\ No newline at end of file
diff --git a/Shader/2DCircularOutline.gdshader b/Shader/2DCircularOutline.gdshader
new file mode 100644
index 0000000..20c2099
--- /dev/null
+++ b/Shader/2DCircularOutline.gdshader
@@ -0,0 +1,108 @@
+shader_type canvas_item;
+
+uniform bool allow_out_of_bounds = true;
+uniform float outline_thickness: hint_range(0.0, 16.0, 1.0) = 1.0;
+uniform vec4 outline_color: source_color = vec4(1.0);
+uniform int quality: hint_range(1, 3, 1) = 2; // 1=低质量但快速, 2=平衡, 3=高质量但慢
+uniform bool use_fast_mode = true; // 快速模式,牺牲一点质量换取性能
+
+bool is_inside_usquare(vec2 x) {
+ return x == clamp(x, vec2(0.0), vec2(1.0));
+}
+
+vec4 blend(vec4 bottom, vec4 top) {
+ float alpha = top.a + bottom.a * (1.0 - top.a);
+ if (alpha < 0.0001) return vec4(0.0);
+
+ vec3 color = mix(bottom.rgb * bottom.a, top.rgb, top.a) / alpha;
+ return vec4(color, alpha);
+}
+
+void vertex() {
+ if (allow_out_of_bounds) VERTEX += (UV * 2.0 - 1.0) * outline_thickness;
+}
+
+void fragment() {
+ if (outline_thickness <= 0.0 || outline_color.a <= 0.0) {
+ COLOR = texture(TEXTURE, UV);
+ } else {
+ vec2 uv = UV;
+ vec4 texture_color = texture(TEXTURE, UV);
+
+ if (allow_out_of_bounds) {
+ vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(outline_thickness * 2.0));
+ uv = (uv - texture_pixel_size * outline_thickness) * TEXTURE_PIXEL_SIZE / texture_pixel_size;
+
+ if (is_inside_usquare(uv)) {
+ texture_color = texture(TEXTURE, uv);
+ } else {
+ texture_color = vec4(0.0);
+ }
+ }
+
+ // 如果当前像素已经有alpha,且不是在边缘,可以跳过复杂计算
+ if (texture_color.a > 0.9) {
+ COLOR = texture_color;
+ } else {
+ float alpha = 0.0;
+
+ if (use_fast_mode) {
+ // 快速模式:使用较少的采样点
+ float step_size = max(1.0, outline_thickness / 4.0);
+ int max_samples = 32; // 限制最大采样数
+ int sample_count = 0;
+
+ for (float radius = step_size; radius <= outline_thickness && sample_count < max_samples; radius += step_size) {
+ // 使用8个方向的采样点
+ vec2 directions[8] = {
+ vec2(1.0, 0.0), vec2(-1.0, 0.0), vec2(0.0, 1.0), vec2(0.0, -1.0),
+ vec2(0.707, 0.707), vec2(-0.707, 0.707), vec2(0.707, -0.707), vec2(-0.707, -0.707)
+ };
+
+ for (int i = 0; i < 8; i++) {
+ vec2 sample_uv = uv + directions[i] * radius * TEXTURE_PIXEL_SIZE;
+ if (is_inside_usquare(sample_uv)) {
+ float sample_alpha = texture(TEXTURE, sample_uv).a;
+ alpha = max(alpha, sample_alpha);
+ sample_count++;
+ if (alpha > 0.99) break; // 早期退出
+ }
+ }
+ if (alpha > 0.99) break; // 早期退出
+ }
+ } else {
+ // 原始高质量模式,但有优化
+ int max_thickness = int(min(outline_thickness, float(8 + quality * 4))); // 限制最大厚度
+
+ for (int y = 1; y <= max_thickness; y++) {
+ for (int x = 0; x <= y; x++) {
+ float dist = length(vec2(float(x), float(y) - 0.5));
+ if (dist > outline_thickness) break;
+
+ vec2 offsets[8] = {
+ vec2(float(x), float(y)), vec2(float(-x), float(y)),
+ vec2(float(x), float(-y)), vec2(float(-x), float(-y)),
+ vec2(float(y), float(x)), vec2(float(-y), float(x)),
+ vec2(float(y), float(-x)), vec2(float(-y), float(-x))
+ };
+
+ for (int i = 0; i < 8; i++) {
+ vec2 sample_uv = uv + offsets[i] * TEXTURE_PIXEL_SIZE;
+ if (is_inside_usquare(sample_uv)) {
+ float sample_alpha = texture(TEXTURE, sample_uv).a;
+ alpha = max(alpha, sample_alpha);
+ if (alpha > 0.99) break; // 早期退出
+ }
+ }
+
+ if (alpha > 0.99) break; // 早期退出
+ }
+
+ if (alpha > 0.99) break; // 早期退出
+ }
+ }
+
+ COLOR = blend(vec4(outline_color.rgb, alpha * outline_color.a), texture_color);
+ }
+ }
+}
diff --git a/Shader/2DCircularOutline.gdshader.uid b/Shader/2DCircularOutline.gdshader.uid
new file mode 100644
index 0000000..f298533
--- /dev/null
+++ b/Shader/2DCircularOutline.gdshader.uid
@@ -0,0 +1 @@
+uid://xrlqe0cdb3ty
diff --git a/Shader/Animatedprogressbar.gdshader b/Shader/Animatedprogressbar.gdshader
new file mode 100644
index 0000000..b422fe1
--- /dev/null
+++ b/Shader/Animatedprogressbar.gdshader
@@ -0,0 +1,97 @@
+shader_type canvas_item;
+
+uniform float u_aspect; // aspect of the control.
+
+uniform vec4 progress_color : source_color = vec4(0.5, 0.5, 0.5, 1.0);
+uniform vec4 background_color : source_color = vec4(0.4, 0.4, 0.4, 1.0);
+uniform vec4 outline_color : source_color = vec4(0.4, 0.4, 0.4, 1.0);
+uniform float progress = 0.9;
+
+const float corner_radius = 0.2;
+const float grain_darkness = 0.01;
+const vec4 white_color = vec4(1.0);
+const float gradient_length = 0.05;
+const float star_size = 20.0; // In pixels.
+const float border_width = 0.01;
+const float edge_softness = 0.005;
+const float border_size = 0.1;
+
+// A Signed Distance Field (SDF) formulas: https://iquilezles.org/articles/distfunctions2d/
+float sdBox(in vec2 pos, in vec2 half_size)
+{
+ vec2 d = abs(pos) - half_size;
+ return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
+}
+
+float sdRoundedBox(in vec2 pos, in vec2 half_size, in float r)
+{
+ return sdBox(pos , half_size) - r;
+}
+
+float sdStar(in vec2 p, in float r)
+{
+ const float k1x = 0.809016994; // cos(π/ 5) = ¼(√5+1)
+ const float k2x = 0.309016994; // sin(π/10) = ¼(√5-1)
+ const float k1y = 0.587785252; // sin(π/ 5) = ¼√(10-2√5)
+ const float k2y = 0.951056516; // cos(π/10) = ¼√(10+2√5)
+ const float k1z = 0.726542528; // tan(π/ 5) = √(5-2√5)
+ const vec2 v1 = vec2( k1x,-k1y);
+ const vec2 v2 = vec2(-k1x,-k1y);
+ const vec2 v3 = vec2( k2x,-k2y);
+
+ p.x = abs(p.x);
+ p -= 2.0*max(dot(v1,p),0.0)*v1;
+ p -= 2.0*max(dot(v2,p),0.0)*v2;
+ p.x = abs(p.x);
+ p.y -= r;
+ return length(p-v3*clamp(dot(p,v3),0.0,k1z*r))
+ * sign(p.y*v3.x-p.x*v3.y);
+}
+
+float sdRoundedStar(in vec2 p, in float r, in float corner_r) {
+ return sdStar(p, r) - corner_r;
+}
+
+void fragment() {
+ vec2 aspect = vec2(u_aspect, 1.0);
+ vec2 half_size = vec2(0.5, 0.5) * aspect;
+ vec2 pos = UV * aspect - half_size;
+ float distance = sdRoundedBox(pos, half_size - corner_radius, corner_radius);
+
+ if (UV.x < progress) {
+ COLOR = progress_color;
+
+ float position_gradient = UV.x - (progress - gradient_length); // 0.0 -> length
+ float normalized_position = clamp(position_gradient / gradient_length, 0.0, 1.0);
+ COLOR += white_color * normalized_position * 0.2;
+
+ float shift = TIME * star_size;
+ vec2 grid_coord = (FRAGCOORD.xy + vec2(-shift, shift)) / star_size;
+ // 36° rotation matrix.
+ const mat2 rot36 = mat2(vec2(0.8090, -0.5878), vec2(0.5878, 0.8090));
+ grid_coord *= rot36;
+ float index_y = floor(grid_coord.y);
+ vec2 fraction = fract(grid_coord);
+ // Shift X.
+ if (mod(index_y, 2.0) == 1.0) {
+ fraction.x = fract(grid_coord.x + 0.5);
+ }
+ vec2 pos = fraction - vec2(0.5, 0.5);
+ float distance = sdRoundedStar(pos, 0.4, 0.02);
+ if (distance < 0.0) {
+ COLOR *= 0.93;
+ }
+ } else {
+ // Grainy checker pattern.
+ float grain = mod(floor(FRAGCOORD.x * 0.3) + floor(FRAGCOORD.y * 0.3), 3.0);
+ COLOR = background_color - grain * grain_darkness;
+ }
+
+ // Border.
+ float border_alpha = 1.0 - smoothstep(border_size - edge_softness, border_size, abs(distance));
+ COLOR = mix(COLOR, outline_color, border_alpha);
+
+ // Rounded corners.
+ float smoothed_alpha = 1.0 - smoothstep(0.0, edge_softness, distance);
+ COLOR.a = smoothed_alpha;
+}
diff --git a/Shader/Animatedprogressbar.gdshader.uid b/Shader/Animatedprogressbar.gdshader.uid
new file mode 100644
index 0000000..9c0d94f
--- /dev/null
+++ b/Shader/Animatedprogressbar.gdshader.uid
@@ -0,0 +1 @@
+uid://c62wifgla7rux
diff --git a/Shader/CropProgress.gdshader b/Shader/CropProgress.gdshader
deleted file mode 100644
index 9036749..0000000
--- a/Shader/CropProgress.gdshader
+++ /dev/null
@@ -1,8 +0,0 @@
-shader_type canvas_item;
-
-uniform vec4 fill_color;
-uniform float progress;
-
-void fragment() {
-
-}
diff --git a/Shader/CropProgress.gdshader.uid b/Shader/CropProgress.gdshader.uid
deleted file mode 100644
index 02bb6c5..0000000
--- a/Shader/CropProgress.gdshader.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://cmrhmjs8fohm
diff --git a/Shader/FarmLotOutline.gdshader b/Shader/FarmLotOutline.gdshader
new file mode 100644
index 0000000..b2203c2
--- /dev/null
+++ b/Shader/FarmLotOutline.gdshader
@@ -0,0 +1,71 @@
+shader_type canvas_item;
+
+uniform float outline_thickness: hint_range(0.0, 8.0, 0.5) = 1.0;
+uniform vec4 outline_color: source_color = vec4(1.0);
+uniform bool high_performance_mode = true; // 高性能模式,减少采样
+
+void vertex() {
+ VERTEX += (UV * 2.0 - 1.0) * outline_thickness;
+}
+
+void fragment() {
+ vec2 uv = UV;
+ vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(outline_thickness * 2.0));
+ uv = (uv - texture_pixel_size * outline_thickness) * TEXTURE_PIXEL_SIZE / texture_pixel_size;
+
+ vec4 texture_color = vec4(0.0);
+ if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {
+ texture_color = texture(TEXTURE, uv);
+ }
+
+ // 如果当前像素不透明,直接设置颜色
+ if (texture_color.a > 0.5) {
+ COLOR = texture_color;
+ } else {
+ // 需要计算描边
+ float outline_alpha = 0.0;
+
+ if (high_performance_mode) {
+ // 高性能模式:只检查4个主要方向
+ vec2 directions[4] = {
+ vec2(outline_thickness, 0.0),
+ vec2(-outline_thickness, 0.0),
+ vec2(0.0, outline_thickness),
+ vec2(0.0, -outline_thickness)
+ };
+
+ for (int i = 0; i < 4; i++) {
+ vec2 check_uv = uv + directions[i] * TEXTURE_PIXEL_SIZE;
+ if (check_uv.x >= 0.0 && check_uv.x <= 1.0 && check_uv.y >= 0.0 && check_uv.y <= 1.0) {
+ float check_alpha = texture(TEXTURE, check_uv).a;
+ outline_alpha = max(outline_alpha, check_alpha);
+ if (outline_alpha > 0.9) break; // 早期退出
+ }
+ }
+ } else {
+ // 标准模式:8方向检查
+ vec2 directions[8] = {
+ vec2(outline_thickness, 0.0), vec2(-outline_thickness, 0.0),
+ vec2(0.0, outline_thickness), vec2(0.0, -outline_thickness),
+ vec2(outline_thickness * 0.707, outline_thickness * 0.707),
+ vec2(-outline_thickness * 0.707, outline_thickness * 0.707),
+ vec2(outline_thickness * 0.707, -outline_thickness * 0.707),
+ vec2(-outline_thickness * 0.707, -outline_thickness * 0.707)
+ };
+
+ for (int i = 0; i < 8; i++) {
+ vec2 check_uv = uv + directions[i] * TEXTURE_PIXEL_SIZE;
+ if (check_uv.x >= 0.0 && check_uv.x <= 1.0 && check_uv.y >= 0.0 && check_uv.y <= 1.0) {
+ float check_alpha = texture(TEXTURE, check_uv).a;
+ outline_alpha = max(outline_alpha, check_alpha);
+ if (outline_alpha > 0.9) break; // 早期退出
+ }
+ }
+ }
+
+ // 混合颜色
+ float final_alpha = outline_alpha * outline_color.a;
+ COLOR = vec4(outline_color.rgb * final_alpha + texture_color.rgb * texture_color.a,
+ max(final_alpha, texture_color.a));
+ }
+}
\ No newline at end of file
diff --git a/Shader/FarmLotOutline.gdshader.uid b/Shader/FarmLotOutline.gdshader.uid
new file mode 100644
index 0000000..04c39d4
--- /dev/null
+++ b/Shader/FarmLotOutline.gdshader.uid
@@ -0,0 +1 @@
+uid://1ls557unpikt
diff --git a/Shader/OutlineforAtlasTexture.gdshader b/Shader/OutlineforAtlasTexture.gdshader
new file mode 100644
index 0000000..5a09904
--- /dev/null
+++ b/Shader/OutlineforAtlasTexture.gdshader
@@ -0,0 +1,44 @@
+shader_type canvas_item;
+
+uniform float outline_width = 1.0;
+uniform vec4 outline_color : source_color;
+uniform vec4 texture_region = vec4(0.0);
+
+void fragment() {
+ vec4 color = texture(TEXTURE, UV);
+ vec2 outline_offset = vec2(outline_width) * TEXTURE_PIXEL_SIZE;
+ vec4 uv_region = vec4(texture_region.xy * TEXTURE_PIXEL_SIZE, texture_region.zw * TEXTURE_PIXEL_SIZE);
+ if (uv_region.zw == vec2(0.0)) {
+ uv_region.zw = vec2(1.0);
+ }
+
+ float uv_offset;
+ float a;
+ float max_a = 0.0;
+
+ uv_offset = UV.y - outline_offset.y;
+ if (uv_offset > uv_region.y) {
+ a = texture(TEXTURE, vec2(UV.x, uv_offset)).a;
+ max_a = max(a, max_a);
+ }
+
+ uv_offset = UV.y + outline_offset.y;
+ if (uv_offset < uv_region.y + uv_region.w) {
+ a = texture(TEXTURE, vec2(UV.x, uv_offset)).a;
+ max_a = max(a, max_a);
+ }
+
+ uv_offset = UV.x - outline_offset.x;
+ if (uv_offset > uv_region.x) {
+ a = texture(TEXTURE, vec2(uv_offset, UV.y)).a;
+ max_a = max(a, max_a);
+ }
+
+ uv_offset = UV.x + outline_offset.x;
+ if (uv_offset < uv_region.x + uv_region.z) {
+ a = texture(TEXTURE, vec2(uv_offset, UV.y)).a;
+ max_a = max(a, max_a);
+ }
+
+ COLOR = mix(color, outline_color, max_a - color.a);
+}
diff --git a/Shader/OutlineforAtlasTexture.gdshader.uid b/Shader/OutlineforAtlasTexture.gdshader.uid
new file mode 100644
index 0000000..acfbb6d
--- /dev/null
+++ b/Shader/OutlineforAtlasTexture.gdshader.uid
@@ -0,0 +1 @@
+uid://d0uvu33hbgixy
diff --git a/Shader/RadialChromaticAberration.gdshader b/Shader/RadialChromaticAberration.gdshader
new file mode 100644
index 0000000..a682d51
--- /dev/null
+++ b/Shader/RadialChromaticAberration.gdshader
@@ -0,0 +1,43 @@
+shader_type canvas_item;
+
+uniform float intensity: hint_range(0.0, 5.0, 0.1) = 1.0;
+uniform float threshold: hint_range(0.0, 2.0, 0.1) = 1.0;
+
+uniform sampler2D screen_texture : hint_screen_texture, filter_nearest;
+
+float vector_angle(vec2 v) {
+ if (abs(v.x) < 0.0001 && abs(v.y) < 0.0001) {
+ return 0.0; // Default angle for zero vector
+ }
+ return atan(v.y, v.x);
+}
+
+vec2 rotate_vector(vec2 v, float cos_theta, float sin_theta) {
+ return vec2(
+ v.x * cos_theta - v.y * sin_theta,
+ v.x * sin_theta + v.y * cos_theta
+ );
+}
+
+void fragment() {
+ vec2 r_displacement = vec2(-1.0, 0.0);
+ vec2 g_displacement = vec2(0.0, 0.0);
+ vec2 b_displacement = vec2(1.0, 0.0);
+
+ vec2 center = vec2(0.5);
+ vec2 dir = SCREEN_UV - center;
+ float angle = vector_angle(dir);
+ float dist = 2.0 * length(dir);
+ float effect = exp(intensity * (dist - threshold));
+
+ r_displacement = rotate_vector(effect * intensity * r_displacement, cos(angle), sin(angle));
+ g_displacement = rotate_vector(effect * intensity * g_displacement, cos(angle), sin(angle));
+ b_displacement = rotate_vector(effect * intensity * b_displacement, cos(angle), sin(angle));
+
+ float r = texture(screen_texture, fma(r_displacement, SCREEN_PIXEL_SIZE, SCREEN_UV), 0.0).r;
+ float g = texture(screen_texture, fma(g_displacement, SCREEN_PIXEL_SIZE, SCREEN_UV), 0.0).g;
+ float b = texture(screen_texture, fma(b_displacement, SCREEN_PIXEL_SIZE, SCREEN_UV), 0.0).b;
+ float a = texture(screen_texture, SCREEN_UV).a;
+
+ COLOR = vec4(r, g, b, a);
+}
diff --git a/Shader/RadialChromaticAberration.gdshader.uid b/Shader/RadialChromaticAberration.gdshader.uid
new file mode 100644
index 0000000..2847809
--- /dev/null
+++ b/Shader/RadialChromaticAberration.gdshader.uid
@@ -0,0 +1 @@
+uid://dbob5p3pkf7a0
diff --git a/Test/name.md b/Test/name.md
deleted file mode 100644
index 5be8913..0000000
--- a/Test/name.md
+++ /dev/null
@@ -1,10 +0,0 @@
-1. **Sprout Farm** - 强调萌芽和成长的主题。
-2. **Blossom Acres** - 带有一种繁荣和丰收的感觉。
-3. **Seedling Valley** - 体现出种子发芽和成长的意象。
-4. **Blooming Fields** - 描绘出一片生机勃勃的田野。
-5. **Harvest Haven** - 突出丰收和宁静的避风港。
-6. **Green Sprouts** - 强调绿色和生态的主题。
-7. **Budding Grove** - 表现出萌芽和新生的活力。
-8. **Sprout Sanctuary** - 描述一个充满生命力的避难所。
-9. **Thrive Farmstead** - 强调繁荣和成长。
-10. **Sprout Haven** - 结合萌芽和避风港的概念。
diff --git a/android/build/AndroidManifest.xml b/android/build/AndroidManifest.xml
deleted file mode 100644
index 27c19fb..0000000
--- a/android/build/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/build/res/xml/network_security_config.xml b/android/build/res/xml/network_security_config.xml
deleted file mode 100644
index 61afc28..0000000
--- a/android/build/res/xml/network_security_config.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- 192.168.1.110
- 127.0.0.1
- localhost
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/assets/GUI/点赞图标.png b/assets/GUI/点赞图标.png
new file mode 100644
index 0000000..ae9f916
Binary files /dev/null and b/assets/GUI/点赞图标.png differ
diff --git a/assets/GUI/点赞图标.png.import b/assets/GUI/点赞图标.png.import
new file mode 100644
index 0000000..4f40b09
--- /dev/null
+++ b/assets/GUI/点赞图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://mkqcp7mn2b0o"
+path="res://.godot/imported/点赞图标.png-96297f38fbf5d461e9d199ab8d89c298.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/GUI/点赞图标.png"
+dest_files=["res://.godot/imported/点赞图标.png-96297f38fbf5d461e9d199ab8d89c298.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/GUI/玩家数图标.png b/assets/GUI/玩家数图标.png
new file mode 100644
index 0000000..20ec558
Binary files /dev/null and b/assets/GUI/玩家数图标.png differ
diff --git a/assets/GUI/玩家数图标.png.import b/assets/GUI/玩家数图标.png.import
new file mode 100644
index 0000000..546a3c0
--- /dev/null
+++ b/assets/GUI/玩家数图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bky1j7qmbnmlx"
+path="res://.godot/imported/玩家数图标.png-8997c76f6c509dcbfb1a23694c0a73df.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/GUI/玩家数图标.png"
+dest_files=["res://.godot/imported/玩家数图标.png-8997c76f6c509dcbfb1a23694c0a73df.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/c70d56.png b/assets/Test/c70d56.png
similarity index 100%
rename from assets/c70d56.png
rename to assets/Test/c70d56.png
diff --git a/assets/作物/甘蔗/5.png.import b/assets/Test/c70d56.png.import
similarity index 75%
rename from assets/作物/甘蔗/5.png.import
rename to assets/Test/c70d56.png.import
index 0e9daf8..b0f756b 100644
--- a/assets/作物/甘蔗/5.png.import
+++ b/assets/Test/c70d56.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://cu77eb1n85776"
-path="res://.godot/imported/5.png-e26199746f61239a03e13da812bb2c8e.ctex"
+uid="uid://ifyhhbct23mk"
+path="res://.godot/imported/c70d56.png-7174862782a93933cd22e042d5be8ec8.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/作物/甘蔗/5.png"
-dest_files=["res://.godot/imported/5.png-e26199746f61239a03e13da812bb2c8e.ctex"]
+source_file="res://assets/Test/c70d56.png"
+dest_files=["res://.godot/imported/c70d56.png-7174862782a93933cd22e042d5be8ec8.ctex"]
[params]
diff --git a/assets/UI/QQ群.jpg b/assets/UI/QQ群.jpg
new file mode 100644
index 0000000..613bf93
Binary files /dev/null and b/assets/UI/QQ群.jpg differ
diff --git a/assets/c70d56.png.import b/assets/UI/QQ群.jpg.import
similarity index 69%
rename from assets/c70d56.png.import
rename to assets/UI/QQ群.jpg.import
index 7777351..3588eac 100644
--- a/assets/c70d56.png.import
+++ b/assets/UI/QQ群.jpg.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://ifyhhbct23mk"
-path="res://.godot/imported/c70d56.png-d78d984f7c4168eec78b8461caaf33c5.ctex"
+uid="uid://cuuqapjbrsdy7"
+path="res://.godot/imported/QQ群.jpg-9c7839635bdf98f3e20a35a794fdcff5.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/c70d56.png"
-dest_files=["res://.godot/imported/c70d56.png-d78d984f7c4168eec78b8461caaf33c5.ctex"]
+source_file="res://assets/UI/QQ群.jpg"
+dest_files=["res://.godot/imported/QQ群.jpg-9c7839635bdf98f3e20a35a794fdcff5.ctex"]
[params]
diff --git a/assets/background1.jpg b/assets/UI/背景1.jpg
similarity index 100%
rename from assets/background1.jpg
rename to assets/UI/背景1.jpg
diff --git a/assets/logo.png.import b/assets/UI/背景1.jpg.import
similarity index 69%
rename from assets/logo.png.import
rename to assets/UI/背景1.jpg.import
index f8d4595..3d6e84a 100644
--- a/assets/logo.png.import
+++ b/assets/UI/背景1.jpg.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://e4oyt5ubyyoa"
-path="res://.godot/imported/logo.png-e2220799298e3631eb0e245316e0501a.ctex"
+uid="uid://bhdqkhf0y2ply"
+path="res://.godot/imported/背景1.jpg-5621554ca251d088e7449217c1f7dfd5.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/logo.png"
-dest_files=["res://.godot/imported/logo.png-e2220799298e3631eb0e245316e0501a.ctex"]
+source_file="res://assets/UI/背景1.jpg"
+dest_files=["res://.godot/imported/背景1.jpg-5621554ca251d088e7449217c1f7dfd5.ctex"]
[params]
diff --git a/assets/backgrounds/background1.jpg b/assets/backgrounds/background1.jpg
new file mode 100644
index 0000000..e2d0fce
Binary files /dev/null and b/assets/backgrounds/background1.jpg differ
diff --git a/assets/background1.jpg.import b/assets/backgrounds/background1.jpg.import
similarity index 70%
rename from assets/background1.jpg.import
rename to assets/backgrounds/background1.jpg.import
index 323cc5a..dc02367 100644
--- a/assets/background1.jpg.import
+++ b/assets/backgrounds/background1.jpg.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cb83k0nvx8tox"
-path="res://.godot/imported/background1.jpg-f48c6b61852da31f553d6c26788ce9fc.ctex"
+path="res://.godot/imported/background1.jpg-bd4fb4ce86484c99575f6e4e0f2f6a84.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/background1.jpg"
-dest_files=["res://.godot/imported/background1.jpg-f48c6b61852da31f553d6c26788ce9fc.ctex"]
+source_file="res://assets/backgrounds/background1.jpg"
+dest_files=["res://.godot/imported/background1.jpg-bd4fb4ce86484c99575f6e4e0f2f6a84.ctex"]
[params]
diff --git a/assets/background2.jpg b/assets/backgrounds/background2.jpg
similarity index 100%
rename from assets/background2.jpg
rename to assets/backgrounds/background2.jpg
diff --git a/assets/backgrounds/background2.jpg.import b/assets/backgrounds/background2.jpg.import
new file mode 100644
index 0000000..c96d82f
--- /dev/null
+++ b/assets/backgrounds/background2.jpg.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cbjtfrej7iq3x"
+path="res://.godot/imported/background2.jpg-8a5fb661801e5a0573006815988b1fcb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/backgrounds/background2.jpg"
+dest_files=["res://.godot/imported/background2.jpg-8a5fb661801e5a0573006815988b1fcb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/logo.png b/assets/logo.png
deleted file mode 100644
index 2a0b8e2..0000000
Binary files a/assets/logo.png and /dev/null differ
diff --git a/assets/logo_title/logo1.png b/assets/logo_title/logo1.png
new file mode 100644
index 0000000..a6967a9
Binary files /dev/null and b/assets/logo_title/logo1.png differ
diff --git a/assets/logo_title/logo1.png.import b/assets/logo_title/logo1.png.import
new file mode 100644
index 0000000..d3c693d
--- /dev/null
+++ b/assets/logo_title/logo1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://4kvddwqlodpg"
+path="res://.godot/imported/logo1.png-721692e029f7ee9c81431b6ad3b76c3f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/logo_title/logo1.png"
+dest_files=["res://.godot/imported/logo1.png-721692e029f7ee9c81431b6ad3b76c3f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/logo_title/logo2.png b/assets/logo_title/logo2.png
new file mode 100644
index 0000000..651367b
Binary files /dev/null and b/assets/logo_title/logo2.png differ
diff --git a/assets/logo_title/logo2.png.import b/assets/logo_title/logo2.png.import
new file mode 100644
index 0000000..93c790c
--- /dev/null
+++ b/assets/logo_title/logo2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bqxg8kcfs0gnx"
+path="res://.godot/imported/logo2.png-1428c222d407503e303e983359f96784.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/logo_title/logo2.png"
+dest_files=["res://.godot/imported/logo2.png-1428c222d407503e303e983359f96784.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/logo_title/logo3.png b/assets/logo_title/logo3.png
new file mode 100644
index 0000000..0066a15
Binary files /dev/null and b/assets/logo_title/logo3.png differ
diff --git a/assets/logo_title/logo3.png.import b/assets/logo_title/logo3.png.import
new file mode 100644
index 0000000..d41fe00
--- /dev/null
+++ b/assets/logo_title/logo3.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4pla1twkbgk7"
+path="res://.godot/imported/logo3.png-7ec909bf53098dd5a0196230b16b02fe.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/logo_title/logo3.png"
+dest_files=["res://.godot/imported/logo3.png-7ec909bf53098dd5a0196230b16b02fe.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/tu3.png.import b/assets/tu3.png.import
deleted file mode 100644
index d31aafd..0000000
--- a/assets/tu3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c4l0qn0p4yav8"
-path="res://.godot/imported/tu3.png-53f50a01a12d698dc896d7552428cb9a.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/tu3.png"
-dest_files=["res://.godot/imported/tu3.png-53f50a01a12d698dc896d7552428cb9a.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/人参/0.png b/assets/作物/人参/0.png
deleted file mode 100644
index 26124c4..0000000
Binary files a/assets/作物/人参/0.png and /dev/null differ
diff --git a/assets/作物/人参/0.png.import b/assets/作物/人参/0.png.import
deleted file mode 100644
index 575f0a2..0000000
--- a/assets/作物/人参/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c461olyam2wi"
-path="res://.godot/imported/0.png-f9b471f54a505f90386a524550e73d6f.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/人参/0.png"
-dest_files=["res://.godot/imported/0.png-f9b471f54a505f90386a524550e73d6f.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/人参/0.webp b/assets/作物/人参/0.webp
new file mode 100644
index 0000000..961b6ce
Binary files /dev/null and b/assets/作物/人参/0.webp differ
diff --git a/assets/作物/人参/1.png b/assets/作物/人参/1.png
deleted file mode 100644
index fce39b8..0000000
Binary files a/assets/作物/人参/1.png and /dev/null differ
diff --git a/assets/作物/人参/1.png.import b/assets/作物/人参/1.png.import
deleted file mode 100644
index 3cd3102..0000000
--- a/assets/作物/人参/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dgvbvhbp3ex3y"
-path="res://.godot/imported/1.png-04bacd437a08646b40fe56ae5ab69ec5.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/人参/1.png"
-dest_files=["res://.godot/imported/1.png-04bacd437a08646b40fe56ae5ab69ec5.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/人参/1.webp b/assets/作物/人参/1.webp
new file mode 100644
index 0000000..53203bc
Binary files /dev/null and b/assets/作物/人参/1.webp differ
diff --git a/assets/作物/人参/2.png b/assets/作物/人参/2.png
deleted file mode 100644
index 7c555d6..0000000
Binary files a/assets/作物/人参/2.png and /dev/null differ
diff --git a/assets/作物/人参/2.png.import b/assets/作物/人参/2.png.import
deleted file mode 100644
index bb1c5f8..0000000
--- a/assets/作物/人参/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bbl4ltdtg2qik"
-path="res://.godot/imported/2.png-d4d2dd76b180838bcbe3877a8a1ab889.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/人参/2.png"
-dest_files=["res://.godot/imported/2.png-d4d2dd76b180838bcbe3877a8a1ab889.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/人参/2.webp b/assets/作物/人参/2.webp
new file mode 100644
index 0000000..7d73a52
Binary files /dev/null and b/assets/作物/人参/2.webp differ
diff --git a/assets/作物/冬虫夏草/0.webp b/assets/作物/冬虫夏草/0.webp
new file mode 100644
index 0000000..d198dc1
Binary files /dev/null and b/assets/作物/冬虫夏草/0.webp differ
diff --git a/assets/作物/冬虫夏草/1.webp b/assets/作物/冬虫夏草/1.webp
new file mode 100644
index 0000000..4807e7e
Binary files /dev/null and b/assets/作物/冬虫夏草/1.webp differ
diff --git a/assets/作物/冬虫夏草/2.webp b/assets/作物/冬虫夏草/2.webp
new file mode 100644
index 0000000..7223f59
Binary files /dev/null and b/assets/作物/冬虫夏草/2.webp differ
diff --git a/assets/作物/冬虫夏草/3.webp b/assets/作物/冬虫夏草/3.webp
new file mode 100644
index 0000000..c4afe4e
Binary files /dev/null and b/assets/作物/冬虫夏草/3.webp differ
diff --git a/assets/作物/冬虫夏草/4.webp b/assets/作物/冬虫夏草/4.webp
new file mode 100644
index 0000000..5f1b5e7
Binary files /dev/null and b/assets/作物/冬虫夏草/4.webp differ
diff --git a/assets/作物/南瓜/0.png b/assets/作物/南瓜/0.png
deleted file mode 100644
index 7b453e4..0000000
Binary files a/assets/作物/南瓜/0.png and /dev/null differ
diff --git a/assets/作物/南瓜/0.png.import b/assets/作物/南瓜/0.png.import
deleted file mode 100644
index 4816621..0000000
--- a/assets/作物/南瓜/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://desmvugebvk8t"
-path="res://.godot/imported/0.png-8e55385de1b1b62059f050bb8ea68ed5.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/0.png"
-dest_files=["res://.godot/imported/0.png-8e55385de1b1b62059f050bb8ea68ed5.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/0.webp b/assets/作物/南瓜/0.webp
new file mode 100644
index 0000000..adf9806
Binary files /dev/null and b/assets/作物/南瓜/0.webp differ
diff --git a/assets/作物/南瓜/1.png b/assets/作物/南瓜/1.png
deleted file mode 100644
index 05847c2..0000000
Binary files a/assets/作物/南瓜/1.png and /dev/null differ
diff --git a/assets/作物/南瓜/1.png.import b/assets/作物/南瓜/1.png.import
deleted file mode 100644
index 85e6dba..0000000
--- a/assets/作物/南瓜/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c517mqa1e2rxx"
-path="res://.godot/imported/1.png-7a01077c8ecafac4ae20656d56e20ffe.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/1.png"
-dest_files=["res://.godot/imported/1.png-7a01077c8ecafac4ae20656d56e20ffe.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/1.webp b/assets/作物/南瓜/1.webp
new file mode 100644
index 0000000..4d164a0
Binary files /dev/null and b/assets/作物/南瓜/1.webp differ
diff --git a/assets/作物/南瓜/2.png b/assets/作物/南瓜/2.png
deleted file mode 100644
index 0043de7..0000000
Binary files a/assets/作物/南瓜/2.png and /dev/null differ
diff --git a/assets/作物/南瓜/2.png.import b/assets/作物/南瓜/2.png.import
deleted file mode 100644
index c94082d..0000000
--- a/assets/作物/南瓜/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://uu7qg2lbsn7j"
-path="res://.godot/imported/2.png-c787170238d74e6778dad182464e397d.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/2.png"
-dest_files=["res://.godot/imported/2.png-c787170238d74e6778dad182464e397d.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/2.webp b/assets/作物/南瓜/2.webp
new file mode 100644
index 0000000..104b5fd
Binary files /dev/null and b/assets/作物/南瓜/2.webp differ
diff --git a/assets/作物/南瓜/3.png b/assets/作物/南瓜/3.png
deleted file mode 100644
index 24bd540..0000000
Binary files a/assets/作物/南瓜/3.png and /dev/null differ
diff --git a/assets/作物/南瓜/3.png.import b/assets/作物/南瓜/3.png.import
deleted file mode 100644
index ab1d2e4..0000000
--- a/assets/作物/南瓜/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b63b4giyj7744"
-path="res://.godot/imported/3.png-4d2c8278cc86a5936da0375fffb82b98.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/3.png"
-dest_files=["res://.godot/imported/3.png-4d2c8278cc86a5936da0375fffb82b98.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/3.webp b/assets/作物/南瓜/3.webp
new file mode 100644
index 0000000..3b62f5a
Binary files /dev/null and b/assets/作物/南瓜/3.webp differ
diff --git a/assets/作物/南瓜/4.png b/assets/作物/南瓜/4.png
deleted file mode 100644
index 977d4da..0000000
Binary files a/assets/作物/南瓜/4.png and /dev/null differ
diff --git a/assets/作物/南瓜/4.png.import b/assets/作物/南瓜/4.png.import
deleted file mode 100644
index ac816cf..0000000
--- a/assets/作物/南瓜/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b3spmtgjfca3v"
-path="res://.godot/imported/4.png-046eacbe6c6f135740311e69bd45add2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/4.png"
-dest_files=["res://.godot/imported/4.png-046eacbe6c6f135740311e69bd45add2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/4.webp b/assets/作物/南瓜/4.webp
new file mode 100644
index 0000000..91b0035
Binary files /dev/null and b/assets/作物/南瓜/4.webp differ
diff --git a/assets/作物/南瓜/5.png b/assets/作物/南瓜/5.png
deleted file mode 100644
index ee8a307..0000000
Binary files a/assets/作物/南瓜/5.png and /dev/null differ
diff --git a/assets/作物/南瓜/5.png.import b/assets/作物/南瓜/5.png.import
deleted file mode 100644
index d030ded..0000000
--- a/assets/作物/南瓜/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bn765xfusuncp"
-path="res://.godot/imported/5.png-ab96c7c6bf55d4f99e046c6517630f8b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/5.png"
-dest_files=["res://.godot/imported/5.png-ab96c7c6bf55d4f99e046c6517630f8b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/5.webp b/assets/作物/南瓜/5.webp
new file mode 100644
index 0000000..5c45a7c
Binary files /dev/null and b/assets/作物/南瓜/5.webp differ
diff --git a/assets/作物/南瓜/6.png b/assets/作物/南瓜/6.png
deleted file mode 100644
index 1757ee5..0000000
Binary files a/assets/作物/南瓜/6.png and /dev/null differ
diff --git a/assets/作物/南瓜/6.png.import b/assets/作物/南瓜/6.png.import
deleted file mode 100644
index 3a9ecb9..0000000
--- a/assets/作物/南瓜/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://l18q56u3q4tj"
-path="res://.godot/imported/6.png-0b475c643db46b9db1d445fe4df0abf1.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/南瓜/6.png"
-dest_files=["res://.godot/imported/6.png-0b475c643db46b9db1d445fe4df0abf1.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/南瓜/6.webp b/assets/作物/南瓜/6.webp
new file mode 100644
index 0000000..50bb2ab
Binary files /dev/null and b/assets/作物/南瓜/6.webp differ
diff --git a/assets/作物/向日葵/0.webp b/assets/作物/向日葵/0.webp
new file mode 100644
index 0000000..0ffff0a
Binary files /dev/null and b/assets/作物/向日葵/0.webp differ
diff --git a/assets/作物/向日葵/1.webp b/assets/作物/向日葵/1.webp
new file mode 100644
index 0000000..ae62212
Binary files /dev/null and b/assets/作物/向日葵/1.webp differ
diff --git a/assets/作物/向日葵/2.webp b/assets/作物/向日葵/2.webp
new file mode 100644
index 0000000..1398510
Binary files /dev/null and b/assets/作物/向日葵/2.webp differ
diff --git a/assets/作物/向日葵/3.webp b/assets/作物/向日葵/3.webp
new file mode 100644
index 0000000..17563ee
Binary files /dev/null and b/assets/作物/向日葵/3.webp differ
diff --git a/assets/作物/向日葵/4.webp b/assets/作物/向日葵/4.webp
new file mode 100644
index 0000000..daec958
Binary files /dev/null and b/assets/作物/向日葵/4.webp differ
diff --git a/assets/作物/向日葵/5.webp b/assets/作物/向日葵/5.webp
new file mode 100644
index 0000000..abf29a5
Binary files /dev/null and b/assets/作物/向日葵/5.webp differ
diff --git a/assets/作物/向日葵/6.webp b/assets/作物/向日葵/6.webp
new file mode 100644
index 0000000..4ceefab
Binary files /dev/null and b/assets/作物/向日葵/6.webp differ
diff --git a/assets/作物/哈密瓜/0.webp b/assets/作物/哈密瓜/0.webp
new file mode 100644
index 0000000..1251624
Binary files /dev/null and b/assets/作物/哈密瓜/0.webp differ
diff --git a/assets/作物/哈密瓜/1.webp b/assets/作物/哈密瓜/1.webp
new file mode 100644
index 0000000..e3ecdd7
Binary files /dev/null and b/assets/作物/哈密瓜/1.webp differ
diff --git a/assets/作物/哈密瓜/2.webp b/assets/作物/哈密瓜/2.webp
new file mode 100644
index 0000000..6f12379
Binary files /dev/null and b/assets/作物/哈密瓜/2.webp differ
diff --git a/assets/作物/哈密瓜/3.webp b/assets/作物/哈密瓜/3.webp
new file mode 100644
index 0000000..aa84c26
Binary files /dev/null and b/assets/作物/哈密瓜/3.webp differ
diff --git a/assets/作物/哈密瓜/4.webp b/assets/作物/哈密瓜/4.webp
new file mode 100644
index 0000000..a414781
Binary files /dev/null and b/assets/作物/哈密瓜/4.webp differ
diff --git a/assets/作物/土豆/0.png b/assets/作物/土豆/0.png
deleted file mode 100644
index 885f567..0000000
Binary files a/assets/作物/土豆/0.png and /dev/null differ
diff --git a/assets/作物/土豆/0.png.import b/assets/作物/土豆/0.png.import
deleted file mode 100644
index a008355..0000000
--- a/assets/作物/土豆/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://d0nes14soyvc8"
-path="res://.godot/imported/0.png-a4b8f3cc539e989a7c84098f47a7f71b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/土豆/0.png"
-dest_files=["res://.godot/imported/0.png-a4b8f3cc539e989a7c84098f47a7f71b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/土豆/0.webp b/assets/作物/土豆/0.webp
new file mode 100644
index 0000000..acc0fe1
Binary files /dev/null and b/assets/作物/土豆/0.webp differ
diff --git a/assets/作物/土豆/1.png b/assets/作物/土豆/1.png
deleted file mode 100644
index 567d1cc..0000000
Binary files a/assets/作物/土豆/1.png and /dev/null differ
diff --git a/assets/作物/土豆/1.png.import b/assets/作物/土豆/1.png.import
deleted file mode 100644
index 0b2eb6a..0000000
--- a/assets/作物/土豆/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://jbm6pc813lg6"
-path="res://.godot/imported/1.png-92385bb34c5493275c11aa146c34f092.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/土豆/1.png"
-dest_files=["res://.godot/imported/1.png-92385bb34c5493275c11aa146c34f092.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/土豆/1.webp b/assets/作物/土豆/1.webp
new file mode 100644
index 0000000..618cca8
Binary files /dev/null and b/assets/作物/土豆/1.webp differ
diff --git a/assets/作物/土豆/2.png b/assets/作物/土豆/2.png
deleted file mode 100644
index 1625486..0000000
Binary files a/assets/作物/土豆/2.png and /dev/null differ
diff --git a/assets/作物/土豆/2.png.import b/assets/作物/土豆/2.png.import
deleted file mode 100644
index a4d7fef..0000000
--- a/assets/作物/土豆/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://e2qlfv277txk"
-path="res://.godot/imported/2.png-46e3b23d3a7b1f6af3c3efdd41898eef.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/土豆/2.png"
-dest_files=["res://.godot/imported/2.png-46e3b23d3a7b1f6af3c3efdd41898eef.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/土豆/2.webp b/assets/作物/土豆/2.webp
new file mode 100644
index 0000000..b09076f
Binary files /dev/null and b/assets/作物/土豆/2.webp differ
diff --git a/assets/作物/土豆/3.png b/assets/作物/土豆/3.png
deleted file mode 100644
index 7881f20..0000000
Binary files a/assets/作物/土豆/3.png and /dev/null differ
diff --git a/assets/作物/土豆/3.png.import b/assets/作物/土豆/3.png.import
deleted file mode 100644
index 393657b..0000000
--- a/assets/作物/土豆/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cefnaf01skn1v"
-path="res://.godot/imported/3.png-0d45ce6e437eb227fdb76a221c8119ae.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/土豆/3.png"
-dest_files=["res://.godot/imported/3.png-0d45ce6e437eb227fdb76a221c8119ae.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/土豆/3.webp b/assets/作物/土豆/3.webp
new file mode 100644
index 0000000..33d9517
Binary files /dev/null and b/assets/作物/土豆/3.webp differ
diff --git a/assets/作物/土豆/4.png b/assets/作物/土豆/4.png
deleted file mode 100644
index 4c15910..0000000
Binary files a/assets/作物/土豆/4.png and /dev/null differ
diff --git a/assets/作物/土豆/4.png.import b/assets/作物/土豆/4.png.import
deleted file mode 100644
index 9528d05..0000000
--- a/assets/作物/土豆/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dfqqeais1e0hl"
-path="res://.godot/imported/4.png-039ea98816a21347599d6c6c8098f9d0.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/土豆/4.png"
-dest_files=["res://.godot/imported/4.png-039ea98816a21347599d6c6c8098f9d0.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/土豆/4.webp b/assets/作物/土豆/4.webp
new file mode 100644
index 0000000..7dd153e
Binary files /dev/null and b/assets/作物/土豆/4.webp differ
diff --git a/assets/作物/大白菜/0.webp b/assets/作物/大白菜/0.webp
new file mode 100644
index 0000000..ca45f11
Binary files /dev/null and b/assets/作物/大白菜/0.webp differ
diff --git a/assets/作物/大白菜/1.webp b/assets/作物/大白菜/1.webp
new file mode 100644
index 0000000..5125506
Binary files /dev/null and b/assets/作物/大白菜/1.webp differ
diff --git a/assets/作物/大白菜/2.webp b/assets/作物/大白菜/2.webp
new file mode 100644
index 0000000..fa9ede5
Binary files /dev/null and b/assets/作物/大白菜/2.webp differ
diff --git a/assets/作物/大白菜/3.webp b/assets/作物/大白菜/3.webp
new file mode 100644
index 0000000..19ab9d3
Binary files /dev/null and b/assets/作物/大白菜/3.webp differ
diff --git a/assets/作物/大白菜/4.webp b/assets/作物/大白菜/4.webp
new file mode 100644
index 0000000..a2bca0e
Binary files /dev/null and b/assets/作物/大白菜/4.webp differ
diff --git a/assets/作物/大白菜/5.webp b/assets/作物/大白菜/5.webp
new file mode 100644
index 0000000..8a3f34b
Binary files /dev/null and b/assets/作物/大白菜/5.webp differ
diff --git a/assets/作物/大豆/0.png b/assets/作物/大豆/0.png
deleted file mode 100644
index 64d30dd..0000000
Binary files a/assets/作物/大豆/0.png and /dev/null differ
diff --git a/assets/作物/大豆/0.png.import b/assets/作物/大豆/0.png.import
deleted file mode 100644
index d483652..0000000
--- a/assets/作物/大豆/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://7aje85pdipi"
-path="res://.godot/imported/0.png-36baec312b6e724c9039802a43ae1c7b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/大豆/0.png"
-dest_files=["res://.godot/imported/0.png-36baec312b6e724c9039802a43ae1c7b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/大豆/0.webp b/assets/作物/大豆/0.webp
new file mode 100644
index 0000000..03243c7
Binary files /dev/null and b/assets/作物/大豆/0.webp differ
diff --git a/assets/作物/大豆/1.png b/assets/作物/大豆/1.png
deleted file mode 100644
index 5646cef..0000000
Binary files a/assets/作物/大豆/1.png and /dev/null differ
diff --git a/assets/作物/大豆/1.png.import b/assets/作物/大豆/1.png.import
deleted file mode 100644
index afa5171..0000000
--- a/assets/作物/大豆/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cfbxa2n322pa5"
-path="res://.godot/imported/1.png-49cf2ad5356dcb7c6ba0ac6c8d868699.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/大豆/1.png"
-dest_files=["res://.godot/imported/1.png-49cf2ad5356dcb7c6ba0ac6c8d868699.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/大豆/1.webp b/assets/作物/大豆/1.webp
new file mode 100644
index 0000000..1204ad6
Binary files /dev/null and b/assets/作物/大豆/1.webp differ
diff --git a/assets/作物/大豆/2.png b/assets/作物/大豆/2.png
deleted file mode 100644
index f669377..0000000
Binary files a/assets/作物/大豆/2.png and /dev/null differ
diff --git a/assets/作物/大豆/2.png.import b/assets/作物/大豆/2.png.import
deleted file mode 100644
index 1e0715f..0000000
--- a/assets/作物/大豆/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://db37kli4ar0nq"
-path="res://.godot/imported/2.png-10cc11dee3ee978bfa9fd59cb8ef9cc7.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/大豆/2.png"
-dest_files=["res://.godot/imported/2.png-10cc11dee3ee978bfa9fd59cb8ef9cc7.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/大豆/2.webp b/assets/作物/大豆/2.webp
new file mode 100644
index 0000000..38a0a9a
Binary files /dev/null and b/assets/作物/大豆/2.webp differ
diff --git a/assets/作物/大豆/3.png b/assets/作物/大豆/3.png
deleted file mode 100644
index 0036a6f..0000000
Binary files a/assets/作物/大豆/3.png and /dev/null differ
diff --git a/assets/作物/大豆/3.png.import b/assets/作物/大豆/3.png.import
deleted file mode 100644
index 461e6e6..0000000
--- a/assets/作物/大豆/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://epkjx5obqgrm"
-path="res://.godot/imported/3.png-d401a7ac75820003830a36637e95bc32.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/大豆/3.png"
-dest_files=["res://.godot/imported/3.png-d401a7ac75820003830a36637e95bc32.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/大豆/3.webp b/assets/作物/大豆/3.webp
new file mode 100644
index 0000000..1cdb0f7
Binary files /dev/null and b/assets/作物/大豆/3.webp differ
diff --git a/assets/作物/大豆/4.png b/assets/作物/大豆/4.png
deleted file mode 100644
index 01e07f8..0000000
Binary files a/assets/作物/大豆/4.png and /dev/null differ
diff --git a/assets/作物/大豆/4.png.import b/assets/作物/大豆/4.png.import
deleted file mode 100644
index 74bff1b..0000000
--- a/assets/作物/大豆/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://thshoto1l280"
-path="res://.godot/imported/4.png-aaa66345cdf1a7496ba65c1cfeba266f.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/大豆/4.png"
-dest_files=["res://.godot/imported/4.png-aaa66345cdf1a7496ba65c1cfeba266f.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/大豆/4.webp b/assets/作物/大豆/4.webp
new file mode 100644
index 0000000..18f0f1d
Binary files /dev/null and b/assets/作物/大豆/4.webp differ
diff --git a/assets/作物/富贵竹/0.webp b/assets/作物/富贵竹/0.webp
new file mode 100644
index 0000000..09bef0b
Binary files /dev/null and b/assets/作物/富贵竹/0.webp differ
diff --git a/assets/作物/富贵竹/1.webp b/assets/作物/富贵竹/1.webp
new file mode 100644
index 0000000..1e37a73
Binary files /dev/null and b/assets/作物/富贵竹/1.webp differ
diff --git a/assets/作物/富贵竹/2.webp b/assets/作物/富贵竹/2.webp
new file mode 100644
index 0000000..47308a6
Binary files /dev/null and b/assets/作物/富贵竹/2.webp differ
diff --git a/assets/作物/富贵竹/3.webp b/assets/作物/富贵竹/3.webp
new file mode 100644
index 0000000..2675a7f
Binary files /dev/null and b/assets/作物/富贵竹/3.webp differ
diff --git a/assets/作物/富贵竹/4.webp b/assets/作物/富贵竹/4.webp
new file mode 100644
index 0000000..b2fd09b
Binary files /dev/null and b/assets/作物/富贵竹/4.webp differ
diff --git a/assets/作物/富贵竹/5.webp b/assets/作物/富贵竹/5.webp
new file mode 100644
index 0000000..a70a669
Binary files /dev/null and b/assets/作物/富贵竹/5.webp differ
diff --git a/assets/作物/小麦/0.png b/assets/作物/小麦/0.png
deleted file mode 100644
index f044a47..0000000
Binary files a/assets/作物/小麦/0.png and /dev/null differ
diff --git a/assets/作物/小麦/0.png.import b/assets/作物/小麦/0.png.import
deleted file mode 100644
index 0171da9..0000000
--- a/assets/作物/小麦/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dp72gv5qhapwh"
-path="res://.godot/imported/0.png-2d2590663fae9927d0b175cf83a2c785.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/0.png"
-dest_files=["res://.godot/imported/0.png-2d2590663fae9927d0b175cf83a2c785.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/0.webp b/assets/作物/小麦/0.webp
new file mode 100644
index 0000000..a3e1776
Binary files /dev/null and b/assets/作物/小麦/0.webp differ
diff --git a/assets/作物/小麦/1.png b/assets/作物/小麦/1.png
deleted file mode 100644
index f044a47..0000000
Binary files a/assets/作物/小麦/1.png and /dev/null differ
diff --git a/assets/作物/小麦/1.png.import b/assets/作物/小麦/1.png.import
deleted file mode 100644
index 2e858f2..0000000
--- a/assets/作物/小麦/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bwrekiagqxbfj"
-path="res://.godot/imported/1.png-e55314fa79010f274c863f7fe31ac103.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/1.png"
-dest_files=["res://.godot/imported/1.png-e55314fa79010f274c863f7fe31ac103.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/1.webp b/assets/作物/小麦/1.webp
new file mode 100644
index 0000000..a3e1776
Binary files /dev/null and b/assets/作物/小麦/1.webp differ
diff --git a/assets/作物/小麦/2.png b/assets/作物/小麦/2.png
deleted file mode 100644
index 0e6cd75..0000000
Binary files a/assets/作物/小麦/2.png and /dev/null differ
diff --git a/assets/作物/小麦/2.png.import b/assets/作物/小麦/2.png.import
deleted file mode 100644
index f82402a..0000000
--- a/assets/作物/小麦/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dki15p22wv55e"
-path="res://.godot/imported/2.png-0cc2659ba8a739a50969aff9a360c523.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/2.png"
-dest_files=["res://.godot/imported/2.png-0cc2659ba8a739a50969aff9a360c523.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/2.webp b/assets/作物/小麦/2.webp
new file mode 100644
index 0000000..9f61f0f
Binary files /dev/null and b/assets/作物/小麦/2.webp differ
diff --git a/assets/作物/小麦/3.png b/assets/作物/小麦/3.png
deleted file mode 100644
index 5ddf083..0000000
Binary files a/assets/作物/小麦/3.png and /dev/null differ
diff --git a/assets/作物/小麦/3.png.import b/assets/作物/小麦/3.png.import
deleted file mode 100644
index 0a5b90c..0000000
--- a/assets/作物/小麦/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b42vuqmadb7rk"
-path="res://.godot/imported/3.png-8963398665c35bd98bf07e697cdf8ba2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/3.png"
-dest_files=["res://.godot/imported/3.png-8963398665c35bd98bf07e697cdf8ba2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/3.webp b/assets/作物/小麦/3.webp
new file mode 100644
index 0000000..99dc1b8
Binary files /dev/null and b/assets/作物/小麦/3.webp differ
diff --git a/assets/作物/小麦/4.png b/assets/作物/小麦/4.png
deleted file mode 100644
index a11c8e5..0000000
Binary files a/assets/作物/小麦/4.png and /dev/null differ
diff --git a/assets/作物/小麦/4.png.import b/assets/作物/小麦/4.png.import
deleted file mode 100644
index 95740bc..0000000
--- a/assets/作物/小麦/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://jhn2jmc36g1t"
-path="res://.godot/imported/4.png-f16c75249dc9b772dc9383d5f9abdd94.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/4.png"
-dest_files=["res://.godot/imported/4.png-f16c75249dc9b772dc9383d5f9abdd94.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/4.webp b/assets/作物/小麦/4.webp
new file mode 100644
index 0000000..3ba2c46
Binary files /dev/null and b/assets/作物/小麦/4.webp differ
diff --git a/assets/作物/小麦/5.png b/assets/作物/小麦/5.png
deleted file mode 100644
index 1c9b940..0000000
Binary files a/assets/作物/小麦/5.png and /dev/null differ
diff --git a/assets/作物/小麦/5.png.import b/assets/作物/小麦/5.png.import
deleted file mode 100644
index 01f2cd8..0000000
--- a/assets/作物/小麦/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dcjlys86af0f4"
-path="res://.godot/imported/5.png-92f8d5f1a8a7f6310a098ae5b17d62a5.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/5.png"
-dest_files=["res://.godot/imported/5.png-92f8d5f1a8a7f6310a098ae5b17d62a5.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/5.webp b/assets/作物/小麦/5.webp
new file mode 100644
index 0000000..1024f3e
Binary files /dev/null and b/assets/作物/小麦/5.webp differ
diff --git a/assets/作物/小麦/6.png b/assets/作物/小麦/6.png
deleted file mode 100644
index 3ccf375..0000000
Binary files a/assets/作物/小麦/6.png and /dev/null differ
diff --git a/assets/作物/小麦/6.png.import b/assets/作物/小麦/6.png.import
deleted file mode 100644
index 877e194..0000000
--- a/assets/作物/小麦/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bmsqn6gpgf8f"
-path="res://.godot/imported/6.png-21260edca0af002457a3d9821a525cfb.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/6.png"
-dest_files=["res://.godot/imported/6.png-21260edca0af002457a3d9821a525cfb.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/6.webp b/assets/作物/小麦/6.webp
new file mode 100644
index 0000000..c30f7d9
Binary files /dev/null and b/assets/作物/小麦/6.webp differ
diff --git a/assets/作物/小麦/7.png b/assets/作物/小麦/7.png
deleted file mode 100644
index a54448c..0000000
Binary files a/assets/作物/小麦/7.png and /dev/null differ
diff --git a/assets/作物/小麦/7.png.import b/assets/作物/小麦/7.png.import
deleted file mode 100644
index 99d068e..0000000
--- a/assets/作物/小麦/7.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ffc0tm6tiael"
-path="res://.godot/imported/7.png-92156afa090da6d9caa778b80138e5c1.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/7.png"
-dest_files=["res://.godot/imported/7.png-92156afa090da6d9caa778b80138e5c1.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/7.webp b/assets/作物/小麦/7.webp
new file mode 100644
index 0000000..5a108d1
Binary files /dev/null and b/assets/作物/小麦/7.webp differ
diff --git a/assets/作物/小麦/8.png b/assets/作物/小麦/8.png
deleted file mode 100644
index 3ffe9ff..0000000
Binary files a/assets/作物/小麦/8.png and /dev/null differ
diff --git a/assets/作物/小麦/8.png.import b/assets/作物/小麦/8.png.import
deleted file mode 100644
index bd4f2e0..0000000
--- a/assets/作物/小麦/8.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dgh0yjpehos7a"
-path="res://.godot/imported/8.png-1288b5cc2305acbd042e24d254e316e2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/小麦/8.png"
-dest_files=["res://.godot/imported/8.png-1288b5cc2305acbd042e24d254e316e2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/小麦/8.webp b/assets/作物/小麦/8.webp
new file mode 100644
index 0000000..b99a4a5
Binary files /dev/null and b/assets/作物/小麦/8.webp differ
diff --git a/assets/作物/山葵/0.webp b/assets/作物/山葵/0.webp
new file mode 100644
index 0000000..f168b10
Binary files /dev/null and b/assets/作物/山葵/0.webp differ
diff --git a/assets/作物/山葵/1.webp b/assets/作物/山葵/1.webp
new file mode 100644
index 0000000..8b7631b
Binary files /dev/null and b/assets/作物/山葵/1.webp differ
diff --git a/assets/作物/山葵/2.webp b/assets/作物/山葵/2.webp
new file mode 100644
index 0000000..a35da75
Binary files /dev/null and b/assets/作物/山葵/2.webp differ
diff --git a/assets/作物/山葵/3.webp b/assets/作物/山葵/3.webp
new file mode 100644
index 0000000..d52acd6
Binary files /dev/null and b/assets/作物/山葵/3.webp differ
diff --git a/assets/作物/山葵/4.webp b/assets/作物/山葵/4.webp
new file mode 100644
index 0000000..5f43412
Binary files /dev/null and b/assets/作物/山葵/4.webp differ
diff --git a/assets/作物/杂交树1/0.webp b/assets/作物/杂交树1/0.webp
new file mode 100644
index 0000000..8603145
Binary files /dev/null and b/assets/作物/杂交树1/0.webp differ
diff --git a/assets/作物/杂交树1/1.webp b/assets/作物/杂交树1/1.webp
new file mode 100644
index 0000000..e9ee6ba
Binary files /dev/null and b/assets/作物/杂交树1/1.webp differ
diff --git a/assets/作物/杂交树1/2.webp b/assets/作物/杂交树1/2.webp
new file mode 100644
index 0000000..579a9e5
Binary files /dev/null and b/assets/作物/杂交树1/2.webp differ
diff --git a/assets/作物/杂交树1/3.webp b/assets/作物/杂交树1/3.webp
new file mode 100644
index 0000000..7b3bfdb
Binary files /dev/null and b/assets/作物/杂交树1/3.webp differ
diff --git a/assets/作物/杂交树1/4.webp b/assets/作物/杂交树1/4.webp
new file mode 100644
index 0000000..bab3ec3
Binary files /dev/null and b/assets/作物/杂交树1/4.webp differ
diff --git a/assets/作物/杂交树2/0.webp b/assets/作物/杂交树2/0.webp
new file mode 100644
index 0000000..2575caf
Binary files /dev/null and b/assets/作物/杂交树2/0.webp differ
diff --git a/assets/作物/杂交树2/1.webp b/assets/作物/杂交树2/1.webp
new file mode 100644
index 0000000..9af2fee
Binary files /dev/null and b/assets/作物/杂交树2/1.webp differ
diff --git a/assets/作物/杂交树2/2.webp b/assets/作物/杂交树2/2.webp
new file mode 100644
index 0000000..fac9219
Binary files /dev/null and b/assets/作物/杂交树2/2.webp differ
diff --git a/assets/作物/杂交树2/3.webp b/assets/作物/杂交树2/3.webp
new file mode 100644
index 0000000..7d48a37
Binary files /dev/null and b/assets/作物/杂交树2/3.webp differ
diff --git a/assets/作物/杂交树2/4.webp b/assets/作物/杂交树2/4.webp
new file mode 100644
index 0000000..8a419be
Binary files /dev/null and b/assets/作物/杂交树2/4.webp differ
diff --git a/assets/作物/松露/0.png b/assets/作物/松露/0.png
deleted file mode 100644
index 5477b1e..0000000
Binary files a/assets/作物/松露/0.png and /dev/null differ
diff --git a/assets/作物/松露/0.png.import b/assets/作物/松露/0.png.import
deleted file mode 100644
index b2389f6..0000000
--- a/assets/作物/松露/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://2iqortyxjwn7"
-path="res://.godot/imported/0.png-d68c88d4dfb4d8ec045b4c2bccc14f10.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/松露/0.png"
-dest_files=["res://.godot/imported/0.png-d68c88d4dfb4d8ec045b4c2bccc14f10.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/松露/0.webp b/assets/作物/松露/0.webp
new file mode 100644
index 0000000..599e48e
Binary files /dev/null and b/assets/作物/松露/0.webp differ
diff --git a/assets/作物/松露/1.png b/assets/作物/松露/1.png
deleted file mode 100644
index abce413..0000000
Binary files a/assets/作物/松露/1.png and /dev/null differ
diff --git a/assets/作物/松露/1.png.import b/assets/作物/松露/1.png.import
deleted file mode 100644
index 4ab5799..0000000
--- a/assets/作物/松露/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b6ri45r31yogd"
-path="res://.godot/imported/1.png-34e90d925bf822f5c34acba2cfdcd230.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/松露/1.png"
-dest_files=["res://.godot/imported/1.png-34e90d925bf822f5c34acba2cfdcd230.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/松露/1.webp b/assets/作物/松露/1.webp
new file mode 100644
index 0000000..992bf81
Binary files /dev/null and b/assets/作物/松露/1.webp differ
diff --git a/assets/作物/松露/2.png b/assets/作物/松露/2.png
deleted file mode 100644
index 4f8305f..0000000
Binary files a/assets/作物/松露/2.png and /dev/null differ
diff --git a/assets/作物/松露/2.png.import b/assets/作物/松露/2.png.import
deleted file mode 100644
index 541ee35..0000000
--- a/assets/作物/松露/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ss2p3e3tacgq"
-path="res://.godot/imported/2.png-e26cf449a096c167c7cfa4c27748c993.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/松露/2.png"
-dest_files=["res://.godot/imported/2.png-e26cf449a096c167c7cfa4c27748c993.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/松露/2.webp b/assets/作物/松露/2.webp
new file mode 100644
index 0000000..ed4e513
Binary files /dev/null and b/assets/作物/松露/2.webp differ
diff --git a/assets/作物/松露/3.png b/assets/作物/松露/3.png
deleted file mode 100644
index b890dd0..0000000
Binary files a/assets/作物/松露/3.png and /dev/null differ
diff --git a/assets/作物/松露/3.png.import b/assets/作物/松露/3.png.import
deleted file mode 100644
index 7f7970f..0000000
--- a/assets/作物/松露/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dfsij7kyddx7s"
-path="res://.godot/imported/3.png-3f3cd5a4970ad5d3f01e2be87dbcb772.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/松露/3.png"
-dest_files=["res://.godot/imported/3.png-3f3cd5a4970ad5d3f01e2be87dbcb772.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/松露/3.webp b/assets/作物/松露/3.webp
new file mode 100644
index 0000000..c8268ee
Binary files /dev/null and b/assets/作物/松露/3.webp differ
diff --git a/assets/作物/柿子/0.png b/assets/作物/柿子/0.png
deleted file mode 100644
index 0a0effb..0000000
Binary files a/assets/作物/柿子/0.png and /dev/null differ
diff --git a/assets/作物/柿子/0.png.import b/assets/作物/柿子/0.png.import
deleted file mode 100644
index 54831e5..0000000
--- a/assets/作物/柿子/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://1bdju8hro7fe"
-path="res://.godot/imported/0.png-84436ca49602485c6d553b6170037a78.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/0.png"
-dest_files=["res://.godot/imported/0.png-84436ca49602485c6d553b6170037a78.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/0.webp b/assets/作物/柿子/0.webp
new file mode 100644
index 0000000..759354e
Binary files /dev/null and b/assets/作物/柿子/0.webp differ
diff --git a/assets/作物/柿子/1.png b/assets/作物/柿子/1.png
deleted file mode 100644
index f101991..0000000
Binary files a/assets/作物/柿子/1.png and /dev/null differ
diff --git a/assets/作物/柿子/1.png.import b/assets/作物/柿子/1.png.import
deleted file mode 100644
index 12a7a4f..0000000
--- a/assets/作物/柿子/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cd4iqc5qfmnem"
-path="res://.godot/imported/1.png-2b0494cf251d060478396a4298914ac2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/1.png"
-dest_files=["res://.godot/imported/1.png-2b0494cf251d060478396a4298914ac2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/1.webp b/assets/作物/柿子/1.webp
new file mode 100644
index 0000000..c24ff72
Binary files /dev/null and b/assets/作物/柿子/1.webp differ
diff --git a/assets/作物/柿子/2.png b/assets/作物/柿子/2.png
deleted file mode 100644
index 1d127be..0000000
Binary files a/assets/作物/柿子/2.png and /dev/null differ
diff --git a/assets/作物/柿子/2.png.import b/assets/作物/柿子/2.png.import
deleted file mode 100644
index 2302c7c..0000000
--- a/assets/作物/柿子/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dam5eceq280t1"
-path="res://.godot/imported/2.png-1afb16d186fedac6061c7e0dd6e641da.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/2.png"
-dest_files=["res://.godot/imported/2.png-1afb16d186fedac6061c7e0dd6e641da.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/2.webp b/assets/作物/柿子/2.webp
new file mode 100644
index 0000000..66b4ff1
Binary files /dev/null and b/assets/作物/柿子/2.webp differ
diff --git a/assets/作物/柿子/3.png b/assets/作物/柿子/3.png
deleted file mode 100644
index dc4c3b8..0000000
Binary files a/assets/作物/柿子/3.png and /dev/null differ
diff --git a/assets/作物/柿子/3.png.import b/assets/作物/柿子/3.png.import
deleted file mode 100644
index 459635f..0000000
--- a/assets/作物/柿子/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ceuhlgka5j0xj"
-path="res://.godot/imported/3.png-cc19acf0e9bdc68d29cd7fa598cf8b16.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/3.png"
-dest_files=["res://.godot/imported/3.png-cc19acf0e9bdc68d29cd7fa598cf8b16.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/3.webp b/assets/作物/柿子/3.webp
new file mode 100644
index 0000000..ab9f0bd
Binary files /dev/null and b/assets/作物/柿子/3.webp differ
diff --git a/assets/作物/柿子/4.png b/assets/作物/柿子/4.png
deleted file mode 100644
index d372584..0000000
Binary files a/assets/作物/柿子/4.png and /dev/null differ
diff --git a/assets/作物/柿子/4.png.import b/assets/作物/柿子/4.png.import
deleted file mode 100644
index dbc6380..0000000
--- a/assets/作物/柿子/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cfux7p8n6ikv0"
-path="res://.godot/imported/4.png-7b9798902dbe195ec31db41cf8bfc362.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/4.png"
-dest_files=["res://.godot/imported/4.png-7b9798902dbe195ec31db41cf8bfc362.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/4.webp b/assets/作物/柿子/4.webp
new file mode 100644
index 0000000..2e0f6d6
Binary files /dev/null and b/assets/作物/柿子/4.webp differ
diff --git a/assets/作物/柿子/5.png b/assets/作物/柿子/5.png
deleted file mode 100644
index 409f4c2..0000000
Binary files a/assets/作物/柿子/5.png and /dev/null differ
diff --git a/assets/作物/柿子/5.png.import b/assets/作物/柿子/5.png.import
deleted file mode 100644
index ea0aeea..0000000
--- a/assets/作物/柿子/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://qw18flvhbb83"
-path="res://.godot/imported/5.png-2c0aed5ef1e26fbb11fc3977c52d1a5c.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/5.png"
-dest_files=["res://.godot/imported/5.png-2c0aed5ef1e26fbb11fc3977c52d1a5c.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/5.webp b/assets/作物/柿子/5.webp
new file mode 100644
index 0000000..76aeb46
Binary files /dev/null and b/assets/作物/柿子/5.webp differ
diff --git a/assets/作物/柿子/6.png b/assets/作物/柿子/6.png
deleted file mode 100644
index df7f96c..0000000
Binary files a/assets/作物/柿子/6.png and /dev/null differ
diff --git a/assets/作物/柿子/6.png.import b/assets/作物/柿子/6.png.import
deleted file mode 100644
index 753c5ab..0000000
--- a/assets/作物/柿子/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bf6c86rl1c156"
-path="res://.godot/imported/6.png-ef286d075cee59679deb9933db98d984.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/6.png"
-dest_files=["res://.godot/imported/6.png-ef286d075cee59679deb9933db98d984.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/6.webp b/assets/作物/柿子/6.webp
new file mode 100644
index 0000000..d9730e9
Binary files /dev/null and b/assets/作物/柿子/6.webp differ
diff --git a/assets/作物/柿子/7.png b/assets/作物/柿子/7.png
deleted file mode 100644
index bbd571f..0000000
Binary files a/assets/作物/柿子/7.png and /dev/null differ
diff --git a/assets/作物/柿子/7.png.import b/assets/作物/柿子/7.png.import
deleted file mode 100644
index f17b882..0000000
--- a/assets/作物/柿子/7.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dysf87k2r5iib"
-path="res://.godot/imported/7.png-aa0e60cdf1fc01cadd0dd54404ec9e15.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/7.png"
-dest_files=["res://.godot/imported/7.png-aa0e60cdf1fc01cadd0dd54404ec9e15.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/7.webp b/assets/作物/柿子/7.webp
new file mode 100644
index 0000000..b0fedd5
Binary files /dev/null and b/assets/作物/柿子/7.webp differ
diff --git a/assets/作物/柿子/8.png b/assets/作物/柿子/8.png
deleted file mode 100644
index 257b1d7..0000000
Binary files a/assets/作物/柿子/8.png and /dev/null differ
diff --git a/assets/作物/柿子/8.png.import b/assets/作物/柿子/8.png.import
deleted file mode 100644
index 1ac6d01..0000000
--- a/assets/作物/柿子/8.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ckxxdhn1stetn"
-path="res://.godot/imported/8.png-f58de77ea4aaf73748f24ebf1820d1a4.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/柿子/8.png"
-dest_files=["res://.godot/imported/8.png-f58de77ea4aaf73748f24ebf1820d1a4.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/柿子/8.webp b/assets/作物/柿子/8.webp
new file mode 100644
index 0000000..d333fae
Binary files /dev/null and b/assets/作物/柿子/8.webp differ
diff --git a/assets/作物/栀子花/0.webp b/assets/作物/栀子花/0.webp
new file mode 100644
index 0000000..6cca61a
Binary files /dev/null and b/assets/作物/栀子花/0.webp differ
diff --git a/assets/作物/栀子花/1.webp b/assets/作物/栀子花/1.webp
new file mode 100644
index 0000000..72a619e
Binary files /dev/null and b/assets/作物/栀子花/1.webp differ
diff --git a/assets/作物/栀子花/2.webp b/assets/作物/栀子花/2.webp
new file mode 100644
index 0000000..4788447
Binary files /dev/null and b/assets/作物/栀子花/2.webp differ
diff --git a/assets/作物/栀子花/3.webp b/assets/作物/栀子花/3.webp
new file mode 100644
index 0000000..7fd97b7
Binary files /dev/null and b/assets/作物/栀子花/3.webp differ
diff --git a/assets/作物/树莓/0.webp b/assets/作物/树莓/0.webp
new file mode 100644
index 0000000..c1799e1
Binary files /dev/null and b/assets/作物/树莓/0.webp differ
diff --git a/assets/作物/树莓/1.webp b/assets/作物/树莓/1.webp
new file mode 100644
index 0000000..b08935b
Binary files /dev/null and b/assets/作物/树莓/1.webp differ
diff --git a/assets/作物/树莓/2.webp b/assets/作物/树莓/2.webp
new file mode 100644
index 0000000..14b93bb
Binary files /dev/null and b/assets/作物/树莓/2.webp differ
diff --git a/assets/作物/树莓/3.webp b/assets/作物/树莓/3.webp
new file mode 100644
index 0000000..6e976c4
Binary files /dev/null and b/assets/作物/树莓/3.webp differ
diff --git a/assets/作物/树莓/4.webp b/assets/作物/树莓/4.webp
new file mode 100644
index 0000000..6aeea74
Binary files /dev/null and b/assets/作物/树莓/4.webp differ
diff --git a/assets/作物/树莓/5.webp b/assets/作物/树莓/5.webp
new file mode 100644
index 0000000..d748f71
Binary files /dev/null and b/assets/作物/树莓/5.webp differ
diff --git a/assets/作物/树莓/6.webp b/assets/作物/树莓/6.webp
new file mode 100644
index 0000000..7430939
Binary files /dev/null and b/assets/作物/树莓/6.webp differ
diff --git a/assets/作物/橘子树/0.webp b/assets/作物/橘子树/0.webp
new file mode 100644
index 0000000..cb2800f
Binary files /dev/null and b/assets/作物/橘子树/0.webp differ
diff --git a/assets/作物/橘子树/1.webp b/assets/作物/橘子树/1.webp
new file mode 100644
index 0000000..674cfb0
Binary files /dev/null and b/assets/作物/橘子树/1.webp differ
diff --git a/assets/作物/橘子树/2.webp b/assets/作物/橘子树/2.webp
new file mode 100644
index 0000000..23d2821
Binary files /dev/null and b/assets/作物/橘子树/2.webp differ
diff --git a/assets/作物/橘子树/3.webp b/assets/作物/橘子树/3.webp
new file mode 100644
index 0000000..2ad0b57
Binary files /dev/null and b/assets/作物/橘子树/3.webp differ
diff --git a/assets/作物/橘子树/4.webp b/assets/作物/橘子树/4.webp
new file mode 100644
index 0000000..7365a57
Binary files /dev/null and b/assets/作物/橘子树/4.webp differ
diff --git a/assets/作物/橘子树/5.webp b/assets/作物/橘子树/5.webp
new file mode 100644
index 0000000..de1ae0a
Binary files /dev/null and b/assets/作物/橘子树/5.webp differ
diff --git a/assets/作物/橘子树/6.webp b/assets/作物/橘子树/6.webp
new file mode 100644
index 0000000..de1ae0a
Binary files /dev/null and b/assets/作物/橘子树/6.webp differ
diff --git a/assets/作物/洋葱/0.png b/assets/作物/洋葱/0.png
deleted file mode 100644
index f09ccba..0000000
Binary files a/assets/作物/洋葱/0.png and /dev/null differ
diff --git a/assets/作物/洋葱/0.png.import b/assets/作物/洋葱/0.png.import
deleted file mode 100644
index 9495902..0000000
--- a/assets/作物/洋葱/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bjrsp10mfpya7"
-path="res://.godot/imported/0.png-8b7db9a749e0c10afe9747df1814031e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/洋葱/0.png"
-dest_files=["res://.godot/imported/0.png-8b7db9a749e0c10afe9747df1814031e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/洋葱/0.webp b/assets/作物/洋葱/0.webp
new file mode 100644
index 0000000..affcc90
Binary files /dev/null and b/assets/作物/洋葱/0.webp differ
diff --git a/assets/作物/洋葱/1.png b/assets/作物/洋葱/1.png
deleted file mode 100644
index 3b13aa0..0000000
Binary files a/assets/作物/洋葱/1.png and /dev/null differ
diff --git a/assets/作物/洋葱/1.png.import b/assets/作物/洋葱/1.png.import
deleted file mode 100644
index 844da63..0000000
--- a/assets/作物/洋葱/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://doljf0iyrpx7r"
-path="res://.godot/imported/1.png-0d183cebd2abe340bfd3d75d6f5433fd.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/洋葱/1.png"
-dest_files=["res://.godot/imported/1.png-0d183cebd2abe340bfd3d75d6f5433fd.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/洋葱/1.webp b/assets/作物/洋葱/1.webp
new file mode 100644
index 0000000..bca3346
Binary files /dev/null and b/assets/作物/洋葱/1.webp differ
diff --git a/assets/作物/洋葱/2.png b/assets/作物/洋葱/2.png
deleted file mode 100644
index 9ab7971..0000000
Binary files a/assets/作物/洋葱/2.png and /dev/null differ
diff --git a/assets/作物/洋葱/2.png.import b/assets/作物/洋葱/2.png.import
deleted file mode 100644
index 02527e5..0000000
--- a/assets/作物/洋葱/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c1vcy1aos0eg3"
-path="res://.godot/imported/2.png-ab6f4019acf379085e70f9cf969f588b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/洋葱/2.png"
-dest_files=["res://.godot/imported/2.png-ab6f4019acf379085e70f9cf969f588b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/洋葱/2.webp b/assets/作物/洋葱/2.webp
new file mode 100644
index 0000000..6803baf
Binary files /dev/null and b/assets/作物/洋葱/2.webp differ
diff --git a/assets/作物/洋葱/3.png b/assets/作物/洋葱/3.png
deleted file mode 100644
index 27d7de8..0000000
Binary files a/assets/作物/洋葱/3.png and /dev/null differ
diff --git a/assets/作物/洋葱/3.png.import b/assets/作物/洋葱/3.png.import
deleted file mode 100644
index cd724e4..0000000
--- a/assets/作物/洋葱/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bm13yjgrkk3hr"
-path="res://.godot/imported/3.png-1d06212dc06b8c72d13eb2b3474aa99f.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/洋葱/3.png"
-dest_files=["res://.godot/imported/3.png-1d06212dc06b8c72d13eb2b3474aa99f.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/洋葱/3.webp b/assets/作物/洋葱/3.webp
new file mode 100644
index 0000000..c4e4126
Binary files /dev/null and b/assets/作物/洋葱/3.webp differ
diff --git a/assets/作物/洋葱/4.png b/assets/作物/洋葱/4.png
deleted file mode 100644
index 985e17a..0000000
Binary files a/assets/作物/洋葱/4.png and /dev/null differ
diff --git a/assets/作物/洋葱/4.png.import b/assets/作物/洋葱/4.png.import
deleted file mode 100644
index 018a471..0000000
--- a/assets/作物/洋葱/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://g3g1m0cc2iy4"
-path="res://.godot/imported/4.png-d0687375008cf9a46accad932a728a34.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/洋葱/4.png"
-dest_files=["res://.godot/imported/4.png-d0687375008cf9a46accad932a728a34.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/洋葱/4.webp b/assets/作物/洋葱/4.webp
new file mode 100644
index 0000000..43b4611
Binary files /dev/null and b/assets/作物/洋葱/4.webp differ
diff --git a/assets/作物/玉米/0.png b/assets/作物/玉米/0.png
deleted file mode 100644
index 885f567..0000000
Binary files a/assets/作物/玉米/0.png and /dev/null differ
diff --git a/assets/作物/玉米/0.png.import b/assets/作物/玉米/0.png.import
deleted file mode 100644
index 912269e..0000000
--- a/assets/作物/玉米/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://coeuul4lc7pmt"
-path="res://.godot/imported/0.png-9a3af25b09a90714743ad379da89420c.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/玉米/0.png"
-dest_files=["res://.godot/imported/0.png-9a3af25b09a90714743ad379da89420c.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/玉米/0.webp b/assets/作物/玉米/0.webp
new file mode 100644
index 0000000..acc0fe1
Binary files /dev/null and b/assets/作物/玉米/0.webp differ
diff --git a/assets/作物/玉米/1.png b/assets/作物/玉米/1.png
deleted file mode 100644
index adfe7c6..0000000
Binary files a/assets/作物/玉米/1.png and /dev/null differ
diff --git a/assets/作物/玉米/1.png.import b/assets/作物/玉米/1.png.import
deleted file mode 100644
index 92e6c0c..0000000
--- a/assets/作物/玉米/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dp3luxblo0lr8"
-path="res://.godot/imported/1.png-6e25658f36a7b5b5ef19cc2ef4437dbe.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/玉米/1.png"
-dest_files=["res://.godot/imported/1.png-6e25658f36a7b5b5ef19cc2ef4437dbe.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/玉米/1.webp b/assets/作物/玉米/1.webp
new file mode 100644
index 0000000..6498cb3
Binary files /dev/null and b/assets/作物/玉米/1.webp differ
diff --git a/assets/作物/玫瑰花/0.webp b/assets/作物/玫瑰花/0.webp
new file mode 100644
index 0000000..a3d77fe
Binary files /dev/null and b/assets/作物/玫瑰花/0.webp differ
diff --git a/assets/作物/玫瑰花/1.webp b/assets/作物/玫瑰花/1.webp
new file mode 100644
index 0000000..a8602f8
Binary files /dev/null and b/assets/作物/玫瑰花/1.webp differ
diff --git a/assets/作物/玫瑰花/2.webp b/assets/作物/玫瑰花/2.webp
new file mode 100644
index 0000000..d284cc1
Binary files /dev/null and b/assets/作物/玫瑰花/2.webp differ
diff --git a/assets/作物/玫瑰花/3.webp b/assets/作物/玫瑰花/3.webp
new file mode 100644
index 0000000..a5353bf
Binary files /dev/null and b/assets/作物/玫瑰花/3.webp differ
diff --git a/assets/作物/玫瑰花/4.webp b/assets/作物/玫瑰花/4.webp
new file mode 100644
index 0000000..ae9578a
Binary files /dev/null and b/assets/作物/玫瑰花/4.webp differ
diff --git a/assets/作物/甘蔗/0.png b/assets/作物/甘蔗/0.png
deleted file mode 100644
index 060ea07..0000000
Binary files a/assets/作物/甘蔗/0.png and /dev/null differ
diff --git a/assets/作物/甘蔗/0.png.import b/assets/作物/甘蔗/0.png.import
deleted file mode 100644
index 08ce79c..0000000
--- a/assets/作物/甘蔗/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://6bx18e7gbm15"
-path="res://.godot/imported/0.png-0e0de218f61dd9b268b974ef91851059.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/0.png"
-dest_files=["res://.godot/imported/0.png-0e0de218f61dd9b268b974ef91851059.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/0.webp b/assets/作物/甘蔗/0.webp
new file mode 100644
index 0000000..8e39127
Binary files /dev/null and b/assets/作物/甘蔗/0.webp differ
diff --git a/assets/作物/甘蔗/1.png b/assets/作物/甘蔗/1.png
deleted file mode 100644
index 9017986..0000000
Binary files a/assets/作物/甘蔗/1.png and /dev/null differ
diff --git a/assets/作物/甘蔗/1.png.import b/assets/作物/甘蔗/1.png.import
deleted file mode 100644
index bb32ce0..0000000
--- a/assets/作物/甘蔗/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b5r3ggi30a5k7"
-path="res://.godot/imported/1.png-4b9f49051a5c72ba8b6a7a7e5f177c08.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/1.png"
-dest_files=["res://.godot/imported/1.png-4b9f49051a5c72ba8b6a7a7e5f177c08.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/1.webp b/assets/作物/甘蔗/1.webp
new file mode 100644
index 0000000..ebb4fd6
Binary files /dev/null and b/assets/作物/甘蔗/1.webp differ
diff --git a/assets/作物/甘蔗/2.png b/assets/作物/甘蔗/2.png
deleted file mode 100644
index 8770089..0000000
Binary files a/assets/作物/甘蔗/2.png and /dev/null differ
diff --git a/assets/作物/甘蔗/2.png.import b/assets/作物/甘蔗/2.png.import
deleted file mode 100644
index b6c851b..0000000
--- a/assets/作物/甘蔗/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://coq50lwgq0dct"
-path="res://.godot/imported/2.png-8c2974882b596990203b501040d949b1.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/2.png"
-dest_files=["res://.godot/imported/2.png-8c2974882b596990203b501040d949b1.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/2.webp b/assets/作物/甘蔗/2.webp
new file mode 100644
index 0000000..3480d71
Binary files /dev/null and b/assets/作物/甘蔗/2.webp differ
diff --git a/assets/作物/甘蔗/3.png b/assets/作物/甘蔗/3.png
deleted file mode 100644
index 70b78d5..0000000
Binary files a/assets/作物/甘蔗/3.png and /dev/null differ
diff --git a/assets/作物/甘蔗/3.png.import b/assets/作物/甘蔗/3.png.import
deleted file mode 100644
index 3925e36..0000000
--- a/assets/作物/甘蔗/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bbrtxayf6n7lc"
-path="res://.godot/imported/3.png-5794eeb8692338caac30611645ec5dd6.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/3.png"
-dest_files=["res://.godot/imported/3.png-5794eeb8692338caac30611645ec5dd6.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/3.webp b/assets/作物/甘蔗/3.webp
new file mode 100644
index 0000000..5318a96
Binary files /dev/null and b/assets/作物/甘蔗/3.webp differ
diff --git a/assets/作物/甘蔗/4.png b/assets/作物/甘蔗/4.png
deleted file mode 100644
index 7299ded..0000000
Binary files a/assets/作物/甘蔗/4.png and /dev/null differ
diff --git a/assets/作物/甘蔗/4.png.import b/assets/作物/甘蔗/4.png.import
deleted file mode 100644
index cdbf7ec..0000000
--- a/assets/作物/甘蔗/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dg4d41ejpbks7"
-path="res://.godot/imported/4.png-0511717296dc1f6e1b72ca49b616621d.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/4.png"
-dest_files=["res://.godot/imported/4.png-0511717296dc1f6e1b72ca49b616621d.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/4.webp b/assets/作物/甘蔗/4.webp
new file mode 100644
index 0000000..ad8b5c8
Binary files /dev/null and b/assets/作物/甘蔗/4.webp differ
diff --git a/assets/作物/甘蔗/5.png b/assets/作物/甘蔗/5.png
deleted file mode 100644
index 2cbbd08..0000000
Binary files a/assets/作物/甘蔗/5.png and /dev/null differ
diff --git a/assets/作物/甘蔗/5.webp b/assets/作物/甘蔗/5.webp
new file mode 100644
index 0000000..726ee1a
Binary files /dev/null and b/assets/作物/甘蔗/5.webp differ
diff --git a/assets/作物/甘蔗/6.png b/assets/作物/甘蔗/6.png
deleted file mode 100644
index 7ed965e..0000000
Binary files a/assets/作物/甘蔗/6.png and /dev/null differ
diff --git a/assets/作物/甘蔗/6.png.import b/assets/作物/甘蔗/6.png.import
deleted file mode 100644
index 5bd3484..0000000
--- a/assets/作物/甘蔗/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://10irlex2sfek"
-path="res://.godot/imported/6.png-bf0cdbe50e797059963b29c0704cba3f.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/6.png"
-dest_files=["res://.godot/imported/6.png-bf0cdbe50e797059963b29c0704cba3f.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/6.webp b/assets/作物/甘蔗/6.webp
new file mode 100644
index 0000000..3ae74c5
Binary files /dev/null and b/assets/作物/甘蔗/6.webp differ
diff --git a/assets/作物/甘蔗/7.png b/assets/作物/甘蔗/7.png
deleted file mode 100644
index efdff20..0000000
Binary files a/assets/作物/甘蔗/7.png and /dev/null differ
diff --git a/assets/作物/甘蔗/7.png.import b/assets/作物/甘蔗/7.png.import
deleted file mode 100644
index 92557f7..0000000
--- a/assets/作物/甘蔗/7.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c2mioarbqsnx5"
-path="res://.godot/imported/7.png-5d3ac31c1b5194ec7410d7c38f31a60c.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甘蔗/7.png"
-dest_files=["res://.godot/imported/7.png-5d3ac31c1b5194ec7410d7c38f31a60c.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甘蔗/7.webp b/assets/作物/甘蔗/7.webp
new file mode 100644
index 0000000..d5fde5d
Binary files /dev/null and b/assets/作物/甘蔗/7.webp differ
diff --git a/assets/作物/甜菜/0.png b/assets/作物/甜菜/0.png
deleted file mode 100644
index aa495cd..0000000
Binary files a/assets/作物/甜菜/0.png and /dev/null differ
diff --git a/assets/作物/甜菜/0.png.import b/assets/作物/甜菜/0.png.import
deleted file mode 100644
index c7f81c1..0000000
--- a/assets/作物/甜菜/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b8dn1eg6wlxq"
-path="res://.godot/imported/0.png-bc6293036861a1ef035c6430f2b381bd.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甜菜/0.png"
-dest_files=["res://.godot/imported/0.png-bc6293036861a1ef035c6430f2b381bd.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甜菜/0.webp b/assets/作物/甜菜/0.webp
new file mode 100644
index 0000000..3006a73
Binary files /dev/null and b/assets/作物/甜菜/0.webp differ
diff --git a/assets/作物/甜菜/1.png b/assets/作物/甜菜/1.png
deleted file mode 100644
index 6d3b01a..0000000
Binary files a/assets/作物/甜菜/1.png and /dev/null differ
diff --git a/assets/作物/甜菜/1.png.import b/assets/作物/甜菜/1.png.import
deleted file mode 100644
index e9c023e..0000000
--- a/assets/作物/甜菜/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://pwfirs3wpjdu"
-path="res://.godot/imported/1.png-bd4048dd0175b0e381680f07a11255dc.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甜菜/1.png"
-dest_files=["res://.godot/imported/1.png-bd4048dd0175b0e381680f07a11255dc.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甜菜/1.webp b/assets/作物/甜菜/1.webp
new file mode 100644
index 0000000..2065230
Binary files /dev/null and b/assets/作物/甜菜/1.webp differ
diff --git a/assets/作物/甜菜/2.png b/assets/作物/甜菜/2.png
deleted file mode 100644
index 458dda2..0000000
Binary files a/assets/作物/甜菜/2.png and /dev/null differ
diff --git a/assets/作物/甜菜/2.png.import b/assets/作物/甜菜/2.png.import
deleted file mode 100644
index 6efb469..0000000
--- a/assets/作物/甜菜/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bb1wmc7wo8u2c"
-path="res://.godot/imported/2.png-eb31389ef90db794330ec505ae9b3fe7.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甜菜/2.png"
-dest_files=["res://.godot/imported/2.png-eb31389ef90db794330ec505ae9b3fe7.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甜菜/2.webp b/assets/作物/甜菜/2.webp
new file mode 100644
index 0000000..0629d5f
Binary files /dev/null and b/assets/作物/甜菜/2.webp differ
diff --git a/assets/作物/甜菜/3.png b/assets/作物/甜菜/3.png
deleted file mode 100644
index d24b066..0000000
Binary files a/assets/作物/甜菜/3.png and /dev/null differ
diff --git a/assets/作物/甜菜/3.png.import b/assets/作物/甜菜/3.png.import
deleted file mode 100644
index 2532066..0000000
--- a/assets/作物/甜菜/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dl88mc1dwo2w7"
-path="res://.godot/imported/3.png-32c7fa9963aeb4c32f889ba20bb30a85.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甜菜/3.png"
-dest_files=["res://.godot/imported/3.png-32c7fa9963aeb4c32f889ba20bb30a85.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甜菜/3.webp b/assets/作物/甜菜/3.webp
new file mode 100644
index 0000000..29e1611
Binary files /dev/null and b/assets/作物/甜菜/3.webp differ
diff --git a/assets/作物/甜菜/4.png b/assets/作物/甜菜/4.png
deleted file mode 100644
index f600f40..0000000
Binary files a/assets/作物/甜菜/4.png and /dev/null differ
diff --git a/assets/作物/甜菜/4.png.import b/assets/作物/甜菜/4.png.import
deleted file mode 100644
index 1c956f7..0000000
--- a/assets/作物/甜菜/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cdks311a03s7i"
-path="res://.godot/imported/4.png-f476a1076d52d95aa28facb7255a8765.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/甜菜/4.png"
-dest_files=["res://.godot/imported/4.png-f476a1076d52d95aa28facb7255a8765.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/甜菜/4.webp b/assets/作物/甜菜/4.webp
new file mode 100644
index 0000000..0603f45
Binary files /dev/null and b/assets/作物/甜菜/4.webp differ
diff --git a/assets/作物/番茄/20250525114400.png b/assets/作物/番茄/20250525114400.png
deleted file mode 100644
index 7845d06..0000000
Binary files a/assets/作物/番茄/20250525114400.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114400.png.import b/assets/作物/番茄/20250525114400.png.import
deleted file mode 100644
index c11e52d..0000000
--- a/assets/作物/番茄/20250525114400.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dx34eq1n7ykh"
-path="res://.godot/imported/20250525114400.png-c26cf40eac4186991444d56e44d968b3.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/番茄/20250525114400.png"
-dest_files=["res://.godot/imported/20250525114400.png-c26cf40eac4186991444d56e44d968b3.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/番茄/20250525114400.webp b/assets/作物/番茄/20250525114400.webp
new file mode 100644
index 0000000..ab96ab1
Binary files /dev/null and b/assets/作物/番茄/20250525114400.webp differ
diff --git a/assets/作物/番茄/20250525114414.png b/assets/作物/番茄/20250525114414.png
deleted file mode 100644
index 54de7ee..0000000
Binary files a/assets/作物/番茄/20250525114414.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114414.png.import b/assets/作物/番茄/20250525114414.png.import
deleted file mode 100644
index 2a4cae7..0000000
--- a/assets/作物/番茄/20250525114414.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dc71c6i16herl"
-path="res://.godot/imported/20250525114414.png-621e24338a3a7e12d06733dbc61151ac.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/番茄/20250525114414.png"
-dest_files=["res://.godot/imported/20250525114414.png-621e24338a3a7e12d06733dbc61151ac.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/番茄/20250525114414.webp b/assets/作物/番茄/20250525114414.webp
new file mode 100644
index 0000000..e5493a9
Binary files /dev/null and b/assets/作物/番茄/20250525114414.webp differ
diff --git a/assets/作物/番茄/20250525114429.png b/assets/作物/番茄/20250525114429.png
deleted file mode 100644
index b562b87..0000000
Binary files a/assets/作物/番茄/20250525114429.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114429.png.import b/assets/作物/番茄/20250525114429.png.import
deleted file mode 100644
index 6b4612e..0000000
--- a/assets/作物/番茄/20250525114429.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cvqdm1uaqdg0d"
-path="res://.godot/imported/20250525114429.png-40fb5ec5343fde69519086c3bc98af15.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/番茄/20250525114429.png"
-dest_files=["res://.godot/imported/20250525114429.png-40fb5ec5343fde69519086c3bc98af15.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/番茄/20250525114429.webp b/assets/作物/番茄/20250525114429.webp
new file mode 100644
index 0000000..7cdd97b
Binary files /dev/null and b/assets/作物/番茄/20250525114429.webp differ
diff --git a/assets/作物/番茄/20250525114503.png b/assets/作物/番茄/20250525114503.png
deleted file mode 100644
index 5dd064f..0000000
Binary files a/assets/作物/番茄/20250525114503.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114503.webp b/assets/作物/番茄/20250525114503.webp
new file mode 100644
index 0000000..2f1f6bb
Binary files /dev/null and b/assets/作物/番茄/20250525114503.webp differ
diff --git a/assets/作物/番茄/20250525114524.png b/assets/作物/番茄/20250525114524.png
deleted file mode 100644
index 69c9896..0000000
Binary files a/assets/作物/番茄/20250525114524.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114524.png.import b/assets/作物/番茄/20250525114524.png.import
deleted file mode 100644
index aa608bf..0000000
--- a/assets/作物/番茄/20250525114524.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b760if560n2l7"
-path="res://.godot/imported/20250525114524.png-dc843122ac11aba0d2d250a4d9fb6a1e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/番茄/20250525114524.png"
-dest_files=["res://.godot/imported/20250525114524.png-dc843122ac11aba0d2d250a4d9fb6a1e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/番茄/20250525114524.webp b/assets/作物/番茄/20250525114524.webp
new file mode 100644
index 0000000..c46665f
Binary files /dev/null and b/assets/作物/番茄/20250525114524.webp differ
diff --git a/assets/作物/番茄/20250525114542.png b/assets/作物/番茄/20250525114542.png
deleted file mode 100644
index 95a3484..0000000
Binary files a/assets/作物/番茄/20250525114542.png and /dev/null differ
diff --git a/assets/作物/番茄/20250525114542.png.import b/assets/作物/番茄/20250525114542.png.import
deleted file mode 100644
index 36dec73..0000000
--- a/assets/作物/番茄/20250525114542.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ceo8frcqrkkcc"
-path="res://.godot/imported/20250525114542.png-42663e8f2f8ad4f25e0f999aa6c17461.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/番茄/20250525114542.png"
-dest_files=["res://.godot/imported/20250525114542.png-42663e8f2f8ad4f25e0f999aa6c17461.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/番茄/20250525114542.webp b/assets/作物/番茄/20250525114542.webp
new file mode 100644
index 0000000..a7df930
Binary files /dev/null and b/assets/作物/番茄/20250525114542.webp differ
diff --git a/assets/作物/稻谷/0.png b/assets/作物/稻谷/0.png
deleted file mode 100644
index f848ed5..0000000
Binary files a/assets/作物/稻谷/0.png and /dev/null differ
diff --git a/assets/作物/稻谷/0.png.import b/assets/作物/稻谷/0.png.import
deleted file mode 100644
index f8b8c23..0000000
--- a/assets/作物/稻谷/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://66p7ser7xdcd"
-path="res://.godot/imported/0.png-1b2f8001664d9dcbfb2970a7f025a9ee.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/0.png"
-dest_files=["res://.godot/imported/0.png-1b2f8001664d9dcbfb2970a7f025a9ee.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/0.webp b/assets/作物/稻谷/0.webp
new file mode 100644
index 0000000..a4925dc
Binary files /dev/null and b/assets/作物/稻谷/0.webp differ
diff --git a/assets/作物/稻谷/1.png b/assets/作物/稻谷/1.png
deleted file mode 100644
index e071e0a..0000000
Binary files a/assets/作物/稻谷/1.png and /dev/null differ
diff --git a/assets/作物/稻谷/1.png.import b/assets/作物/稻谷/1.png.import
deleted file mode 100644
index 4199338..0000000
--- a/assets/作物/稻谷/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cgog0xpol5m4h"
-path="res://.godot/imported/1.png-7a0e13a09532dcfa4c50c80d4050b246.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/1.png"
-dest_files=["res://.godot/imported/1.png-7a0e13a09532dcfa4c50c80d4050b246.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/1.webp b/assets/作物/稻谷/1.webp
new file mode 100644
index 0000000..993fe72
Binary files /dev/null and b/assets/作物/稻谷/1.webp differ
diff --git a/assets/作物/稻谷/2.png b/assets/作物/稻谷/2.png
deleted file mode 100644
index a0d2bd1..0000000
Binary files a/assets/作物/稻谷/2.png and /dev/null differ
diff --git a/assets/作物/稻谷/2.png.import b/assets/作物/稻谷/2.png.import
deleted file mode 100644
index 89c6ef6..0000000
--- a/assets/作物/稻谷/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://oxkkkvhxbj2n"
-path="res://.godot/imported/2.png-959c37c42618f16fcf7666a0e06e84ea.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/2.png"
-dest_files=["res://.godot/imported/2.png-959c37c42618f16fcf7666a0e06e84ea.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/2.webp b/assets/作物/稻谷/2.webp
new file mode 100644
index 0000000..9b484ef
Binary files /dev/null and b/assets/作物/稻谷/2.webp differ
diff --git a/assets/作物/稻谷/3.png b/assets/作物/稻谷/3.png
deleted file mode 100644
index ae69676..0000000
Binary files a/assets/作物/稻谷/3.png and /dev/null differ
diff --git a/assets/作物/稻谷/3.png.import b/assets/作物/稻谷/3.png.import
deleted file mode 100644
index 88f079b..0000000
--- a/assets/作物/稻谷/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c3jdu5qaa40jt"
-path="res://.godot/imported/3.png-59ac583e303b2c9e9e57b13ddf018c49.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/3.png"
-dest_files=["res://.godot/imported/3.png-59ac583e303b2c9e9e57b13ddf018c49.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/3.webp b/assets/作物/稻谷/3.webp
new file mode 100644
index 0000000..997e8ec
Binary files /dev/null and b/assets/作物/稻谷/3.webp differ
diff --git a/assets/作物/稻谷/4.png b/assets/作物/稻谷/4.png
deleted file mode 100644
index e937042..0000000
Binary files a/assets/作物/稻谷/4.png and /dev/null differ
diff --git a/assets/作物/稻谷/4.png.import b/assets/作物/稻谷/4.png.import
deleted file mode 100644
index e83c923..0000000
--- a/assets/作物/稻谷/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://capktt7hcf2mi"
-path="res://.godot/imported/4.png-5421616d7f728725d823a896dac80d94.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/4.png"
-dest_files=["res://.godot/imported/4.png-5421616d7f728725d823a896dac80d94.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/4.webp b/assets/作物/稻谷/4.webp
new file mode 100644
index 0000000..33d2384
Binary files /dev/null and b/assets/作物/稻谷/4.webp differ
diff --git a/assets/作物/稻谷/5.png b/assets/作物/稻谷/5.png
deleted file mode 100644
index 2508722..0000000
Binary files a/assets/作物/稻谷/5.png and /dev/null differ
diff --git a/assets/作物/稻谷/5.png.import b/assets/作物/稻谷/5.png.import
deleted file mode 100644
index b7c2a7f..0000000
--- a/assets/作物/稻谷/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c7ik3rwhgf1yd"
-path="res://.godot/imported/5.png-e1e6446f59a662e6db5435dcdc772323.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/5.png"
-dest_files=["res://.godot/imported/5.png-e1e6446f59a662e6db5435dcdc772323.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/5.webp b/assets/作物/稻谷/5.webp
new file mode 100644
index 0000000..449e774
Binary files /dev/null and b/assets/作物/稻谷/5.webp differ
diff --git a/assets/作物/稻谷/6.png b/assets/作物/稻谷/6.png
deleted file mode 100644
index 633c539..0000000
Binary files a/assets/作物/稻谷/6.png and /dev/null differ
diff --git a/assets/作物/稻谷/6.png.import b/assets/作物/稻谷/6.png.import
deleted file mode 100644
index 52c7435..0000000
--- a/assets/作物/稻谷/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dp2w866iw6ycr"
-path="res://.godot/imported/6.png-547e2e83ceaa5d9cf8d0c8f05d0cec88.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/6.png"
-dest_files=["res://.godot/imported/6.png-547e2e83ceaa5d9cf8d0c8f05d0cec88.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/6.webp b/assets/作物/稻谷/6.webp
new file mode 100644
index 0000000..818830b
Binary files /dev/null and b/assets/作物/稻谷/6.webp differ
diff --git a/assets/作物/稻谷/7.png b/assets/作物/稻谷/7.png
deleted file mode 100644
index 8249136..0000000
Binary files a/assets/作物/稻谷/7.png and /dev/null differ
diff --git a/assets/作物/稻谷/7.png.import b/assets/作物/稻谷/7.png.import
deleted file mode 100644
index c6d0a7c..0000000
--- a/assets/作物/稻谷/7.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://n02macuippph"
-path="res://.godot/imported/7.png-efec93404250aff681b9decb01dc795e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/7.png"
-dest_files=["res://.godot/imported/7.png-efec93404250aff681b9decb01dc795e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/7.webp b/assets/作物/稻谷/7.webp
new file mode 100644
index 0000000..8725b88
Binary files /dev/null and b/assets/作物/稻谷/7.webp differ
diff --git a/assets/作物/稻谷/8.png b/assets/作物/稻谷/8.png
deleted file mode 100644
index fc0e5fb..0000000
Binary files a/assets/作物/稻谷/8.png and /dev/null differ
diff --git a/assets/作物/稻谷/8.png.import b/assets/作物/稻谷/8.png.import
deleted file mode 100644
index 2b3c1b8..0000000
--- a/assets/作物/稻谷/8.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bwfgnkgs4fpew"
-path="res://.godot/imported/8.png-8f2b101766d3d46d2a62c6c1a7603c86.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/8.png"
-dest_files=["res://.godot/imported/8.png-8f2b101766d3d46d2a62c6c1a7603c86.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/8.webp b/assets/作物/稻谷/8.webp
new file mode 100644
index 0000000..d2be892
Binary files /dev/null and b/assets/作物/稻谷/8.webp differ
diff --git a/assets/作物/稻谷/9.png b/assets/作物/稻谷/9.png
deleted file mode 100644
index 9bbd8f6..0000000
Binary files a/assets/作物/稻谷/9.png and /dev/null differ
diff --git a/assets/作物/稻谷/9.png.import b/assets/作物/稻谷/9.png.import
deleted file mode 100644
index 47a1ef0..0000000
--- a/assets/作物/稻谷/9.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c8f8f37tt7cw4"
-path="res://.godot/imported/9.png-97b58d776bd44c79abbe7e0bc190a82c.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/稻谷/9.png"
-dest_files=["res://.godot/imported/9.png-97b58d776bd44c79abbe7e0bc190a82c.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/稻谷/9.webp b/assets/作物/稻谷/9.webp
new file mode 100644
index 0000000..bad39fa
Binary files /dev/null and b/assets/作物/稻谷/9.webp differ
diff --git a/assets/作物/胡萝卜/0.png b/assets/作物/胡萝卜/0.png
deleted file mode 100644
index 885f567..0000000
Binary files a/assets/作物/胡萝卜/0.png and /dev/null differ
diff --git a/assets/作物/胡萝卜/0.png.import b/assets/作物/胡萝卜/0.png.import
deleted file mode 100644
index 8e630dc..0000000
--- a/assets/作物/胡萝卜/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cwtatsted80ya"
-path="res://.godot/imported/0.png-15d10317ac4e01788e5120a917929023.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/胡萝卜/0.png"
-dest_files=["res://.godot/imported/0.png-15d10317ac4e01788e5120a917929023.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/胡萝卜/0.webp b/assets/作物/胡萝卜/0.webp
new file mode 100644
index 0000000..acc0fe1
Binary files /dev/null and b/assets/作物/胡萝卜/0.webp differ
diff --git a/assets/作物/胡萝卜/1.png b/assets/作物/胡萝卜/1.png
deleted file mode 100644
index 06844ea..0000000
Binary files a/assets/作物/胡萝卜/1.png and /dev/null differ
diff --git a/assets/作物/胡萝卜/1.png.import b/assets/作物/胡萝卜/1.png.import
deleted file mode 100644
index aac4f2d..0000000
--- a/assets/作物/胡萝卜/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c5lji85cnnnhe"
-path="res://.godot/imported/1.png-7ae9b48d0b2f4da52e361357613f32bf.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/胡萝卜/1.png"
-dest_files=["res://.godot/imported/1.png-7ae9b48d0b2f4da52e361357613f32bf.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/胡萝卜/1.webp b/assets/作物/胡萝卜/1.webp
new file mode 100644
index 0000000..25fd885
Binary files /dev/null and b/assets/作物/胡萝卜/1.webp differ
diff --git a/assets/作物/胡萝卜/2.png b/assets/作物/胡萝卜/2.png
deleted file mode 100644
index 511895c..0000000
Binary files a/assets/作物/胡萝卜/2.png and /dev/null differ
diff --git a/assets/作物/胡萝卜/2.png.import b/assets/作物/胡萝卜/2.png.import
deleted file mode 100644
index 17ded2b..0000000
--- a/assets/作物/胡萝卜/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cwtyfnm8ofrjf"
-path="res://.godot/imported/2.png-5cb9a02f78b8a36caec8bf3075ff0980.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/胡萝卜/2.png"
-dest_files=["res://.godot/imported/2.png-5cb9a02f78b8a36caec8bf3075ff0980.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/胡萝卜/2.webp b/assets/作物/胡萝卜/2.webp
new file mode 100644
index 0000000..cb1fbd1
Binary files /dev/null and b/assets/作物/胡萝卜/2.webp differ
diff --git a/assets/作物/胡萝卜/3.png b/assets/作物/胡萝卜/3.png
deleted file mode 100644
index 0762bac..0000000
Binary files a/assets/作物/胡萝卜/3.png and /dev/null differ
diff --git a/assets/作物/胡萝卜/3.png.import b/assets/作物/胡萝卜/3.png.import
deleted file mode 100644
index 328a355..0000000
--- a/assets/作物/胡萝卜/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dfw07evekk3lt"
-path="res://.godot/imported/3.png-ceac6ad869d69f99afced2211cc1d508.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/胡萝卜/3.png"
-dest_files=["res://.godot/imported/3.png-ceac6ad869d69f99afced2211cc1d508.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/胡萝卜/3.webp b/assets/作物/胡萝卜/3.webp
new file mode 100644
index 0000000..127dc26
Binary files /dev/null and b/assets/作物/胡萝卜/3.webp differ
diff --git a/assets/作物/胡萝卜/4.png b/assets/作物/胡萝卜/4.png
deleted file mode 100644
index 51fce6f..0000000
Binary files a/assets/作物/胡萝卜/4.png and /dev/null differ
diff --git a/assets/作物/胡萝卜/4.png.import b/assets/作物/胡萝卜/4.png.import
deleted file mode 100644
index f862185..0000000
--- a/assets/作物/胡萝卜/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://di3hgl70j1g2m"
-path="res://.godot/imported/4.png-e890562aad789bb5433254cf14f29e38.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/胡萝卜/4.png"
-dest_files=["res://.godot/imported/4.png-e890562aad789bb5433254cf14f29e38.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/胡萝卜/4.webp b/assets/作物/胡萝卜/4.webp
new file mode 100644
index 0000000..e6173f9
Binary files /dev/null and b/assets/作物/胡萝卜/4.webp differ
diff --git a/assets/作物/芦笋/0.png b/assets/作物/芦笋/0.png
deleted file mode 100644
index e850978..0000000
Binary files a/assets/作物/芦笋/0.png and /dev/null differ
diff --git a/assets/作物/芦笋/0.png.import b/assets/作物/芦笋/0.png.import
deleted file mode 100644
index e87a570..0000000
--- a/assets/作物/芦笋/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cjoqss5jnu61p"
-path="res://.godot/imported/0.png-5615c2a6fe10314461869f13a202b936.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/芦笋/0.png"
-dest_files=["res://.godot/imported/0.png-5615c2a6fe10314461869f13a202b936.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/芦笋/0.webp b/assets/作物/芦笋/0.webp
new file mode 100644
index 0000000..52e18f1
Binary files /dev/null and b/assets/作物/芦笋/0.webp differ
diff --git a/assets/作物/芦笋/1.png b/assets/作物/芦笋/1.png
deleted file mode 100644
index 52c0d9b..0000000
Binary files a/assets/作物/芦笋/1.png and /dev/null differ
diff --git a/assets/作物/芦笋/1.png.import b/assets/作物/芦笋/1.png.import
deleted file mode 100644
index 6e5fc0d..0000000
--- a/assets/作物/芦笋/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bi1u4hhkqydpa"
-path="res://.godot/imported/1.png-dae2c4770eda5ce71d07d4f3347a2bae.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/芦笋/1.png"
-dest_files=["res://.godot/imported/1.png-dae2c4770eda5ce71d07d4f3347a2bae.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/芦笋/1.webp b/assets/作物/芦笋/1.webp
new file mode 100644
index 0000000..d979c72
Binary files /dev/null and b/assets/作物/芦笋/1.webp differ
diff --git a/assets/作物/芦笋/2.png b/assets/作物/芦笋/2.png
deleted file mode 100644
index a5a54a9..0000000
Binary files a/assets/作物/芦笋/2.png and /dev/null differ
diff --git a/assets/作物/芦笋/2.png.import b/assets/作物/芦笋/2.png.import
deleted file mode 100644
index 9bec670..0000000
--- a/assets/作物/芦笋/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bchlpda7rp2xs"
-path="res://.godot/imported/2.png-388d324f592088464b8d1775da2b0db8.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/芦笋/2.png"
-dest_files=["res://.godot/imported/2.png-388d324f592088464b8d1775da2b0db8.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/芦笋/2.webp b/assets/作物/芦笋/2.webp
new file mode 100644
index 0000000..18627af
Binary files /dev/null and b/assets/作物/芦笋/2.webp differ
diff --git a/assets/作物/芦笋/3.png b/assets/作物/芦笋/3.png
deleted file mode 100644
index 8f3f157..0000000
Binary files a/assets/作物/芦笋/3.png and /dev/null differ
diff --git a/assets/作物/芦笋/3.png.import b/assets/作物/芦笋/3.png.import
deleted file mode 100644
index 8f2d0b1..0000000
--- a/assets/作物/芦笋/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://demijtyido3rd"
-path="res://.godot/imported/3.png-871e774516b90443a9261cc885b0e538.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/芦笋/3.png"
-dest_files=["res://.godot/imported/3.png-871e774516b90443a9261cc885b0e538.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/芦笋/3.webp b/assets/作物/芦笋/3.webp
new file mode 100644
index 0000000..1892201
Binary files /dev/null and b/assets/作物/芦笋/3.webp differ
diff --git a/assets/作物/芦笋/4.png b/assets/作物/芦笋/4.png
deleted file mode 100644
index 42691a8..0000000
Binary files a/assets/作物/芦笋/4.png and /dev/null differ
diff --git a/assets/作物/芦笋/4.png.import b/assets/作物/芦笋/4.png.import
deleted file mode 100644
index c864ee3..0000000
--- a/assets/作物/芦笋/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c6ebegpa0ct7d"
-path="res://.godot/imported/4.png-898d107b2eb8e7a276c9ade5f0bd6388.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/芦笋/4.png"
-dest_files=["res://.godot/imported/4.png-898d107b2eb8e7a276c9ade5f0bd6388.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/芦笋/4.webp b/assets/作物/芦笋/4.webp
new file mode 100644
index 0000000..4e07fb5
Binary files /dev/null and b/assets/作物/芦笋/4.webp differ
diff --git a/assets/作物/芦荟/0.webp b/assets/作物/芦荟/0.webp
new file mode 100644
index 0000000..9af5acb
Binary files /dev/null and b/assets/作物/芦荟/0.webp differ
diff --git a/assets/作物/芦荟/1.webp b/assets/作物/芦荟/1.webp
new file mode 100644
index 0000000..b21f691
Binary files /dev/null and b/assets/作物/芦荟/1.webp differ
diff --git a/assets/作物/芦荟/2.webp b/assets/作物/芦荟/2.webp
new file mode 100644
index 0000000..c7fddca
Binary files /dev/null and b/assets/作物/芦荟/2.webp differ
diff --git a/assets/作物/芦荟/3.webp b/assets/作物/芦荟/3.webp
new file mode 100644
index 0000000..10b63ab
Binary files /dev/null and b/assets/作物/芦荟/3.webp differ
diff --git a/assets/作物/芦荟/4.webp b/assets/作物/芦荟/4.webp
new file mode 100644
index 0000000..49dfadc
Binary files /dev/null and b/assets/作物/芦荟/4.webp differ
diff --git a/assets/作物/芦荟/5.webp b/assets/作物/芦荟/5.webp
new file mode 100644
index 0000000..d000796
Binary files /dev/null and b/assets/作物/芦荟/5.webp differ
diff --git a/assets/作物/芦荟/6.webp b/assets/作物/芦荟/6.webp
new file mode 100644
index 0000000..a8e7938
Binary files /dev/null and b/assets/作物/芦荟/6.webp differ
diff --git a/assets/作物/芦荟/7.webp b/assets/作物/芦荟/7.webp
new file mode 100644
index 0000000..630497e
Binary files /dev/null and b/assets/作物/芦荟/7.webp differ
diff --git a/assets/作物/花椰菜/0.png b/assets/作物/花椰菜/0.png
deleted file mode 100644
index 2046fa6..0000000
Binary files a/assets/作物/花椰菜/0.png and /dev/null differ
diff --git a/assets/作物/花椰菜/0.png.import b/assets/作物/花椰菜/0.png.import
deleted file mode 100644
index e48f6b3..0000000
--- a/assets/作物/花椰菜/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bgdeojr0uah7t"
-path="res://.godot/imported/0.png-d627ab6b814d458796c247adfecf5800.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/0.png"
-dest_files=["res://.godot/imported/0.png-d627ab6b814d458796c247adfecf5800.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/0.webp b/assets/作物/花椰菜/0.webp
new file mode 100644
index 0000000..2992f6c
Binary files /dev/null and b/assets/作物/花椰菜/0.webp differ
diff --git a/assets/作物/花椰菜/1.png b/assets/作物/花椰菜/1.png
deleted file mode 100644
index 7fc77d1..0000000
Binary files a/assets/作物/花椰菜/1.png and /dev/null differ
diff --git a/assets/作物/花椰菜/1.png.import b/assets/作物/花椰菜/1.png.import
deleted file mode 100644
index a418d1e..0000000
--- a/assets/作物/花椰菜/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://blc8u5jnma88x"
-path="res://.godot/imported/1.png-c54d18742a1d7df338b573cc6e3b1674.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/1.png"
-dest_files=["res://.godot/imported/1.png-c54d18742a1d7df338b573cc6e3b1674.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/1.webp b/assets/作物/花椰菜/1.webp
new file mode 100644
index 0000000..32a1fe7
Binary files /dev/null and b/assets/作物/花椰菜/1.webp differ
diff --git a/assets/作物/花椰菜/2.png b/assets/作物/花椰菜/2.png
deleted file mode 100644
index c2c61ef..0000000
Binary files a/assets/作物/花椰菜/2.png and /dev/null differ
diff --git a/assets/作物/花椰菜/2.png.import b/assets/作物/花椰菜/2.png.import
deleted file mode 100644
index fc4a907..0000000
--- a/assets/作物/花椰菜/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bx0jqnkg1s3r0"
-path="res://.godot/imported/2.png-759e0ecf2d36b46de52e3caab26362c0.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/2.png"
-dest_files=["res://.godot/imported/2.png-759e0ecf2d36b46de52e3caab26362c0.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/2.webp b/assets/作物/花椰菜/2.webp
new file mode 100644
index 0000000..de4fd56
Binary files /dev/null and b/assets/作物/花椰菜/2.webp differ
diff --git a/assets/作物/花椰菜/3.png b/assets/作物/花椰菜/3.png
deleted file mode 100644
index feec6f1..0000000
Binary files a/assets/作物/花椰菜/3.png and /dev/null differ
diff --git a/assets/作物/花椰菜/3.png.import b/assets/作物/花椰菜/3.png.import
deleted file mode 100644
index c80153c..0000000
--- a/assets/作物/花椰菜/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bi2klgvolm8ux"
-path="res://.godot/imported/3.png-ba96fd7325e59ca7a392ec773caa9636.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/3.png"
-dest_files=["res://.godot/imported/3.png-ba96fd7325e59ca7a392ec773caa9636.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/3.webp b/assets/作物/花椰菜/3.webp
new file mode 100644
index 0000000..d9946fd
Binary files /dev/null and b/assets/作物/花椰菜/3.webp differ
diff --git a/assets/作物/花椰菜/4.png b/assets/作物/花椰菜/4.png
deleted file mode 100644
index 157ecc6..0000000
Binary files a/assets/作物/花椰菜/4.png and /dev/null differ
diff --git a/assets/作物/花椰菜/4.png.import b/assets/作物/花椰菜/4.png.import
deleted file mode 100644
index 0c5ab22..0000000
--- a/assets/作物/花椰菜/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b520cloaq6lcj"
-path="res://.godot/imported/4.png-1c62abc3876fb6263fafad89fd80a608.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/4.png"
-dest_files=["res://.godot/imported/4.png-1c62abc3876fb6263fafad89fd80a608.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/4.webp b/assets/作物/花椰菜/4.webp
new file mode 100644
index 0000000..3ba5fbb
Binary files /dev/null and b/assets/作物/花椰菜/4.webp differ
diff --git a/assets/作物/花椰菜/5.png b/assets/作物/花椰菜/5.png
deleted file mode 100644
index ce37524..0000000
Binary files a/assets/作物/花椰菜/5.png and /dev/null differ
diff --git a/assets/作物/花椰菜/5.png.import b/assets/作物/花椰菜/5.png.import
deleted file mode 100644
index 3ef74a8..0000000
--- a/assets/作物/花椰菜/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://chg3oop410nss"
-path="res://.godot/imported/5.png-6e7f29a08c311b13ebc4d8cac5227385.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/5.png"
-dest_files=["res://.godot/imported/5.png-6e7f29a08c311b13ebc4d8cac5227385.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/5.webp b/assets/作物/花椰菜/5.webp
new file mode 100644
index 0000000..0b5a40d
Binary files /dev/null and b/assets/作物/花椰菜/5.webp differ
diff --git a/assets/作物/花椰菜/6.png b/assets/作物/花椰菜/6.png
deleted file mode 100644
index 83e8cd7..0000000
Binary files a/assets/作物/花椰菜/6.png and /dev/null differ
diff --git a/assets/作物/花椰菜/6.png.import b/assets/作物/花椰菜/6.png.import
deleted file mode 100644
index b79956a..0000000
--- a/assets/作物/花椰菜/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dnqut65pkh8ko"
-path="res://.godot/imported/6.png-fd5bc05ca124ef4992d4b5519fc4ad36.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/花椰菜/6.png"
-dest_files=["res://.godot/imported/6.png-fd5bc05ca124ef4992d4b5519fc4ad36.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/花椰菜/6.webp b/assets/作物/花椰菜/6.webp
new file mode 100644
index 0000000..2080a45
Binary files /dev/null and b/assets/作物/花椰菜/6.webp differ
diff --git a/assets/作物/苹果树/0.webp b/assets/作物/苹果树/0.webp
new file mode 100644
index 0000000..0d23702
Binary files /dev/null and b/assets/作物/苹果树/0.webp differ
diff --git a/assets/作物/苹果树/1.webp b/assets/作物/苹果树/1.webp
new file mode 100644
index 0000000..9dede6f
Binary files /dev/null and b/assets/作物/苹果树/1.webp differ
diff --git a/assets/作物/苹果树/2.webp b/assets/作物/苹果树/2.webp
new file mode 100644
index 0000000..6dcc5b4
Binary files /dev/null and b/assets/作物/苹果树/2.webp differ
diff --git a/assets/作物/苹果树/3.webp b/assets/作物/苹果树/3.webp
new file mode 100644
index 0000000..0b45e01
Binary files /dev/null and b/assets/作物/苹果树/3.webp differ
diff --git a/assets/作物/苹果树/4.webp b/assets/作物/苹果树/4.webp
new file mode 100644
index 0000000..7fefe93
Binary files /dev/null and b/assets/作物/苹果树/4.webp differ
diff --git a/assets/作物/苹果树/5.webp b/assets/作物/苹果树/5.webp
new file mode 100644
index 0000000..47130a6
Binary files /dev/null and b/assets/作物/苹果树/5.webp differ
diff --git a/assets/作物/苹果树/6.webp b/assets/作物/苹果树/6.webp
new file mode 100644
index 0000000..0d2d5f4
Binary files /dev/null and b/assets/作物/苹果树/6.webp differ
diff --git a/assets/作物/苹果树/7.webp b/assets/作物/苹果树/7.webp
new file mode 100644
index 0000000..0041bf6
Binary files /dev/null and b/assets/作物/苹果树/7.webp differ
diff --git a/assets/作物/茄子/0.webp b/assets/作物/茄子/0.webp
new file mode 100644
index 0000000..f73ca04
Binary files /dev/null and b/assets/作物/茄子/0.webp differ
diff --git a/assets/作物/茄子/1.webp b/assets/作物/茄子/1.webp
new file mode 100644
index 0000000..f4dc053
Binary files /dev/null and b/assets/作物/茄子/1.webp differ
diff --git a/assets/作物/茄子/2.webp b/assets/作物/茄子/2.webp
new file mode 100644
index 0000000..13ca0d3
Binary files /dev/null and b/assets/作物/茄子/2.webp differ
diff --git a/assets/作物/茄子/3.webp b/assets/作物/茄子/3.webp
new file mode 100644
index 0000000..8443e44
Binary files /dev/null and b/assets/作物/茄子/3.webp differ
diff --git a/assets/作物/茄子/4.webp b/assets/作物/茄子/4.webp
new file mode 100644
index 0000000..235555d
Binary files /dev/null and b/assets/作物/茄子/4.webp differ
diff --git a/assets/作物/草莓/0.png b/assets/作物/草莓/0.png
deleted file mode 100644
index a7a2e0f..0000000
Binary files a/assets/作物/草莓/0.png and /dev/null differ
diff --git a/assets/作物/草莓/0.png.import b/assets/作物/草莓/0.png.import
deleted file mode 100644
index 7a4f925..0000000
--- a/assets/作物/草莓/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bi1w6k0qc4lir"
-path="res://.godot/imported/0.png-5afe2de5333c741ad5e4876db6ee9703.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/草莓/0.png"
-dest_files=["res://.godot/imported/0.png-5afe2de5333c741ad5e4876db6ee9703.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/草莓/0.webp b/assets/作物/草莓/0.webp
new file mode 100644
index 0000000..8ea0a9a
Binary files /dev/null and b/assets/作物/草莓/0.webp differ
diff --git a/assets/作物/草莓/1.png b/assets/作物/草莓/1.png
deleted file mode 100644
index 1437078..0000000
Binary files a/assets/作物/草莓/1.png and /dev/null differ
diff --git a/assets/作物/草莓/1.png.import b/assets/作物/草莓/1.png.import
deleted file mode 100644
index 4661369..0000000
--- a/assets/作物/草莓/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dx4l6iuw3apn8"
-path="res://.godot/imported/1.png-09f372c8440e85781aa9d04417c51814.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/草莓/1.png"
-dest_files=["res://.godot/imported/1.png-09f372c8440e85781aa9d04417c51814.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/草莓/1.webp b/assets/作物/草莓/1.webp
new file mode 100644
index 0000000..aa3e7ac
Binary files /dev/null and b/assets/作物/草莓/1.webp differ
diff --git a/assets/作物/草莓/2.png b/assets/作物/草莓/2.png
deleted file mode 100644
index 3344b25..0000000
Binary files a/assets/作物/草莓/2.png and /dev/null differ
diff --git a/assets/作物/草莓/2.png.import b/assets/作物/草莓/2.png.import
deleted file mode 100644
index bf82cb2..0000000
--- a/assets/作物/草莓/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b4g8s23fa4st8"
-path="res://.godot/imported/2.png-26f7dd0262ff3fcab00250f1bdf5dc47.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/草莓/2.png"
-dest_files=["res://.godot/imported/2.png-26f7dd0262ff3fcab00250f1bdf5dc47.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/草莓/2.webp b/assets/作物/草莓/2.webp
new file mode 100644
index 0000000..e1036fc
Binary files /dev/null and b/assets/作物/草莓/2.webp differ
diff --git a/assets/作物/草莓/3.png b/assets/作物/草莓/3.png
deleted file mode 100644
index 5890fe3..0000000
Binary files a/assets/作物/草莓/3.png and /dev/null differ
diff --git a/assets/作物/草莓/3.png.import b/assets/作物/草莓/3.png.import
deleted file mode 100644
index 4f6e8b0..0000000
--- a/assets/作物/草莓/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://du1brm1rpdnxb"
-path="res://.godot/imported/3.png-91b3b2044adcd9acba1494f34b8eff56.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/草莓/3.png"
-dest_files=["res://.godot/imported/3.png-91b3b2044adcd9acba1494f34b8eff56.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/草莓/3.webp b/assets/作物/草莓/3.webp
new file mode 100644
index 0000000..12c5c9f
Binary files /dev/null and b/assets/作物/草莓/3.webp differ
diff --git a/assets/作物/菊花/0.webp b/assets/作物/菊花/0.webp
new file mode 100644
index 0000000..bc816f7
Binary files /dev/null and b/assets/作物/菊花/0.webp differ
diff --git a/assets/作物/菊花/1.webp b/assets/作物/菊花/1.webp
new file mode 100644
index 0000000..91a6da6
Binary files /dev/null and b/assets/作物/菊花/1.webp differ
diff --git a/assets/作物/菊花/2.webp b/assets/作物/菊花/2.webp
new file mode 100644
index 0000000..0ae8d5a
Binary files /dev/null and b/assets/作物/菊花/2.webp differ
diff --git a/assets/作物/菊花/3.webp b/assets/作物/菊花/3.webp
new file mode 100644
index 0000000..ca2545d
Binary files /dev/null and b/assets/作物/菊花/3.webp differ
diff --git a/assets/作物/菊花/4.webp b/assets/作物/菊花/4.webp
new file mode 100644
index 0000000..d1b6161
Binary files /dev/null and b/assets/作物/菊花/4.webp differ
diff --git a/assets/作物/菠萝/0.webp b/assets/作物/菠萝/0.webp
new file mode 100644
index 0000000..f31524b
Binary files /dev/null and b/assets/作物/菠萝/0.webp differ
diff --git a/assets/作物/菠萝/1.webp b/assets/作物/菠萝/1.webp
new file mode 100644
index 0000000..d0bcce7
Binary files /dev/null and b/assets/作物/菠萝/1.webp differ
diff --git a/assets/作物/菠萝/2.webp b/assets/作物/菠萝/2.webp
new file mode 100644
index 0000000..8e895f6
Binary files /dev/null and b/assets/作物/菠萝/2.webp differ
diff --git a/assets/作物/菠萝/3.webp b/assets/作物/菠萝/3.webp
new file mode 100644
index 0000000..2c1dc6e
Binary files /dev/null and b/assets/作物/菠萝/3.webp differ
diff --git a/assets/作物/菠萝/4.webp b/assets/作物/菠萝/4.webp
new file mode 100644
index 0000000..e75c2fa
Binary files /dev/null and b/assets/作物/菠萝/4.webp differ
diff --git a/assets/作物/葡萄/0.png b/assets/作物/葡萄/0.png
deleted file mode 100644
index cf1d311..0000000
Binary files a/assets/作物/葡萄/0.png and /dev/null differ
diff --git a/assets/作物/葡萄/0.png.import b/assets/作物/葡萄/0.png.import
deleted file mode 100644
index a49c41b..0000000
--- a/assets/作物/葡萄/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://tye0qcwa4ecs"
-path="res://.godot/imported/0.png-38730186a9acbf62b0a56667577bcb30.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/0.png"
-dest_files=["res://.godot/imported/0.png-38730186a9acbf62b0a56667577bcb30.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/0.webp b/assets/作物/葡萄/0.webp
new file mode 100644
index 0000000..be7f7c2
Binary files /dev/null and b/assets/作物/葡萄/0.webp differ
diff --git a/assets/作物/葡萄/1.png b/assets/作物/葡萄/1.png
deleted file mode 100644
index 9bf73ca..0000000
Binary files a/assets/作物/葡萄/1.png and /dev/null differ
diff --git a/assets/作物/葡萄/1.png.import b/assets/作物/葡萄/1.png.import
deleted file mode 100644
index db3bec5..0000000
--- a/assets/作物/葡萄/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://de5tr8hmg136m"
-path="res://.godot/imported/1.png-655c9fe3e05ead5ec53106f1822002b8.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/1.png"
-dest_files=["res://.godot/imported/1.png-655c9fe3e05ead5ec53106f1822002b8.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/1.webp b/assets/作物/葡萄/1.webp
new file mode 100644
index 0000000..e9eed2d
Binary files /dev/null and b/assets/作物/葡萄/1.webp differ
diff --git a/assets/作物/葡萄/2.png b/assets/作物/葡萄/2.png
deleted file mode 100644
index b5332df..0000000
Binary files a/assets/作物/葡萄/2.png and /dev/null differ
diff --git a/assets/作物/葡萄/2.png.import b/assets/作物/葡萄/2.png.import
deleted file mode 100644
index adb8aa9..0000000
--- a/assets/作物/葡萄/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://s5ofclxt3t7g"
-path="res://.godot/imported/2.png-b43d1e95017818e43a530249ff774a91.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/2.png"
-dest_files=["res://.godot/imported/2.png-b43d1e95017818e43a530249ff774a91.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/2.webp b/assets/作物/葡萄/2.webp
new file mode 100644
index 0000000..7d618fc
Binary files /dev/null and b/assets/作物/葡萄/2.webp differ
diff --git a/assets/作物/葡萄/3.png b/assets/作物/葡萄/3.png
deleted file mode 100644
index b5af02c..0000000
Binary files a/assets/作物/葡萄/3.png and /dev/null differ
diff --git a/assets/作物/葡萄/3.png.import b/assets/作物/葡萄/3.png.import
deleted file mode 100644
index 2f716ef..0000000
--- a/assets/作物/葡萄/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cc7qohdq6uiol"
-path="res://.godot/imported/3.png-e50d3599ae06ca8c6c9686ab5e1f8b68.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/3.png"
-dest_files=["res://.godot/imported/3.png-e50d3599ae06ca8c6c9686ab5e1f8b68.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/3.webp b/assets/作物/葡萄/3.webp
new file mode 100644
index 0000000..532fa48
Binary files /dev/null and b/assets/作物/葡萄/3.webp differ
diff --git a/assets/作物/葡萄/4.png b/assets/作物/葡萄/4.png
deleted file mode 100644
index 9774f8d..0000000
Binary files a/assets/作物/葡萄/4.png and /dev/null differ
diff --git a/assets/作物/葡萄/4.png.import b/assets/作物/葡萄/4.png.import
deleted file mode 100644
index 6df0a48..0000000
--- a/assets/作物/葡萄/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cysjiaou40akq"
-path="res://.godot/imported/4.png-d7662341c15f3b9700f8d73316f94905.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/4.png"
-dest_files=["res://.godot/imported/4.png-d7662341c15f3b9700f8d73316f94905.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/4.webp b/assets/作物/葡萄/4.webp
new file mode 100644
index 0000000..45f7c16
Binary files /dev/null and b/assets/作物/葡萄/4.webp differ
diff --git a/assets/作物/葡萄/5.png b/assets/作物/葡萄/5.png
deleted file mode 100644
index ca1dc7d..0000000
Binary files a/assets/作物/葡萄/5.png and /dev/null differ
diff --git a/assets/作物/葡萄/5.png.import b/assets/作物/葡萄/5.png.import
deleted file mode 100644
index 0b9362e..0000000
--- a/assets/作物/葡萄/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dn503tm5u57pp"
-path="res://.godot/imported/5.png-7eccf40a6e89dcd868fb9f2a34c31512.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/葡萄/5.png"
-dest_files=["res://.godot/imported/5.png-7eccf40a6e89dcd868fb9f2a34c31512.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/葡萄/5.webp b/assets/作物/葡萄/5.webp
new file mode 100644
index 0000000..d20369b
Binary files /dev/null and b/assets/作物/葡萄/5.webp differ
diff --git a/assets/作物/蓝莓/0.png b/assets/作物/蓝莓/0.png
deleted file mode 100644
index 5562545..0000000
Binary files a/assets/作物/蓝莓/0.png and /dev/null differ
diff --git a/assets/作物/蓝莓/0.png.import b/assets/作物/蓝莓/0.png.import
deleted file mode 100644
index 4776418..0000000
--- a/assets/作物/蓝莓/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://fi2jjd2sycwv"
-path="res://.godot/imported/0.png-00199a921e333eacc64c001481c52cb2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/0.png"
-dest_files=["res://.godot/imported/0.png-00199a921e333eacc64c001481c52cb2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/0.webp b/assets/作物/蓝莓/0.webp
new file mode 100644
index 0000000..7288b3f
Binary files /dev/null and b/assets/作物/蓝莓/0.webp differ
diff --git a/assets/作物/蓝莓/1.png b/assets/作物/蓝莓/1.png
deleted file mode 100644
index 0ec2da1..0000000
Binary files a/assets/作物/蓝莓/1.png and /dev/null differ
diff --git a/assets/作物/蓝莓/1.png.import b/assets/作物/蓝莓/1.png.import
deleted file mode 100644
index 52872f9..0000000
--- a/assets/作物/蓝莓/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://4x4rekc6shlm"
-path="res://.godot/imported/1.png-bad68e98a372ff8c2f3033f8985d63a2.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/1.png"
-dest_files=["res://.godot/imported/1.png-bad68e98a372ff8c2f3033f8985d63a2.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/1.webp b/assets/作物/蓝莓/1.webp
new file mode 100644
index 0000000..a91a2b0
Binary files /dev/null and b/assets/作物/蓝莓/1.webp differ
diff --git a/assets/作物/蓝莓/2.png b/assets/作物/蓝莓/2.png
deleted file mode 100644
index 9a47bbc..0000000
Binary files a/assets/作物/蓝莓/2.png and /dev/null differ
diff --git a/assets/作物/蓝莓/2.png.import b/assets/作物/蓝莓/2.png.import
deleted file mode 100644
index bf98356..0000000
--- a/assets/作物/蓝莓/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://4kj8hhwuq4g6"
-path="res://.godot/imported/2.png-a8a07ee1bdbd240051705a8fbf7f927e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/2.png"
-dest_files=["res://.godot/imported/2.png-a8a07ee1bdbd240051705a8fbf7f927e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/2.webp b/assets/作物/蓝莓/2.webp
new file mode 100644
index 0000000..f08fbbf
Binary files /dev/null and b/assets/作物/蓝莓/2.webp differ
diff --git a/assets/作物/蓝莓/3.png b/assets/作物/蓝莓/3.png
deleted file mode 100644
index d271538..0000000
Binary files a/assets/作物/蓝莓/3.png and /dev/null differ
diff --git a/assets/作物/蓝莓/3.png.import b/assets/作物/蓝莓/3.png.import
deleted file mode 100644
index 12b34b9..0000000
--- a/assets/作物/蓝莓/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cfv438f3lay0i"
-path="res://.godot/imported/3.png-e3c10c36e2d319fdb12a349615175cdb.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/3.png"
-dest_files=["res://.godot/imported/3.png-e3c10c36e2d319fdb12a349615175cdb.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/3.webp b/assets/作物/蓝莓/3.webp
new file mode 100644
index 0000000..37fbb57
Binary files /dev/null and b/assets/作物/蓝莓/3.webp differ
diff --git a/assets/作物/蓝莓/4.png b/assets/作物/蓝莓/4.png
deleted file mode 100644
index a976108..0000000
Binary files a/assets/作物/蓝莓/4.png and /dev/null differ
diff --git a/assets/作物/蓝莓/4.png.import b/assets/作物/蓝莓/4.png.import
deleted file mode 100644
index b9a310e..0000000
--- a/assets/作物/蓝莓/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bb3ko7pooawr5"
-path="res://.godot/imported/4.png-cb72430978916fa2987828bc567a8b2d.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/4.png"
-dest_files=["res://.godot/imported/4.png-cb72430978916fa2987828bc567a8b2d.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/4.webp b/assets/作物/蓝莓/4.webp
new file mode 100644
index 0000000..b5024b6
Binary files /dev/null and b/assets/作物/蓝莓/4.webp differ
diff --git a/assets/作物/蓝莓/5.png b/assets/作物/蓝莓/5.png
deleted file mode 100644
index eb8b825..0000000
Binary files a/assets/作物/蓝莓/5.png and /dev/null differ
diff --git a/assets/作物/蓝莓/5.png.import b/assets/作物/蓝莓/5.png.import
deleted file mode 100644
index a6caef3..0000000
--- a/assets/作物/蓝莓/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cxsbdvcajc01o"
-path="res://.godot/imported/5.png-dc4880ca5ff3752c9b2d9cb37bc0d241.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/蓝莓/5.png"
-dest_files=["res://.godot/imported/5.png-dc4880ca5ff3752c9b2d9cb37bc0d241.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/蓝莓/5.webp b/assets/作物/蓝莓/5.webp
new file mode 100644
index 0000000..89d93f9
Binary files /dev/null and b/assets/作物/蓝莓/5.webp differ
diff --git a/assets/作物/蕨菜/0.webp b/assets/作物/蕨菜/0.webp
new file mode 100644
index 0000000..fe1cd04
Binary files /dev/null and b/assets/作物/蕨菜/0.webp differ
diff --git a/assets/作物/蕨菜/1.webp b/assets/作物/蕨菜/1.webp
new file mode 100644
index 0000000..629cb58
Binary files /dev/null and b/assets/作物/蕨菜/1.webp differ
diff --git a/assets/作物/蕨菜/2.webp b/assets/作物/蕨菜/2.webp
new file mode 100644
index 0000000..e94c138
Binary files /dev/null and b/assets/作物/蕨菜/2.webp differ
diff --git a/assets/作物/蕨菜/3.webp b/assets/作物/蕨菜/3.webp
new file mode 100644
index 0000000..87ae745
Binary files /dev/null and b/assets/作物/蕨菜/3.webp differ
diff --git a/assets/作物/蕨菜/4.webp b/assets/作物/蕨菜/4.webp
new file mode 100644
index 0000000..fee7a3b
Binary files /dev/null and b/assets/作物/蕨菜/4.webp differ
diff --git a/assets/作物/蕨菜/5.webp b/assets/作物/蕨菜/5.webp
new file mode 100644
index 0000000..7455be1
Binary files /dev/null and b/assets/作物/蕨菜/5.webp differ
diff --git a/assets/作物/蕨菜/6.webp b/assets/作物/蕨菜/6.webp
new file mode 100644
index 0000000..8b9f2f7
Binary files /dev/null and b/assets/作物/蕨菜/6.webp differ
diff --git a/assets/作物/蕨菜/7.webp b/assets/作物/蕨菜/7.webp
new file mode 100644
index 0000000..c83cfa2
Binary files /dev/null and b/assets/作物/蕨菜/7.webp differ
diff --git a/assets/作物/西瓜/0.png b/assets/作物/西瓜/0.png
deleted file mode 100644
index c3d9841..0000000
Binary files a/assets/作物/西瓜/0.png and /dev/null differ
diff --git a/assets/作物/西瓜/0.png.import b/assets/作物/西瓜/0.png.import
deleted file mode 100644
index aad9ff4..0000000
--- a/assets/作物/西瓜/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cq3x62ki0huuw"
-path="res://.godot/imported/0.png-3742b6d7e1c4e282a30c5ea019f93c88.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/0.png"
-dest_files=["res://.godot/imported/0.png-3742b6d7e1c4e282a30c5ea019f93c88.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/0.webp b/assets/作物/西瓜/0.webp
new file mode 100644
index 0000000..0a91110
Binary files /dev/null and b/assets/作物/西瓜/0.webp differ
diff --git a/assets/作物/西瓜/1.png b/assets/作物/西瓜/1.png
deleted file mode 100644
index c720dbf..0000000
Binary files a/assets/作物/西瓜/1.png and /dev/null differ
diff --git a/assets/作物/西瓜/1.png.import b/assets/作物/西瓜/1.png.import
deleted file mode 100644
index b8108ba..0000000
--- a/assets/作物/西瓜/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://mlvo3ihvcswi"
-path="res://.godot/imported/1.png-a9ba38f5057b76e8bea037174fa8c089.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/1.png"
-dest_files=["res://.godot/imported/1.png-a9ba38f5057b76e8bea037174fa8c089.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/1.webp b/assets/作物/西瓜/1.webp
new file mode 100644
index 0000000..e2f38a3
Binary files /dev/null and b/assets/作物/西瓜/1.webp differ
diff --git a/assets/作物/西瓜/2.png b/assets/作物/西瓜/2.png
deleted file mode 100644
index 77ca232..0000000
Binary files a/assets/作物/西瓜/2.png and /dev/null differ
diff --git a/assets/作物/西瓜/2.png.import b/assets/作物/西瓜/2.png.import
deleted file mode 100644
index 601dd51..0000000
--- a/assets/作物/西瓜/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bh3ndc6nifed8"
-path="res://.godot/imported/2.png-51f8d40f2cf1663d86403055a4390496.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/2.png"
-dest_files=["res://.godot/imported/2.png-51f8d40f2cf1663d86403055a4390496.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/2.webp b/assets/作物/西瓜/2.webp
new file mode 100644
index 0000000..cad75af
Binary files /dev/null and b/assets/作物/西瓜/2.webp differ
diff --git a/assets/作物/西瓜/3.png b/assets/作物/西瓜/3.png
deleted file mode 100644
index dfd20d5..0000000
Binary files a/assets/作物/西瓜/3.png and /dev/null differ
diff --git a/assets/作物/西瓜/3.png.import b/assets/作物/西瓜/3.png.import
deleted file mode 100644
index 1f3d738..0000000
--- a/assets/作物/西瓜/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://4x8r4t2muf4t"
-path="res://.godot/imported/3.png-f288b9ffdd3d24ac69694912648a2c2f.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/3.png"
-dest_files=["res://.godot/imported/3.png-f288b9ffdd3d24ac69694912648a2c2f.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/3.webp b/assets/作物/西瓜/3.webp
new file mode 100644
index 0000000..4f4d241
Binary files /dev/null and b/assets/作物/西瓜/3.webp differ
diff --git a/assets/作物/西瓜/4.png b/assets/作物/西瓜/4.png
deleted file mode 100644
index 305aadc..0000000
Binary files a/assets/作物/西瓜/4.png and /dev/null differ
diff --git a/assets/作物/西瓜/4.png.import b/assets/作物/西瓜/4.png.import
deleted file mode 100644
index 979edd9..0000000
--- a/assets/作物/西瓜/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bbd6aykbpapjj"
-path="res://.godot/imported/4.png-dcfa99924c6cac1ff1ada3a6de88145d.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/4.png"
-dest_files=["res://.godot/imported/4.png-dcfa99924c6cac1ff1ada3a6de88145d.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/4.webp b/assets/作物/西瓜/4.webp
new file mode 100644
index 0000000..3edc1ac
Binary files /dev/null and b/assets/作物/西瓜/4.webp differ
diff --git a/assets/作物/西瓜/5.png b/assets/作物/西瓜/5.png
deleted file mode 100644
index a0c69a3..0000000
Binary files a/assets/作物/西瓜/5.png and /dev/null differ
diff --git a/assets/作物/西瓜/5.png.import b/assets/作物/西瓜/5.png.import
deleted file mode 100644
index b1c3fbf..0000000
--- a/assets/作物/西瓜/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c0nmhw6qika6j"
-path="res://.godot/imported/5.png-5cc59cd8253d19264258fead63db9327.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/5.png"
-dest_files=["res://.godot/imported/5.png-5cc59cd8253d19264258fead63db9327.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/5.webp b/assets/作物/西瓜/5.webp
new file mode 100644
index 0000000..d9b0acf
Binary files /dev/null and b/assets/作物/西瓜/5.webp differ
diff --git a/assets/作物/西瓜/6.png b/assets/作物/西瓜/6.png
deleted file mode 100644
index 8a9959f..0000000
Binary files a/assets/作物/西瓜/6.png and /dev/null differ
diff --git a/assets/作物/西瓜/6.png.import b/assets/作物/西瓜/6.png.import
deleted file mode 100644
index ef8e645..0000000
--- a/assets/作物/西瓜/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cx75gv3q67bec"
-path="res://.godot/imported/6.png-41015a6769e425862043e6f80e81c9e5.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/西瓜/6.png"
-dest_files=["res://.godot/imported/6.png-41015a6769e425862043e6f80e81c9e5.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/西瓜/6.webp b/assets/作物/西瓜/6.webp
new file mode 100644
index 0000000..47c22b6
Binary files /dev/null and b/assets/作物/西瓜/6.webp differ
diff --git a/assets/作物/豌豆/0.webp b/assets/作物/豌豆/0.webp
new file mode 100644
index 0000000..be9f4af
Binary files /dev/null and b/assets/作物/豌豆/0.webp differ
diff --git a/assets/作物/豌豆/1.webp b/assets/作物/豌豆/1.webp
new file mode 100644
index 0000000..9d5a1d1
Binary files /dev/null and b/assets/作物/豌豆/1.webp differ
diff --git a/assets/作物/豌豆/2.webp b/assets/作物/豌豆/2.webp
new file mode 100644
index 0000000..63d6618
Binary files /dev/null and b/assets/作物/豌豆/2.webp differ
diff --git a/assets/作物/豌豆/3.webp b/assets/作物/豌豆/3.webp
new file mode 100644
index 0000000..3c6cf97
Binary files /dev/null and b/assets/作物/豌豆/3.webp differ
diff --git a/assets/作物/豌豆/4.webp b/assets/作物/豌豆/4.webp
new file mode 100644
index 0000000..6c3c658
Binary files /dev/null and b/assets/作物/豌豆/4.webp differ
diff --git a/assets/作物/辣椒/0.webp b/assets/作物/辣椒/0.webp
new file mode 100644
index 0000000..fab6ff8
Binary files /dev/null and b/assets/作物/辣椒/0.webp differ
diff --git a/assets/作物/辣椒/1.webp b/assets/作物/辣椒/1.webp
new file mode 100644
index 0000000..057b012
Binary files /dev/null and b/assets/作物/辣椒/1.webp differ
diff --git a/assets/作物/辣椒/2.webp b/assets/作物/辣椒/2.webp
new file mode 100644
index 0000000..89eb258
Binary files /dev/null and b/assets/作物/辣椒/2.webp differ
diff --git a/assets/作物/辣椒/3.webp b/assets/作物/辣椒/3.webp
new file mode 100644
index 0000000..39d4da2
Binary files /dev/null and b/assets/作物/辣椒/3.webp differ
diff --git a/assets/作物/辣椒/4.webp b/assets/作物/辣椒/4.webp
new file mode 100644
index 0000000..1cbf807
Binary files /dev/null and b/assets/作物/辣椒/4.webp differ
diff --git a/assets/作物/辣椒/5.webp b/assets/作物/辣椒/5.webp
new file mode 100644
index 0000000..57ea0e1
Binary files /dev/null and b/assets/作物/辣椒/5.webp differ
diff --git a/assets/作物/辣椒/6.webp b/assets/作物/辣椒/6.webp
new file mode 100644
index 0000000..8d3c341
Binary files /dev/null and b/assets/作物/辣椒/6.webp differ
diff --git a/assets/作物/金橘/0.png b/assets/作物/金橘/0.png
deleted file mode 100644
index 19e7cf2..0000000
Binary files a/assets/作物/金橘/0.png and /dev/null differ
diff --git a/assets/作物/金橘/0.png.import b/assets/作物/金橘/0.png.import
deleted file mode 100644
index a7193a1..0000000
--- a/assets/作物/金橘/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ic81572bfqll"
-path="res://.godot/imported/0.png-51b1c395d40ea9426a8fbf538ebe7f21.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/0.png"
-dest_files=["res://.godot/imported/0.png-51b1c395d40ea9426a8fbf538ebe7f21.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/0.webp b/assets/作物/金橘/0.webp
new file mode 100644
index 0000000..f88e85d
Binary files /dev/null and b/assets/作物/金橘/0.webp differ
diff --git a/assets/作物/金橘/1.png b/assets/作物/金橘/1.png
deleted file mode 100644
index 5d85d23..0000000
Binary files a/assets/作物/金橘/1.png and /dev/null differ
diff --git a/assets/作物/金橘/1.png.import b/assets/作物/金橘/1.png.import
deleted file mode 100644
index e3c8b63..0000000
--- a/assets/作物/金橘/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://364oeghmr7bj"
-path="res://.godot/imported/1.png-62365bc565e43705d7ee7927b38bcdaa.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/1.png"
-dest_files=["res://.godot/imported/1.png-62365bc565e43705d7ee7927b38bcdaa.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/1.webp b/assets/作物/金橘/1.webp
new file mode 100644
index 0000000..54f4222
Binary files /dev/null and b/assets/作物/金橘/1.webp differ
diff --git a/assets/作物/金橘/2.png b/assets/作物/金橘/2.png
deleted file mode 100644
index 404f68b..0000000
Binary files a/assets/作物/金橘/2.png and /dev/null differ
diff --git a/assets/作物/金橘/2.png.import b/assets/作物/金橘/2.png.import
deleted file mode 100644
index 1309df6..0000000
--- a/assets/作物/金橘/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cxqwlavni0cps"
-path="res://.godot/imported/2.png-21760195e337a8529263cf401c6e024c.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/2.png"
-dest_files=["res://.godot/imported/2.png-21760195e337a8529263cf401c6e024c.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/2.webp b/assets/作物/金橘/2.webp
new file mode 100644
index 0000000..7117bdc
Binary files /dev/null and b/assets/作物/金橘/2.webp differ
diff --git a/assets/作物/金橘/3.png b/assets/作物/金橘/3.png
deleted file mode 100644
index 7517e01..0000000
Binary files a/assets/作物/金橘/3.png and /dev/null differ
diff --git a/assets/作物/金橘/3.png.import b/assets/作物/金橘/3.png.import
deleted file mode 100644
index 4042f84..0000000
--- a/assets/作物/金橘/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://mcpapc353utr"
-path="res://.godot/imported/3.png-a67daf809f4170978f3d586df40cd5bf.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/3.png"
-dest_files=["res://.godot/imported/3.png-a67daf809f4170978f3d586df40cd5bf.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/3.webp b/assets/作物/金橘/3.webp
new file mode 100644
index 0000000..808ad35
Binary files /dev/null and b/assets/作物/金橘/3.webp differ
diff --git a/assets/作物/金橘/4.png b/assets/作物/金橘/4.png
deleted file mode 100644
index f499ccf..0000000
Binary files a/assets/作物/金橘/4.png and /dev/null differ
diff --git a/assets/作物/金橘/4.png.import b/assets/作物/金橘/4.png.import
deleted file mode 100644
index bb996cd..0000000
--- a/assets/作物/金橘/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://doob3ym5xqkue"
-path="res://.godot/imported/4.png-40351c27fe8a85ece550012b86fa70f4.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/4.png"
-dest_files=["res://.godot/imported/4.png-40351c27fe8a85ece550012b86fa70f4.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/4.webp b/assets/作物/金橘/4.webp
new file mode 100644
index 0000000..b3c7cdc
Binary files /dev/null and b/assets/作物/金橘/4.webp differ
diff --git a/assets/作物/金橘/5.png b/assets/作物/金橘/5.png
deleted file mode 100644
index b07f07f..0000000
Binary files a/assets/作物/金橘/5.png and /dev/null differ
diff --git a/assets/作物/金橘/5.png.import b/assets/作物/金橘/5.png.import
deleted file mode 100644
index 264d9b7..0000000
--- a/assets/作物/金橘/5.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://djvap68it2ys0"
-path="res://.godot/imported/5.png-5f6c326133b55709b7cca11e09db34c4.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/5.png"
-dest_files=["res://.godot/imported/5.png-5f6c326133b55709b7cca11e09db34c4.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/5.webp b/assets/作物/金橘/5.webp
new file mode 100644
index 0000000..0eda12a
Binary files /dev/null and b/assets/作物/金橘/5.webp differ
diff --git a/assets/作物/金橘/6.png b/assets/作物/金橘/6.png
deleted file mode 100644
index 068d9d5..0000000
Binary files a/assets/作物/金橘/6.png and /dev/null differ
diff --git a/assets/作物/金橘/6.png.import b/assets/作物/金橘/6.png.import
deleted file mode 100644
index 4be1f41..0000000
--- a/assets/作物/金橘/6.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://3gu8kspy5mmj"
-path="res://.godot/imported/6.png-b7e1fe80fdac44a7b537e2edb47b99a6.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/6.png"
-dest_files=["res://.godot/imported/6.png-b7e1fe80fdac44a7b537e2edb47b99a6.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/6.webp b/assets/作物/金橘/6.webp
new file mode 100644
index 0000000..55aefa9
Binary files /dev/null and b/assets/作物/金橘/6.webp differ
diff --git a/assets/作物/金橘/7.png b/assets/作物/金橘/7.png
deleted file mode 100644
index 7d87552..0000000
Binary files a/assets/作物/金橘/7.png and /dev/null differ
diff --git a/assets/作物/金橘/7.png.import b/assets/作物/金橘/7.png.import
deleted file mode 100644
index 5953140..0000000
--- a/assets/作物/金橘/7.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://lsu3uttdfurr"
-path="res://.godot/imported/7.png-a66b5472aa7d41090bb820c9ce0e8afa.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/金橘/7.png"
-dest_files=["res://.godot/imported/7.png-a66b5472aa7d41090bb820c9ce0e8afa.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/金橘/7.webp b/assets/作物/金橘/7.webp
new file mode 100644
index 0000000..30eaadc
Binary files /dev/null and b/assets/作物/金橘/7.webp differ
diff --git a/assets/作物/香草/0.png b/assets/作物/香草/0.png
deleted file mode 100644
index 506da7b..0000000
Binary files a/assets/作物/香草/0.png and /dev/null differ
diff --git a/assets/作物/香草/0.png.import b/assets/作物/香草/0.png.import
deleted file mode 100644
index 12e0cb3..0000000
--- a/assets/作物/香草/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cbao0fd55vvdu"
-path="res://.godot/imported/0.png-53fc08d01da54e71f15d397b3187fa45.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/香草/0.png"
-dest_files=["res://.godot/imported/0.png-53fc08d01da54e71f15d397b3187fa45.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/香草/0.webp b/assets/作物/香草/0.webp
new file mode 100644
index 0000000..249483f
Binary files /dev/null and b/assets/作物/香草/0.webp differ
diff --git a/assets/作物/香草/1.png b/assets/作物/香草/1.png
deleted file mode 100644
index 70bcfad..0000000
Binary files a/assets/作物/香草/1.png and /dev/null differ
diff --git a/assets/作物/香草/1.png.import b/assets/作物/香草/1.png.import
deleted file mode 100644
index 2a8c5db..0000000
--- a/assets/作物/香草/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://vo1byg1amdof"
-path="res://.godot/imported/1.png-9abe5cb0ded8cd29a371e93253c025c4.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/香草/1.png"
-dest_files=["res://.godot/imported/1.png-9abe5cb0ded8cd29a371e93253c025c4.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/香草/1.webp b/assets/作物/香草/1.webp
new file mode 100644
index 0000000..357bb04
Binary files /dev/null and b/assets/作物/香草/1.webp differ
diff --git a/assets/作物/香草/2.png b/assets/作物/香草/2.png
deleted file mode 100644
index 8d675d1..0000000
Binary files a/assets/作物/香草/2.png and /dev/null differ
diff --git a/assets/作物/香草/2.png.import b/assets/作物/香草/2.png.import
deleted file mode 100644
index deccfb6..0000000
--- a/assets/作物/香草/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://btchfqldgiddl"
-path="res://.godot/imported/2.png-30b94c1d6bd5b241c19733ec9cb2eee1.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/香草/2.png"
-dest_files=["res://.godot/imported/2.png-30b94c1d6bd5b241c19733ec9cb2eee1.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/香草/2.webp b/assets/作物/香草/2.webp
new file mode 100644
index 0000000..98bbd2e
Binary files /dev/null and b/assets/作物/香草/2.webp differ
diff --git a/assets/作物/香草/3.png b/assets/作物/香草/3.png
deleted file mode 100644
index 7f69a59..0000000
Binary files a/assets/作物/香草/3.png and /dev/null differ
diff --git a/assets/作物/香草/3.png.import b/assets/作物/香草/3.png.import
deleted file mode 100644
index 7f8bf0c..0000000
--- a/assets/作物/香草/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dc7wj1je5s28q"
-path="res://.godot/imported/3.png-7388f44d69260f607c01063724ce4886.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/香草/3.png"
-dest_files=["res://.godot/imported/3.png-7388f44d69260f607c01063724ce4886.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/香草/3.webp b/assets/作物/香草/3.webp
new file mode 100644
index 0000000..7cd688b
Binary files /dev/null and b/assets/作物/香草/3.webp differ
diff --git a/assets/作物/香蕉树/0.webp b/assets/作物/香蕉树/0.webp
new file mode 100644
index 0000000..5fd5304
Binary files /dev/null and b/assets/作物/香蕉树/0.webp differ
diff --git a/assets/作物/香蕉树/1.webp b/assets/作物/香蕉树/1.webp
new file mode 100644
index 0000000..5fd5304
Binary files /dev/null and b/assets/作物/香蕉树/1.webp differ
diff --git a/assets/作物/香蕉树/2.webp b/assets/作物/香蕉树/2.webp
new file mode 100644
index 0000000..fcda389
Binary files /dev/null and b/assets/作物/香蕉树/2.webp differ
diff --git a/assets/作物/香蕉树/3.webp b/assets/作物/香蕉树/3.webp
new file mode 100644
index 0000000..d7ef188
Binary files /dev/null and b/assets/作物/香蕉树/3.webp differ
diff --git a/assets/作物/香蕉树/4.webp b/assets/作物/香蕉树/4.webp
new file mode 100644
index 0000000..870fa95
Binary files /dev/null and b/assets/作物/香蕉树/4.webp differ
diff --git a/assets/作物/香蕉树/5.webp b/assets/作物/香蕉树/5.webp
new file mode 100644
index 0000000..25b07fe
Binary files /dev/null and b/assets/作物/香蕉树/5.webp differ
diff --git a/assets/作物/香蕉树/6.webp b/assets/作物/香蕉树/6.webp
new file mode 100644
index 0000000..f0635df
Binary files /dev/null and b/assets/作物/香蕉树/6.webp differ
diff --git a/assets/作物/鱼腥草/0.webp b/assets/作物/鱼腥草/0.webp
new file mode 100644
index 0000000..9509079
Binary files /dev/null and b/assets/作物/鱼腥草/0.webp differ
diff --git a/assets/作物/鱼腥草/1.webp b/assets/作物/鱼腥草/1.webp
new file mode 100644
index 0000000..b0a66f9
Binary files /dev/null and b/assets/作物/鱼腥草/1.webp differ
diff --git a/assets/作物/鱼腥草/2.webp b/assets/作物/鱼腥草/2.webp
new file mode 100644
index 0000000..568abae
Binary files /dev/null and b/assets/作物/鱼腥草/2.webp differ
diff --git a/assets/作物/鱼腥草/3.webp b/assets/作物/鱼腥草/3.webp
new file mode 100644
index 0000000..15f8d9c
Binary files /dev/null and b/assets/作物/鱼腥草/3.webp differ
diff --git a/assets/作物/鱼腥草/4.webp b/assets/作物/鱼腥草/4.webp
new file mode 100644
index 0000000..4aff255
Binary files /dev/null and b/assets/作物/鱼腥草/4.webp differ
diff --git a/assets/作物/黄瓜/0.webp b/assets/作物/黄瓜/0.webp
new file mode 100644
index 0000000..8f1ffb8
Binary files /dev/null and b/assets/作物/黄瓜/0.webp differ
diff --git a/assets/作物/黄瓜/1.webp b/assets/作物/黄瓜/1.webp
new file mode 100644
index 0000000..7ecfb3a
Binary files /dev/null and b/assets/作物/黄瓜/1.webp differ
diff --git a/assets/作物/黄瓜/2.webp b/assets/作物/黄瓜/2.webp
new file mode 100644
index 0000000..0868493
Binary files /dev/null and b/assets/作物/黄瓜/2.webp differ
diff --git a/assets/作物/默认/0.png b/assets/作物/默认/0.png
deleted file mode 100644
index c3897cb..0000000
Binary files a/assets/作物/默认/0.png and /dev/null differ
diff --git a/assets/作物/默认/0.png.import b/assets/作物/默认/0.png.import
deleted file mode 100644
index f8a569b..0000000
--- a/assets/作物/默认/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://kdhowrc6av4g"
-path="res://.godot/imported/0.png-15c614c8b6ef776bad388aaf408f4023.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/默认/0.png"
-dest_files=["res://.godot/imported/0.png-15c614c8b6ef776bad388aaf408f4023.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/默认/0.webp b/assets/作物/默认/0.webp
new file mode 100644
index 0000000..13c7ea6
Binary files /dev/null and b/assets/作物/默认/0.webp differ
diff --git a/assets/作物/龙果/0.png b/assets/作物/龙果/0.png
deleted file mode 100644
index 24c6d24..0000000
Binary files a/assets/作物/龙果/0.png and /dev/null differ
diff --git a/assets/作物/龙果/0.png.import b/assets/作物/龙果/0.png.import
deleted file mode 100644
index b9e275a..0000000
--- a/assets/作物/龙果/0.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bs4pkkmc80l6h"
-path="res://.godot/imported/0.png-3163a16c96b63c242e45e140a3d41e00.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/龙果/0.png"
-dest_files=["res://.godot/imported/0.png-3163a16c96b63c242e45e140a3d41e00.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/龙果/0.webp b/assets/作物/龙果/0.webp
new file mode 100644
index 0000000..43e5aa8
Binary files /dev/null and b/assets/作物/龙果/0.webp differ
diff --git a/assets/作物/龙果/1.png b/assets/作物/龙果/1.png
deleted file mode 100644
index 7bf33b0..0000000
Binary files a/assets/作物/龙果/1.png and /dev/null differ
diff --git a/assets/作物/龙果/1.png.import b/assets/作物/龙果/1.png.import
deleted file mode 100644
index dd6487a..0000000
--- a/assets/作物/龙果/1.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ca0fmindl85gm"
-path="res://.godot/imported/1.png-27694ec978f8e9d2b3be4f54065ffb05.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/龙果/1.png"
-dest_files=["res://.godot/imported/1.png-27694ec978f8e9d2b3be4f54065ffb05.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/龙果/1.webp b/assets/作物/龙果/1.webp
new file mode 100644
index 0000000..7e0fde8
Binary files /dev/null and b/assets/作物/龙果/1.webp differ
diff --git a/assets/作物/龙果/2.png b/assets/作物/龙果/2.png
deleted file mode 100644
index 8d17b53..0000000
Binary files a/assets/作物/龙果/2.png and /dev/null differ
diff --git a/assets/作物/龙果/2.png.import b/assets/作物/龙果/2.png.import
deleted file mode 100644
index b722b00..0000000
--- a/assets/作物/龙果/2.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dtsh7d8ag1st"
-path="res://.godot/imported/2.png-2a8d64f80c46b34d0c38a6bc63417504.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/龙果/2.png"
-dest_files=["res://.godot/imported/2.png-2a8d64f80c46b34d0c38a6bc63417504.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/龙果/2.webp b/assets/作物/龙果/2.webp
new file mode 100644
index 0000000..d7f32fa
Binary files /dev/null and b/assets/作物/龙果/2.webp differ
diff --git a/assets/作物/龙果/3.png b/assets/作物/龙果/3.png
deleted file mode 100644
index 039a6d4..0000000
Binary files a/assets/作物/龙果/3.png and /dev/null differ
diff --git a/assets/作物/龙果/3.png.import b/assets/作物/龙果/3.png.import
deleted file mode 100644
index 732d3aa..0000000
--- a/assets/作物/龙果/3.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://djbfevj2liy45"
-path="res://.godot/imported/3.png-100d0d7320e9c0831dc087a2e9c902a4.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/龙果/3.png"
-dest_files=["res://.godot/imported/3.png-100d0d7320e9c0831dc087a2e9c902a4.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/龙果/3.webp b/assets/作物/龙果/3.webp
new file mode 100644
index 0000000..dd4e457
Binary files /dev/null and b/assets/作物/龙果/3.webp differ
diff --git a/assets/作物/龙果/4.png b/assets/作物/龙果/4.png
deleted file mode 100644
index 1628aa7..0000000
Binary files a/assets/作物/龙果/4.png and /dev/null differ
diff --git a/assets/作物/龙果/4.png.import b/assets/作物/龙果/4.png.import
deleted file mode 100644
index e75a01c..0000000
--- a/assets/作物/龙果/4.png.import
+++ /dev/null
@@ -1,34 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b7somcbgl4fod"
-path="res://.godot/imported/4.png-aaaff20fa154ccd324c5ec0f9990f60e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/作物/龙果/4.png"
-dest_files=["res://.godot/imported/4.png-aaaff20fa154ccd324c5ec0f9990f60e.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
diff --git a/assets/作物/龙果/4.webp b/assets/作物/龙果/4.webp
new file mode 100644
index 0000000..6562d0a
Binary files /dev/null and b/assets/作物/龙果/4.webp differ
diff --git a/assets/土地面板图标/升级图标.png b/assets/土地面板图标/升级图标.png
new file mode 100644
index 0000000..7f84de0
Binary files /dev/null and b/assets/土地面板图标/升级图标.png differ
diff --git a/assets/土地面板图标/升级图标.png.import b/assets/土地面板图标/升级图标.png.import
new file mode 100644
index 0000000..ccd9199
--- /dev/null
+++ b/assets/土地面板图标/升级图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfmtpu7tuebek"
+path="res://.godot/imported/升级图标.png-09804f76a09fd879787ff0d2a7ebf8e3.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/升级图标.png"
+dest_files=["res://.godot/imported/升级图标.png-09804f76a09fd879787ff0d2a7ebf8e3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/升级图标2.png b/assets/土地面板图标/升级图标2.png
new file mode 100644
index 0000000..620479a
Binary files /dev/null and b/assets/土地面板图标/升级图标2.png differ
diff --git a/assets/土地面板图标/升级图标2.png.import b/assets/土地面板图标/升级图标2.png.import
new file mode 100644
index 0000000..8911683
--- /dev/null
+++ b/assets/土地面板图标/升级图标2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dg4o3wv1j0fx"
+path="res://.godot/imported/升级图标2.png-9007c17d764381d63fd05659967ac473.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/升级图标2.png"
+dest_files=["res://.godot/imported/升级图标2.png-9007c17d764381d63fd05659967ac473.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/开垦图标2.png b/assets/土地面板图标/开垦图标2.png
new file mode 100644
index 0000000..57c129d
Binary files /dev/null and b/assets/土地面板图标/开垦图标2.png differ
diff --git a/assets/土地面板图标/开垦图标2.png.import b/assets/土地面板图标/开垦图标2.png.import
new file mode 100644
index 0000000..074c19a
--- /dev/null
+++ b/assets/土地面板图标/开垦图标2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7rr7sf8tjicy"
+path="res://.godot/imported/开垦图标2.png-306d3abcbf82c110bc80c70b832ddba5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/开垦图标2.png"
+dest_files=["res://.godot/imported/开垦图标2.png-306d3abcbf82c110bc80c70b832ddba5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/开垦图标4.png b/assets/土地面板图标/开垦图标4.png
new file mode 100644
index 0000000..102b5cf
Binary files /dev/null and b/assets/土地面板图标/开垦图标4.png differ
diff --git a/assets/土地面板图标/开垦图标4.png.import b/assets/土地面板图标/开垦图标4.png.import
new file mode 100644
index 0000000..df1159d
--- /dev/null
+++ b/assets/土地面板图标/开垦图标4.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dpcxeffaqb7ui"
+path="res://.godot/imported/开垦图标4.png-d6daf6f4e62a04f8a231a66299799a59.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/开垦图标4.png"
+dest_files=["res://.godot/imported/开垦图标4.png-d6daf6f4e62a04f8a231a66299799a59.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/收获图标.png b/assets/土地面板图标/收获图标.png
new file mode 100644
index 0000000..415d02b
Binary files /dev/null and b/assets/土地面板图标/收获图标.png differ
diff --git a/assets/土地面板图标/收获图标.png.import b/assets/土地面板图标/收获图标.png.import
new file mode 100644
index 0000000..497baaf
--- /dev/null
+++ b/assets/土地面板图标/收获图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://0jialtvjk576"
+path="res://.godot/imported/收获图标.png-f425579b05e07542842685c0b57118a8.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/收获图标.png"
+dest_files=["res://.godot/imported/收获图标.png-f425579b05e07542842685c0b57118a8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/收获图标2.png b/assets/土地面板图标/收获图标2.png
new file mode 100644
index 0000000..94d1adb
Binary files /dev/null and b/assets/土地面板图标/收获图标2.png differ
diff --git a/assets/土地面板图标/收获图标2.png.import b/assets/土地面板图标/收获图标2.png.import
new file mode 100644
index 0000000..2c3faf7
--- /dev/null
+++ b/assets/土地面板图标/收获图标2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dqwfcpv8orlm7"
+path="res://.godot/imported/收获图标2.png-330fca10757310442df4fc35836e4ebc.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/收获图标2.png"
+dest_files=["res://.godot/imported/收获图标2.png-330fca10757310442df4fc35836e4ebc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/施肥图标.png b/assets/土地面板图标/施肥图标.png
new file mode 100644
index 0000000..f9a4262
Binary files /dev/null and b/assets/土地面板图标/施肥图标.png differ
diff --git a/assets/土地面板图标/施肥图标.png.import b/assets/土地面板图标/施肥图标.png.import
new file mode 100644
index 0000000..aa26c75
--- /dev/null
+++ b/assets/土地面板图标/施肥图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://2ul8g4qf1lif"
+path="res://.godot/imported/施肥图标.png-ca897e14766acb4bca05a56a0651bfb4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/施肥图标.png"
+dest_files=["res://.godot/imported/施肥图标.png-ca897e14766acb4bca05a56a0651bfb4.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/浇水图标.png b/assets/土地面板图标/浇水图标.png
new file mode 100644
index 0000000..22b022b
Binary files /dev/null and b/assets/土地面板图标/浇水图标.png differ
diff --git a/assets/作物/番茄/20250525114503.png.import b/assets/土地面板图标/浇水图标.png.import
similarity index 74%
rename from assets/作物/番茄/20250525114503.png.import
rename to assets/土地面板图标/浇水图标.png.import
index 2241a89..2e4a059 100644
--- a/assets/作物/番茄/20250525114503.png.import
+++ b/assets/土地面板图标/浇水图标.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://d1t5dw1wicw5c"
-path="res://.godot/imported/20250525114503.png-71d534aab30af97ed83f772abb36c52b.ctex"
+uid="uid://813kjpdpfu0k"
+path="res://.godot/imported/浇水图标.png-7fe267d629fa4042c6fef9e39c221937.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/作物/番茄/20250525114503.png"
-dest_files=["res://.godot/imported/20250525114503.png-71d534aab30af97ed83f772abb36c52b.ctex"]
+source_file="res://assets/土地面板图标/浇水图标.png"
+dest_files=["res://.godot/imported/浇水图标.png-7fe267d629fa4042c6fef9e39c221937.ctex"]
[params]
diff --git a/assets/土地面板图标/浇水图标2.png b/assets/土地面板图标/浇水图标2.png
new file mode 100644
index 0000000..49adf2b
Binary files /dev/null and b/assets/土地面板图标/浇水图标2.png differ
diff --git a/assets/土地面板图标/浇水图标2.png.import b/assets/土地面板图标/浇水图标2.png.import
new file mode 100644
index 0000000..c05aa0a
--- /dev/null
+++ b/assets/土地面板图标/浇水图标2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dko11co73pph"
+path="res://.godot/imported/浇水图标2.png-b95fc858726c9a7203cc06d065868952.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/浇水图标2.png"
+dest_files=["res://.godot/imported/浇水图标2.png-b95fc858726c9a7203cc06d065868952.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/浇水图标3.png b/assets/土地面板图标/浇水图标3.png
new file mode 100644
index 0000000..64768c7
Binary files /dev/null and b/assets/土地面板图标/浇水图标3.png differ
diff --git a/assets/土地面板图标/浇水图标3.png.import b/assets/土地面板图标/浇水图标3.png.import
new file mode 100644
index 0000000..be38224
--- /dev/null
+++ b/assets/土地面板图标/浇水图标3.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ba8ptjai2x5h7"
+path="res://.godot/imported/浇水图标3.png-eaa7176d88aa704deab725dd3252b9bf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/浇水图标3.png"
+dest_files=["res://.godot/imported/浇水图标3.png-eaa7176d88aa704deab725dd3252b9bf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/种植图标.png b/assets/土地面板图标/种植图标.png
new file mode 100644
index 0000000..81aabf5
Binary files /dev/null and b/assets/土地面板图标/种植图标.png differ
diff --git a/assets/土地面板图标/种植图标.png.import b/assets/土地面板图标/种植图标.png.import
new file mode 100644
index 0000000..0c79587
--- /dev/null
+++ b/assets/土地面板图标/种植图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dr5gdk5ol2wbs"
+path="res://.godot/imported/种植图标.png-e9f5dcb4e59a58d9f5cc079479a211a6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/种植图标.png"
+dest_files=["res://.godot/imported/种植图标.png-e9f5dcb4e59a58d9f5cc079479a211a6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/铲除图标.png b/assets/土地面板图标/铲除图标.png
new file mode 100644
index 0000000..a1eb461
Binary files /dev/null and b/assets/土地面板图标/铲除图标.png differ
diff --git a/assets/土地面板图标/铲除图标.png.import b/assets/土地面板图标/铲除图标.png.import
new file mode 100644
index 0000000..1eda6d3
--- /dev/null
+++ b/assets/土地面板图标/铲除图标.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://gev5f3kf8qrq"
+path="res://.godot/imported/铲除图标.png-19995168de33842fa5b48059e3f138d6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/铲除图标.png"
+dest_files=["res://.godot/imported/铲除图标.png-19995168de33842fa5b48059e3f138d6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/铲除图标2.png b/assets/土地面板图标/铲除图标2.png
new file mode 100644
index 0000000..18a076f
Binary files /dev/null and b/assets/土地面板图标/铲除图标2.png differ
diff --git a/assets/土地面板图标/铲除图标2.png.import b/assets/土地面板图标/铲除图标2.png.import
new file mode 100644
index 0000000..17a0145
--- /dev/null
+++ b/assets/土地面板图标/铲除图标2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8cglsm7u27wg"
+path="res://.godot/imported/铲除图标2.png-7a0efb17cfb630c52c6c2270496a22f1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/铲除图标2.png"
+dest_files=["res://.godot/imported/铲除图标2.png-7a0efb17cfb630c52c6c2270496a22f1.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/土地面板图标/铲除图标3.png b/assets/土地面板图标/铲除图标3.png
new file mode 100644
index 0000000..463b5a9
Binary files /dev/null and b/assets/土地面板图标/铲除图标3.png differ
diff --git a/assets/土地面板图标/铲除图标3.png.import b/assets/土地面板图标/铲除图标3.png.import
new file mode 100644
index 0000000..39ea764
--- /dev/null
+++ b/assets/土地面板图标/铲除图标3.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2gty44ikvair"
+path="res://.godot/imported/铲除图标3.png-c2db85196626ccc799287fa7634fcdaf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/土地面板图标/铲除图标3.png"
+dest_files=["res://.godot/imported/铲除图标3.png-c2db85196626ccc799287fa7634fcdaf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/tu.jpg.import b/assets/地块/tu.jpg.import
similarity index 100%
rename from assets/tu.jpg.import
rename to assets/地块/tu.jpg.import
diff --git a/assets/tu1.jpg b/assets/地块/tu1.jpg
similarity index 100%
rename from assets/tu1.jpg
rename to assets/地块/tu1.jpg
diff --git a/assets/tu1.jpg.import b/assets/地块/tu1.jpg.import
similarity index 73%
rename from assets/tu1.jpg.import
rename to assets/地块/tu1.jpg.import
index 1e0d663..cb1e2c7 100644
--- a/assets/tu1.jpg.import
+++ b/assets/地块/tu1.jpg.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://duoqp854aoeeg"
-path="res://.godot/imported/tu1.jpg-c72e43aa0cb817520503d62990aab61d.ctex"
+path="res://.godot/imported/tu1.jpg-31ea02a072ac9dc67b4f904ec7259377.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/tu1.jpg"
-dest_files=["res://.godot/imported/tu1.jpg-c72e43aa0cb817520503d62990aab61d.ctex"]
+source_file="res://assets/地块/tu1.jpg"
+dest_files=["res://.godot/imported/tu1.jpg-31ea02a072ac9dc67b4f904ec7259377.ctex"]
[params]
diff --git a/assets/tu2.png b/assets/地块/tu2.png
similarity index 100%
rename from assets/tu2.png
rename to assets/地块/tu2.png
diff --git a/assets/tu2.png.import b/assets/地块/tu2.png.import
similarity index 73%
rename from assets/tu2.png.import
rename to assets/地块/tu2.png.import
index 0be4ef7..c72bb0d 100644
--- a/assets/tu2.png.import
+++ b/assets/地块/tu2.png.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://d046caoogul6g"
-path="res://.godot/imported/tu2.png-5c1f2dd0cefd9388c2780247e294469e.ctex"
+path="res://.godot/imported/tu2.png-6b66540f5ad38c86f040fd2bd0c59a46.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/tu2.png"
-dest_files=["res://.godot/imported/tu2.png-5c1f2dd0cefd9388c2780247e294469e.ctex"]
+source_file="res://assets/地块/tu2.png"
+dest_files=["res://.godot/imported/tu2.png-6b66540f5ad38c86f040fd2bd0c59a46.ctex"]
[params]
diff --git a/assets/tu3.png b/assets/地块/土块1.png
similarity index 100%
rename from assets/tu3.png
rename to assets/地块/土块1.png
diff --git a/assets/地块/土块1.png.import b/assets/地块/土块1.png.import
new file mode 100644
index 0000000..539932a
--- /dev/null
+++ b/assets/地块/土块1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://fibjlynv0vi2"
+path="res://.godot/imported/土块1.png-e9a87165b679a4d98f953515a149d752.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/地块/土块1.png"
+dest_files=["res://.godot/imported/土块1.png-e9a87165b679a4d98f953515a149d752.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/杂项/柚小青装饰品.png b/assets/杂项/柚小青装饰品.png
new file mode 100644
index 0000000..45eafc6
Binary files /dev/null and b/assets/杂项/柚小青装饰品.png differ
diff --git a/assets/杂项/柚小青装饰品.png.import b/assets/杂项/柚小青装饰品.png.import
new file mode 100644
index 0000000..eaf3142
--- /dev/null
+++ b/assets/杂项/柚小青装饰品.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b5of6puh4efui"
+path="res://.godot/imported/柚小青装饰品.png-c1935b32bd465aeeefc49219c06f525c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/杂项/柚小青装饰品.png"
+dest_files=["res://.godot/imported/柚小青装饰品.png-c1935b32bd465aeeefc49219c06f525c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/杂项/盗版柚小青.png b/assets/杂项/盗版柚小青.png
new file mode 100644
index 0000000..1b9dfca
Binary files /dev/null and b/assets/杂项/盗版柚小青.png differ
diff --git a/assets/杂项/盗版柚小青.png.import b/assets/杂项/盗版柚小青.png.import
new file mode 100644
index 0000000..8abd245
--- /dev/null
+++ b/assets/杂项/盗版柚小青.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ddbimhr0dpl15"
+path="res://.godot/imported/盗版柚小青.png-f8f170032e30d992fd34c78338f3d891.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/杂项/盗版柚小青.png"
+dest_files=["res://.godot/imported/盗版柚小青.png-f8f170032e30d992fd34c78338f3d891.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景1.png b/assets/背景图片/背景1.png
new file mode 100644
index 0000000..27b1dfc
Binary files /dev/null and b/assets/背景图片/背景1.png differ
diff --git a/assets/背景图片/背景1.png.import b/assets/背景图片/背景1.png.import
new file mode 100644
index 0000000..9e31dda
--- /dev/null
+++ b/assets/背景图片/背景1.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://2h57eo1x7nib"
+path="res://.godot/imported/背景1.png-e2c456604753856fa4ed06167eee46a7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景1.png"
+dest_files=["res://.godot/imported/背景1.png-e2c456604753856fa4ed06167eee46a7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景10.png b/assets/背景图片/背景10.png
new file mode 100644
index 0000000..7ac72aa
Binary files /dev/null and b/assets/背景图片/背景10.png differ
diff --git a/assets/背景图片/背景10.png.import b/assets/背景图片/背景10.png.import
new file mode 100644
index 0000000..8812391
--- /dev/null
+++ b/assets/背景图片/背景10.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bm23ujbm4auk2"
+path="res://.godot/imported/背景10.png-04e962b5d5f3c159a2fa9d481c4f4b42.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景10.png"
+dest_files=["res://.godot/imported/背景10.png-04e962b5d5f3c159a2fa9d481c4f4b42.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景11.png b/assets/背景图片/背景11.png
new file mode 100644
index 0000000..c708391
Binary files /dev/null and b/assets/背景图片/背景11.png differ
diff --git a/assets/背景图片/背景11.png.import b/assets/背景图片/背景11.png.import
new file mode 100644
index 0000000..588f1d7
--- /dev/null
+++ b/assets/背景图片/背景11.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dnlxmdnsy8gc5"
+path="res://.godot/imported/背景11.png-b7e47d1bd3f11f9f56fbe8d47ac9350b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景11.png"
+dest_files=["res://.godot/imported/背景11.png-b7e47d1bd3f11f9f56fbe8d47ac9350b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景12.png b/assets/背景图片/背景12.png
new file mode 100644
index 0000000..f098c70
Binary files /dev/null and b/assets/背景图片/背景12.png differ
diff --git a/assets/背景图片/背景12.png.import b/assets/背景图片/背景12.png.import
new file mode 100644
index 0000000..31fea97
--- /dev/null
+++ b/assets/背景图片/背景12.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c0sjlrwva4fbf"
+path="res://.godot/imported/背景12.png-f1241e413d8bfd0a1045d6d0be4d5c3e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景12.png"
+dest_files=["res://.godot/imported/背景12.png-f1241e413d8bfd0a1045d6d0be4d5c3e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景13.png b/assets/背景图片/背景13.png
new file mode 100644
index 0000000..101e2de
Binary files /dev/null and b/assets/背景图片/背景13.png differ
diff --git a/assets/背景图片/背景13.png.import b/assets/背景图片/背景13.png.import
new file mode 100644
index 0000000..a3606ed
--- /dev/null
+++ b/assets/背景图片/背景13.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnsqojon6wg67"
+path="res://.godot/imported/背景13.png-30d008bfa938f3eef0e818d1f2a8549f.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景13.png"
+dest_files=["res://.godot/imported/背景13.png-30d008bfa938f3eef0e818d1f2a8549f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景14.png b/assets/背景图片/背景14.png
new file mode 100644
index 0000000..7bf0431
Binary files /dev/null and b/assets/背景图片/背景14.png differ
diff --git a/assets/背景图片/背景14.png.import b/assets/背景图片/背景14.png.import
new file mode 100644
index 0000000..8a23fb3
--- /dev/null
+++ b/assets/背景图片/背景14.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://xc0qhcttq10l"
+path="res://.godot/imported/背景14.png-f5cfdf2e0ce8274d011c641294c07b14.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景14.png"
+dest_files=["res://.godot/imported/背景14.png-f5cfdf2e0ce8274d011c641294c07b14.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景15.png b/assets/背景图片/背景15.png
new file mode 100644
index 0000000..febcd63
Binary files /dev/null and b/assets/背景图片/背景15.png differ
diff --git a/assets/背景图片/背景15.png.import b/assets/背景图片/背景15.png.import
new file mode 100644
index 0000000..9cbbe4d
--- /dev/null
+++ b/assets/背景图片/背景15.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bcyk5ukw8vnei"
+path="res://.godot/imported/背景15.png-7849a28c7748d08e677426c682afd141.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景15.png"
+dest_files=["res://.godot/imported/背景15.png-7849a28c7748d08e677426c682afd141.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景16.png b/assets/背景图片/背景16.png
new file mode 100644
index 0000000..6fce6f5
Binary files /dev/null and b/assets/背景图片/背景16.png differ
diff --git a/assets/背景图片/背景16.png.import b/assets/背景图片/背景16.png.import
new file mode 100644
index 0000000..41c5f6a
--- /dev/null
+++ b/assets/背景图片/背景16.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://kldj8jow827u"
+path="res://.godot/imported/背景16.png-a87bae4aff1c6fb63779f2976b049fdd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景16.png"
+dest_files=["res://.godot/imported/背景16.png-a87bae4aff1c6fb63779f2976b049fdd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景17.png b/assets/背景图片/背景17.png
new file mode 100644
index 0000000..0698898
Binary files /dev/null and b/assets/背景图片/背景17.png differ
diff --git a/assets/背景图片/背景17.png.import b/assets/背景图片/背景17.png.import
new file mode 100644
index 0000000..65eea1a
--- /dev/null
+++ b/assets/背景图片/背景17.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cpwogwofy2own"
+path="res://.godot/imported/背景17.png-1e4396501c91605727fd130fd94935b7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景17.png"
+dest_files=["res://.godot/imported/背景17.png-1e4396501c91605727fd130fd94935b7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景18.png b/assets/背景图片/背景18.png
new file mode 100644
index 0000000..ef3dffa
Binary files /dev/null and b/assets/背景图片/背景18.png differ
diff --git a/assets/背景图片/背景18.png.import b/assets/背景图片/背景18.png.import
new file mode 100644
index 0000000..13c3227
--- /dev/null
+++ b/assets/背景图片/背景18.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://8i4l82s8pcis"
+path="res://.godot/imported/背景18.png-0cf236506bc103af5f654c31fb68b91b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景18.png"
+dest_files=["res://.godot/imported/背景18.png-0cf236506bc103af5f654c31fb68b91b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景19.png b/assets/背景图片/背景19.png
new file mode 100644
index 0000000..b4de5cc
Binary files /dev/null and b/assets/背景图片/背景19.png differ
diff --git a/assets/背景图片/背景19.png.import b/assets/背景图片/背景19.png.import
new file mode 100644
index 0000000..b2a349f
--- /dev/null
+++ b/assets/背景图片/背景19.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ccrsewfd3f2t4"
+path="res://.godot/imported/背景19.png-6ba662313911133e3e07dffaa0725527.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景19.png"
+dest_files=["res://.godot/imported/背景19.png-6ba662313911133e3e07dffaa0725527.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景2.png b/assets/背景图片/背景2.png
new file mode 100644
index 0000000..1153515
Binary files /dev/null and b/assets/背景图片/背景2.png differ
diff --git a/assets/背景图片/背景2.png.import b/assets/背景图片/背景2.png.import
new file mode 100644
index 0000000..faba3e3
--- /dev/null
+++ b/assets/背景图片/背景2.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bywcwehal3of7"
+path="res://.godot/imported/背景2.png-fab19a8c3ea8f151f7c8d9251cbc49df.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景2.png"
+dest_files=["res://.godot/imported/背景2.png-fab19a8c3ea8f151f7c8d9251cbc49df.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景20.png b/assets/背景图片/背景20.png
new file mode 100644
index 0000000..cd2b259
Binary files /dev/null and b/assets/背景图片/背景20.png differ
diff --git a/assets/背景图片/背景20.png.import b/assets/背景图片/背景20.png.import
new file mode 100644
index 0000000..367cf68
--- /dev/null
+++ b/assets/背景图片/背景20.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6sampxio2abf"
+path="res://.godot/imported/背景20.png-458daf7cb7157f293b9dddfc3f27bce6.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景20.png"
+dest_files=["res://.godot/imported/背景20.png-458daf7cb7157f293b9dddfc3f27bce6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景21.png b/assets/背景图片/背景21.png
new file mode 100644
index 0000000..b48bdea
Binary files /dev/null and b/assets/背景图片/背景21.png differ
diff --git a/assets/背景图片/背景21.png.import b/assets/背景图片/背景21.png.import
new file mode 100644
index 0000000..9bb33f9
--- /dev/null
+++ b/assets/背景图片/背景21.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ygcdrm8np7a6"
+path="res://.godot/imported/背景21.png-42d58559cd15efac4b1e9f6306a14d2a.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景21.png"
+dest_files=["res://.godot/imported/背景21.png-42d58559cd15efac4b1e9f6306a14d2a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景22.png b/assets/背景图片/背景22.png
new file mode 100644
index 0000000..9a148bd
Binary files /dev/null and b/assets/背景图片/背景22.png differ
diff --git a/assets/背景图片/背景22.png.import b/assets/背景图片/背景22.png.import
new file mode 100644
index 0000000..5b6caf5
--- /dev/null
+++ b/assets/背景图片/背景22.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cgratto8ix24l"
+path="res://.godot/imported/背景22.png-98645e48aed85b00ae2976a7b3a877d7.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景22.png"
+dest_files=["res://.godot/imported/背景22.png-98645e48aed85b00ae2976a7b3a877d7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景3.png b/assets/背景图片/背景3.png
new file mode 100644
index 0000000..88ac756
Binary files /dev/null and b/assets/背景图片/背景3.png differ
diff --git a/assets/背景图片/背景3.png.import b/assets/背景图片/背景3.png.import
new file mode 100644
index 0000000..3f87a2e
--- /dev/null
+++ b/assets/背景图片/背景3.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://crv0glrtn3xh"
+path="res://.godot/imported/背景3.png-e633150041372efea4017e4b4b981bfb.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景3.png"
+dest_files=["res://.godot/imported/背景3.png-e633150041372efea4017e4b4b981bfb.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景4.png b/assets/背景图片/背景4.png
new file mode 100644
index 0000000..730620b
Binary files /dev/null and b/assets/背景图片/背景4.png differ
diff --git a/assets/背景图片/背景4.png.import b/assets/背景图片/背景4.png.import
new file mode 100644
index 0000000..480dace
--- /dev/null
+++ b/assets/背景图片/背景4.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d03xwdx8el0cm"
+path="res://.godot/imported/背景4.png-b4786361237b604ec9ad1d3c78945aa4.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景4.png"
+dest_files=["res://.godot/imported/背景4.png-b4786361237b604ec9ad1d3c78945aa4.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景5.png b/assets/背景图片/背景5.png
new file mode 100644
index 0000000..4a3ad08
Binary files /dev/null and b/assets/背景图片/背景5.png differ
diff --git a/assets/背景图片/背景5.png.import b/assets/背景图片/背景5.png.import
new file mode 100644
index 0000000..e7a6ccb
--- /dev/null
+++ b/assets/背景图片/背景5.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://btljv1hugt8v2"
+path="res://.godot/imported/背景5.png-c6ce6c759e4e0c4221fc6e0ca74c1532.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景5.png"
+dest_files=["res://.godot/imported/背景5.png-c6ce6c759e4e0c4221fc6e0ca74c1532.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景6.png b/assets/背景图片/背景6.png
new file mode 100644
index 0000000..417282e
Binary files /dev/null and b/assets/背景图片/背景6.png differ
diff --git a/assets/背景图片/背景6.png.import b/assets/背景图片/背景6.png.import
new file mode 100644
index 0000000..4ecf462
--- /dev/null
+++ b/assets/背景图片/背景6.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o6mc4svkip0y"
+path="res://.godot/imported/背景6.png-d2e69e5daf35165f19072cb4b5d634d9.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景6.png"
+dest_files=["res://.godot/imported/背景6.png-d2e69e5daf35165f19072cb4b5d634d9.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景7.png b/assets/背景图片/背景7.png
new file mode 100644
index 0000000..66370de
Binary files /dev/null and b/assets/背景图片/背景7.png differ
diff --git a/assets/background2.jpg.import b/assets/背景图片/背景7.png.import
similarity index 72%
rename from assets/background2.jpg.import
rename to assets/背景图片/背景7.png.import
index 1c1f6d9..91ae812 100644
--- a/assets/background2.jpg.import
+++ b/assets/背景图片/背景7.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://cbjtfrej7iq3x"
-path="res://.godot/imported/background2.jpg-20d3edd96b3e306665c2220bbd10aa5d.ctex"
+uid="uid://c6h7k2xcmnfqs"
+path="res://.godot/imported/背景7.png-7486e74174f40de9404d8e31846f28c2.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://assets/background2.jpg"
-dest_files=["res://.godot/imported/background2.jpg-20d3edd96b3e306665c2220bbd10aa5d.ctex"]
+source_file="res://assets/背景图片/背景7.png"
+dest_files=["res://.godot/imported/背景7.png-7486e74174f40de9404d8e31846f28c2.ctex"]
[params]
diff --git a/assets/背景图片/背景8.png b/assets/背景图片/背景8.png
new file mode 100644
index 0000000..b062cd9
Binary files /dev/null and b/assets/背景图片/背景8.png differ
diff --git a/assets/背景图片/背景8.png.import b/assets/背景图片/背景8.png.import
new file mode 100644
index 0000000..ce664cb
--- /dev/null
+++ b/assets/背景图片/背景8.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c778b4iik7gq5"
+path="res://.godot/imported/背景8.png-70e387bb9a4178b2f731e279063d0fd5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景8.png"
+dest_files=["res://.godot/imported/背景8.png-70e387bb9a4178b2f731e279063d0fd5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/背景图片/背景9.png b/assets/背景图片/背景9.png
new file mode 100644
index 0000000..f777a90
Binary files /dev/null and b/assets/背景图片/背景9.png differ
diff --git a/assets/背景图片/背景9.png.import b/assets/背景图片/背景9.png.import
new file mode 100644
index 0000000..b459c89
--- /dev/null
+++ b/assets/背景图片/背景9.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dk781f80sd2d2"
+path="res://.godot/imported/背景9.png-9e1487186f5736772f1946dea0c171b1.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://assets/背景图片/背景9.png"
+dest_files=["res://.godot/imported/背景9.png-9e1487186f5736772f1946dea0c171b1.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3 b/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3
new file mode 100644
index 0000000..de0556e
Binary files /dev/null and b/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3 differ
diff --git a/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3.import b/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3.import
new file mode 100644
index 0000000..6b5cf66
--- /dev/null
+++ b/assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://s1p4ovd7h66u"
+path="res://.godot/imported/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3-b3bb682efbce9e7e74c2236fbddf2404.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3"
+dest_files=["res://.godot/imported/Anibli&RelaxingPianoMusic-StrollThroughtheSky.mp3-b3bb682efbce9e7e74c2236fbddf2404.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/BanAM-Futatabi.mp3 b/assets/音乐/BanAM-Futatabi.mp3
new file mode 100644
index 0000000..2b1c89b
Binary files /dev/null and b/assets/音乐/BanAM-Futatabi.mp3 differ
diff --git a/assets/音乐/BanAM-Futatabi.mp3.import b/assets/音乐/BanAM-Futatabi.mp3.import
new file mode 100644
index 0000000..d18b9c4
--- /dev/null
+++ b/assets/音乐/BanAM-Futatabi.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://scu7dqbk7ouc"
+path="res://.godot/imported/BanAM-Futatabi.mp3-9d361d8cd3e2d4048eb42504db3585cd.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/BanAM-Futatabi.mp3"
+dest_files=["res://.godot/imported/BanAM-Futatabi.mp3-9d361d8cd3e2d4048eb42504db3585cd.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3 b/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3
new file mode 100644
index 0000000..364e63c
Binary files /dev/null and b/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3 differ
diff --git a/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3.import b/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3.import
new file mode 100644
index 0000000..20e96ca
--- /dev/null
+++ b/assets/音乐/MCMZebra-AlwaysandManyTimes.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://dx3m582ii68xx"
+path="res://.godot/imported/MCMZebra-AlwaysandManyTimes.mp3-cd733dc6de7c33aaa1be51a620a33936.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/MCMZebra-AlwaysandManyTimes.mp3"
+dest_files=["res://.godot/imported/MCMZebra-AlwaysandManyTimes.mp3-cd733dc6de7c33aaa1be51a620a33936.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/MicMusicbox-Ashitakasekki.mp3 b/assets/音乐/MicMusicbox-Ashitakasekki.mp3
new file mode 100644
index 0000000..db8d9e2
Binary files /dev/null and b/assets/音乐/MicMusicbox-Ashitakasekki.mp3 differ
diff --git a/assets/音乐/MicMusicbox-Ashitakasekki.mp3.import b/assets/音乐/MicMusicbox-Ashitakasekki.mp3.import
new file mode 100644
index 0000000..0fb5a98
--- /dev/null
+++ b/assets/音乐/MicMusicbox-Ashitakasekki.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://bk6s6noan3nwr"
+path="res://.godot/imported/MicMusicbox-Ashitakasekki.mp3-9273cc80ec4987638b06b22f3bb8f375.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/MicMusicbox-Ashitakasekki.mp3"
+dest_files=["res://.godot/imported/MicMusicbox-Ashitakasekki.mp3-9273cc80ec4987638b06b22f3bb8f375.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/Nemuネム-PromiseoftheWorld.mp3 b/assets/音乐/Nemuネム-PromiseoftheWorld.mp3
new file mode 100644
index 0000000..21bf00e
Binary files /dev/null and b/assets/音乐/Nemuネム-PromiseoftheWorld.mp3 differ
diff --git a/assets/音乐/Nemuネム-PromiseoftheWorld.mp3.import b/assets/音乐/Nemuネム-PromiseoftheWorld.mp3.import
new file mode 100644
index 0000000..6ca0afb
--- /dev/null
+++ b/assets/音乐/Nemuネム-PromiseoftheWorld.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://beh8d18pc3057"
+path="res://.godot/imported/Nemuネム-PromiseoftheWorld.mp3-58398dff0d966600a6d0a7a8d6300f08.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/Nemuネム-PromiseoftheWorld.mp3"
+dest_files=["res://.godot/imported/Nemuネム-PromiseoftheWorld.mp3-58398dff0d966600a6d0a7a8d6300f08.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3 b/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3
new file mode 100644
index 0000000..36eb16e
Binary files /dev/null and b/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3 differ
diff --git a/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3.import b/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3.import
new file mode 100644
index 0000000..e38f746
--- /dev/null
+++ b/assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://c3iec7bl4bwnm"
+path="res://.godot/imported/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3-0152180d9c60d49e14df51787598c47c.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3"
+dest_files=["res://.godot/imported/α-WaveRelaxationHealingMusicLab-いつも何度でも[「千と千尋の神隠し」より][ピアノ].mp3-0152180d9c60d49e14df51787598c47c.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/久石让-ふたたび.mp3 b/assets/音乐/久石让-ふたたび.mp3
new file mode 100644
index 0000000..381d4e1
Binary files /dev/null and b/assets/音乐/久石让-ふたたび.mp3 differ
diff --git a/assets/音乐/久石让-ふたたび.mp3.import b/assets/音乐/久石让-ふたたび.mp3.import
new file mode 100644
index 0000000..7dfadd7
--- /dev/null
+++ b/assets/音乐/久石让-ふたたび.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://cnqcrc3kq6sws"
+path="res://.godot/imported/久石让-ふたたび.mp3-b39fa024a9f639074726f0dc7df65e62.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/久石让-ふたたび.mp3"
+dest_files=["res://.godot/imported/久石让-ふたたび.mp3-b39fa024a9f639074726f0dc7df65e62.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3 b/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3
new file mode 100644
index 0000000..aab7917
Binary files /dev/null and b/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3 differ
diff --git a/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3.import b/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3.import
new file mode 100644
index 0000000..be2d7cd
--- /dev/null
+++ b/assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://cih4h0w086qiw"
+path="res://.godot/imported/广桥真纪子-いのちの名前(生命之名).mp3-afc0a1c1a885441450357de83d0dfbdc.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/广桥真纪子-いのちの名前(生命之名).mp3"
+dest_files=["res://.godot/imported/广桥真纪子-いのちの名前(生命之名).mp3-afc0a1c1a885441450357de83d0dfbdc.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/assets/音乐/日本群星-PromiseoftheWorld.mp3 b/assets/音乐/日本群星-PromiseoftheWorld.mp3
new file mode 100644
index 0000000..8811f50
Binary files /dev/null and b/assets/音乐/日本群星-PromiseoftheWorld.mp3 differ
diff --git a/assets/音乐/日本群星-PromiseoftheWorld.mp3.import b/assets/音乐/日本群星-PromiseoftheWorld.mp3.import
new file mode 100644
index 0000000..b883ab2
--- /dev/null
+++ b/assets/音乐/日本群星-PromiseoftheWorld.mp3.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="mp3"
+type="AudioStreamMP3"
+uid="uid://8vwgxdvqdhwo"
+path="res://.godot/imported/日本群星-PromiseoftheWorld.mp3-7ab33eac95564f638a5a92958db62768.mp3str"
+
+[deps]
+
+source_file="res://assets/音乐/日本群星-PromiseoftheWorld.mp3"
+dest_files=["res://.godot/imported/日本群星-PromiseoftheWorld.mp3-7ab33eac95564f638a5a92958db62768.mp3str"]
+
+[params]
+
+loop=false
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/background.gd b/background.gd
new file mode 100644
index 0000000..b3e3610
--- /dev/null
+++ b/background.gd
@@ -0,0 +1,114 @@
+extends Sprite2D
+
+# 存储背景图片的路径数组
+var backgrounds :Array = [
+ "res://assets/背景图片/背景1.png",
+ "res://assets/背景图片/背景2.png",
+ "res://assets/背景图片/背景3.png",
+ "res://assets/背景图片/背景4.png",
+ "res://assets/背景图片/背景5.png",
+ "res://assets/背景图片/背景6.png",
+ "res://assets/背景图片/背景7.png",
+ "res://assets/背景图片/背景8.png",
+ "res://assets/背景图片/背景9.png",
+ "res://assets/背景图片/背景10.png",
+ "res://assets/背景图片/背景11.png",
+ "res://assets/背景图片/背景12.png",
+ "res://assets/背景图片/背景13.png",
+ "res://assets/背景图片/背景14.png",
+ "res://assets/背景图片/背景15.png",
+ "res://assets/背景图片/背景16.png",
+ "res://assets/背景图片/背景17.png",
+ "res://assets/背景图片/背景18.png",
+ "res://assets/背景图片/背景19.png",
+ "res://assets/背景图片/背景20.png",
+ "res://assets/背景图片/背景21.png",
+ "res://assets/背景图片/背景22.png"
+]
+
+# 当前显示的背景索引
+var current_index = -1
+# 过渡动画的持续时间(秒)
+@export var transition_duration: float = 1.5
+
+# 节点引用
+@onready var background2: Sprite2D = $Background2
+@onready var timer: Timer = $Timer
+
+# 用于持有当前正在运行的Tween的引用,方便在需要时中止它
+var current_tween: Tween
+
+func _ready():
+ # 验证背景图片资源
+ if not validate_backgrounds():
+ return
+
+ # 初始化,直接设置第一张背景,不进行过渡
+ current_index = randi() % backgrounds.size()
+ self.texture = load(backgrounds[current_index])
+
+ # 设置第二个Sprite的初始状态为完全透明
+ background2.modulate.a = 0.0
+
+ # 配置计时器
+ timer.wait_time = 10.0
+ timer.timeout.connect(switch_background) # 直接连接切换函数
+ timer.start()
+
+func validate_backgrounds() -> bool:
+ var valid_backgrounds = []
+ for bg_path in backgrounds:
+ if ResourceLoader.exists(bg_path):
+ valid_backgrounds.append(bg_path)
+ else:
+ push_error("背景图片不存在: " + bg_path)
+
+ backgrounds = valid_backgrounds
+ if backgrounds.is_empty():
+ push_error("没有可用的背景图片!")
+ return false
+ return true
+
+func switch_background():
+ if backgrounds.size() <= 1:
+ return
+
+ # 1. 选择一张新的、不重复的背景图
+ var new_index = randi() % backgrounds.size()
+ while new_index == current_index:
+ new_index = randi() % backgrounds.size()
+
+ current_index = new_index
+ var new_texture = load(backgrounds[current_index])
+ if new_texture == null:
+ push_error("无法加载背景图片: " + backgrounds[current_index])
+ return
+
+ # 2. 将新图片设置到上层的Sprite2D (background2)
+ background2.texture = new_texture
+
+ # 3. 【核心改动】创建并执行Tween动画
+ # 如果上一个动画还在运行,先中止它,防止动画重叠或冲突
+ if current_tween and current_tween.is_valid():
+ current_tween.kill()
+
+ # 直接从节点创建 Tween 对象,无需场景树中有Tween节点
+ current_tween = create_tween()
+
+ # 设置动画:让 background2 的 modulate.a (透明度) 从 0 (透明) 渐变到 1 (不透明)
+ current_tween.tween_property(background2, "modulate:a", 1.0, transition_duration)\
+ .set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE)
+
+ # 4. 动画完成后,通过 .connect() 连接一个回调函数进行状态重置
+ current_tween.finished.connect(_on_transition_finished)
+
+# 注意:之前的 _on_timer_timeout 函数的功能已合并到 switch_background
+# 所以我们只需要一个动画完成后的回调函数
+
+func _on_transition_finished():
+ # 动画结束后,将新背景 "固化" 到主背景上
+ self.texture = background2.texture
+ # 并将上层背景重置为透明,为下一次过渡做准备
+ background2.modulate.a = 0.0
+ # 清除引用,虽然不必须,但是个好习惯
+ current_tween = null
diff --git a/background.gd.uid b/background.gd.uid
new file mode 100644
index 0000000..19801fe
--- /dev/null
+++ b/background.gd.uid
@@ -0,0 +1 @@
+uid://dckw8dskfbnkp
diff --git a/components/ToastShow.gd b/components/ToastShow.gd
deleted file mode 100644
index 35ba943..0000000
--- a/components/ToastShow.gd
+++ /dev/null
@@ -1,35 +0,0 @@
-extends PanelContainer
-
-@export var display_time = 4.0
-@export var fade_duration = 1.0
-
-var label: Label # 显式声明类型
-
-func _ready():
- # 确保获取Label节点
- label = find_child("Label") as Label
- if not label:
- push_error("找不到Label子节点!请检查场景结构")
-
-func setup(text: String, color: Color, duration: float, fade: float):
- display_time = duration
- fade_duration = fade
- # 确保添加到场景树
- Engine.get_main_loop().root.get_node("main/UI").add_child(self)
- Toast(text, color)
-
-func Toast(text: String, text_color: Color = Color.WHITE):
- if !label:
- return
-
- label.text = text
- label.modulate = text_color
- show()
- modulate.a = 1
-
- await get_tree().create_timer(display_time).timeout
-
- var tween = create_tween()
- tween.tween_property(self, "modulate:a", 0.0, fade_duration)
- await tween.finished
- queue_free()
diff --git a/components/ToastShow.tscn b/components/ToastShow.tscn
deleted file mode 100644
index bbec46e..0000000
--- a/components/ToastShow.tscn
+++ /dev/null
@@ -1,16 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://ffw2vjwnwvew"]
-
-[ext_resource type="Script" uid="uid://caly13tf4ni1d" path="res://Components/ToastShow.gd" id="1_0rpwy"]
-
-[node name="ToastShow" type="PanelContainer"]
-offset_left = 469.0
-offset_top = 557.0
-offset_right = 533.0
-offset_bottom = 580.0
-size_flags_horizontal = 6
-size_flags_vertical = 4
-script = ExtResource("1_0rpwy")
-
-[node name="Label" type="Label" parent="."]
-layout_mode = 2
-text = "提示弹窗"
diff --git a/project.godot b/project.godot
index 4f13a2d..3128161 100644
--- a/project.godot
+++ b/project.godot
@@ -12,8 +12,10 @@ config_version=5
config/name="萌芽农场"
config/description="一款支持多人联机的农场游戏"
-run/main_scene="res://MainGame.tscn"
+config/version="1.0.3"
+run/main_scene="uid://bypjb28h4ntdr"
config/features=PackedStringArray("4.4", "Mobile")
+boot_splash/fullsize=false
config/icon="res://assets/logo2.png"
[autoload]
@@ -35,6 +37,27 @@ window/vsync/vsync_mode=0
project/assembly_name="萌芽农场"
+[file_customization]
+
+folder_colors={
+"res://Components/": "orange",
+"res://CopyItems/": "yellow",
+"res://Data/": "green",
+"res://GUI/": "blue",
+"res://GlobalScript/": "teal",
+"res://Network/": "purple",
+"res://Server/": "pink",
+"res://Shader/": "gray",
+"res://assets/": "red"
+}
+
+[importer_defaults]
+
+texture={
+&"detect_3d/compress_to": 0,
+&"mipmaps/generate": true
+}
+
[input]
ui_save={
@@ -52,3 +75,5 @@ ui_load={
renderer/rendering_method="mobile"
textures/vram_compression/import_etc2_astc=true
+textures/webp_compression/compression_method=3
+viewport/hdr_2d=true
diff --git a/server/game_saves/3205788256.json b/server/game_saves/3205788256.json
index 4ad8280..c1db8ed 100644
--- a/server/game_saves/3205788256.json
+++ b/server/game_saves/3205788256.json
@@ -1,248 +1,16 @@
{
"farm_lots": [
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
{
"crop_type": "金橘",
- "grow_time": 4800,
+ "grow_time": 10801,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 4800,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "松露",
- "grow_time": 6675,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200,
- "已浇水": true,
- "已施肥": true,
"土地等级": 1,
- "施肥时间": 1748345974.8872685
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6070,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": true,
- "已施肥": true,
- "土地等级": 1,
- "施肥时间": 1748345990.2872767
+ "浇水时间": 1749282767.1008155
},
{
"crop_type": "",
@@ -250,7 +18,901 @@
"is_dead": false,
"is_diged": true,
"is_planted": false,
- "max_grow_time": 6600,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10801,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10801,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10800,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10800,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10818,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1,
+ "浇水时间": 1749282770.1309266
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1,
+ "浇水时间": 1749282775.8268695
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "稻谷",
+ "grow_time": 600,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "稻谷",
+ "grow_time": 600,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "稻谷",
+ "grow_time": 600,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 6782,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "稻谷",
+ "grow_time": 640,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 4
+ },
+ {
+ "crop_type": "稻谷",
+ "grow_time": 640,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 4
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "龙果",
+ "grow_time": 14474,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 14400,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 4,
+ "浇水时间": 1749383079.5425293
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10806,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10806,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10800,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 3
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 4800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "土豆",
+ "grow_time": 500,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 480,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "土豆",
+ "grow_time": 484,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 480,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10804,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 2
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10801,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10800,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "杂交树2",
+ "grow_time": 25284,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 25200,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 4
+ },
+ {
+ "crop_type": "杂交树1",
+ "grow_time": 21634,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 21600,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 4
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "",
+ "grow_time": 0,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": false,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 1
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10021,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10021,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10021,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
@@ -261,734 +923,183 @@
"is_dead": false,
"is_diged": true,
"is_planted": false,
- "max_grow_time": 1800,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 1
},
{
- "crop_type": "芦荟",
- "grow_time": 1449,
+ "crop_type": "金橘",
+ "grow_time": 10588,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 6600,
- "已浇水": true,
- "已施肥": true,
- "土地等级": 1,
- "施肥时间": 1748346006.4554875
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 1
- },
- {
- "crop_type": "番茄",
- "grow_time": 720,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 720,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "香草",
- "grow_time": 1175,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1174,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "甜菜",
- "grow_time": 1172,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
"crop_type": "金橘",
- "grow_time": 4800,
+ "grow_time": 10020,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 4800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 5253,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": true,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "小麦",
- "grow_time": 120,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 120,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 5179,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 5771,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "稻谷",
- "grow_time": 240,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 240,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "西瓜",
- "grow_time": 2400,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2400,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
"crop_type": "金橘",
- "grow_time": 4800,
+ "grow_time": 10020,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 4800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "松露",
- "grow_time": 7200,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 7200,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "草莓",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "甜菜",
- "grow_time": 2160,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 906,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": true,
- "已施肥": false,
- "土地等级": 1
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "胡萝卜",
- "grow_time": 480,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "龙果",
- "grow_time": 4800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 4800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "人参",
- "grow_time": 5771,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "香草",
- "grow_time": 1800,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1800,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "稻谷",
- "grow_time": 240,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 240,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "富贵竹",
- "grow_time": 6600,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
"crop_type": "金橘",
- "grow_time": 4800,
+ "grow_time": 10019,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 4800,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "胡萝卜",
- "grow_time": 480,
+ "crop_type": "金橘",
+ "grow_time": 10019,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 480,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "草莓",
- "grow_time": 960,
+ "crop_type": "金橘",
+ "grow_time": 10019,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 960,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "人参",
- "grow_time": 6600,
+ "crop_type": "金橘",
+ "grow_time": 10019,
"is_dead": false,
"is_diged": true,
"is_planted": true,
- "max_grow_time": 6600,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10018,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10018,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10018,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10018,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10017,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10017,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10017,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10017,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
+ "已浇水": false,
+ "已施肥": false,
+ "土地等级": 0
+ },
+ {
+ "crop_type": "金橘",
+ "grow_time": 10016,
+ "is_dead": false,
+ "is_diged": true,
+ "is_planted": true,
+ "max_grow_time": 10800,
"已浇水": false,
"已施肥": false,
"土地等级": 0
@@ -1016,89 +1127,45 @@
"土地等级": 0
},
{
- "crop_type": "胡萝卜",
- "grow_time": 480,
+ "crop_type": "",
+ "grow_time": 0,
"is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 480,
+ "is_diged": false,
+ "is_planted": false,
+ "max_grow_time": 5,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "甜菜",
- "grow_time": 2160,
+ "crop_type": "",
+ "grow_time": 0,
"is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2160,
+ "is_diged": false,
+ "is_planted": false,
+ "max_grow_time": 5,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "西瓜",
- "grow_time": 2400,
+ "crop_type": "",
+ "grow_time": 0,
"is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 2400,
+ "is_diged": false,
+ "is_planted": false,
+ "max_grow_time": 5,
"已浇水": false,
"已施肥": false,
"土地等级": 0
},
{
- "crop_type": "人参",
- "grow_time": 6600,
+ "crop_type": "",
+ "grow_time": 0,
"is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 6600,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "芦笋",
- "grow_time": 1560,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 1560,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
- "已浇水": false,
- "已施肥": false,
- "土地等级": 0
- },
- {
- "crop_type": "花椰菜",
- "grow_time": 960,
- "is_dead": false,
- "is_diged": true,
- "is_planted": true,
- "max_grow_time": 960,
+ "is_diged": false,
+ "is_planted": false,
+ "max_grow_time": 5,
"已浇水": false,
"已施肥": false,
"土地等级": 0
@@ -1106,129 +1173,518 @@
],
"player_bag": [
{
- "count": 272,
+ "count": 82,
"name": "金橘",
"quality": "传奇"
},
{
- "name": "胡萝卜",
- "quality": "普通",
- "count": 9
- },
- {
- "name": "人参",
+ "name": "西瓜",
"quality": "传奇",
- "count": 8
- },
- {
- "name": "松露",
- "quality": "传奇",
- "count": 8
- },
- {
- "name": "富贵竹",
- "quality": "传奇",
- "count": 16
- },
- {
- "name": "芦荟",
- "quality": "传奇",
- "count": 15
- },
- {
- "name": "稻谷",
- "quality": "普通",
- "count": 15
+ "count": 5
},
{
"name": "小麦",
"quality": "普通",
- "count": 3
+ "count": 2
},
{
- "name": "测试作物",
- "quality": "普通",
- "count": 8
- },
- {
- "name": "番茄",
- "quality": "优良",
- "count": 16
- },
- {
- "name": "香草",
- "quality": "史诗",
- "count": 10
- },
- {
- "name": "龙果",
+ "name": "橘子树",
"quality": "传奇",
- "count": 6
+ "count": 1
+ },
+ {
+ "name": "茄子",
+ "quality": "史诗",
+ "count": 1
},
{
"name": "甘蔗",
- "quality": "史诗",
- "count": 2
- },
- {
- "name": "甜菜",
- "quality": "史诗",
- "count": 2
- },
- {
- "name": "西瓜",
- "quality": "史诗",
+ "quality": "传奇",
"count": 1
},
{
- "name": "葡萄",
- "quality": "稀有",
- "count": 2
- },
- {
- "name": "南瓜",
- "quality": "稀有",
- "count": 2
- },
- {
- "name": "玉米",
- "quality": "普通",
+ "name": "香草",
+ "quality": "传奇",
"count": 1
},
{
- "name": "土豆",
- "quality": "普通",
- "count": 1
- },
- {
- "name": "草莓",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "大豆",
- "quality": "优良",
- "count": 1
- },
- {
- "name": "蓝莓",
+ "name": "树莓",
"quality": "稀有",
"count": 1
},
{
- "name": "洋葱",
- "quality": "稀有",
- "count": 2
+ "name": "香蕉树",
+ "quality": "传奇",
+ "count": 1
}
],
- "experience": 852,
+ "experience": 3495,
"farm_name": "树萌芽の大农场",
"player_name": "树萌芽",
- "level": 41,
- "money": 320,
- "last_login_time": "2025年05月27日19时44分30秒",
- "total_login_time": "104时25分34秒",
+ "level": 52,
+ "money": 128038,
+ "last_login_time": "2025年06月08日20时05分46秒",
+ "total_login_time": "126时5分11秒",
"user_name": "3205788256",
"user_password": "tyh@19900420",
- "last_water_reset_date": "2025-05-27"
+ "last_water_reset_date": "2025-06-06",
+ "daily_likes": {
+ "2025-05-31": [
+ "2427948832",
+ "2671387804",
+ "2221023030",
+ "2143323382"
+ ],
+ "2025-06-02": [
+ "2973419538",
+ "2427948832",
+ "2671387804"
+ ]
+ },
+ "seeds": {
+ "芦笋": 2,
+ "测试作物": 8
+ },
+ "last_check_in_date": "2025-06-01",
+ "check_in_count": 1,
+ "daily_check_in": {
+ "2025-06-02": {
+ "rewards": {
+ "coins": 305,
+ "exp": 63,
+ "seeds": [
+ {
+ "name": "胡萝卜",
+ "quantity": 3,
+ "quality": "普通"
+ },
+ {
+ "name": "土豆",
+ "quantity": 5,
+ "quality": "普通"
+ },
+ {
+ "name": "稻谷",
+ "quantity": 5,
+ "quality": "普通"
+ }
+ ]
+ },
+ "consecutive_days": 0,
+ "timestamp": 1748841159.872429
+ },
+ "2025-06-03": {
+ "rewards": {
+ "coins": 212,
+ "exp": 51,
+ "seeds": [
+ {
+ "name": "小麦",
+ "quantity": 2,
+ "quality": "普通"
+ },
+ {
+ "name": "土豆",
+ "quantity": 5,
+ "quality": "普通"
+ }
+ ]
+ },
+ "consecutive_days": 1,
+ "timestamp": 1748947737.7426355
+ },
+ "2025-06-07": {
+ "rewards": {
+ "coins": 282,
+ "exp": 71,
+ "seeds": [
+ {
+ "name": "土豆",
+ "quantity": 5,
+ "quality": "普通"
+ },
+ {
+ "name": "胡萝卜",
+ "quantity": 4,
+ "quality": "普通"
+ },
+ {
+ "name": "小麦",
+ "quantity": 2,
+ "quality": "普通"
+ }
+ ]
+ },
+ "consecutive_days": 0,
+ "timestamp": 1749282696.5718927
+ },
+ "2025-06-08": {
+ "rewards": {
+ "coins": 395,
+ "exp": 63,
+ "seeds": [
+ {
+ "name": "稻谷",
+ "quantity": 5,
+ "quality": "普通"
+ },
+ {
+ "name": "土豆",
+ "quantity": 2,
+ "quality": "普通"
+ }
+ ]
+ },
+ "consecutive_days": 1,
+ "timestamp": 1749378625.7474592
+ }
+ },
+ "lucky_draw_history": [
+ {
+ "date": "2025-06-02 13:39:20",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 94
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:39:50",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "优良",
+ "amount": 202
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:39:54",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "seed",
+ "name": "大白菜",
+ "rarity": "优良",
+ "amount": 1
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:43:39",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "优良",
+ "amount": 450
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:43:47",
+ "type": "five",
+ "cost": 3600,
+ "rewards": [
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 51
+ },
+ {
+ "type": "seed",
+ "name": "草莓",
+ "rarity": "稀有",
+ "amount": 1
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "优良",
+ "amount": 164
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 91
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 137
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:43:57",
+ "type": "ten",
+ "cost": 6400,
+ "rewards": [
+ {
+ "type": "package",
+ "name": "成长套餐",
+ "rarity": "优良",
+ "amount": 1,
+ "contents": [
+ {
+ "type": "coins",
+ "amount": 315,
+ "rarity": "优良"
+ },
+ {
+ "type": "exp",
+ "amount": 177,
+ "rarity": "优良"
+ },
+ {
+ "type": "seed",
+ "name": "小麦",
+ "amount": 2,
+ "rarity": "优良"
+ }
+ ]
+ },
+ {
+ "type": "empty",
+ "name": "继续努力",
+ "rarity": "空奖",
+ "amount": 0
+ },
+ {
+ "type": "empty",
+ "name": "谢谢惠顾",
+ "rarity": "空奖",
+ "amount": 0
+ },
+ {
+ "type": "empty",
+ "name": "下次再来",
+ "rarity": "空奖",
+ "amount": 0
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "稀有",
+ "amount": 664
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "优良",
+ "amount": 336
+ },
+ {
+ "type": "package",
+ "name": "稀有礼包",
+ "rarity": "稀有",
+ "amount": 1,
+ "contents": [
+ {
+ "type": "coins",
+ "amount": 405,
+ "rarity": "稀有"
+ },
+ {
+ "type": "exp",
+ "amount": 225,
+ "rarity": "稀有"
+ },
+ {
+ "type": "seed",
+ "name": "大白菜",
+ "amount": 2,
+ "rarity": "稀有"
+ }
+ ]
+ },
+ {
+ "type": "seed",
+ "name": "小麦",
+ "rarity": "普通",
+ "amount": 2
+ },
+ {
+ "type": "seed",
+ "name": "土豆",
+ "rarity": "普通",
+ "amount": 4
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "优良",
+ "amount": 193
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:44:18",
+ "type": "five",
+ "cost": 3600,
+ "rewards": [
+ {
+ "type": "seed",
+ "name": "稻谷",
+ "rarity": "普通",
+ "amount": 2
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "史诗",
+ "amount": 1399
+ },
+ {
+ "type": "seed",
+ "name": "花椰菜",
+ "rarity": "稀有",
+ "amount": 1
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "普通",
+ "amount": 171
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "普通",
+ "amount": 154
+ }
+ ]
+ },
+ {
+ "date": "2025-06-02 13:44:26",
+ "type": "ten",
+ "cost": 6400,
+ "rewards": [
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "稀有",
+ "amount": 333
+ },
+ {
+ "type": "empty",
+ "name": "继续努力",
+ "rarity": "空奖",
+ "amount": 0
+ },
+ {
+ "type": "seed",
+ "name": "豌豆",
+ "rarity": "优良",
+ "amount": 1
+ },
+ {
+ "type": "seed",
+ "name": "稻谷",
+ "rarity": "普通",
+ "amount": 4
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "优良",
+ "amount": 442
+ },
+ {
+ "type": "package",
+ "name": "成长套餐",
+ "rarity": "优良",
+ "amount": 1,
+ "contents": [
+ {
+ "type": "coins",
+ "amount": 352,
+ "rarity": "优良"
+ },
+ {
+ "type": "exp",
+ "amount": 103,
+ "rarity": "优良"
+ },
+ {
+ "type": "seed",
+ "name": "小麦",
+ "amount": 3,
+ "rarity": "优良"
+ }
+ ]
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 111
+ },
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "优良",
+ "amount": 151
+ },
+ {
+ "type": "empty",
+ "name": "继续努力",
+ "rarity": "空奖",
+ "amount": 0
+ },
+ {
+ "type": "coins",
+ "name": "金币",
+ "rarity": "普通",
+ "amount": 107
+ }
+ ]
+ },
+ {
+ "date": "2025-06-03 18:49:54",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "exp",
+ "name": "经验",
+ "rarity": "普通",
+ "amount": 136
+ }
+ ]
+ },
+ {
+ "date": "2025-06-08 18:30:22",
+ "type": "single",
+ "cost": 800,
+ "rewards": [
+ {
+ "type": "seed",
+ "name": "小麦",
+ "rarity": "普通",
+ "amount": 2
+ }
+ ]
+ }
+ ],
+ "total_likes": 1,
+ "体力值": 17,
+ "体力上次刷新时间": "2025-06-08",
+ "体力上次恢复时间": 1749382891.286395,
+ "new_player_gift_claimed": true,
+ "new_player_gift_time": "2025-06-08 19:22:41"
}
\ No newline at end of file
diff --git a/test_version_validation.md b/test_version_validation.md
deleted file mode 100644
index cf9c7ed..0000000
--- a/test_version_validation.md
+++ /dev/null
@@ -1,100 +0,0 @@
-# 版本号验证功能测试指南
-
-## 功能概述
-实现了客户端和服务端的版本号验证机制,确保只有版本匹配的客户端才能登录或注册游戏。
-
-## 实现的功能
-
-### 1. 客户端修改
-- 在 `MainGame.gd` 中定义了客户端版本号:`const client_version :String = "1.0.1"`
-- 在 `TCPNetworkManager.gd` 中修改了登录和注册请求,添加了版本号字段
-- 在 `login_panel.gd` 中添加了版本号显示功能
-
-### 2. 服务端修改
-- 在 `TCPGameServer.py` 中定义了服务端版本号:`server_version: str = "1.0.1"`
-- 添加了版本号验证函数 `_check_client_version()`
-- 在登录和注册处理中添加了版本号验证逻辑
-- 在服务器启动时显示版本信息
-
-## 测试步骤
-
-### 测试1:版本匹配(正常情况)
-1. 确保客户端和服务端版本号都是 "1.0.1"
-2. 启动服务器,应该看到:
- ```
- 萌芽农场游戏服务器 v1.0.1
- 服务器地址: 0.0.0.0:4040
- ==================================================
- ```
-3. 启动客户端,应该看到:
- ```
- 萌芽农场客户端 v1.0.1 启动
- ```
-4. 在登录界面应该显示:`萌芽农场 v1.0.1 - 欢迎使用`
-5. 尝试登录或注册,应该正常工作
-
-### 测试2:版本不匹配(客户端版本较低)
-1. 修改客户端版本号为 "0.9.0":
- ```gdscript
- const client_version :String = "0.9.0"
- ```
-2. 保持服务端版本为 "1.0.0"
-3. 重新启动客户端
-4. 尝试登录,应该收到错误消息:
- ```
- 版本不匹配!客户端版本: 0.9.0, 服务端版本: 1.0.1,请更新客户端
- ```
-5. 尝试注册,应该收到相同的错误消息
-
-### 测试3:版本不匹配(客户端版本较高)
-1. 修改客户端版本号为 "1.1.0":
- ```gdscript
- const client_version :String = "1.1.0"
- ```
-2. 保持服务端版本为 "1.0.1"
-3. 重新启动客户端
-4. 尝试登录或注册,应该收到版本不匹配的错误消息
-
-### 测试4:空版本号处理
-1. 修改客户端代码,发送空的版本号
-2. 尝试登录或注册,应该被拒绝
-
-## 预期结果
-
-### 成功情况
-- 版本匹配时,登录和注册功能正常工作
-- 客户端和服务端都显示正确的版本信息
-
-### 失败情况
-- 版本不匹配时,登录和注册被拒绝
-- 显示清晰的错误消息,指出版本不匹配的具体信息
-- 服务端记录相应的警告日志
-
-## 日志示例
-
-### 服务端日志(版本匹配)
-```
-[INFO] [SERVER] TCP游戏服务器初始化 - 版本: 1.0.1
-[INFO] [SERVER] 用户 12345 登录成功
-```
-
-### 服务端日志(版本不匹配)
-```
-[WARNING] [SERVER] 用户 12345 登录失败: 版本不匹配 (客户端: 0.9.0, 服务端: 1.0.1)
-```
-
-## 注意事项
-
-1. **版本号格式**:建议使用语义化版本号格式(如 1.0.0)
-2. **向后兼容性**:如果需要支持多个版本,可以修改验证逻辑
-3. **版本更新策略**:
- - 主版本号变更:不兼容的重大更新
- - 次版本号变更:向后兼容的功能更新
- - 修订版本号变更:向后兼容的问题修复
-
-## 扩展功能建议
-
-1. **版本兼容性矩阵**:支持多个兼容版本
-2. **自动更新提示**:客户端检测到版本不匹配时提供更新链接
-3. **最低版本要求**:设置服务端支持的最低客户端版本
-4. **版本信息API**:提供接口查询当前服务端版本和兼容的客户端版本列表
\ No newline at end of file