From e466cde9d5f6c533fa509b301dfa26409c9ebccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E8=90=8C=E8=8A=BD?= <3205788256@qq.com> Date: Sat, 19 Jul 2025 17:27:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A9=E6=B0=94=E7=B3=BB=E7=BB=9F=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUI/MainMenuPanel.tscn | 4 +- GameManager/WeatherSystem.gd | 51 ++ GameManager/WeatherSystem.gd.uid | 1 + MainGame.gd | 481 +++++-------- MainGame.tscn | 562 ++++++++++++--- Network/TCPNetworkManager.gd | 126 ++++ Scene/BigPanel/DailyCheckInPanel.tscn | 35 +- Scene/BigPanel/LoginPanel.tscn | 381 +++++++--- Scene/BigPanel/LuckyDrawPanel.tscn | 52 +- Script/BigPanel/CropWarehousePanel.gd | 82 ++- Script/BigPanel/LoginPanel.gd | 363 +++++++--- Script/BigPanel/PlayerStorePanel.gd | 374 ++++++++++ Script/BigPanel/PlayerStorePanel.gd.uid | 1 + Script/Dialog/AddProduct2StorePopup.gd | 197 +++++ Script/Dialog/AddProduct2StorePopup.gd.uid | 1 + Script/Dialog/BatchSellPopup.gd | 154 ++++ Script/Dialog/BatchSellPopup.gd.uid | 1 + Script/SmallPanel/CropInformPanel.gd | 216 ++++++ Script/SmallPanel/CropInformPanel.gd.uid | 1 + Script/SmallPanel/DebugPanel.gd | 7 +- Server/QQEmailSend.py | 148 +++- Server/TCPGameServer.py | 670 +++++++++++++++++- .../__pycache__/QQEmailSend.cpython-313.pyc | Bin 14695 -> 19702 bytes .../config/initial_player_data_template.json | 15 +- Server/config/verification_codes.json | 6 - Server/game_saves/2143323382.json | 538 ++++++++------ Shader/PlantSwayShader.gdshader | 22 +- assets/作物/人参/{0.webp => 幼苗.webp} | Bin .../人参/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/仙人掌/{0.webp => 幼苗.webp} | Bin .../仙人掌/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/仙人掌/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/冬虫夏草/1.webp | Bin 24202 -> 0 bytes assets/作物/冬虫夏草/1.webp.import | 34 - assets/作物/冬虫夏草/{0.webp => 幼苗.webp} | Bin .../{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/冬虫夏草/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/凤凰木/{0.webp => 幼苗.webp} | Bin assets/作物/凤凰木/幼苗.webp.import | 34 + assets/作物/凤凰木/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/南瓜/2.webp | Bin 32320 -> 0 bytes assets/作物/南瓜/3.webp | Bin 29570 -> 0 bytes assets/作物/南瓜/3.webp.import | 34 - assets/作物/南瓜/{0.webp => 幼苗.webp} | Bin .../南瓜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/南瓜/{1.webp => 未成熟.webp} | Bin .../南瓜/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/可可豆/{0.webp => 幼苗.webp} | Bin .../可可豆/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/向日葵/2.webp | Bin 31058 -> 0 bytes assets/作物/向日葵/2.webp.import | 34 - assets/作物/向日葵/{0.webp => 幼苗.webp} | Bin .../向日葵/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/向日葵/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/咖啡豆/{0.webp => 幼苗.webp} | Bin .../咖啡豆/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/哈密瓜/1.webp | Bin 21054 -> 0 bytes assets/作物/哈密瓜/1.webp.import | 34 - assets/作物/哈密瓜/{0.webp => 幼苗.webp} | Bin .../哈密瓜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/哈密瓜/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/土豆/0.webp.import | 34 - assets/作物/土豆/2.webp.import | 34 - assets/作物/土豆/{1.webp => 幼苗.webp} | Bin .../土豆/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/土豆/{2.webp => 未成熟.webp} | Bin .../4.webp.import => 土豆/未成熟.webp.import} | 8 +- assets/作物/大白菜/1.webp | Bin 20962 -> 0 bytes assets/作物/大白菜/1.webp.import | 34 - assets/作物/大白菜/{0.webp => 幼苗.webp} | Bin .../大白菜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/大白菜/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/大蒜/{0.webp => 幼苗.webp} | Bin .../大蒜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/大豆/2.webp | Bin 36538 -> 0 bytes assets/作物/大豆/2.webp.import | 34 - assets/作物/大豆/{0.webp => 幼苗.webp} | Bin .../大豆/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/大豆/{1.webp => 未成熟.webp} | Bin .../大豆/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/富贵竹/2.webp | Bin 32760 -> 0 bytes assets/作物/富贵竹/2.webp.import | 34 - assets/作物/富贵竹/{0.webp => 幼苗.webp} | Bin .../富贵竹/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/富贵竹/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/小麦/2.webp | Bin 37050 -> 0 bytes assets/作物/小麦/2.webp.import | 34 - assets/作物/小麦/{0.webp => 幼苗.webp} | Bin .../小麦/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/小麦/{1.webp => 未成熟.webp} | Bin .../小麦/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/山楂/{0.webp => 幼苗.webp} | Bin .../山楂/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/山楂/{1.webp => 未成熟.webp} | Bin .../山楂/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/山葵/1.webp | Bin 19814 -> 0 bytes assets/作物/山葵/1.webp.import | 34 - assets/作物/山葵/{0.webp => 幼苗.webp} | Bin .../山葵/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/山葵/{2.webp => 未成熟.webp} | Bin .../山葵/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/幸运花/1.webp | Bin 20742 -> 0 bytes assets/作物/幸运花/1.webp.import | 34 - assets/作物/幸运花/{0.webp => 幼苗.webp} | Bin .../幸运花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/幸运花/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/幸运草/1.webp | Bin 26188 -> 0 bytes assets/作物/幸运草/1.webp.import | 34 - assets/作物/幸运草/{0.webp => 幼苗.webp} | Bin .../幸运草/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/幸运草/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/康乃馨/1.webp | Bin 28712 -> 0 bytes assets/作物/康乃馨/1.webp.import | 34 - assets/作物/康乃馨/{0.webp => 幼苗.webp} | Bin .../康乃馨/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/康乃馨/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/摇钱树/2.webp | Bin 29566 -> 0 bytes assets/作物/摇钱树/2.webp.import | 34 - assets/作物/摇钱树/{0.webp => 幼苗.webp} | Bin .../摇钱树/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/摇钱树/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/星芒草/{0.webp => 幼苗.webp} | Bin .../星芒草/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/月光草/1.webp.import | 34 - assets/作物/月光草/{0.webp => 幼苗.webp} | Bin .../月光草/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/月光草/{1.webp => 未成熟.webp} | Bin .../2.webp.import => 月光草/未成熟.webp.import} | 8 +- assets/作物/杂交树1/2.webp | Bin 26888 -> 0 bytes assets/作物/杂交树1/2.webp.import | 34 - assets/作物/杂交树1/3.webp | Bin 26888 -> 0 bytes assets/作物/杂交树1/3.webp.import | 34 - assets/作物/杂交树1/{0.webp => 幼苗.webp} | Bin .../杂交树1/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/杂交树1/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/杂交树2/2.webp | Bin 21182 -> 0 bytes assets/作物/杂交树2/2.webp.import | 34 - assets/作物/杂交树2/3.webp | Bin 21182 -> 0 bytes assets/作物/杂交树2/3.webp.import | 34 - assets/作物/杂交树2/{0.webp => 幼苗.webp} | Bin .../杂交树2/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/杂交树2/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/杂草1/{0.webp => 幼苗.webp} | Bin .../杂草1/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/杂草2/{0.webp => 幼苗.webp} | Bin .../杂草2/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/杨桃/1.webp | Bin 29786 -> 0 bytes assets/作物/杨桃/1.webp.import | 34 - assets/作物/杨桃/{0.webp => 幼苗.webp} | Bin .../杨桃/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/杨桃/{2.webp => 未成熟.webp} | Bin .../杨桃/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/松露/1.webp | Bin 25102 -> 0 bytes assets/作物/松露/1.webp.import | 34 - assets/作物/松露/3.webp | Bin 27962 -> 0 bytes assets/作物/松露/3.webp.import | 34 - assets/作物/松露/{0.webp => 幼苗.webp} | Bin .../松露/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/松露/{2.webp => 未成熟.webp} | Bin .../松露/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/枇杷/2.webp | Bin 29392 -> 0 bytes assets/作物/枇杷/2.webp.import | 34 - assets/作物/枇杷/{0.webp => 幼苗.webp} | Bin .../枇杷/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/枇杷/{1.webp => 未成熟.webp} | Bin .../枇杷/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/柠檬/{0.webp => 幼苗.webp} | Bin .../柠檬/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/柠檬/{1.webp => 未成熟.webp} | Bin .../柠檬/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/柿子/2.webp | Bin 26852 -> 0 bytes assets/作物/柿子/2.webp.import | 34 - assets/作物/柿子/{0.webp => 幼苗.webp} | Bin .../柿子/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/柿子/{1.webp => 未成熟.webp} | Bin .../柿子/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/栀子花/2.webp | Bin 20014 -> 0 bytes assets/作物/栀子花/2.webp.import | 34 - assets/作物/栀子花/3.webp | Bin 19298 -> 0 bytes assets/作物/栀子花/3.webp.import | 34 - assets/作物/栀子花/{0.webp => 幼苗.webp} | Bin .../栀子花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/栀子花/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/树莓/1.webp | Bin 23274 -> 0 bytes assets/作物/树莓/1.webp.import | 34 - assets/作物/树莓/2.webp | Bin 35714 -> 0 bytes assets/作物/树莓/2.webp.import | 34 - assets/作物/树莓/{0.webp => 幼苗.webp} | Bin .../树莓/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/树莓/{3.webp => 未成熟.webp} | Bin .../树莓/{3.webp.import => 未成熟.webp.import} | 6 +- assets/作物/桃子/2.webp | Bin 22016 -> 0 bytes assets/作物/桃子/2.webp.import | 34 - assets/作物/桃子/3.webp | Bin 31748 -> 0 bytes assets/作物/桃子/3.webp.import | 34 - assets/作物/桃子/{0.webp => 幼苗.webp} | Bin .../桃子/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/桃子/成熟.webp | Bin 35242 -> 31748 bytes assets/作物/桃子/成熟.webp.import | 2 +- assets/作物/桃子/{1.webp => 未成熟.webp} | Bin .../桃子/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/梨子/0.webp | Bin 34264 -> 0 bytes assets/作物/梨子/0.webp.import | 34 - assets/作物/梨子/{1.webp => 幼苗.webp} | Bin .../梨子/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/梨子/{2.webp => 未成熟.webp} | Bin .../梨子/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/椰子/1.webp | Bin 28116 -> 0 bytes assets/作物/椰子/1.webp.import | 34 - assets/作物/椰子/{0.webp => 幼苗.webp} | Bin .../椰子/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/椰子/{2.webp => 未成熟.webp} | Bin .../椰子/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/橘子/0.webp | Bin 14068 -> 0 bytes assets/作物/橘子/1.webp | Bin 27566 -> 0 bytes assets/作物/橘子/1.webp.import | 34 - assets/作物/橘子/{2.webp => 幼苗.webp} | Bin .../橘子/{2.webp.import => 幼苗.webp.import} | 6 +- assets/作物/橘子/{3.webp => 未成熟.webp} | Bin .../橘子/{3.webp.import => 未成熟.webp.import} | 6 +- assets/作物/橘子树/0.webp | Bin 14068 -> 0 bytes assets/作物/橘子树/0.webp.import | 34 - assets/作物/橘子树/{1.webp => 幼苗.webp} | Bin .../橘子树/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/橘子树/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/洋葱/1.webp | Bin 22886 -> 0 bytes assets/作物/洋葱/1.webp.import | 34 - assets/作物/洋葱/{0.webp => 幼苗.webp} | Bin .../洋葱/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/洋葱/{2.webp => 未成熟.webp} | Bin .../洋葱/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/牵牛花/2.webp | Bin 34078 -> 0 bytes assets/作物/牵牛花/2.webp.import | 34 - assets/作物/牵牛花/{0.webp => 幼苗.webp} | Bin .../牵牛花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/牵牛花/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/{土豆/0.webp => 玉米/幼苗.webp} | Bin .../玉米/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/玉米/{1.webp => 未成熟.webp} | Bin .../玉米/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/玫瑰花/1.webp | Bin 22038 -> 0 bytes assets/作物/玫瑰花/1.webp.import | 34 - assets/作物/玫瑰花/{0.webp => 幼苗.webp} | Bin .../玫瑰花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/玫瑰花/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/甘蔗/0.webp | Bin 23560 -> 0 bytes assets/作物/甘蔗/0.webp.import | 34 - assets/作物/甘蔗/3.webp | Bin 28314 -> 0 bytes assets/作物/甘蔗/3.webp.import | 34 - assets/作物/甘蔗/{1.webp => 幼苗.webp} | Bin .../甘蔗/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/甘蔗/{2.webp => 未成熟.webp} | Bin .../甘蔗/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/甜菜/0.webp | Bin 31068 -> 0 bytes assets/作物/甜菜/0.webp.import | 34 - assets/作物/甜菜/3.webp | Bin 23118 -> 0 bytes assets/作物/甜菜/3.webp.import | 34 - assets/作物/甜菜/{1.webp => 幼苗.webp} | Bin .../甜菜/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/甜菜/{2.webp => 未成熟.webp} | Bin .../甜菜/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/生菜/{0.webp => 幼苗.webp} | Bin .../生菜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/番茄/{1.webp => 幼苗.webp} | Bin .../番茄/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/番茄/{2.webp => 未成熟.webp} | Bin .../番茄/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/百合花/3.webp | Bin 26796 -> 0 bytes assets/作物/百合花/3.webp.import | 34 - assets/作物/百合花/{0.webp => 幼苗.webp} | Bin .../百合花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/百合花/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/石榴/{0.webp => 幼苗.webp} | Bin .../石榴/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/稻谷/2.webp | Bin 34232 -> 0 bytes assets/作物/稻谷/2.webp.import | 34 - assets/作物/稻谷/{0.webp => 幼苗.webp} | Bin .../稻谷/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/稻谷/成熟.webp | Bin 36026 -> 34232 bytes assets/作物/稻谷/成熟.webp.import | 2 +- assets/作物/稻谷/{1.webp => 未成熟.webp} | Bin .../稻谷/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/糖果树/{0.webp => 幼苗.webp} | Bin .../糖果树/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/糖果树/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/胡萝卜/0.webp | Bin 17836 -> 0 bytes assets/作物/胡萝卜/1.webp | Bin 18620 -> 0 bytes assets/作物/胡萝卜/1.webp.import | 34 - assets/作物/{玉米/0.webp => 胡萝卜/幼苗.webp} | Bin .../胡萝卜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/胡萝卜/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/芒果/0.webp | Bin 31008 -> 0 bytes assets/作物/芒果/0.webp.import | 34 - assets/作物/芒果/{1.webp => 幼苗.webp} | Bin .../芒果/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/芒果/{2.webp => 未成熟.webp} | Bin .../芒果/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/芦笋/0.webp | Bin 15234 -> 0 bytes assets/作物/芦笋/0.webp.import | 34 - assets/作物/芦笋/{2.webp => 幼苗.webp} | Bin .../芦笋/{2.webp.import => 幼苗.webp.import} | 6 +- assets/作物/芦笋/{1.webp => 未成熟.webp} | Bin .../芦笋/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/芦荟/0.webp | Bin 15684 -> 0 bytes assets/作物/芦荟/0.webp.import | 34 - assets/作物/芦荟/3.webp | Bin 22470 -> 0 bytes assets/作物/芦荟/3.webp.import | 34 - assets/作物/芦荟/{1.webp => 幼苗.webp} | Bin .../芦荟/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/芦荟/{2.webp => 未成熟.webp} | Bin .../芦荟/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/花椰菜/2.webp | Bin 36786 -> 0 bytes assets/作物/花椰菜/2.webp.import | 34 - assets/作物/花椰菜/3.webp | Bin 24442 -> 0 bytes assets/作物/花椰菜/3.webp.import | 34 - assets/作物/花椰菜/{0.webp => 幼苗.webp} | Bin .../花椰菜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/花椰菜/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/苹果/0.webp | Bin 22234 -> 0 bytes assets/作物/苹果/0.webp.import | 34 - assets/作物/苹果/{1.webp => 幼苗.webp} | Bin .../苹果/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/苹果/{2.webp => 未成熟.webp} | Bin .../苹果/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/茄子/1.webp | Bin 25676 -> 0 bytes assets/作物/茄子/1.webp.import | 34 - assets/作物/茄子/2.webp | Bin 30146 -> 0 bytes assets/作物/茄子/2.webp.import | 34 - assets/作物/茄子/4.webp | Bin 26430 -> 0 bytes assets/作物/茄子/{0.webp => 幼苗.webp} | Bin .../茄子/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/茄子/{3.webp => 未成熟.webp} | Bin .../茄子/{3.webp.import => 未成熟.webp.import} | 6 +- assets/作物/草莓/2.webp | Bin 25022 -> 0 bytes assets/作物/草莓/2.webp.import | 34 - assets/作物/草莓/3.webp | Bin 25388 -> 0 bytes assets/作物/草莓/3.webp.import | 34 - assets/作物/草莓/{0.webp => 幼苗.webp} | Bin .../草莓/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/草莓/成熟.webp | Bin 25388 -> 25022 bytes assets/作物/草莓/成熟.webp.import | 2 +- assets/作物/草莓/{1.webp => 未成熟.webp} | Bin .../草莓/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/荔枝/0.webp | Bin 17530 -> 0 bytes assets/作物/荔枝/0.webp.import | 34 - assets/作物/荔枝/{1.webp => 幼苗.webp} | Bin .../荔枝/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/荔枝/{2.webp => 未成熟.webp} | Bin .../荔枝/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/菊花/1.webp | Bin 29460 -> 0 bytes assets/作物/菊花/1.webp.import | 34 - assets/作物/菊花/3.webp | Bin 26164 -> 0 bytes assets/作物/菊花/3.webp.import | 34 - assets/作物/菊花/{0.webp => 幼苗.webp} | Bin .../菊花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/菊花/{2.webp => 未成熟.webp} | Bin .../菊花/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/菠萝/1.webp | Bin 26314 -> 0 bytes assets/作物/菠萝/1.webp.import | 34 - assets/作物/菠萝/{0.webp => 幼苗.webp} | Bin .../菠萝/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/菠萝/成熟.webp | Bin 27960 -> 26314 bytes assets/作物/菠萝/成熟.webp.import | 2 +- assets/作物/菠萝/{2.webp => 未成熟.webp} | Bin .../菠萝/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/葡萄/2.webp | Bin 28444 -> 0 bytes assets/作物/葡萄/2.webp.import | 34 - assets/作物/葡萄/3.webp | Bin 30896 -> 0 bytes assets/作物/葡萄/3.webp.import | 34 - assets/作物/葡萄/{0.webp => 幼苗.webp} | Bin .../葡萄/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/葡萄/{1.webp => 未成熟.webp} | Bin .../葡萄/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/葫芦/{0.webp => 幼苗.webp} | Bin .../葫芦/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/葫芦/{1.webp => 未成熟.webp} | Bin .../葫芦/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/蓝莓/1.webp | Bin 23412 -> 0 bytes assets/作物/蓝莓/1.webp.import | 34 - assets/作物/蓝莓/3.webp | Bin 25134 -> 0 bytes assets/作物/蓝莓/3.webp.import | 34 - assets/作物/蓝莓/{0.webp => 幼苗.webp} | Bin .../蓝莓/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/蓝莓/{2.webp => 未成熟.webp} | Bin .../蓝莓/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/蕨菜/0.webp | Bin 26886 -> 0 bytes assets/作物/蕨菜/0.webp.import | 34 - assets/作物/蕨菜/{1.webp => 幼苗.webp} | Bin .../蕨菜/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/蕨菜/{2.webp => 未成熟.webp} | Bin .../蕨菜/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/藏红花/{0.webp => 幼苗.webp} | Bin .../藏红花/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/藏羚羊草/{0.webp => 幼苗.webp} | Bin .../{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/西瓜/1.webp | Bin 26444 -> 0 bytes assets/作物/西瓜/1.webp.import | 34 - assets/作物/西瓜/3.webp | Bin 24758 -> 0 bytes assets/作物/西瓜/3.webp.import | 34 - assets/作物/西瓜/{0.webp => 幼苗.webp} | Bin .../西瓜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/西瓜/{2.webp => 未成熟.webp} | Bin .../西瓜/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/豌豆/2.webp | Bin 30310 -> 0 bytes assets/作物/豌豆/2.webp.import | 34 - assets/作物/豌豆/{0.webp => 幼苗.webp} | Bin .../豌豆/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/豌豆/{1.webp => 未成熟.webp} | Bin .../豌豆/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/辣椒/2.webp | Bin 28156 -> 0 bytes assets/作物/辣椒/2.webp.import | 34 - assets/作物/辣椒/{0.webp => 幼苗.webp} | Bin .../辣椒/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/辣椒/{1.webp => 未成熟.webp} | Bin .../辣椒/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/迷迭香/{0.webp => 幼苗.webp} | Bin .../迷迭香/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/郁金香/0.webp | Bin 14756 -> 0 bytes assets/作物/郁金香/0.webp.import | 34 - assets/作物/郁金香/{1.webp => 幼苗.webp} | Bin .../郁金香/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/郁金香/{2.webp => 未成熟.webp} | Bin .../{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/野草1/0.webp.import | 34 - assets/作物/野草1/{0.webp => 幼苗.webp} | Bin .../0.webp.import => 野草1/幼苗.webp.import} | 8 +- assets/作物/野草2/{0.webp => 幼苗.webp} | Bin .../野草2/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/金橘/1.webp | Bin 22212 -> 0 bytes assets/作物/金橘/1.webp.import | 34 - assets/作物/金橘/3.webp | Bin 30694 -> 0 bytes assets/作物/金橘/3.webp.import | 34 - assets/作物/金橘/{0.webp => 幼苗.webp} | Bin .../金橘/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/金橘/{2.webp => 未成熟.webp} | Bin .../金橘/{2.webp.import => 未成熟.webp.import} | 6 +- assets/作物/面包树/2.webp | Bin 16568 -> 0 bytes assets/作物/面包树/2.webp.import | 34 - assets/作物/面包树/{0.webp => 幼苗.webp} | Bin .../面包树/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/面包树/{1.webp => 未成熟.webp} | Bin .../{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/香草/0.webp | Bin 31792 -> 0 bytes assets/作物/香草/0.webp.import | 34 - assets/作物/香草/2.webp | Bin 24420 -> 0 bytes assets/作物/香草/2.webp.import | 34 - assets/作物/香草/{1.webp => 幼苗.webp} | Bin .../香草/{1.webp.import => 幼苗.webp.import} | 6 +- assets/作物/香草/{3.webp => 未成熟.webp} | Bin .../香草/{3.webp.import => 未成熟.webp.import} | 6 +- assets/作物/香蕉/2.webp | Bin 23910 -> 0 bytes assets/作物/香蕉/2.webp.import | 34 - assets/作物/香蕉/{0.webp => 幼苗.webp} | Bin .../香蕉/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/香蕉/{1.webp => 未成熟.webp} | Bin .../香蕉/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/鱼腥草/1.webp.import | 34 - assets/作物/鱼腥草/2.webp | Bin 29862 -> 0 bytes assets/作物/鱼腥草/2.webp.import | 34 - assets/作物/鱼腥草/{0.webp => 幼苗.webp} | Bin .../鱼腥草/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/鱼腥草/{1.webp => 未成熟.webp} | Bin .../0.webp.import => 鱼腥草/未成熟.webp.import} | 8 +- assets/作物/黄瓜/{0.webp => 幼苗.webp} | Bin .../黄瓜/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/黄瓜/{1.webp => 未成熟.webp} | Bin .../黄瓜/{1.webp.import => 未成熟.webp.import} | 6 +- assets/作物/默认/{0.webp => 幼苗.webp} | Bin .../默认/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/默认/收获物.webp | Bin 13716 -> 31150 bytes assets/作物/默认/收获物.webp.import | 2 +- assets/作物/默认/未成熟.webp | Bin 0 -> 31150 bytes assets/作物/默认/未成熟.webp.import | 34 + assets/作物/龙果/2.webp | Bin 22850 -> 0 bytes assets/作物/龙果/2.webp.import | 34 - assets/作物/龙果/{0.webp => 幼苗.webp} | Bin .../龙果/{0.webp.import => 幼苗.webp.import} | 6 +- assets/作物/龙果/{1.webp => 未成熟.webp} | Bin .../龙果/{1.webp.import => 未成熟.webp.import} | 6 +- assets/字体/MapleMono-NF-CN-Bold.ttf | Bin 0 -> 17960056 bytes assets/字体/MapleMono-NF-CN-Bold.ttf.import | 35 + assets/字体/MapleMono-NF-CN-BoldItalic.ttf | Bin 0 -> 18637628 bytes .../MapleMono-NF-CN-BoldItalic.ttf.import | 35 + assets/装饰物图片/宠物商店.webp | Bin 0 -> 12146 bytes assets/装饰物图片/宠物商店.webp.import | 34 + assets/装饰物图片/小卖部.webp | Bin 0 -> 15146 bytes assets/装饰物图片/小卖部.webp.import | 34 + assets/装饰物图片/种子商店.webp | Bin 0 -> 11868 bytes assets/装饰物图片/种子商店.webp.import | 34 + assets/装饰物图片/道具商店.webp | Bin 0 -> 11212 bytes assets/装饰物图片/道具商店.webp.import | 34 + background.gd | 1 + server/game_saves/3205788256.json | 665 ++++++++++------- 514 files changed, 4678 insertions(+), 4389 deletions(-) create mode 100644 GameManager/WeatherSystem.gd create mode 100644 GameManager/WeatherSystem.gd.uid create mode 100644 Script/BigPanel/PlayerStorePanel.gd create mode 100644 Script/BigPanel/PlayerStorePanel.gd.uid create mode 100644 Script/Dialog/AddProduct2StorePopup.gd create mode 100644 Script/Dialog/AddProduct2StorePopup.gd.uid create mode 100644 Script/Dialog/BatchSellPopup.gd create mode 100644 Script/Dialog/BatchSellPopup.gd.uid create mode 100644 Script/SmallPanel/CropInformPanel.gd create mode 100644 Script/SmallPanel/CropInformPanel.gd.uid delete mode 100644 Server/config/verification_codes.json rename assets/作物/人参/{0.webp => 幼苗.webp} (100%) rename assets/作物/人参/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/仙人掌/{0.webp => 幼苗.webp} (100%) rename assets/作物/仙人掌/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/仙人掌/{1.webp => 未成熟.webp} (100%) rename assets/作物/仙人掌/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/冬虫夏草/1.webp delete mode 100644 assets/作物/冬虫夏草/1.webp.import rename assets/作物/冬虫夏草/{0.webp => 幼苗.webp} (100%) rename assets/作物/冬虫夏草/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/冬虫夏草/{2.webp => 未成熟.webp} (100%) rename assets/作物/冬虫夏草/{2.webp.import => 未成熟.webp.import} (70%) rename assets/作物/凤凰木/{0.webp => 幼苗.webp} (100%) create mode 100644 assets/作物/凤凰木/幼苗.webp.import rename assets/作物/凤凰木/{1.webp => 未成熟.webp} (100%) rename assets/作物/凤凰木/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/南瓜/2.webp delete mode 100644 assets/作物/南瓜/3.webp delete mode 100644 assets/作物/南瓜/3.webp.import rename assets/作物/南瓜/{0.webp => 幼苗.webp} (100%) rename assets/作物/南瓜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/南瓜/{1.webp => 未成熟.webp} (100%) rename assets/作物/南瓜/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/可可豆/{0.webp => 幼苗.webp} (100%) rename assets/作物/可可豆/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/向日葵/2.webp delete mode 100644 assets/作物/向日葵/2.webp.import rename assets/作物/向日葵/{0.webp => 幼苗.webp} (100%) rename assets/作物/向日葵/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/向日葵/{1.webp => 未成熟.webp} (100%) rename assets/作物/向日葵/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/咖啡豆/{0.webp => 幼苗.webp} (100%) rename assets/作物/咖啡豆/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/哈密瓜/1.webp delete mode 100644 assets/作物/哈密瓜/1.webp.import rename assets/作物/哈密瓜/{0.webp => 幼苗.webp} (100%) rename assets/作物/哈密瓜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/哈密瓜/{2.webp => 未成熟.webp} (100%) rename assets/作物/哈密瓜/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/土豆/0.webp.import delete mode 100644 assets/作物/土豆/2.webp.import rename assets/作物/土豆/{1.webp => 幼苗.webp} (100%) rename assets/作物/土豆/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/土豆/{2.webp => 未成熟.webp} (100%) rename assets/作物/{茄子/4.webp.import => 土豆/未成熟.webp.import} (75%) delete mode 100644 assets/作物/大白菜/1.webp delete mode 100644 assets/作物/大白菜/1.webp.import rename assets/作物/大白菜/{0.webp => 幼苗.webp} (100%) rename assets/作物/大白菜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/大白菜/{2.webp => 未成熟.webp} (100%) rename assets/作物/大白菜/{2.webp.import => 未成熟.webp.import} (70%) rename assets/作物/大蒜/{0.webp => 幼苗.webp} (100%) rename assets/作物/大蒜/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/大豆/2.webp delete mode 100644 assets/作物/大豆/2.webp.import rename assets/作物/大豆/{0.webp => 幼苗.webp} (100%) rename assets/作物/大豆/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/大豆/{1.webp => 未成熟.webp} (100%) rename assets/作物/大豆/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/富贵竹/2.webp delete mode 100644 assets/作物/富贵竹/2.webp.import rename assets/作物/富贵竹/{0.webp => 幼苗.webp} (100%) rename assets/作物/富贵竹/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/富贵竹/{1.webp => 未成熟.webp} (100%) rename assets/作物/富贵竹/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/小麦/2.webp delete mode 100644 assets/作物/小麦/2.webp.import rename assets/作物/小麦/{0.webp => 幼苗.webp} (100%) rename assets/作物/小麦/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/小麦/{1.webp => 未成熟.webp} (100%) rename assets/作物/小麦/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/山楂/{0.webp => 幼苗.webp} (100%) rename assets/作物/山楂/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/山楂/{1.webp => 未成熟.webp} (100%) rename assets/作物/山楂/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/山葵/1.webp delete mode 100644 assets/作物/山葵/1.webp.import rename assets/作物/山葵/{0.webp => 幼苗.webp} (100%) rename assets/作物/山葵/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/山葵/{2.webp => 未成熟.webp} (100%) rename assets/作物/山葵/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/幸运花/1.webp delete mode 100644 assets/作物/幸运花/1.webp.import rename assets/作物/幸运花/{0.webp => 幼苗.webp} (100%) rename assets/作物/幸运花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/幸运花/{2.webp => 未成熟.webp} (100%) rename assets/作物/幸运花/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/幸运草/1.webp delete mode 100644 assets/作物/幸运草/1.webp.import rename assets/作物/幸运草/{0.webp => 幼苗.webp} (100%) rename assets/作物/幸运草/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/幸运草/{2.webp => 未成熟.webp} (100%) rename assets/作物/幸运草/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/康乃馨/1.webp delete mode 100644 assets/作物/康乃馨/1.webp.import rename assets/作物/康乃馨/{0.webp => 幼苗.webp} (100%) rename assets/作物/康乃馨/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/康乃馨/{2.webp => 未成熟.webp} (100%) rename assets/作物/康乃馨/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/摇钱树/2.webp delete mode 100644 assets/作物/摇钱树/2.webp.import rename assets/作物/摇钱树/{0.webp => 幼苗.webp} (100%) rename assets/作物/摇钱树/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/摇钱树/{1.webp => 未成熟.webp} (100%) rename assets/作物/摇钱树/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/星芒草/{0.webp => 幼苗.webp} (100%) rename assets/作物/星芒草/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/月光草/1.webp.import rename assets/作物/月光草/{0.webp => 幼苗.webp} (100%) rename assets/作物/月光草/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/月光草/{1.webp => 未成熟.webp} (100%) rename assets/作物/{南瓜/2.webp.import => 月光草/未成熟.webp.import} (70%) delete mode 100644 assets/作物/杂交树1/2.webp delete mode 100644 assets/作物/杂交树1/2.webp.import delete mode 100644 assets/作物/杂交树1/3.webp delete mode 100644 assets/作物/杂交树1/3.webp.import rename assets/作物/杂交树1/{0.webp => 幼苗.webp} (100%) rename assets/作物/杂交树1/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/杂交树1/{1.webp => 未成熟.webp} (100%) rename assets/作物/杂交树1/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/杂交树2/2.webp delete mode 100644 assets/作物/杂交树2/2.webp.import delete mode 100644 assets/作物/杂交树2/3.webp delete mode 100644 assets/作物/杂交树2/3.webp.import rename assets/作物/杂交树2/{0.webp => 幼苗.webp} (100%) rename assets/作物/杂交树2/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/杂交树2/{1.webp => 未成熟.webp} (100%) rename assets/作物/杂交树2/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/杂草1/{0.webp => 幼苗.webp} (100%) rename assets/作物/杂草1/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/杂草2/{0.webp => 幼苗.webp} (100%) rename assets/作物/杂草2/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/杨桃/1.webp delete mode 100644 assets/作物/杨桃/1.webp.import rename assets/作物/杨桃/{0.webp => 幼苗.webp} (100%) rename assets/作物/杨桃/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/杨桃/{2.webp => 未成熟.webp} (100%) rename assets/作物/杨桃/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/松露/1.webp delete mode 100644 assets/作物/松露/1.webp.import delete mode 100644 assets/作物/松露/3.webp delete mode 100644 assets/作物/松露/3.webp.import rename assets/作物/松露/{0.webp => 幼苗.webp} (100%) rename assets/作物/松露/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/松露/{2.webp => 未成熟.webp} (100%) rename assets/作物/松露/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/枇杷/2.webp delete mode 100644 assets/作物/枇杷/2.webp.import rename assets/作物/枇杷/{0.webp => 幼苗.webp} (100%) rename assets/作物/枇杷/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/枇杷/{1.webp => 未成熟.webp} (100%) rename assets/作物/枇杷/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/柠檬/{0.webp => 幼苗.webp} (100%) rename assets/作物/柠檬/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/柠檬/{1.webp => 未成熟.webp} (100%) rename assets/作物/柠檬/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/柿子/2.webp delete mode 100644 assets/作物/柿子/2.webp.import rename assets/作物/柿子/{0.webp => 幼苗.webp} (100%) rename assets/作物/柿子/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/柿子/{1.webp => 未成熟.webp} (100%) rename assets/作物/柿子/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/栀子花/2.webp delete mode 100644 assets/作物/栀子花/2.webp.import delete mode 100644 assets/作物/栀子花/3.webp delete mode 100644 assets/作物/栀子花/3.webp.import rename assets/作物/栀子花/{0.webp => 幼苗.webp} (100%) rename assets/作物/栀子花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/栀子花/{1.webp => 未成熟.webp} (100%) rename assets/作物/栀子花/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/树莓/1.webp delete mode 100644 assets/作物/树莓/1.webp.import delete mode 100644 assets/作物/树莓/2.webp delete mode 100644 assets/作物/树莓/2.webp.import rename assets/作物/树莓/{0.webp => 幼苗.webp} (100%) rename assets/作物/树莓/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/树莓/{3.webp => 未成熟.webp} (100%) rename assets/作物/树莓/{3.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/桃子/2.webp delete mode 100644 assets/作物/桃子/2.webp.import delete mode 100644 assets/作物/桃子/3.webp delete mode 100644 assets/作物/桃子/3.webp.import rename assets/作物/桃子/{0.webp => 幼苗.webp} (100%) rename assets/作物/桃子/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/桃子/{1.webp => 未成熟.webp} (100%) rename assets/作物/桃子/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/梨子/0.webp delete mode 100644 assets/作物/梨子/0.webp.import rename assets/作物/梨子/{1.webp => 幼苗.webp} (100%) rename assets/作物/梨子/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/梨子/{2.webp => 未成熟.webp} (100%) rename assets/作物/梨子/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/椰子/1.webp delete mode 100644 assets/作物/椰子/1.webp.import rename assets/作物/椰子/{0.webp => 幼苗.webp} (100%) rename assets/作物/椰子/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/椰子/{2.webp => 未成熟.webp} (100%) rename assets/作物/椰子/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/橘子/0.webp delete mode 100644 assets/作物/橘子/1.webp delete mode 100644 assets/作物/橘子/1.webp.import rename assets/作物/橘子/{2.webp => 幼苗.webp} (100%) rename assets/作物/橘子/{2.webp.import => 幼苗.webp.import} (71%) rename assets/作物/橘子/{3.webp => 未成熟.webp} (100%) rename assets/作物/橘子/{3.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/橘子树/0.webp delete mode 100644 assets/作物/橘子树/0.webp.import rename assets/作物/橘子树/{1.webp => 幼苗.webp} (100%) rename assets/作物/橘子树/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/橘子树/{2.webp => 未成熟.webp} (100%) rename assets/作物/橘子树/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/洋葱/1.webp delete mode 100644 assets/作物/洋葱/1.webp.import rename assets/作物/洋葱/{0.webp => 幼苗.webp} (100%) rename assets/作物/洋葱/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/洋葱/{2.webp => 未成熟.webp} (100%) rename assets/作物/洋葱/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/牵牛花/2.webp delete mode 100644 assets/作物/牵牛花/2.webp.import rename assets/作物/牵牛花/{0.webp => 幼苗.webp} (100%) rename assets/作物/牵牛花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/牵牛花/{1.webp => 未成熟.webp} (100%) rename assets/作物/牵牛花/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/{土豆/0.webp => 玉米/幼苗.webp} (100%) rename assets/作物/玉米/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/玉米/{1.webp => 未成熟.webp} (100%) rename assets/作物/玉米/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/玫瑰花/1.webp delete mode 100644 assets/作物/玫瑰花/1.webp.import rename assets/作物/玫瑰花/{0.webp => 幼苗.webp} (100%) rename assets/作物/玫瑰花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/玫瑰花/{2.webp => 未成熟.webp} (100%) rename assets/作物/玫瑰花/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/甘蔗/0.webp delete mode 100644 assets/作物/甘蔗/0.webp.import delete mode 100644 assets/作物/甘蔗/3.webp delete mode 100644 assets/作物/甘蔗/3.webp.import rename assets/作物/甘蔗/{1.webp => 幼苗.webp} (100%) rename assets/作物/甘蔗/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/甘蔗/{2.webp => 未成熟.webp} (100%) rename assets/作物/甘蔗/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/甜菜/0.webp delete mode 100644 assets/作物/甜菜/0.webp.import delete mode 100644 assets/作物/甜菜/3.webp delete mode 100644 assets/作物/甜菜/3.webp.import rename assets/作物/甜菜/{1.webp => 幼苗.webp} (100%) rename assets/作物/甜菜/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/甜菜/{2.webp => 未成熟.webp} (100%) rename assets/作物/甜菜/{2.webp.import => 未成熟.webp.import} (70%) rename assets/作物/生菜/{0.webp => 幼苗.webp} (100%) rename assets/作物/生菜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/番茄/{1.webp => 幼苗.webp} (100%) rename assets/作物/番茄/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/番茄/{2.webp => 未成熟.webp} (100%) rename assets/作物/番茄/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/百合花/3.webp delete mode 100644 assets/作物/百合花/3.webp.import rename assets/作物/百合花/{0.webp => 幼苗.webp} (100%) rename assets/作物/百合花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/百合花/{1.webp => 未成熟.webp} (100%) rename assets/作物/百合花/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/石榴/{0.webp => 幼苗.webp} (100%) rename assets/作物/石榴/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/稻谷/2.webp delete mode 100644 assets/作物/稻谷/2.webp.import rename assets/作物/稻谷/{0.webp => 幼苗.webp} (100%) rename assets/作物/稻谷/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/稻谷/{1.webp => 未成熟.webp} (100%) rename assets/作物/稻谷/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/糖果树/{0.webp => 幼苗.webp} (100%) rename assets/作物/糖果树/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/糖果树/{1.webp => 未成熟.webp} (100%) rename assets/作物/糖果树/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/胡萝卜/0.webp delete mode 100644 assets/作物/胡萝卜/1.webp delete mode 100644 assets/作物/胡萝卜/1.webp.import rename assets/作物/{玉米/0.webp => 胡萝卜/幼苗.webp} (100%) rename assets/作物/胡萝卜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/胡萝卜/{2.webp => 未成熟.webp} (100%) rename assets/作物/胡萝卜/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/芒果/0.webp delete mode 100644 assets/作物/芒果/0.webp.import rename assets/作物/芒果/{1.webp => 幼苗.webp} (100%) rename assets/作物/芒果/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/芒果/{2.webp => 未成熟.webp} (100%) rename assets/作物/芒果/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/芦笋/0.webp delete mode 100644 assets/作物/芦笋/0.webp.import rename assets/作物/芦笋/{2.webp => 幼苗.webp} (100%) rename assets/作物/芦笋/{2.webp.import => 幼苗.webp.import} (71%) rename assets/作物/芦笋/{1.webp => 未成熟.webp} (100%) rename assets/作物/芦笋/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/芦荟/0.webp delete mode 100644 assets/作物/芦荟/0.webp.import delete mode 100644 assets/作物/芦荟/3.webp delete mode 100644 assets/作物/芦荟/3.webp.import rename assets/作物/芦荟/{1.webp => 幼苗.webp} (100%) rename assets/作物/芦荟/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/芦荟/{2.webp => 未成熟.webp} (100%) rename assets/作物/芦荟/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/花椰菜/2.webp delete mode 100644 assets/作物/花椰菜/2.webp.import delete mode 100644 assets/作物/花椰菜/3.webp delete mode 100644 assets/作物/花椰菜/3.webp.import rename assets/作物/花椰菜/{0.webp => 幼苗.webp} (100%) rename assets/作物/花椰菜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/花椰菜/{1.webp => 未成熟.webp} (100%) rename assets/作物/花椰菜/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/苹果/0.webp delete mode 100644 assets/作物/苹果/0.webp.import rename assets/作物/苹果/{1.webp => 幼苗.webp} (100%) rename assets/作物/苹果/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/苹果/{2.webp => 未成熟.webp} (100%) rename assets/作物/苹果/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/茄子/1.webp delete mode 100644 assets/作物/茄子/1.webp.import delete mode 100644 assets/作物/茄子/2.webp delete mode 100644 assets/作物/茄子/2.webp.import delete mode 100644 assets/作物/茄子/4.webp rename assets/作物/茄子/{0.webp => 幼苗.webp} (100%) rename assets/作物/茄子/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/茄子/{3.webp => 未成熟.webp} (100%) rename assets/作物/茄子/{3.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/草莓/2.webp delete mode 100644 assets/作物/草莓/2.webp.import delete mode 100644 assets/作物/草莓/3.webp delete mode 100644 assets/作物/草莓/3.webp.import rename assets/作物/草莓/{0.webp => 幼苗.webp} (100%) rename assets/作物/草莓/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/草莓/{1.webp => 未成熟.webp} (100%) rename assets/作物/草莓/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/荔枝/0.webp delete mode 100644 assets/作物/荔枝/0.webp.import rename assets/作物/荔枝/{1.webp => 幼苗.webp} (100%) rename assets/作物/荔枝/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/荔枝/{2.webp => 未成熟.webp} (100%) rename assets/作物/荔枝/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/菊花/1.webp delete mode 100644 assets/作物/菊花/1.webp.import delete mode 100644 assets/作物/菊花/3.webp delete mode 100644 assets/作物/菊花/3.webp.import rename assets/作物/菊花/{0.webp => 幼苗.webp} (100%) rename assets/作物/菊花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/菊花/{2.webp => 未成熟.webp} (100%) rename assets/作物/菊花/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/菠萝/1.webp delete mode 100644 assets/作物/菠萝/1.webp.import rename assets/作物/菠萝/{0.webp => 幼苗.webp} (100%) rename assets/作物/菠萝/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/菠萝/{2.webp => 未成熟.webp} (100%) rename assets/作物/菠萝/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/葡萄/2.webp delete mode 100644 assets/作物/葡萄/2.webp.import delete mode 100644 assets/作物/葡萄/3.webp delete mode 100644 assets/作物/葡萄/3.webp.import rename assets/作物/葡萄/{0.webp => 幼苗.webp} (100%) rename assets/作物/葡萄/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/葡萄/{1.webp => 未成熟.webp} (100%) rename assets/作物/葡萄/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/葫芦/{0.webp => 幼苗.webp} (100%) rename assets/作物/葫芦/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/葫芦/{1.webp => 未成熟.webp} (100%) rename assets/作物/葫芦/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/蓝莓/1.webp delete mode 100644 assets/作物/蓝莓/1.webp.import delete mode 100644 assets/作物/蓝莓/3.webp delete mode 100644 assets/作物/蓝莓/3.webp.import rename assets/作物/蓝莓/{0.webp => 幼苗.webp} (100%) rename assets/作物/蓝莓/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/蓝莓/{2.webp => 未成熟.webp} (100%) rename assets/作物/蓝莓/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/蕨菜/0.webp delete mode 100644 assets/作物/蕨菜/0.webp.import rename assets/作物/蕨菜/{1.webp => 幼苗.webp} (100%) rename assets/作物/蕨菜/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/蕨菜/{2.webp => 未成熟.webp} (100%) rename assets/作物/蕨菜/{2.webp.import => 未成熟.webp.import} (70%) rename assets/作物/藏红花/{0.webp => 幼苗.webp} (100%) rename assets/作物/藏红花/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/藏羚羊草/{0.webp => 幼苗.webp} (100%) rename assets/作物/藏羚羊草/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/西瓜/1.webp delete mode 100644 assets/作物/西瓜/1.webp.import delete mode 100644 assets/作物/西瓜/3.webp delete mode 100644 assets/作物/西瓜/3.webp.import rename assets/作物/西瓜/{0.webp => 幼苗.webp} (100%) rename assets/作物/西瓜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/西瓜/{2.webp => 未成熟.webp} (100%) rename assets/作物/西瓜/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/豌豆/2.webp delete mode 100644 assets/作物/豌豆/2.webp.import rename assets/作物/豌豆/{0.webp => 幼苗.webp} (100%) rename assets/作物/豌豆/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/豌豆/{1.webp => 未成熟.webp} (100%) rename assets/作物/豌豆/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/辣椒/2.webp delete mode 100644 assets/作物/辣椒/2.webp.import rename assets/作物/辣椒/{0.webp => 幼苗.webp} (100%) rename assets/作物/辣椒/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/辣椒/{1.webp => 未成熟.webp} (100%) rename assets/作物/辣椒/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/迷迭香/{0.webp => 幼苗.webp} (100%) rename assets/作物/迷迭香/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/郁金香/0.webp delete mode 100644 assets/作物/郁金香/0.webp.import rename assets/作物/郁金香/{1.webp => 幼苗.webp} (100%) rename assets/作物/郁金香/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/郁金香/{2.webp => 未成熟.webp} (100%) rename assets/作物/郁金香/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/野草1/0.webp.import rename assets/作物/野草1/{0.webp => 幼苗.webp} (100%) rename assets/作物/{凤凰木/0.webp.import => 野草1/幼苗.webp.import} (74%) rename assets/作物/野草2/{0.webp => 幼苗.webp} (100%) rename assets/作物/野草2/{0.webp.import => 幼苗.webp.import} (71%) delete mode 100644 assets/作物/金橘/1.webp delete mode 100644 assets/作物/金橘/1.webp.import delete mode 100644 assets/作物/金橘/3.webp delete mode 100644 assets/作物/金橘/3.webp.import rename assets/作物/金橘/{0.webp => 幼苗.webp} (100%) rename assets/作物/金橘/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/金橘/{2.webp => 未成熟.webp} (100%) rename assets/作物/金橘/{2.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/面包树/2.webp delete mode 100644 assets/作物/面包树/2.webp.import rename assets/作物/面包树/{0.webp => 幼苗.webp} (100%) rename assets/作物/面包树/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/面包树/{1.webp => 未成熟.webp} (100%) rename assets/作物/面包树/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/香草/0.webp delete mode 100644 assets/作物/香草/0.webp.import delete mode 100644 assets/作物/香草/2.webp delete mode 100644 assets/作物/香草/2.webp.import rename assets/作物/香草/{1.webp => 幼苗.webp} (100%) rename assets/作物/香草/{1.webp.import => 幼苗.webp.import} (71%) rename assets/作物/香草/{3.webp => 未成熟.webp} (100%) rename assets/作物/香草/{3.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/香蕉/2.webp delete mode 100644 assets/作物/香蕉/2.webp.import rename assets/作物/香蕉/{0.webp => 幼苗.webp} (100%) rename assets/作物/香蕉/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/香蕉/{1.webp => 未成熟.webp} (100%) rename assets/作物/香蕉/{1.webp.import => 未成熟.webp.import} (70%) delete mode 100644 assets/作物/鱼腥草/1.webp.import delete mode 100644 assets/作物/鱼腥草/2.webp delete mode 100644 assets/作物/鱼腥草/2.webp.import rename assets/作物/鱼腥草/{0.webp => 幼苗.webp} (100%) rename assets/作物/鱼腥草/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/鱼腥草/{1.webp => 未成熟.webp} (100%) rename assets/作物/{橘子/0.webp.import => 鱼腥草/未成熟.webp.import} (74%) rename assets/作物/黄瓜/{0.webp => 幼苗.webp} (100%) rename assets/作物/黄瓜/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/黄瓜/{1.webp => 未成熟.webp} (100%) rename assets/作物/黄瓜/{1.webp.import => 未成熟.webp.import} (70%) rename assets/作物/默认/{0.webp => 幼苗.webp} (100%) rename assets/作物/默认/{0.webp.import => 幼苗.webp.import} (71%) create mode 100644 assets/作物/默认/未成熟.webp create mode 100644 assets/作物/默认/未成熟.webp.import delete mode 100644 assets/作物/龙果/2.webp delete mode 100644 assets/作物/龙果/2.webp.import rename assets/作物/龙果/{0.webp => 幼苗.webp} (100%) rename assets/作物/龙果/{0.webp.import => 幼苗.webp.import} (71%) rename assets/作物/龙果/{1.webp => 未成熟.webp} (100%) rename assets/作物/龙果/{1.webp.import => 未成熟.webp.import} (70%) create mode 100644 assets/字体/MapleMono-NF-CN-Bold.ttf create mode 100644 assets/字体/MapleMono-NF-CN-Bold.ttf.import create mode 100644 assets/字体/MapleMono-NF-CN-BoldItalic.ttf create mode 100644 assets/字体/MapleMono-NF-CN-BoldItalic.ttf.import create mode 100644 assets/装饰物图片/宠物商店.webp create mode 100644 assets/装饰物图片/宠物商店.webp.import create mode 100644 assets/装饰物图片/小卖部.webp create mode 100644 assets/装饰物图片/小卖部.webp.import create mode 100644 assets/装饰物图片/种子商店.webp create mode 100644 assets/装饰物图片/种子商店.webp.import create mode 100644 assets/装饰物图片/道具商店.webp create mode 100644 assets/装饰物图片/道具商店.webp.import diff --git a/GUI/MainMenuPanel.tscn b/GUI/MainMenuPanel.tscn index 8ab41ca..8da9e46 100644 --- a/GUI/MainMenuPanel.tscn +++ b/GUI/MainMenuPanel.tscn @@ -184,8 +184,8 @@ theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) theme_override_colors/font_outline_color = Color(0, 0, 0, 1) theme_override_constants/shadow_offset_x = 5 theme_override_constants/shadow_offset_y = 5 -theme_override_constants/outline_size = 10 -theme_override_constants/shadow_outline_size = 10 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 theme_override_font_sizes/font_size = 45 text = "关于" horizontal_alignment = 1 diff --git a/GameManager/WeatherSystem.gd b/GameManager/WeatherSystem.gd new file mode 100644 index 0000000..138f18e --- /dev/null +++ b/GameManager/WeatherSystem.gd @@ -0,0 +1,51 @@ +extends Node2D + +@onready var cherry_blossom_rain: Node2D = $CherryBlossomRain #栀子花雨 +@onready var gardenia_rain: Node2D = $GardeniaRain #樱花雨 +@onready var willow_leaf_rain: Node2D = $WillowLeafRain #柳叶雨 +@onready var rain: GPUParticles2D = $Rain #下雨 +@onready var snow: GPUParticles2D = $Snow #下雪 + +# 天气系统 +# 要显示哪种天气直接调用相应天气的show()然后一并隐藏其他天气hide() + +# 设置天气的统一方法 +func set_weather(weather_type: String): + # 先隐藏所有天气效果 + hide_all_weather() + + # 根据天气类型显示对应效果 + match weather_type: + "clear", "stop": + # 晴天或停止天气 - 所有天气效果都隐藏 + pass + "rain": + if rain: + rain.show() + "snow": + if snow: + snow.show() + "cherry": + if cherry_blossom_rain: + cherry_blossom_rain.show() + "gardenia": + if gardenia_rain: + gardenia_rain.show() + "willow": + if willow_leaf_rain: + willow_leaf_rain.show() + _: + print("未知的天气类型: ", weather_type) + +# 隐藏所有天气效果 +func hide_all_weather(): + if cherry_blossom_rain: + cherry_blossom_rain.hide() + if gardenia_rain: + gardenia_rain.hide() + if willow_leaf_rain: + willow_leaf_rain.hide() + if rain: + rain.hide() + if snow: + snow.hide() diff --git a/GameManager/WeatherSystem.gd.uid b/GameManager/WeatherSystem.gd.uid new file mode 100644 index 0000000..ca1324b --- /dev/null +++ b/GameManager/WeatherSystem.gd.uid @@ -0,0 +1 @@ +uid://o4mcuqoivqri diff --git a/MainGame.gd b/MainGame.gd index 8d68cfb..c363721 100644 --- a/MainGame.gd +++ b/MainGame.gd @@ -11,7 +11,7 @@ extends Node @onready var show_level : Label = $UI/GUI/GameInfoHBox1/level # 显示当前玩家的等级 @onready var show_tip : Label = $UI/GUI/GameInfoHBox3/tip # 显示小提示 @onready var show_like: Label = $UI/GUI/GameInfoHBox1/like # 显示别人给自己点赞的总赞数 -@onready var show_onlineplayer: Label = $UI/GUI/GameInfoHBox2/onlineplayer # 显示服务器在线人数 +@onready var show_onlineplayer: Label = $UI/GUI/GameInfoHBox3/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 # 显示与服务器连接状态 @@ -67,6 +67,7 @@ extends Node @onready var pet_store_panel: Panel = $UI/BigPanel/PetStorePanel #宠物商店面板 @onready var pet_fight_panel: Panel = $UI/BigPanel/PetFightPanel #宠物战斗面板 @onready var pet_inform_panel: Panel = $UI/SmallPanel/PetInformPanel #宠物信息面板 +@onready var player_store_panel: Panel = $UI/BigPanel/PlayerStorePanel #玩家小卖部面板 #小面板 @@ -92,6 +93,9 @@ extends Node @onready var tree_status: Label = $Decoration/WisdomTree/TreeStatus #智慧树状态 只显示 等级和高度 @onready var anonymous_talk: RichTextLabel = $Decoration/WisdomTree/BackgroundPanel/AnonymousTalk #给智慧树听音乐100%会刷新 施肥浇水 +#天气系统 +@onready var weather_system: Node2D = $WeatherSystem #天气系统节点 + #各种弹窗 @onready var accept_dialog: AcceptDialog = $UI/DiaLog/AcceptDialog @@ -200,10 +204,6 @@ func _ready(): # 初始化调试面板(默认隐藏) debug_panel.hide() - debug_panel_script = debug_panel - - # 在加载进度面板上添加调试按钮 - _add_debug_button_to_loading_panel() #未登录时隐藏所有UI game_info_h_box_1.hide() @@ -1158,16 +1158,17 @@ func _handle_item_config_response(response_data): #===============================================作物图片缓存系统=============================================== - ## 优化的作物图片缓存和管理系统 class CropTextureManager: - # 缓存字典 - var texture_cache: Dictionary = {} # 序列帧缓存 {crop_name: [Texture2D]} - var mature_texture_cache: Dictionary = {} # 成熟图片缓存 {crop_name: Texture2D} - var frame_counts: Dictionary = {} # 帧数记录 {crop_name: int} + # 缓存字典 - 改为三阶段图片缓存 + var texture_cache: Dictionary = {} # 阶段图片缓存 {crop_name: {"幼苗": Texture2D, "未成熟": Texture2D, "成熟": Texture2D}} + var default_textures: Dictionary = {} # 默认图片缓存 {"幼苗": Texture2D, "未成熟": Texture2D, "成熟": Texture2D} var failed_resources: Array = [] # 记录加载失败的资源路径 + # 三个生长阶段 + const GROWTH_STAGES = ["幼苗", "未成熟", "成熟"] + # 加载状态 var is_loading: bool = false var load_progress: float = 0.0 @@ -1183,9 +1184,6 @@ class CropTextureManager: var results_mutex: Mutex var completed_results: Array = [] - # 调试面板引用 - var debug_panel_ref = null - # 内存管理 var max_cache_size: int = 300 # 最大缓存图片数量 var cache_access_order: Array = [] # LRU缓存访问顺序 @@ -1196,8 +1194,6 @@ class CropTextureManager: results_mutex = Mutex.new() # 根据设备性能动态调整线程数 _adjust_thread_count() - # 尝试获取调试面板引用 - _connect_debug_panel() ## 根据设备性能调整线程数 func _adjust_thread_count(): @@ -1216,28 +1212,8 @@ class CropTextureManager: print("[CropTextureManager] 设备: %s, CPU核心: %d, 使用线程数: %d" % [platform, processor_count, max_threads]) - ## 连接调试面板 - func _connect_debug_panel(): - # 延迟获取调试面板引用,因为初始化时可能还未创建 - call_deferred("_try_get_debug_panel") - - ## 尝试获取调试面板引用 - func _try_get_debug_panel(): - var main_node = Engine.get_main_loop().current_scene - if main_node: - debug_panel_ref = main_node.get_node_or_null("UI/SmallPanel/DebugPanel") - if debug_panel_ref: - print("[CropTextureManager] 已连接到调试面板") - - ## 向调试面板发送消息 - func _send_debug_message(message: String, color: Color = Color.WHITE): - if debug_panel_ref and debug_panel_ref.has_method("add_debug_message"): - debug_panel_ref.add_debug_message(message, color) - - ## 设置当前加载项目 - func _set_current_loading_item(item_name: String): - if debug_panel_ref and debug_panel_ref.has_method("set_current_loading_item"): - debug_panel_ref.set_current_loading_item(item_name) + + ## 异步预加载所有作物图片 - 主要入口函数 func preload_all_textures_async(crop_data: Dictionary, progress_callback: Callable) -> void: @@ -1254,23 +1230,18 @@ class CropTextureManager: completed_results.clear() print("[CropTextureManager] 开始预加载 %d 种作物图片" % total_crops) - _send_debug_message("开始预加载 %d 种作物图片" % total_crops, Color.CYAN) # 阶段1:加载默认图片 (0-10%) progress_callback.call(0, "正在加载默认图片...") - _send_debug_message("阶段1: 加载默认图片", Color.YELLOW) await _load_default_textures_async() progress_callback.call(10, "默认图片加载完成") - _send_debug_message("默认图片加载完成", Color.GREEN) # 阶段2:多线程批量加载作物图片 (10-90%) - _send_debug_message("阶段2: 多线程加载作物图片", Color.YELLOW) await _load_crops_multithreaded_async(crop_data, progress_callback) # 阶段3:完成 (90-100%) progress_callback.call(100, "所有作物图片加载完成!") _print_cache_stats() - _send_debug_message("所有作物图片加载完成!", Color.GREEN) # 清理线程 await _cleanup_threads() @@ -1278,28 +1249,23 @@ class CropTextureManager: is_loading = false var success_message = "预加载完成,成功: %d, 失败: %d" % [loaded_crops, failed_crops] print("[CropTextureManager] " + success_message) - _send_debug_message(success_message, Color.CYAN) ## 多线程批量异步加载作物图片 func _load_crops_multithreaded_async(crop_data: Dictionary, progress_callback: Callable) -> void: var crop_names = crop_data.keys() - # 准备加载队列 + # 准备加载队列 - 为每个作物的每个阶段创建任务 loading_mutex.lock() loading_queue.clear() for crop_name in crop_names: - loading_queue.append({ - "crop_name": crop_name, - "type": "sequence" - }) - loading_queue.append({ - "crop_name": crop_name, - "type": "mature" - }) + for stage in GROWTH_STAGES: + loading_queue.append({ + "crop_name": crop_name, + "stage": stage + }) loading_mutex.unlock() # 启动工作线程 - _send_debug_message("启动 %d 个工作线程" % max_threads, Color.CYAN) for i in range(max_threads): var thread = Thread.new() worker_threads.append(thread) @@ -1363,66 +1329,42 @@ class CropTextureManager: ## 执行单个纹理加载任务 func _load_texture_task(task: Dictionary) -> Dictionary: var crop_name = task["crop_name"] - var task_type = task["type"] + var stage = task["stage"] var result = { "crop_name": crop_name, - "type": task_type, + "stage": stage, "success": false, - "textures": [], "texture": null, "error": "" } - if task_type == "sequence": - result["textures"] = _load_crop_textures_threadsafe(crop_name) - result["success"] = result["textures"].size() > 0 - elif task_type == "mature": - result["texture"] = _load_mature_texture_threadsafe(crop_name) - result["success"] = result["texture"] != null + result["texture"] = _load_stage_texture_threadsafe(crop_name, stage) + result["success"] = result["texture"] != null # 检查加载是否成功 if not result["success"]: - result["error"] = "加载失败: " + crop_name - failed_resources.append(crop_name) + result["error"] = "加载失败: %s - %s" % [crop_name, stage] + failed_resources.append(crop_name + "/" + stage) return result - ## 线程安全的作物序列帧加载 - func _load_crop_textures_threadsafe(crop_name: String) -> Array: - var textures = [] + ## 线程安全的阶段图片加载 + func _load_stage_texture_threadsafe(crop_name: String, stage: String) -> Texture2D: var crop_path = "res://assets/作物/" + crop_name + "/" + var texture_path = crop_path + stage + ".webp" - # 检查作物文件夹是否存在 - if not DirAccess.dir_exists_absolute(crop_path): - return [] - - # 使用ResourceLoader.load_threaded_request进行异步加载 - var frame_index = 0 - var max_frames = 20 # 限制最大帧数,避免无限循环 - - while frame_index < max_frames: - var texture_path = crop_path + str(frame_index) + ".webp" - - if not ResourceLoader.exists(texture_path): - break - - # 使用线程安全的资源加载 + # 首先尝试加载作物特定的阶段图片 + if ResourceLoader.exists(texture_path): var texture = _load_resource_safe(texture_path) if texture: - textures.append(texture) - frame_index += 1 - else: - break + return texture - return textures - - ## 线程安全的成熟图片加载 - func _load_mature_texture_threadsafe(crop_name: String) -> Texture2D: - var crop_path = "res://assets/作物/" + crop_name + "/" - var mature_path = crop_path + "成熟.webp" - - if ResourceLoader.exists(mature_path): - return _load_resource_safe(mature_path) + # 如果没有找到,尝试使用默认图片 + var default_path = "res://assets/作物/默认/" + stage + ".webp" + if ResourceLoader.exists(default_path): + var default_texture = _load_resource_safe(default_path) + if default_texture: + return default_texture return null @@ -1448,76 +1390,41 @@ class CropTextureManager: ## 应用加载结果到缓存 func _apply_loading_result(result: Dictionary): var crop_name = result["crop_name"] - var task_type = result["type"] + var stage = result["stage"] var success = result["success"] if not success: - var error_msg = "加载失败: %s (%s)" % [crop_name, task_type] - _send_debug_message(error_msg, Color.RED) return - if task_type == "sequence": - var textures = result["textures"] - if textures.size() > 0: - texture_cache[crop_name] = textures - frame_counts[crop_name] = textures.size() - _update_cache_access(crop_name) - _send_debug_message("✓ %s: %d帧" % [crop_name, textures.size()], Color.GREEN) - elif task_type == "mature": - var texture = result["texture"] - if texture: - mature_texture_cache[crop_name] = texture - _update_cache_access(crop_name + "_mature") - _send_debug_message("✓ %s: 成熟图片" % crop_name, Color.GREEN) + var texture = result["texture"] + if texture: + # 确保作物有缓存字典 + if not texture_cache.has(crop_name): + texture_cache[crop_name] = {} + + # 缓存阶段图片 + texture_cache[crop_name][stage] = texture + _update_cache_access(crop_name + "_" + stage) # 检查缓存大小,必要时清理 _check_and_cleanup_cache() ## 立即加载默认图片(同步,但优化) func _load_default_textures_async() -> void: - const DEFAULT_CROP = "默认" const DEFAULT_PATH = "res://assets/作物/默认/" - if texture_cache.has(DEFAULT_CROP): + if default_textures.size() > 0: return - var textures = [] - var frame_index = 0 - - # 限制默认图片帧数 - while frame_index < 10: - var texture_path = DEFAULT_PATH + str(frame_index) + ".webp" + # 加载三个阶段的默认图片 + for stage in GROWTH_STAGES: + var texture_path = DEFAULT_PATH + stage + ".webp" if ResourceLoader.exists(texture_path): var texture = _load_resource_safe(texture_path) if texture: - textures.append(texture) - frame_index += 1 - else: - break - else: - break + default_textures[stage] = texture - # 如果没有序列帧,尝试加载单个图片 - if textures.size() == 0: - var single_path = DEFAULT_PATH + "0.webp" - if ResourceLoader.exists(single_path): - var texture = _load_resource_safe(single_path) - if texture: - textures.append(texture) - - # 缓存结果 - if textures.size() > 0: - texture_cache[DEFAULT_CROP] = textures - frame_counts[DEFAULT_CROP] = textures.size() - - # 加载默认成熟图片 - var mature_path = DEFAULT_PATH + "成熟.webp" - if ResourceLoader.exists(mature_path): - var mature_texture = _load_resource_safe(mature_path) - if mature_texture: - mature_texture_cache[DEFAULT_CROP] = mature_texture - - print("[CropTextureManager] 默认图片加载完成:%d 帧" % textures.size()) + print("[CropTextureManager] 默认图片加载完成:%d 个阶段" % default_textures.size()) # 让出一帧 await Engine.get_main_loop().process_frame @@ -1530,62 +1437,81 @@ class CropTextureManager: ## 检查并清理缓存 func _check_and_cleanup_cache(): - var total_cached = texture_cache.size() + mature_texture_cache.size() + var total_cached = 0 + for crop_name in texture_cache.keys(): + total_cached += texture_cache[crop_name].size() if total_cached > max_cache_size: var to_remove = total_cached - max_cache_size + 10 # 多清理一些 - _send_debug_message("⚠ 缓存超限,开始清理 %d 个项目" % to_remove, Color.ORANGE) for i in range(min(to_remove, cache_access_order.size())): var key = cache_access_order[i] - # 不清理默认图片 + # 不清理默认图片相关的键 if key.begins_with("默认"): continue - if key.ends_with("_mature"): - var crop_name = key.replace("_mature", "") - mature_texture_cache.erase(crop_name) - else: - texture_cache.erase(key) - frame_counts.erase(key) + # 解析键:crop_name_stage + var parts = key.split("_") + if parts.size() >= 2: + var stage = parts[-1] + var crop_name = "_".join(parts.slice(0, -1)) + + if texture_cache.has(crop_name) and texture_cache[crop_name].has(stage): + texture_cache[crop_name].erase(stage) + + # 如果作物的所有阶段都被清理,删除作物条目 + if texture_cache[crop_name].is_empty(): + texture_cache.erase(crop_name) # 更新访问顺序 cache_access_order = cache_access_order.slice(to_remove) - var current_size = texture_cache.size() + mature_texture_cache.size() + var current_size = 0 + for crop_name in texture_cache.keys(): + current_size += texture_cache[crop_name].size() var cleanup_msg = "缓存清理完成,当前缓存: %d" % current_size print("[CropTextureManager] " + cleanup_msg) - _send_debug_message(cleanup_msg, Color.YELLOW) ## 根据生长进度获取作物图片(带缓存优化) func get_texture_by_progress(crop_name: String, progress: float) -> Texture2D: + # 根据进度确定阶段 + var stage = "" + if progress < 0.33: + stage = "幼苗" + elif progress < 0.85: + stage = "未成熟" + else: + stage = "成熟" + # 更新访问记录 - _update_cache_access(crop_name) + var access_key = crop_name + "_" + stage + _update_cache_access(access_key) - # 100%成熟时优先使用成熟图片 - if progress >= 1.0: - var mature_texture = mature_texture_cache.get(crop_name, null) - if mature_texture: - _update_cache_access(crop_name + "_mature") - return mature_texture + # 尝试获取作物特定的阶段图片 + if texture_cache.has(crop_name) and texture_cache[crop_name].has(stage): + var texture = texture_cache[crop_name][stage] + if texture: + return texture - # 使用序列帧图片 - var textures = texture_cache.get(crop_name, []) - if textures.size() == 0: - # 如果没有缓存,尝试使用默认图片 - textures = texture_cache.get("默认", []) - if textures.size() == 0: - return null + # 如果没有缓存,尝试直接从文件夹加载 + var direct_texture = _load_stage_texture_threadsafe(crop_name, stage) + if direct_texture: + # 将直接加载的图片加入缓存,避免下次再次加载 + if not texture_cache.has(crop_name): + texture_cache[crop_name] = {} + texture_cache[crop_name][stage] = direct_texture + _update_cache_access(crop_name + "_" + stage) + return direct_texture - if textures.size() == 1: - return textures[0] + # 最后才回退到默认图片 + if default_textures.has(stage): + var default_texture = default_textures[stage] + if default_texture: + return default_texture - # 根据进度计算帧索引 - var frame_index = int(progress * (textures.size() - 1)) - frame_index = clamp(frame_index, 0, textures.size() - 1) - - return textures[frame_index] + # 如果都没有,返回null + return null ## 清理线程 func _cleanup_threads() -> void: @@ -1599,8 +1525,7 @@ class CropTextureManager: func clear_cache() -> void: await _cleanup_threads() texture_cache.clear() - mature_texture_cache.clear() - frame_counts.clear() + default_textures.clear() cache_access_order.clear() failed_resources.clear() print("[CropTextureManager] 缓存已清理") @@ -1608,13 +1533,13 @@ class CropTextureManager: ## 打印缓存统计信息 func _print_cache_stats() -> void: print("[CropTextureManager] 缓存统计:") - print(" - 序列帧缓存: %d 种作物" % texture_cache.size()) - print(" - 成熟图片缓存: %d 种作物" % mature_texture_cache.size()) + print(" - 阶段图片缓存: %d 种作物" % texture_cache.size()) + print(" - 默认图片缓存: %d 个阶段" % default_textures.size()) print(" - 加载失败: %d 个资源" % failed_resources.size()) - var total_frames = 0 - for count in frame_counts.values(): - total_frames += count - print(" - 总图片帧数: %d 帧" % total_frames) + var total_stages = 0 + for crop_name in texture_cache.keys(): + total_stages += texture_cache[crop_name].size() + print(" - 总阶段图片数: %d 个" % total_stages) if failed_resources.size() > 0: print(" - 失败的资源:") @@ -1625,13 +1550,15 @@ class CropTextureManager: func get_cache_info() -> String: var info = "作物图片缓存详情:\n" for crop_name in texture_cache.keys(): - var frame_count = frame_counts.get(crop_name, 0) - var has_mature = mature_texture_cache.has(crop_name) - info += " - %s: %d帧" % [crop_name, frame_count] - if has_mature: - info += " (含成熟图片)" + var stages = texture_cache[crop_name].keys() + info += " - %s: %s" % [crop_name, "/".join(stages)] info += "\n" + if default_textures.size() > 0: + info += "\n默认图片:\n" + for stage in default_textures.keys(): + info += " - " + stage + "\n" + if failed_resources.size() > 0: info += "\n加载失败的资源:\n" for failed in failed_resources: @@ -1645,25 +1572,19 @@ class CropTextureManager: for crop_name in common_crops: # 确保常用作物在缓存中 if not texture_cache.has(crop_name): - var textures = _load_crop_textures_threadsafe(crop_name) - if textures.size() > 0: - texture_cache[crop_name] = textures - frame_counts[crop_name] = textures.size() - - if not mature_texture_cache.has(crop_name): - var mature = _load_mature_texture_threadsafe(crop_name) - if mature: - mature_texture_cache[crop_name] = mature + texture_cache[crop_name] = {} + + # 加载各个阶段的图片 + for stage in GROWTH_STAGES: + var texture = _load_stage_texture_threadsafe(crop_name, stage) + if texture: + texture_cache[crop_name][stage] = texture + + # 全局作物图片管理器实例 var crop_texture_manager: CropTextureManager -# 资源加载调试器(可选,用于调试) -var resource_debugger = null - -# 调试面板脚本引用 -var debug_panel_script = null - #===============================================作物图片缓存系统=============================================== @@ -1724,11 +1645,7 @@ func _update_load_progress(progress: int, message: String = "") -> void: if message_label and message != "": message_label.text = message - # 向调试面板发送进度信息 - if debug_panel_script and debug_panel_script.has_method("add_debug_message"): - if message != "": - #debug_panel_script.add_debug_message("进度 %d%%: %s" % [progress, message], Color.CYAN) - pass + # 检测卡顿 _check_loading_stuck(progress) @@ -1748,8 +1665,7 @@ func _check_loading_stuck(progress: int): if progress == last_progress_value: var stuck_time = current_time - last_progress_time if stuck_time > 5.0: # 5秒没有进度变化 - if debug_panel_script and debug_panel_script.has_method("add_debug_message"): - debug_panel_script.add_debug_message("⚠ 加载卡顿检测: 在 %d%% 停留了 %.1f 秒" % [progress, stuck_time], Color.ORANGE) + print("⚠ 加载卡顿检测: 在 %d%% 停留了 %.1f 秒" % [progress, stuck_time]) else: # 进度有变化,更新记录 last_progress_value = progress @@ -1797,95 +1713,7 @@ func _wait_for_crop_data() -> void: #===============================================调试和维护工具=============================================== -## 调试:打印缓存信息 -func _debug_print_crop_cache() -> void: - if crop_texture_manager: - print(crop_texture_manager.get_cache_info()) - else: - print("[调试] 作物图片管理器未初始化") -## 调试:强制刷新所有图片 -func _debug_refresh_all_crop_sprites() -> void: - print("[调试] 强制刷新所有地块图片...") - _refresh_all_crop_sprites() - print("[调试] 图片刷新完成") - -## 调试:清理图片缓存 -func _debug_clear_crop_cache() -> void: - if crop_texture_manager: - crop_texture_manager.clear_cache() - print("[调试] 图片缓存已清理") - -## 调试:启用资源加载调试器 -func _debug_enable_resource_debugger() -> void: - if not resource_debugger: - resource_debugger = preload("res://GlobalScript/ResourceLoadingDebugger.gd").new() - add_child(resource_debugger) - print("[调试] 资源加载调试器已启用") - else: - print("[调试] 资源加载调试器已经在运行") - -## 调试:生成资源加载报告 -func _debug_generate_loading_report() -> void: - if resource_debugger: - var report = resource_debugger.generate_loading_report() - print(report) - resource_debugger.export_debug_data_to_file() - else: - print("[调试] 资源加载调试器未启用,请先调用 _debug_enable_resource_debugger()") - -## 调试:检测设备能力 -func _debug_detect_device_capabilities() -> void: - if resource_debugger: - var capabilities = resource_debugger.detect_device_capabilities() - print("[调试] 设备能力检测结果:") - for key in capabilities: - print(" %s: %s" % [key, str(capabilities[key])]) - else: - print("[调试] 资源加载调试器未启用") - -## 调试:强制触发低内存模式 -func _debug_trigger_low_memory_mode() -> void: - if crop_texture_manager: - # 临时降低缓存大小来模拟低内存环境 - crop_texture_manager.max_cache_size = 50 - crop_texture_manager._check_and_cleanup_cache() - print("[调试] 已触发低内存模式,缓存大小限制为50") - -## 调试:恢复正常内存模式 -func _debug_restore_normal_memory_mode() -> void: - if crop_texture_manager: - crop_texture_manager.max_cache_size = 200 - print("[调试] 已恢复正常内存模式,缓存大小限制为200") - -## 在加载进度面板上添加调试按钮 -func _add_debug_button_to_loading_panel(): - # 创建调试按钮 - var debug_button = Button.new() - debug_button.text = "调试信息" - debug_button.size_flags_horizontal = Control.SIZE_SHRINK_CENTER - debug_button.position = Vector2(10, 500) # 左下角位置 - debug_button.size = Vector2(120, 40) - - # 设置按钮样式 - debug_button.modulate = Color(0.8, 0.8, 1.0, 0.9) # 半透明蓝色 - - # 连接点击信号 - debug_button.pressed.connect(_on_debug_button_pressed) - - # 添加到加载进度面板 - load_progress_panel.add_child(debug_button) - - print("[MainGame] 调试按钮已添加到加载进度面板") - -## 调试按钮点击处理 -func _on_debug_button_pressed(): - if debug_panel.visible: - debug_panel.hide() - else: - debug_panel.show() - debug_panel.move_to_front() - print("[MainGame] 调试面板切换显示状态") #===============================================调试和维护工具=============================================== @@ -1894,8 +1722,14 @@ func _on_debug_button_pressed(): #===============================================向后兼容性=============================================== # 为了保持向后兼容,保留一些原来的函数名 func _load_crop_textures(crop_name: String) -> Array: - if crop_texture_manager: - return crop_texture_manager._load_crop_textures_threadsafe(crop_name) + # 返回所有阶段的图片 + if crop_texture_manager and crop_texture_manager.texture_cache.has(crop_name): + var stages = crop_texture_manager.texture_cache[crop_name] + var textures = [] + for stage in crop_texture_manager.GROWTH_STAGES: + if stages.has(stage): + textures.append(stages[stage]) + return textures return [] func _get_crop_texture_by_progress(crop_name: String, progress: float) -> Texture2D: @@ -2398,12 +2232,11 @@ func _handle_broadcast_history_response(data: Dictionary): # 更新主界面大喇叭显示为最新消息 if global_server_broadcast: var latest_message = global_server_broadcast_panel.get_latest_message() - if latest_message != "暂无消息": + if latest_message != "全服大喇叭": global_server_broadcast.text = latest_message print("主界面大喇叭已更新为: ", latest_message) else: - global_server_broadcast.text = "" - print("没有消息,清空主界面大喇叭显示") + global_server_broadcast.text = "全服大喇叭" # 初始化大喇叭显示 @@ -3479,3 +3312,39 @@ func _handle_wisdom_tree_config_response(data): wisdom_tree_panel.wisdom_tree_config = config wisdom_tree_panel.update_ui() # ======================================= 智慧树系统 ========================================= + + +# ======================================= 天气系统 ========================================= +# 处理天气变更 +func _handle_weather_change(weather_type: String, weather_name: String): + """处理服务器发送的天气变更消息""" + if weather_system and weather_system.has_method("set_weather"): + weather_system.set_weather(weather_type) + Toast.show("天气已变更为:" + weather_name, Color.CYAN, 3.0) + print("天气已切换为:", weather_name) + else: + print("天气系统不可用") +# ======================================= 天气系统 ========================================= + + +#打开小卖部面板 +func _on_my_store_button_pressed() -> void: + player_store_panel.show() + pass + +#打开小卖部面板 +func _on_player_store_pressed() -> void: + player_store_panel.show() + pass + +func _on_seed_store_pressed() -> void: + crop_store_panel.show() + pass + +func _on_item_store_pressed() -> void: + item_store_panel.show() + pass + +func _on_pet_store_pressed() -> void: + pet_store_panel.show() + pass diff --git a/MainGame.tscn b/MainGame.tscn index 413b5f0..ab5478b 100644 --- a/MainGame.tscn +++ b/MainGame.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=85 format=3 uid="uid://dgh61dttaas5a"] +[gd_scene load_steps=96 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://du2pyiojliasy" path="res://assets/游戏UI/经验球.webp" id="2_6jgly"] [ext_resource type="PackedScene" uid="uid://bkivlkirrx6u8" path="res://CopyItems/crop_item.tscn" id="3_isiom"] +[ext_resource type="FontFile" uid="uid://dl31rnmd4lia" path="res://assets/字体/MapleMono-NF-CN-Bold.ttf" id="3_t4s8j"] [ext_resource type="Texture2D" uid="uid://ftv231igtdoq" path="res://assets/游戏UI/等级.webp" id="3_y1hsh"] [ext_resource type="Texture2D" uid="uid://bqib5y8uwg6hx" path="res://assets/游戏UI/钱币.webp" id="4_ql8k3"] [ext_resource type="Texture2D" uid="uid://waqbwo2r33j3" path="res://assets/游戏UI/小提示.webp" id="5_5b81d"] @@ -31,6 +32,7 @@ [ext_resource type="PackedScene" uid="uid://j4ft87o7jk14" path="res://Scene/BigPanel/ItemStorePanel.tscn" id="21_uhubb"] [ext_resource type="PackedScene" uid="uid://cw8am7nnbgca5" path="res://Scene/Pet/PetFightPanel.tscn" id="23_n03md"] [ext_resource type="Script" uid="uid://bdhwvqsmakna2" path="res://Script/BigPanel/PetBagPanel.gd" id="23_uc6q1"] +[ext_resource type="Script" uid="uid://bdavskipn547h" path="res://Script/BigPanel/PlayerStorePanel.gd" id="24_dygid"] [ext_resource type="PackedScene" uid="uid://cnjidcwuv4nn4" path="res://Scene/BigPanel/PetStorePanel.tscn" id="24_uc6q1"] [ext_resource type="PackedScene" uid="uid://d3i0l6ysrde6o" path="res://Scene/SmallPanel/AccountSettingPanel.tscn" id="26_uc6q1"] [ext_resource type="PackedScene" uid="uid://d1lu2yg4xl382" path="res://Scene/SmallPanel/LoadProgressPanel.tscn" id="27_vygm6"] @@ -46,31 +48,33 @@ [ext_resource type="PackedScene" uid="uid://ibl5wbbw3pwc" path="res://CopyItems/item_button.tscn" id="39_cdkxt"] [ext_resource type="Script" uid="uid://dwf28j01ckg3y" path="res://Script/SmallPanel/WisdomTreePanel.gd" id="39_np7ck"] [ext_resource type="Texture2D" uid="uid://bt1i2yhhlor5e" path="res://assets/地块/土块1.webp" id="41_cdkxt"] +[ext_resource type="Script" uid="uid://b185o1hjnlrv5" path="res://Script/SmallPanel/CropInformPanel.gd" id="41_iluto"] [ext_resource type="Texture2D" uid="uid://3ff2lnbc0op7" path="res://assets/稻草人图片/稻草人1.webp" id="43_6rkns"] +[ext_resource type="Script" uid="uid://dsmmxivba06ab" path="res://Script/Dialog/BatchSellPopup.gd" id="44_av1bx"] [ext_resource type="Texture2D" uid="uid://cbdm5e6s8bf6l" path="res://assets/智慧树图片/智慧树4.webp" id="45_xvovi"] +[ext_resource type="Script" uid="uid://cha0uw4ra1trr" path="res://Script/Dialog/AddProduct2StorePopup.gd" id="46_8d602"] [ext_resource type="Texture2D" uid="uid://dilipbs0lncpd" path="res://assets/草地图片/草地10.webp" id="48_2i8fe"] [ext_resource type="Texture2D" uid="uid://du34yctd8bd8m" path="res://assets/灌木丛图片/灌木丛1.webp" id="49_xjiif"] [ext_resource type="Texture2D" uid="uid://dswjorjhf1i6f" path="res://assets/灌木丛图片/灌木丛2.webp" id="50_sqnmr"] [ext_resource type="Texture2D" uid="uid://go3n3qnpancf" path="res://assets/灌木丛图片/灌木丛3.webp" id="51_2i8fe"] [ext_resource type="Texture2D" uid="uid://dk4yl4ghmxaa2" path="res://assets/天气系统图片/雪花.webp" id="53_4ka7t"] -[ext_resource type="PackedScene" uid="uid://cvg38nsrm77jy" path="res://Scene/Particle/WillowLeafRain.tscn" id="53_nf3jg"] [ext_resource type="Texture2D" uid="uid://chcgrmluhfxuk" path="res://assets/天气系统图片/樱花1.webp" id="53_tdq2s"] [ext_resource type="Texture2D" uid="uid://c1qqalp7owgy2" path="res://assets/天气系统图片/栀子花1.webp" id="53_xyeuq"] +[ext_resource type="Texture2D" uid="uid://b7g5ut03rm53n" path="res://assets/装饰物图片/小卖部.webp" id="54_06tja"] [ext_resource type="Texture2D" uid="uid://dfkgmj7e0555q" path="res://assets/天气系统图片/樱花2.webp" id="54_dygjy"] [ext_resource type="Texture2D" uid="uid://bfducebx4c4il" path="res://assets/天气系统图片/柳叶3.webp" id="54_jiccn"] [ext_resource type="Texture2D" uid="uid://cd7x78uyi2csh" path="res://assets/天气系统图片/栀子花2.webp" id="54_t4s8j"] [ext_resource type="Texture2D" uid="uid://dl58ie2lneq77" path="res://assets/天气系统图片/柳叶1.webp" id="55_e8wx8"] [ext_resource type="Texture2D" uid="uid://q0difb6wjkgm" path="res://assets/天气系统图片/樱花3.webp" id="55_edvcq"] +[ext_resource type="Texture2D" uid="uid://j3h0ocagxf8" path="res://assets/装饰物图片/种子商店.webp" id="55_g4i0f"] [ext_resource type="Texture2D" uid="uid://cqqyc3ddwtvpn" path="res://assets/天气系统图片/栀子花3.webp" id="55_iluto"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5dq3w"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nf3jg"] +[ext_resource type="Texture2D" uid="uid://d4e54gh5iccul" path="res://assets/装饰物图片/道具商店.webp" id="56_rlmnt"] +[ext_resource type="Texture2D" uid="uid://deow5dqdm412v" path="res://assets/装饰物图片/宠物商店.webp" id="57_rlmnt"] +[ext_resource type="Script" uid="uid://o4mcuqoivqri" path="res://GameManager/WeatherSystem.gd" id="62_uyv6e"] +[ext_resource type="Texture2D" uid="uid://bnv6wb0k443fv" path="res://assets/天气系统图片/柳叶2.webp" id="69_uyv6e"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_adtqp"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4ka7t"] - [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n03md"] border_width_left = 5 border_width_top = 5 @@ -83,6 +87,18 @@ corner_radius_bottom_left = 20 corner_detail = 20 shadow_size = 20 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8d602"] +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +corner_radius_top_left = 20 +corner_radius_top_right = 20 +corner_radius_bottom_right = 20 +corner_radius_bottom_left = 20 +corner_detail = 20 +shadow_size = 20 + [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5b81d"] border_width_left = 10 border_width_top = 10 @@ -116,10 +132,22 @@ corner_radius_bottom_left = 20 corner_detail = 20 shadow_size = 30 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xyeuq"] +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 +corner_detail = 20 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_t4s8j"] +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 + [sub_resource type="Environment" id="Environment_m6fch"] background_mode = 3 ambient_light_energy = 0.0 -glow_enabled = true glow_intensity = 1.0 glow_bloom = 0.3 glow_blend_mode = 0 @@ -164,6 +192,18 @@ turbulence_noise_speed = Vector3(10, 0, 0) turbulence_influence_min = 0.02 turbulence_influence_max = 0.07 +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_6fhdl"] +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(1000, 1, 1) +gravity = Vector3(-30, 80, 0) +scale_min = 0.4 +scale_max = 0.5 +turbulence_enabled = true +turbulence_noise_speed = Vector3(10, 0, 0) +turbulence_influence_min = 0.02 +turbulence_influence_max = 0.07 + [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_e8wx8"] particle_flag_disable_z = true emission_shape = 3 @@ -243,7 +283,7 @@ anchors_preset = 0 [node name="GameInfoHBox1" type="HBoxContainer" parent="UI/GUI"] layout_mode = 0 -offset_right = 1400.0 +offset_right = 1339.0 offset_bottom = 35.0 [node name="experience_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"] @@ -261,8 +301,10 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "经验:999" +vertical_alignment = 1 [node name="level_image" type="TextureRect" parent="UI/GUI/GameInfoHBox1"] layout_mode = 2 @@ -278,6 +320,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "等级:100" @@ -295,6 +338,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "钱币:999" @@ -312,6 +356,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "体力值:20" @@ -329,13 +374,14 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "点赞数:0" [node name="GameInfoHBox2" type="HBoxContainer" parent="UI/GUI"] layout_mode = 0 offset_top = 35.0 -offset_right = 1400.0 +offset_right = 1336.0 offset_bottom = 70.0 [node name="player_name_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"] @@ -352,8 +398,9 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 -text = "玩家昵称:树萌芽" +text = "玩家昵称:树萌芽" [node name="farm_name_image" type="TextureRect" parent="UI/GUI/GameInfoHBox2"] layout_mode = 2 @@ -369,6 +416,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "农场名称:树萌芽的农场" @@ -385,6 +433,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "服务器状态:正在检测中" @@ -402,31 +451,15 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") 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_colors/font_shadow_color = Color(0, 0, 0, 1) -theme_override_colors/font_outline_color = Color(0, 0, 0, 1) -theme_override_constants/shadow_offset_x = 3 -theme_override_constants/shadow_offset_y = 3 -theme_override_constants/outline_size = 10 -theme_override_constants/shadow_outline_size = 10 -theme_override_font_sizes/font_size = 25 -text = "检测中..." - [node name="GameInfoHBox3" type="HBoxContainer" parent="UI/GUI"] layout_mode = 0 offset_top = 70.0 -offset_right = 1400.0 -offset_bottom = 105.0 +offset_right = 1335.0 +offset_bottom = 113.0 [node name="tip_image" type="TextureRect" parent="UI/GUI/GameInfoHBox3"] layout_mode = 2 @@ -442,6 +475,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "游戏小提示" @@ -460,6 +494,7 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_offset_y = 3 theme_override_constants/outline_size = 10 theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") theme_override_font_sizes/font_size = 25 text = "全服大喇叭" vertical_alignment = 1 @@ -473,6 +508,24 @@ theme_override_constants/outline_size = 10 theme_override_font_sizes/font_size = 25 text = "查看" +[node name="onlineplayer_image" type="TextureRect" parent="UI/GUI/GameInfoHBox3"] +layout_mode = 2 +texture = ExtResource("10_vygm6") +expand_mode = 2 + +[node name="onlineplayer" type="Label" parent="UI/GUI/GameInfoHBox3"] +layout_mode = 2 +theme_override_colors/font_color = Color(0.423529, 1, 0.533333, 1) +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 10 +theme_override_constants/shadow_outline_size = 10 +theme_override_fonts/font = ExtResource("3_t4s8j") +theme_override_font_sizes/font_size = 25 +text = "检测中..." + [node name="FarmVBox" type="VBoxContainer" parent="UI/GUI"] layout_mode = 0 offset_left = 4.0 @@ -483,6 +536,7 @@ scale = Vector2(0.8, 0.8) alignment = 2 [node name="SeedStoreButton" type="Button" parent="UI/GUI/FarmVBox"] +visible = false modulate = Color(1, 0.564706, 0.647059, 1) layout_mode = 2 theme_override_font_sizes/font_size = 40 @@ -501,6 +555,7 @@ theme_override_font_sizes/font_size = 40 text = "作物仓库" [node name="ItemStoreButton" type="Button" parent="UI/GUI/FarmVBox"] +visible = false modulate = Color(0.231373, 0.772549, 1, 1) layout_mode = 2 theme_override_font_sizes/font_size = 40 @@ -560,6 +615,13 @@ offset_bottom = 408.0 scale = Vector2(0.8, 0.8) alignment = 2 +[node name="MyStoreButton" type="Button" parent="UI/GUI/OtherVBox"] +visible = false +modulate = Color(0.917346, 0.737213, 1, 1) +layout_mode = 2 +theme_override_font_sizes/font_size = 40 +text = "我的小卖部" + [node name="AccountSettingButton" type="Button" parent="UI/GUI/OtherVBox"] modulate = Color(0.843137, 0.772549, 1, 1) layout_mode = 2 @@ -636,6 +698,7 @@ theme_override_font_sizes/font_size = 40 text = "宠物背包" [node name="PetStoreButton" 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 @@ -650,22 +713,6 @@ text = "稻草人" [node name="BigPanel" type="CanvasLayer" parent="UI"] -[node name="LuckyDrawPanel" parent="UI/BigPanel" instance=ExtResource("17_f21le")] -visible = false -offset_left = 425.0 -offset_top = 2.0 -offset_right = 1025.0 -offset_bottom = 722.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_5dq3w") - -[node name="DailyCheckInPanel" parent="UI/BigPanel" instance=ExtResource("18_m6fch")] -visible = false -offset_left = 442.0 -offset_top = 3.0 -offset_right = 1042.0 -offset_bottom = 723.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_nf3jg") - [node name="TCPNetworkManagerPanel" parent="UI/BigPanel" instance=ExtResource("7_401ut")] visible = false offset_top = 97.0 @@ -688,15 +735,6 @@ offset_bottom = 797.0 [node name="CropWarehousePanel" parent="UI/BigPanel" instance=ExtResource("18_5b81d")] -[node name="LoginPanel" parent="UI/BigPanel" instance=ExtResource("11_6jgly")] -visible = false -top_level = true -offset_left = 342.0 -offset_top = 40.0 -offset_right = 1092.0 -offset_bottom = 700.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_4ka7t") - [node name="PlayerBagPanel" parent="UI/BigPanel" instance=ExtResource("19_8kysg")] visible = false @@ -706,6 +744,88 @@ visible = false [node name="ItemBagPanel" parent="UI/BigPanel" instance=ExtResource("20_n03md")] visible = false +[node name="PlayerStorePanel" type="Panel" parent="UI/BigPanel"] +visible = false +offset_left = 69.0 +offset_top = 56.0 +offset_right = 1635.0 +offset_bottom = 836.0 +scale = Vector2(0.8, 0.8) +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_n03md") +script = ExtResource("24_dygid") + +[node name="TMBackGround" type="ColorRect" parent="UI/BigPanel/PlayerStorePanel"] +layout_mode = 0 +offset_left = -90.0 +offset_top = -71.0 +offset_right = 1672.0 +offset_bottom = 831.0 +color = Color(1, 1, 1, 0) + +[node name="ScrollContainer" type="ScrollContainer" parent="UI/BigPanel/PlayerStorePanel"] +layout_mode = 2 +offset_left = 28.0 +offset_top = 95.0 +offset_right = 3805.0 +offset_bottom = 1723.0 +scale = Vector2(0.4, 0.4) +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="Store_Grid" type="GridContainer" parent="UI/BigPanel/PlayerStorePanel/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 6 +size_flags_vertical = 3 +columns = 8 + +[node name="Title" type="Label" parent="UI/BigPanel/PlayerStorePanel"] +layout_mode = 2 +offset_right = 1566.0 +offset_bottom = 69.0 +size_flags_horizontal = 3 +theme_override_colors/font_color = Color(1, 1, 0.807843, 1) +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 4 +theme_override_constants/shadow_offset_y = 4 +theme_override_constants/outline_size = 15 +theme_override_constants/shadow_outline_size = 15 +theme_override_font_sizes/font_size = 50 +text = "玩家小卖部" +horizontal_alignment = 1 + +[node name="QuitButton" type="Button" parent="UI/BigPanel/PlayerStorePanel"] +custom_minimum_size = Vector2(60, 60) +layout_mode = 2 +offset_left = 1478.75 +offset_top = 20.0 +offset_right = 1538.75 +offset_bottom = 83.0 +theme_override_font_sizes/font_size = 40 +text = "X" + +[node name="RefreshButton" type="Button" parent="UI/BigPanel/PlayerStorePanel"] +custom_minimum_size = Vector2(60, 60) +layout_mode = 2 +offset_left = 27.5 +offset_top = 16.25 +offset_right = 115.5 +offset_bottom = 79.25 +theme_override_font_sizes/font_size = 40 +text = "刷新" + +[node name="BuyProductBoothButton" type="Button" parent="UI/BigPanel/PlayerStorePanel"] +custom_minimum_size = Vector2(60, 60) +layout_mode = 2 +offset_left = 207.5 +offset_top = 17.5 +offset_right = 535.5 +offset_bottom = 80.5 +theme_override_font_sizes/font_size = 40 +text = "购买商品摊位" + [node name="PetStorePanel" parent="UI/BigPanel" instance=ExtResource("24_uc6q1")] visible = false @@ -718,7 +838,7 @@ offset_bottom = 836.0 scale = Vector2(0.8, 0.8) size_flags_horizontal = 3 size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxFlat_n03md") +theme_override_styles/panel = SubResource("StyleBoxFlat_8d602") script = ExtResource("23_uc6q1") [node name="TMBackGround" type="ColorRect" parent="UI/BigPanel/PetBagPanel"] @@ -784,6 +904,14 @@ text = "刷新" [node name="PetFightPanel" parent="UI/BigPanel" instance=ExtResource("23_n03md")] visible = false +[node name="DailyCheckInPanel" parent="UI/BigPanel" instance=ExtResource("18_m6fch")] +visible = false + +[node name="LuckyDrawPanel" parent="UI/BigPanel" instance=ExtResource("17_f21le")] +visible = false + +[node name="LoginPanel" parent="UI/BigPanel" instance=ExtResource("11_6jgly")] + [node name="SmallPanel" type="CanvasLayer" parent="UI"] [node name="LoadProgressPanel" parent="UI/SmallPanel" instance=ExtResource("27_vygm6")] @@ -1450,6 +1578,101 @@ offset_top = 166.0 offset_right = 979.0 offset_bottom = 482.0 +[node name="CropInformPanel" type="Panel" parent="UI/SmallPanel"] +visible = false +offset_left = 330.0 +offset_right = 958.0 +offset_bottom = 723.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_xyeuq") +script = ExtResource("41_iluto") + +[node name="Title" type="Label" parent="UI/SmallPanel/CropInformPanel"] +layout_mode = 0 +offset_top = 17.0 +offset_right = 628.0 +offset_bottom = 74.0 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 4 +theme_override_constants/shadow_offset_y = 4 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 35 +text = "作物信息" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="QuitButton" type="Button" parent="UI/SmallPanel/CropInformPanel"] +custom_minimum_size = Vector2(50, 50) +layout_mode = 0 +offset_left = 561.0 +offset_top = 17.0 +offset_right = 611.0 +offset_bottom = 67.0 +theme_override_font_sizes/font_size = 30 +text = "X" + +[node name="VBox" type="VBoxContainer" parent="UI/SmallPanel/CropInformPanel"] +layout_mode = 0 +offset_left = 17.0 +offset_top = 74.0 +offset_right = 615.0 +offset_bottom = 708.0 + +[node name="CropImage" type="TextureRect" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +texture = ExtResource("31_uc6q1") +stretch_mode = 3 + +[node name="CropName" type="Label" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "名称:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CropDescription" type="Label" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 25 +text = "描述:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CropPrice" type="Label" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 25 +text = "收购价:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="CropQuality" type="Label" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 25 +text = "品质:" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="HBox" type="HBoxContainer" parent="UI/SmallPanel/CropInformPanel/VBox"] +layout_mode = 2 +size_flags_vertical = 10 +alignment = 1 + +[node name="SaleProduct" type="Button" parent="UI/SmallPanel/CropInformPanel/VBox/HBox"] +custom_minimum_size = Vector2(120, 70) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 10 +theme_override_font_sizes/font_size = 30 +text = "直接出售" + +[node name="AddToStore" type="Button" parent="UI/SmallPanel/CropInformPanel/VBox/HBox"] +custom_minimum_size = Vector2(120, 70) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 10 +theme_override_font_sizes/font_size = 30 +text = "放入小卖部" + [node name="DiaLog" type="CanvasLayer" parent="UI"] [node name="AcceptDialog" parent="UI/DiaLog" instance=ExtResource("16_0igvr")] @@ -1461,6 +1684,7 @@ offset_left = 426.0 offset_top = 90.0 offset_right = 928.0 offset_bottom = 556.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_t4s8j") script = ExtResource("29_5b81d") [node name="VBox" type="VBoxContainer" parent="UI/DiaLog/BatchBuyPopup"] @@ -1499,6 +1723,145 @@ size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 text = "取消" +[node name="BatchSellPopup" type="PanelContainer" parent="UI/DiaLog"] +visible = false +offset_left = 391.0 +offset_top = 95.0 +offset_right = 893.0 +offset_bottom = 561.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_t4s8j") +script = ExtResource("44_av1bx") + +[node name="VBox" type="VBoxContainer" parent="UI/DiaLog/BatchSellPopup"] +layout_mode = 2 + +[node name="Title" type="Label" parent="UI/DiaLog/BatchSellPopup/VBox"] +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 40 +text = "请选择出售数量" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Contents" type="Label" parent="UI/DiaLog/BatchSellPopup/VBox"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_font_sizes/font_size = 20 +text = "这是说明内容" +horizontal_alignment = 1 + +[node name="SellNumEdit" type="LineEdit" parent="UI/DiaLog/BatchSellPopup/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 + +[node name="HBox" type="HBoxContainer" parent="UI/DiaLog/BatchSellPopup/VBox"] +layout_mode = 2 + +[node name="SureButton" type="Button" parent="UI/DiaLog/BatchSellPopup/VBox/HBox"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +text = "确定" + +[node name="CancelButton" type="Button" parent="UI/DiaLog/BatchSellPopup/VBox/HBox"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +text = "取消" + +[node name="AddProductToStorePopup" type="PanelContainer" parent="UI/DiaLog"] +visible = false +offset_left = 426.0 +offset_top = 59.0 +offset_right = 1026.0 +offset_bottom = 559.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_t4s8j") +script = ExtResource("46_8d602") + +[node name="VBox" type="VBoxContainer" parent="UI/DiaLog/AddProductToStorePopup"] +layout_mode = 2 + +[node name="Title" type="Label" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 40 +text = "弹窗标题" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Contents" type="Label" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_colors/font_color = Color(0.762404, 0.762404, 0.762404, 1) +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 24 +text = "弹窗内容" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SellNum" type="Label" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 24 +text = "请选择售卖的数量" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SellNumInput" type="LineEdit" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 + +[node name="SellPrice" type="Label" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 3 +theme_override_constants/shadow_offset_y = 3 +theme_override_constants/outline_size = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 24 +text = "请选择售卖的价格" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="SellPriceInput" type="LineEdit" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 + +[node name="HBox" type="HBoxContainer" parent="UI/DiaLog/AddProductToStorePopup/VBox"] +layout_mode = 2 + +[node name="SureButton" type="Button" parent="UI/DiaLog/AddProductToStorePopup/VBox/HBox"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +text = "确定" + +[node name="CancelButton" type="Button" parent="UI/DiaLog/AddProductToStorePopup/VBox/HBox"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +text = "取消" + [node name="BackgroundUI" type="CanvasLayer" parent="."] layer = -1 @@ -2991,7 +3354,7 @@ autowrap_mode = 2 horizontal_alignment = 1 vertical_alignment = 1 -[node name="Decoration1" type="Button" parent="Decoration"] +[node name="PlayerStore" type="Button" parent="Decoration"] self_modulate = Color(1, 1, 1, 0) custom_minimum_size = Vector2(100, 100) offset_left = 122.0 @@ -3000,18 +3363,17 @@ offset_right = 386.0 offset_bottom = 156.0 scale = Vector2(0.4, 0.4) -[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/Decoration1"] +[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/PlayerStore"] position = Vector2(132, 134) scale = Vector2(1.4, 1.4) texture = ExtResource("48_2i8fe") -[node name="Image" type="Sprite2D" parent="Decoration/Decoration1"] -position = Vector2(132, 48) -scale = Vector2(1.2, 1.2) -texture = ExtResource("49_xjiif") +[node name="Image" type="Sprite2D" parent="Decoration/PlayerStore"] +position = Vector2(140, 57.5) +scale = Vector2(1.5, 1.5) +texture = ExtResource("54_06tja") -[node name="Name" type="RichTextLabel" parent="Decoration/Decoration1"] -visible = false +[node name="Name" type="RichTextLabel" parent="Decoration/PlayerStore"] layout_mode = 0 offset_left = -65.0 offset_top = -145.0 @@ -3023,11 +3385,11 @@ theme_override_font_sizes/mono_font_size = 40 theme_override_font_sizes/normal_font_size = 40 theme_override_font_sizes/bold_font_size = 40 bbcode_enabled = true -text = "稻草人" +text = "小卖部" horizontal_alignment = 1 vertical_alignment = 1 -[node name="Decoration2" type="Button" parent="Decoration"] +[node name="SeedStore" type="Button" parent="Decoration"] self_modulate = Color(1, 1, 1, 0) custom_minimum_size = Vector2(100, 100) offset_left = 244.0 @@ -3036,18 +3398,17 @@ offset_right = 508.0 offset_bottom = 156.0 scale = Vector2(0.4, 0.4) -[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/Decoration2"] +[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/SeedStore"] position = Vector2(132, 134) scale = Vector2(1.4, 1.4) texture = ExtResource("48_2i8fe") -[node name="Image" type="Sprite2D" parent="Decoration/Decoration2"] +[node name="Image" type="Sprite2D" parent="Decoration/SeedStore"] position = Vector2(132, 48) -scale = Vector2(1.2, 1.2) -texture = ExtResource("50_sqnmr") +scale = Vector2(1.5, 1.5) +texture = ExtResource("55_g4i0f") -[node name="Name" type="RichTextLabel" parent="Decoration/Decoration2"] -visible = false +[node name="Name" type="RichTextLabel" parent="Decoration/SeedStore"] layout_mode = 0 offset_left = -65.0 offset_top = -145.0 @@ -3059,11 +3420,11 @@ theme_override_font_sizes/mono_font_size = 40 theme_override_font_sizes/normal_font_size = 40 theme_override_font_sizes/bold_font_size = 40 bbcode_enabled = true -text = "稻草人" +text = "种子商店" horizontal_alignment = 1 vertical_alignment = 1 -[node name="Decoration3" type="Button" parent="Decoration"] +[node name="ItemStore" type="Button" parent="Decoration"] self_modulate = Color(1, 1, 1, 0) custom_minimum_size = Vector2(100, 100) offset_left = 366.0 @@ -3072,18 +3433,17 @@ offset_right = 630.0 offset_bottom = 156.0 scale = Vector2(0.4, 0.4) -[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/Decoration3"] +[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/ItemStore"] position = Vector2(132, 134) scale = Vector2(1.4, 1.4) texture = ExtResource("48_2i8fe") -[node name="Image" type="Sprite2D" parent="Decoration/Decoration3"] +[node name="Image" type="Sprite2D" parent="Decoration/ItemStore"] position = Vector2(132, 48) -scale = Vector2(1.2, 1.2) -texture = ExtResource("51_2i8fe") +scale = Vector2(1.5, 1.5) +texture = ExtResource("56_rlmnt") -[node name="Name" type="RichTextLabel" parent="Decoration/Decoration3"] -visible = false +[node name="Name" type="RichTextLabel" parent="Decoration/ItemStore"] layout_mode = 0 offset_left = -65.0 offset_top = -145.0 @@ -3095,11 +3455,11 @@ theme_override_font_sizes/mono_font_size = 40 theme_override_font_sizes/normal_font_size = 40 theme_override_font_sizes/bold_font_size = 40 bbcode_enabled = true -text = "稻草人" +text = "道具商店" horizontal_alignment = 1 vertical_alignment = 1 -[node name="Decoration4" type="Button" parent="Decoration"] +[node name="PetStore" type="Button" parent="Decoration"] self_modulate = Color(1, 1, 1, 0) custom_minimum_size = Vector2(100, 100) offset_left = 488.0 @@ -3108,18 +3468,17 @@ offset_right = 752.0 offset_bottom = 156.0 scale = Vector2(0.4, 0.4) -[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/Decoration4"] +[node name="GrassGroundImage" type="Sprite2D" parent="Decoration/PetStore"] position = Vector2(132, 134) scale = Vector2(1.4, 1.4) texture = ExtResource("48_2i8fe") -[node name="Image" type="Sprite2D" parent="Decoration/Decoration4"] +[node name="Image" type="Sprite2D" parent="Decoration/PetStore"] position = Vector2(132, 48) -scale = Vector2(1.2, 1.2) -texture = ExtResource("50_sqnmr") +scale = Vector2(1.5, 1.5) +texture = ExtResource("57_rlmnt") -[node name="Name" type="RichTextLabel" parent="Decoration/Decoration4"] -visible = false +[node name="Name" type="RichTextLabel" parent="Decoration/PetStore"] layout_mode = 0 offset_left = -65.0 offset_top = -145.0 @@ -3131,7 +3490,7 @@ theme_override_font_sizes/mono_font_size = 40 theme_override_font_sizes/normal_font_size = 40 theme_override_font_sizes/bold_font_size = 40 bbcode_enabled = true -text = "稻草人" +text = "宠物商店" horizontal_alignment = 1 vertical_alignment = 1 @@ -4344,9 +4703,11 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="WeatherSystem" type="Node2D" parent="."] +script = ExtResource("62_uyv6e") [node name="CherryBlossomRain" type="Node2D" parent="WeatherSystem"] visible = false +z_index = 10 position = Vector2(934, -469) [node name="CherryBlossomRain1" type="GPUParticles2D" parent="WeatherSystem/CherryBlossomRain"] @@ -4383,6 +4744,8 @@ visibility_rect = Rect2(-900, 0, 2300, 2000) process_material = SubResource("ParticleProcessMaterial_tdq2s") [node name="GardeniaRain" type="Node2D" parent="WeatherSystem"] +visible = false +z_index = 10 position = Vector2(759, -370) [node name="WillowLeafRain1" type="GPUParticles2D" parent="WeatherSystem/GardeniaRain"] @@ -4417,13 +4780,20 @@ process_material = SubResource("ParticleProcessMaterial_dygjy") [node name="WillowLeafRain" type="Node2D" parent="WeatherSystem"] visible = false +z_index = 10 position = Vector2(882, -469) -[node name="WillowLeafRain1" parent="WeatherSystem/WillowLeafRain" instance=ExtResource("53_nf3jg")] -visible = false +[node name="WillowLeafRain1" type="GPUParticles2D" parent="WeatherSystem/WillowLeafRain"] +self_modulate = Color(0.7, 0.7, 0.7, 1) +z_index = 10 +amount = 50 +texture = ExtResource("69_uyv6e") +lifetime = 20.0 +preprocess = 10.0 +visibility_rect = Rect2(-900, 0, 2300, 2000) +process_material = SubResource("ParticleProcessMaterial_6fhdl") [node name="WillowLeafRain2" type="GPUParticles2D" parent="WeatherSystem/WillowLeafRain"] -visible = false self_modulate = Color(0.7, 0.7, 0.7, 1) z_index = 10 amount = 50 @@ -4457,6 +4827,7 @@ process_material = SubResource("ParticleProcessMaterial_jiccn") [node name="Snow" type="GPUParticles2D" parent="WeatherSystem"] visible = false +z_index = 10 position = Vector2(16, -520) amount = 300 texture = ExtResource("53_4ka7t") @@ -4478,6 +4849,7 @@ process_material = SubResource("ParticleProcessMaterial_nf3jg") [connection signal="pressed" from="UI/GUI/FarmVBox/AddNewGroundButton" to="." method="_on_add_new_ground_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/MyStoreButton" to="." method="_on_my_store_button_pressed"] [connection signal="pressed" from="UI/GUI/OtherVBox/AccountSettingButton" to="." method="_on_account_setting_button_pressed"] [connection signal="pressed" from="UI/GUI/OtherVBox/OnlineGiftButton" to="." method="_on_online_gift_button_pressed"] [connection signal="pressed" from="UI/GUI/OtherVBox/NewPlayerGiftButton" to="." method="_on_new_player_gift_button_pressed"] @@ -4494,6 +4866,10 @@ process_material = SubResource("ParticleProcessMaterial_nf3jg") [connection signal="pressed" from="UI/GUI/OtherVBox/ScareCrowButton" to="." method="_on_my_pet_button_pressed"] [connection signal="pressed" from="UI/SmallPanel/DebugPanel/QuitButton" to="UI/SmallPanel/DebugPanel" method="_on_quit_button_pressed"] [connection signal="pressed" from="Decoration/ScareCrow" to="." method="_on_scare_crow_pressed"] +[connection signal="pressed" from="Decoration/PlayerStore" to="." method="_on_player_store_pressed"] +[connection signal="pressed" from="Decoration/SeedStore" to="." method="_on_seed_store_pressed"] +[connection signal="pressed" from="Decoration/ItemStore" to="." method="_on_item_store_pressed"] +[connection signal="pressed" from="Decoration/PetStore" to="." method="_on_pet_store_pressed"] [connection signal="pressed" from="Decoration/WisdomTree" to="." method="_on_wisdom_tree_pressed"] [connection signal="pressed" from="Decoration4/ScareCrow" to="." method="_on_scare_crow_pressed"] [connection signal="pressed" from="Decoration4/WisdomTree" to="." method="_on_wisdom_tree_pressed"] diff --git a/Network/TCPNetworkManager.gd b/Network/TCPNetworkManager.gd index 6112569..9a997a1 100644 --- a/Network/TCPNetworkManager.gd +++ b/Network/TCPNetworkManager.gd @@ -239,6 +239,18 @@ func _on_data_received(data): login_panel._on_verification_code_response(success, message) return + if message_type == "forget_password_verification_code_response": + var success = data.get("success", false) + var message = data.get("message", "") + login_panel._on_verification_code_response(success, message) + return + + if message_type == "reset_password_response": + var success = data.get("success", false) + var message = data.get("message", "") + login_panel._on_forget_password_response_received(success, message) + return + if message_type == "verify_code_response": var success = data.get("success", false) var message = data.get("message", "") @@ -428,6 +440,88 @@ func _on_data_received(data): else: Toast.show(message, Color.RED) + # 出售作物响应 + elif action_type == "sell_crop": + if success: + main_game.money = updated_data["money"] + main_game.crop_warehouse = updated_data["作物仓库"] + main_game.experience = updated_data.get("experience", main_game.experience) + main_game.level = updated_data.get("level", main_game.level) + main_game._update_ui() + main_game.crop_warehouse_panel.update_crop_warehouse_ui() + Toast.show(message, Color.GREEN) + else: + Toast.show(message, Color.RED) + + # 添加商品到小卖部响应 + elif action_type == "add_product_to_store": + if success: + main_game.login_data["玩家小卖部"] = updated_data["玩家小卖部"] + main_game.crop_warehouse = updated_data["作物仓库"] + + # 更新UI + main_game.crop_warehouse_panel.update_crop_warehouse_ui() + var player_store_panel = get_node_or_null("/root/main/UI/BigPanel/PlayerStorePanel") + if player_store_panel and player_store_panel.has_method("update_player_store_ui"): + player_store_panel.update_player_store_ui() + + Toast.show(message, Color.GREEN) + else: + Toast.show(message, Color.RED) + + # 下架小卖部商品响应 + elif action_type == "remove_store_product": + if success: + main_game.login_data["玩家小卖部"] = updated_data["玩家小卖部"] + main_game.crop_warehouse = updated_data["作物仓库"] + + # 更新UI + main_game.crop_warehouse_panel.update_crop_warehouse_ui() + var player_store_panel = get_node_or_null("/root/main/UI/BigPanel/PlayerStorePanel") + if player_store_panel and player_store_panel.has_method("update_player_store_ui"): + player_store_panel.update_player_store_ui() + + Toast.show(message, Color.GREEN) + else: + Toast.show(message, Color.RED) + + # 购买小卖部商品响应 + elif action_type == "buy_store_product": + if success: + main_game.money = updated_data["money"] + main_game.crop_warehouse = updated_data["作物仓库"] + + # 更新UI + main_game._update_ui() + main_game.crop_warehouse_panel.update_crop_warehouse_ui() + + # 如果在访问模式下,刷新被访问玩家的小卖部(通过重新请求访问) + if main_game.is_visiting_mode: + var visited_username = main_game.visited_player_data.get("username", "") + if visited_username != "": + # 重新访问玩家以刷新数据 + sendVisitPlayer(visited_username) + + Toast.show(message, Color.GREEN) + else: + Toast.show(message, Color.RED) + + # 购买小卖部格子响应 + elif action_type == "buy_store_booth": + if success: + main_game.money = updated_data["money"] + main_game.login_data["小卖部格子数"] = updated_data["小卖部格子数"] + + # 更新UI + main_game._update_ui() + var player_store_panel = get_node_or_null("/root/main/UI/BigPanel/PlayerStorePanel") + if player_store_panel and player_store_panel.has_method("update_player_store_ui"): + player_store_panel.update_player_store_ui() + + Toast.show(message, Color.GREEN) + else: + Toast.show(message, Color.RED) + return # 游戏功能响应消息 @@ -502,6 +596,12 @@ func _on_data_received(data): elif message_type == "wisdom_tree_config_response": main_game._handle_wisdom_tree_config_response(data) + + # 天气变更消息 + elif message_type == "weather_change": + var weather_type = data.get("weather_type", "clear") + var weather_name = data.get("weather_name", "晴天") + main_game._handle_weather_change(weather_type, weather_name) # ============================= 客户端与服务端通信核心 ===================================== @@ -771,6 +871,32 @@ func sendVerificationCodeRequest(qq_number): }) return true +#发送忘记密码验证码请求 +func sendForgetPasswordVerificationCode(qq_number): + if not client.is_client_connected(): + return false + + client.send_data({ + "type": "request_forget_password_verification_code", + "qq_number": qq_number, + "timestamp": Time.get_unix_time_from_system() + }) + return true + +#发送忘记密码请求 +func sendForgetPasswordRequest(username, new_password, verification_code): + if not client.is_client_connected(): + return false + + client.send_data({ + "type": "reset_password", + "username": username, + "new_password": new_password, + "verification_code": verification_code, + "timestamp": Time.get_unix_time_from_system() + }) + return true + #发送验证码验证 func sendVerifyCode(qq_number, code): if not client.is_client_connected(): diff --git a/Scene/BigPanel/DailyCheckInPanel.tscn b/Scene/BigPanel/DailyCheckInPanel.tscn index 9695be2..47ef872 100644 --- a/Scene/BigPanel/DailyCheckInPanel.tscn +++ b/Scene/BigPanel/DailyCheckInPanel.tscn @@ -1,17 +1,26 @@ -[gd_scene load_steps=2 format=3 uid="uid://smypui0vyso5"] +[gd_scene load_steps=3 format=3 uid="uid://smypui0vyso5"] [ext_resource type="Script" uid="uid://c0jfbtkh0mj5b" path="res://Script/BigPanel/DailyCheckInPanel.gd" id="1_fj7a7"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_217t6"] +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 +corner_detail = 20 + [node name="DailyCheckInPanel" type="Panel"] -offset_right = 600.0 +offset_left = 441.0 +offset_right = 1041.0 offset_bottom = 720.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_217t6") script = ExtResource("1_fj7a7") [node name="Title" type="Label" parent="."] layout_mode = 0 -offset_top = -1.0 +offset_top = 20.0 offset_right = 600.0 -offset_bottom = 41.0 +offset_bottom = 69.0 theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1) theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) theme_override_colors/font_outline_color = Color(0, 0, 0, 1) @@ -37,10 +46,10 @@ 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 +offset_left = 520.0 +offset_top = 22.0 +offset_right = 577.0 +offset_bottom = 79.0 theme_override_font_sizes/font_size = 35 text = "X" @@ -48,16 +57,16 @@ text = "X" 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 +offset_left = 239.0 +offset_top = 630.0 +offset_right = 389.0 +offset_bottom = 700.0 theme_override_font_sizes/font_size = 35 text = "签到" [node name="Scroll" type="ScrollContainer" parent="."] layout_mode = 0 -offset_top = 58.0 +offset_top = 77.0 offset_right = 600.0 offset_bottom = 419.0 diff --git a/Scene/BigPanel/LoginPanel.tscn b/Scene/BigPanel/LoginPanel.tscn index ebbc030..086f2ab 100644 --- a/Scene/BigPanel/LoginPanel.tscn +++ b/Scene/BigPanel/LoginPanel.tscn @@ -1,18 +1,26 @@ -[gd_scene load_steps=2 format=3 uid="uid://cbhitturvihqj"] +[gd_scene load_steps=3 format=3 uid="uid://cbhitturvihqj"] [ext_resource type="Script" uid="uid://cka0r4g8tbf0" path="res://Script/BigPanel/LoginPanel.gd" id="1_xnwaq"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n8m38"] +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 + [node name="LoginPanel" type="PanelContainer"] offset_left = 343.0 -offset_top = 36.0 -offset_right = 1071.0 -offset_bottom = 667.0 +offset_top = 5.0 +offset_right = 1093.0 +offset_bottom = 795.0 +scale = Vector2(0.9, 0.9) +theme_override_styles/panel = SubResource("StyleBoxFlat_n8m38") script = ExtResource("1_xnwaq") -[node name="VBox" type="VBoxContainer" parent="."] +[node name="LoginVBox" type="VBoxContainer" parent="."] layout_mode = 2 -[node name="Title" type="Label" parent="VBox"] +[node name="Title" type="Label" parent="LoginVBox"] modulate = Color(1, 1, 0.537255, 1) layout_mode = 2 theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) @@ -22,153 +30,59 @@ theme_override_constants/shadow_offset_y = 5 theme_override_constants/outline_size = 15 theme_override_constants/shadow_outline_size = 15 theme_override_font_sizes/font_size = 40 -text = "登录/注册面板" +text = "登录面板" horizontal_alignment = 1 vertical_alignment = 1 -[node name="UserName" type="HBoxContainer" parent="VBox"] +[node name="UserName" type="HBoxContainer" parent="LoginVBox"] layout_mode = 2 -[node name="Label" type="Label" parent="VBox/UserName"] +[node name="Label" type="Label" parent="LoginVBox/UserName"] layout_mode = 2 theme_override_font_sizes/font_size = 30 text = "账号" horizontal_alignment = 1 vertical_alignment = 1 -[node name="username_input" type="LineEdit" parent="VBox/UserName"] +[node name="username_input" type="LineEdit" parent="LoginVBox/UserName"] layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 placeholder_text = "请输入QQ号" metadata/_edit_use_anchors_ = true -[node name="Password1" type="HBoxContainer" parent="VBox"] +[node name="Password" type="HBoxContainer" parent="LoginVBox"] layout_mode = 2 -[node name="Label2" type="Label" parent="VBox/Password1"] +[node name="Label2" type="Label" parent="LoginVBox/Password"] layout_mode = 2 theme_override_font_sizes/font_size = 30 text = "密码" horizontal_alignment = 1 vertical_alignment = 1 -[node name="password_input" type="LineEdit" parent="VBox/Password1"] +[node name="password_input" type="LineEdit" parent="LoginVBox/Password"] layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 placeholder_text = "请输入密码" -[node name="Password2" type="HBoxContainer" parent="VBox"] +[node name="LoginButton" type="Button" parent="LoginVBox"] layout_mode = 2 - -[node name="Label2" type="Label" parent="VBox/Password2"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = "确认密码" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="password_input2" type="LineEdit" parent="VBox/Password2"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "请再次输入密码" - -[node name="VerificationCode" type="HBoxContainer" parent="VBox"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBox/VerificationCode"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = "验证码" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="verificationcode_input" type="LineEdit" parent="VBox/VerificationCode"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入您的QQ邮箱收到的验证码" -metadata/_edit_use_anchors_ = true - -[node name="SendButton" type="Button" parent="VBox/VerificationCode"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = "发送验证码" - -[node name="PlayerName" type="HBoxContainer" parent="VBox"] -layout_mode = 2 - -[node name="Label2" type="Label" parent="VBox/PlayerName"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = "玩家昵称" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="playername_input" type="LineEdit" parent="VBox/PlayerName"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入您的玩家昵称" - -[node name="FarmName" type="HBoxContainer" parent="VBox"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBox/FarmName"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = "农场名称" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="farmname_input" type="LineEdit" parent="VBox/FarmName"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入您的农场名称" -metadata/_edit_use_anchors_ = true - -[node name="LoginRegister" type="HBoxContainer" parent="VBox"] -layout_mode = 2 - -[node name="login_button" type="Button" parent="VBox/LoginRegister"] -layout_mode = 2 -size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 text = "登录" -[node name="register_button" type="Button" parent="VBox/LoginRegister"] +[node name="RegisterButton" type="Button" parent="LoginVBox"] layout_mode = 2 -size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 text = "注册" -[node name="Password3" type="HBoxContainer" parent="VBox"] -visible = false +[node name="ForgetPasswdButton" type="Button" parent="LoginVBox"] layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "忘记密码" -[node name="login_button" type="Button" parent="VBox/Password3"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 20 -text = "发送验证码" - -[node name="Label2" type="Label" parent="VBox/Password3"] -layout_mode = 2 -theme_override_font_sizes/font_size = 20 -text = "找回密码" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="password_input2" type="LineEdit" parent="VBox/Password3"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 20 -placeholder_text = "请输入QQ邮箱验证码" - -[node name="Note" type="Label" parent="VBox"] +[node name="Note" type="Label" parent="LoginVBox"] modulate = Color(1, 0.552941, 1, 1) layout_mode = 2 theme_override_font_sizes/font_size = 30 @@ -179,7 +93,246 @@ text = "注意:首次游玩游戏需要注册账号, horizontal_alignment = 1 vertical_alignment = 1 -[node name="status_label" type="Label" parent="VBox"] +[node name="status_label" type="Label" parent="LoginVBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "连接状态" +horizontal_alignment = 1 + +[node name="RegisterVbox" type="VBoxContainer" parent="."] +visible = false +layout_mode = 2 + +[node name="Title" type="Label" parent="RegisterVbox"] +modulate = Color(1, 1, 0.537255, 1) +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 5 +theme_override_constants/shadow_offset_y = 5 +theme_override_constants/outline_size = 15 +theme_override_constants/shadow_outline_size = 15 +theme_override_font_sizes/font_size = 40 +text = "注册面板" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="RegisterUserName" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label" type="Label" parent="RegisterVbox/RegisterUserName"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "账号" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="username_input" type="LineEdit" parent="RegisterVbox/RegisterUserName"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入QQ号" +metadata/_edit_use_anchors_ = true + +[node name="Password1" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="RegisterVbox/Password1"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "密码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="password_input" type="LineEdit" parent="RegisterVbox/Password1"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入密码" + +[node name="Password2" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="RegisterVbox/Password2"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "确认密码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="password_input2" type="LineEdit" parent="RegisterVbox/Password2"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请再次输入密码" + +[node name="PlayerName" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="RegisterVbox/PlayerName"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "玩家昵称" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="playername_input" type="LineEdit" parent="RegisterVbox/PlayerName"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入您的玩家昵称" + +[node name="FarmName" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label" type="Label" parent="RegisterVbox/FarmName"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "农场名称" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="farmname_input" type="LineEdit" parent="RegisterVbox/FarmName"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入您的农场名称" +metadata/_edit_use_anchors_ = true + +[node name="VerificationCode" type="HBoxContainer" parent="RegisterVbox"] +layout_mode = 2 + +[node name="Label" type="Label" parent="RegisterVbox/VerificationCode"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "验证码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="verificationcode_input" type="LineEdit" parent="RegisterVbox/VerificationCode"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入您的QQ邮箱收到的验证码" +metadata/_edit_use_anchors_ = true + +[node name="SendButton" type="Button" parent="RegisterVbox/VerificationCode"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "发送验证码" + +[node name="RegisterButton2" type="Button" parent="RegisterVbox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "注册" + +[node name="Note" type="Label" parent="RegisterVbox"] +modulate = Color(1, 0.552941, 1, 1) +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "注意:首次游玩游戏需要注册账号, +账号请直接输入您的QQ号,系统会直接向您的QQ +邮箱发送一串验证码进行注册验证,密码请设置的复杂一 +点,以免被暴力破解(" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="status_label2" type="Label" parent="RegisterVbox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "连接状态" +horizontal_alignment = 1 + +[node name="ForgetPasswordVbox" type="VBoxContainer" parent="."] +visible = false +layout_mode = 2 + +[node name="Title" type="Label" parent="ForgetPasswordVbox"] +modulate = Color(1, 1, 0.537255, 1) +layout_mode = 2 +theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/shadow_offset_x = 5 +theme_override_constants/shadow_offset_y = 5 +theme_override_constants/outline_size = 15 +theme_override_constants/shadow_outline_size = 15 +theme_override_font_sizes/font_size = 40 +text = "忘记密码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ForgetPasswordUserName" type="HBoxContainer" parent="ForgetPasswordVbox"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ForgetPasswordVbox/ForgetPasswordUserName"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "账号" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="username_input" type="LineEdit" parent="ForgetPasswordVbox/ForgetPasswordUserName"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入QQ号" +metadata/_edit_use_anchors_ = true + +[node name="NewPassword" type="HBoxContainer" parent="ForgetPasswordVbox"] +layout_mode = 2 + +[node name="Label2" type="Label" parent="ForgetPasswordVbox/NewPassword"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "新密码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="password_input" type="LineEdit" parent="ForgetPasswordVbox/NewPassword"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请设置新的密码" + +[node name="VerificationCode2" type="HBoxContainer" parent="ForgetPasswordVbox"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ForgetPasswordVbox/VerificationCode2"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "验证码" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="verificationcode_input" type="LineEdit" parent="ForgetPasswordVbox/VerificationCode2"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 30 +placeholder_text = "请输入您的QQ邮箱收到的验证码" +metadata/_edit_use_anchors_ = true + +[node name="SendButton" type="Button" parent="ForgetPasswordVbox/VerificationCode2"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "发送验证码" + +[node name="ForgetPasswordButton" type="Button" parent="ForgetPasswordVbox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "确认" + +[node name="Note" type="Label" parent="ForgetPasswordVbox"] +modulate = Color(1, 0.552941, 1, 1) +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "注意:首次游玩游戏需要注册账号, +账号请直接输入您的QQ号,系统会直接向您的QQ +邮箱发送一串验证码进行注册验证,密码请设置的复杂一 +点,以免被暴力破解(" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="status_label3" type="Label" parent="ForgetPasswordVbox"] layout_mode = 2 theme_override_font_sizes/font_size = 30 text = "连接状态" diff --git a/Scene/BigPanel/LuckyDrawPanel.tscn b/Scene/BigPanel/LuckyDrawPanel.tscn index 774c876..094d20a 100644 --- a/Scene/BigPanel/LuckyDrawPanel.tscn +++ b/Scene/BigPanel/LuckyDrawPanel.tscn @@ -1,17 +1,27 @@ -[gd_scene load_steps=2 format=3 uid="uid://bndf1e4sgdjr6"] +[gd_scene load_steps=3 format=3 uid="uid://bndf1e4sgdjr6"] [ext_resource type="Script" uid="uid://65e0rl31fx0i" path="res://Script/BigPanel/LuckyDrawPanel.gd" id="1_dcmen"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ynokl"] +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 +corner_detail = 20 + [node name="LuckyDrawPanel" type="Panel"] -offset_right = 600.0 -offset_bottom = 720.0 +offset_left = 373.0 +offset_top = 1.0 +offset_right = 1045.0 +offset_bottom = 721.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_ynokl") 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 +offset_top = 19.0 +offset_right = 669.0 +offset_bottom = 78.0 theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1) theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) theme_override_colors/font_outline_color = Color(0, 0, 0, 1) @@ -28,7 +38,7 @@ vertical_alignment = 1 modulate = Color(0.642982, 0.510828, 1, 1) layout_mode = 0 offset_top = 419.0 -offset_right = 600.0 +offset_right = 671.0 offset_bottom = 468.0 theme_override_font_sizes/font_size = 30 text = "🎉获得奖励🎉" @@ -38,18 +48,19 @@ 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 +offset_left = 595.0 +offset_top = 21.0 +offset_right = 652.0 +offset_bottom = 78.0 theme_override_font_sizes/font_size = 35 text = "X" [node name="LuckyDrawReward" type="RichTextLabel" parent="."] layout_mode = 0 +offset_left = 16.0 offset_top = 481.0 -offset_right = 600.0 -offset_bottom = 649.0 +offset_right = 671.0 +offset_bottom = 633.0 theme_override_font_sizes/normal_font_size = 20 bbcode_enabled = true text = "+500 经验,+400 钱币,+5 普通-番茄种子,+1 传奇-火龙果种子 " @@ -57,14 +68,18 @@ horizontal_alignment = 1 [node name="Grid" type="GridContainer" parent="."] layout_mode = 0 -offset_top = 58.0 -offset_right = 600.0 +offset_left = 16.0 +offset_top = 85.0 +offset_right = 657.0 offset_bottom = 419.0 columns = 5 [node name="RewardItem" type="RichTextLabel" parent="Grid"] custom_minimum_size = Vector2(120, 120) layout_mode = 2 +theme_override_constants/outline_size = 15 +theme_override_font_sizes/normal_font_size = 17 +bbcode_enabled = true text = "+50钱币 +100经验 +4番茄种子 @@ -75,9 +90,10 @@ threaded = true [node name="HBox" type="HBoxContainer" parent="."] layout_mode = 0 -offset_top = 649.0 -offset_right = 600.0 -offset_bottom = 719.0 +offset_left = -2.0 +offset_top = 633.0 +offset_right = 671.0 +offset_bottom = 703.0 alignment = 1 [node name="FiveLuckyDrawButton" type="Button" parent="HBox"] diff --git a/Script/BigPanel/CropWarehousePanel.gd b/Script/BigPanel/CropWarehousePanel.gd index 2088c4a..a054bda 100644 --- a/Script/BigPanel/CropWarehousePanel.gd +++ b/Script/BigPanel/CropWarehousePanel.gd @@ -320,45 +320,51 @@ func _create_crop_button(crop_name: String, crop_quality: String) -> Button: # 正常模式下的成熟物点击处理 func _on_crop_selected(crop_name, crop_count): - # 显示成熟物信息 - var info_text = "" - - if main_game.can_planted_crop.has(crop_name): - var crop = main_game.can_planted_crop[crop_name] - var display_name = crop_name - var mature_name = crop.get("成熟物名称") - if mature_name != null and mature_name != "": - display_name = mature_name - else: - display_name = crop.get("作物名称", crop_name) - var quality = crop.get("品质", "未知") - var price = crop.get("花费", 0) - var grow_time = crop.get("生长时间", 0) - var profit = crop.get("收益", 0) - var level_req = crop.get("等级", 1) - - # 将成熟时间转换为可读格式 - var time_str = "" - var total_seconds = int(grow_time) - var hours = total_seconds / 3600 - var minutes = (total_seconds % 3600) / 60 - var seconds = total_seconds % 60 - - if hours > 0: - time_str += str(hours) + "小时" - if minutes > 0: - time_str += str(minutes) + "分钟" - if seconds > 0: - time_str += str(seconds) + "秒" - - info_text = quality + "-" + display_name + " (数量: " + str(crop_count) + ")\n" - info_text += "原价格: " + str(price) + "元, 原收益: " + str(profit) + "元\n" - info_text += "成熟时间: " + time_str + ", 需求等级: " + str(level_req) + "\n" - info_text += "这是收获的成熟品,可以用于出售或其他用途" + # 获取作物信息面板的引用 + var crop_inform_panel = get_node("/root/main/UI/SmallPanel/CropInformPanel") + if crop_inform_panel and crop_inform_panel.has_method("show_crop_info"): + # 打开作物信息面板并传递作物数据 + crop_inform_panel.show_crop_info(crop_name, crop_count) else: - info_text = crop_name + " (数量: " + str(crop_count) + ")" - - Toast.show(info_text, Color.GOLD, 3.0, 1.0) + # 如果作物信息面板不可用,显示Toast作为后备方案 + var info_text = "" + + if main_game.can_planted_crop.has(crop_name): + var crop = main_game.can_planted_crop[crop_name] + var display_name = crop_name + var mature_name = crop.get("成熟物名称") + if mature_name != null and mature_name != "": + display_name = mature_name + else: + display_name = crop.get("作物名称", crop_name) + var quality = crop.get("品质", "未知") + var price = crop.get("花费", 0) + var grow_time = crop.get("生长时间", 0) + var profit = crop.get("收益", 0) + var level_req = crop.get("等级", 1) + + # 将成熟时间转换为可读格式 + var time_str = "" + var total_seconds = int(grow_time) + var hours = total_seconds / 3600 + var minutes = (total_seconds % 3600) / 60 + var seconds = total_seconds % 60 + + if hours > 0: + time_str += str(hours) + "小时" + if minutes > 0: + time_str += str(minutes) + "分钟" + if seconds > 0: + time_str += str(seconds) + "秒" + + info_text = quality + "-" + display_name + " (数量: " + str(crop_count) + ")\n" + info_text += "原价格: " + str(price) + "元, 原收益: " + str(profit) + "元\n" + info_text += "成熟时间: " + time_str + ", 需求等级: " + str(level_req) + "\n" + info_text += "这是收获的成熟品,可以用于出售或其他用途" + else: + info_text = crop_name + " (数量: " + str(crop_count) + ")" + + Toast.show(info_text, Color.GOLD, 3.0, 1.0) # 访问模式下的成熟物点击处理 func _on_visit_crop_selected(crop_name, crop_count): diff --git a/Script/BigPanel/LoginPanel.gd b/Script/BigPanel/LoginPanel.gd index fe83a7d..64f5672 100644 --- a/Script/BigPanel/LoginPanel.gd +++ b/Script/BigPanel/LoginPanel.gd @@ -1,35 +1,52 @@ #玩家登录注册面板 extends PanelContainer -#玩家登录账号,用QQ号代替 -@onready var username_input : LineEdit = $VBox/UserName/username_input -#用户登录密码 -@onready var password_input : LineEdit = $VBox/Password1/password_input -#登录按钮 -@onready var login_button : Button = $VBox/LoginRegister/login_button +#默认显示登录面板(登录面板可以进入注册面板和忘记密码面板) +@onready var login_v_box: VBoxContainer = $LoginVBox #显示或隐藏登录面板 +@onready var user_name: HBoxContainer = $LoginVBox/UserName #玩家账号 +@onready var password: HBoxContainer = $LoginVBox/Password #玩家密码 +@onready var login_button: Button = $LoginVBox/LoginButton #登录按钮 +@onready var register_button: Button = $LoginVBox/RegisterButton #注册按钮,点击后隐藏登录面板显示注册面板 +@onready var forget_passwd_button: Button = $LoginVBox/ForgetPasswdButton #忘记密码按钮,点击后隐藏登录面板显示忘记密码面板 +@onready var status_label: Label = $LoginVBox/status_label #登录状态 -#下面是注册相关的 -#注册按钮 -@onready var register_button : Button = $VBox/LoginRegister/register_button -#注册账号时二次确认密码 -@onready var password_input_2 : LineEdit = $VBox/Password2/password_input2 -#农场名称 -@onready var farmname_input : LineEdit = $VBox/FarmName/farmname_input -#玩家昵称 -@onready var playername_input :LineEdit = $VBox/PlayerName/playername_input -#邮箱验证码 -@onready var verificationcode_input :LineEdit = $VBox/VerificationCode/verificationcode_input -#发送验证码按钮 -@onready var send_button :Button = $VBox/VerificationCode/SendButton -#状态提示标签 -@onready var status_label : Label = $VBox/status_label +# 登录面板输入框 +@onready var username_input: LineEdit = $LoginVBox/UserName/username_input +@onready var password_input: LineEdit = $LoginVBox/Password/password_input +#注册面板,注册成功跳转回登录面板 +@onready var register_vbox: VBoxContainer = $RegisterVbox #显示或隐藏注册面板 +@onready var register_user_name: HBoxContainer = $RegisterVbox/RegisterUserName #注册玩家账号 +@onready var password_1: HBoxContainer = $RegisterVbox/Password1 #注册密码 +@onready var password_2: HBoxContainer = $RegisterVbox/Password2 #二次确认密码 +@onready var player_name: HBoxContainer = $RegisterVbox/PlayerName #注册玩家昵称 +@onready var farm_name: HBoxContainer = $RegisterVbox/FarmName #注册玩家农场名称 +@onready var verification_code: HBoxContainer = $RegisterVbox/VerificationCode #注册所需验证码 +@onready var register_button_2: Button = $RegisterVbox/RegisterButton2 #注册按钮 +@onready var status_label_2: Label = $RegisterVbox/status_label2 #注册状态 -@onready var password_2: HBoxContainer = $VBox/Password2 -@onready var verification_code: HBoxContainer = $VBox/VerificationCode -@onready var player_name: HBoxContainer = $VBox/PlayerName -@onready var farm_name: HBoxContainer = $VBox/FarmName +# 注册面板输入框 +@onready var register_username_input: LineEdit = $RegisterVbox/RegisterUserName/username_input +@onready var password_input_1: LineEdit = $RegisterVbox/Password1/password_input +@onready var password_input_2: LineEdit = $RegisterVbox/Password2/password_input2 +@onready var playername_input: LineEdit = $RegisterVbox/PlayerName/playername_input +@onready var farmname_input: LineEdit = $RegisterVbox/FarmName/farmname_input +@onready var verificationcode_input: LineEdit = $RegisterVbox/VerificationCode/verificationcode_input +@onready var send_button: Button = $RegisterVbox/VerificationCode/SendButton +#忘记密码面板,设置新密码成功后同样跳转到登录面板 +@onready var forget_password_vbox: VBoxContainer = $ForgetPasswordVbox #显示或隐藏忘记密码面板 +@onready var forget_password_user_name: HBoxContainer = $ForgetPasswordVbox/ForgetPasswordUserName #忘记密码的玩家账号 +@onready var new_password: HBoxContainer = $ForgetPasswordVbox/NewPassword #设置该账号新的密码 +@onready var verification_code_2: HBoxContainer = $ForgetPasswordVbox/VerificationCode2 #忘记密码所需验证码 +@onready var forget_password_button: Button = $ForgetPasswordVbox/ForgetPasswordButton #设置新密码确认按钮 +@onready var status_label_3: Label = $ForgetPasswordVbox/status_label3 #设置新密码状态 + +# 忘记密码面板输入框 +@onready var forget_username_input: LineEdit = $ForgetPasswordVbox/ForgetPasswordUserName/username_input +@onready var new_password_input: LineEdit = $ForgetPasswordVbox/NewPassword/password_input +@onready var forget_verificationcode_input: LineEdit = $ForgetPasswordVbox/VerificationCode2/verificationcode_input +@onready var forget_send_button: Button = $ForgetPasswordVbox/VerificationCode2/SendButton # 记住密码选项 @@ -53,16 +70,20 @@ var remember_password : bool = true # 默认记住密码 # 准备函数 func _ready(): self.show() - #隐藏注册相关UI - password_2.hide() - verification_code.hide() - player_name.hide() - farm_name.hide() + + # 初始状态:只显示登录面板,隐藏注册和忘记密码面板 + login_v_box.show() + register_vbox.hide() + forget_password_vbox.hide() # 连接按钮信号 login_button.pressed.connect(self._on_login_button_pressed) - register_button.pressed.connect(self._on_register_button_pressed) + register_button.pressed.connect(self._on_show_register_panel) + forget_passwd_button.pressed.connect(self._on_forget_password_button_pressed) + register_button_2.pressed.connect(self._on_register_button_2_pressed) + forget_password_button.pressed.connect(self._on_forget_password_confirm_pressed) send_button.pressed.connect(self._on_send_button_pressed) + forget_send_button.pressed.connect(self._on_forget_send_button_pressed) # 加载保存的登录信息 _load_login_info() @@ -70,6 +91,23 @@ func _ready(): # 显示客户端版本号 _display_version_info() +# 面板切换函数 +func _on_show_register_panel(): + """切换到注册面板""" + login_v_box.hide() + register_vbox.show() + forget_password_vbox.hide() + status_label_2.text = "请填写注册信息" + status_label_2.modulate = Color.WHITE + +func _on_forget_password_button_pressed(): + """切换到忘记密码面板""" + login_v_box.hide() + register_vbox.hide() + forget_password_vbox.show() + status_label_3.text = "请输入账号和新密码" + status_label_3.modulate = Color.WHITE + # 处理登录按钮点击 func _on_login_button_pressed(): password_2.hide() @@ -129,32 +167,30 @@ func _on_login_button_pressed(): # 处理验证码发送按钮点击 func _on_send_button_pressed(): - - - var user_name = username_input.text.strip_edges() + var user_name = register_username_input.text.strip_edges() if user_name == "": - status_label.text = "请输入QQ号以接收验证码!" - status_label.modulate = Color.RED + status_label_2.text = "请输入QQ号以接收验证码!" + status_label_2.modulate = Color.RED return if !is_valid_qq_number(user_name): - status_label.text = "请输入正确的QQ号码(5-12位数字)!" - status_label.modulate = Color.RED + status_label_2.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_2.modulate = Color.RED return # 检查网络连接状态 if !tcp_network_manager_panel.client.is_client_connected(): - status_label.text = "未连接到服务器,正在尝试连接..." - status_label.modulate = Color.YELLOW + status_label_2.text = "未连接到服务器,正在尝试连接..." + status_label_2.modulate = Color.YELLOW # 尝试自动连接到服务器 tcp_network_manager_panel.connect_to_current_server() await get_tree().create_timer(2.0).timeout # 再次检查连接状态 if !tcp_network_manager_panel.client.is_client_connected(): - status_label.text = "连接服务器失败,正在尝试其他服务器..." - status_label.modulate = Color.YELLOW + status_label_2.text = "连接服务器失败,正在尝试其他服务器..." + status_label_2.modulate = Color.YELLOW # 等待自动服务器切换完成 await get_tree().create_timer(3.0).timeout @@ -162,8 +198,8 @@ func _on_send_button_pressed(): # 禁用按钮,防止重复点击 send_button.disabled = true - status_label.text = "正在发送验证码,请稍候..." - status_label.modulate = Color.YELLOW + status_label_2.text = "正在发送验证码,请稍候..." + status_label_2.modulate = Color.YELLOW # 发送验证码请求 tcp_network_manager_panel.sendVerificationCodeRequest(user_name) @@ -179,19 +215,14 @@ func _on_send_button_pressed(): send_button.disabled = false send_button.text = "发送验证码" - if status_label.text == "正在发送验证码,请稍候...": - status_label.text = "验证码发送超时,请重试!" - status_label.modulate = Color.RED + if status_label_2.text == "正在发送验证码,请稍候...": + status_label_2.text = "验证码发送超时,请重试!" + status_label_2.modulate = Color.RED # 处理注册按钮点击 -func _on_register_button_pressed(): - password_2.show() - verification_code.show() - player_name.show() - farm_name.show() - - var user_name = username_input.text.strip_edges() - var user_password = password_input.text.strip_edges() +func _on_register_button_2_pressed(): + var user_name = register_username_input.text.strip_edges() + var user_password = password_input_1.text.strip_edges() var user_password_2 = password_input_2.text.strip_edges() var farmname = farmname_input.text.strip_edges() var player_name = playername_input.text.strip_edges() @@ -199,69 +230,180 @@ func _on_register_button_pressed(): # 检查密码格式(只允许数字和字母) if not is_valid_password(user_password): - status_label.text = "密码只能包含数字和字母!" - status_label.modulate = Color.RED + status_label_2.text = "密码只能包含数字和字母!" + status_label_2.modulate = Color.RED return if user_name == "" or user_password == "": - status_label.text = "用户名或密码不能为空!" - status_label.modulate = Color.RED + status_label_2.text = "用户名或密码不能为空!" + status_label_2.modulate = Color.RED return if farmname == "": - status_label.text = "农场名称不能为空!" - status_label.modulate = Color.RED + status_label_2.text = "农场名称不能为空!" + status_label_2.modulate = Color.RED return if user_password != user_password_2: - status_label.text = "两次输入的密码不一致!" - status_label.modulate = Color.RED + status_label_2.text = "两次输入的密码不一致!" + status_label_2.modulate = Color.RED return if !is_valid_qq_number(user_name): - status_label.text = "请输入正确的QQ号码(5-12位数字)!" - status_label.modulate = Color.RED + status_label_2.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_2.modulate = Color.RED return if verification_code == "": - status_label.text = "请输入验证码!" - status_label.modulate = Color.RED + status_label_2.text = "请输入验证码!" + status_label_2.modulate = Color.RED return - # 检查网络连接状态 + # 检查网络连接状态 if !tcp_network_manager_panel.client.is_client_connected(): - status_label.text = "未连接到服务器,正在尝试连接..." - status_label.modulate = Color.YELLOW + status_label_2.text = "未连接到服务器,正在尝试连接..." + status_label_2.modulate = Color.YELLOW # 尝试自动连接到服务器 tcp_network_manager_panel.connect_to_current_server() await get_tree().create_timer(2.0).timeout # 再次检查连接状态 if !tcp_network_manager_panel.client.is_client_connected(): - status_label.text = "连接服务器失败,正在尝试其他服务器..." - status_label.modulate = Color.YELLOW + status_label_2.text = "连接服务器失败,正在尝试其他服务器..." + status_label_2.modulate = Color.YELLOW # 等待自动服务器切换完成 await get_tree().create_timer(3.0).timeout # 禁用按钮,防止重复点击 - register_button.disabled = true + register_button_2.disabled = true - status_label.text = "正在注册,请稍候..." - status_label.modulate = Color.YELLOW + status_label_2.text = "正在注册,请稍候..." + status_label_2.modulate = Color.YELLOW - # 发送注册请求 + # 发送注册请求 tcp_network_manager_panel.sendRegisterInfo(user_name, user_password, farmname, player_name, verification_code) - + # 更新主游戏数据 main_game.user_name = user_name main_game.user_password = user_password - main_game.farmname = farmname + # farmname 直接在注册成功后通过UI更新,这里不需要设置 # 5秒后重新启用按钮(如果没有收到响应) await get_tree().create_timer(5.0).timeout - if register_button.disabled: - register_button.disabled = false - status_label.text = "注册超时,请重试!" - status_label.modulate = Color.RED + if register_button_2.disabled: + register_button_2.disabled = false + status_label_2.text = "注册超时,请重试!" + status_label_2.modulate = Color.RED + +# 忘记密码发送验证码按钮处理 +func _on_forget_send_button_pressed(): + var user_name = forget_username_input.text.strip_edges() + + if user_name == "": + status_label_3.text = "请输入QQ号以接收验证码!" + status_label_3.modulate = Color.RED + return + + if !is_valid_qq_number(user_name): + status_label_3.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_3.modulate = Color.RED + return + + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "未连接到服务器,正在尝试连接..." + status_label_3.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "连接服务器失败,正在尝试其他服务器..." + status_label_3.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout + + # 禁用按钮,防止重复点击 + forget_send_button.disabled = true + + status_label_3.text = "正在发送验证码,请稍候..." + status_label_3.modulate = Color.YELLOW + + # 发送验证码请求(用于忘记密码) + tcp_network_manager_panel.sendForgetPasswordVerificationCode(user_name) + + # 60秒后重新启用按钮 + var timer = 60 + while timer > 0 and forget_send_button.disabled: + forget_send_button.text = "重新发送(%d)" % timer + await get_tree().create_timer(1.0).timeout + timer -= 1 + + if forget_send_button.disabled: + forget_send_button.disabled = false + forget_send_button.text = "发送验证码" + + if status_label_3.text == "正在发送验证码,请稍候...": + status_label_3.text = "验证码发送超时,请重试!" + status_label_3.modulate = Color.RED + +# 忘记密码确认按钮处理 +func _on_forget_password_confirm_pressed(): + var user_name = forget_username_input.text.strip_edges() + var new_password = new_password_input.text.strip_edges() + var verification_code = forget_verificationcode_input.text.strip_edges() + + # 检查密码格式(只允许数字和字母) + if not is_valid_password(new_password): + status_label_3.text = "密码只能包含数字和字母!" + status_label_3.modulate = Color.RED + return + + if user_name == "" or new_password == "": + status_label_3.text = "用户名或新密码不能为空!" + status_label_3.modulate = Color.RED + return + + if !is_valid_qq_number(user_name): + status_label_3.text = "请输入正确的QQ号码(5-12位数字)!" + status_label_3.modulate = Color.RED + return + + if verification_code == "": + status_label_3.text = "请输入验证码!" + status_label_3.modulate = Color.RED + return + + # 检查网络连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "未连接到服务器,正在尝试连接..." + status_label_3.modulate = Color.YELLOW + # 尝试自动连接到服务器 + tcp_network_manager_panel.connect_to_current_server() + await get_tree().create_timer(2.0).timeout + + # 再次检查连接状态 + if !tcp_network_manager_panel.client.is_client_connected(): + status_label_3.text = "连接服务器失败,正在尝试其他服务器..." + status_label_3.modulate = Color.YELLOW + # 等待自动服务器切换完成 + await get_tree().create_timer(3.0).timeout + + # 禁用按钮,防止重复点击 + forget_password_button.disabled = true + + status_label_3.text = "正在重置密码,请稍候..." + status_label_3.modulate = Color.YELLOW + + # 发送忘记密码请求 + tcp_network_manager_panel.sendForgetPasswordRequest(user_name, new_password, verification_code) + + # 5秒后重新启用按钮(如果没有收到响应) + await get_tree().create_timer(5.0).timeout + if forget_password_button.disabled: + forget_password_button.disabled = false + status_label_3.text = "重置密码超时,请重试!" + status_label_3.modulate = Color.RED # 处理验证码发送响应 func _on_verification_code_response(success: bool, message: String): @@ -390,24 +532,67 @@ func _on_login_response_received(success: bool, message: String, user_data: Dict # 处理注册响应 func _on_register_response_received(success: bool, message: String): # 启用按钮 - register_button.disabled = false + register_button_2.disabled = false if success: - status_label.text = "注册成功!请登录游戏" - status_label.modulate = Color.GREEN + status_label_2.text = "注册成功!请登录游戏" + status_label_2.modulate = Color.GREEN # 注册成功后,如果启用了记住密码,保存登录信息 if remember_password: - var user_name = username_input.text.strip_edges() - var user_password = password_input.text.strip_edges() + var user_name = register_username_input.text.strip_edges() + var user_password = password_input_1.text.strip_edges() _save_login_info(user_name, user_password) # 清除注册相关的输入框 password_input_2.text = "" verificationcode_input.text = "" + + # 切换回登录面板 + register_vbox.hide() + forget_password_vbox.hide() + login_v_box.show() + + # 如果记住密码,自动填充登录信息 + if remember_password: + username_input.text = register_username_input.text + password_input.text = password_input_1.text else: - status_label.text = "注册失败:" + message - status_label.modulate = Color.RED + status_label_2.text = "注册失败:" + message + status_label_2.modulate = Color.RED + +# 处理忘记密码响应 +func _on_forget_password_response_received(success: bool, message: String): + # 启用按钮 + forget_password_button.disabled = false + + if success: + status_label_3.text = "密码重置成功!请使用新密码登录" + status_label_3.modulate = Color.GREEN + + # 保存新的登录信息 + if remember_password: + var user_name = forget_username_input.text.strip_edges() + var new_password = new_password_input.text.strip_edges() + _save_login_info(user_name, new_password) + + # 清除输入框 + forget_verificationcode_input.text = "" + + # 切换回登录面板并自动填充账号信息 + forget_password_vbox.hide() + register_vbox.hide() + login_v_box.show() + + # 自动填充登录信息 + username_input.text = forget_username_input.text + password_input.text = new_password_input.text + + status_label.text = "密码已重置,请登录" + status_label.modulate = Color.GREEN + else: + status_label_3.text = "密码重置失败:" + message + status_label_3.modulate = Color.RED # 保存登录信息到JSON文件 func _save_login_info(user_name: String, password: String): diff --git a/Script/BigPanel/PlayerStorePanel.gd b/Script/BigPanel/PlayerStorePanel.gd new file mode 100644 index 0000000..5a024db --- /dev/null +++ b/Script/BigPanel/PlayerStorePanel.gd @@ -0,0 +1,374 @@ +extends Panel +#玩家小卖部(目前可以卖道具,种子,成熟作物) +#初始玩家有10个格子 +#然后玩家额外购买格子需要1000元,多加一个格子加500元,最多40个格子,格子满了不能再放了 +#玩家自己点击自己的摊位(商品格子)显示弹窗是否要取消放置商品 +#别人拜访玩家打开小卖部点击被拜访玩家的摊位显示批量购买弹窗 +@onready var quit_button: Button = $QuitButton #关闭玩家小卖部面板 +@onready var refresh_button: Button = $RefreshButton #刷新小卖部按钮 +@onready var store_grid: GridContainer = $ScrollContainer/Store_Grid #小卖部商品格子 +@onready var buy_product_booth_button: Button = $BuyProductBoothButton #购买格子按钮 + +# 获取主游戏引用 +@onready var main_game = get_node("/root/main") + +# 当前小卖部数据 +var player_store_data: Array = [] +var max_store_slots: int = 10 # 默认10个格子 + +func _ready(): + # 连接按钮信号 + quit_button.pressed.connect(_on_quit_button_pressed) + refresh_button.pressed.connect(_on_refresh_button_pressed) + buy_product_booth_button.pressed.connect(_on_buy_product_booth_button_pressed) + + # 连接可见性改变信号 + visibility_changed.connect(_on_visibility_changed) + + # 默认隐藏面板 + self.hide() + +#面板显示与隐藏切换处理 +func _on_visibility_changed(): + if visible: + GlobalVariables.isZoomDisabled = true + # 面板显示时更新小卖部数据 + update_player_store_ui() + else: + GlobalVariables.isZoomDisabled = false + +# 初始化玩家小卖部 +func init_player_store(): + update_player_store_ui() + +# 更新小卖部UI +func update_player_store_ui(): + # 清空商品格子 + for child in store_grid.get_children(): + child.queue_free() + + # 获取小卖部数据 + if main_game.is_visiting_mode: + # 访问模式:显示被访问玩家的小卖部 + player_store_data = main_game.visited_player_data.get("玩家小卖部", []) + max_store_slots = main_game.visited_player_data.get("小卖部格子数", 10) + buy_product_booth_button.hide() # 访问模式下隐藏购买格子按钮 + else: + # 正常模式:显示自己的小卖部 + player_store_data = main_game.login_data.get("玩家小卖部", []) + max_store_slots = main_game.login_data.get("小卖部格子数", 10) + buy_product_booth_button.show() # 正常模式下显示购买格子按钮 + + # 创建商品按钮 + _create_store_buttons() + + # 更新购买格子按钮文本 + _update_buy_booth_button() + +# 创建小卖部商品按钮 +func _create_store_buttons(): + # 为每个格子创建按钮 + for i in range(max_store_slots): + var button = _create_store_slot_button(i) + store_grid.add_child(button) + +# 创建单个商品格子按钮 +func _create_store_slot_button(slot_index: int) -> Button: + var button = main_game.item_button.duplicate() + + # 确保按钮可见并可点击 + button.visible = true + button.disabled = false + button.focus_mode = Control.FOCUS_ALL + + # 检查该格子是否有商品 + var product_data = null + if slot_index < player_store_data.size(): + product_data = player_store_data[slot_index] + + if product_data: + # 有商品的格子 + var product_name = product_data.get("商品名称", "未知商品") + var product_price = product_data.get("商品价格", 0) + var product_count = product_data.get("商品数量", 0) + var product_type = product_data.get("商品类型", "作物") + + # 设置按钮文本 + button.text = str(product_name + "\n" + str(product_price) + "元/个\n库存:" + str(product_count)) + + # 更新商品图片 + _update_button_product_image(button, product_name, product_type) + + # 设置工具提示 + button.tooltip_text = str( + "商品: " + product_name + "\n" + + "类型: " + product_type + "\n" + + "单价: " + str(product_price) + " 元\n" + + "库存: " + str(product_count) + " 个" + ) + + # 连接点击事件 + if main_game.is_visiting_mode: + # 访问模式:显示购买弹窗 + button.pressed.connect(func(): _on_product_buy_selected(product_data, slot_index)) + else: + # 自己的小卖部:显示移除商品弹窗 + button.pressed.connect(func(): _on_product_manage_selected(product_data, slot_index)) + else: + # 空格子 + button.text = "空闲格子\n\n点击添加商品" + + # 设置为灰色样式 + if button.has_node("Title"): + button.get_node("Title").modulate = Color.GRAY + + # 只有在非访问模式下才允许点击空格子 + if not main_game.is_visiting_mode: + button.pressed.connect(func(): _on_empty_slot_selected(slot_index)) + else: + button.disabled = true + + return button + +# 更新商品图片 +func _update_button_product_image(button: Button, product_name: String, product_type: String): + var crop_image = button.get_node_or_null("CropImage") + if not crop_image: + return + + var texture = null + + if product_type == "作物": + # 作物商品:加载收获物图片 + texture = _get_crop_harvest_texture(product_name) + # 未来可以添加其他类型的商品图片加载 + + if texture: + crop_image.texture = texture + crop_image.visible = true + else: + crop_image.visible = false + +# 获取作物的收获物图片 +func _get_crop_harvest_texture(crop_name: String) -> Texture2D: + var crop_path = "res://assets/作物/" + crop_name + "/" + var harvest_texture_path = crop_path + "收获物.webp" + + if ResourceLoader.exists(harvest_texture_path): + var texture = load(harvest_texture_path) + if texture: + return texture + + # 如果没有找到,使用默认的收获物图片 + var default_harvest_path = "res://assets/作物/默认/收获物.webp" + if ResourceLoader.exists(default_harvest_path): + var texture = load(default_harvest_path) + if texture: + return texture + + return null + +# 访问模式:点击商品购买 +func _on_product_buy_selected(product_data: Dictionary, slot_index: int): + var product_name = product_data.get("商品名称", "未知商品") + var product_price = product_data.get("商品价格", 0) + var product_count = product_data.get("商品数量", 0) + var product_type = product_data.get("商品类型", "作物") + + # 检查商品是否还有库存 + if product_count <= 0: + Toast.show("该商品已售罄", Color.RED, 2.0, 1.0) + return + + # 获取批量购买弹窗 + var batch_buy_popup = get_node_or_null("/root/main/UI/DiaLog/BatchBuyPopup") + if batch_buy_popup and batch_buy_popup.has_method("show_buy_popup"): + # 显示批量购买弹窗 + batch_buy_popup.show_buy_popup( + product_name, + product_price, + "玩家小卖部商品", + "store_product", # 特殊类型标识 + _on_confirm_buy_store_product, + _on_cancel_buy_store_product + ) + + # 临时保存购买信息 + batch_buy_popup.set_meta("store_slot_index", slot_index) + batch_buy_popup.set_meta("store_product_data", product_data) + else: + Toast.show("购买功能暂未实现", Color.RED, 2.0, 1.0) + +# 确认购买小卖部商品 +func _on_confirm_buy_store_product(product_name: String, unit_price: int, quantity: int, buy_type: String): + var slot_index = get_node("/root/main/UI/DiaLog/BatchBuyPopup").get_meta("store_slot_index", -1) + var product_data = get_node("/root/main/UI/DiaLog/BatchBuyPopup").get_meta("store_product_data", {}) + + if slot_index == -1 or product_data.is_empty(): + Toast.show("购买信息错误", Color.RED, 2.0, 1.0) + return + + # 发送购买请求到服务器 + var tcp_network_manager = get_node_or_null("/root/main/UI/BigPanel/TCPNetworkManagerPanel") + if tcp_network_manager and tcp_network_manager.has_method("send_message"): + var visited_player_name = main_game.visited_player_data.get("player_name", "") + var message = { + "type": "buy_store_product", + "seller_username": main_game.visited_player_data.get("username", ""), + "slot_index": slot_index, + "product_name": product_name, + "unit_price": unit_price, + "quantity": quantity + } + tcp_network_manager.send_message(message) + + Toast.show("购买请求已发送", Color.YELLOW, 2.0, 1.0) + else: + Toast.show("网络连接异常,无法购买", Color.RED, 2.0, 1.0) + +# 取消购买小卖部商品 +func _on_cancel_buy_store_product(): + # 不需要做任何事情,弹窗会自动关闭 + pass + +# 自己的小卖部:点击商品管理 +func _on_product_manage_selected(product_data: Dictionary, slot_index: int): + var product_name = product_data.get("商品名称", "未知商品") + var product_count = product_data.get("商品数量", 0) + + # 显示管理确认对话框 + _show_product_manage_dialog(product_name, product_count, slot_index) + +# 显示商品管理对话框 +func _show_product_manage_dialog(product_name: String, product_count: int, slot_index: int): + var confirm_dialog = AcceptDialog.new() + confirm_dialog.dialog_text = str( + "商品管理\n\n" + + "商品:" + product_name + "\n" + + "库存:" + str(product_count) + " 个\n\n" + + "确认要下架这个商品吗?\n" + + "商品将返回到您的仓库中。" + ) + confirm_dialog.title = "商品管理" + confirm_dialog.ok_button_text = "下架商品" + confirm_dialog.add_cancel_button("取消") + + # 添加到场景 + add_child(confirm_dialog) + + # 连接信号 + confirm_dialog.confirmed.connect(_on_confirm_remove_product.bind(slot_index, confirm_dialog)) + confirm_dialog.canceled.connect(_on_cancel_remove_product.bind(confirm_dialog)) + + # 显示对话框 + confirm_dialog.popup_centered() + +# 确认下架商品 +func _on_confirm_remove_product(slot_index: int, dialog: AcceptDialog): + # 发送下架商品请求到服务器 + var tcp_network_manager = get_node_or_null("/root/main/UI/BigPanel/TCPNetworkManagerPanel") + if tcp_network_manager and tcp_network_manager.has_method("send_message"): + var message = { + "type": "remove_store_product", + "slot_index": slot_index + } + tcp_network_manager.send_message(message) + + Toast.show("下架请求已发送", Color.YELLOW, 2.0, 1.0) + else: + Toast.show("网络连接异常,无法下架", Color.RED, 2.0, 1.0) + + dialog.queue_free() + +# 取消下架商品 +func _on_cancel_remove_product(dialog: AcceptDialog): + dialog.queue_free() + +# 点击空格子 +func _on_empty_slot_selected(slot_index: int): + Toast.show("请从作物仓库选择商品添加到小卖部", Color.CYAN, 3.0, 1.0) + +# 更新购买格子按钮 +func _update_buy_booth_button(): + if main_game.is_visiting_mode: + return + + var next_slot_cost = 1000 + (max_store_slots - 10) * 500 + if max_store_slots >= 40: + buy_product_booth_button.text = "格子已满(40/40)" + buy_product_booth_button.disabled = true + else: + buy_product_booth_button.text = str("购买格子(+" + str(next_slot_cost) + "元)") + buy_product_booth_button.disabled = false + +# 购买格子按钮处理 +func _on_buy_product_booth_button_pressed(): + if main_game.is_visiting_mode: + return + + if max_store_slots >= 40: + Toast.show("格子数量已达上限", Color.RED, 2.0, 1.0) + return + + var next_slot_cost = 1000 + (max_store_slots - 10) * 500 + + if main_game.money < next_slot_cost: + Toast.show("金钱不足,需要 " + str(next_slot_cost) + " 元", Color.RED, 2.0, 1.0) + return + + # 显示购买确认对话框 + _show_buy_booth_dialog(next_slot_cost) + +# 显示购买格子确认对话框 +func _show_buy_booth_dialog(cost: int): + var confirm_dialog = AcceptDialog.new() + confirm_dialog.dialog_text = str( + "购买小卖部格子\n\n" + + "费用:" + str(cost) + " 元\n" + + "当前格子数:" + str(max_store_slots) + "\n" + + "购买后格子数:" + str(max_store_slots + 1) + "\n\n" + + "确认购买吗?" + ) + confirm_dialog.title = "购买格子" + confirm_dialog.ok_button_text = "确认购买" + confirm_dialog.add_cancel_button("取消") + + # 添加到场景 + add_child(confirm_dialog) + + # 连接信号 + confirm_dialog.confirmed.connect(_on_confirm_buy_booth.bind(cost, confirm_dialog)) + confirm_dialog.canceled.connect(_on_cancel_buy_booth.bind(confirm_dialog)) + + # 显示对话框 + confirm_dialog.popup_centered() + +# 确认购买格子 +func _on_confirm_buy_booth(cost: int, dialog: AcceptDialog): + # 发送购买格子请求到服务器 + var tcp_network_manager = get_node_or_null("/root/main/UI/BigPanel/TCPNetworkManagerPanel") + if tcp_network_manager and tcp_network_manager.has_method("send_message"): + var message = { + "type": "buy_store_booth", + "cost": cost + } + tcp_network_manager.send_message(message) + + Toast.show("购买请求已发送", Color.YELLOW, 2.0, 1.0) + else: + Toast.show("网络连接异常,无法购买", Color.RED, 2.0, 1.0) + + dialog.queue_free() + +# 取消购买格子 +func _on_cancel_buy_booth(dialog: AcceptDialog): + dialog.queue_free() + +# 关闭面板 +func _on_quit_button_pressed(): + self.hide() + +# 刷新小卖部 +func _on_refresh_button_pressed(): + update_player_store_ui() + Toast.show("小卖部已刷新", Color.GREEN, 2.0, 1.0) diff --git a/Script/BigPanel/PlayerStorePanel.gd.uid b/Script/BigPanel/PlayerStorePanel.gd.uid new file mode 100644 index 0000000..22c8560 --- /dev/null +++ b/Script/BigPanel/PlayerStorePanel.gd.uid @@ -0,0 +1 @@ +uid://bdavskipn547h diff --git a/Script/Dialog/AddProduct2StorePopup.gd b/Script/Dialog/AddProduct2StorePopup.gd new file mode 100644 index 0000000..86d09d8 --- /dev/null +++ b/Script/Dialog/AddProduct2StorePopup.gd @@ -0,0 +1,197 @@ +extends PanelContainer +#用于添加商品到玩家小卖部的弹窗 +@onready var title: Label = $VBox/Title #弹窗标题 +@onready var contents: Label = $VBox/Contents #这里显示弹窗内容 +@onready var sell_num_input: LineEdit = $VBox/SellNumInput #这里输入需要放入小卖部的商品数量 +@onready var sell_price_input: LineEdit = $VBox/SellPriceInput #这里输入每件商品的价格 +@onready var sure_button: Button = $VBox/HBox/SureButton #确定放入按钮 +@onready var cancel_button: Button = $VBox/HBox/CancelButton #取消按钮 + +# 当前要添加的商品信息 +var current_product_name: String = "" +var current_max_count: int = 0 +var current_suggested_price: int = 0 +var current_product_desc: String = "" + +# 回调函数,用于处理确认添加 +var confirm_callback: Callable +var cancel_callback: Callable + +func _ready(): + # 连接按钮信号 + sure_button.pressed.connect(_on_sure_button_pressed) + cancel_button.pressed.connect(_on_cancel_button_pressed) + + # 设置输入框的默认值和限制 + sell_num_input.text = "1" + sell_num_input.placeholder_text = "请输入数量" + sell_price_input.placeholder_text = "请输入单价" + + # 只允许输入数字 + sell_num_input.text_changed.connect(_on_sell_num_changed) + sell_price_input.text_changed.connect(_on_sell_price_changed) + + # 连接可见性改变信号 + visibility_changed.connect(_on_visibility_changed) + + # 默认隐藏弹窗 + self.hide() + +#面板显示与隐藏切换处理 +func _on_visibility_changed(): + if visible: + GlobalVariables.isZoomDisabled = true + pass + else: + GlobalVariables.isZoomDisabled = false + pass + +# 显示添加商品弹窗 +func show_add_product_popup(product_name: String, max_count: int, suggested_price: int, product_desc: String, on_confirm: Callable, on_cancel: Callable = Callable()): + current_product_name = product_name + current_max_count = max_count + current_suggested_price = suggested_price + current_product_desc = product_desc + confirm_callback = on_confirm + cancel_callback = on_cancel + + # 设置弹窗内容 + title.text = "添加商品到小卖部" + + contents.text = str( + "商品名称: " + product_name + "\n" + + "可用数量: " + str(max_count) + " 个\n" + + "建议价格: " + str(suggested_price) + " 元/个\n" + + "描述: " + product_desc + "\n\n" + + "请设置出售数量和价格:" + ) + + # 设置默认值 + sell_num_input.text = "1" + sell_price_input.text = str(suggested_price) + + # 显示弹窗并居中 + self.show() + self.move_to_front() + +# 处理数量输入变化 +func _on_sell_num_changed(new_text: String): + # 只允许输入数字 + var filtered_text = "" + for char in new_text: + if char.is_valid_int(): + filtered_text += char + + if filtered_text != new_text: + sell_num_input.text = filtered_text + sell_num_input.caret_column = filtered_text.length() + + # 更新预览信息 + _update_preview_info() + +# 处理价格输入变化 +func _on_sell_price_changed(new_text: String): + # 只允许输入数字 + var filtered_text = "" + for char in new_text: + if char.is_valid_int(): + filtered_text += char + + if filtered_text != new_text: + sell_price_input.text = filtered_text + sell_price_input.caret_column = filtered_text.length() + + # 更新预览信息 + _update_preview_info() + +# 更新预览信息 +func _update_preview_info(): + var quantity = get_sell_quantity() + var unit_price = get_sell_price() + var total_value = quantity * unit_price + + # 检查数量是否超过最大可用数量 + var quantity_status = "" + if quantity > current_max_count: + quantity_status = " (超出库存!)" + + # 检查价格是否合理 + var price_status = "" + if unit_price <= 0: + price_status = " (价格无效!)" + elif unit_price < current_suggested_price * 0.5: + price_status = " (价格偏低)" + elif unit_price > current_suggested_price * 2: + price_status = " (价格偏高)" + + var preview_info = "\n上架数量: " + str(quantity) + " 个" + quantity_status + "\n单价: " + str(unit_price) + " 元/个" + price_status + "\n总价值: " + str(total_value) + " 元" + + # 更新内容显示 + var base_content = str( + "商品名称: " + current_product_name + "\n" + + "可用数量: " + str(current_max_count) + " 个\n" + + "建议价格: " + str(current_suggested_price) + " 元/个\n" + + "描述: " + current_product_desc + "\n\n" + + "请设置出售数量和价格:" + ) + + contents.text = base_content + preview_info + +# 获取出售数量 +func get_sell_quantity() -> int: + var text = sell_num_input.text.strip_edges() + if text.is_empty(): + return 1 + + var quantity = text.to_int() + return max(1, quantity) # 至少出售1个 + +# 获取出售价格 +func get_sell_price() -> int: + var text = sell_price_input.text.strip_edges() + if text.is_empty(): + return current_suggested_price + + var price = text.to_int() + return max(1, price) # 至少1元 + +# 确认添加按钮处理 +func _on_sure_button_pressed(): + var quantity = get_sell_quantity() + var unit_price = get_sell_price() + + if quantity <= 0: + _show_error("数量必须大于0") + return + + if quantity > current_max_count: + _show_error("数量不能超过库存数量(" + str(current_max_count) + ")") + return + + if unit_price <= 0: + _show_error("价格必须大于0") + return + + # 调用确认回调函数 + if confirm_callback.is_valid(): + confirm_callback.call(current_product_name, quantity, unit_price) + + # 隐藏弹窗 + self.hide() + +# 取消添加按钮处理 +func _on_cancel_button_pressed(): + # 调用取消回调函数 + if cancel_callback.is_valid(): + cancel_callback.call() + + # 隐藏弹窗 + self.hide() + +# 显示错误信息 +func _show_error(message: String): + # 显示Toast错误提示 + if has_node("/root/Toast"): + get_node("/root/Toast").show(message, Color.RED, 2.0, 1.0) + else: + print("添加商品弹窗错误: " + message) diff --git a/Script/Dialog/AddProduct2StorePopup.gd.uid b/Script/Dialog/AddProduct2StorePopup.gd.uid new file mode 100644 index 0000000..bc3a94b --- /dev/null +++ b/Script/Dialog/AddProduct2StorePopup.gd.uid @@ -0,0 +1 @@ +uid://cha0uw4ra1trr diff --git a/Script/Dialog/BatchSellPopup.gd b/Script/Dialog/BatchSellPopup.gd new file mode 100644 index 0000000..cf1060a --- /dev/null +++ b/Script/Dialog/BatchSellPopup.gd @@ -0,0 +1,154 @@ +extends PanelContainer +#用于作物批量出售作物弹窗 +@onready var title: Label = $VBox/Title #弹窗标题 +@onready var contents: Label = $VBox/Contents #这里显示弹窗内容 +@onready var sell_num_edit: LineEdit = $VBox/SellNumEdit #出售作物数量 +@onready var sure_button: Button = $VBox/HBox/SureButton #确定按钮 +@onready var cancel_button: Button = $VBox/HBox/CancelButton #取消按钮 + +# 当前出售的作物信息 +var current_crop_name: String = "" +var current_max_count: int = 0 +var current_unit_price: int = 0 +var current_crop_desc: String = "" + +# 回调函数,用于处理确认出售 +var confirm_callback: Callable +var cancel_callback: Callable + +func _ready(): + # 连接按钮信号 + sure_button.pressed.connect(_on_sure_button_pressed) + cancel_button.pressed.connect(_on_cancel_button_pressed) + + # 设置数量输入框的默认值和限制 + sell_num_edit.text = "1" + sell_num_edit.placeholder_text = "请输入出售数量" + + # 只允许输入数字 + sell_num_edit.text_changed.connect(_on_sell_num_changed) + + # 连接可见性改变信号 + visibility_changed.connect(_on_visibility_changed) + + # 默认隐藏弹窗 + self.hide() + +#面板显示与隐藏切换处理 +func _on_visibility_changed(): + if visible: + GlobalVariables.isZoomDisabled = true + pass + else: + GlobalVariables.isZoomDisabled = false + pass + +# 显示批量出售弹窗 +func show_sell_popup(crop_name: String, max_count: int, unit_price: int, crop_desc: String, on_confirm: Callable, on_cancel: Callable = Callable()): + current_crop_name = crop_name + current_max_count = max_count + current_unit_price = unit_price + current_crop_desc = crop_desc + confirm_callback = on_confirm + cancel_callback = on_cancel + + # 设置弹窗内容 + title.text = "批量出售作物" + + contents.text = str( + "作物名称: " + crop_name + "\n" + + "单价: " + str(unit_price) + " 元/个\n" + + "可出售数量: " + str(max_count) + " 个\n" + + "描述: " + crop_desc + "\n\n" + + "请输入出售数量:" + ) + + # 重置出售数量为1 + sell_num_edit.text = "1" + + # 显示弹窗并居中 + self.show() + self.move_to_front() + +# 处理数量输入变化 +func _on_sell_num_changed(new_text: String): + # 只允许输入数字 + var filtered_text = "" + for char in new_text: + if char.is_valid_int(): + filtered_text += char + + if filtered_text != new_text: + sell_num_edit.text = filtered_text + sell_num_edit.caret_column = filtered_text.length() + + # 更新总价显示 + _update_total_income() + +# 更新总收入显示 +func _update_total_income(): + var quantity = get_sell_quantity() + var total_income = quantity * current_unit_price + + # 检查数量是否超过最大可售数量 + var quantity_status = "" + if quantity > current_max_count: + quantity_status = " (超出库存!)" + + var income_info = "\n出售数量: " + str(quantity) + " 个" + quantity_status + "\n总收入: " + str(total_income) + " 元" + + # 更新内容显示 + var base_content = str( + "作物名称: " + current_crop_name + "\n" + + "单价: " + str(current_unit_price) + " 元/个\n" + + "可出售数量: " + str(current_max_count) + " 个\n" + + "描述: " + current_crop_desc + "\n\n" + + "请输入出售数量:" + ) + + contents.text = base_content + income_info + +# 获取出售数量 +func get_sell_quantity() -> int: + var text = sell_num_edit.text.strip_edges() + if text.is_empty(): + return 1 + + var quantity = text.to_int() + return max(1, quantity) # 至少出售1个 + +# 确认出售按钮处理 +func _on_sure_button_pressed(): + var quantity = get_sell_quantity() + + if quantity <= 0: + _show_error("出售数量必须大于0") + return + + if quantity > current_max_count: + _show_error("出售数量不能超过库存数量(" + str(current_max_count) + ")") + return + + # 调用确认回调函数 + if confirm_callback.is_valid(): + confirm_callback.call(current_crop_name, quantity, current_unit_price) + + # 隐藏弹窗 + self.hide() + +# 取消出售按钮处理 +func _on_cancel_button_pressed(): + # 调用取消回调函数 + if cancel_callback.is_valid(): + cancel_callback.call() + + # 隐藏弹窗 + self.hide() + +# 显示错误信息 +func _show_error(message: String): + # 显示Toast错误提示 + if has_node("/root/Toast"): + get_node("/root/Toast").show(message, Color.RED, 2.0, 1.0) + else: + print("批量出售弹窗错误: " + message) diff --git a/Script/Dialog/BatchSellPopup.gd.uid b/Script/Dialog/BatchSellPopup.gd.uid new file mode 100644 index 0000000..e674942 --- /dev/null +++ b/Script/Dialog/BatchSellPopup.gd.uid @@ -0,0 +1 @@ +uid://dsmmxivba06ab diff --git a/Script/SmallPanel/CropInformPanel.gd b/Script/SmallPanel/CropInformPanel.gd new file mode 100644 index 0000000..edfb716 --- /dev/null +++ b/Script/SmallPanel/CropInformPanel.gd @@ -0,0 +1,216 @@ +extends Panel + +@onready var quit_button: Button = $QuitButton #关闭作物信息面板 +@onready var crop_image: TextureRect = $VBox/CropImage #显示作物图片 +@onready var crop_name: Label = $VBox/CropName #作物名称 +@onready var crop_description: Label = $VBox/CropDescription #作物介绍 +@onready var crop_price: Label = $VBox/CropPrice #作物价格 +@onready var crop_quality: Label = $VBox/CropQuality #作物品质 +@onready var sale_product: Button = $VBox/HBox/SaleProduct #直接出售 +@onready var add_to_store: Button = $VBox/HBox/AddToStore #添加到小卖部 + +@onready var add_product_to_store_popup: PanelContainer = $'../../DiaLog/AddProductToStorePopup' + + + +# 当前显示的作物信息 +var current_crop_name: String = "" +var current_crop_count: int = 0 + +# 获取主游戏引用 +@onready var main_game = get_node("/root/main") + +func _ready(): + # 连接按钮信号 + quit_button.pressed.connect(_on_quit_button_pressed) + sale_product.pressed.connect(_on_sale_product_pressed) + add_to_store.pressed.connect(_on_add_to_store_pressed) + + # 默认隐藏面板 + self.hide() + +# 显示作物信息 +func show_crop_info(crop_name: String, crop_count: int): + current_crop_name = crop_name + current_crop_count = crop_count + + # 更新作物信息显示 + _update_crop_display() + + # 显示面板 + self.show() + self.move_to_front() + +# 更新作物信息显示 +func _update_crop_display(): + if not main_game.can_planted_crop.has(current_crop_name): + crop_name.text = "作物名称:" + current_crop_name + crop_description.text = "描述:未知作物" + crop_price.text = "收购价:未知" + crop_quality.text = "品质:未知" + return + + var crop_data = main_game.can_planted_crop[current_crop_name] + + # 获取显示名称 + var display_name = current_crop_name + var mature_name = crop_data.get("成熟物名称") + if mature_name != null and mature_name != "": + display_name = mature_name + else: + display_name = crop_data.get("作物名称", current_crop_name) + + # 更新文本显示 + crop_name.text = "作物名称:" + display_name + " (数量: " + str(current_crop_count) + ")" + crop_description.text = "描述:" + crop_data.get("描述", "美味的作物") + + # 计算出售价格(基于收益) + var sell_price = crop_data.get("收益", 0) + crop_price.text = "收购价:" + str(sell_price) + " 元/个" + + var quality = crop_data.get("品质", "普通") + crop_quality.text = "品质:" + quality + + # 更新作物图片 + _update_crop_image() + +# 更新作物图片 +func _update_crop_image(): + var texture = _get_crop_harvest_texture(current_crop_name) + if texture: + crop_image.texture = texture + else: + # 使用默认图片 + var default_texture = _get_crop_harvest_texture("默认") + if default_texture: + crop_image.texture = default_texture + +# 获取作物的收获物图片 +func _get_crop_harvest_texture(crop_name: String) -> Texture2D: + var crop_path = "res://assets/作物/" + crop_name + "/" + var harvest_texture_path = crop_path + "收获物.webp" + + if ResourceLoader.exists(harvest_texture_path): + var texture = load(harvest_texture_path) + if texture: + return texture + + # 如果没有找到,使用默认的收获物图片 + var default_harvest_path = "res://assets/作物/默认/收获物.webp" + if ResourceLoader.exists(default_harvest_path): + var texture = load(default_harvest_path) + if texture: + return texture + + return null + +# 关闭面板 +func _on_quit_button_pressed(): + self.hide() + +# 直接出售按钮处理 +func _on_sale_product_pressed(): + # 检查是否在访问模式 + if main_game.is_visiting_mode: + Toast.show("访问模式下无法出售作物", Color.ORANGE, 2.0, 1.0) + return + + # 获取批量出售弹窗 + var batch_sell_popup = get_node_or_null("/root/main/UI/DiaLog/BatchSellPopup") + if batch_sell_popup and batch_sell_popup.has_method("show_sell_popup"): + # 获取作物数据以传递给出售弹窗 + var crop_data = main_game.can_planted_crop.get(current_crop_name, {}) + var sell_price = crop_data.get("收益", 0) + var description = crop_data.get("描述", "美味的作物") + + # 显示批量出售弹窗 + batch_sell_popup.show_sell_popup( + current_crop_name, + current_crop_count, + sell_price, + description, + _on_confirm_sell_crop, + _on_cancel_sell_crop + ) + else: + Toast.show("批量出售功能暂未实现", Color.RED, 2.0, 1.0) + print("错误:找不到BatchSellPopup或相关方法") + +# 确认出售作物回调 +func _on_confirm_sell_crop(crop_name: String, sell_count: int, unit_price: int): + # 发送出售请求到服务器 + var tcp_network_manager = get_node_or_null("/root/main/UI/BigPanel/TCPNetworkManagerPanel") + if tcp_network_manager and tcp_network_manager.has_method("send_message"): + var message = { + "type": "sell_crop", + "crop_name": crop_name, + "sell_count": sell_count, + "unit_price": unit_price + } + tcp_network_manager.send_message(message) + + # 关闭作物信息面板 + self.hide() + + Toast.show("出售请求已发送", Color.YELLOW, 2.0, 1.0) + else: + Toast.show("网络连接异常,无法出售", Color.RED, 2.0, 1.0) + +# 取消出售作物回调 +func _on_cancel_sell_crop(): + # 不需要做任何事情,弹窗会自动关闭 + pass + +# 添加到小卖部按钮处理 +func _on_add_to_store_pressed(): + # 检查是否在访问模式 + if main_game.is_visiting_mode: + Toast.show("访问模式下无法操作小卖部", Color.ORANGE, 2.0, 1.0) + return + + # 获取添加商品到小卖部的弹窗 + + if add_product_to_store_popup and add_product_to_store_popup.has_method("show_add_product_popup"): + # 获取作物数据以传递给弹窗 + var crop_data = main_game.can_planted_crop.get(current_crop_name, {}) + var sell_price = crop_data.get("收益", 0) + var description = crop_data.get("描述", "美味的作物") + + # 显示添加商品弹窗 + add_product_to_store_popup.show_add_product_popup( + current_crop_name, + current_crop_count, + sell_price, + description, + _on_confirm_add_to_store, + _on_cancel_add_to_store + ) + else: + Toast.show("添加商品功能暂未实现", Color.RED, 2.0, 1.0) + print("错误:找不到AddProduct2StorePopup或相关方法") + +# 确认添加到小卖部回调 +func _on_confirm_add_to_store(crop_name: String, add_count: int, unit_price: int): + # 发送添加商品到小卖部的请求到服务器 + var tcp_network_manager = get_node_or_null("/root/main/UI/BigPanel/TCPNetworkManagerPanel") + if tcp_network_manager and tcp_network_manager.has_method("send_message"): + var message = { + "type": "add_product_to_store", + "product_type": "作物", + "product_name": crop_name, + "product_count": add_count, + "product_price": unit_price + } + tcp_network_manager.send_message(message) + + # 关闭作物信息面板 + self.hide() + + Toast.show("添加商品请求已发送", Color.YELLOW, 2.0, 1.0) + else: + Toast.show("网络连接异常,无法添加商品", Color.RED, 2.0, 1.0) + +# 取消添加到小卖部回调 +func _on_cancel_add_to_store(): + # 不需要做任何事情,弹窗会自动关闭 + pass diff --git a/Script/SmallPanel/CropInformPanel.gd.uid b/Script/SmallPanel/CropInformPanel.gd.uid new file mode 100644 index 0000000..5b82a8d --- /dev/null +++ b/Script/SmallPanel/CropInformPanel.gd.uid @@ -0,0 +1 @@ +uid://b185o1hjnlrv5 diff --git a/Script/SmallPanel/DebugPanel.gd b/Script/SmallPanel/DebugPanel.gd index 9e316fe..23e733a 100644 --- a/Script/SmallPanel/DebugPanel.gd +++ b/Script/SmallPanel/DebugPanel.gd @@ -98,7 +98,12 @@ func _update_performance_data(): # 从主游戏获取加载信息 if main_game and main_game.crop_texture_manager: var manager = main_game.crop_texture_manager - performance_data["loaded_textures"] = manager.texture_cache.size() + manager.mature_texture_cache.size() + # 计算所有加载的纹理数量(新的三阶段系统) + var total_textures = 0 + for crop_name in manager.texture_cache.keys(): + total_textures += manager.texture_cache[crop_name].size() + total_textures += manager.default_textures.size() + performance_data["loaded_textures"] = total_textures performance_data["failed_textures"] = manager.failed_resources.size() # 加载进度 diff --git a/Server/QQEmailSend.py b/Server/QQEmailSend.py index 6728fa4..66994bf 100644 --- a/Server/QQEmailSend.py +++ b/Server/QQEmailSend.py @@ -131,13 +131,14 @@ class EmailVerification: return ''.join(random.choice(chars) for _ in range(length)) @staticmethod - def send_verification_email(qq_number, verification_code): + def send_verification_email(qq_number, verification_code, email_type="register"): """ 发送验证码邮件到QQ邮箱 参数: qq_number (str): 接收者QQ号 verification_code (str): 验证码 + email_type (str): 邮件类型,"register" 或 "reset_password" 返回: bool: 发送成功返回True,否则返回False @@ -145,15 +146,25 @@ class EmailVerification: """ receiver_email = f"{qq_number}@qq.com" + # 根据邮件类型设置不同的内容 + if email_type == "reset_password": + email_title = "【萌芽农场】密码重置验证码" + email_purpose = "重置萌芽农场游戏账号密码" + email_color = "#FF6B35" # 橙红色,表示警告性操作 + else: + email_title = "【萌芽农场】注册验证码" + email_purpose = "注册萌芽农场游戏账号" + email_color = "#4CAF50" # 绿色,表示正常操作 + # 创建邮件内容 message = MIMEText(f'''
-

萌芽农场 - 邮箱验证码

+

萌芽农场 - 邮箱验证码

亲爱的玩家,您好!

-

您正在注册萌芽农场游戏账号,您的验证码是:

-
+

您正在{email_purpose},您的验证码是:

+
{verification_code}

该验证码有效期为5分钟,请勿泄露给他人。

@@ -169,7 +180,7 @@ class EmailVerification: # 修正From头格式,符合QQ邮箱的要求 message['From'] = SENDER_EMAIL message['To'] = receiver_email - message['Subject'] = Header('【萌芽农场】注册验证码', 'utf-8') + message['Subject'] = Header(email_title, 'utf-8') try: # 使用SSL/TLS连接而不是STARTTLS @@ -182,7 +193,7 @@ class EmailVerification: return False, f"发送验证码失败: {str(e)}" @staticmethod - def save_verification_code(qq_number, verification_code, expiry_time=300): + def save_verification_code(qq_number, verification_code, expiry_time=300, code_type="register"): """ 保存验证码到缓存文件 @@ -190,6 +201,7 @@ class EmailVerification: qq_number (str): QQ号 verification_code (str): 验证码 expiry_time (int): 过期时间(秒),默认5分钟 + code_type (str): 验证码类型,"register" 或 "reset_password" 返回: bool: 保存成功返回True,否则返回False @@ -205,33 +217,43 @@ class EmailVerification: try: with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: verification_data = json.load(file) - except: + except Exception as e: + print(f"读取验证码文件失败: {str(e)}") verification_data = {} # 添加新的验证码 expire_at = time.time() + expiry_time + current_time = time.time() + + # 创建验证码记录,包含更多信息用于调试 verification_data[qq_number] = { "code": verification_code, - "expire_at": expire_at + "expire_at": expire_at, + "code_type": code_type, + "created_at": current_time, + "used": False # 新增:标记验证码是否已使用 } # 保存到文件 try: with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: json.dump(verification_data, file, indent=2, ensure_ascii=False) + + print(f"[验证码系统] 为QQ {qq_number} 保存{code_type}验证码: {verification_code}, 过期时间: {expire_at}") return True except Exception as e: print(f"保存验证码失败: {str(e)}") return False @staticmethod - def verify_code(qq_number, input_code): + def verify_code(qq_number, input_code, code_type="register"): """ 验证用户输入的验证码 参数: qq_number (str): QQ号 input_code (str): 用户输入的验证码 + code_type (str): 验证码类型,"register" 或 "reset_password" 返回: bool: 验证成功返回True,否则返回False @@ -241,23 +263,41 @@ class EmailVerification: # 检查缓存文件是否存在 if not os.path.exists(VERIFICATION_CACHE_FILE): + print(f"[验证码系统] QQ {qq_number} 验证失败: 缓存文件不存在") return False, "验证码不存在或已过期" # 读取验证码数据 try: with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: verification_data = json.load(file) - except: + except Exception as e: + print(f"[验证码系统] 读取验证码文件失败: {str(e)}") return False, "验证码数据损坏" # 检查该QQ号是否有验证码 if qq_number not in verification_data: + print(f"[验证码系统] QQ {qq_number} 验证失败: 没有找到验证码记录") return False, "验证码不存在,请重新获取" # 获取存储的验证码信息 code_info = verification_data[qq_number] stored_code = code_info.get("code", "") expire_at = code_info.get("expire_at", 0) + stored_code_type = code_info.get("code_type", "register") + is_used = code_info.get("used", False) + created_at = code_info.get("created_at", 0) + + print(f"[验证码系统] QQ {qq_number} 验证码详情: 存储码={stored_code}, 输入码={input_code}, 类型={stored_code_type}, 已使用={is_used}, 创建时间={created_at}") + + # 检查验证码类型是否匹配 + if stored_code_type != code_type: + print(f"[验证码系统] QQ {qq_number} 验证失败: 验证码类型不匹配,存储类型={stored_code_type}, 请求类型={code_type}") + return False, f"验证码类型不匹配,请重新获取{code_type}验证码" + + # 检查验证码是否已被使用 + if is_used: + print(f"[验证码系统] QQ {qq_number} 验证失败: 验证码已被使用") + return False, "验证码已被使用,请重新获取" # 检查验证码是否过期 current_time = time.time() @@ -266,22 +306,31 @@ class EmailVerification: del verification_data[qq_number] with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: json.dump(verification_data, file, indent=2, ensure_ascii=False) + print(f"[验证码系统] QQ {qq_number} 验证失败: 验证码已过期") return False, "验证码已过期,请重新获取" # 验证码比较(不区分大小写) if input_code.upper() == stored_code.upper(): - # 验证成功后移除该验证码 - del verification_data[qq_number] - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) - return True, "验证码正确" + # 验证成功,标记为已使用而不是删除 + verification_data[qq_number]["used"] = True + verification_data[qq_number]["used_at"] = current_time + + try: + with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: + json.dump(verification_data, file, indent=2, ensure_ascii=False) + print(f"[验证码系统] QQ {qq_number} 验证成功: 验证码已标记为已使用") + return True, "验证码正确" + except Exception as e: + print(f"[验证码系统] 标记验证码已使用时失败: {str(e)}") + return True, "验证码正确" # 即使标记失败,验证还是成功的 else: + print(f"[验证码系统] QQ {qq_number} 验证失败: 验证码不匹配") return False, "验证码错误" @staticmethod def clean_expired_codes(): """ - 清理过期的验证码 + 清理过期的验证码和已使用的验证码 """ import time @@ -295,22 +344,79 @@ class EmailVerification: current_time = time.time() removed_keys = [] - # 找出过期的验证码 + # 找出过期的验证码和已使用的验证码(超过1小时) for qq_number, code_info in verification_data.items(): expire_at = code_info.get("expire_at", 0) + is_used = code_info.get("used", False) + used_at = code_info.get("used_at", 0) + + should_remove = False + + # 过期的验证码 if current_time > expire_at: + should_remove = True + print(f"[验证码清理] 移除过期验证码: QQ {qq_number}") + + # 已使用超过1小时的验证码 + elif is_used and used_at > 0 and (current_time - used_at) > 3600: + should_remove = True + print(f"[验证码清理] 移除已使用的验证码: QQ {qq_number}") + + if should_remove: removed_keys.append(qq_number) - # 移除过期的验证码 + # 移除标记的验证码 for key in removed_keys: del verification_data[key] # 保存更新后的数据 - with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: - json.dump(verification_data, file, indent=2, ensure_ascii=False) + if removed_keys: + with open(VERIFICATION_CACHE_FILE, 'w', encoding='utf-8') as file: + json.dump(verification_data, file, indent=2, ensure_ascii=False) + print(f"[验证码清理] 共清理了 {len(removed_keys)} 个验证码") except Exception as e: - print(f"清理过期验证码失败: {str(e)}") + print(f"清理验证码失败: {str(e)}") + + @staticmethod + def get_verification_status(qq_number): + """ + 获取验证码状态(用于调试) + + 参数: + qq_number (str): QQ号 + + 返回: + dict: 验证码状态信息 + """ + import time + + if not os.path.exists(VERIFICATION_CACHE_FILE): + return {"status": "no_cache_file"} + + try: + with open(VERIFICATION_CACHE_FILE, 'r', encoding='utf-8') as file: + verification_data = json.load(file) + + if qq_number not in verification_data: + return {"status": "no_code"} + + code_info = verification_data[qq_number] + current_time = time.time() + + return { + "status": "found", + "code": code_info.get("code", ""), + "code_type": code_info.get("code_type", "unknown"), + "used": code_info.get("used", False), + "expired": current_time > code_info.get("expire_at", 0), + "created_at": code_info.get("created_at", 0), + "expire_at": code_info.get("expire_at", 0), + "used_at": code_info.get("used_at", 0) + } + + except Exception as e: + return {"status": "error", "message": str(e)} # 测试邮件发送 diff --git a/Server/TCPGameServer.py b/Server/TCPGameServer.py index 0a3fd40..49d500b 100644 --- a/Server/TCPGameServer.py +++ b/Server/TCPGameServer.py @@ -94,6 +94,7 @@ class TCPGameServer(TCPServer): self.start_batch_save_timer() self.start_weed_growth_timer() self.start_wisdom_tree_health_decay_timer() + self.start_verification_code_cleanup_timer() #初始化性能操作 def _init_performance_settings(self): @@ -170,6 +171,20 @@ class TCPGameServer(TCPServer): self.wisdom_tree_decay_timer.daemon = True self.wisdom_tree_decay_timer.start() + def start_verification_code_cleanup_timer(self): + """启动验证码清理定时器""" + try: + from QQEmailSend import EmailVerification + EmailVerification.clean_expired_codes() + self.log('INFO', "验证码清理完成", 'SERVER') + except Exception as e: + self.log('ERROR', f"验证码清理时出错: {str(e)}", 'SERVER') + + # 创建下一个验证码清理计时器(每30分钟检查一次) + self.verification_cleanup_timer = threading.Timer(1800, self.start_verification_code_cleanup_timer) # 每30分钟清理一次 + self.verification_cleanup_timer.daemon = True + self.verification_cleanup_timer.start() + #获取服务器统计信息 def get_server_stats(self): """获取服务器统计信息""" @@ -203,6 +218,12 @@ class TCPGameServer(TCPServer): self.wisdom_tree_decay_timer = None self.log('INFO', "智慧树生命值衰减计时器已停止", 'SERVER') + # 停止验证码清理定时器 + if hasattr(self, 'verification_cleanup_timer') and self.verification_cleanup_timer: + self.verification_cleanup_timer.cancel() + self.verification_cleanup_timer = None + self.log('INFO', "验证码清理定时器已停止", 'SERVER') + # 强制保存所有缓存数据 self.log('INFO', "正在保存所有玩家数据...", 'SERVER') saved_count = self.force_save_all_data() @@ -678,6 +699,10 @@ class TCPGameServer(TCPServer): return self._handle_register(client_id, message) elif message_type == "request_verification_code":#验证码请求 return self._handle_verification_code_request(client_id, message) + elif message_type == "request_forget_password_verification_code":#忘记密码验证码请求 + return self._handle_forget_password_verification_code_request(client_id, message) + elif message_type == "reset_password":#重置密码 + return self._handle_reset_password_request(client_id, message) elif message_type == "verify_code":#验证码 return self._handle_verify_code(client_id, message) @@ -775,6 +800,16 @@ class TCPGameServer(TCPServer): return self._handle_wisdom_tree_message(client_id, message) elif message_type == "get_wisdom_tree_config":#获取智慧树配置 return self._handle_get_wisdom_tree_config(client_id, message) + elif message_type == "sell_crop":#出售作物 + return self._handle_sell_crop(client_id, message) + elif message_type == "add_product_to_store":#添加商品到小卖部 + return self._handle_add_product_to_store(client_id, message) + elif message_type == "remove_store_product":#下架小卖部商品 + return self._handle_remove_store_product(client_id, message) + elif message_type == "buy_store_product":#购买小卖部商品 + return self._handle_buy_store_product(client_id, message) + elif message_type == "buy_store_booth":#购买小卖部格子 + return self._handle_buy_store_booth(client_id, message) #--------------------------------------------------------------------------- elif message_type == "message":#处理聊天消息(暂未实现) @@ -982,9 +1017,12 @@ class TCPGameServer(TCPServer): # 验证验证码 if verification_code: from QQEmailSend import EmailVerification - success, verify_message = EmailVerification.verify_code(username, verification_code) + success, verify_message = EmailVerification.verify_code(username, verification_code, "register") if not success: + self.log('WARNING', f"QQ号 {username} 注册验证码验证失败: {verify_message}", 'SERVER') return self._send_register_error(client_id, f"验证码错误: {verify_message}") + else: + self.log('INFO', f"QQ号 {username} 注册验证码验证成功", 'SERVER') # 检查用户是否已存在 file_path = os.path.join("game_saves", f"{username}.json") @@ -1114,9 +1152,9 @@ class TCPGameServer(TCPServer): 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') + # 保存验证码(注册类型) + EmailVerification.save_verification_code(qq_number, verification_code, 300, "register") + self.log('INFO', f"已向QQ号 {qq_number} 发送注册验证码: {verification_code}", 'SERVER') return self.send_data(client_id, { "type": "verification_code_response", @@ -1166,6 +1204,127 @@ class TCPGameServer(TCPServer): #验证QQ号格式 + #处理忘记密码验证码请求 + def _handle_forget_password_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": "forget_password_verification_code_response", + "success": False, + "message": "QQ号格式无效,请输入5-12位数字" + }) + + # 检查账号是否存在 + player_data = self.load_player_data(qq_number) + if not player_data: + return self.send_data(client_id, { + "type": "forget_password_verification_code_response", + "success": False, + "message": "该账号不存在,请检查QQ号是否正确" + }) + + # 生成验证码 + verification_code = EmailVerification.generate_verification_code() + + # 发送验证码邮件(专门用于密码重置) + success, send_message = EmailVerification.send_verification_email(qq_number, verification_code, "reset_password") + + if success: + # 保存验证码(密码重置类型) + EmailVerification.save_verification_code(qq_number, verification_code, 300, "reset_password") + self.log('INFO', f"已向QQ号 {qq_number} 发送密码重置验证码: {verification_code}", 'SERVER') + + return self.send_data(client_id, { + "type": "forget_password_verification_code_response", + "success": True, + "message": "密码重置验证码已发送到您的QQ邮箱,请查收" + }) + else: + self.log('ERROR', f"发送密码重置验证码失败: {send_message}", 'SERVER') + return self.send_data(client_id, { + "type": "forget_password_verification_code_response", + "success": False, + "message": f"发送验证码失败: {send_message}" + }) + + #处理重置密码请求 + def _handle_reset_password_request(self, client_id, message): + """处理重置密码请求""" + from QQEmailSend import EmailVerification + + username = message.get("username", "") + new_password = message.get("new_password", "") + verification_code = message.get("verification_code", "") + + # 验证必填字段 + if not username or not new_password or not verification_code: + return self.send_data(client_id, { + "type": "reset_password_response", + "success": False, + "message": "用户名、新密码或验证码不能为空" + }) + + # 验证QQ号格式 + if not self._validate_qq_number(username): + return self.send_data(client_id, { + "type": "reset_password_response", + "success": False, + "message": "用户名必须是5-12位的QQ号码" + }) + + # 检查账号是否存在 + player_data = self.load_player_data(username) + if not player_data: + return self.send_data(client_id, { + "type": "reset_password_response", + "success": False, + "message": "该账号不存在,请检查QQ号是否正确" + }) + + # 验证验证码(密码重置类型) + success, verify_message = EmailVerification.verify_code(username, verification_code, "reset_password") + if not success: + self.log('WARNING', f"QQ号 {username} 密码重置验证码验证失败: {verify_message}", 'SERVER') + return self.send_data(client_id, { + "type": "reset_password_response", + "success": False, + "message": f"验证码错误: {verify_message}" + }) + else: + self.log('INFO', f"QQ号 {username} 密码重置验证码验证成功", 'SERVER') + + # 更新密码 + try: + player_data["user_password"] = new_password + + # 保存到缓存和文件 + self.player_cache[username] = player_data + self.dirty_players.add(username) + + # 立即保存重要的账户信息 + self.save_player_data_immediate(username) + + self.log('INFO', f"用户 {username} 密码重置成功", 'ACCOUNT') + + return self.send_data(client_id, { + "type": "reset_password_response", + "success": True, + "message": "密码重置成功,请使用新密码登录" + }) + + except Exception as e: + self.log('ERROR', f"重置密码时出错: {str(e)}", 'ACCOUNT') + return self.send_data(client_id, { + "type": "reset_password_response", + "success": False, + "message": "密码重置失败,请稍后重试" + }) + #辅助函数-验证QQ号格式 def _validate_qq_number(self, qq_number): """验证QQ号格式""" @@ -5675,6 +5834,7 @@ class TCPGameServer(TCPServer): safe_player_data = { "user_name": target_player_data.get("user_name", target_username), + "username": target_username, # 添加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), @@ -5690,6 +5850,9 @@ class TCPGameServer(TCPServer): "出战宠物": self._convert_battle_pets_to_full_data(target_player_data), "稻草人配置": target_player_data.get("稻草人配置", {}), "智慧树配置": target_player_data.get("智慧树配置", {}), + "玩家小卖部": target_player_data.get("玩家小卖部", []), # 添加小卖部数据 + "小卖部格子数": target_player_data.get("小卖部格子数", 10), # 添加小卖部格子数 + "点赞数": target_player_data.get("点赞数", 0), # 添加点赞数 "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) @@ -8502,6 +8665,454 @@ class TCPGameServer(TCPServer): #==========================智慧树系统处理========================== +#==========================作物出售处理========================== + def _handle_sell_crop(self, client_id, message): + """处理作物出售请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "出售作物", "sell_crop") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "sell_crop") + if not player_data: + return self.send_data(client_id, response) + + crop_name = message.get("crop_name", "") + sell_count = message.get("sell_count", 1) + unit_price = message.get("unit_price", 0) + + # 验证参数 + if not crop_name: + return self._send_action_error(client_id, "sell_crop", "作物名称不能为空") + + if sell_count <= 0: + return self._send_action_error(client_id, "sell_crop", "出售数量必须大于0") + + if unit_price <= 0: + return self._send_action_error(client_id, "sell_crop", "单价必须大于0") + + # 检查作物仓库中是否有足够的作物 + crop_warehouse = player_data.get("作物仓库", []) + crop_found = False + crop_index = -1 + available_count = 0 + + for i, crop_item in enumerate(crop_warehouse): + if crop_item.get("name") == crop_name: + crop_found = True + crop_index = i + available_count = crop_item.get("count", 0) + break + + if not crop_found: + return self._send_action_error(client_id, "sell_crop", f"作物仓库中没有 {crop_name}") + + if available_count < sell_count: + return self._send_action_error(client_id, "sell_crop", f"作物数量不足,仓库中只有 {available_count} 个 {crop_name}") + + # 验证价格(防止客户端篡改价格) + crop_data = self._load_crop_data() + if crop_name in crop_data: + expected_price = crop_data[crop_name].get("收益", 0) + if unit_price != expected_price: + return self._send_action_error(client_id, "sell_crop", f"价格验证失败,{crop_name} 的正确价格应为 {expected_price} 元/个") + else: + return self._send_action_error(client_id, "sell_crop", f"未知的作物类型:{crop_name}") + + # 计算总收入 + total_income = sell_count * unit_price + + # 执行出售操作 + player_data["money"] += total_income + + # 从作物仓库中减少数量 + crop_warehouse[crop_index]["count"] -= sell_count + + # 如果数量为0,从仓库中移除该作物 + if crop_warehouse[crop_index]["count"] <= 0: + crop_warehouse.pop(crop_index) + + # 给予少量出售经验 + sell_experience = max(1, sell_count // 5) # 每5个作物给1点经验 + player_data["experience"] += sell_experience + + # 检查是否升级 + self._check_level_up(player_data) + + # 保存玩家数据 + self.save_player_data(username, player_data) + + # 获取显示名称 + display_name = crop_name + if crop_name in crop_data: + mature_name = crop_data[crop_name].get("成熟物名称") + if mature_name: + display_name = mature_name + else: + display_name = crop_data[crop_name].get("作物名称", crop_name) + + self.log('INFO', f"玩家 {username} 出售了 {sell_count} 个 {crop_name},获得 {total_income} 金币和 {sell_experience} 经验", 'SERVER') + + return self.send_data(client_id, { + "type": "action_response", + "action_type": "sell_crop", + "success": True, + "message": f"成功出售 {sell_count} 个 {display_name},获得 {total_income} 金币和 {sell_experience} 经验", + "updated_data": { + "money": player_data["money"], + "experience": player_data["experience"], + "level": player_data["level"], + "作物仓库": player_data["作物仓库"] + } + }) +#==========================作物出售处理========================== + + +#==========================小卖部管理处理========================== + def _handle_add_product_to_store(self, client_id, message): + """处理添加商品到小卖部请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "添加商品到小卖部", "add_product_to_store") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "add_product_to_store") + if not player_data: + return self.send_data(client_id, response) + + product_type = message.get("product_type", "") + product_name = message.get("product_name", "") + product_count = message.get("product_count", 1) + product_price = message.get("product_price", 0) + + # 验证参数 + if not product_type or not product_name: + return self._send_action_error(client_id, "add_product_to_store", "商品类型或名称不能为空") + + if product_count <= 0: + return self._send_action_error(client_id, "add_product_to_store", "商品数量必须大于0") + + if product_price <= 0: + return self._send_action_error(client_id, "add_product_to_store", "商品价格必须大于0") + + # 初始化小卖部数据 + if "玩家小卖部" not in player_data: + player_data["玩家小卖部"] = [] + if "小卖部格子数" not in player_data: + player_data["小卖部格子数"] = 10 + + player_store = player_data["玩家小卖部"] + max_slots = player_data["小卖部格子数"] + + # 检查小卖部格子是否已满 + if len(player_store) >= max_slots: + return self._send_action_error(client_id, "add_product_to_store", f"小卖部格子已满({len(player_store)}/{max_slots})") + + # 检查作物仓库中是否有足够的商品 + if product_type == "作物": + crop_warehouse = player_data.get("作物仓库", []) + crop_found = False + crop_index = -1 + available_count = 0 + + for i, crop_item in enumerate(crop_warehouse): + if crop_item.get("name") == product_name: + crop_found = True + crop_index = i + available_count = crop_item.get("count", 0) + break + + if not crop_found: + return self._send_action_error(client_id, "add_product_to_store", f"作物仓库中没有 {product_name}") + + if available_count < product_count: + return self._send_action_error(client_id, "add_product_to_store", f"作物数量不足,仓库中只有 {available_count} 个 {product_name}") + + # 从作物仓库中扣除商品 + crop_warehouse[crop_index]["count"] -= product_count + if crop_warehouse[crop_index]["count"] <= 0: + crop_warehouse.pop(crop_index) + + # 添加商品到小卖部 + new_product = { + "商品类型": product_type, + "商品名称": product_name, + "商品价格": product_price, + "商品数量": product_count + } + player_store.append(new_product) + + # 保存玩家数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 添加商品到小卖部: {product_name} x{product_count}, 价格 {product_price}元/个", 'SERVER') + + return self.send_data(client_id, { + "type": "action_response", + "action_type": "add_product_to_store", + "success": True, + "message": f"成功添加 {product_count} 个 {product_name} 到小卖部", + "updated_data": { + "玩家小卖部": player_data["玩家小卖部"], + "作物仓库": player_data.get("作物仓库", []) + } + }) + + def _handle_remove_store_product(self, client_id, message): + """处理下架小卖部商品请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "下架小卖部商品", "remove_store_product") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "remove_store_product") + if not player_data: + return self.send_data(client_id, response) + + slot_index = message.get("slot_index", -1) + + # 验证参数 + if slot_index < 0: + return self._send_action_error(client_id, "remove_store_product", "无效的商品槽位") + + # 检查小卖部数据 + player_store = player_data.get("玩家小卖部", []) + if slot_index >= len(player_store): + return self._send_action_error(client_id, "remove_store_product", "商品槽位不存在") + + # 获取要下架的商品信息 + product_data = player_store[slot_index] + product_type = product_data.get("商品类型", "") + product_name = product_data.get("商品名称", "") + product_count = product_data.get("商品数量", 0) + + # 将商品返回到对应仓库 + if product_type == "作物": + # 返回到作物仓库 + if "作物仓库" not in player_data: + player_data["作物仓库"] = [] + + crop_warehouse = player_data["作物仓库"] + # 查找是否已有该作物 + crop_found = False + for crop_item in crop_warehouse: + if crop_item.get("name") == product_name: + crop_item["count"] += product_count + crop_found = True + break + + if not crop_found: + # 添加新的作物条目 + crop_data = self._load_crop_data() + quality = "普通" + if crop_data and product_name in crop_data: + quality = crop_data[product_name].get("品质", "普通") + + crop_warehouse.append({ + "name": product_name, + "quality": quality, + "count": product_count + }) + + # 从小卖部移除商品 + player_store.pop(slot_index) + + # 保存玩家数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 下架小卖部商品: {product_name} x{product_count}", 'SERVER') + + return self.send_data(client_id, { + "type": "action_response", + "action_type": "remove_store_product", + "success": True, + "message": f"成功下架 {product_count} 个 {product_name},已返回仓库", + "updated_data": { + "玩家小卖部": player_data["玩家小卖部"], + "作物仓库": player_data.get("作物仓库", []) + } + }) + + def _handle_buy_store_product(self, client_id, message): + """处理购买小卖部商品请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "购买小卖部商品", "buy_store_product") + if not logged_in: + return self.send_data(client_id, response) + + # 获取买家数据 + buyer_data, buyer_username, response = self._load_player_data_with_check(client_id, "buy_store_product") + if not buyer_data: + return self.send_data(client_id, response) + + seller_username = message.get("seller_username", "") + slot_index = message.get("slot_index", -1) + product_name = message.get("product_name", "") + unit_price = message.get("unit_price", 0) + quantity = message.get("quantity", 1) + + # 验证参数 + if not seller_username: + return self._send_action_error(client_id, "buy_store_product", "卖家用户名不能为空") + + if slot_index < 0: + return self._send_action_error(client_id, "buy_store_product", "无效的商品槽位") + + if quantity <= 0: + return self._send_action_error(client_id, "buy_store_product", "购买数量必须大于0") + + # 检查是否是自己购买自己的商品 + if buyer_username == seller_username: + return self._send_action_error(client_id, "buy_store_product", "不能购买自己的商品") + + # 加载卖家数据 + seller_data = self.load_player_data(seller_username) + if not seller_data: + return self._send_action_error(client_id, "buy_store_product", f"卖家 {seller_username} 不存在") + + # 检查卖家小卖部 + seller_store = seller_data.get("玩家小卖部", []) + if slot_index >= len(seller_store): + return self._send_action_error(client_id, "buy_store_product", "商品不存在") + + product_data = seller_store[slot_index] + product_type = product_data.get("商品类型", "") + store_product_name = product_data.get("商品名称", "") + store_unit_price = product_data.get("商品价格", 0) + available_count = product_data.get("商品数量", 0) + + # 验证商品信息 + if store_product_name != product_name: + return self._send_action_error(client_id, "buy_store_product", "商品名称不匹配") + + if store_unit_price != unit_price: + return self._send_action_error(client_id, "buy_store_product", "商品价格已变更,请刷新重试") + + if available_count < quantity: + return self._send_action_error(client_id, "buy_store_product", f"商品库存不足,仅剩 {available_count} 个") + + # 计算总价 + total_cost = quantity * unit_price + + # 检查买家金钱是否足够 + if buyer_data["money"] < total_cost: + return self._send_action_error(client_id, "buy_store_product", f"金钱不足,需要 {total_cost} 元") + + # 执行交易 + buyer_data["money"] -= total_cost + seller_data["money"] += total_cost + + # 扣除卖家商品 + seller_store[slot_index]["商品数量"] -= quantity + if seller_store[slot_index]["商品数量"] <= 0: + seller_store.pop(slot_index) + + # 给买家添加商品 + if product_type == "作物": + if "作物仓库" not in buyer_data: + buyer_data["作物仓库"] = [] + + buyer_warehouse = buyer_data["作物仓库"] + # 查找是否已有该作物 + crop_found = False + for crop_item in buyer_warehouse: + if crop_item.get("name") == product_name: + crop_item["count"] += quantity + crop_found = True + break + + if not crop_found: + # 添加新的作物条目 + crop_data = self._load_crop_data() + quality = "普通" + if crop_data and product_name in crop_data: + quality = crop_data[product_name].get("品质", "普通") + + buyer_warehouse.append({ + "name": product_name, + "quality": quality, + "count": quantity + }) + + # 保存两个玩家的数据 + self.save_player_data(buyer_username, buyer_data) + self.save_player_data(seller_username, seller_data) + + self.log('INFO', f"玩家 {buyer_username} 从 {seller_username} 的小卖部购买了 {quantity} 个 {product_name},花费 {total_cost} 元", 'SERVER') + + return self.send_data(client_id, { + "type": "action_response", + "action_type": "buy_store_product", + "success": True, + "message": f"成功购买 {quantity} 个 {product_name},花费 {total_cost} 元", + "updated_data": { + "money": buyer_data["money"], + "作物仓库": buyer_data.get("作物仓库", []) + } + }) + + def _handle_buy_store_booth(self, client_id, message): + """处理购买小卖部格子请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "购买小卖部格子", "buy_store_booth") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "buy_store_booth") + if not player_data: + return self.send_data(client_id, response) + + cost = message.get("cost", 0) + + # 验证参数 + if cost <= 0: + return self._send_action_error(client_id, "buy_store_booth", "无效的购买费用") + + # 初始化小卖部数据 + if "小卖部格子数" not in player_data: + player_data["小卖部格子数"] = 10 + + current_slots = player_data["小卖部格子数"] + + # 检查是否已达上限 + if current_slots >= 40: + return self._send_action_error(client_id, "buy_store_booth", "小卖部格子数已达上限(40)") + + # 验证费用 + expected_cost = 1000 + (current_slots - 10) * 500 + if cost != expected_cost: + return self._send_action_error(client_id, "buy_store_booth", f"费用不正确,应为 {expected_cost} 元") + + # 检查玩家金钱是否足够 + if player_data["money"] < cost: + return self._send_action_error(client_id, "buy_store_booth", f"金钱不足,需要 {cost} 元") + + # 执行购买 + player_data["money"] -= cost + player_data["小卖部格子数"] += 1 + + # 保存玩家数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 购买小卖部格子,花费 {cost} 元,格子数:{current_slots} -> {player_data['小卖部格子数']}", 'SERVER') + + return self.send_data(client_id, { + "type": "action_response", + "action_type": "buy_store_booth", + "success": True, + "message": f"成功购买格子,花费 {cost} 元,当前格子数:{player_data['小卖部格子数']}", + "updated_data": { + "money": player_data["money"], + "小卖部格子数": player_data["小卖部格子数"] + } + }) +#==========================小卖部管理处理========================== + + # 控制台命令系统 class ConsoleCommands: """控制台命令处理类""" @@ -8516,6 +9127,7 @@ class ConsoleCommands: "lsplayer": self.cmd_list_players, "playerinfo": self.cmd_player_info, "resetland": self.cmd_reset_land, + "weather": self.cmd_weather, "help": self.cmd_help, "stop": self.cmd_stop, "save": self.cmd_save_all, @@ -8790,6 +9402,51 @@ class ConsoleCommands: else: print("❌ 初始化模板中没有找到土地数据") + def cmd_weather(self, args): + """天气控制命令: /weather <天气类型>""" + if len(args) != 1: + print("❌ 用法: /weather <天气类型>") + print(" 可用天气: clear, rain, snow, cherry, gardenia, willow") + return + + weather_type = args[0].lower() + + # 定义可用的天气类型映射 + weather_map = { + "clear": "晴天", + "rain": "下雨", + "snow": "下雪", + "cherry": "樱花雨", + "gardenia": "栀子花雨", + "willow": "柳叶雨", + "stop": "停止天气" + } + + if weather_type not in weather_map: + print("❌ 无效的天气类型") + print(" 可用天气: clear, rain, snow, cherry, gardenia, willow, stop") + return + + # 广播天气变更消息给所有在线客户端 + weather_message = { + "type": "weather_change", + "weather_type": weather_type, + "weather_name": weather_map[weather_type] + } + + # 发送给所有连接的客户端 + for client_id in list(self.server.clients.keys()): + try: + self.server.send_data(client_id, weather_message) + except Exception as e: + print(f"⚠️ 向客户端 {client_id} 发送天气消息失败: {str(e)}") + + print(f"🌤️ 已将天气切换为: {weather_map[weather_type]}") + if len(self.server.clients) > 0: + print(f" 已通知 {len(self.server.clients)} 个在线客户端") + else: + print(" 当前无在线客户端") + def cmd_help(self, args): """显示帮助信息""" print("🌱 萌芽农场服务器控制台命令帮助") @@ -8803,6 +9460,10 @@ class ConsoleCommands: print(" /playerinfo - 查看玩家详细信息") print(" /resetland - 重置玩家土地状态") print("") + print("游戏控制命令:") + print(" /weather <类型> - 控制全服天气") + print(" 可用类型: clear, rain, snow, cherry, gardenia, willow, stop") + print("") print("服务器管理命令:") print(" /save - 立即保存所有玩家数据") print(" /reload - 重新加载配置文件") @@ -8841,6 +9502,7 @@ class ConsoleCommands: import sys sys.exit(0) + def console_input_thread(server): """控制台输入处理线程""" console = ConsoleCommands(server) diff --git a/Server/__pycache__/QQEmailSend.cpython-313.pyc b/Server/__pycache__/QQEmailSend.cpython-313.pyc index 7941ca8902f051194d4ec1a8123f0465434657bc..ea44ed547d08f50e14af3e2241db1a08842dd442 100644 GIT binary patch delta 7688 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 P5I*tJKr_XjUC8|}*^urV delta 3166 zcmbtWZ*UXG72mtl-RY#0WLvUj%YP&xTekcM+1QS;Wg8pGG%m#$&T8E%Gp?~^MYNXW zlLR59qmVX)W*7pqB`qy!X`5zfnFbg$Q`(ud!B#u{(!>xbRLuuE4H()#L7Jq76>D~2C6HPCsijG$$!jAjzX~^(x8kU;xZp9Dw43rX_)ND67c{G}$ZKe@ zyHIW&(b`dGi0UZlmM06-oLC+s{_7^;6Uo>S3&C zigFo}HxYJJ9K;`2OtHxaun>z?M|ek@w|`rEGd@+dkGng2_Ris>_(WwXHd&A5r)J-> zu2A@Lr4#?qezu3p2s1Ndk>vEApqwe(7nH+O;fe7?I2sw7h)xFO1~{DT2FR%6(}~zv zbkAOS6Aa@d0{Ax@MjSUlcnM`KsM7g;&zaCd*~TOK2OKh%XOY@goGm~lwfIFxvwETW zbAK{_Sh)*dbfmhfV9}-ihOIUlS9NlOpmK7I0!MU|@)l8XhIw5gPxo zu^ykS-bJbKV)YEg;xE_Ot?PeWL?zMWmk*N-`I+4mKB2c1`ROL`65;%mpOe%Z>Cry? zubOhRAaN4k$56|P zqnb=k$7B~6%5?1uCPJFgYkS650<(KhOO;Q&}X{K!y>ZH?8b zufl#;oCdEOU1>LatC%@a4f34Z;1keXui3kqnJ-p@JYS{pHuCdz49w0qD(F^u+nM>z z8Xw1}X$EZ4oPvVJ*T$rcW}ll$yIGJY){6yfw$8%$KzmYviX+k65m54=XBWlb_dRAU zR2qp>*u>zh$KJ~1Gx{mSL|;;Q;NKdDC!`+jBgH4e`dJ+F6&nQUQKjK>x0|Jp$WSSfJOhB=Z>_|Zwx+5$(TosKXqY6@K7eiVen9;1_C~Xd9!VNtaQ~M_ z@0~xic;?XEU;S+HC-2}tKU130D%6(0L6&`!z)J*D1bPV^BJeUmh6x1|^0$b@CS$Rn z>=Kk@$!NlnSTd2TkR(lVIq?cH6i8~0g(FkZj5eN#%E8H;898Z2oJh*D4zg3pu($v^ z{B}o|?jIn;d-AFCNk$VJBW(Jsv1N6|ww^M5t1IIApnf&p2fLj&_&U(<%swY`1(Ku# z&22LKdYLq99xyOzC!_(NZe~EAZd0&>_Ia3euVz5x|6tGzRPqzx16pCOThELa=-HTu zq6D}xl8_{^FXA6{n=84;nLFA+=sF3rJKz>jZbuV7(xa;Y0&5WzY?To`3&{Y)t`pD> zUeOX-n|X4PE6GI##N5VEs!K?zt{An$oef#@G=k%y-U@o?O~Smk5S?dbpfv9SZeu&_ zCj`p#8c7?d%*%cO@2D+L3H?F{E|v)Nj}>PzN!Y2md-;{c*Bpjsh@Y*T!#OdxNJBPoQ})i0iPLe9H<+aRCxT^ z;;+ehR7yIbuY8QG5ar->bRRJHYrzBY-1VS8N@f)jGoZ!iHdye-eIBk1NE_GVntlgU zB6MT>=4u@6Z*MkQZx|bHnQS*rwO38GXNA9*HZAeUwUt^HQEByY=9a1EnyG$?fx!bc zDk{N;8XT#G!hsdX8j)95HsmP{9}@*-%ZL)XKN1TUOf8oj7sh9u7fKh3x^9Y|tD@&& zmVwFDxCBQ8Uh9F^-bUbczY65JN;lxVX!iCn^A0tU8#Uf8e*PJr$UPdLmQV8x$Q#pI z(xvqpUni3;HIu8LjRjfW366(c)P3^J 1.0) { COLOR = vec4(0.0, 0.0, 0.0, 0.0); // 透明 } else { COLOR = texture(TEXTURE, uv); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/assets/作物/人参/0.webp b/assets/作物/人参/幼苗.webp similarity index 100% rename from assets/作物/人参/0.webp rename to assets/作物/人参/幼苗.webp diff --git a/assets/作物/人参/0.webp.import b/assets/作物/人参/幼苗.webp.import similarity index 71% rename from assets/作物/人参/0.webp.import rename to assets/作物/人参/幼苗.webp.import index 1237b86..1f2957a 100644 --- a/assets/作物/人参/0.webp.import +++ b/assets/作物/人参/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://xyj4ro44cwj5" -path="res://.godot/imported/0.webp-9339f1eb71d8e2d2c9d6eff2a61109e8.ctex" +path="res://.godot/imported/幼苗.webp-e31b638e539187dd68d4f0b356b0ede9.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/人参/0.webp" -dest_files=["res://.godot/imported/0.webp-9339f1eb71d8e2d2c9d6eff2a61109e8.ctex"] +source_file="res://assets/作物/人参/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-e31b638e539187dd68d4f0b356b0ede9.ctex"] [params] diff --git a/assets/作物/仙人掌/0.webp b/assets/作物/仙人掌/幼苗.webp similarity index 100% rename from assets/作物/仙人掌/0.webp rename to assets/作物/仙人掌/幼苗.webp diff --git a/assets/作物/仙人掌/0.webp.import b/assets/作物/仙人掌/幼苗.webp.import similarity index 71% rename from assets/作物/仙人掌/0.webp.import rename to assets/作物/仙人掌/幼苗.webp.import index d140f5c..2e8fde8 100644 --- a/assets/作物/仙人掌/0.webp.import +++ b/assets/作物/仙人掌/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://btro2s0v3vjvc" -path="res://.godot/imported/0.webp-a498150286b3ef11bcaf7062fb7c4c72.ctex" +path="res://.godot/imported/幼苗.webp-d7486902f1f60fe55e6aa621b78d2bdd.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/仙人掌/0.webp" -dest_files=["res://.godot/imported/0.webp-a498150286b3ef11bcaf7062fb7c4c72.ctex"] +source_file="res://assets/作物/仙人掌/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-d7486902f1f60fe55e6aa621b78d2bdd.ctex"] [params] diff --git a/assets/作物/仙人掌/1.webp b/assets/作物/仙人掌/未成熟.webp similarity index 100% rename from assets/作物/仙人掌/1.webp rename to assets/作物/仙人掌/未成熟.webp diff --git a/assets/作物/仙人掌/1.webp.import b/assets/作物/仙人掌/未成熟.webp.import similarity index 70% rename from assets/作物/仙人掌/1.webp.import rename to assets/作物/仙人掌/未成熟.webp.import index b22434a..8275748 100644 --- a/assets/作物/仙人掌/1.webp.import +++ b/assets/作物/仙人掌/未成熟.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://nh4rwteg18hf" -path="res://.godot/imported/1.webp-eac2af28e41e5166de4e45fa1d9b023c.ctex" +path="res://.godot/imported/未成熟.webp-e0f54244cf971f24edbb0bf5ab6f5b9d.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/仙人掌/1.webp" -dest_files=["res://.godot/imported/1.webp-eac2af28e41e5166de4e45fa1d9b023c.ctex"] +source_file="res://assets/作物/仙人掌/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-e0f54244cf971f24edbb0bf5ab6f5b9d.ctex"] [params] diff --git a/assets/作物/冬虫夏草/1.webp b/assets/作物/冬虫夏草/1.webp deleted file mode 100644 index 74749502ec4a80a7ef72213ef311832e2ff909e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24202 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
*Die}mj?pV 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 diff --git a/assets/作物/南瓜/3.webp b/assets/作物/南瓜/3.webp deleted file mode 100644 index 89be333634533461a7c92025a0d4143decc9ff90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29570 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 diff --git a/assets/作物/向日葵/2.webp.import b/assets/作物/向日葵/2.webp.import deleted file mode 100644 index 097ccda..0000000 --- a/assets/作物/向日葵/2.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bxhe4pl7e2h4r" -path="res://.godot/imported/2.webp-a4ac518035e8dc36ed57f415183fccf4.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/向日葵/2.webp" -dest_files=["res://.godot/imported/2.webp-a4ac518035e8dc36ed57f415183fccf4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/向日葵/0.webp b/assets/作物/向日葵/幼苗.webp similarity index 100% rename from assets/作物/向日葵/0.webp rename to assets/作物/向日葵/幼苗.webp diff --git a/assets/作物/向日葵/0.webp.import b/assets/作物/向日葵/幼苗.webp.import similarity index 71% rename from assets/作物/向日葵/0.webp.import rename to assets/作物/向日葵/幼苗.webp.import index 2208b6f..ec28831 100644 --- a/assets/作物/向日葵/0.webp.import +++ b/assets/作物/向日葵/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cgvoioriuf7y0" -path="res://.godot/imported/0.webp-e38fa2090339e41d8e2bc2f4382d5f43.ctex" +path="res://.godot/imported/幼苗.webp-193e6077d0df53351f2012da9f7451e7.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/向日葵/0.webp" -dest_files=["res://.godot/imported/0.webp-e38fa2090339e41d8e2bc2f4382d5f43.ctex"] +source_file="res://assets/作物/向日葵/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-193e6077d0df53351f2012da9f7451e7.ctex"] [params] diff --git a/assets/作物/向日葵/1.webp b/assets/作物/向日葵/未成熟.webp similarity index 100% rename from assets/作物/向日葵/1.webp rename to assets/作物/向日葵/未成熟.webp diff --git a/assets/作物/向日葵/1.webp.import b/assets/作物/向日葵/未成熟.webp.import similarity index 70% rename from assets/作物/向日葵/1.webp.import rename to assets/作物/向日葵/未成熟.webp.import index 0e21ef7..7e81ddb 100644 --- a/assets/作物/向日葵/1.webp.import +++ b/assets/作物/向日葵/未成熟.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://wqfspwqqpcwa" -path="res://.godot/imported/1.webp-39c5186218d6a70b3b214094d5602b76.ctex" +path="res://.godot/imported/未成熟.webp-6b7798c51cbe39e5ab328bc5836f3c9b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/向日葵/1.webp" -dest_files=["res://.godot/imported/1.webp-39c5186218d6a70b3b214094d5602b76.ctex"] +source_file="res://assets/作物/向日葵/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-6b7798c51cbe39e5ab328bc5836f3c9b.ctex"] [params] diff --git a/assets/作物/咖啡豆/0.webp b/assets/作物/咖啡豆/幼苗.webp similarity index 100% rename from assets/作物/咖啡豆/0.webp rename to assets/作物/咖啡豆/幼苗.webp diff --git a/assets/作物/咖啡豆/0.webp.import b/assets/作物/咖啡豆/幼苗.webp.import similarity index 71% rename from assets/作物/咖啡豆/0.webp.import rename to assets/作物/咖啡豆/幼苗.webp.import index 9426346..fbc6fec 100644 --- a/assets/作物/咖啡豆/0.webp.import +++ b/assets/作物/咖啡豆/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bvcmrkatbo0f1" -path="res://.godot/imported/0.webp-6d779ef7b648b1e546e4ba9e87048adb.ctex" +path="res://.godot/imported/幼苗.webp-63eb1edffbc9e3e228ea5afcf106ea2a.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/咖啡豆/0.webp" -dest_files=["res://.godot/imported/0.webp-6d779ef7b648b1e546e4ba9e87048adb.ctex"] +source_file="res://assets/作物/咖啡豆/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-63eb1edffbc9e3e228ea5afcf106ea2a.ctex"] [params] diff --git a/assets/作物/哈密瓜/1.webp b/assets/作物/哈密瓜/1.webp deleted file mode 100644 index efe63275ce9ef182ddb2cfc89cefa70c9a2dc19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21054 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 J00000008{O7`Ffb diff --git a/assets/作物/哈密瓜/1.webp.import b/assets/作物/哈密瓜/1.webp.import deleted file mode 100644 index b51eca1..0000000 --- a/assets/作物/哈密瓜/1.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b7rryqoraiind" -path="res://.godot/imported/1.webp-1f85d6df04e3014f721dc62f7c60a301.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/哈密瓜/1.webp" -dest_files=["res://.godot/imported/1.webp-1f85d6df04e3014f721dc62f7c60a301.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/哈密瓜/0.webp b/assets/作物/哈密瓜/幼苗.webp similarity index 100% rename from assets/作物/哈密瓜/0.webp rename to assets/作物/哈密瓜/幼苗.webp diff --git a/assets/作物/哈密瓜/0.webp.import b/assets/作物/哈密瓜/幼苗.webp.import similarity index 71% rename from assets/作物/哈密瓜/0.webp.import rename to assets/作物/哈密瓜/幼苗.webp.import index c8dfb87..0dbeca8 100644 --- a/assets/作物/哈密瓜/0.webp.import +++ b/assets/作物/哈密瓜/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bilp5c3p4muup" -path="res://.godot/imported/0.webp-44b93bb80f1aa61722d002b9c7673b92.ctex" +path="res://.godot/imported/幼苗.webp-8799bc4c3eb57cb4d190ad1a2f2aa952.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/哈密瓜/0.webp" -dest_files=["res://.godot/imported/0.webp-44b93bb80f1aa61722d002b9c7673b92.ctex"] +source_file="res://assets/作物/哈密瓜/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-8799bc4c3eb57cb4d190ad1a2f2aa952.ctex"] [params] diff --git a/assets/作物/哈密瓜/2.webp b/assets/作物/哈密瓜/未成熟.webp similarity index 100% rename from assets/作物/哈密瓜/2.webp rename to assets/作物/哈密瓜/未成熟.webp diff --git a/assets/作物/哈密瓜/2.webp.import b/assets/作物/哈密瓜/未成熟.webp.import similarity index 70% rename from assets/作物/哈密瓜/2.webp.import rename to assets/作物/哈密瓜/未成熟.webp.import index 7ff0566..c7b5bb2 100644 --- a/assets/作物/哈密瓜/2.webp.import +++ b/assets/作物/哈密瓜/未成熟.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://by01gwdqm2b25" -path="res://.godot/imported/2.webp-241c30c524225cf14a34f44113ad84e5.ctex" +path="res://.godot/imported/未成熟.webp-ef1ae6a286c854a08ebc8551517f6823.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/哈密瓜/2.webp" -dest_files=["res://.godot/imported/2.webp-241c30c524225cf14a34f44113ad84e5.ctex"] +source_file="res://assets/作物/哈密瓜/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-ef1ae6a286c854a08ebc8551517f6823.ctex"] [params] diff --git a/assets/作物/土豆/0.webp.import b/assets/作物/土豆/0.webp.import deleted file mode 100644 index f6b7b16..0000000 --- a/assets/作物/土豆/0.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cfbyrlvyw7mbm" -path="res://.godot/imported/0.webp-7c561674e7465fe1b7ab139e2d86374d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/土豆/0.webp" -dest_files=["res://.godot/imported/0.webp-7c561674e7465fe1b7ab139e2d86374d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/土豆/2.webp.import b/assets/作物/土豆/2.webp.import deleted file mode 100644 index f232d9c..0000000 --- a/assets/作物/土豆/2.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dig8kyw0tib3" -path="res://.godot/imported/2.webp-b2dbe3a142652718e988b49bbb0c0744.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/土豆/2.webp" -dest_files=["res://.godot/imported/2.webp-b2dbe3a142652718e988b49bbb0c0744.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/土豆/1.webp b/assets/作物/土豆/幼苗.webp similarity index 100% rename from assets/作物/土豆/1.webp rename to assets/作物/土豆/幼苗.webp diff --git a/assets/作物/土豆/1.webp.import b/assets/作物/土豆/幼苗.webp.import similarity index 71% rename from assets/作物/土豆/1.webp.import rename to assets/作物/土豆/幼苗.webp.import index 5e6a091..e084347 100644 --- a/assets/作物/土豆/1.webp.import +++ b/assets/作物/土豆/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bkn5q3cyenc0q" -path="res://.godot/imported/1.webp-f108974cb62a8d6c198d2e6263bb15ff.ctex" +path="res://.godot/imported/幼苗.webp-2dd945057ed9aef6aa603482ab806e5d.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/土豆/1.webp" -dest_files=["res://.godot/imported/1.webp-f108974cb62a8d6c198d2e6263bb15ff.ctex"] +source_file="res://assets/作物/土豆/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-2dd945057ed9aef6aa603482ab806e5d.ctex"] [params] diff --git a/assets/作物/土豆/2.webp b/assets/作物/土豆/未成熟.webp similarity index 100% rename from assets/作物/土豆/2.webp rename to assets/作物/土豆/未成熟.webp diff --git a/assets/作物/茄子/4.webp.import b/assets/作物/土豆/未成熟.webp.import similarity index 75% rename from assets/作物/茄子/4.webp.import rename to assets/作物/土豆/未成熟.webp.import index 7de9f14..39f8b8f 100644 --- a/assets/作物/茄子/4.webp.import +++ b/assets/作物/土豆/未成熟.webp.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dnb0afavrjkbx" -path="res://.godot/imported/4.webp-09e380791e9c9ce6f1a8aefbef1f05a1.ctex" +uid="uid://dig8kyw0tib3" +path="res://.godot/imported/未成熟.webp-e6ea031a6f258edaec1f424b49b0de94.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/茄子/4.webp" -dest_files=["res://.godot/imported/4.webp-09e380791e9c9ce6f1a8aefbef1f05a1.ctex"] +source_file="res://assets/作物/土豆/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-e6ea031a6f258edaec1f424b49b0de94.ctex"] [params] diff --git a/assets/作物/大白菜/1.webp b/assets/作物/大白菜/1.webp deleted file mode 100644 index 90ea3a13f82d7f2c39316985cef102ec49e10c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20962 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 VuSOw+bc_I6fC`sqclv+;008ruJQM%` diff --git a/assets/作物/大白菜/1.webp.import b/assets/作物/大白菜/1.webp.import deleted file mode 100644 index 65b3900..0000000 --- a/assets/作物/大白菜/1.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dgdshxgx8b4wj" -path="res://.godot/imported/1.webp-8e159514a2d5265435603e4f8abadb12.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/大白菜/1.webp" -dest_files=["res://.godot/imported/1.webp-8e159514a2d5265435603e4f8abadb12.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/大白菜/0.webp b/assets/作物/大白菜/幼苗.webp similarity index 100% rename from assets/作物/大白菜/0.webp rename to assets/作物/大白菜/幼苗.webp diff --git a/assets/作物/大白菜/0.webp.import b/assets/作物/大白菜/幼苗.webp.import similarity index 71% rename from assets/作物/大白菜/0.webp.import rename to assets/作物/大白菜/幼苗.webp.import index 794937e..80726b5 100644 --- a/assets/作物/大白菜/0.webp.import +++ b/assets/作物/大白菜/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cla1xws7k5qbo" -path="res://.godot/imported/0.webp-95fd204d42c46a44e3c4313652f5ffce.ctex" +path="res://.godot/imported/幼苗.webp-43a7c9b6afafbf0d5e6af53488d2eff9.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/大白菜/0.webp" -dest_files=["res://.godot/imported/0.webp-95fd204d42c46a44e3c4313652f5ffce.ctex"] +source_file="res://assets/作物/大白菜/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-43a7c9b6afafbf0d5e6af53488d2eff9.ctex"] [params] diff --git a/assets/作物/大白菜/2.webp b/assets/作物/大白菜/未成熟.webp similarity index 100% rename from assets/作物/大白菜/2.webp rename to assets/作物/大白菜/未成熟.webp diff --git a/assets/作物/大白菜/2.webp.import b/assets/作物/大白菜/未成熟.webp.import similarity index 70% rename from assets/作物/大白菜/2.webp.import rename to assets/作物/大白菜/未成熟.webp.import index c9848a4..ed50c2a 100644 --- a/assets/作物/大白菜/2.webp.import +++ b/assets/作物/大白菜/未成熟.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://dftmxuhrl4jqa" -path="res://.godot/imported/2.webp-bdd6486dc35f8c758136190cc6fa9895.ctex" +path="res://.godot/imported/未成熟.webp-2f315bd8829c1b18106ea1b7cbeb08d1.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/大白菜/2.webp" -dest_files=["res://.godot/imported/2.webp-bdd6486dc35f8c758136190cc6fa9895.ctex"] +source_file="res://assets/作物/大白菜/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-2f315bd8829c1b18106ea1b7cbeb08d1.ctex"] [params] diff --git a/assets/作物/大蒜/0.webp b/assets/作物/大蒜/幼苗.webp similarity index 100% rename from assets/作物/大蒜/0.webp rename to assets/作物/大蒜/幼苗.webp diff --git a/assets/作物/大蒜/0.webp.import b/assets/作物/大蒜/幼苗.webp.import similarity index 71% rename from assets/作物/大蒜/0.webp.import rename to assets/作物/大蒜/幼苗.webp.import index 6376a0b..88f149e 100644 --- a/assets/作物/大蒜/0.webp.import +++ b/assets/作物/大蒜/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://8ncjpot0587o" -path="res://.godot/imported/0.webp-667c2ea589e0f98450ef6af17a7a5f5b.ctex" +path="res://.godot/imported/幼苗.webp-9ff6d4c1a71eb35de524cfcce9a4d803.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/大蒜/0.webp" -dest_files=["res://.godot/imported/0.webp-667c2ea589e0f98450ef6af17a7a5f5b.ctex"] +source_file="res://assets/作物/大蒜/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-9ff6d4c1a71eb35de524cfcce9a4d803.ctex"] [params] diff --git a/assets/作物/大豆/2.webp b/assets/作物/大豆/2.webp deleted file mode 100644 index 7abb2034603b361bd09a87aa68d54a980206a37b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36538 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�f3m9LcvCw zp1z(xer+U(Y{iY=!(x81uPqwn0U$^-1EBF!k5r#Oks07)^I~XFCCHbb7`g|0(gcdh z)lPh@RASC1sY+@{({!9JUoJ2Fp*9NCH;{&in&0!Bo&4sJGl?R_o7Y&516u+Ch`Kb? zq`Q~mqt6s(K+l&%V>glITc1oPiByhp zaRFfh17M88xLua&GFh#nSTP_1iN>@>1`};ipFR%Q8&?3tA%KmTg|eHbStW=nZki=k zlINat5!Gw(aU73_{mturA0`(zR;RtGn^utEt*A0VvsBge`TN?h_auTrl33Al8;#Wf z(CUFyDPjr)gb|JXE;vPIh%U*sdwqF6CFWxKwCwjc`}@ml>Q--brW?I1tDMmCxEv1q zx_wvA0iZ|kNNwx|^H4#Z(J=A7gdAep)}k3Hum^_M=pxVJMcl1j`F)ptKU+}@cM z$zb4Uux3C-T{96ALnSVxc>_}b5!~oPFC2*hm~$H_$AJL+_=StT_a8Nb(Hg<0d8nL4 za><|JkCvWa3z)NGO?_3F5zT6zdUIkz8d1SD1HeSY%vD9^Ts7Iw#s_f&nyNH1+xgvW z9UJ`!yAJa8&j09xkxATjt#D~UiVBAYl#9=lNN=Q?+}3W;c3Hb;^$Xzcg%5LYXO zu^Dq!GEJ&t_2|Z6khpU9V664jQ}aR90IqW*9R~uCZ0oGQd@&{fs+vRIUS2ypuzDt9 z07-%XVX*0Fl)3)c6LYpzD=WRnPCZxprs@*@;KS?JkzC!LQkBsp**med(#dRpsol=k zx@D}aLqA@Nr>ic4qY$-L6=FUPAnI%S$a`1!vIZ`jjwE$x4qmSFLh(@gOX?*mcOC>=13Zunbw1u z`QVIb$nrcpg`lpv&b<%${eE1QX^J>_(id-zd^hHt<_6o=?S?=SYyq{*y(OKyKZ;L( zx{M^*v~yvYhY*xRlk~fni&15bP_Yrfxa^3rQGkk}LACYK@o1x0IH%rtgh9jFk=;~@ zIo&y!Q*)*v))qiXq8eSrsDHDG(d~D>u@s0_QoSh*jSV0g(gJ!=uQj9^1rgjt3abjq zvgwrW94c|{pj6EHhHPg#+1@|XWh(&Ctgr$|V@4W0X=|yXF#&4;0u(kf0>%a=y_4D6 z!MKJ#N1C_{jm69v%*4c*NM(jJDCa&%ao1Zq z`S3^XS{*rS#$4f27i%4A90IX8O*D@Qsv@EcUOmx&HlL>eLvixW#W#nqtSM)SvMfXl z>V5ww);>2$Tz>O~$?sw(6C+?|4J2E=I(lQw8Y1jp90uR}ZN2|pw_-(;GWh0Be;6=t zOZDcLyJJiD?D`fF)(p$GRh6?aUc2tLr_Rim!-w&7F9Sn{EJE_+?YnC!L6RC@{F1ip z-1$v+`irU8Xok^9QqTFzs?os3ea7C%rU(yD2N%hgkL-7LRuX^PdwWNx0ziG-|C0XQ zkL&pZoJi2nl0~1FiPd?srhWZ-f_Vb_n1HE2ml{8|$Uas$!OMO4KX|cM} zbAZL86Bm|m24y6Jkv7kntbFrIFMZ{B3^tRWIy34N7L7s87Z0y)I74Ilv|N+d0}PFQ z`i|$qXu8p>Rwqf770v+cSdem>detbXT#EVL+|EnM+HQZ>)0AYC5PNfmrioZh3{j~n zK%t1peE)hitt#i780wl;;Pk9p-YnU`M9hcE&v$THQBgyIilI!S03@shfX_1*4K(Zd zl99Yu!VuA5MoQ<4TMxgt)J8?Ghw=XWK$0*sYl)dqrZf*z1RDK!!LC=EMX7 zh(N^V6siwp|H`_Y-0Ee8NJ}82#SI&#A&((dktEr4vbVa^v+*NuZ$?CnMd_Q$P|{}R znQxNw!$6bCzM`Qy=SafGNA5{S*(j5#IpM z!!*gJy}hFsMy5+^`~CiUe_WE$rh~oe`T?3Wn_Aa66H=@WeCkOE$Oc9OjPx3wf4SfH z3d=YeWgDIC6TQmj42F1o{;lD}_LTcio!Yv4dyqM40bnp>C(d45VO6d#_sf16$38ao z>Qy84-v8zcpBps;nn;Y9w8}vVk~Be7BM|a*ytf>Dny0>R?L1z}Ctp10<_^twAG!JZ zB&mdPKK$^lKgs(Rlhy!`;`PtBcf(S*OhX7>LCY>!S&qFnGV5Gj+Fb&y3EwWJp_&1s zjK&IR@V-LU$N-Sx@^g@_3{-l0K%C^&D&`JfK6m6c%7XvfU}45A>keeqzlRn!v^2}t8`>bCawzyTx( z78~~$?TdZPojN`;nL0x)eTdV|H>cJz6N82j$7Nm)`~AU#8@LRmlo5)Y4q_^!`6yS)3tnZ1<)4MnO% zCP;%~?xajhqA|^iK+K@#<;~{~xO#GRV^HZQ+RuD;FB$G2DnS6&6hX|Oxy-q;J6v9} zVs*ozq1%3Ze}8}T*8bwuHLz;b*_obCi8)m|T@tJZ2(1-V0%Atre*W!mUf3CAl^D{c zCvL60XVmUFM$o_*g;dSVuoWBk^5Vx|elEyhYibQlDrLJnc3EQ9K&q`TZd_anq|G5x zFbV2C>zNI@YE7w+Q!TPW5Dp%=x>JY&0DWAR{jJHQt%%aS<=I)BW$v-3^H2SP*3Ncp zkhw+>GClu7@!-Uvu8Ff^WovVHzl4Z0n=_`bTXlIe)kdPEHN$fG%<$Yt1_HnDlgdz^ zsuU)ROCbW;|J1GQ=tyQ2Eb9+HFUghS#R6>>m}jHD@u1>>}P zWps5iof~S6Fru!OFC4?|w`US1Y`(m9bTNY&%wPc7i1CrP`^aR`z`D}9=W%2|W# z#5Z-1AK5&%nmL1NIQ6NM@9)hSMj-&!+r7sd{(Tb(8b16*a54_+JjGDT5| z@z82DRZ-tWBs;mXv$oj{P7DA;*09aFurdiB1q$zxViM#N{R^WF93R6T?s07nbm23^32(d3dS_;nN_32#qCIDy+6Q1r$2P4RK3+=v!7}! z%uT0LsHz4HC_d8L*&L_2`h*1lxWP9*cx*EqT7;_iUZil6^ls$i-5jhT(-4akg&3&5 zyq=9J0aOhlW+qAn8^LuR+RgXJhlE*i^^4hu-!=9vsrEiNK{w_wUhBr}XJzo^@buDT zuL5A!`9isr>Y+o@tB=cZxjB6GLS<6Wsj8x`=J&<>tFP`({2!)u~LJalCnRGf?9rujtB106?Y{1951Qs$SEw-QK)% zX1Trc&NmHCrp^pXvZlQB0jb{ddIrRsPwjtp;!vw;W(FgKps|s`2pTclB^!+@lch9f z+!EsY`nkt~lX%31^X zwd13ejZEtK@xgk2BB_z==!5obNe~7QHfzG#TYm}9_I-#IL_<$ zg-hddeUm3MG^C0FG;uQrVmV0YP#DygyQ$~X<`^QFE?CC<4@ z1Q0VZvzhSiW3P?eoJoB@FC<8HDy554Z3On{4uw4)CI4>=k30> z$Nkv5Z+=x|CII-dKknc9=P$KG9BU+y7LC3iLS>VxfhEHB{!{l|-AO91<^+v(-0o+U z%p&bxzF4jfGEpOmnbmQ->u-!4m|yvXJT?#jCRt@^Uaq~eFGmN?=mGU!Jx!`&Dux-R zD%-byF}J1{FAhB;7);Dys>*u0^nqmfP*3WafbsAhPo3;k1`v@|Rp7+PSpx4v%xtIf z#h7Td!9WnIRL9E5_{cmjzv5#KWHHXlFmnSiQDvd+rMm4WW>hROEs zx9ob>kV-T(*?G_C*nK{TwZ@VM@85gky``T;AV9QUvIjq^-~LjK`ip0dUY$5|zL7t& zY*?uZXJ{zmWbn~PHRh_3OLCJW!l0EqS!iZCqFzr$Mzv zQcQ}$=vJGv2_R7f`r|YxK~se)n-X!16R$2NT51%l5M0pNHIoJhhqzKD8Pe2MVt#dO#u|ij zf80x)fptVGH~6||(u;kM+3w43IlR2tP1B%6ttPZ+4y|hlQ<*|&58*~Wiua~ zoFB%)Xl#+DFMc9CK5;W;oK29yM^5g)t7Oe&b8|DBIs;%X%R2XNPX>;8zdsI3Oa0jP znC70C8%+jP7U!jphH9rD2RH|TDqF#H=}IxJY-Y>|aQ2uLmFtQp0U&szq1Lj+mv(k9 zGaC(dCcRNHk+4=i-}S_t=`Or8%Rkd^g88lP{$n?$(^U;=?%4{B3BwGVt5U`6G;@fZ znXavhCz)IttX78z+W;|3 zO^QImOscH%aq8K?T;VEB)49%^L*hfMO;G96w_Vb+135$#v)5>&QUSoS6L*g9*o@Io zl8w8H-Q6(P!SxXe-1${?VnSl=a|7tAqA>$~tCQ zsvuw>Y)*rC5mPdX)ry%wz4y&=7NA&Nx#4b}Zu>eWf>9r>v|__TtY~OP3y!EuH|oaf zDHJh?8EnpSBNVYumGw-Vh^w3{s_7s-)^EXVlN_E2ktH(x+)` zld6u9=F8ooxx`iC#5oajVsjA1t-Mr*dzRvQCRs9?E>4QU&e6h-eC$AZ2+-`auP$Yo zHP9GrQRod-%$e07Ui$d?yE;+_7S<;Dr_RJ~by7{L-e^)4gK6e$ZXu{-weyt^wLft@ z);f@#M_0~{EVTD8kJtBy?SPrK8a4ro)2!MM)Tg4=4A1+WWSUhXW>A0Zj;&5%0L(eW z%hU1YvP^e}aX;iNrpe>?u4Xc45TvL2I1a_m_73xY4A#LklZQfELmbkOs**D%231BQ zv#Q@^V7(dC_|(VZqmLaOj4~%;@!04L03_=i4Nu%-J0tPI`{3hztqlFU?$2yaAe8Dg z4sqUJTRUjK`}V?-M13ybbMl!41gQ#Q#?3~Pavx1=e$VIbD0Rjdy34n&oGMC~L)b@q;KBw1F8A%5Eg(*5{f3Q+Sz(+@ma5mSxKmdwCq3o#?rZS=Q7mg_;Z%nR)M-!jRpzSmtHXkw10fN zgN?mTkrZO6Wx0D~ar>LUwEeO5(7-^YxV00HDHsXqc5|MzqulSM=Kbst`Ym z08-IV#ORf30N@4}PL6RT4@%65GI+~_dgd$20HxLg$nh)dc5+&e2GD8@W<~{DM2{Am z+Z$Q-;I)z95S1!P3Wng7P@wmo8}8y#z+5TQ$&I+{A!U0U0oqdoiofi%Wk}WZS~>z_Sdt*E6^}ul|{oU)wb5G2rCe_(5 z?XUN5jj8Ij#_9r8U+35>#YZ2?YC2zeZv8_;vMCir^~PxREgTD&#Rf)77K5v*(N5MW zw6iM9B{9cl(?qDFtmyBSG!ZeWiY%-0VK=a*dvod9Rw00!CR6Q?J(~6~0|=`D42))l zk@;Gxbqt&_a{}|K^$a2cF>y{rocQ498Z$9*kAMAYcH4V%xGF2EY;|REXHtIbSgZhi zP-RlVU?Lzqn<7jM0cOq{K%tLhFhI+-xW>#ta%Rl3)y{rqm6b_n$MrY&cia1?(;6s1G1N8Cngi%XV2~=6opGu})AYmrKmc$(jAP88iLlC^ z{`{#2);w!WgoL850kApBWtCJbTPqtEusQ5*E_Ks5^{yLO17(%MnPDb10D=_eSC`S0 z2SZu<8neaKd#rT^D+W^_>n%Qipf%>QqKeD7-dt`{>FCj4UtCO+N<_qfLdFS6s-z_W`hM zRcRsyL#;6_1a)=%!oi6r2Lhm~M11VoR9$bQxEcXYiRjL2h+TnN%lCT@Y>8EaMdaAq zySDT3Z^=&#tVXI=AB@*>ogW;UBn`9%$4)2r_5`qM`|<4JL9VUQe&_6Tc~chqc@u;$ z*KcG13~oDaj}5JHH~z=o`SZi;K7IRpv%Rd26+O|QnC}^fz$7z+RVTl#J#|NmNX>VT znz-p`%@_#?=PzEUYMeiCPSB!iZ)@+w;`M&nUp7|>02l;9%;Uy-piNU1z^c(eu-PJz zVYnoZZ}w9oqMG@1ZJG!G$i{BztVM8@3=)e&>8UU@G}?S6Vg@BqKg$ULMBpU$U`s$B zLRQ>+@eC1}(9rHV05Dr@x6yKgh|s8{p`ifed}X7gibLuZ0O1+TIRRj#q2=_O)yAH) zNQ95!^Ild1b_c?i)iuCqG_8@!s$l7SC7pLVed2OS0APA+_vpD%4d|V<48F|x>>3f7 z>2BZoqeTsM*sH8X27pEY5TgQsxzY9wxgO77cRi_R-jVwnO;5jT>z#=J^ya*@jG*tX zYhWY|_k6%#?YKIAY_3Hnm3fKlU}v9os=aT$bE@y>tz?=xtmPm8hCD9Z)Igu+zLT{K zHOJu*nW4Pi9u)={OoItpE7QSV=h?i5*6pE=+q$t{dd^oSB2X$(LzN(CW)KU$Mb+r*9=y30Q$6Wf6g4QEiei2jq7DGkXk<9Qxt&QgWU(>| zn&)m&h?%OemvB>CW7v6cZLJI;YrwXM!tL~K4HZQi+|pUeB(lfnQP3lSo~AKc?fW0Nwy56 zc88&I(>STDnfivh<_dw2eG@Vr6)X2^ymaN+Tw7L-+kv;OZC#rTAE)+LY%HAFW{v9tR59kHh#Nt-jUhUyX0?#G9ViJ`8WzU8iq z`(b{A0YM8i^zCk(|mBPx|>Y?c)%gu2#;*LdmdA=n z#f7`qh8_g12%I%$VoJ_`W;>tH`118wXR4uLk_?C4oJ}k;1k$IT92K+0Tu~`wKmWmv zo;*>$cqwp}kmtY6Zmx)Ku9wFE{qm9FWUrbnGTnHn^F~`20OkaqikUYf2!!PiXEMrD zAISv1rvFNNWhAp^^ugEH*J93p)cD}G_FWS=*e&0v>>uA8 zb?zL^YpTjTgv8m*L9%S%L;y0xc^YdpU0W2ukR(I0RpKmreE*IcP}HZ!Y0xPuCt~wg z*=^fkRA5$`n3w@zeCpO(yO|<3158|KnaS$jFyCEw9ccg(nhsTxK{0PphYuXf9-GMQ z03^%I0ESbaLCk0tR{&sYMzqRC_m;~y^QBP)fEpfto89}7#LZXG@tMB$3Y!&FVl)r{ z^y#<^h)S~}u0auF29x+BS$g3eLquk}_C~z(^wj1rZ(|X|tkiNTH|Gq1*K0W$1(2T9 z0ogL*;NiPYe{khUZqaS9K zuJuYYo3||X9V1m|h2~HEBd>nJ-*HoDdfi6@DpdE6Fa1L9I5Nvj#0*P4V*bk9j-_Sp zIU5+ach2`FR@v0$8Z!z3#k7+B)2H_R?2>FSa-q5$&s*kJzo{7PzH2!pX9KF8H?xDR za+Ptck)UB52lXMOK{1=n^`3lGy3g>P2dQ&zr zzJB`JidRo!7CW(G@uPi)e$4qxvLthkOhX!b&J;1e^qI#_JU7XiVBC&_67#p2Sd~1un(g1Snd(e|{fpaozw^TBey3BRNtUPI@r_+|4zsE_ z`)!N0>p3ysn@yj7$?41Y#h#oYP4m1^s4pvLO=z5#J`l6mL?k&eN%l*R`Cp3BC_}De zAA6k{Ld8F_o)?Q9=Zuj+A}KU@&Kj3ZrgUL~L~DG@RKiX9yrR`lC*7GMFrt zu|_f@%67Z$XNyVaeb4ywy8#PEH+}LYcj{AZC1*y!|K+Q8FFZcHc%u{@(IBzmI0UaVVlG|zb>vpr{#$=uE|N**_P^|Ue^VL7Eb{@a zbko7KD9Swd#KO_US+;#cuB_)Xqwdkwl|s#LUK>~>neHr3hUbUDBeG;|w9;JXE3c;c zk(^jyN^#d)+#T;oy((uQVE@3uRVk&3!PkFf@?|~_h^~D!Z_Y`z@wCs@#vThzD+ZIy zm1SC{+B&pfxoae-I*%@UM0TAgzrO4hl~YEcqJ=K$ExKyIOucg9Ay2FW}(ivC=DBR1VEx#p)9} z)<_WNHvavmeopt)pO4{oG@r;*xAC4q-gbwKde(0Jyc+*p9|fjtASXXK2z4 zWE9DIZ%)Gbaje9GRYZ!b@0P*CueFse0YCs+o(G#~U%ZdIFJI9nP%)sP8D#p>yOZI1 zPAq7x*tvgkNgrtksA@}UH2`2FEx)Q``Q`nhoU0s)huV1>dn|AyDXPK>XZ`kA z*_;6cKqH!rtMzO+95?0BP^Oa`13z3#Q)0nuCQ?2A(PZ`5D@&dLn}G8GU?yZFx{duC zyAOLJI#J)Onttii70O$E#e&$1okw?er(6ouGZhVbi z?|UrR@@IcFZ`)@m%hb;hNVL#gk_>vuTI#uAL%RIdw^^1xeBV+G&O~bsD0aSnWq2wj z7Vu%*@5UT{{NFm2lAfGBQfuzo{pD`kV%XR%c&}f!`#qa-tF#x=F65-fS|#Ql6>K-GmkTC0f)ir zeF&Rh@yogrjH-Z`nJ*sKV$g5LdN>3SzJK3;a4ea$m(++(FJAKHZVXl8aGCki`L!xZ z$4W!2sPgk|#o;tH1XUvmFmD&5aqf9o1rP)P8leP~_*QiX09H^qAVN+601&$XodGHU z0RRC$8483!AqBp#S_A-LDZBCVV7~x=02)4fALY9Ut?!Whmi(ppK&-!P{?Gca`_Jv? z$*!+?$NnFk$0h&G{}1_3^Go|@{ZH^-@V_*F#P#+{mu84{g?a??C1Osk?-lh+5h`~|NG(lD1PAk7JkbA>-Dt#&-hIKzy7!O zo8Wu)JO7uk2cQT3Ub23U{}%jG{bu<6+o#XJ6TfqPSNuQY|D%6){bc^n|1izuxBl!jSRqXG=FXI0#KP0}w{~7)}{U`gU z>zDU0{U7Q5(SN7yj@Ey~|CIdH_z3kAgin`QP+E z?qAz~X@9YQ?)(D&IsAM2*Y=OuFYVv^zI*<~{%`z`m*3JqvHzt175d}!5BziaXZEk{ zpXz_ke|Z1F{@3we_OJFI-9K-C#DDq!jq&UAkL;i8Kfr&a|B?PP|A*jD@!#a%+JCWs zng1>Q%m26f@425{f3zOPU#H(c=}t_O;+*DsR&>1%Y>246&?vftmKRm;5e*Z4>8%?NE;$ zHoyqK@s1#XIy`<$M_d*RfF4?>`^M~+wJ($xD%`zM@~#jmfVzBc?|d13ATq}wVA~-~SfH+pi`Ma{yf6tYKt=O0Un&3Ql zYVl%;Eq}=18tx1?45C+Nge=J&fjRKGk1XusQ-A;56{X@;LRLHe7}8E|?{bja<_h5g zm2tUM)mTF#)t7lSCoxj%3kAkIZO`$4fEASq%uU(z>2Q9H&blJ+s)Y|Vi@BW$U#*d{ zs*bFRmx*5&Dzl2a*cU7K9bf0j=IzAxlPU)t{W~=2lG9r$_o+VHrzLwBZm4%O`>S5j znQ*e0S8}Q*<~5xJw++Fd99SQgg==>*ugPW3rqY4m<986Q2J`y8a2G+{xzx4W|HOhVn zA41)+gv7WdV6GurN~0hzssvw%Fy^5|wCh6=&Px*-pQ%EOXA{<4;lr-cihjvPsX`_~LniA^~eNjraw^t%-|$bq$BV zIv2zhwlu@V7*a*CZTEXg3T1D~VdPl!$qNt2b0r|ezHW(Wwpm!bzW3v2JLVnLtvvr0 z3jtHd#Y=*>G`$GiE1KQ)qKIk1WY)F@sM)Y#)dKr?%zK_4xj~Ns{YM(FN>cuV$I>^3 zGyW9ls$QYunajT_$O@vG*lif!1Q?2nV4Y+GjRvI_6TW6^oL|DgnC_&o8*Ug;$Xq>! z@N;D(^HJ0xj-)NkFXTHCKtMpBHfbvgcpbzXz&GHV znLu;5ca3nr#l0UL%rG`?eBwbM#8=nwL3ns|CGHj0%*#Gpe4v97UQhu3^=cJHM;uDx ziv2|unJ6JR`+(hoUJw)0olYfqB&$PaQ52p)R;~55C*ANhpF;%@*HsMJ1c+A0brnGu zgJ|My#xtq-e2U%vPvM2!E%n-#CSumTj~oR44g7yC<#*L>TnB7S_cbZP&V8|)Sev-^ zGs&0OTFc1lC1xM16lr;0g(kgSpNgOZ;LunN-oyVlp@qP{aGjQ573SUEYl#4OmhIKZ z4rSpn$HBY3l~}8sZby55#RPFlKM~|K{KuDfz!OyL-u_YSPE-evd^N!3ardxw|#x6gwuPM-=t?3a$unD}?t7wo5)_8?i2t zO?_g#t?$bl#lACoG-&Vujk}@zSMNGZZASUc4z>7ay(vimXUK;w-R5 zM?WYDhtjG8Q^z{6>wBe%Y!SNf=_v@b`?USH>XKL*4C6iRVDE_4~Z1%B@8c6)yyu%#3#XQc=i_5>OcPd<$9?Fq7^F7dP`j!M0lhl4p zx0E~iFLV14E>mV}eo3uwc8@35|KVxRk~iH6gynlHL{$9E!#zz1%cjD}?V_ro8s^_u z%|0e#kM4(f^xu4f!(El!s>R#giAteeZl0 zal@x#veTuQbgRUM7mZ4kUi*r3RGyPWqTn;C4&UvWkEWmC+;^1@v_3K-`hW3 znaW_;#dXKKEt3(jF9FYJ(M|0k2G_CYza5kDw8$Q`S31-TN6_}%@-u!K;Z5!-wwdwq zgtW8|Xtjx&7rH7wcWOv^xG_yAt5ltV+aKTr?;rXJP?&-a^}pq0KnupkBZIhq31?1Z__XGzuRDk|5>xZ5=J^2S&4 z26f_P#6S2NB-9_12g;~yy0@cvaR(*DuTRhp+A+;1Yro?=w_SVlJ!C)py1)O{z={4i zXdXg$fB8&;0A0AeUYC+jw$2Qao)8s*BY-t^2l$*EX@fp+{}>dLh7wjafde*;6e!Ly zuiAZm@I>BIBcy)|iWNI8-Q;RL2!nF@5J$;T-%*XVk1TIYQ!wiYUcN{fY3O2kN1Aoi6>LfweO3xV$AQZ9_0;yK!;wmkxRQ z;@2X*S5xvyqTA!>|B8+wt}7_nE{J@tzTS}TaNTxeHvJ1cYH6l~EAODv>*X3hCV`dp zasJNz!n{F<=1CZPOor$^(lec~0NxIg#(YM_0?7Cb3QDB-@sDTJVI4b3vLQN$GwS(~ zQS)vGZiU}5waVOir0CxPIJZPpP&=4`>hxiNOo-h<*1?}6YO1g|4o4c(D3{i{^9f8& zYrcYp^_Ggb-@1pNAf#Nwl4Dcj(=w8;8e)V5rX!xz01xts4}zG5G(n=?P?imTmRgyO z8Q&TDRB)Zu-6Alei)+#SR<&Gd({*ZTjvm?AP%j@W)WAg4lXnUtI(JEKtU$rI13I0b z&D5ww7|#l~ap`2Ey-->^rE2J=`v%(m9QX&x9GA?oO*&@2kkUP#u~%t17N*s5golYx zSKb!3{Awj|eF$pUOwKC;?IIew56E|~rDmNNi-)vL0xaeFCERA-rOGJwVv=6<5cd; z55Yx+h0%=YQ}a{Np|KYXvZek%mXaACXly;y`tNE86pXvCHXP_yhP|gi-J8I-3zmT6 zd>_jco`F=iHRfgDfS;|Dj_efnx)OcQEFLA-n~X`Nho1%Tl_~s`F12U%d<)2?^me8b zOHT8>C6lt0&Cf$b;oWbc>UtBoaeb+R&sMHIV>sO4N70NzyRx!r=yq z<=5aeROYY53G@gnm8XQL7%^xvIK1Pg3&gYOtis~!O$#_lGVzySJxA6mcT)UyY zn;jgtPyVTqsY+cDJR7Lm0pclZ7rA)Fkr(l^Yb3PQ{=fIPZP4E1X5c)nhkEh0Zlhm0 zBTiYN5n9p;6y#I!`^?(yC$$!olo0I0DB?lv`NXbuMRlsh(-d~<1U2Xfg z64(Km36=Y<{QL`B~38RiMEHV4xfInx(>fjt5*S+HbFL zoz)setglNzkGR0DFMZ`G`4vuVZP-GSakTZusVfo}U6do%U((rd?Snw;otIUjixoy% zIseWHUuMxur9mm|SsP07U)==%oo$0!t1_N(_c5fVRC5}fWwxndZ_&R{d%<@VAuJho zi);xOvnrv+j>Ai_$1)=-lgg|N#$28 zY)|Jo^L}D5-JgV{Bp>1Gm!LH!sBOdWlT~T7`mhwO8VQU(YXRV3gK{f!;8Q;YQ81~f z#IDoc=Pl*ip4XI>BgCqdn{PesHw}6f6Weu|BwRiM`47WI&!rcxapfdE2R5-k+qobA zmA%HknGjTy_3)+ckNesQ+MU48wx#0hRlefn3tX>XhsY<!Lv<(2_bSKKCbmkMnH5_Mbb}B(l*)~o4&9lb zS~a1gpE-hf5_}614VJfwM)}RBgLJ z{}8EoMSBUqC=;kb%L)y;F*;+q4k{0IPY`>Do93)&TUnUzqn{^4#wXnw#N_Qya}Ub3 z&4_Xf!CE8~FlTYk%Kvm)_TKol;#OIDDg9Kn-ssiF$WR(4aP$|RnBP@Cw`AXVhc47{9+iFK7u-;J_boe(xoWa${j$k8EAc+ZwMPQ^G)Jg<^6z+y^aD)%1Lzs9dH| z%UybjKsFy~wVW~Y@Nz~zMy=V`0BU&gd7cecYidk1D~pA0aX{L!cH{>su#NKmCEb}< z2uC)o-DVIhff3K5T4HD@vo^Ibatv!}4;Hkns5NTehcbzTgcMu?c@&e=4X@zQwVZzP zBUmJ0OHvh@lPUAm_T6p{K94IIniTf%J*xK)`$iP1%|coDdrY&7Vv^A*9vQ&7$}WKb z`HM$H1sS z-z*XsLs*kMFVA$}ujm`IVww*-IO4K?AdR(T)$bgSq>RE!cJekicw`#@sEx`{Lpo5* z8hY|)+-F24z@<>vjLn@LH|)qcS_6;*qU;-Fb~BN8S8OzwF-&UcMHlT;8&7Z&Z!bz4 zLEo$B`l5uY4_so=vcV01E0BCj(I1cBexE|?b&h96CmtO94Jc!?zBWj*PHU<396?49Bo4ozXm+ zcsuC)2Ng^>!Z;BZajz>ukVVmfo4=NuOJ~aQ5Hl2v#>F_=C}g7jr@i0<*ODi>d%jh- z5_`ptK9~er89E_i-dek?mYR*whs1MVDBRG?w^WblAqHkjaae9ZK#1sZgEfsl``wKI z)~EMuV2M|mnxCt3z9Mwj1|dFVRDBu!W4(9zuhgfWttWUw-`s*zMpj!k%)~y=JX&E{ ztIU?ku6NV+q!u7#hZW6*i{$LIc$f_)DI*vMbo!>4c0d9&X@!XNxZjErw{kQB<>A{4 z^K@SU!tFyezgOHYPKJloJ93|3lu@E4%@aPoXd?kSh@sT5!4&T=_ZhZ9TojmEF=2AX zpy19>6vxO*GD?}kd$L9wG^tJGK$&!(mjOi6B^7C)L*@-ZD8T^Uy%#ss8YVw?@&Rt@ zcrc303BT-85M!&%df0*e0o0Rhz)f~YL8M!7`z~a?QldU|gWQT4EtrDgfb$uTe|{D; zG&M!&b}9?7Yn`%9QDPXPqO1$}>+6Y(ZkRu+vM!q-a?|fgglPxs!s@RB{k?w6c=Q61 zTQ||hq*igJ51f*EA0$vl3Gv`pphzlM&tn4^kCRxU#cMZj=7ay-ExEb+9-+@AT%Vm0 z3q8Z^qu}k*&OdK?@n)I2e@>O28INTu^!UBWtp|Wwj@6OhET)9{+hiv50y9*Tm8ChW z)U<6yjlrBvNtBp)nTy4Fz*D~!Q}LEk%60#vsa?xacm=Eb&Xe|TK4m$j&A{v0PTHRT ziI2N_e07dR7g2q-U6(t-%2`{YsYYFMUr)4&QxU)1^oM8IrL>mESWbsRHg7$WAN_D- zk4XX5n3>~EO(_?sw$i}$_lyge+B+TP{2|!P84(dblDC_XJf0Wa&NwlBi}}!2kc26| z9rnx@nulg&?4|~(ArcNeF_IB<#or1e&hLKiSR&hxt% z1=+_vs~Y)dFW4?U)2Muz5Ix!jov|-*ScXCM@W~03`T%p#`MZ)S5_z2&OBE+QMES9x zuNLebjyQyQliUGVbACrgRt!m?0ZxoajHwT1YgVgeCt4Dd4t~wwuUhCH#Qa2eJ^E#^ zJ1&8RMq-1ytP7qF|E->&n=ryVFp^2>OEP@~AZrYtoQDO6uSY`;1Pl4I@ct^OOcDcG zd+>l=R0m$9@x*R%p9p#p6Zl)NW_id;yGx+jsKM9ZKRGs|5RM=1m9V3^@Q}^vi0%VR z(0#vWLxL|!^?O8X!C0xa%ufXip4CRvYHtnt2m_l%kWnCd0VsDkNjF0DSu~7Kl(IcI&T-; zjrjgBQU2iU3GeIvRok6LAl@C-V_@EdbQ#ofjEqz9o_c9lKlw49u4-P1HBXUA0t%m_yrtJG<_mVb}O$jrsc#buV+7L|=B1 z6i$Vo(z6XbYkHFa*)+QYIVhH&WRccQNaC!7q3Cv}#Ue!JHfz$n5ZRV17V0Crsm5*@ z-)G1IWU$}|GkIDqOL;~6?zV3Grdg`6^n;j1BGJ$=;|n5=ksv8?O!5A9 zMG!dXrJ(n+KdGz8LZJ4Tw2sHp-iW?~8Hn&Ml|lgG+_8*{52rT8Ii>up-im@iroeh3 z$<6s$TRlnrt`wt;j*v&hP=Lb)cJrgcLQcFzvdXl8q3hoc>s;V|9Nj*`N@iDBnWji*|qH=_GbZyrN%y$Qt}sZ$9((J0<~PtsGqvFU|0-Nz|n7-a*P2 z8Mlny9Xg|#_&~1EeRf{12V{<Gwms*4XDvS69JJ|6%(CKx3N-Yx;7c@O*n)rPFWn zx|HOU?Zs`T;h27mj*sNEA}ZMTvwf4FkS_mHk7I%uU{@A3CI#a8x37r~}2f zH0z?&c($2e&R!qfu)OyakQmAoNB07{_;a(Nm zVd_r&kvGUbuiV;#jS>a6GqaAxD5SQj{bP&nx0+o}0x-bxU}eFPHBjNg$=d$iZVw)( z+Ugyc1NRMKhL$e-X*nX|kCG3WGzCTUbR8C&iz>15z^8=yaut|Z^DCQW=P-YKJd=$@ zqwby%a>OAj&G$+wcQCXu6dx$?E?+4T4fy;UKPIl*pj;ZQu(R?~@-msV(pcI5Z8q5v z#}mO2Q-DN^w@W=AB%r!E#eu482J$uv?Z%cXZ)#JMgKmm%#%JQW%-BvND+|r`E0%p1 z@5nfZ01R!&rJAG3vqjw2w_9*_S>RO-uMI&xNmNA%bS>aEdUjLnUrK-()bO?Jlk%H%xG*4S@Q-1NR^)Q& z(6Cr3+=Y;|Eh}9i?|IZQFB2vrux1;(RaPNPXBk*k_y;Nr_wQOkGPCvfcd@6wzBzJp zFYUMhTJn3g;HTD?$kjSaqcy$G=28GYX)LiYa6szd6tjxO&%t2Xt`Tl&qrHplr0ucd zZnA&HH}dPd3-FQ7@#7kWtsz3hVNhn})dOBjB6f=(Nl`}0z+Ql7{3*mrSzr7B-v016Xbx?Ze)o-rnejoi#yQOBK z2^@|q&WD0$Ndg;LpH?j?|DUj@+C=mm;;j0>9JwAHEKow6>dE&uxiEgP07(a+q^AbDa4OSURzst^7Y=pQ%+VS*Eq%1Wku&FF|^=7M(E9$*2OM9Y*1qe4A zzQLQrrb&kTQJdwi{u9cB*(g`DdV=1E3~%r)tDN|TT-xc!iE9kl|4{r8B;UYrlKvak z9%85Q8PUkpO3UhV9PTc$TYWvFBgr-k`LK_2ZuKX$Thg+(KW=rNwNbTWv%M1zjgQF& z=|N4wSK1`SW&CXkCXd8DNzf-y3HiHtDAf;)vQKYMc%i)wwucWrue%thpV&5*5`~(F z+K4LTWrEFXeD{)%n7sa6KBJ;3Be;XP4q`)_#?g}qp2V8a*EK7~_c#4zD3kKs5)v55 zKrrpe6o%=wA}RxOXR~C?F?X2V1CY5M;f&;W78IT1LM0+p8s=bfMD`~mg7!TbbrCsx z%br} ziqv1#afqwIXj)@`sQYK&+b;{8D$`Cl#?qnqam3$IpqOL`YOO!EuUqAEiyi_{|Dl7PJIW7E9v zm79ka>Yx9}p)y9j5q=!9GgkR4I){CYGFbt;dUhWdb_A8EjC%deJG zE%87F3dv_zyFm%i@roCKeC{*VK35zs5}ZKZTf-#_d`U_CX4bmrW%3Cq{{N6Ny}+)4 zVl`7piMu6OT{KjelVsW5RGpCWyDVL#BXTRV!9%&RuBjL%0+KhCn&x$lC#Q&h{L36y zLw3jm!?~>30TD60nCfQ5Vr7dUt}iUc3B~yfi0$YiL{uJujhq5o`ISfh4MdzN4*_Y*lucE3B9^TCo&1h&t*16Gv=vMI)j=$8Q_zmZu0;k`TAtVAb>CQMG zH{CQnj6j7k+D0j}*fo$N+NR-sfOgUXQ>1|XgY>AhnBldNZmD!Ss7TO{P3h1-^7(#m z1}<`AG^yk~rLR{Vdh_R#Q8)&cCZRJ!n0a(6mZmvQUwchmO>b*&T2MWW7V~Ilf zhQ)_NU?t1F%ZgRgm|{A`rnhjAQs(r!02X3WPywSjQt>-M^pAGN9|+1(H`)}Q=v@E)rR zSjJw%40TB&;3$B~0kS2^y>3axhjsI>R7jwTTyC)_8(z=azAqa70(um}wl$tRvKMUT4sGmC+SGwl8T(!$ys zA#JnIU99{CHs`xpfslajD8lfze5*ZJ5$#@pz&%G@UuMkGNJ`%vn`e`VPHCOW2(jd3 zAlnRzc@VZ2A=Hg;k?6;da}!cw+Q#(hW~l5gjm6)We)xZmJ`K^31Dl7#v%yeal*s5s z`+g@V;$DU=&f*rLHqaHi-inW;LHlNVOENIT5?=!_m&YNVAfBTq)muuLT6*O30EHEN z%U7IzNM_v>fVf1%kvXN#yp26XI)R%BA@p5K!*`Q9z5oKH?Z5@pHm!e^TJyxbPStxF z9aNL0yk~xaf4VFovD9$|oDu{V`RCy;G}9*EmP~0y;0iE^9H0*x1hT`R-jdmRlyZe8&EG!dOkymHBa*cdDLXp)1ClgtQKRxL|bL zk`4kafB-Xr4itvH85_k}2U<0XsoT$B8!Xf8>p@s4rJ7(A3SP_!*%4FwN(e*k zgNVXuO}9H&&HO68**kkdIpU2)EX6mhY;1ZLTh*QHxsPu4OO8;iG=WCxkeQJ4IoXEgISR8x{3bq<3Qq{}q)qL! zArv)q1dfi;65YsjrOS$g#czTVH|5n8O2SA?bs8CvN?qSiTXeq|3o2Q~MunK_vcl~} zZ%puQk>dKgByi;qMOV5X=g2BhFu^I_Cxye)2Sq@&L$Mz(WbXbOj@1LdevI^c$jh;Bg=J42i0eCd#>51_u+q$PD3)uGp{Je7x1K z#$b$pfwDZW3Ez+h{{-QiRtJ;)yJgV=5|sH2J@AC!YPgnveeEpS;CsF4aKrI6GKkI) zaLK@S{rn;kgRIqGosLuo3t$s(1(}akr?fo*FbxBBGLmFP0w8v|9LN;)Ebn3F?`Wb( zZ>Oo2+J%zzd~O{+^88i_H`QCFx=+3<_n2foH`$)g<3iBR@N8S8$zb&Fo0L(!{{;75 z&}}G*&6=cFUX+aDn|0ZY;J^dQ>H<-9iCiG}iy_%*+N*ONb!g~woRG$q{KkFrnUiH3`ZF?=mlZesm>RBz2-ScyH`UctA&z~QDda>pac=i z@%(6EPp=O^CtFPAzd=v}Vf*Wi9%#eUK(eeS0nprguLYJSc`F>BmtOV-^Hx0g3pHQK z;uZi9d#@V&ry}eLkQ?cCwB>ozBX!6Y0nt&v@uR&`jvx=b^7av>o!kZ?DTUrG+r^`cNk(eG&aKbC@k^eFHf7qr79`FHgxsC9@|6%{X0~-g zo}8Na((IGGMTeRB1(tLsnlyQdpb8LoOjVXQD!&o!|CsRjJ2 zm*Dr=;50FzDZoX_GTVnfa3?I1+l<2S`W!DVt24zp8IW zQV80Vi-fG=cHZkQI!`^dv#4Q5f&=4cfjug6=LRU~5FnbR7wpE)Q6CjUM(6dhiNZ!mb;b zJres2qRl-{D?Gmso?+89NE?JU)|0jy8g`sIa(SSZ(UlLrEDEK!k$l?(p_Hy|f~xJX zxO_^`)+;N}elvUCj!L!c)u1;O^V8@Nc&*ziK{<5zdER~c!xw2eT6zyuTs-&MY>3lM z@JOsQT0HQu2AR?cK3SBj-rl%Gh4IEr^NIvRbJOK zH4I(#*Yxw#lHYyyvfJHPFmW|RLP_3Wg*qcwpW}<{ncbrWc<1Y~V}q?~tH;pYqhn3m zAvNyhMCHtQv3`yuC^~|W^MnOSCiNl-r6B)p_bTeZ_if6`TEeob;;_yzb`&*CsPFiz z5X6c_tyxY|q5d=foCUGqdy*HQPC1nrL>6>u)>Kd2Ig@%p9&}S%tW=R=dInk|%-rQz z6PwEp+o(P*_ogScG`!PfQyNPm4}0ZS5%2ye?43fC?4N-(_8c8D$l?LFKobmQ{))Qz z8UMt?X*Z^BGMn+$>@r@c-aWwl^$ zW2LfKA(6+~NiP4=%=m4hq=>R>$-vE4>~CF#$!P0`2BDG?KG+pf*f9&9y<-GD8cRR} zsM62=FhLvYFfCI$l0TCTkPUt0$Y*lZ9Sw9?uIaIT9tFOQTevZjtBXkNlFWtnTXq`Z zZ+OcVMW|3HMc6};N!IguKEd;9PtJt4zfOqxu*}3U(2(t@sv_PFua^y$*qe3wg+ee= z)!#FI6htp3Q_h)#YAJM&G{{P?d)HI$F2mBRFx$E1T;90CM1QS>NLixIwL>m#yasJ8 zmXw92$(|O8z?fd=vF8*iaS752MG%0rIfPW*cHFF7(-USK^h#6UttDG2{9ti#wX2yI zq!b?a@$CmDTg1s++IS-5C|$`PEls&Wm4*4jmB6!4Fxs_|21izB}}5NkN} zdy~D%cky$^$3MgsbB^kuAx4JT2HRC5ZKZDUC?6`z4)}o)tf5zRDnbOzj>O89^^Jr3^JgKwUUC0Si76q>faP~0D8#ww(p@G7l(|e=$&C9_^SWAIGJpguZyE6OUgb4; zKmuvw(gVX!y#6Z^vEGNl^o%9dt45mNB8`{S5V(|CL4b*Q+lXl5f57r}8p-qKYMmh3 zv!J|SP_wp95Ud&F%(`LX503S9D#iQTL8%p9-y`8yKoFP)1gKWi)R!;T+0-#3q4KcZ z?dL4}66&b$+v$S&rGeK-;L2JwO1x>?5WeGkemeb1(=gh-d6*l&5TGcun;NK|8CJHE z{1@G@SZvzgT4NL9BA8n^X{xD-^{d4vcc&rwDn~B{Ilf6h0FQ^6#TUNnykQS}xykhaqTWG<>MNyZAXper51yNm{A z-Wpr{I`f+=uOYGM_biQJe8)b%3q6u&kuLq9iiC#|quw;1SWVXC2dvQ%qnKB;uOH8@Z&${&Rl8?ldAsUCNV|S1K8wOm2664(TWVoBNT?F zkh?oyel{4m5vXM$F&}@T1VE{sd60t^TPDbNT1@qB&6#v}>j7G?k~%?8-Z8bKy8?Pm zqZeXkW)GX)u~p~-ON%q~p2eI|kka)n9;QUyE3aSDC=K1JL%K=2{eY1|M6*zW3M3x; zm~0%6y@lztBBU44ghpnO7IQ3kGX->4;IctFjDiY;PD{iuaM{W;9y)bBK>GROA4rz`bt>$@AdAzN|ea>8pw_5$<(w0+QgH0+0EzHdOPU;$^eIum` z3oKbUnx#Hh2;qVB@Bm4fA==Kd%ALk`_p{6y*l-*}quxC~HS>#pdDk@Xgo^zM>!^g; zUcyA02!YRJ30}$=FgY5~fe87X@u8W^AiH)CCHn4!iYnFDFO1u6iCR z`}|nPC_6_*yfwh+9K0K>gf*m$Q7)5c1R+c-R*gY=|eU&z4 zRxd(iB=-RcO|19FEtiPU63@zLok!^2x2Qp#dEKD<&yz`|)?fWPYs-8=|Jf&CGLhhB z-T_~mkD2zO;HiA8vhQLNH9{2DV}~)%TdS}%`d%>v9nkv&Zr!WpTAiRnRGG`!a48Mo zA*DaUGu)CPcyX_87+He=J@8J`ogB&86-=T2D$4?pdKmh?z?a?QrAo z)c;{%xu>byK|^^wN5X0dhTML)|3;*%6s}kr#F`erjN8%`B0QidH4bKpF34iHt(2tn zwsp4Zw1NVH7wi+Ep$K1FNILt@vw9vj5E)w~r?8%x!h*$--bNiIQ&aGm;#w`FganSU ze>PQvZ;)1OB5JldEb#EO%FFlfnMv*tTdKiVc*6Z)S&f+_IU&>XiLi(Dtxf2^158TaQt}uYqd}@Io)UIrCZPkcf#Ep%FSFL4MTg(eCkj zCvbepapq@*!X!zO$iIX__pKNx0aKeK`ZPDxF?^0a)fFNS|G{8m$O7Srkpj1}?lzDf zMIhQdOq~kAD9NXn{QJ@VJg4A_NBn*w3J%cHcgU|v7TN)}kShOs^q)k>QN8K;K&_&i z^+=c1o`OfEO;UASw3m#4N7Dr8;{I3W!S(q2O1B4Q9cxlExY&~)$-y~as$)37)H6=jlWa9 zkvG*jVj8bua!XqIS(@Vh76xNI^Rp91hd_yLl&nNptuno@;*k1D=xuro?^Q|lR!$Z} zuOpZ>I&!dk-UVjmDlADH4Rb_%zZy)|uc6|rM=m3@PWDfY)9=99&-@rLDl9>u1n)k;f%svMNZH0^0Z%uIK}X=+i;$7>v)S)_iWFpkh+Ov zhWnP66>q0rU9r)Ft@&t+t`$IjGg2QDusCr=Ps9uR=yTBJPOvAIf0px{)w=cDHxK1X zaHb^}siH_B**!7h2I(ADb@^-@JH!eYM7FOMVHbi=sgiXJct+G_c0o*PSY4q#8cfj> zMP2kCXAQ;4J)<8UB$2=*$N3&{@e@9AKwgI+L!eHoX40s;CRMI+`s>($tH@p9@9`iI z)AXDM+d!=6Sqwe)?_H6{+75Oul@s8Z*)2Be6m#!vhS}M@fE`+if{>|Z35oYhqx+rf zc(IOt)<(;4zC20*qev|+P0F3M6-v0jtq3%1FHup?_Q?~LM4Fp88+&B$5v zr|ij;!)K&A{bhxqnbwI?Lv2hPGr#QUSUZTUbh336k;}eARX{nZGEqytTCFDpzXoGg zQI)I`_5-+=t%3 z*O#9j8`#F*B- zQ?4ZB@W1?abNo#Bjf{@UdMv5cAI;9tGP#@?`qqd*Lf>kE9o3QbsSIKnN^io7{I=5( zJHlrCSn&Z{tQUEFLOYx*HAsx>s#ZaH^#9oDaNsLv?>fgaMfifQrfme?aRFVVt`ku%SdDo*nwg*Q0!pEPpCgzdjV=Q7yz#$r9nFb1 zY{8}E(4&_f?bQL}n4sDwnEj??J-)~ z!}AT4dn1urB)HR6_>m+HZn|1I8b&?f3u=S&LW3^nedZqxiOI5;C^=>;GuM&|ofZCD z1C>5$*jWf}EEqUe*Ew23A(oS8kkA72%I^>)n7twEY7gbAL;tTGL0??=D}q6(s5dne zK+imqP}Vfthx6^rfKHrC38hq;0K2guH))jO9htEgEo&IWeb($|=S%k642~&b(oPmF zw(#mJkV~e9<$7!~QrK!B4*X8TYad_cZftd@0I5pJ3CYlHs=xN7elVKP>z@CrNSGKx z#%vA7Fk=nkSSIq}mS?@j9B(J`XPL)?d~s+_E=b)l&eVdHpH#PP{`$}X;?*+O{SOc1 zOeghQK3WmpMmY83Xwn3fC6(2Im0}BzCsR>K#zTvNbs_KGVycd@EVbb5B(16|SOH>Rtr@0^7f+dM0Nd$F~_%Co^^t>!*{JkcxU3?fC9LIz=+>%s4Jo8jBaY^QlMLFln62 z?!pt$Wa(qfHOR9#5K?&8`~N#dhVvKO`_=j~&^d{yi9zCQ{C{e)tSPoOUI2O~G4Q}j zF;)MpcaO=#B9zBVo-rz|RrTsi09S_DD?#ffTZXOrTb_{lIi+w`_YqGWxpm9xJ^4P< z%TjH1Q|l?UM+HX;BV76a;Yql&gYnk{)#ZN=XMMin`AzmDi7Amxoxof|dS$d13)&!0 zfRv3eJs<#DkMC9b7(KXonkdjPfdv(P?9!0Pv_${-vk9~!-ELV@Qlxn`Q1o8Xe0P4f5?=wIfEp@5{N$E{^I6L zZ?}vF>G=a0T@*xsQT$l3-j`{U9KjYW6(|g4I=@yFCe?h}j#C3%YHQYW0Rx{_mW0@C ze+8hgxnujw)B_HIBQ%a8bo1a$x(VXA{uY4emig7XBj=HXJxBQl+GX!-j}NH5=~b6| zfHO7X$in)q_GQhr0OHEaois?NClF#F=&_3di;RAg+2MX!li_u zqZd|T_2jM7d#U)F8@)&SfU<0lYyAzWzlM!pyFbL|YIUB&DU4=s<<6n={L&jg+#wg2{AU0Wq9bU+S54DbFdVX)L zw#;`CSWf!PGjs{TJE?zl`ftEStE`vW$(+K@Zxi!k#*sC*qEH}4ag#Cdm-0VS4@nVy zj?|>d1pM_OAQRal4=DT&navg>1ZfuFzYM@PFns+AyClWf_fSQ?;DZ2oissl;4~lOI zhw&djDYZE;CeqlcRP(|Lv<~P694Sr)<=a1A{vftuig(Vz(1s9V@vtFwGY!>=vLKG& zyI4xr8rc=8Cz9mbq&8m$7TZWCoB~XeNcprZ?+gGm;jV~<9%T0vyPVT6^{aM`+#&dU zY2S8j$KMEnuzX8vG-W&Oo|B6{xO0k}*tc+?!bMG>_8uP)*drf_OL{+2fPQUR zsUdko;cQEzjz-P}K#h!Rzbt$xs4P;7k!S_;Y$r;*MuZ;dIiP6YU7qoUDyZ9f;|=#7 ze2wVkT+C+;k5_gUKwChIoSZ`U$V^)o|6P4U>j^$n%q20R`XJ^XA%sp|-p$_Ojy* zAhnO}AQv477HP)5jCpQ7+Y&;7rU}HdEVj3Uk`Wo6K-G7{XFWEC_LwWu{l;3E5nl+t zCHE{ZBA<^324{YctnNyNk6JM|c1HxByJFB>DC2Kq*Iu=bzE)INQS#y@?6%NQ*bs)i z?K~oShOO~P$tt}f%t*aH4EaDf4F%9UsC_Xey##Y~CRhk7R?Dwxfw1?(cqo0R>ME)( z-~LrbB&?WxxY=aW_K8gweEjaHaeG#K5wZG|fcVNJ^Qg7GJXlwyVn%)=m}TWfw7tnZ{`LEaO8%wO};bm#YcvNG%<+znrosMa(R4Bl!G~?TlvE^Vh z(mh#hd|Lyk@FZmxBT+@9@wZQt*IN#On3tvRu_rf*((#_}U)Y#yKhu!4XMH*W6-%14 z1!ATE(A4f?yssi}1BeT<+kb6a?)m&ULYJ>9Kn(YaW_Xn;(3zn7=bW%)nx5~%>q&l7 zDjs94{aa$gp^P6zM%5@+*~Bu2m?4GYkZ7qRyjX$7eo`BLqo$f7@LQWP(z)nJdl!*cKN|m%Sai|zO+!iDtW!_2{XLI$7i+<oN}zuJuvCy8FvQp)NG&Fly?TI)oz!kRp>NyHC9GDvcgGsG%T8X?k~9DpR?nxODh zrUYlp-8Ee(IOB-^xkr-g(I5vIN@}!Ah1_|GM)M+G31CDIk4w`QB|rq<1q!m7A$A=U zcf*5c1`G3U)Jur$#QIO0<1!NTT2=(j1x#UYhxb*7*wmQ73HnfsL5nlSN0}H~%{yJ3 zd37O`UwgHRFRV+ym^T#X^!W7$^aT3*<9IV3(zBo7ux=}KWKy8UP&*g@DkontK_ ztjYXj9V~6TPM8+O+p880pWLZQhcpI5$dJER-OPVOPb15g#Ah0DVvnLQd2@k#$->dE zXs#c!&HDgk;+CKH4^x)drKBeb5r*@Shfc{KDYI*(B8|BXriE456M!d1n^M-@!*&y{ zRKo&9gEg?Q#@|`sZ90WG2%o9=_T`f_aw#Rz)_3n$;_%QUtX&)886Zz^PfPmVN)~A2 z1OJ4B)dV_`dqU;KkT*Mz$w|xfJuM_!6yGPKlTakhY(^QXQc{5KMdzC3HWsj;{49r1(L)3 z$J1<;;>MU~5>8NELE~VPIoFiZ97wt}U2(n`HAr6P@6*@t9b5YYj56!S_z`yFDzW7O~~NQsHC&DEg`U%_}^j7b(AL?>S-Am zj6UbCWk)q@*G9&x{7enBjFVE#D0Q3;5fkw zR-CiPMyU<`!~ZH=B{_N1@(&}saL6Po?GP)$hG<1L_j?@Gj^}P@hdb)lJT?}{XL0z9 zU||vMBy&+HPJn`7`YFTl(~n}E_68rTqRt&PXa!u5uUGtR{$9*$z2xPTt95|MO1-o; zpNhXRqmXmW!}D42O7^Tyl)Pzznrf zX_*-$4X@pAZmJ0H*Z{Zr&R+!LWS0MQ`PO0V( zCQhitBA4Dse5=B+*#6vl#cd@zujW&In=#%J)*1JY8}KrDvN(wdo z1q1)hJ*iSHe^rD2d8f3QBJOYysR#)}$=)-qtM(T1-s-uoJ`q3s=)3IidhNbH%8iOR z&D}IBn@XAxsfA^q&1SH=GQ-}?8OJFvIR!y_QHAxIao1Fd2GVu!c1+H)a=`e5+ajsc ziW`qgkw#o`ewBBiKNkMW@x)#rd|{d5;Hu`31Va6#jWrP%nqQPxyr?)$IMsGSdT*Xm zTbxQQMskw)D|`RV)xu~*7;{c%mFNjV+pQgQ$kLVDid4?q`CH-m~=O8 z{XAX0Oh+X~Tr9P&w7OyhvrrxcEf=8=IL+9~;t+l4-Y=P<>b=Ad=J0nA?8K&_NJV)y z$(4~JgM=X|Bu8n7A}yNL;EeB$ZA9k+q4T6Fk`2j;N7~NTkYQF@Xjgwf?sDJzd#sZFfjTE;EGx z*fFh&@Nf7)Ju#>YhYAiZBYYV5)t);HFZeZjC~<`7j!`OwlJrm4nCRH{0k7?`_H`At zwO{}M1J4F)pP!0;#Yj*?pawvk&jfhW5@ASw12O;5Zhv8*7>0NXo18-Xlz>AG23(ZH z0YMkMbJ(i@#qQ3wDXKwj}duUvJ&@1j!2d_rcv+(onkVrO>UW* PUjs_wTmdT}00000QDt<8 diff --git a/assets/作物/富贵竹/2.webp.import b/assets/作物/富贵竹/2.webp.import deleted file mode 100644 index 6d7dcd4..0000000 --- a/assets/作物/富贵竹/2.webp.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://5x2uq2r3yjms" -path="res://.godot/imported/2.webp-638bab14e5309cf618b4ad0d9893879c.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/作物/富贵竹/2.webp" -dest_files=["res://.godot/imported/2.webp-638bab14e5309cf618b4ad0d9893879c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.01 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -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=0 diff --git a/assets/作物/富贵竹/0.webp b/assets/作物/富贵竹/幼苗.webp similarity index 100% rename from assets/作物/富贵竹/0.webp rename to assets/作物/富贵竹/幼苗.webp diff --git a/assets/作物/富贵竹/0.webp.import b/assets/作物/富贵竹/幼苗.webp.import similarity index 71% rename from assets/作物/富贵竹/0.webp.import rename to assets/作物/富贵竹/幼苗.webp.import index 3a1e996..2163dff 100644 --- a/assets/作物/富贵竹/0.webp.import +++ b/assets/作物/富贵竹/幼苗.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://clfqb3o1k4rby" -path="res://.godot/imported/0.webp-a726644bf3d2533e1a0c1dab78519549.ctex" +path="res://.godot/imported/幼苗.webp-fc281ae82dc0894a59b7e69aa4caf221.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/富贵竹/0.webp" -dest_files=["res://.godot/imported/0.webp-a726644bf3d2533e1a0c1dab78519549.ctex"] +source_file="res://assets/作物/富贵竹/幼苗.webp" +dest_files=["res://.godot/imported/幼苗.webp-fc281ae82dc0894a59b7e69aa4caf221.ctex"] [params] diff --git a/assets/作物/富贵竹/1.webp b/assets/作物/富贵竹/未成熟.webp similarity index 100% rename from assets/作物/富贵竹/1.webp rename to assets/作物/富贵竹/未成熟.webp diff --git a/assets/作物/富贵竹/1.webp.import b/assets/作物/富贵竹/未成熟.webp.import similarity index 70% rename from assets/作物/富贵竹/1.webp.import rename to assets/作物/富贵竹/未成熟.webp.import index 3dd87cf..c010f9a 100644 --- a/assets/作物/富贵竹/1.webp.import +++ b/assets/作物/富贵竹/未成熟.webp.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bd3omqp1ps1hw" -path="res://.godot/imported/1.webp-e919d49ea2e08a7abff7233ed4b5039a.ctex" +path="res://.godot/imported/未成熟.webp-cdc0b439ef04abe0bed4481eaea3017c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/作物/富贵竹/1.webp" -dest_files=["res://.godot/imported/1.webp-e919d49ea2e08a7abff7233ed4b5039a.ctex"] +source_file="res://assets/作物/富贵竹/未成熟.webp" +dest_files=["res://.godot/imported/未成熟.webp-cdc0b439ef04abe0bed4481eaea3017c.ctex"] [params] diff --git a/assets/作物/小麦/2.webp b/assets/作物/小麦/2.webp deleted file mode 100644 index 4f7c29ebf3178ecf7863265a177b6f61a17f8117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37050 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 z zMypyqTS1s(@hwg$Hd(m+#KAY&`FgUkP|4l~arffB$FQ(p%T4*hGb53KsK?|Sqvbfrr+_9z>)ClK>MIVx=3kV#3e|U5Rzn2d+YCGO