diff --git a/SproutFarm-Frontend/.gitattributes b/.gitattributes similarity index 100% rename from SproutFarm-Frontend/.gitattributes rename to .gitattributes diff --git a/SproutFarm-Frontend/.gitignore b/.gitignore similarity index 100% rename from SproutFarm-Frontend/.gitignore rename to .gitignore diff --git a/SproutFarm-Backend/TCPGameServer.py b/SproutFarm-Backend/TCPGameServer.py index b5570f8..dc624ec 100644 --- a/SproutFarm-Backend/TCPGameServer.py +++ b/SproutFarm-Backend/TCPGameServer.py @@ -9,11 +9,13 @@ import datetime import re import random #导入服务器外置插件模块 -from SMYMongoDBAPI import SMYMongoDBAPI #导入MongoDB数据库模块 -from QQEmailSendAPI import EmailVerification#导入QQ邮箱发送模块 -from ConsoleCommandsAPI import ConsoleCommandsAPI #导入控制台命令API模块 -from SpecialFarm import SpecialFarmManager #导入特殊农场管理系统 -from WSRemoteCmdApi import WSRemoteCmdApi #导入WebSocket远程命令API +from module.SMYMongoDBAPI import SMYMongoDBAPI #导入MongoDB数据库模块 +from module.QQEmailSendAPI import EmailVerification#导入QQ邮箱发送模块 +from module import ConsoleCommandsAPI #导入控制台命令API模块 +from module.SpecialFarm import SpecialFarmManager #导入特殊农场管理系统 +from module import WSRemoteCmdApi #导入WebSocket远程命令API +from module.NetworkCore import MessageHandler +from module.WisdomTreeSystem import WisdomTreeMixin #导入网络通信核心模块 """ 萌芽农场TCP游戏服务器 @@ -28,7 +30,7 @@ server_port: int = 7070 buffer_size: int = 4096 server_version: str = "2.2.0" -class TCPGameServer(TCPServer): +class TCPGameServer(WisdomTreeMixin, TCPServer): """ 萌芽农场TCP游戏服务器 @@ -37,7 +39,6 @@ class TCPGameServer(TCPServer): #==========================初始化和生命周期管理========================== #初始化操作 def __init__(self, server_host=server_host, server_port=server_port, buffer_size=buffer_size): - """初始化TCP游戏服务器""" super().__init__(server_host, server_port, buffer_size) # 基础数据存储 @@ -65,6 +66,9 @@ class TCPGameServer(TCPServer): # 偷菜免被发现临时计数器 {玩家名: {目标玩家名: 剩余免被发现次数}} self.steal_immunity_counters = {} + # 初始化消息处理器 + self.message_handler = MessageHandler(self) + self.log('INFO', f"萌芽农场TCP游戏服务器初始化完成 - 版本: {server_version}", 'SERVER') # 清理配置缓存,确保使用最新的配置数据 @@ -85,7 +89,6 @@ class TCPGameServer(TCPServer): #初始化MongoDB API def _init_mongodb_api(self): - """初始化MongoDB API连接""" try: # 根据配置决定使用测试环境还是生产环境 # 检查是否在Docker容器中或生产环境 @@ -114,7 +117,6 @@ class TCPGameServer(TCPServer): #初始化杂草系统配置 def _init_weed_settings(self): - """初始化杂草生长配置""" # 杂草生长相关配置 self.weed_check_interval = 86400 # 杂草检查间隔(24小时) self.offline_threshold_days = 3 # 离线多少天后开始长杂草 @@ -124,7 +126,6 @@ class TCPGameServer(TCPServer): #初始化特殊农场管理系统 def _init_special_farm_manager(self): - """初始化特殊农场管理系统""" try: # 使用自动环境检测,确保与游戏服务器环境一致 self.special_farm_manager = SpecialFarmManager() @@ -140,7 +141,6 @@ class TCPGameServer(TCPServer): #初始化WebSocket远程命令API def _init_websocket_remote_api(self): - """初始化WebSocket远程命令API服务器""" try: # 创建WebSocket远程命令API实例 ws_host = "0.0.0.0" @@ -165,14 +165,12 @@ class TCPGameServer(TCPServer): #设置游戏服务器日志配置 def _setup_game_server_logging(self): - """设置游戏服务器日志配置,禁用父类重复输出""" # 禁用父类logger的传播,避免重复输出 if hasattr(self, 'logger') and self.logger: self.logger.propagate = False #启动作物生长计时器 def start_crop_growth_timer(self): - """启动作物生长计时器,每秒更新一次""" try: self.update_crops_growth() except Exception as e: @@ -185,7 +183,6 @@ class TCPGameServer(TCPServer): #启动杂草生长计时器 def start_weed_growth_timer(self): - """启动杂草生长计时器,每天检查一次""" try: current_time = time.time() # 检查是否到了杂草检查时间 @@ -199,9 +196,9 @@ class TCPGameServer(TCPServer): self.weed_timer = threading.Timer(3600, self.start_weed_growth_timer) # 每小时检查一次 self.weed_timer.daemon = True self.weed_timer.start() - + + #启动智慧树生命值衰减计时器 def start_wisdom_tree_health_decay_timer(self): - """启动智慧树生命值衰减定时器""" try: self.check_wisdom_tree_health_decay() except Exception as e: @@ -211,9 +208,9 @@ class TCPGameServer(TCPServer): self.wisdom_tree_decay_timer = threading.Timer(86400, self.start_wisdom_tree_health_decay_timer) # 每24小时检查一次 self.wisdom_tree_decay_timer.daemon = True self.wisdom_tree_decay_timer.start() - + + #启动验证码清理定时器 def start_verification_code_cleanup_timer(self): - """启动验证码清理定时器""" try: EmailVerification.clean_expired_codes() @@ -225,9 +222,9 @@ class TCPGameServer(TCPServer): 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 start_offline_crop_update_timer(self): - """启动离线玩家作物更新定时器""" try: self.update_offline_players_crops() except Exception as e: @@ -240,7 +237,6 @@ class TCPGameServer(TCPServer): #获取服务器统计信息 def get_server_stats(self): - """获取服务器统计信息""" online_players = len([cid for cid in self.user_data if self.user_data[cid].get("logged_in", False)]) return { "online_players": online_players, @@ -249,7 +245,6 @@ class TCPGameServer(TCPServer): #停止服务器 def stop(self): - """停止服务器""" self.log('INFO', "正在停止服务器...", 'SERVER') # 停止作物生长计时器 @@ -317,7 +312,6 @@ class TCPGameServer(TCPServer): #==========================客户端连接管理========================== #移除客户端 def _remove_client(self, client_id): - """覆盖客户端移除方法,添加用户离开通知和数据保存""" if client_id in self.clients: username = self.user_data.get(client_id, {}).get("username", client_id) @@ -355,7 +349,6 @@ class TCPGameServer(TCPServer): #==========================验证和检查方法========================== #检查用户是否已登录的通用方法 def _check_user_logged_in(self, client_id, action_name, action_type=None): - """检查用户是否已登录的通用方法""" if client_id not in self.user_data or not self.user_data[client_id].get("logged_in", False): self.log('WARNING', f"未登录用户 {client_id} 尝试{action_name}", 'SERVER') @@ -381,7 +374,6 @@ class TCPGameServer(TCPServer): #=================================数据管理方法==================================== #加载玩家数据 def load_player_data(self, account_id): - """从MongoDB加载玩家数据""" try: if not self.use_mongodb or not self.mongo_api: self.log('ERROR', 'MongoDB未配置或不可用,无法加载玩家数据', 'SERVER') @@ -400,7 +392,6 @@ class TCPGameServer(TCPServer): #保存玩家数据 def save_player_data(self, account_id, player_data): - """保存玩家数据到MongoDB""" try: if not self.use_mongodb or not self.mongo_api: self.log('ERROR', 'MongoDB未配置或不可用,无法保存玩家数据', 'SERVER') @@ -419,7 +410,6 @@ class TCPGameServer(TCPServer): #加载玩家数据 def _load_player_data_with_check(self, client_id, action_type=None): - """加载玩家数据并进行错误检查的通用方法""" username = self.user_data[client_id]["username"] player_data = self.load_player_data(username) @@ -443,13 +433,12 @@ class TCPGameServer(TCPServer): #加载作物配置数据(优化版本) def _clear_config_cache(self): - """清理配置缓存,强制重新加载""" self.crop_data_cache = None self.crop_data_cache_time = 0 self.log('INFO', "配置缓存已清理", 'SERVER') - + + #加载作物配置数据(优化版本) def _load_crop_data(self): - """加载作物配置数据(从MongoDB,带缓存优化)""" current_time = time.time() # 检查缓存是否有效 @@ -478,7 +467,6 @@ class TCPGameServer(TCPServer): #更新玩家登录时间 def _update_player_logout_time(self, client_id, username): - """更新玩家登出时间和总游玩时间""" login_timestamp = self.user_data[client_id].get("login_timestamp", time.time()) play_time_seconds = int(time.time() - login_timestamp) @@ -499,7 +487,6 @@ class TCPGameServer(TCPServer): #更新总游玩时间 def _update_total_play_time(self, player_data, play_time_seconds): - """更新总游玩时间""" total_time_str = player_data.get("总游玩时间", "0时0分0秒") time_parts = re.match(r"(?:(\d+)时)?(?:(\d+)分)?(?:(\d+)秒)?", total_time_str) @@ -519,7 +506,6 @@ class TCPGameServer(TCPServer): # 检查玩家是否享受新玩家注册奖励 def _is_new_player_bonus_active(self, player_data): - """检查玩家是否在新玩家奖励期内(注册后3天内享受10倍生长速度)""" register_time_str = player_data.get("注册时间", "") # 如果没有注册时间或者是默认的老玩家时间,则不享受奖励 @@ -544,9 +530,9 @@ class TCPGameServer(TCPServer): except ValueError as e: self.log('WARNING', f"解析注册时间格式错误: {register_time_str}, 错误: {str(e)}", 'SERVER') return False - + + #更新离线玩家的作物生长 def update_offline_players_crops(self): - """更新离线玩家的作物生长""" try: if not self.use_mongodb or not self.mongo_api: self.log('WARNING', 'MongoDB未配置或不可用,无法更新离线玩家作物', 'SERVER') @@ -593,7 +579,6 @@ class TCPGameServer(TCPServer): #================================作物系统管理========================================= #作物生长更新系统 def update_crops_growth(self): - """更新所有玩家的作物生长""" # 收集所有需要更新的玩家(在线玩家 + 被访问的玩家) players_to_update = set() @@ -628,7 +613,6 @@ class TCPGameServer(TCPServer): #更新单个玩家的作物 def update_player_crops(self, player_data, account_id): - """更新单个玩家的作物""" growth_updated = False for farm_lot in player_data.get("农场土地", []): @@ -691,7 +675,6 @@ class TCPGameServer(TCPServer): #向在线玩家推送作物生长更新 def _push_crop_update_to_player(self, account_id, player_data): - """向在线玩家推送作物生长更新""" client_id = self._find_client_by_username(account_id) if client_id: @@ -708,7 +691,6 @@ class TCPGameServer(TCPServer): #根据用户名查找客户端ID def _find_client_by_username(self, username): - """根据用户名查找客户端ID""" for cid, user_info in self.user_data.items(): if user_info.get("username") == username and user_info.get("logged_in", False): return cid @@ -716,7 +698,6 @@ class TCPGameServer(TCPServer): #发送访问模式的更新 def _send_visiting_update(self, client_id, visiting_target): - """发送访问模式的更新""" target_player_data = self.load_player_data(visiting_target) if target_player_data: target_client_id = self._find_client_by_username(visiting_target) @@ -733,7 +714,6 @@ class TCPGameServer(TCPServer): #发送正常模式的更新 def _send_normal_update(self, client_id, player_data): - """发送正常模式的更新""" update_message = { "type": "crop_update", "农场土地": player_data.get("农场土地", []), @@ -744,7 +724,6 @@ class TCPGameServer(TCPServer): #向正在访问某个玩家农场的其他玩家推送更新 def _push_update_to_visitors(self, target_username, target_player_data): - """向正在访问某个玩家农场的其他玩家推送更新""" for visitor_client_id, visitor_info in self.user_data.items(): if not visitor_info.get("logged_in", False): continue @@ -775,153 +754,8 @@ class TCPGameServer(TCPServer): # =======================服务端与客户端通信注册========================================== #服务端与客户端通用消息处理-这个是服务端与客户端通信的核心中的核心 def _handle_message(self, client_id, message): - """接收客户端消息并路由到对应处理函数""" - message_type = message.get("type", "") - - # 用户认证相关 - if message_type == "greeting":#默认欢迎 - return self._handle_greeting(client_id, message) - elif message_type == "login":#玩家登录 - return self._handle_login(client_id, message) - elif message_type == "register":#玩家注册 - 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) - - #--------------------------------------------------------------------------- - # 游戏操作相关 - elif message_type == "harvest_crop":#收获作物 - return self._handle_harvest_crop(client_id, message) - elif message_type == "plant_crop":#种植作物 - return self._handle_plant_crop(client_id, message) - elif message_type == "buy_seed":#购买种子 - return self._handle_buy_seed(client_id, message) - elif message_type == "buy_item":#购买道具 - return self._handle_buy_item(client_id, message) - elif message_type == "buy_pet":#购买宠物 - return self._handle_buy_pet(client_id, message) - elif message_type == "rename_pet":#重命名宠物 - return self._handle_rename_pet(client_id, message) - elif message_type == "set_patrol_pet":#设置巡逻宠物 - return self._handle_set_patrol_pet(client_id, message) - elif message_type == "set_battle_pet":#设置出战宠物 - return self._handle_set_battle_pet(client_id, message) - elif message_type == "update_battle_pet_data":#更新宠物对战数据 - return self._handle_update_battle_pet_data(client_id, message) - elif message_type == "feed_pet":#喂食宠物 - return self._handle_feed_pet(client_id, message) - elif message_type == "dig_ground":#开垦土地 - return self._handle_dig_ground(client_id, message) - elif message_type == "remove_crop":#铲除作物 - return self._handle_remove_crop(client_id, message) - elif message_type == "water_crop":#浇水 - return self._handle_water_crop(client_id, message) - elif message_type == "fertilize_crop":#施肥 - return self._handle_fertilize_crop(client_id, message) - elif message_type == "use_item":#使用道具 - return self._handle_use_item(client_id, message) - elif message_type == "upgrade_land":#升级土地 - return self._handle_upgrade_land(client_id, message) - elif message_type == "buy_new_ground":#添加新的土地 - return self._handle_buy_new_ground(client_id, message) - elif message_type == "like_player":#点赞玩家 - return self._handle_like_player(client_id, message) - elif message_type == "request_online_players":#请求在线玩家 - return self._handle_online_players_request(client_id, message) - elif message_type == "get_play_time":#获取游玩时间 - return self._handle_get_play_time(client_id) - elif message_type == "update_play_time":#更新游玩时间 - return self._handle_update_play_time(client_id) - elif message_type == "request_player_rankings":#请求玩家排行榜 - return self._handle_player_rankings_request(client_id, message) - elif message_type == "request_crop_data":#请求作物数据 - return self._handle_crop_data_request(client_id) - elif message_type == "request_item_config":#请求道具配置数据 - return self._handle_item_config_request(client_id) - elif message_type == "request_pet_config":#请求宠物配置数据 - return self._handle_pet_config_request(client_id) - elif message_type == "request_game_tips_config":#请求游戏小提示配置数据 - return self._handle_game_tips_config_request(client_id) - elif message_type == "visit_player":#拜访其他玩家农场 - return self._handle_visit_player_request(client_id, message) - elif message_type == "return_my_farm":#返回我的农场 - return self._handle_return_my_farm_request(client_id, message) - elif message_type == "daily_check_in":#每日签到 - return self._handle_daily_check_in_request(client_id, message) - elif message_type == "get_check_in_data":#获取签到数据 - return self._handle_get_check_in_data_request(client_id, message) - elif message_type == "lucky_draw":#幸运抽奖 - return self._handle_lucky_draw_request(client_id, message) - elif message_type == "claim_new_player_gift":#领取新手大礼包 - return self._handle_new_player_gift_request(client_id, message) - elif message_type == "get_online_gift_data":#获取在线礼包数据 - return self._handle_get_online_gift_data_request(client_id, message) - elif message_type == "claim_online_gift":#领取在线礼包 - return self._handle_claim_online_gift_request(client_id, message) - elif message_type == "ping":#客户端ping请求 - return self._handle_ping_request(client_id, message) - elif message_type == "modify_account_info":#修改账号信息 - return self._handle_modify_account_info_request(client_id, message) - elif message_type == "delete_account":#删除账号 - return self._handle_delete_account_request(client_id, message) - elif message_type == "refresh_player_info":#刷新玩家信息 - return self._handle_refresh_player_info_request(client_id, message) - elif message_type == "global_broadcast":#全服大喇叭消息 - return self._handle_global_broadcast_message(client_id, message) - elif message_type == "request_broadcast_history":#请求全服大喇叭历史消息 - return self._handle_request_broadcast_history(client_id, message) - elif message_type == "use_pet_item":#宠物使用道具 - return self._handle_use_pet_item(client_id, message) - elif message_type == "use_farm_item":#农场道具使用 - return self._handle_use_farm_item(client_id, message) - elif message_type == "buy_scare_crow":#购买稻草人 - return self._handle_buy_scare_crow(client_id, message) - elif message_type == "modify_scare_crow_config":#修改稻草人配置 - return self._handle_modify_scare_crow_config(client_id, message) - elif message_type == "get_scare_crow_config":#获取稻草人配置 - return self._handle_get_scare_crow_config(client_id, message) - elif message_type == "wisdom_tree_operation":#智慧树操作 - return self._handle_wisdom_tree_operation(client_id, message) - elif message_type == "wisdom_tree_message":#智慧树消息 - 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 == "save_game_settings":#保存游戏设置 - return self._handle_save_game_settings(client_id, message) - elif message_type == "pet_battle_result":#宠物对战结果 - return self._handle_pet_battle_result(client_id, message) - elif message_type == "today_divination":#今日占卜 - return self._handle_today_divination(client_id, message) - elif message_type == "give_money":#送金币 - return self._handle_give_money_request(client_id, message) - elif message_type == "sync_bag_data":#同步背包数据 - return self._handle_sync_bag_data(client_id, message) - #--------------------------------------------------------------------------- - - # 管理员操作相关 - elif message_type == "kick_player":#踢出玩家 - return self._handle_kick_player(client_id, message) - - elif message_type == "message":#处理聊天消息(暂未实现) - return self._handle_chat_message(client_id, message) - else: - return super()._handle_message(client_id, message) + # 使用NetworkCore模块的MessageHandler处理消息 + return self.message_handler.handle_message(client_id, message) # =======================服务端与客户端通信注册========================================== @@ -930,7 +764,6 @@ class TCPGameServer(TCPServer): #==========================用户认证相关========================== #处理问候消息 def _handle_greeting(self, client_id, message): - """处理问候消息""" content = message.get("content", "") self.log('INFO', f"收到来自客户端 {client_id} 的问候: {content}", 'CLIENT') @@ -964,7 +797,6 @@ class TCPGameServer(TCPServer): #处理玩家登录 def _handle_login(self, client_id, message): - """处理登录消息""" username = message.get("username", "") password = message.get("password", "") client_version = message.get("client_version", "") @@ -1056,7 +888,7 @@ class TCPGameServer(TCPServer): self.log('INFO', f"玩家 {username} 每日点赞次数已重置:{remaining_likes}", 'SERVER') # 检查并清理在线礼包历史数据 - self._cleanup_online_gift_history(player_data) + self._cleanup_online_gift_history(player_data ) # 检查并清理新手礼包历史数据 self._cleanup_new_player_gift_history(player_data) @@ -1115,8 +947,7 @@ class TCPGameServer(TCPServer): return self.send_data(client_id, response) #辅助函数-发送登录后初始数据 - def _send_initial_login_data(self, client_id, player_data): - """发送登录后的初始数据""" + def _send_initial_login_data(self, client_id, player_data ): # 立即向客户端发送一次作物状态 farm_lots = player_data.get("农场土地", []) initial_crop_update = { @@ -1147,7 +978,6 @@ class TCPGameServer(TCPServer): } self.send_data(client_id, item_config_message) self.log('INFO', f"已向登录用户发送道具配置数据,道具种类:{len(item_config)}", 'SERVER') - #处理注册消息 def _handle_register(self, client_id, message): @@ -1205,7 +1035,6 @@ class TCPGameServer(TCPServer): "status": "failed", "message": message }) - #辅助函数-创建新用户 def _create_new_user(self, client_id, username, password, farm_name, player_name): @@ -1257,7 +1086,8 @@ class TCPGameServer(TCPServer): except Exception as e: self.log('ERROR', f"注册用户 {username} 时出错: {str(e)}", 'SERVER') return self._send_register_error(client_id, f"注册过程中出现错误: {str(e)}") - + + #辅助函数-确保玩家数据包含所有必要字段 def _ensure_player_data_fields(self, player_data): """确保玩家数据包含所有必要字段""" # 确保农场地块存在 @@ -1976,7 +1806,8 @@ class TCPGameServer(TCPServer): "quality": quality, "count": seed_count }) - + + # 添加成熟物到玩家作物仓库 def _add_crop_to_warehouse(self, player_data, crop_harvest): """将成熟物添加到玩家作物仓库""" if not crop_harvest: @@ -2053,7 +1884,8 @@ class TCPGameServer(TCPServer): "quality": quality, "count": seed_count }) - + + # 添加成熟物到玩家作物仓库(优化版本) def _add_crop_to_warehouse_optimized(self, player_data, crop_harvest, warehouse_item_name, quality="普通"): """将成熟物添加到玩家作物仓库(优化版本)""" if not crop_harvest: @@ -2083,6 +1915,7 @@ class TCPGameServer(TCPServer): #==========================杂草生长处理========================== + # 定期检查并生长杂草 def check_and_grow_weeds(self): """检查所有玩家的离线时间,并在长时间离线玩家的空地上随机生长杂草""" try: @@ -2170,7 +2003,8 @@ class TCPGameServer(TCPServer): except Exception as e: self.log('ERROR', f"杂草生长检查过程中出错: {str(e)}", 'SERVER') - + + #检查玩家是否长时间不在线 def _is_player_long_offline(self, player_data, current_time): """检查玩家是否长时间离线""" # 获取玩家最后登录时间 @@ -2193,7 +2027,8 @@ class TCPGameServer(TCPServer): except Exception as e: self.log('ERROR', f"解析玩家登录时间时出错: {str(e)}", 'SERVER') return False - + + #为指定玩家的空地生长杂草 def _grow_weeds_for_player(self, player_data, account_id, available_weeds): """为指定玩家的空地生长杂草""" import random @@ -2251,10 +2086,12 @@ class TCPGameServer(TCPServer): #==========================偷菜免被发现计数器管理========================== + # 玩家免被发现计数器结构:{player_name: {target_player_name: count, ...}, ...} def _get_steal_immunity_count(self, player_name, target_player_name): """获取玩家对目标玩家的免被发现次数""" return self.steal_immunity_counters.get(player_name, {}).get(target_player_name, 0) - + + #消耗一次免被发现次数 def _consume_steal_immunity(self, player_name, target_player_name): """消耗一次免被发现次数""" if player_name not in self.steal_immunity_counters: @@ -2277,7 +2114,8 @@ class TCPGameServer(TCPServer): return True return False - + + #设置免被发现次数(默认3次) def _set_steal_immunity(self, player_name, target_player_name, count=3): """设置玩家对目标玩家的免被发现次数""" if player_name not in self.steal_immunity_counters: @@ -2285,13 +2123,15 @@ class TCPGameServer(TCPServer): self.steal_immunity_counters[player_name][target_player_name] = count self.log('INFO', f"为玩家 {player_name} 设置对 {target_player_name} 的免被发现次数: {count}", 'SERVER') - + + #清理免被发现计数器 def _clear_player_steal_immunity(self, player_name): """清理玩家的所有免被发现计数器""" if player_name in self.steal_immunity_counters: del self.steal_immunity_counters[player_name] self.log('INFO', f"清理玩家 {player_name} 的所有免被发现计数器", 'SERVER') - + + #清理特定目标的免被发现计数器 def _clear_target_steal_immunity(self, player_name, target_player_name): """清理玩家对特定目标的免被发现计数器""" if player_name in self.steal_immunity_counters: @@ -2523,7 +2363,8 @@ class TCPGameServer(TCPServer): # 处理宠物购买 return self._process_pet_purchase(client_id, player_data, username, pet_name, validation_result["pet_info"]) - + + #验证宠物购买条件 def _validate_pet_purchase(self, pet_name, pet_cost, player_data): """验证宠物购买条件""" # 加载宠物配置 @@ -2581,7 +2422,8 @@ class TCPGameServer(TCPServer): "宠物背包": player_data["宠物背包"] } }) - + + #创建宠物实例 def _create_pet_instance(self, pet_info, username, pet_name): """创建宠物实例""" import copy @@ -2639,7 +2481,8 @@ class TCPGameServer(TCPServer): except Exception as e: self.log('ERROR', f"从MongoDB加载宠物配置失败: {str(e)}", 'SERVER') return {} - + + #加载游戏小提示配置数据 def _load_game_tips_config(self): """从MongoDB加载游戏小提示配置数据""" try: @@ -4164,7 +4007,8 @@ class TCPGameServer(TCPServer): "道具背包": player_data["道具背包"] } }) - + + #辅助函数-将道具添加到背包 def _add_item_to_inventory(self, player_data, item_name, quantity): """将道具添加到玩家背包""" if "道具背包" not in player_data: @@ -4205,6 +4049,7 @@ class TCPGameServer(TCPServer): #==========================道具使用处理========================== + #处理使用道具请求 def _handle_use_item(self, client_id, message): """处理使用道具请求""" # 检查用户是否已登录 @@ -4238,7 +4083,8 @@ class TCPGameServer(TCPServer): else: # 正常模式:对自己的作物使用道具 return self._handle_normal_item_use(client_id, player_data, username, lot_index, item_name, use_type) - + + #辅助函数-处理道具使用逻辑 def _handle_normal_item_use(self, client_id, player_data, username, lot_index, item_name, use_type): """处理正常模式下的道具使用""" if lot_index < 0 or lot_index >= len(player_data.get("农场土地", [])): @@ -4246,7 +4092,8 @@ class TCPGameServer(TCPServer): lot = player_data["农场土地"][lot_index] return self._process_item_use_normal(client_id, player_data, username, lot, lot_index, item_name, use_type) - + + #辅助函数-处理访问模式道具使用逻辑 def _handle_visiting_item_use(self, client_id, player_data, username, target_username, lot_index, item_name, use_type): """处理访问模式下的道具使用""" target_player_data = self.load_player_data(target_username) @@ -4258,7 +4105,8 @@ class TCPGameServer(TCPServer): target_lot = target_player_data["农场土地"][lot_index] return self._process_item_use_visiting(client_id, player_data, username, target_player_data, target_username, target_lot, lot_index, item_name, use_type) - + + #辅助函数-检查玩家是否拥有指定道具 def _has_item_in_inventory(self, player_data, item_name): """检查玩家是否拥有指定道具""" item_bag = player_data.get("道具背包", []) @@ -4266,7 +4114,8 @@ class TCPGameServer(TCPServer): if item.get("name", "") == item_name and item.get("count", 0) > 0: return True return False - + + #辅助函数-从玩家背包中移除指定道具 def _remove_item_from_inventory(self, player_data, item_name, count=1): """从玩家道具背包中移除指定数量的道具""" item_bag = player_data.get("道具背包", []) @@ -4277,7 +4126,8 @@ class TCPGameServer(TCPServer): item_bag.pop(i) return True return False - + + #处理正常模式下的道具使用逻辑 def _process_item_use_normal(self, client_id, player_data, username, lot, lot_index, item_name, use_type): """处理正常模式下的道具使用""" # 检查地块状态 @@ -4312,7 +4162,8 @@ class TCPGameServer(TCPServer): return self._use_harvest_item(client_id, player_data, username, lot, lot_index, item_name) else: return self._send_action_error(client_id, "use_item", f"不支持的使用类型: {use_type}") - + + #处理访问模式下的道具使用逻辑 def _process_item_use_visiting(self, client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index, item_name, use_type): """处理访问模式下的道具使用""" # 检查地块状态 @@ -4347,7 +4198,8 @@ class TCPGameServer(TCPServer): return self._use_harvest_item_visiting(client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index, item_name) else: return self._send_action_error(client_id, "use_item", f"不支持的使用类型: {use_type}") - + + #使用施肥类道具 def _use_fertilizer_item(self, client_id, player_data, username, lot, lot_index, item_name): """使用施肥类道具""" # 检查是否已经施过肥 @@ -4416,7 +4268,8 @@ class TCPGameServer(TCPServer): "道具背包": player_data["道具背包"] } }) - + + #使用浇水类道具 def _use_watering_item(self, client_id, player_data, username, lot, lot_index, item_name): """使用浇水类道具""" # 移除道具 @@ -4481,7 +4334,8 @@ class TCPGameServer(TCPServer): "道具背包": player_data["道具背包"] } }) - + + #访问模式下使用施肥类道具 def _use_fertilizer_item_visiting(self, client_id, current_player_data, current_username, target_player_data, target_username, target_lot, lot_index, item_name): """访问模式下使用施肥类道具""" # 检查是否已经施过肥 @@ -6590,7 +6444,7 @@ class TCPGameServer(TCPServer): }) #==========================访问其他玩家农场处理========================== - #==========================访问系统处理========================== +# ==========================返回自己农场处理========================== def _update_visit_system(self, target_username, visitor_username): """更新被访问玩家的访问系统数据""" try: @@ -7437,39 +7291,39 @@ class TCPGameServer(TCPServer): -#==========================聊天消息处理========================== - #处理聊天消息(暂未完成) - def _handle_chat_message(self, client_id, message): - """处理聊天消息""" - # 检查用户是否已登录 - logged_in, response = self._check_user_logged_in(client_id, "发送聊天消息") - if not logged_in: - return self.send_data(client_id, response) +# #==========================聊天消息处理========================== +# #处理聊天消息(暂未完成) +# def _handle_chat_message(self, client_id, message): +# """处理聊天消息""" +# # 检查用户是否已登录 +# logged_in, response = self._check_user_logged_in(client_id, "发送聊天消息") +# if not logged_in: +# return self.send_data(client_id, response) - content = message.get("content", "") - if not content.strip(): - return self.send_data(client_id, { - "type": "chat_response", - "success": False, - "message": "消息内容不能为空" - }) +# content = message.get("content", "") +# if not content.strip(): +# return self.send_data(client_id, { +# "type": "chat_response", +# "success": False, +# "message": "消息内容不能为空" +# }) - username = self.user_data[client_id]["username"] +# username = self.user_data[client_id]["username"] - # 广播聊天消息给所有在线用户 - chat_message = { - "type": "chat_message", - "username": username, - "content": content, - "timestamp": time.time() - } +# # 广播聊天消息给所有在线用户 +# chat_message = { +# "type": "chat_message", +# "username": username, +# "content": content, +# "timestamp": time.time() +# } - self.broadcast(chat_message) - self.log('INFO', f"用户 {username} 发送聊天消息: {content}", 'SERVER') +# self.broadcast(chat_message) +# self.log('INFO', f"用户 {username} 发送聊天消息: {content}", 'SERVER') - return True +# return True -#==========================聊天消息处理========================== +# #==========================聊天消息处理========================== @@ -8256,7 +8110,6 @@ class TCPGameServer(TCPServer): #生成幸运抽奖奖励 def _generate_lucky_draw_rewards(self, count: int, draw_type: str, config: dict): """生成幸运抽奖奖励""" - import random # 加载作物配置 crop_data = self._load_crop_data() @@ -9001,711 +8854,7 @@ class TCPGameServer(TCPServer): #==========================稻草人系统处理========================== -#==========================智慧树系统处理========================== - def _handle_wisdom_tree_operation(self, client_id, message): - """处理智慧树操作请求""" - # 检查用户是否已登录 - logged_in, response = self._check_user_logged_in(client_id, "智慧树操作", "wisdom_tree_operation") - if not logged_in: - return self.send_data(client_id, response) - - # 获取玩家数据 - player_data, username, response = self._load_player_data_with_check(client_id, "wisdom_tree_operation") - if not player_data: - return self.send_data(client_id, response) - - operation_type = message.get("operation_type", "") - - # 检查并修复智慧树配置格式 - self._check_and_fix_wisdom_tree_config(player_data, username) - - # 获取修复后的智慧树配置 - wisdom_tree_config = player_data["智慧树配置"] - - # 处理不同的操作类型 - if operation_type == "water": - return self._process_wisdom_tree_water(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "fertilize": - return self._process_wisdom_tree_fertilize(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "kill_grass": - return self._process_wisdom_tree_kill_grass(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "kill_bug": - return self._process_wisdom_tree_kill_bug(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "play_music": - return self._process_wisdom_tree_play_music(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "revive": - return self._process_wisdom_tree_revive(client_id, player_data, username, wisdom_tree_config) - elif operation_type == "get_random_message": - return self._process_wisdom_tree_get_random_message(client_id, player_data, username, wisdom_tree_config) - else: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "未知的智慧树操作类型", - "operation_type": operation_type - }) - - def _process_wisdom_tree_water(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树浇水""" - # 检查智慧树是否死亡 - if wisdom_tree_config["当前生命值"] <= 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树已死亡,请先复活!", - "operation_type": "water" - }) - - # 浇水费用 - water_cost = 100 - - # 检查金钱是否足够 - if player_data["钱币"] < water_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,浇水需要 {water_cost} 金币", - "operation_type": "water" - }) - - # 执行浇水 - player_data["钱币"] -= water_cost - - # 浇水经验:50-150随机 - import random - exp_gained = random.randint(50, 150) - wisdom_tree_config["当前经验值"] += exp_gained - - # 浇水高度:40%概率增加1-2高度 - height_gained = 0 - if random.random() < 0.4: # 40%概率 - height_gained = random.randint(1, 2) - wisdom_tree_config["高度"] = min(100, wisdom_tree_config["高度"] + height_gained) - - # 检查等级提升 - level_up_occurred = self._check_wisdom_tree_level_up(wisdom_tree_config) - - # 保存数据 - self.save_player_data(username, player_data) - - height_msg = f",高度+{height_gained}" if height_gained > 0 else "" - self.log('INFO', f"玩家 {username} 给智慧树浇水,花费 {water_cost} 金币,经验+{exp_gained}{height_msg}", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": f"浇水成功!经验+{exp_gained}{height_msg}", - "operation_type": "water", - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_fertilize(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树施肥""" - # 检查智慧树是否死亡 - if wisdom_tree_config["当前生命值"] <= 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树已死亡,请先复活!", - "operation_type": "fertilize" - }) - - # 施肥费用 - fertilize_cost = 200 - - # 检查金钱是否足够 - if player_data["钱币"] < fertilize_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,施肥需要 {fertilize_cost} 金币", - "operation_type": "fertilize" - }) - - # 执行施肥 - player_data["钱币"] -= fertilize_cost - - # 施肥经验:10-40随机 - import random - exp_gained = random.randint(10, 40) - wisdom_tree_config["当前经验值"] += exp_gained - - # 施肥高度:80%概率增加1-7高度 - height_gained = 0 - if random.random() < 0.8: # 80%概率 - height_gained = random.randint(1, 7) - wisdom_tree_config["高度"] = min(100, wisdom_tree_config["高度"] + height_gained) - - # 检查等级提升 - level_up_occurred = self._check_wisdom_tree_level_up(wisdom_tree_config) - - # 保存数据 - self.save_player_data(username, player_data) - - height_msg = f",高度+{height_gained}" if height_gained > 0 else "" - self.log('INFO', f"玩家 {username} 给智慧树施肥,花费 {fertilize_cost} 金币,经验+{exp_gained}{height_msg}", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": f"施肥成功!经验+{exp_gained}{height_msg}", - "operation_type": "fertilize", - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_kill_grass(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树除草""" - # 检查智慧树是否死亡 - if wisdom_tree_config["当前生命值"] <= 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树已死亡,请先复活!", - "operation_type": "kill_grass" - }) - - # 除草费用 - kill_grass_cost = 150 - - # 检查金钱是否足够 - if player_data["钱币"] < kill_grass_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,除草需要 {kill_grass_cost} 金币", - "operation_type": "kill_grass" - }) - - # 执行除草 - import time - player_data["钱币"] -= kill_grass_cost - max_health = wisdom_tree_config["最大生命值"] - wisdom_tree_config["当前生命值"] = min(max_health, wisdom_tree_config["当前生命值"] + 10) - wisdom_tree_config["距离上一次除草时间"] = int(time.time()) - - # 保存数据 - self.save_player_data(username, player_data) - - self.log('INFO', f"玩家 {username} 给智慧树除草,花费 {kill_grass_cost} 金币,生命值+10", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": "除草成功!生命值+10", - "operation_type": "kill_grass", - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_kill_bug(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树杀虫""" - # 检查智慧树是否死亡 - if wisdom_tree_config["当前生命值"] <= 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树已死亡,请先复活!", - "operation_type": "kill_bug" - }) - - # 杀虫费用 - kill_bug_cost = 150 - - # 检查金钱是否足够 - if player_data["钱币"] < kill_bug_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,杀虫需要 {kill_bug_cost} 金币", - "operation_type": "kill_bug" - }) - - # 执行杀虫 - player_data["钱币"] -= kill_bug_cost - max_health = wisdom_tree_config["最大生命值"] - wisdom_tree_config["当前生命值"] = min(max_health, wisdom_tree_config["当前生命值"] + 15) - wisdom_tree_config["距离上一次杀虫时间"] = int(time.time()) - - # 保存数据 - self.save_player_data(username, player_data) - - self.log('INFO', f"玩家 {username} 给智慧树杀虫,花费 {kill_bug_cost} 金币,生命值+15", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": "杀虫成功!生命值+15", - "operation_type": "kill_bug", - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_play_music(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树放音乐""" - # 检查智慧树是否死亡 - if wisdom_tree_config["当前生命值"] <= 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树已死亡,请先复活!", - "operation_type": "play_music" - }) - - # 放音乐费用 - play_music_cost = 100 - - # 检查金钱是否足够 - if player_data["钱币"] < play_music_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,放音乐需要 {play_music_cost} 金币", - "operation_type": "play_music" - }) - - # 执行放音乐 - player_data["钱币"] -= play_music_cost - - # 从智慧树消息库中随机获取一条消息 - random_message = self._get_random_wisdom_tree_message() - if random_message: - wisdom_tree_config["智慧树显示的话"] = random_message.get("content", "") - - # 保存数据 - self.save_player_data(username, player_data) - - self.log('INFO', f"玩家 {username} 给智慧树放音乐,花费 {play_music_cost} 金币,获得随机消息", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": "放音乐成功!获得了一条神秘消息", - "operation_type": "play_music", - "random_message": random_message, - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_revive(self, client_id, player_data, username, wisdom_tree_config): - """处理智慧树复活""" - # 检查智慧树是否真的死亡 - if wisdom_tree_config["当前生命值"] > 0: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "智慧树还活着,不需要复活!", - "operation_type": "revive" - }) - - # 复活费用 - revive_cost = 1000 - - # 检查金钱是否足够 - if player_data["钱币"] < revive_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": f"金钱不足,复活智慧树需要 {revive_cost} 金币", - "operation_type": "revive" - }) - - # 执行复活 - player_data["钱币"] -= revive_cost - wisdom_tree_config["当前生命值"] = wisdom_tree_config["最大生命值"] - - # 保存数据 - self.save_player_data(username, player_data) - - self.log('INFO', f"玩家 {username} 复活了智慧树,花费 {revive_cost} 金币", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": "智慧树复活成功!", - "operation_type": "revive", - "updated_data": { - "钱币": player_data["钱币"], - "智慧树配置": wisdom_tree_config - } - }) - - def _process_wisdom_tree_get_random_message(self, client_id, player_data, username, wisdom_tree_config): - """处理获取随机智慧树消息""" - # 从智慧树消息库中随机获取一条消息 - random_message = self._get_random_wisdom_tree_message() - - if random_message: - wisdom_tree_config["智慧树显示的话"] = random_message.get("content", "") - - # 保存数据 - self.save_player_data(username, player_data) - - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": True, - "message": "获得了一条神秘消息", - "operation_type": "get_random_message", - "random_message": random_message, - "updated_data": { - "智慧树配置": wisdom_tree_config - } - }) - else: - return self.send_data(client_id, { - "type": "wisdom_tree_operation_response", - "success": False, - "message": "暂时没有新消息", - "operation_type": "get_random_message" - }) - - def _handle_wisdom_tree_message(self, client_id, message): - """处理智慧树消息发送请求""" - # 检查用户是否已登录 - logged_in, response = self._check_user_logged_in(client_id, "发送智慧树消息", "wisdom_tree_message") - if not logged_in: - return self.send_data(client_id, response) - - # 获取玩家数据 - player_data, username, response = self._load_player_data_with_check(client_id, "wisdom_tree_message") - if not player_data: - return self.send_data(client_id, response) - - message_content = message.get("message", "").strip() - - # 验证消息内容 - if not message_content: - return self.send_data(client_id, { - "type": "wisdom_tree_message_response", - "success": False, - "message": "消息内容不能为空" - }) - - if len(message_content) > 100: - return self.send_data(client_id, { - "type": "wisdom_tree_message_response", - "success": False, - "message": "消息长度不能超过100个字符" - }) - - # 发送消息费用 - send_cost = 50 - - # 检查金钱是否足够 - if player_data["钱币"] < send_cost: - return self.send_data(client_id, { - "type": "wisdom_tree_message_response", - "success": False, - "message": f"金钱不足,发送消息需要 {send_cost} 金币" - }) - - # 扣除费用 - player_data["钱币"] -= send_cost - - # 保存消息到智慧树消息库 - success = self._save_wisdom_tree_message(username, message_content) - - if success: - # 保存玩家数据 - self.save_player_data(username, player_data) - - self.log('INFO', f"玩家 {username} 发送智慧树消息,花费 {send_cost} 金币:{message_content}", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_message_response", - "success": True, - "message": "消息发送成功!", - "updated_data": { - "钱币": player_data["钱币"] - } - }) - else: - return self.send_data(client_id, { - "type": "wisdom_tree_message_response", - "success": False, - "message": "消息发送失败,请重试" - }) - - def _handle_get_wisdom_tree_config(self, client_id, message): - """处理获取智慧树配置请求""" - # 检查用户是否已登录 - logged_in, response = self._check_user_logged_in(client_id, "获取智慧树配置", "get_wisdom_tree_config") - if not logged_in: - return self.send_data(client_id, response) - - # 获取玩家数据 - player_data, username, response = self._load_player_data_with_check(client_id, "get_wisdom_tree_config") - if not player_data: - return self.send_data(client_id, response) - - # 检查并修复智慧树配置 - self._check_and_fix_wisdom_tree_config(player_data, username) - - # 保存修复后的数据 - self.save_player_data(username, player_data) - - # 返回智慧树配置 - wisdom_tree_config = player_data.get("智慧树配置", {}) - - self.log('INFO', f"玩家 {username} 请求智慧树配置", 'SERVER') - - return self.send_data(client_id, { - "type": "wisdom_tree_config_response", - "success": True, - "config": wisdom_tree_config - }) - - def _check_wisdom_tree_level_up(self, wisdom_tree_config): - """检查智慧树等级提升""" - current_level = wisdom_tree_config["等级"] - current_experience = wisdom_tree_config["当前经验值"] - max_experience = wisdom_tree_config["最大经验值"] - level_ups = 0 - - # 检查是否可以升级(最高等级20) - while current_level < 20 and current_experience >= max_experience: - # 升级 - current_level += 1 - current_experience -= max_experience # 扣除升级所需经验 - level_ups += 1 - - # 计算新等级的最大经验值 - max_experience = self._calculate_wisdom_tree_max_exp(current_level) - - self.log('INFO', f"智慧树等级提升到 {current_level} 级,新的最大经验值: {max_experience}", 'SERVER') - - # 每升一级,最大生命值+2,当前生命值也+2 - if level_ups > 0: - health_bonus = level_ups * 2 - wisdom_tree_config["最大生命值"] = min(200, wisdom_tree_config["最大生命值"] + health_bonus) - wisdom_tree_config["当前生命值"] = min(wisdom_tree_config["最大生命值"], wisdom_tree_config["当前生命值"] + health_bonus) - self.log('INFO', f"智慧树升级 {level_ups} 级,最大生命值+{health_bonus}", 'SERVER') - - # 更新配置 - wisdom_tree_config["等级"] = current_level - wisdom_tree_config["当前经验值"] = current_experience - wisdom_tree_config["最大经验值"] = max_experience - - return level_ups > 0 - - def _get_random_wisdom_tree_message(self): - """从智慧树消息库中随机获取一条消息""" - import os - import json - import random - - # 优先从MongoDB读取 - if hasattr(self, 'mongo_api') and self.mongo_api and self.mongo_api.is_connected(): - try: - wisdom_tree_data = self.mongo_api.get_wisdom_tree_config() - if wisdom_tree_data: - messages = wisdom_tree_data.get("messages", []) - if messages: - selected_message = random.choice(messages) - self.log('INFO', f"成功从MongoDB获取智慧树消息", 'SERVER') - return selected_message - else: - return None - except Exception as e: - self.log('ERROR', f"从MongoDB读取智慧树消息失败: {e}", 'SERVER') - - # 回退到JSON文件 - wisdom_tree_data_path = os.path.join(os.path.dirname(__file__), "config", "wisdom_tree_data.json") - - try: - with open(wisdom_tree_data_path, 'r', encoding='utf-8') as f: - wisdom_tree_data = json.load(f) - - messages = wisdom_tree_data.get("messages", []) - if messages: - selected_message = random.choice(messages) - self.log('INFO', f"成功从JSON文件获取智慧树消息", 'SERVER') - return selected_message - else: - return None - except Exception as e: - self.log('ERROR', f"从JSON文件读取智慧树消息失败: {e}", 'SERVER') - return None - - def _save_wisdom_tree_message(self, username, message_content): - """保存智慧树消息到消息库""" - import os - import json - import time - import uuid - - # 创建新消息 - new_message = { - "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), - "sender": username, - "content": message_content, - "id": str(uuid.uuid4()) - } - - # 优先保存到MongoDB - if hasattr(self, 'mongo_api') and self.mongo_api and self.mongo_api.is_connected(): - try: - # 获取现有数据 - wisdom_tree_data = self.mongo_api.get_wisdom_tree_config() - if not wisdom_tree_data: - wisdom_tree_data = { - "messages": [], - "total_messages": 0, - "last_update": "" - } - - # 添加新消息 - wisdom_tree_data["messages"].append(new_message) - wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) - wisdom_tree_data["last_update"] = new_message["timestamp"] - - # 保持最多1000条消息 - if len(wisdom_tree_data["messages"]) > 1000: - wisdom_tree_data["messages"] = wisdom_tree_data["messages"][-1000:] - wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) - - # 保存到MongoDB - if self.mongo_api.update_wisdom_tree_config(wisdom_tree_data): - self.log('INFO', f"成功保存智慧树消息到MongoDB: {username}", 'SERVER') - return True - else: - self.log('ERROR', f"保存智慧树消息到MongoDB失败: {username}", 'SERVER') - except Exception as e: - self.log('ERROR', f"MongoDB保存智慧树消息异常: {e}", 'SERVER') - - # 回退到JSON文件 - wisdom_tree_data_path = os.path.join(os.path.dirname(__file__), "config", "wisdom_tree_data.json") - - try: - # 读取现有数据 - if os.path.exists(wisdom_tree_data_path): - with open(wisdom_tree_data_path, 'r', encoding='utf-8') as f: - wisdom_tree_data = json.load(f) - else: - wisdom_tree_data = { - "messages": [], - "total_messages": 0, - "last_update": "" - } - - # 添加到消息列表 - wisdom_tree_data["messages"].append(new_message) - wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) - wisdom_tree_data["last_update"] = new_message["timestamp"] - - # 保持最多1000条消息 - if len(wisdom_tree_data["messages"]) > 1000: - wisdom_tree_data["messages"] = wisdom_tree_data["messages"][-1000:] - wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) - - # 保存数据 - with open(wisdom_tree_data_path, 'w', encoding='utf-8') as f: - json.dump(wisdom_tree_data, f, ensure_ascii=False, indent=4) - - self.log('INFO', f"成功保存智慧树消息到JSON文件: {username}", 'SERVER') - return True - except Exception as e: - self.log('ERROR', f"保存智慧树消息到JSON文件失败: {e}", 'SERVER') - return False - - def check_wisdom_tree_health_decay(self): - """检查智慧树生命值衰减""" - import time - import random - - current_time = int(time.time()) - processed_count = 0 - - # 检查所有在线玩家 - for client_id in self.user_data: - if self.user_data[client_id].get("logged_in", False): - username = self.user_data[client_id]["username"] - player_data = self.load_player_data(username) - if player_data and "智慧树配置" in player_data: - self._process_wisdom_tree_decay(player_data["智慧树配置"], username) - self.save_player_data(username, player_data) - processed_count += 1 - - # 注释:缓存机制已移除,只处理在线玩家的智慧树衰减 - - if processed_count > 0: - self.log('INFO', f"已处理 {processed_count} 个玩家的智慧树生命值衰减", 'SERVER') - - def _process_wisdom_tree_decay(self, wisdom_tree_config, username): - """处理单个玩家的智慧树生命值衰减""" - import time - import random - - current_time = int(time.time()) - - # 获取上次除草和杀虫时间,处理空字符串和无效值 - last_grass_time_raw = wisdom_tree_config.get("距离上一次除草时间", current_time) - last_bug_time_raw = wisdom_tree_config.get("距离上一次杀虫时间", current_time) - - # 处理空字符串和无效时间戳 - try: - last_grass_time = int(last_grass_time_raw) if last_grass_time_raw and str(last_grass_time_raw).strip() else current_time - except (ValueError, TypeError): - last_grass_time = current_time - - try: - last_bug_time = int(last_bug_time_raw) if last_bug_time_raw and str(last_bug_time_raw).strip() else current_time - except (ValueError, TypeError): - last_bug_time = current_time - - # 如果时间戳无效(为0或负数),设置为当前时间 - if last_grass_time <= 0: - last_grass_time = current_time - if last_bug_time <= 0: - last_bug_time = current_time - - # 检查是否3天没有除草 - days_since_grass = (current_time - last_grass_time) / 86400 # 转换为天数 - if days_since_grass >= 3: - # 计算应该衰减的天数 - decay_days = int(days_since_grass) - if decay_days > 0: - # 每天减少1-3血量 - total_decay = 0 - for _ in range(decay_days): - daily_decay = random.randint(1, 3) - total_decay += daily_decay - - wisdom_tree_config["当前生命值"] = max(0, wisdom_tree_config["当前生命值"] - total_decay) - self.log('INFO', f"玩家 {username} 的智慧树因{decay_days}天未除草,生命值减少{total_decay}", 'SERVER') - - # 更新除草时间为当前时间,避免重复扣血 - wisdom_tree_config["距离上一次除草时间"] = current_time - - # 检查是否3天没有杀虫 - days_since_bug = (current_time - last_bug_time) / 86400 # 转换为天数 - if days_since_bug >= 3: - # 计算应该衰减的天数 - decay_days = int(days_since_bug) - if decay_days > 0: - # 每天减少1-3血量 - total_decay = 0 - for _ in range(decay_days): - daily_decay = random.randint(1, 3) - total_decay += daily_decay - - wisdom_tree_config["当前生命值"] = max(0, wisdom_tree_config["当前生命值"] - total_decay) - self.log('INFO', f"玩家 {username} 的智慧树因{decay_days}天未杀虫,生命值减少{total_decay}", 'SERVER') - - # 更新杀虫时间为当前时间,避免重复扣血 - wisdom_tree_config["距离上一次杀虫时间"] = current_time -#==========================智慧树系统处理========================== + #==========================作物出售处理========================== @@ -10344,8 +9493,7 @@ class TCPGameServer(TCPServer): def console_input_thread(server): """控制台输入处理线程""" - import threading - import sys + # 等待服务器完全启动 time.sleep(0.5) @@ -10394,7 +9542,6 @@ if __name__ == "__main__": print("=" * 60) print(f"📡 服务器地址: {server_host}:{server_port}") print(f"📦 缓冲区大小: {buffer_size} bytes") - print(f"🔧 性能优化: 已启用") print("=" * 60) # 创建并启动游戏服务器 diff --git a/SproutFarm-Backend/TCPServer.py b/SproutFarm-Backend/TCPServer.py index d663409..ddff91f 100644 --- a/SproutFarm-Backend/TCPServer.py +++ b/SproutFarm-Backend/TCPServer.py @@ -242,7 +242,7 @@ class TCPServer: try: # 解析JSON消息 message = json.loads(message_text) - self.log('INFO', f"从客户端 {client_id} 接收JSON: {message}", 'CLIENT') + #self.log('INFO', f"从客户端 {client_id} 接收JSON: {message}", 'CLIENT') # 处理消息 - 实现自定义逻辑 self._handle_message(client_id, message) diff --git a/SproutFarm-Backend/__pycache__/CropSystem.cpython-313.pyc b/SproutFarm-Backend/__pycache__/CropSystem.cpython-313.pyc deleted file mode 100644 index dc2adc4..0000000 Binary files a/SproutFarm-Backend/__pycache__/CropSystem.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/__pycache__/DataManager.cpython-313.pyc b/SproutFarm-Backend/__pycache__/DataManager.cpython-313.pyc deleted file mode 100644 index bb01c17..0000000 Binary files a/SproutFarm-Backend/__pycache__/DataManager.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/__pycache__/QQEmailSend.cpython-313.pyc b/SproutFarm-Backend/__pycache__/QQEmailSend.cpython-313.pyc deleted file mode 100644 index 5cf6b2a..0000000 Binary files a/SproutFarm-Backend/__pycache__/QQEmailSend.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/__pycache__/TCPGameServer.cpython-313.pyc b/SproutFarm-Backend/__pycache__/TCPGameServer.cpython-313.pyc index 770abc7..9b1b022 100644 Binary files a/SproutFarm-Backend/__pycache__/TCPGameServer.cpython-313.pyc and b/SproutFarm-Backend/__pycache__/TCPGameServer.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/TCPGameServer_New.cpython-313.pyc b/SproutFarm-Backend/__pycache__/TCPGameServer_New.cpython-313.pyc deleted file mode 100644 index 1cc9b8e..0000000 Binary files a/SproutFarm-Backend/__pycache__/TCPGameServer_New.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/__pycache__/TCPServer.cpython-313.pyc b/SproutFarm-Backend/__pycache__/TCPServer.cpython-313.pyc index 6938e54..c0a3d2a 100644 Binary files a/SproutFarm-Backend/__pycache__/TCPServer.cpython-313.pyc and b/SproutFarm-Backend/__pycache__/TCPServer.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/UserAuth.cpython-313.pyc b/SproutFarm-Backend/__pycache__/UserAuth.cpython-313.pyc deleted file mode 100644 index 17305d1..0000000 Binary files a/SproutFarm-Backend/__pycache__/UserAuth.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/__pycache__/web_admin.cpython-313.pyc b/SproutFarm-Backend/__pycache__/web_admin.cpython-313.pyc deleted file mode 100644 index d456750..0000000 Binary files a/SproutFarm-Backend/__pycache__/web_admin.cpython-313.pyc and /dev/null differ diff --git a/SproutFarm-Backend/module.zip b/SproutFarm-Backend/module.zip new file mode 100644 index 0000000..208dc81 Binary files /dev/null and b/SproutFarm-Backend/module.zip differ diff --git a/SproutFarm-Backend/ConsoleCommandsAPI.py b/SproutFarm-Backend/module/ConsoleCommandsAPI.py similarity index 99% rename from SproutFarm-Backend/ConsoleCommandsAPI.py rename to SproutFarm-Backend/module/ConsoleCommandsAPI.py index c937080..e32f885 100644 --- a/SproutFarm-Backend/ConsoleCommandsAPI.py +++ b/SproutFarm-Backend/module/ConsoleCommandsAPI.py @@ -11,7 +11,8 @@ import json import sys from typing import Dict, Any, List, Optional from datetime import datetime -from SMYMongoDBAPI import SMYMongoDBAPI +#自定义包 +from .SMYMongoDBAPI import SMYMongoDBAPI class ConsoleCommandsAPI: """控制台命令处理类""" diff --git a/SproutFarm-Backend/module/NetworkCore.py b/SproutFarm-Backend/module/NetworkCore.py new file mode 100644 index 0000000..3dbaec7 --- /dev/null +++ b/SproutFarm-Backend/module/NetworkCore.py @@ -0,0 +1,183 @@ +""" +网络通信核心模块 +==================================================================== +- 负责处理客户端与服务端之间的消息路由 +- 将消息类型映射到对应的处理函数 +- 提供统一的消息处理接口 +==================================================================== +""" + +class MessageHandler: + """ + 消息处理器类 + 负责将客户端消息路由到对应的处理函数 + """ + + def __init__(self, server_instance): + """ + 初始化消息处理器 + + Args: + server_instance: 服务器实例,用于调用具体的处理方法 + """ + self.server = server_instance + + def handle_message(self, client_id, message): + """ + 接收客户端消息并路由到对应处理函数 + 这是服务端与客户端通信的核心中的核心 + + Args: + client_id: 客户端ID + message: 消息内容(字典格式) + + Returns: + 处理结果 + """ + message_type = message.get("type", "") + + # 用户认证相关 + if message_type == "greeting": # 默认欢迎 + return self.server._handle_greeting(client_id, message) + elif message_type == "login": # 玩家登录 + return self.server._handle_login(client_id, message) + elif message_type == "register": # 玩家注册 + return self.server._handle_register(client_id, message) + elif message_type == "request_verification_code": # 验证码请求 + return self.server._handle_verification_code_request(client_id, message) + elif message_type == "request_forget_password_verification_code": # 忘记密码验证码请求 + return self.server._handle_forget_password_verification_code_request(client_id, message) + elif message_type == "reset_password": # 重置密码 + return self.server._handle_reset_password_request(client_id, message) + elif message_type == "verify_code": # 验证码 + return self.server._handle_verify_code(client_id, message) + + # --------------------------------------------------------------------------- + # 游戏操作相关 + elif message_type == "harvest_crop": # 收获作物 + return self.server._handle_harvest_crop(client_id, message) + elif message_type == "plant_crop": # 种植作物 + return self.server._handle_plant_crop(client_id, message) + elif message_type == "buy_seed": # 购买种子 + return self.server._handle_buy_seed(client_id, message) + elif message_type == "buy_item": # 购买道具 + return self.server._handle_buy_item(client_id, message) + elif message_type == "buy_pet": # 购买宠物 + return self.server._handle_buy_pet(client_id, message) + elif message_type == "rename_pet": # 重命名宠物 + return self.server._handle_rename_pet(client_id, message) + elif message_type == "set_patrol_pet": # 设置巡逻宠物 + return self.server._handle_set_patrol_pet(client_id, message) + elif message_type == "set_battle_pet": # 设置出战宠物 + return self.server._handle_set_battle_pet(client_id, message) + elif message_type == "update_battle_pet_data": # 更新宠物对战数据 + return self.server._handle_update_battle_pet_data(client_id, message) + elif message_type == "feed_pet": # 喂食宠物 + return self.server._handle_feed_pet(client_id, message) + elif message_type == "dig_ground": # 开垦土地 + return self.server._handle_dig_ground(client_id, message) + elif message_type == "remove_crop": # 铲除作物 + return self.server._handle_remove_crop(client_id, message) + elif message_type == "water_crop": # 浇水 + return self.server._handle_water_crop(client_id, message) + elif message_type == "fertilize_crop": # 施肥 + return self.server._handle_fertilize_crop(client_id, message) + elif message_type == "use_item": # 使用道具 + return self.server._handle_use_item(client_id, message) + elif message_type == "upgrade_land": # 升级土地 + return self.server._handle_upgrade_land(client_id, message) + elif message_type == "buy_new_ground": # 添加新的土地 + return self.server._handle_buy_new_ground(client_id, message) + elif message_type == "like_player": # 点赞玩家 + return self.server._handle_like_player(client_id, message) + elif message_type == "request_online_players": # 请求在线玩家 + return self.server._handle_online_players_request(client_id, message) + elif message_type == "get_play_time": # 获取游玩时间 + return self.server._handle_get_play_time(client_id) + elif message_type == "update_play_time": # 更新游玩时间 + return self.server._handle_update_play_time(client_id) + elif message_type == "request_player_rankings": # 请求玩家排行榜 + return self.server._handle_player_rankings_request(client_id, message) + elif message_type == "request_crop_data": # 请求作物数据 + return self.server._handle_crop_data_request(client_id) + elif message_type == "request_item_config": # 请求道具配置数据 + return self.server._handle_item_config_request(client_id) + elif message_type == "request_pet_config": # 请求宠物配置数据 + return self.server._handle_pet_config_request(client_id) + elif message_type == "request_game_tips_config": # 请求游戏小提示配置数据 + return self.server._handle_game_tips_config_request(client_id) + elif message_type == "visit_player": # 拜访其他玩家农场 + return self.server._handle_visit_player_request(client_id, message) + elif message_type == "return_my_farm": # 返回我的农场 + return self.server._handle_return_my_farm_request(client_id, message) + elif message_type == "daily_check_in": # 每日签到 + return self.server._handle_daily_check_in_request(client_id, message) + elif message_type == "get_check_in_data": # 获取签到数据 + return self.server._handle_get_check_in_data_request(client_id, message) + elif message_type == "lucky_draw": # 幸运抽奖 + return self.server._handle_lucky_draw_request(client_id, message) + elif message_type == "claim_new_player_gift": # 领取新手大礼包 + return self.server._handle_new_player_gift_request(client_id, message) + elif message_type == "get_online_gift_data": # 获取在线礼包数据 + return self.server._handle_get_online_gift_data_request(client_id, message) + elif message_type == "claim_online_gift": # 领取在线礼包 + return self.server._handle_claim_online_gift_request(client_id, message) + elif message_type == "ping": # 客户端ping请求 + return self.server._handle_ping_request(client_id, message) + elif message_type == "modify_account_info": # 修改账号信息 + return self.server._handle_modify_account_info_request(client_id, message) + elif message_type == "delete_account": # 删除账号 + return self.server._handle_delete_account_request(client_id, message) + elif message_type == "refresh_player_info": # 刷新玩家信息 + return self.server._handle_refresh_player_info_request(client_id, message) + elif message_type == "global_broadcast": # 全服大喇叭消息 + return self.server._handle_global_broadcast_message(client_id, message) + elif message_type == "request_broadcast_history": # 请求全服大喇叭历史消息 + return self.server._handle_request_broadcast_history(client_id, message) + elif message_type == "use_pet_item": # 宠物使用道具 + return self.server._handle_use_pet_item(client_id, message) + elif message_type == "use_farm_item": # 农场道具使用 + return self.server._handle_use_farm_item(client_id, message) + elif message_type == "buy_scare_crow": # 购买稻草人 + return self.server._handle_buy_scare_crow(client_id, message) + elif message_type == "modify_scare_crow_config": # 修改稻草人配置 + return self.server._handle_modify_scare_crow_config(client_id, message) + elif message_type == "get_scare_crow_config": # 获取稻草人配置 + return self.server._handle_get_scare_crow_config(client_id, message) + elif message_type == "wisdom_tree_operation": # 智慧树操作 + return self.server._handle_wisdom_tree_operation(client_id, message) + elif message_type == "wisdom_tree_message": # 智慧树消息 + return self.server._handle_wisdom_tree_message(client_id, message) + elif message_type == "get_wisdom_tree_config": # 获取智慧树配置 + return self.server._handle_get_wisdom_tree_config(client_id, message) + elif message_type == "sell_crop": # 出售作物 + return self.server._handle_sell_crop(client_id, message) + elif message_type == "add_product_to_store": # 添加商品到小卖部 + return self.server._handle_add_product_to_store(client_id, message) + elif message_type == "remove_store_product": # 下架小卖部商品 + return self.server._handle_remove_store_product(client_id, message) + elif message_type == "buy_store_product": # 购买小卖部商品 + return self.server._handle_buy_store_product(client_id, message) + elif message_type == "buy_store_booth": # 购买小卖部格子 + return self.server._handle_buy_store_booth(client_id, message) + elif message_type == "save_game_settings": # 保存游戏设置 + return self.server._handle_save_game_settings(client_id, message) + elif message_type == "pet_battle_result": # 宠物对战结果 + return self.server._handle_pet_battle_result(client_id, message) + elif message_type == "today_divination": # 今日占卜 + return self.server._handle_today_divination(client_id, message) + elif message_type == "give_money": # 送金币 + return self.server._handle_give_money_request(client_id, message) + elif message_type == "sync_bag_data": # 同步背包数据 + return self.server._handle_sync_bag_data(client_id, message) + # --------------------------------------------------------------------------- + + # 管理员操作相关 + elif message_type == "kick_player": # 踢出玩家 + return self.server._handle_kick_player(client_id, message) + + # elif message_type == "message": # 处理聊天消息(暂未实现) + # return self.server._handle_chat_message(client_id, message) + else: + # 调用父类的默认处理方法 + return super(type(self.server), self.server)._handle_message(client_id, message) \ No newline at end of file diff --git a/SproutFarm-Backend/module/PetSystem.py b/SproutFarm-Backend/module/PetSystem.py new file mode 100644 index 0000000..e69de29 diff --git a/SproutFarm-Backend/QQEmailSendAPI.py b/SproutFarm-Backend/module/QQEmailSendAPI.py similarity index 99% rename from SproutFarm-Backend/QQEmailSendAPI.py rename to SproutFarm-Backend/module/QQEmailSendAPI.py index 0da7ae9..b41d17a 100644 --- a/SproutFarm-Backend/QQEmailSendAPI.py +++ b/SproutFarm-Backend/module/QQEmailSendAPI.py @@ -216,7 +216,7 @@ class EmailVerification: # 优先尝试使用MongoDB try: - from SMYMongoDBAPI import SMYMongoDBAPI + from .SMYMongoDBAPI import SMYMongoDBAPI import os # 根据环境动态选择MongoDB配置 if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': @@ -291,7 +291,7 @@ class EmailVerification: # 优先尝试使用MongoDB try: - from SMYMongoDBAPI import SMYMongoDBAPI + from .SMYMongoDBAPI import SMYMongoDBAPI import os # 根据环境动态选择MongoDB配置 if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': @@ -383,7 +383,7 @@ class EmailVerification: # 优先尝试使用MongoDB try: - from SMYMongoDBAPI import SMYMongoDBAPI + from .SMYMongoDBAPI import SMYMongoDBAPI import os # 根据环境动态选择MongoDB配置 if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': @@ -459,7 +459,7 @@ class EmailVerification: # 优先尝试使用MongoDB try: - from SMYMongoDBAPI import SMYMongoDBAPI + from .SMYMongoDBAPI import SMYMongoDBAPI import os # 根据环境动态选择MongoDB配置 if os.path.exists('/.dockerenv') or os.environ.get('PRODUCTION', '').lower() == 'true': diff --git a/SproutFarm-Backend/SMYMongoDBAPI.py b/SproutFarm-Backend/module/SMYMongoDBAPI.py similarity index 99% rename from SproutFarm-Backend/SMYMongoDBAPI.py rename to SproutFarm-Backend/module/SMYMongoDBAPI.py index 3d6cbb6..83fe743 100644 --- a/SproutFarm-Backend/SMYMongoDBAPI.py +++ b/SproutFarm-Backend/module/SMYMongoDBAPI.py @@ -110,7 +110,7 @@ class SMYMongoDBAPI: self.db = self.client[current_config['database']] self.connected = True - self.logger.info(f"成功连接到MongoDB数据库 [{self.environment}]: {connection_string}") + #self.logger.info(f"成功连接到MongoDB数据库 [{self.environment}]: {connection_string}") return True except Exception as e: @@ -775,7 +775,7 @@ class SMYMongoDBAPI: # 转换datetime对象为字符串,避免JSON序列化错误 result = self._convert_datetime_to_string(result) - self.logger.info(f"成功获取玩家数据: {account_id}") + #self.logger.info(f"成功获取玩家数据: {account_id}") return result else: self.logger.warning(f"未找到玩家数据: {account_id}") diff --git a/SproutFarm-Backend/SpecialFarm.py b/SproutFarm-Backend/module/SpecialFarm.py similarity index 99% rename from SproutFarm-Backend/SpecialFarm.py rename to SproutFarm-Backend/module/SpecialFarm.py index f6df522..cf47a12 100644 --- a/SproutFarm-Backend/SpecialFarm.py +++ b/SproutFarm-Backend/module/SpecialFarm.py @@ -10,8 +10,9 @@ import time import random import logging from datetime import datetime -from SMYMongoDBAPI import SMYMongoDBAPI from bson import ObjectId +#自定义包 +from .SMYMongoDBAPI import SMYMongoDBAPI #杂交农场666-种植杂交树1,杂交树2-每天0点种植 #花卉农场520-随机种植各种花卉-星期一,星期三,星期五,星期日零点种植 diff --git a/SproutFarm-Backend/WSRemoteCmdApi.py b/SproutFarm-Backend/module/WSRemoteCmdApi.py similarity index 99% rename from SproutFarm-Backend/WSRemoteCmdApi.py rename to SproutFarm-Backend/module/WSRemoteCmdApi.py index b1308b3..0a3a9fa 100644 --- a/SproutFarm-Backend/WSRemoteCmdApi.py +++ b/SproutFarm-Backend/module/WSRemoteCmdApi.py @@ -12,7 +12,8 @@ import json import threading import time from typing import Dict, Any, Optional -from ConsoleCommandsAPI import ConsoleCommandsAPI +#自定义包 +from .ConsoleCommandsAPI import ConsoleCommandsAPI class WSRemoteCmdApi: """WebSocket远程命令API服务器""" diff --git a/SproutFarm-Backend/module/WisdomTreeSystem.py b/SproutFarm-Backend/module/WisdomTreeSystem.py new file mode 100644 index 0000000..473c89e --- /dev/null +++ b/SproutFarm-Backend/module/WisdomTreeSystem.py @@ -0,0 +1,708 @@ +"""智慧树系统相关逻辑模块。""" +import time + + +class WisdomTreeMixin: + """智慧树系统逻辑混入类。""" + def _handle_wisdom_tree_operation(self, client_id, message): + """处理智慧树操作请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "智慧树操作", "wisdom_tree_operation") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "wisdom_tree_operation") + if not player_data: + return self.send_data(client_id, response) + + operation_type = message.get("operation_type", "") + + # 检查并修复智慧树配置格式 + self._check_and_fix_wisdom_tree_config(player_data, username) + + # 获取修复后的智慧树配置 + wisdom_tree_config = player_data["智慧树配置"] + + # 处理不同的操作类型 + if operation_type == "water": + return self._process_wisdom_tree_water(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "fertilize": + return self._process_wisdom_tree_fertilize(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "kill_grass": + return self._process_wisdom_tree_kill_grass(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "kill_bug": + return self._process_wisdom_tree_kill_bug(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "play_music": + return self._process_wisdom_tree_play_music(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "revive": + return self._process_wisdom_tree_revive(client_id, player_data, username, wisdom_tree_config) + elif operation_type == "get_random_message": + return self._process_wisdom_tree_get_random_message(client_id, player_data, username, wisdom_tree_config) + else: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "未知的智慧树操作类型", + "operation_type": operation_type + }) + + def _process_wisdom_tree_water(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树浇水""" + # 检查智慧树是否死亡 + if wisdom_tree_config["当前生命值"] <= 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树已死亡,请先复活!", + "operation_type": "water" + }) + + # 浇水费用 + water_cost = 100 + + # 检查金钱是否足够 + if player_data["钱币"] < water_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,浇水需要 {water_cost} 金币", + "operation_type": "water" + }) + + # 执行浇水 + player_data["钱币"] -= water_cost + + # 浇水经验:50-150随机 + import random + exp_gained = random.randint(50, 150) + wisdom_tree_config["当前经验值"] += exp_gained + + # 浇水高度:40%概率增加1-2高度 + height_gained = 0 + if random.random() < 0.4: # 40%概率 + height_gained = random.randint(1, 2) + wisdom_tree_config["高度"] = min(100, wisdom_tree_config["高度"] + height_gained) + + # 检查等级提升 + level_up_occurred = self._check_wisdom_tree_level_up(wisdom_tree_config) + + # 保存数据 + self.save_player_data(username, player_data) + + height_msg = f",高度+{height_gained}" if height_gained > 0 else "" + self.log('INFO', f"玩家 {username} 给智慧树浇水,花费 {water_cost} 金币,经验+{exp_gained}{height_msg}", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": f"浇水成功!经验+{exp_gained}{height_msg}", + "operation_type": "water", + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_fertilize(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树施肥""" + # 检查智慧树是否死亡 + if wisdom_tree_config["当前生命值"] <= 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树已死亡,请先复活!", + "operation_type": "fertilize" + }) + + # 施肥费用 + fertilize_cost = 200 + + # 检查金钱是否足够 + if player_data["钱币"] < fertilize_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,施肥需要 {fertilize_cost} 金币", + "operation_type": "fertilize" + }) + + # 执行施肥 + player_data["钱币"] -= fertilize_cost + + # 施肥经验:10-40随机 + import random + exp_gained = random.randint(10, 40) + wisdom_tree_config["当前经验值"] += exp_gained + + # 施肥高度:80%概率增加1-7高度 + height_gained = 0 + if random.random() < 0.8: # 80%概率 + height_gained = random.randint(1, 7) + wisdom_tree_config["高度"] = min(100, wisdom_tree_config["高度"] + height_gained) + + # 检查等级提升 + level_up_occurred = self._check_wisdom_tree_level_up(wisdom_tree_config) + + # 保存数据 + self.save_player_data(username, player_data) + + height_msg = f",高度+{height_gained}" if height_gained > 0 else "" + self.log('INFO', f"玩家 {username} 给智慧树施肥,花费 {fertilize_cost} 金币,经验+{exp_gained}{height_msg}", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": f"施肥成功!经验+{exp_gained}{height_msg}", + "operation_type": "fertilize", + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_kill_grass(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树除草""" + # 检查智慧树是否死亡 + if wisdom_tree_config["当前生命值"] <= 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树已死亡,请先复活!", + "operation_type": "kill_grass" + }) + + # 除草费用 + kill_grass_cost = 150 + + # 检查金钱是否足够 + if player_data["钱币"] < kill_grass_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,除草需要 {kill_grass_cost} 金币", + "operation_type": "kill_grass" + }) + + # 执行除草 + import time + player_data["钱币"] -= kill_grass_cost + max_health = wisdom_tree_config["最大生命值"] + wisdom_tree_config["当前生命值"] = min(max_health, wisdom_tree_config["当前生命值"] + 10) + wisdom_tree_config["距离上一次除草时间"] = int(time.time()) + + # 保存数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 给智慧树除草,花费 {kill_grass_cost} 金币,生命值+10", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": "除草成功!生命值+10", + "operation_type": "kill_grass", + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_kill_bug(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树杀虫""" + # 检查智慧树是否死亡 + if wisdom_tree_config["当前生命值"] <= 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树已死亡,请先复活!", + "operation_type": "kill_bug" + }) + + # 杀虫费用 + kill_bug_cost = 150 + + # 检查金钱是否足够 + if player_data["钱币"] < kill_bug_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,杀虫需要 {kill_bug_cost} 金币", + "operation_type": "kill_bug" + }) + + # 执行杀虫 + player_data["钱币"] -= kill_bug_cost + max_health = wisdom_tree_config["最大生命值"] + wisdom_tree_config["当前生命值"] = min(max_health, wisdom_tree_config["当前生命值"] + 15) + wisdom_tree_config["距离上一次杀虫时间"] = int(time.time()) + + # 保存数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 给智慧树杀虫,花费 {kill_bug_cost} 金币,生命值+15", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": "杀虫成功!生命值+15", + "operation_type": "kill_bug", + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_play_music(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树放音乐""" + # 检查智慧树是否死亡 + if wisdom_tree_config["当前生命值"] <= 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树已死亡,请先复活!", + "operation_type": "play_music" + }) + + # 放音乐费用 + play_music_cost = 100 + + # 检查金钱是否足够 + if player_data["钱币"] < play_music_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,放音乐需要 {play_music_cost} 金币", + "operation_type": "play_music" + }) + + # 执行放音乐 + player_data["钱币"] -= play_music_cost + + # 从智慧树消息库中随机获取一条消息 + random_message = self._get_random_wisdom_tree_message() + if random_message: + wisdom_tree_config["智慧树显示的话"] = random_message.get("content", "") + + # 保存数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 给智慧树放音乐,花费 {play_music_cost} 金币,获得随机消息", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": "放音乐成功!获得了一条神秘消息", + "operation_type": "play_music", + "random_message": random_message, + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_revive(self, client_id, player_data, username, wisdom_tree_config): + """处理智慧树复活""" + # 检查智慧树是否真的死亡 + if wisdom_tree_config["当前生命值"] > 0: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "智慧树还活着,不需要复活!", + "operation_type": "revive" + }) + + # 复活费用 + revive_cost = 1000 + + # 检查金钱是否足够 + if player_data["钱币"] < revive_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": f"金钱不足,复活智慧树需要 {revive_cost} 金币", + "operation_type": "revive" + }) + + # 执行复活 + player_data["钱币"] -= revive_cost + wisdom_tree_config["当前生命值"] = wisdom_tree_config["最大生命值"] + + # 保存数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 复活了智慧树,花费 {revive_cost} 金币", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": "智慧树复活成功!", + "operation_type": "revive", + "updated_data": { + "钱币": player_data["钱币"], + "智慧树配置": wisdom_tree_config + } + }) + + def _process_wisdom_tree_get_random_message(self, client_id, player_data, username, wisdom_tree_config): + """处理获取随机智慧树消息""" + # 从智慧树消息库中随机获取一条消息 + random_message = self._get_random_wisdom_tree_message() + + if random_message: + wisdom_tree_config["智慧树显示的话"] = random_message.get("content", "") + + # 保存数据 + self.save_player_data(username, player_data) + + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": True, + "message": "获得了一条神秘消息", + "operation_type": "get_random_message", + "random_message": random_message, + "updated_data": { + "智慧树配置": wisdom_tree_config + } + }) + else: + return self.send_data(client_id, { + "type": "wisdom_tree_operation_response", + "success": False, + "message": "暂时没有新消息", + "operation_type": "get_random_message" + }) + + def _handle_wisdom_tree_message(self, client_id, message): + """处理智慧树消息发送请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "发送智慧树消息", "wisdom_tree_message") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "wisdom_tree_message") + if not player_data: + return self.send_data(client_id, response) + + message_content = message.get("message", "").strip() + + # 验证消息内容 + if not message_content: + return self.send_data(client_id, { + "type": "wisdom_tree_message_response", + "success": False, + "message": "消息内容不能为空" + }) + + if len(message_content) > 100: + return self.send_data(client_id, { + "type": "wisdom_tree_message_response", + "success": False, + "message": "消息长度不能超过100个字符" + }) + + # 发送消息费用 + send_cost = 50 + + # 检查金钱是否足够 + if player_data["钱币"] < send_cost: + return self.send_data(client_id, { + "type": "wisdom_tree_message_response", + "success": False, + "message": f"金钱不足,发送消息需要 {send_cost} 金币" + }) + + # 扣除费用 + player_data["钱币"] -= send_cost + + # 保存消息到智慧树消息库 + success = self._save_wisdom_tree_message(username, message_content) + + if success: + # 保存玩家数据 + self.save_player_data(username, player_data) + + self.log('INFO', f"玩家 {username} 发送智慧树消息,花费 {send_cost} 金币:{message_content}", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_message_response", + "success": True, + "message": "消息发送成功!", + "updated_data": { + "钱币": player_data["钱币"] + } + }) + else: + return self.send_data(client_id, { + "type": "wisdom_tree_message_response", + "success": False, + "message": "消息发送失败,请重试" + }) + + def _handle_get_wisdom_tree_config(self, client_id, message): + """处理获取智慧树配置请求""" + # 检查用户是否已登录 + logged_in, response = self._check_user_logged_in(client_id, "获取智慧树配置", "get_wisdom_tree_config") + if not logged_in: + return self.send_data(client_id, response) + + # 获取玩家数据 + player_data, username, response = self._load_player_data_with_check(client_id, "get_wisdom_tree_config") + if not player_data: + return self.send_data(client_id, response) + + # 检查并修复智慧树配置 + self._check_and_fix_wisdom_tree_config(player_data, username) + + # 保存修复后的数据 + self.save_player_data(username, player_data) + + # 返回智慧树配置 + wisdom_tree_config = player_data.get("智慧树配置", {}) + + self.log('INFO', f"玩家 {username} 请求智慧树配置", 'SERVER') + + return self.send_data(client_id, { + "type": "wisdom_tree_config_response", + "success": True, + "config": wisdom_tree_config + }) + + def _check_wisdom_tree_level_up(self, wisdom_tree_config): + """检查智慧树等级提升""" + current_level = wisdom_tree_config["等级"] + current_experience = wisdom_tree_config["当前经验值"] + max_experience = wisdom_tree_config["最大经验值"] + level_ups = 0 + + # 检查是否可以升级(最高等级20) + while current_level < 20 and current_experience >= max_experience: + # 升级 + current_level += 1 + current_experience -= max_experience # 扣除升级所需经验 + level_ups += 1 + + # 计算新等级的最大经验值 + max_experience = self._calculate_wisdom_tree_max_exp(current_level) + + self.log('INFO', f"智慧树等级提升到 {current_level} 级,新的最大经验值: {max_experience}", 'SERVER') + + # 每升一级,最大生命值+2,当前生命值也+2 + if level_ups > 0: + health_bonus = level_ups * 2 + wisdom_tree_config["最大生命值"] = min(200, wisdom_tree_config["最大生命值"] + health_bonus) + wisdom_tree_config["当前生命值"] = min(wisdom_tree_config["最大生命值"], wisdom_tree_config["当前生命值"] + health_bonus) + self.log('INFO', f"智慧树升级 {level_ups} 级,最大生命值+{health_bonus}", 'SERVER') + + # 更新配置 + wisdom_tree_config["等级"] = current_level + wisdom_tree_config["当前经验值"] = current_experience + wisdom_tree_config["最大经验值"] = max_experience + + return level_ups > 0 + + def _get_random_wisdom_tree_message(self): + """从智慧树消息库中随机获取一条消息""" + import os + import json + import random + + # 优先从MongoDB读取 + if hasattr(self, 'mongo_api') and self.mongo_api and self.mongo_api.is_connected(): + try: + wisdom_tree_data = self.mongo_api.get_wisdom_tree_config() + if wisdom_tree_data: + messages = wisdom_tree_data.get("messages", []) + if messages: + selected_message = random.choice(messages) + self.log('INFO', f"成功从MongoDB获取智慧树消息", 'SERVER') + return selected_message + else: + return None + except Exception as e: + self.log('ERROR', f"从MongoDB读取智慧树消息失败: {e}", 'SERVER') + + # 回退到JSON文件 + wisdom_tree_data_path = os.path.join(os.path.dirname(__file__), "config", "wisdom_tree_data.json") + + try: + with open(wisdom_tree_data_path, 'r', encoding='utf-8') as f: + wisdom_tree_data = json.load(f) + + messages = wisdom_tree_data.get("messages", []) + if messages: + selected_message = random.choice(messages) + self.log('INFO', f"成功从JSON文件获取智慧树消息", 'SERVER') + return selected_message + else: + return None + except Exception as e: + self.log('ERROR', f"从JSON文件读取智慧树消息失败: {e}", 'SERVER') + return None + + def _save_wisdom_tree_message(self, username, message_content): + """保存智慧树消息到消息库""" + import os + import json + import time + import uuid + + # 创建新消息 + new_message = { + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + "sender": username, + "content": message_content, + "id": str(uuid.uuid4()) + } + + # 优先保存到MongoDB + if hasattr(self, 'mongo_api') and self.mongo_api and self.mongo_api.is_connected(): + try: + # 获取现有数据 + wisdom_tree_data = self.mongo_api.get_wisdom_tree_config() + if not wisdom_tree_data: + wisdom_tree_data = { + "messages": [], + "total_messages": 0, + "last_update": "" + } + + # 添加新消息 + wisdom_tree_data["messages"].append(new_message) + wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) + wisdom_tree_data["last_update"] = new_message["timestamp"] + + # 保持最多1000条消息 + if len(wisdom_tree_data["messages"]) > 1000: + wisdom_tree_data["messages"] = wisdom_tree_data["messages"][-1000:] + wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) + + # 保存到MongoDB + if self.mongo_api.update_wisdom_tree_config(wisdom_tree_data): + self.log('INFO', f"成功保存智慧树消息到MongoDB: {username}", 'SERVER') + return True + else: + self.log('ERROR', f"保存智慧树消息到MongoDB失败: {username}", 'SERVER') + except Exception as e: + self.log('ERROR', f"MongoDB保存智慧树消息异常: {e}", 'SERVER') + + # 回退到JSON文件 + wisdom_tree_data_path = os.path.join(os.path.dirname(__file__), "config", "wisdom_tree_data.json") + + try: + # 读取现有数据 + if os.path.exists(wisdom_tree_data_path): + with open(wisdom_tree_data_path, 'r', encoding='utf-8') as f: + wisdom_tree_data = json.load(f) + else: + wisdom_tree_data = { + "messages": [], + "total_messages": 0, + "last_update": "" + } + + # 添加到消息列表 + wisdom_tree_data["messages"].append(new_message) + wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) + wisdom_tree_data["last_update"] = new_message["timestamp"] + + # 保持最多1000条消息 + if len(wisdom_tree_data["messages"]) > 1000: + wisdom_tree_data["messages"] = wisdom_tree_data["messages"][-1000:] + wisdom_tree_data["total_messages"] = len(wisdom_tree_data["messages"]) + + # 保存数据 + with open(wisdom_tree_data_path, 'w', encoding='utf-8') as f: + json.dump(wisdom_tree_data, f, ensure_ascii=False, indent=4) + + self.log('INFO', f"成功保存智慧树消息到JSON文件: {username}", 'SERVER') + return True + except Exception as e: + self.log('ERROR', f"保存智慧树消息到JSON文件失败: {e}", 'SERVER') + return False + + def check_wisdom_tree_health_decay(self): + """检查智慧树生命值衰减""" + import time + + current_time = int(time.time()) + processed_count = 0 + + # 检查所有在线玩家 + for client_id in self.user_data: + if self.user_data[client_id].get("logged_in", False): + username = self.user_data[client_id]["username"] + player_data = self.load_player_data(username) + if player_data and "智慧树配置" in player_data: + self._process_wisdom_tree_decay(player_data["智慧树配置"], username) + self.save_player_data(username, player_data) + processed_count += 1 + + # 注释:缓存机制已移除,只处理在线玩家的智慧树衰减 + + if processed_count > 0: + self.log('INFO', f"已处理 {processed_count} 个玩家的智慧树生命值衰减", 'SERVER') + + def _process_wisdom_tree_decay(self, wisdom_tree_config, username): + """处理单个玩家的智慧树生命值衰减""" + import time + import random + + current_time = int(time.time()) + + # 获取上次除草和杀虫时间,处理空字符串和无效值 + last_grass_time_raw = wisdom_tree_config.get("距离上一次除草时间", current_time) + last_bug_time_raw = wisdom_tree_config.get("距离上一次杀虫时间", current_time) + + # 处理空字符串和无效时间戳 + try: + last_grass_time = int(last_grass_time_raw) if last_grass_time_raw and str(last_grass_time_raw).strip() else current_time + except (ValueError, TypeError): + last_grass_time = current_time + + try: + last_bug_time = int(last_bug_time_raw) if last_bug_time_raw and str(last_bug_time_raw).strip() else current_time + except (ValueError, TypeError): + last_bug_time = current_time + + # 如果时间戳无效(为0或负数),设置为当前时间 + if last_grass_time <= 0: + last_grass_time = current_time + if last_bug_time <= 0: + last_bug_time = current_time + + # 检查是否3天没有除草 + days_since_grass = (current_time - last_grass_time) / 86400 # 转换为天数 + if days_since_grass >= 3: + # 计算应该衰减的天数 + decay_days = int(days_since_grass) + if decay_days > 0: + # 每天减少1-3血量 + total_decay = 0 + for _ in range(decay_days): + daily_decay = random.randint(1, 3) + total_decay += daily_decay + + wisdom_tree_config["当前生命值"] = max(0, wisdom_tree_config["当前生命值"] - total_decay) + self.log('INFO', f"玩家 {username} 的智慧树因{decay_days}天未除草,生命值减少{total_decay}", 'SERVER') + + # 更新除草时间为当前时间,避免重复扣血 + wisdom_tree_config["距离上一次除草时间"] = current_time + + # 检查是否3天没有杀虫 + days_since_bug = (current_time - last_bug_time) / 86400 # 转换为天数 + if days_since_bug >= 3: + # 计算应该衰减的天数 + decay_days = int(days_since_bug) + if decay_days > 0: + # 每天减少1-3血量 + total_decay = 0 + for _ in range(decay_days): + daily_decay = random.randint(1, 3) + total_decay += daily_decay + + wisdom_tree_config["当前生命值"] = max(0, wisdom_tree_config["当前生命值"] - total_decay) + self.log('INFO', f"玩家 {username} 的智慧树因{decay_days}天未杀虫,生命值减少{total_decay}", 'SERVER') + + # 更新杀虫时间为当前时间,避免重复扣血 + wisdom_tree_config["距离上一次杀虫时间"] = current_time diff --git a/SproutFarm-Backend/module/__init__.py b/SproutFarm-Backend/module/__init__.py new file mode 100644 index 0000000..dc4f65f --- /dev/null +++ b/SproutFarm-Backend/module/__init__.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +萌芽农场服务器模块包 +包含所有服务器外置插件模块 +""" + +# 导入所有模块类 +from .SMYMongoDBAPI import SMYMongoDBAPI +from .QQEmailSendAPI import QQMailAPI, EmailVerification +from .ConsoleCommandsAPI import ConsoleCommandsAPI # 明确导入类名,避免循环导入 +from .SpecialFarm import SpecialFarmManager # 导入特殊农场管理器 +from .WSRemoteCmdApi import WSRemoteCmdApi +from .NetworkCore import MessageHandler + + +# 定义模块导出列表 +__all__ = [ + 'SMYMongoDBAPI', + 'QQMailAPI', + 'EmailVerification', + 'ConsoleCommandsAPI', + 'SpecialFarmManager', + 'WSRemoteCmdApi' +] \ No newline at end of file diff --git a/SproutFarm-Backend/__pycache__/ConsoleCommandsAPI.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/ConsoleCommandsAPI.cpython-313.pyc similarity index 83% rename from SproutFarm-Backend/__pycache__/ConsoleCommandsAPI.cpython-313.pyc rename to SproutFarm-Backend/module/__pycache__/ConsoleCommandsAPI.cpython-313.pyc index ac7a459..8ab96f4 100644 Binary files a/SproutFarm-Backend/__pycache__/ConsoleCommandsAPI.cpython-313.pyc and b/SproutFarm-Backend/module/__pycache__/ConsoleCommandsAPI.cpython-313.pyc differ diff --git a/SproutFarm-Backend/module/__pycache__/NetworkCore.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/NetworkCore.cpython-313.pyc new file mode 100644 index 0000000..e39838b Binary files /dev/null and b/SproutFarm-Backend/module/__pycache__/NetworkCore.cpython-313.pyc differ diff --git a/SproutFarm-Backend/module/__pycache__/PetSystem.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/PetSystem.cpython-313.pyc new file mode 100644 index 0000000..99581e0 Binary files /dev/null and b/SproutFarm-Backend/module/__pycache__/PetSystem.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/QQEmailSendAPI.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/QQEmailSendAPI.cpython-313.pyc similarity index 64% rename from SproutFarm-Backend/__pycache__/QQEmailSendAPI.cpython-313.pyc rename to SproutFarm-Backend/module/__pycache__/QQEmailSendAPI.cpython-313.pyc index 926a6bd..1e3dac4 100644 Binary files a/SproutFarm-Backend/__pycache__/QQEmailSendAPI.cpython-313.pyc and b/SproutFarm-Backend/module/__pycache__/QQEmailSendAPI.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/SMYMongoDBAPI.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/SMYMongoDBAPI.cpython-313.pyc similarity index 84% rename from SproutFarm-Backend/__pycache__/SMYMongoDBAPI.cpython-313.pyc rename to SproutFarm-Backend/module/__pycache__/SMYMongoDBAPI.cpython-313.pyc index 457f6a3..cc98955 100644 Binary files a/SproutFarm-Backend/__pycache__/SMYMongoDBAPI.cpython-313.pyc and b/SproutFarm-Backend/module/__pycache__/SMYMongoDBAPI.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/SpecialFarm.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/SpecialFarm.cpython-313.pyc similarity index 74% rename from SproutFarm-Backend/__pycache__/SpecialFarm.cpython-313.pyc rename to SproutFarm-Backend/module/__pycache__/SpecialFarm.cpython-313.pyc index f28feff..64ccfcd 100644 Binary files a/SproutFarm-Backend/__pycache__/SpecialFarm.cpython-313.pyc and b/SproutFarm-Backend/module/__pycache__/SpecialFarm.cpython-313.pyc differ diff --git a/SproutFarm-Backend/__pycache__/WSRemoteCmdApi.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/WSRemoteCmdApi.cpython-313.pyc similarity index 72% rename from SproutFarm-Backend/__pycache__/WSRemoteCmdApi.cpython-313.pyc rename to SproutFarm-Backend/module/__pycache__/WSRemoteCmdApi.cpython-313.pyc index 2f13b43..4e36bc4 100644 Binary files a/SproutFarm-Backend/__pycache__/WSRemoteCmdApi.cpython-313.pyc and b/SproutFarm-Backend/module/__pycache__/WSRemoteCmdApi.cpython-313.pyc differ diff --git a/SproutFarm-Backend/module/__pycache__/WisdomTreeSystem.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/WisdomTreeSystem.cpython-313.pyc new file mode 100644 index 0000000..51efa39 Binary files /dev/null and b/SproutFarm-Backend/module/__pycache__/WisdomTreeSystem.cpython-313.pyc differ diff --git a/SproutFarm-Backend/module/__pycache__/__init__.cpython-313.pyc b/SproutFarm-Backend/module/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..969af0e Binary files /dev/null and b/SproutFarm-Backend/module/__pycache__/__init__.cpython-313.pyc differ diff --git a/SproutFarm-Frontend/Components/GameBGMPlayer.gd b/SproutFarm-Frontend/Components/GameBGMPlayer.gd index c01f5c1..1421f8a 100644 --- a/SproutFarm-Frontend/Components/GameBGMPlayer.gd +++ b/SproutFarm-Frontend/Components/GameBGMPlayer.gd @@ -82,7 +82,7 @@ func _load_from_preset_list(): for file_path in music_files_list: if ResourceLoader.exists(file_path): music_files.append(file_path) - print("预设加载音乐: ", file_path.get_file()) + #print("预设加载音乐: ", file_path.get_file()) else: print("音乐文件不存在: ", file_path) @@ -181,7 +181,7 @@ func set_volume(volume: float): current_volume = clamp(volume, 0.0, 1.0) if not is_muted: audio_player.volume_db = linear_to_db(current_volume) - print("背景音乐音量设置为: ", current_volume) + #print("背景音乐音量设置为: ", current_volume) func get_volume() -> float: """获取当前音量""" diff --git a/SproutFarm-Frontend/Components/HTTPTextureRect.gd b/SproutFarm-Frontend/Components/HTTPTextureRect.gd index be9cc7e..fc0b8cc 100644 --- a/SproutFarm-Frontend/Components/HTTPTextureRect.gd +++ b/SproutFarm-Frontend/Components/HTTPTextureRect.gd @@ -47,7 +47,7 @@ func _on_request_completed(result, response_code, headers, body): for header in headers: if header.to_lower().begins_with("content-type:"): content_type = header.substr(13).strip_edges().to_lower() - print("HTTPTextureRect: 内容类型: ", content_type) + #print("HTTPTextureRect: 内容类型: ", content_type) break # 创建图像 @@ -82,7 +82,7 @@ func _on_request_completed(result, response_code, headers, body): # 创建纹理并应用 var texture = ImageTexture.create_from_image(image) self.texture = texture - print("HTTPTextureRect: 图像加载成功,尺寸: ", image.get_width(), "x", image.get_height()) + #print("HTTPTextureRect: 图像加载成功,尺寸: ", image.get_width(), "x", image.get_height()) loading_finished.emit(true) # 加载QQ头像的便捷方法 diff --git a/SproutFarm-Frontend/Data/item_config.json b/SproutFarm-Frontend/Data/item_config.json deleted file mode 100644 index 45d1ff5..0000000 --- a/SproutFarm-Frontend/Data/item_config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "精准采集-镰刀": {"花费":100,"描述":"可以在收获作物时必定掉落该作物的种子","类型":"作物道具","道具图片":"res://assets/道具图片/紫水晶镰刀.webp"}, - "时运-镰刀": {"花费":100,"描述":"可以在收获作物时掉落更多的作物的收获物","类型":"作物道具","道具图片":"res://assets/道具图片/红宝石镰刀.webp"}, - "农家肥": {"花费":100,"描述":"(施肥道具)可以在30分钟内2倍速作物生长","类型":"作物道具","道具图片":"res://assets/道具图片/农家肥.webp"}, - "金坷垃": {"花费":100,"描述":"(施肥道具)可以在5分钟内5倍速作物的生长","类型":"作物道具","道具图片":"res://assets/道具图片/金坷垃2.webp"}, - "水壶": {"花费":100,"描述":"(浇水道具)直接让作物生长进度+1%","类型":"作物道具","道具图片":"res://assets/道具图片/铁质洒水壶.webp"}, - "水桶": {"花费":100,"描述":"(浇水道具)让作物生长进度+2%","类型":"作物道具","道具图片":"res://assets/道具图片/木质水桶2.webp"}, - "杀虫剂": {"花费":100,"描述":"杀虫,暂时没什么用","类型":"作物道具","道具图片":"res://assets/道具图片/杀虫剂.webp"}, - "除草剂": {"花费":100,"描述":"除草","类型":"作物道具","道具图片":"res://assets/道具图片/除草剂.webp"}, - "生长素": {"花费":100,"描述":"时运可以10分钟内3倍速作物生长,而且作物生长速度+3%","类型":"作物道具","道具图片":"res://assets/道具图片/生长素.webp"}, - "铲子": {"花费":100,"描述":"铲除作物","类型":"作物道具","道具图片":"res://assets/道具图片/附魔铁铲.webp"} -} \ No newline at end of file diff --git a/SproutFarm-Frontend/Data/pet_data.json b/SproutFarm-Frontend/Data/pet_data.json deleted file mode 100644 index 0b45615..0000000 --- a/SproutFarm-Frontend/Data/pet_data.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "_id": { - "$oid": "687cf59b8e77ba00a7414bab" - }, - "updated_at": { - "$date": "2025-07-20T22:13:38.521Z" - }, - "烈焰鸟": { - "pet_name": "烈焰鸟", - "can_purchase":true, - "cost":1000, - "pet_image": "res://Scene/NewPet/PetType/flying_bird.tscn", - "pet_id": "0001", - "pet_type": "飞鸟", - "pet_level": 1, - "pet_experience": 500, - "pet_temperament": "勇猛", - "pet_birthday": "2023-03-15", - "pet_hobby": "喜欢战斗和烈火", - "pet_introduction": "我爱吃虫子", - "max_health": 300, - "enable_health_regen": true, - "health_regen": 2, - "enable_shield_regen": true, - "max_shield": 150, - "shield_regen": 1.5, - "max_armor": 120, - "base_attack_damage": 40, - "crit_rate": 0.15, - "crit_damage": 2, - "armor_penetration": 10, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 2, - "enable_berserker_skill": true, - "berserker_bonus": 1.8, - "berserker_duration": 6, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": false, - "enable_death_respawn_skill": true, - "respawn_health_percentage": 0.4, - "move_speed": 180, - "dodge_rate": 0.08, - "element_type": "FIRE", - "element_damage_bonus": 75, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - }, - "大蓝虫": { - "pet_name": "大蓝虫", - "can_purchase":true, - "cost":1000, - "pet_image": "res://Scene/NewPet/PetType/big_beetle.tscn", - "pet_id": "0002", - "pet_type": "大甲壳虫", - "pet_level": 8, - "pet_experience": 320, - "pet_temperament": "冷静", - "pet_birthday": "2023-06-20", - "pet_hobby": "喜欢和小甲壳虫玩", - "pet_introduction": "我是大蓝虫,不是大懒虫!", - "max_health": 180, - "enable_health_regen": true, - "health_regen": 1.2, - "enable_shield_regen": true, - "max_shield": 200, - "shield_regen": 2.5, - "max_armor": 80, - "base_attack_damage": 35, - "crit_rate": 0.12, - "crit_damage": 1.8, - "armor_penetration": 15, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 1.5, - "enable_berserker_skill": false, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": true, - "summon_count": 2, - "summon_scale": 0.15, - "enable_death_respawn_skill": false, - "move_speed": 120, - "dodge_rate": 0.12, - "element_type": "WATER", - "element_damage_bonus": 100, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - } -} \ No newline at end of file diff --git a/SproutFarm-Frontend/MainGame.gd b/SproutFarm-Frontend/MainGame.gd index 3919fca..efa06f1 100644 --- a/SproutFarm-Frontend/MainGame.gd +++ b/SproutFarm-Frontend/MainGame.gd @@ -389,9 +389,6 @@ func _input(event): DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) else: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) - elif key_code == KEY_F12: - # 截图 - print("截图功能暂未实现") #=======================脚本基础方法======================= @@ -491,10 +488,10 @@ func _handle_visit_player_response(data): pet_bag_panel.update_pet_bag_ui() # 初始化巡逻宠物(访问模式) - print("[访问模式] 准备初始化巡逻宠物,数据量: ", patrol_pets.size()) + #print("[访问模式] 准备初始化巡逻宠物,数据量: ", patrol_pets.size()) for i in range(patrol_pets.size()): var pet_data = patrol_pets[i] - print("[访问模式] 巡逻宠物", i, ": ", pet_data.get("pet_name", "未知"), " ID:", pet_data.get("pet_id", "无ID")) + #print("[访问模式] 巡逻宠物", i, ": ", pet_data.get("pet_name", "未知"), " ID:", pet_data.get("pet_id", "无ID")) if has_method("init_patrol_pets"): init_patrol_pets() @@ -510,19 +507,12 @@ func _handle_visit_player_response(data): # 更新智慧树显示 _update_wisdom_tree_display(target_wisdom_config) - else: - print("智慧树配置不是Dictionary类型:", typeof(target_wisdom_config)) - else: - print("目标玩家没有智慧树配置或配置为空") # 隐藏排行榜面板 if player_ranking_panel: player_ranking_panel.hide() Toast.show("正在访问 " + target_player_data.get("玩家昵称", "未知") + " 的农场", Color.CYAN) - else: - Toast.show("访问失败:" + message, Color.RED) - print("访问玩家失败:", message) # 处理返回自己农场响应 func _handle_return_my_farm_response(data): @@ -583,10 +573,10 @@ func _handle_return_my_farm_response(data): pet_bag_panel.update_pet_bag_ui() # 初始化巡逻宠物(返回自己农场) - print("[返回农场] 准备初始化巡逻宠物,数据量: ", patrol_pets.size()) + #print("[返回农场] 准备初始化巡逻宠物,数据量: ", patrol_pets.size()) for i in range(patrol_pets.size()): var pet_data = patrol_pets[i] - print("[返回农场] 巡逻宠物", i, ": ", pet_data.get("pet_name", "未知"), " ID:", pet_data.get("pet_id", "无ID")) + #print("[返回农场] 巡逻宠物", i, ": ", pet_data.get("pet_name", "未知"), " ID:", pet_data.get("pet_id", "无ID")) if has_method("init_patrol_pets"): init_patrol_pets() @@ -604,18 +594,12 @@ func _handle_return_my_farm_response(data): update_wisdom_tree_display() Toast.show("已返回自己的农场", Color.GREEN) - else: - Toast.show("返回农场失败:" + message, Color.RED) - print("返回农场失败:", message) #访客模式下返回我的农场 func _on_return_my_farm_button_pressed() -> void: # 如果当前处于访问模式,返回自己的农场 if is_visiting_mode: return_to_my_farm() - else: - # 如果不在访问模式,这个按钮可能用于其他功能或者不做任何操作 - print("当前已在自己的农场") # 返回自己的农场 func return_to_my_farm(): @@ -626,13 +610,11 @@ func return_to_my_farm(): if tcp_network_manager_panel and tcp_network_manager_panel.has_method("sendReturnMyFarm"): var success = tcp_network_manager_panel.sendReturnMyFarm() if success: - print("已发送返回自己农场的请求") + #print("已发送返回自己农场的请求") + pass else: Toast.show("网络未连接,无法返回农场", Color.RED) - print("发送返回农场请求失败,网络未连接") - else: - Toast.show("网络管理器不可用", Color.RED) - print("网络管理器不可用") + #print("发送返回农场请求失败,网络未连接") #==========================玩家排行榜+访问模式处理============================ @@ -665,9 +647,7 @@ func _on_item_selected(index): # 游戏小提示相关变量 var game_tips_config = {} # 服务端游戏小提示配置 var current_tip_index = 0 # 当前小提示索引(用于顺序模式) -#OS -#DisplayServer -#获取游戏提示 + func _random_small_game_tips() -> String: # 默认游戏小提示(作为备用) const default_game_tips = [ @@ -751,21 +731,20 @@ func handle_login_success(player_data: Dictionary): # 立即请求在线人数 if tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server(): tcp_network_manager_panel.sendGetOnlinePlayers() - print("登录成功后请求在线人数更新") + #print("登录成功后请求在线人数更新") # 登录成功后请求宠物配置数据 if tcp_network_manager_panel and tcp_network_manager_panel.has_method("sendGetPetConfig"): if tcp_network_manager_panel.sendGetPetConfig(): - print("登录成功后请求宠物配置数据") - else: - print("登录成功后请求宠物配置数据失败") + #print("登录成功后请求宠物配置数据") + pass # 登录成功后请求游戏小提示配置数据 if tcp_network_manager_panel and tcp_network_manager_panel.has_method("sendGetGameTipsConfig"): if tcp_network_manager_panel.sendGetGameTipsConfig(): - print("登录成功后请求游戏小提示配置数据") - else: - print("登录成功后请求游戏小提示配置数据失败") + #print("登录成功后请求游戏小提示配置数据") + pass + # 其他登录成功后的初始化逻辑可以在这里添加 start_game = true @@ -1868,9 +1847,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秒没有进度变化 - print("⚠ 加载卡顿检测: 在 %d%% 停留了 %.1f 秒" % [progress, stuck_time]) + pass else: # 进度有变化,更新记录 last_progress_value = progress @@ -2031,10 +2008,7 @@ func _handle_daily_check_in_response(response: Dictionary) -> void: # 显示签到结果通知 var success = response.get("success", false) if success: - var rewards = response.get("rewards", {}) - var consecutive_days = response.get("consecutive_days", 1) - var message = "签到成功!连续签到 %d 天" % consecutive_days - Toast.show(message, Color.GREEN) + pass else: var error_message = response.get("message", "签到失败") Toast.show(error_message, Color.RED) @@ -2313,7 +2287,8 @@ func _request_online_players(): if tcp_network_manager_panel and tcp_network_manager_panel.is_connected_to_server(): var success = tcp_network_manager_panel.sendGetOnlinePlayers() if success: - print("已发送在线人数请求") + #print("已发送在线人数请求") + pass else: print("发送在线人数请求失败") _update_online_players_display(0, false, false) @@ -2443,13 +2418,8 @@ func _handle_global_broadcast_message(data: Dictionary): # 处理全服大喇叭发送响应 func _handle_global_broadcast_response(data: Dictionary): - var success = data.get("success", false) - var message = data.get("message", "") + pass - if success: - Toast.show("大喇叭消息发送成功", Color.GREEN, 2.0, 1.0) - else: - Toast.show("大喇叭消息发送失败:" + message, Color.RED, 3.0, 1.0) # 处理全服大喇叭历史消息响应 func _handle_broadcast_history_response(data: Dictionary): @@ -3247,8 +3217,8 @@ func _create_single_patrol_pet(pet_data: Dictionary, position_index: int): # 获取宠物图片路径 func _get_pet_image_path(pet_type: String) -> String: - print("[调试] 获取宠物图片路径,宠物类型: " + pet_type) - print("[调试] 服务器pet_config大小: " + str(pet_config.size())) + #print("[调试] 获取宠物图片路径,宠物类型: " + pet_type) + #print("[调试] 服务器pet_config大小: " + str(pet_config.size())) # 类型映射表 var type_mapping = { @@ -3298,8 +3268,8 @@ func update_patrol_pets(patrol_pets_data: Array): # 清除现有巡逻宠物 clear_patrol_pets() - print("[update_patrol_pets] 开始更新巡逻宠物,输入数据量: ", patrol_pets_data.size()) - print("[update_patrol_pets] 当前访问模式: ", is_visiting_mode) + #print("[update_patrol_pets] 开始更新巡逻宠物,输入数据量: ", patrol_pets_data.size()) + #print("[update_patrol_pets] 当前访问模式: ", is_visiting_mode) # 限制最多4个巡逻宠物 var max_pets = min(patrol_pets_data.size(), 4) @@ -3307,7 +3277,7 @@ func update_patrol_pets(patrol_pets_data: Array): # 为每个巡逻宠物创建实例 for i in range(max_pets): var pet_data = patrol_pets_data[i] - print("[update_patrol_pets] 处理宠物", i, ": ", pet_data.get("pet_name", "未知") if pet_data else "空数据") + #print("[update_patrol_pets] 处理宠物", i, ": ", pet_data.get("pet_name", "未知") if pet_data else "空数据") if pet_data and pet_data.has("pet_id"): _create_single_patrol_pet(pet_data, i) else: diff --git a/SproutFarm-Frontend/MainGame.tscn b/SproutFarm-Frontend/MainGame.tscn index c16401f..e3d11cd 100644 --- a/SproutFarm-Frontend/MainGame.tscn +++ b/SproutFarm-Frontend/MainGame.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=113 format=3 uid="uid://dgh61dttaas5a"] +[gd_scene load_steps=110 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"] @@ -45,19 +45,18 @@ [ext_resource type="Texture2D" uid="uid://2sdfbvf1isif" path="res://icon.svg" id="31_uc6q1"] [ext_resource type="Script" uid="uid://doo34ll0yb078" path="res://Script/SmallPanel/PetInformPanel.gd" id="31_vygm6"] [ext_resource type="PackedScene" uid="uid://byxhjyyaahs6q" path="res://Scene/BigPanel/SpecialFarmPanel.tscn" id="31_ww70k"] -[ext_resource type="Script" uid="uid://bakeq8tm6r4j4" path="res://Script/SmallPanel/GlobalServerBroadcastPanel.gd" id="34_k1sw4"] [ext_resource type="Script" uid="uid://dobao5y5s2dij" path="res://Script/SmallPanel/ScareCrowPanel.gd" id="35_6ylhg"] [ext_resource type="Texture2D" uid="uid://d06uaoowmcvxj" path="res://assets/稻草人图片/稻草人2.webp" id="36_jyxgm"] [ext_resource type="Texture2D" uid="uid://cbe0f8ex17csy" path="res://assets/稻草人图片/稻草人3.webp" id="37_6ylhg"] +[ext_resource type="PackedScene" uid="uid://djh8bnauphg8v" path="res://Scene/SmallPanel/GlobalServerBroadcastPanel.tscn" id="37_rawle"] [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="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="Script" uid="uid://bkel88rscubov" path="res://Script/SmallPanel/TodayDivinationPanel.gd" id="44_mw3xw"] -[ext_resource type="FontFile" uid="uid://b81msdfp2ym2g" path="res://assets/字体/MapleMono-NF-CN-BoldItalic.ttf" id="45_vexnj"] [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="PackedScene" uid="uid://yc4ag7vxsrfv" path="res://Scene/SmallPanel/TodayDivinationPanel.tscn" id="47_rawle"] [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://dk4yl4ghmxaa2" path="res://assets/天气系统图片/雪花.webp" id="53_4ka7t"] @@ -124,16 +123,6 @@ corner_detail = 20 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2i8fe"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_k1sw4"] -bg_color = Color(0.6, 0.6, 0.6, 0.984314) -border_width_left = 10 -border_width_top = 10 -border_width_right = 10 -border_width_bottom = 10 -corner_detail = 20 -shadow_size = 20 -shadow_offset = Vector2(5, 5) - [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jyxgm"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_np7ck"] @@ -155,13 +144,6 @@ border_width_right = 15 border_width_bottom = 15 corner_detail = 20 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bpbm8"] -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 @@ -930,6 +912,7 @@ visible = false [node name="LoadProgressPanel" parent="UI/SmallPanel" instance=ExtResource("27_vygm6")] [node name="AccountSettingPanel" parent="UI/SmallPanel" instance=ExtResource("26_uc6q1")] +visible = false offset_left = 219.0 offset_top = 45.0 offset_right = 1130.0 @@ -1099,80 +1082,7 @@ offset_bottom = 8.0 theme_override_font_sizes/font_size = 30 text = "刷新" -[node name="GlobalServerBroadcastPanel" type="Panel" parent="UI/SmallPanel"] -visible = false -offset_left = 322.0 -offset_right = 985.0 -offset_bottom = 721.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_k1sw4") -script = ExtResource("34_k1sw4") - -[node name="Title" type="Label" parent="UI/SmallPanel/GlobalServerBroadcastPanel"] -layout_mode = 0 -offset_left = 13.0 -offset_top = 12.0 -offset_right = 653.0 -offset_bottom = 63.0 -theme_override_colors/font_color = Color(0.821789, 0.821789, 0.821789, 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 = 35 -text = "全服大喇叭" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="MessageContents" type="RichTextLabel" parent="UI/SmallPanel/GlobalServerBroadcastPanel"] -layout_mode = 0 -offset_left = 10.0 -offset_top = 72.0 -offset_right = 653.0 -offset_bottom = 642.0 -theme_override_font_sizes/bold_italics_font_size = 15 -theme_override_font_sizes/italics_font_size = 15 -theme_override_font_sizes/mono_font_size = 15 -theme_override_font_sizes/normal_font_size = 15 -theme_override_font_sizes/bold_font_size = 15 -bbcode_enabled = true - -[node name="HBox" type="HBoxContainer" parent="UI/SmallPanel/GlobalServerBroadcastPanel"] -layout_mode = 0 -offset_left = 8.0 -offset_top = 649.0 -offset_right = 653.0 -offset_bottom = 709.0 - -[node name="InputMessage" type="LineEdit" parent="UI/SmallPanel/GlobalServerBroadcastPanel/HBox"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="SendMessageButton" type="Button" parent="UI/SmallPanel/GlobalServerBroadcastPanel/HBox"] -layout_mode = 2 -theme_override_font_sizes/font_size = 30 -text = " 发送 " - -[node name="QuitButton" type="Button" parent="UI/SmallPanel/GlobalServerBroadcastPanel"] -custom_minimum_size = Vector2(50, 50) -layout_mode = 0 -offset_left = 601.0 -offset_top = 12.0 -offset_right = 651.0 -offset_bottom = 62.0 -theme_override_font_sizes/font_size = 30 -text = "X" - -[node name="WatchMoreButton" type="Button" parent="UI/SmallPanel/GlobalServerBroadcastPanel"] -custom_minimum_size = Vector2(50, 50) -layout_mode = 0 -offset_left = 13.0 -offset_top = 12.0 -offset_right = 141.0 -offset_bottom = 62.0 -theme_override_font_sizes/font_size = 30 -text = "查看更多" +[node name="GlobalServerBroadcastPanel" parent="UI/SmallPanel" instance=ExtResource("37_rawle")] [node name="ScareCrowPanel" type="Panel" parent="UI/SmallPanel"] visible = false @@ -1688,68 +1598,8 @@ size_flags_vertical = 10 theme_override_font_sizes/font_size = 30 text = "放入小卖部" -[node name="TodayDivinationPanel" type="PanelContainer" parent="UI/SmallPanel"] +[node name="TodayDivinationPanel" parent="UI/SmallPanel" instance=ExtResource("47_rawle")] visible = false -offset_left = 345.0 -offset_right = 1050.0 -offset_bottom = 713.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_bpbm8") -script = ExtResource("44_mw3xw") - -[node name="VBox" type="VBoxContainer" parent="UI/SmallPanel/TodayDivinationPanel"] -layout_mode = 2 - -[node name="Title" type="Label" parent="UI/SmallPanel/TodayDivinationPanel/VBox"] -layout_mode = 2 -size_flags_vertical = 0 -theme_override_colors/font_color = Color(0.807843, 1, 0, 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 = 20 -theme_override_constants/shadow_outline_size = 20 -theme_override_font_sizes/font_size = 40 -text = "今日占卜" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="Scroll" type="ScrollContainer" parent="UI/SmallPanel/TodayDivinationPanel/VBox"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Contents" type="RichTextLabel" parent="UI/SmallPanel/TodayDivinationPanel/VBox/Scroll"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_fonts/normal_font = ExtResource("45_vexnj") -theme_override_fonts/mono_font = ExtResource("45_vexnj") -theme_override_fonts/italics_font = ExtResource("45_vexnj") -theme_override_fonts/bold_italics_font = ExtResource("45_vexnj") -theme_override_fonts/bold_font = ExtResource("45_vexnj") -theme_override_font_sizes/bold_italics_font_size = 25 -theme_override_font_sizes/italics_font_size = 25 -theme_override_font_sizes/mono_font_size = 25 -theme_override_font_sizes/normal_font_size = 25 -theme_override_font_sizes/bold_font_size = 25 -bbcode_enabled = true -text = "这是占卜内容" -horizontal_alignment = 1 -threaded = true - -[node name="StartButton" type="Button" parent="UI/SmallPanel/TodayDivinationPanel/VBox"] -custom_minimum_size = Vector2(300, 0) -layout_mode = 2 -size_flags_horizontal = 4 -theme_override_font_sizes/font_size = 35 -text = "开始占卜" - -[node name="QuitButton" type="Button" parent="UI/SmallPanel/TodayDivinationPanel/VBox"] -custom_minimum_size = Vector2(300, 0) -layout_mode = 2 -size_flags_horizontal = 4 -theme_override_font_sizes/font_size = 35 -text = "结束占卜" [node name="PetLadderListPanel" type="Panel" parent="UI/SmallPanel"] visible = false diff --git a/SproutFarm-Frontend/Scene/BigPanel/DailyCheckInPanel.tscn b/SproutFarm-Frontend/Scene/BigPanel/DailyCheckInPanel.tscn index f6274a3..72be029 100644 --- a/SproutFarm-Frontend/Scene/BigPanel/DailyCheckInPanel.tscn +++ b/SproutFarm-Frontend/Scene/BigPanel/DailyCheckInPanel.tscn @@ -3,13 +3,29 @@ [ext_resource type="Script" uid="uid://c0jfbtkh0mj5b" path="res://Script/BigPanel/DailyCheckInPanel.gd" id="1_fj7a7"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_217t6"] +bg_color = Color(0.9, 0.85, 0.7, 0.95) border_width_left = 15 border_width_top = 15 border_width_right = 15 border_width_bottom = 15 +border_color = Color(0.6, 0.4, 0.2, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 corner_detail = 20 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4gvib"] +bg_color = Color(0.95, 0.9, 0.8, 0.8) +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +border_color = Color(0.7, 0.5, 0.3, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 [node name="DailyCheckInPanel" type="Panel"] offset_left = 441.0 @@ -23,7 +39,7 @@ layout_mode = 0 offset_top = 20.0 offset_right = 600.0 offset_bottom = 69.0 -theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1) +theme_override_colors/font_color = Color(0.2, 0.6, 0.2, 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 @@ -31,7 +47,7 @@ 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 = 35 -text = "📅每日签到📅" +text = "🌾 每日签到 🌽" horizontal_alignment = 1 [node name="Label" type="Label" parent="."] @@ -40,6 +56,7 @@ offset_left = 23.0 offset_top = 360.0 offset_right = 585.0 offset_bottom = 409.0 +theme_override_colors/font_color = Color(0.3, 0.5, 0.2, 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 = 2 @@ -48,30 +65,32 @@ theme_override_constants/outline_size = 15 theme_override_constants/shadow_outline_size = 10 theme_override_font_sizes/font_size = 30 theme_override_styles/normal = SubResource("StyleBoxFlat_4gvib") -text = "🎉签到奖励🎉" +text = "🎁今日签到收获🎁" horizontal_alignment = 1 vertical_alignment = 1 [node name="QuitButton" type="Button" parent="."] +modulate = Color(1, 0, 0, 1) custom_minimum_size = Vector2(57, 57) layout_mode = 0 offset_left = 520.0 offset_top = 22.0 offset_right = 577.0 offset_bottom = 79.0 +theme_override_colors/font_disabled_color = Color(1, 0, 0, 1) theme_override_font_sizes/font_size = 35 text = "X" [node name="DailyCheckInButton" type="Button" parent="."] -modulate = Color(1, 1, 0.52549, 1) +modulate = Color(0.7, 0.9, 0.5, 1) custom_minimum_size = Vector2(150, 70) layout_mode = 0 -offset_left = 239.0 -offset_top = 630.0 -offset_right = 389.0 -offset_bottom = 700.0 +offset_left = 181.0 +offset_top = 618.0 +offset_right = 443.0 +offset_bottom = 688.0 theme_override_font_sizes/font_size = 35 -text = "签到" +text = "🌱 今日签到 🌱" [node name="Scroll" type="ScrollContainer" parent="."] layout_mode = 0 @@ -84,6 +103,13 @@ offset_bottom = 360.0 layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 20 +theme_override_font_sizes/bold_italics_font_size = 15 +theme_override_font_sizes/italics_font_size = 15 +theme_override_font_sizes/mono_font_size = 15 +theme_override_font_sizes/normal_font_size = 15 +theme_override_font_sizes/bold_font_size = 15 bbcode_enabled = true threaded = true @@ -95,7 +121,12 @@ offset_right = 577.0 offset_bottom = 630.0 theme_override_font_sizes/normal_font_size = 20 bbcode_enabled = true -text = "+500 经验,+400 钱币,+5 普通-番茄种子,+1 传奇-火龙果种子 " +text = "🌟 +500 农场经验 +💰 +400 金币 +🍅 +5 普通番茄种子 +🐉🍎 +1 传奇火龙果种子 +🌾 额外收获:新鲜农产品! +🐄 农场动物好感度 +10" horizontal_alignment = 1 [node name="ConfirmDialog" type="ConfirmationDialog" parent="."] diff --git a/SproutFarm-Frontend/Scene/BigPanel/LuckyDrawPanel.tscn b/SproutFarm-Frontend/Scene/BigPanel/LuckyDrawPanel.tscn index 2ef7ba2..285f5f4 100644 --- a/SproutFarm-Frontend/Scene/BigPanel/LuckyDrawPanel.tscn +++ b/SproutFarm-Frontend/Scene/BigPanel/LuckyDrawPanel.tscn @@ -3,26 +3,35 @@ [ext_resource type="Script" uid="uid://65e0rl31fx0i" path="res://Script/BigPanel/LuckyDrawPanel.gd" id="1_dcmen"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ynokl"] +bg_color = Color(0.9, 0.85, 0.7, 0.95) border_width_left = 15 border_width_top = 15 border_width_right = 15 border_width_bottom = 15 +border_color = Color(0.6, 0.4, 0.2, 1) +corner_radius_top_left = 15 +corner_radius_top_right = 15 +corner_radius_bottom_right = 15 +corner_radius_bottom_left = 15 corner_detail = 20 +shadow_color = Color(0.3, 0.2, 0.1, 0.3) +shadow_size = 8 [node name="LuckyDrawPanel" type="Panel"] -offset_left = 373.0 +offset_left = 149.0 offset_top = 1.0 -offset_right = 1045.0 +offset_right = 1230.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_left = 16.0 offset_top = 19.0 -offset_right = 669.0 +offset_right = 1062.0 offset_bottom = 78.0 -theme_override_colors/font_color = Color(0.624759, 0.8051, 0.828302, 1) +theme_override_colors/font_color = Color(0.2, 0.6, 0.2, 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 @@ -30,28 +39,29 @@ 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 = 35 -text = "幸运抽奖" +text = "🎰 幸运大抽奖 🎁" horizontal_alignment = 1 vertical_alignment = 1 [node name="Label" type="Label" parent="."] -modulate = Color(0.642982, 0.510828, 1, 1) +modulate = Color(0.8, 0.6, 0.3, 1) layout_mode = 0 offset_top = 419.0 -offset_right = 671.0 +offset_right = 1081.0 offset_bottom = 468.0 theme_override_font_sizes/font_size = 30 -text = "🎉获得奖励🎉" +text = "🎁 抽奖获得奖励 🌾" horizontal_alignment = 1 vertical_alignment = 1 [node name="QuitButton" type="Button" parent="."] +modulate = Color(1, 0, 0, 1) custom_minimum_size = Vector2(57, 57) layout_mode = 0 -offset_left = 595.0 -offset_top = 21.0 -offset_right = 652.0 -offset_bottom = 78.0 +offset_left = 993.0 +offset_top = 30.0 +offset_right = 1050.0 +offset_bottom = 87.0 theme_override_font_sizes/font_size = 35 text = "X" @@ -59,20 +69,20 @@ text = "X" layout_mode = 0 offset_left = 16.0 offset_top = 481.0 -offset_right = 671.0 +offset_right = 1062.0 offset_bottom = 633.0 theme_override_font_sizes/normal_font_size = 20 bbcode_enabled = true -text = "+500 经验,+400 钱币,+5 普通-番茄种子,+1 传奇-火龙果种子 " +text = "🌟 +500 农场经验,💰 +400 金币,🍅 +5 优质番茄种子,🐉 +1 传奇火龙果种子,🚜 +2 农具强化石 " horizontal_alignment = 1 [node name="Grid" type="GridContainer" parent="."] layout_mode = 0 offset_left = 16.0 offset_top = 85.0 -offset_right = 657.0 +offset_right = 1062.0 offset_bottom = 419.0 -columns = 5 +columns = 8 [node name="RewardItem" type="RichTextLabel" parent="Grid"] custom_minimum_size = Vector2(120, 120) @@ -80,10 +90,12 @@ layout_mode = 2 theme_override_constants/outline_size = 15 theme_override_font_sizes/normal_font_size = 17 bbcode_enabled = true -text = "+50钱币 -+100经验 -+4番茄种子 -+3火龙果种子" +text = "💰 +50金币 +🌟 +100农场经验 +🍅 +4番茄种子 +🐉 +3火龙果种子 +🚜 +1农具" +fit_content = true horizontal_alignment = 1 vertical_alignment = 1 threaded = true @@ -92,7 +104,7 @@ threaded = true layout_mode = 0 offset_left = -2.0 offset_top = 633.0 -offset_right = 671.0 +offset_right = 1081.0 offset_bottom = 703.0 alignment = 1 @@ -101,29 +113,34 @@ modulate = Color(0.623529, 1, 0.996078, 1) custom_minimum_size = Vector2(150, 70) layout_mode = 2 theme_override_font_sizes/font_size = 35 -text = "五连抽" +text = "🌱 五连抽 🌱" [node name="TenLuckyDrawButton" type="Button" parent="HBox"] modulate = Color(0.690196, 1, 0.52549, 1) custom_minimum_size = Vector2(150, 70) layout_mode = 2 theme_override_font_sizes/font_size = 35 -text = "十连抽" +text = "🌾 十连抽 🌾" [node name="LuckyDrawButton" type="Button" parent="HBox"] modulate = Color(1, 1, 0.52549, 1) custom_minimum_size = Vector2(150, 70) layout_mode = 2 theme_override_font_sizes/font_size = 35 -text = "抽奖" +text = "🎰 单抽 🍀" [node name="ConfirmDialog" type="ConfirmationDialog" parent="."] -title = "标题" +title = "🎰 农场幸运转盘 🌾" initial_position = 3 size = Vector2i(450, 350) current_screen = 0 ok_button_text = "🎲 确定抽奖" -dialog_text = "弹窗内容" +dialog_text = "🌱 欢迎来到萌芽农场的幸运转盘! + +🎁 在这里您可以获得珍贵的农场奖励: +💰 金币、🌟 经验、🌾 种子、🚜 农具等 + +🍀 准备好开始您的幸运之旅了吗?" dialog_autowrap = true cancel_button_text = "❌ 取消" diff --git a/SproutFarm-Frontend/Scene/BigPanel/PlayGamePanel.tscn b/SproutFarm-Frontend/Scene/BigPanel/PlayGamePanel.tscn index 2c15d35..8681935 100644 --- a/SproutFarm-Frontend/Scene/BigPanel/PlayGamePanel.tscn +++ b/SproutFarm-Frontend/Scene/BigPanel/PlayGamePanel.tscn @@ -448,3 +448,4 @@ text = "X" [connection signal="pressed" from="ScrollContainer/Grid/PushBox/PushBoxButton" to="." method="_on_push_box_button_pressed"] [connection signal="pressed" from="ScrollContainer/Grid/SnakeGame/SnakeGameButton" to="." method="_on_snake_game_button_pressed"] [connection signal="pressed" from="ScrollContainer/Grid/Tetris/TetrisButton" to="." method="_on_tetris_button_pressed"] +[connection signal="pressed" from="QuitButton" to="." method="_on_quit_button_pressed"] diff --git a/SproutFarm-Frontend/Scene/NewPet/PetBattlePanel.gd b/SproutFarm-Frontend/Scene/NewPet/PetBattlePanel.gd index d72ae16..af5b89d 100644 --- a/SproutFarm-Frontend/Scene/NewPet/PetBattlePanel.gd +++ b/SproutFarm-Frontend/Scene/NewPet/PetBattlePanel.gd @@ -95,7 +95,6 @@ func _ready(): # 延迟一帧后设置演示数据,确保所有节点都已准备好 await get_tree().process_frame - #setup_farm_battle() # 可以调用测试函数进行本地测试 #setup_test_battle() @@ -139,8 +138,6 @@ func _process(delta): #=====================本地测试函数=========================== # 本地测试对战函数 - 方便调试各种宠物属性 func setup_test_battle(): - """设置本地测试对战,可以快速测试各种宠物配置和属性""" - print("[测试] 开始设置本地测试对战") # 清理现有战斗 clear_all_pets() @@ -190,9 +187,6 @@ func setup_test_battle(): redman_pet.enable_damage_reflection_skill = true redman_pet.damage_reflection_percentage = 0.8 # 反弹80%伤害 redman_pet.damage_reflection_cooldown = 5.0 # 5秒冷却 - print("[测试] 烈焰鸟开启反弹伤害技能") - - print("[测试] 本地测试对战设置完成,可以观察宠物战斗效果") @@ -205,9 +199,7 @@ func setup_test_battle(): #=====================UI显示=========================== #更新时间显示 func update_time_display(): - """更新时间显示""" var remaining_time: float - if current_battle_state == BattleState.BATTLING: remaining_time = max_battle_time - battle_time else: @@ -234,7 +226,6 @@ func update_time_display(): #显示战斗结果 func show_battle_result(winner: String): - """显示战斗结果""" battle_end_panel.visible = true var title_label = battle_end_panel.get_node("Title") @@ -255,7 +246,6 @@ func show_battle_result(winner: String): #生成战斗统计信息 func generate_battle_stats() -> String: - """生成战斗统计信息""" var stats = "战斗时间: %.1f秒\n\n" % battle_time # MVP统计 @@ -291,7 +281,6 @@ func add_battle_log(message: String): #返回农场按钮 func _on_return_farm_pressed(): - """返回农场按钮""" # 清理战斗场景 clear_all_pets() @@ -305,7 +294,6 @@ func _on_return_farm_pressed(): #获取战斗总结数据 func get_battle_summary() -> Dictionary: - """获取战斗总结数据""" return { "battle_time": battle_time, "damage_dealt": damage_dealt, @@ -360,7 +348,6 @@ func _on_visibility_changed(): #开始战斗 func start_battle(team_a_data: Array, team_b_data: Array): - """开始战斗""" current_battle_state = BattleState.PREPARING battle_time = 0.0 battle_log.clear() @@ -383,7 +370,6 @@ func start_battle(team_a_data: Array, team_b_data: Array): #生成队伍宠物 func spawn_team(team_data: Array, team_name: String, team_node: Node2D): - """生成队伍宠物""" var positions = get_team_positions(team_node) for i in range(min(team_data.size(), positions.size())): @@ -398,7 +384,6 @@ func spawn_team(team_data: Array, team_name: String, team_node: Node2D): #获取队伍位置点 func get_team_positions(team_node: Node2D) -> Array[Vector2]: - """获取队伍位置点""" var positions: Array[Vector2] = [] for child in team_node.get_children(): if child is Marker2D: @@ -407,7 +392,6 @@ func get_team_positions(team_node: Node2D) -> Array[Vector2]: #生成单个宠物 func spawn_pet(pet_info: Dictionary, team: String, pos: Vector2) -> NewPetBase: - """生成单个宠物""" var pet_scene = preload("res://Scene/NewPet/NewPetBase.tscn") var pet = pet_scene.instantiate() @@ -456,7 +440,6 @@ func spawn_pet(pet_info: Dictionary, team: String, pos: Vector2) -> NewPetBase: #应用服务器返回的宠物数据 func apply_server_pet_data(pet: NewPetBase, pet_data: Dictionary): - """应用服务器返回的完整宠物数据""" if pet_data.is_empty(): return @@ -560,7 +543,6 @@ func apply_server_pet_data(pet: NewPetBase, pet_data: Dictionary): #字符串转元素类型枚举 func string_to_element_type(element_string: String) -> NewPetBase.ElementType: - """将字符串转换为元素类型枚举""" match element_string.to_upper(): "FIRE": return NewPetBase.ElementType.FIRE @@ -579,7 +561,6 @@ func string_to_element_type(element_string: String) -> NewPetBase.ElementType: #将配置应用到宠物上 func apply_pet_config(pet: NewPetBase, config: Dictionary): - """将配置应用到宠物上""" if not config.is_empty(): # 基本属性 if config.has("pet_name"): @@ -671,7 +652,6 @@ func apply_pet_config(pet: NewPetBase, config: Dictionary): #应用宠物外观图片 func apply_pet_image(pet: NewPetBase, image_path: String): - """应用宠物外观图片""" if image_path == "" or not ResourceLoader.exists(image_path): return @@ -711,9 +691,6 @@ func apply_pet_image(pet: NewPetBase, image_path: String): pet.right_tool_image.show_behind_parent = new_right_tool.show_behind_parent pet.right_tool_image.visible = true - # 外观应用成功 - else: - pass # 静默处理错误 # 清理临时实例 temp_instance.queue_free() @@ -738,7 +715,6 @@ var level_bonus_config = { #应用等级缩放 func apply_level_scaling(pet: NewPetBase): - """应用等级缩放""" # 每级+2基本属性 var level_bonus = (pet.pet_level - 1) * 2.0 @@ -783,7 +759,6 @@ func apply_level_scaling(pet: NewPetBase): #更新战斗状态 func update_battle_state(): - """更新战斗状态""" # 先清理无效的宠物引用 cleanup_invalid_pet_references() @@ -803,7 +778,6 @@ func update_battle_state(): #=================即时清理防止游戏卡死===================== #清理无效的宠物引用 func cleanup_invalid_pet_references(): - """清理数组中的无效宠物引用""" # 清理all_pets数组中的无效引用 var valid_all_pets: Array[NewPetBase] = [] for pet in all_pets: @@ -825,8 +799,8 @@ func cleanup_invalid_pet_references(): valid_team_b_pets.append(pet) team_b_pets = valid_team_b_pets +#清理死亡对象以优化性能 func cleanup_dead_objects(): - """清理死亡对象以优化性能""" # 更严格的死亡宠物清理逻辑 var dead_pets = [] for pet in all_pets: @@ -870,7 +844,6 @@ func cleanup_dead_objects(): #结束战斗 func end_battle(winner: String): - """结束战斗""" if current_battle_state == BattleState.ENDED: return @@ -923,7 +896,6 @@ func end_battle(winner: String): #清理所有宠物 func clear_all_pets(): - """清理所有宠物""" for pet in all_pets: if is_instance_valid(pet): pet.queue_free() @@ -937,7 +909,6 @@ func clear_all_pets(): #清理所有召唤的仆从小弟 func clear_all_minions(): - """清理所有召唤的仆从小弟""" # 获取所有pets组中的节点 var all_pets_in_group = get_tree().get_nodes_in_group("pets") var minions_cleared = 0 @@ -959,7 +930,6 @@ func clear_all_minions(): #立即清理所有宠物 func clear_all_pets_immediately(): - """立即清理所有宠物(用于时间到时的平局处理)""" for pet in all_pets: if is_instance_valid(pet): # 立即设置为死亡状态 @@ -990,14 +960,12 @@ func clear_all_pets_immediately(): #宠物死亡事件 func _on_pet_died(pet: NewPetBase): - """宠物死亡事件""" # 简化死亡处理,减少不必要的计算 if battle_log.size() < 30: # 限制死亡日志数量 add_battle_log("[color=red]%s 死亡[/color]" % pet.pet_name) #宠物攻击事件 func _on_pet_attacked(attacker: NewPetBase, target: NewPetBase, damage: float): - """宠物攻击事件""" # 简化统计更新 damage_dealt[attacker.pet_id] = damage_dealt.get(attacker.pet_id, 0.0) + damage damage_taken[target.pet_id] = damage_taken.get(target.pet_id, 0.0) + damage @@ -1008,7 +976,6 @@ func _on_pet_attacked(attacker: NewPetBase, target: NewPetBase, damage: float): #宠物技能使用事件 func _on_pet_skill_used(pet: NewPetBase, skill_name: String): - """宠物技能使用事件""" # 减少技能日志,只记录重要技能 if skill_name in ["狂暴模式", "自爆", "召唤小弟", "死亡重生"]: add_battle_log("[color=cyan]%s:%s[/color]" % [pet.pet_name, skill_name]) @@ -1017,7 +984,6 @@ func _on_pet_skill_used(pet: NewPetBase, skill_name: String): #================偷菜对战设置=========================== # 设置偷菜对战 func setup_steal_battle(attacker_pets: Array, defender_pets: Array, attacker_name: String, defender_name: String): - """设置偷菜对战""" print("[PetBattlePanel] 设置偷菜对战: 攻击者=%s, 防守者=%s" % [attacker_name, defender_name]) print("[PetBattlePanel] 攻击方宠物数量: %d, 防守方宠物数量: %d" % [attacker_pets.size(), defender_pets.size()]) @@ -1044,9 +1010,6 @@ func setup_steal_battle(attacker_pets: Array, defender_pets: Array, attacker_nam # 限制出战宠物数量最多4个 var limited_attacker_pets = attacker_pets.slice(0, min(4, attacker_pets.size())) var limited_defender_pets = defender_pets.slice(0, min(4, defender_pets.size())) - - print("[PetBattlePanel] 限制后攻击方宠物数量: %d, 防守方宠物数量: %d" % [limited_attacker_pets.size(), limited_defender_pets.size()]) - # 显示对战面板 show() @@ -1079,8 +1042,6 @@ func setup_steal_battle(attacker_pets: Array, defender_pets: Array, attacker_nam team_b_pets.append(pet) all_pets.append(pet) - print("[PetBattlePanel] 对战设置完成,攻击方: %d只,防守方: %d只" % [team_a_pets.size(), team_b_pets.size()]) - # 添加战斗日志 add_battle_log("[color=yellow]偷菜对战开始![/color]") add_battle_log("[color=cyan]%s VS %s[/color]" % [team_a_name, team_b_name]) @@ -1096,7 +1057,6 @@ func setup_steal_battle(attacker_pets: Array, defender_pets: Array, attacker_nam #美化确认弹窗 func setup_confirm_dialog(): - """设置和美化确认弹窗""" confirm_dialog.title = "辅助功能确认" confirm_dialog.ok_button_text = "确认使用" confirm_dialog.cancel_button_text = "取消" @@ -1122,7 +1082,6 @@ func setup_confirm_dialog(): #更新辅助功能冷却计时器 func update_assist_cooldowns(delta: float): - """更新辅助功能冷却计时器""" # 更新冷却计时器 if heal_cooldown_timer > 0: heal_cooldown_timer -= delta @@ -1150,7 +1109,6 @@ func update_assist_cooldowns(delta: float): #显示辅助功能确认弹窗 func show_assist_confirm(operation_type: String, description: String, effect: String): - """显示辅助功能确认弹窗""" current_assist_operation = operation_type # 设置弹窗内容(纯文本格式) @@ -1164,25 +1122,22 @@ func show_assist_confirm(operation_type: String, description: String, effect: St #确认使用辅助功能 func _on_assist_confirmed(): - """确认使用辅助功能""" match current_assist_operation: - "heal": + "heal": # 团队治疗 execute_team_heal() - "rage": + "rage": # 团队狂暴 execute_team_rage() - "shield": + "shield": # 团队护盾 execute_team_shield() current_assist_operation = "" #取消使用辅助功能 func _on_assist_canceled(): - """取消使用辅助功能""" current_assist_operation = "" #执行团队治疗 func execute_team_heal(): - """执行团队治疗功能""" var healed_count = 0 # 只对teamA(attacker队伍)的宠物生效 for pet in all_pets: @@ -1215,7 +1170,6 @@ func execute_team_heal(): #执行团队狂暴 func execute_team_rage(): - """执行团队狂暴功能""" var raged_count = 0 # 只对teamA(attacker队伍)的宠物生效 for pet in all_pets: @@ -1246,7 +1200,6 @@ func execute_team_rage(): #执行团队护盾 func execute_team_shield(): - """执行团队护盾功能""" var shielded_count = 0 # 只对teamA(attacker队伍)的宠物生效 for pet in all_pets: diff --git a/SproutFarm-Frontend/Scene/NewPet/PetConfig.gd b/SproutFarm-Frontend/Scene/NewPet/PetConfig.gd index ade8cba..cb1f6c7 100644 --- a/SproutFarm-Frontend/Scene/NewPet/PetConfig.gd +++ b/SproutFarm-Frontend/Scene/NewPet/PetConfig.gd @@ -266,39 +266,26 @@ var pet_configs: Dictionary = { # 初始化函数 func _ready(): - """节点准备就绪时自动加载JSON配置""" load_configs_from_json() -# 手动初始化配置的函数 -func initialize_configs(): - """手动初始化宠物配置,优先从JSON加载""" - if not load_configs_from_json(): - print("JSON加载失败,使用默认配置") - # 如果JSON加载失败,保持使用代码中的默认配置 - - -# 获取宠物配置的函数 +# 根据宠物键值获取配置 func get_pet_config(pet_key: String) -> Dictionary: - """根据宠物键值获取配置""" if pet_configs.has(pet_key): return pet_configs[pet_key] else: print("未找到宠物配置: ", pet_key, ",使用默认配置") return get_default_config() -# 获取所有宠物配置键值的函数 +# 获取所有宠物配置键值 func get_all_pet_keys() -> Array: - """获取所有可用的宠物配置键值""" return pet_configs.keys() -# 检查宠物配置是否存在的函数 +# 检查宠物配置是否存在 func has_pet_config(pet_key: String) -> bool: - """检查指定的宠物配置是否存在""" return pet_configs.has(pet_key) -# 获取默认配置的函数 +# 获取默认配置 func get_default_config() -> Dictionary: - """获取默认宠物配置""" return { "pet_name": pet_name, "pet_id": pet_id, @@ -343,9 +330,8 @@ func get_default_config() -> Dictionary: "right_weapon": right_weapon } -# 字符串转换为ElementType枚举的函数 +# 字符串转换为ElementType枚举 func string_to_element_type(element_str: String) -> ElementType: - """将字符串转换为ElementType枚举""" match element_str.to_upper(): "NONE":#没有元素类型 return ElementType.NONE @@ -364,9 +350,8 @@ func string_to_element_type(element_str: String) -> ElementType: _: return ElementType.NONE -# 从JSON文件加载宠物配置的函数 +# 从JSON文件加载宠物配置 func load_configs_from_json(file_path: String = "res://Scene/NewPet/Pet_data.json") -> bool: - """从JSON文件加载宠物配置""" if not FileAccess.file_exists(file_path): print("宠物配置文件不存在: ", file_path) return false diff --git a/SproutFarm-Frontend/Scene/NewPet/Pet_bag.json b/SproutFarm-Frontend/Scene/NewPet/Pet_bag.json deleted file mode 100644 index b6abc43..0000000 --- a/SproutFarm-Frontend/Scene/NewPet/Pet_bag.json +++ /dev/null @@ -1,81 +0,0 @@ -{ -"宠物仓库":{ - "烈焰鸟": { - "pet_name": "树萌芽の烈焰鸟", - "pet_image":"res://Scene/NewPet/PetType/flying_bird.tscn", - "pet_id": "wea1212w12", - "pet_type": "烈焰鸟", - "pet_level": 1, - "pet_experience": 500, - "pet_temperament": "勇猛", - "pet_birthday": "2025-07-25", - "pet_hobby": "喜欢战斗和烈火", - "pet_introduction": "我爱吃虫子", - "max_health": 300.0, - "enable_health_regen": true, - "health_regen": 2.0, - "enable_shield_regen": true, - "max_shield": 150.0, - "shield_regen": 1.5, - "max_armor": 120.0, - "base_attack_damage": 40.0, - "crit_rate": 0.15, - "crit_damage": 2.0, - "armor_penetration": 10.0, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 2.0, - "enable_berserker_skill": true, - "berserker_bonus": 1.8, - "berserker_duration": 6.0, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": false, - "enable_death_respawn_skill": true, - "respawn_health_percentage": 0.4, - "move_speed": 180.0, - "dodge_rate": 0.08, - "element_type": "FIRE", - "element_damage_bonus": 75.0, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - }, - "大蓝虫": { - "pet_name": "树萌芽の大蓝虫", - "pet_image":"res://Scene/NewPet/PetType/big_beetle.tscn", - "pet_id": "dlc123123", - "pet_type": "大甲壳虫", - "pet_level": 8, - "pet_experience": 320, - "pet_temperament": "冷静", - "pet_birthday": "2023-06-20", - "pet_hobby": "喜欢和小甲壳虫玩", - "pet_introduction": "我是大蓝虫,不是大懒虫!", - "max_health": 180.0, - "enable_health_regen": true, - "health_regen": 1.2, - "enable_shield_regen": true, - "max_shield": 200.0, - "shield_regen": 2.5, - "max_armor": 80.0, - "base_attack_damage": 35.0, - "crit_rate": 0.12, - "crit_damage": 1.8, - "armor_penetration": 15.0, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 1.5, - "enable_berserker_skill": false, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": true, - "summon_count": 2, - "summon_scale": 0.15, - "enable_death_respawn_skill": false, - "move_speed": 120.0, - "dodge_rate": 0.12, - "element_type": "WATER", - "element_damage_bonus": 100.0, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - } - }, -"巡逻宠物":["wea1212w12"], -"出战宠物":["dlc123123"] -} \ No newline at end of file diff --git a/SproutFarm-Frontend/Scene/NewPet/Pet_data.json b/SproutFarm-Frontend/Scene/NewPet/Pet_data.json deleted file mode 100644 index e9dbd91..0000000 --- a/SproutFarm-Frontend/Scene/NewPet/Pet_data.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "_id": { - "$oid": "687cf59b8e77ba00a7414bab" - }, - "updated_at": { - "$date": "2025-07-20T22:13:38.521Z" - }, - "烈焰鸟": { - "pet_name": "树萌芽の烈焰鸟", - "can_purchase": true, - "cost": 1000, - "pet_image": "res://Scene/NewPet/PetType/flying_bird.tscn", - "pet_id": "0001", - "pet_type": "烈焰鸟", - "pet_level": 1, - "pet_experience": 500, - "pet_temperament": "勇猛", - "pet_birthday": "2023-03-15", - "pet_hobby": "喜欢战斗和烈火", - "pet_introduction": "我爱吃虫子", - "max_health": 300, - "enable_health_regen": true, - "health_regen": 2, - "enable_shield_regen": true, - "max_shield": 150, - "shield_regen": 1.5, - "max_armor": 120, - "base_attack_damage": 40, - "crit_rate": 0.15, - "crit_damage": 2, - "armor_penetration": 10, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 2, - "enable_berserker_skill": true, - "berserker_bonus": 1.8, - "berserker_duration": 6, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": false, - "enable_death_respawn_skill": true, - "respawn_health_percentage": 0.4, - "move_speed": 180, - "dodge_rate": 0.08, - "element_type": "FIRE", - "element_damage_bonus": 75, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - }, - "大蓝虫": { - "pet_name": "树萌芽の大蓝虫", - "can_purchase": true, - "cost": 1000, - "pet_image": "res://Scene/NewPet/PetType/big_beetle.tscn", - "pet_id": "0002", - "pet_type": "大蓝虫", - "pet_level": 8, - "pet_experience": 320, - "pet_temperament": "冷静", - "pet_birthday": "2023-06-20", - "pet_hobby": "喜欢和小甲壳虫玩", - "pet_introduction": "我是大蓝虫,不是大懒虫!", - "max_health": 180, - "enable_health_regen": true, - "health_regen": 1.2, - "enable_shield_regen": true, - "max_shield": 200, - "shield_regen": 2.5, - "max_armor": 80, - "base_attack_damage": 35, - "crit_rate": 0.12, - "crit_damage": 1.8, - "armor_penetration": 15, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 1.5, - "enable_berserker_skill": false, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": true, - "summon_count": 2, - "summon_scale": 0.15, - "enable_death_respawn_skill": false, - "move_speed": 120, - "dodge_rate": 0.12, - "element_type": "WATER", - "element_damage_bonus": 100, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - }, - "小蓝虫": { - "pet_name": "树萌芽の小蓝虫", - "can_purchase": true, - "cost": 1000, - "pet_image": "res://Scene/NewPet/PetType/small_beetle.tscn", - "pet_id": "0002", - "pet_type": "小蓝虫", - "pet_level": 1, - "pet_experience": 0, - "pet_temperament": "冷静", - "pet_birthday": "2023-06-20", - "pet_hobby": "喜欢和大蓝虫玩", - "pet_introduction": "我是小蓝虫,不是小懒虫!", - "max_health": 90, - "enable_health_regen": true, - "health_regen": 1.2, - "enable_shield_regen": true, - "max_shield": 200, - "shield_regen": 2.5, - "max_armor": 80, - "base_attack_damage": 35, - "crit_rate": 0.12, - "crit_damage": 1.8, - "armor_penetration": 15, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 1.5, - "enable_berserker_skill": false, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": true, - "summon_count": 2, - "summon_scale": 0.15, - "enable_death_respawn_skill": false, - "move_speed": 120, - "dodge_rate": 0.12, - "element_type": "WATER", - "element_damage_bonus": 100, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - }, - "小蓝": { - "pet_name": "树萌芽の小蓝", - "can_purchase": true, - "cost": 1000, - "pet_image": "res://Scene/NewPet/PetType/small_blue.tscn", - "pet_id": "0002", - "pet_type": "小蓝", - "pet_level": 1, - "pet_experience": 0, - "pet_temperament": "冷静", - "pet_birthday": "2023-06-20", - "pet_hobby": "喜欢和小黄一起玩", - "pet_introduction": "我是小黄!", - "max_health": 120, - "enable_health_regen": true, - "health_regen": 1.2, - "enable_shield_regen": true, - "max_shield": 200, - "shield_regen": 2.5, - "max_armor": 80, - "base_attack_damage": 35, - "crit_rate": 0.12, - "crit_damage": 1.8, - "armor_penetration": 15, - "enable_multi_projectile_skill": true, - "multi_projectile_delay": 1.5, - "enable_berserker_skill": false, - "enable_self_destruct_skill": false, - "enable_summon_pet_skill": true, - "summon_count": 2, - "summon_scale": 0.15, - "enable_death_respawn_skill": false, - "move_speed": 120, - "dodge_rate": 0.12, - "element_type": "WATER", - "element_damage_bonus": 100, - "left_weapon": "钻石剑", - "right_weapon": "钻石剑" - } -} \ No newline at end of file diff --git a/SproutFarm-Frontend/Scene/SmallPanel/AccountSettingPanel.tscn b/SproutFarm-Frontend/Scene/SmallPanel/AccountSettingPanel.tscn index 475d981..760eddb 100644 --- a/SproutFarm-Frontend/Scene/SmallPanel/AccountSettingPanel.tscn +++ b/SproutFarm-Frontend/Scene/SmallPanel/AccountSettingPanel.tscn @@ -5,20 +5,24 @@ [ext_resource type="Script" uid="uid://0d2j5m6j2ema" path="res://Components/HTTPTextureRect.gd" id="3_wibl7"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y1hsh"] -border_color = Color(2.98411e-06, 0.95982, 0.386903, 1) +bg_color = Color(0.9, 0.85, 0.7, 0.95) +border_width_left = 5 +border_width_top = 5 +border_width_right = 5 +border_width_bottom = 5 +border_color = Color(0.6, 0.4, 0.2, 1) border_blend = true corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 corner_detail = 20 +shadow_color = Color(0.3, 0.2, 0.1, 0.5) shadow_size = 20 shadow_offset = Vector2(10, 10) -anti_aliasing = false anti_aliasing_size = 5.0 [node name="AccountSettingPanel" type="Panel"] -visible = false offset_left = 243.0 offset_top = 42.0 offset_right = 1154.0 @@ -27,7 +31,7 @@ theme_override_styles/panel = SubResource("StyleBoxFlat_y1hsh") script = ExtResource("1_xfiot") [node name="Title" type="RichTextLabel" parent="."] -modulate = Color(1, 0.745098, 0.54902, 1) +modulate = Color(0.2, 0.6, 0.2, 1) layout_mode = 0 offset_left = 2.0 offset_right = 911.0 @@ -41,27 +45,31 @@ theme_override_constants/shadow_offset_x = 3 theme_override_constants/shadow_outline_size = 10 theme_override_font_sizes/normal_font_size = 40 bbcode_enabled = true -text = "玩家信息设置" +text = "🌾 萌芽农场 - 农场主信息 🚜" horizontal_alignment = 1 threaded = true [node name="QuitButton" type="Button" parent="."] +modulate = Color(0.984314, 0, 0, 1) custom_minimum_size = Vector2(55, 55) layout_mode = 0 -offset_left = 854.0 -offset_right = 911.0 -offset_bottom = 57.0 +offset_left = 833.0 +offset_top = 19.0 +offset_right = 890.0 +offset_bottom = 76.0 +theme_override_colors/font_disabled_color = Color(0, 0, 0, 1) theme_override_font_sizes/font_size = 35 text = "X" [node name="RefreshButton" type="Button" parent="."] custom_minimum_size = Vector2(55, 55) layout_mode = 0 -offset_left = 2.0 -offset_right = 80.0 -offset_bottom = 57.0 +offset_left = 25.0 +offset_top = 19.0 +offset_right = 160.0 +offset_bottom = 76.0 theme_override_font_sizes/font_size = 35 -text = "刷新" +text = "🔄 刷新" [node name="VBox1" type="VBoxContainer" parent="."] layout_mode = 0 @@ -86,7 +94,7 @@ columns = 2 [node name="User_Name" type="Label" parent="VBox1/Grid"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "账户:" +text = "🔑 农场账户:" horizontal_alignment = 1 vertical_alignment = 1 @@ -99,7 +107,7 @@ vertical_alignment = 1 [node name="User_Password" type="Label" parent="VBox1/Grid"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "密码:" +text = "🔒 农场密钥:" horizontal_alignment = 1 vertical_alignment = 1 @@ -107,40 +115,40 @@ vertical_alignment = 1 layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入密码" +placeholder_text = "请输入您的农场密钥" [node name="Player_Name" type="Label" parent="VBox1/Grid"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "玩家昵称:" +text = "👨‍🌾 农场主昵称:" [node name="Player_Name_Input" type="LineEdit" parent="VBox1/Grid"] layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入玩家昵称" +placeholder_text = "请输入您的农场主昵称" [node name="Farm_Name" type="Label" parent="VBox1/Grid"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "农场名称:" +text = "🏡 我的农场名:" [node name="Farm_Name_Input" type="LineEdit" parent="VBox1/Grid"] layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入农场名称" +placeholder_text = "为您的萌芽农场起个好听的名字" [node name="Personal_Profile" type="Label" parent="VBox1/Grid"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "个人简介:" +text = "📝 农场故事:" [node name="Personal_Profile_Input" type="LineEdit" parent="VBox1/Grid"] layout_mode = 2 size_flags_horizontal = 3 theme_override_font_sizes/font_size = 30 -placeholder_text = "请输入个人简介" +placeholder_text = "讲述您的农场故事和种植计划" [node name="HBox2" type="HBoxContainer" parent="VBox1"] layout_mode = 2 @@ -149,9 +157,9 @@ alignment = 1 [node name="Remove_Account_Btn" type="Button" parent="VBox1/HBox2"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "删除账号" +text = "❌ 注销农场" [node name="Confirm_Btn" type="Button" parent="VBox1/HBox2"] layout_mode = 2 theme_override_font_sizes/font_size = 30 -text = "确认修改" +text = "✅ 保存信息" diff --git a/SproutFarm-Frontend/Scene/SmallPanel/GlobalServerBroadcastPanel.tscn b/SproutFarm-Frontend/Scene/SmallPanel/GlobalServerBroadcastPanel.tscn new file mode 100644 index 0000000..2c0e4d9 --- /dev/null +++ b/SproutFarm-Frontend/Scene/SmallPanel/GlobalServerBroadcastPanel.tscn @@ -0,0 +1,95 @@ +[gd_scene load_steps=3 format=3 uid="uid://djh8bnauphg8v"] + +[ext_resource type="Script" uid="uid://bakeq8tm6r4j4" path="res://Script/SmallPanel/GlobalServerBroadcastPanel.gd" id="1_r7t0y"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_k1sw4"] +bg_color = Color(0.9, 0.85, 0.7, 0.95) +border_width_left = 10 +border_width_top = 10 +border_width_right = 10 +border_width_bottom = 10 +border_color = Color(0.6, 0.4, 0.2, 1) +corner_radius_top_left = 12 +corner_radius_top_right = 12 +corner_radius_bottom_right = 12 +corner_radius_bottom_left = 12 +corner_detail = 20 +shadow_color = Color(0.3, 0.2, 0.1, 0.3) +shadow_size = 20 +shadow_offset = Vector2(5, 5) + +[node name="GlobalServerBroadcastPanel" type="Panel"] +offset_left = 322.0 +offset_right = 985.0 +offset_bottom = 721.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_k1sw4") +script = ExtResource("1_r7t0y") + +[node name="Title" type="Label" parent="."] +layout_mode = 0 +offset_left = 13.0 +offset_top = 12.0 +offset_right = 653.0 +offset_bottom = 63.0 +theme_override_colors/font_color = Color(0.2, 0.6, 0.2, 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 = 35 +text = "📢 全服广播 📻" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="MessageContents" type="RichTextLabel" parent="."] +layout_mode = 0 +offset_left = 10.0 +offset_top = 72.0 +offset_right = 653.0 +offset_bottom = 642.0 +theme_override_font_sizes/bold_italics_font_size = 15 +theme_override_font_sizes/italics_font_size = 15 +theme_override_font_sizes/mono_font_size = 15 +theme_override_font_sizes/normal_font_size = 15 +theme_override_font_sizes/bold_font_size = 15 +bbcode_enabled = true + +[node name="HBox" type="HBoxContainer" parent="."] +layout_mode = 0 +offset_left = 8.0 +offset_top = 649.0 +offset_right = 653.0 +offset_bottom = 709.0 + +[node name="InputMessage" type="LineEdit" parent="HBox"] +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "🌱 分享您的农场故事和心得..." + +[node name="SendMessageButton" type="Button" parent="HBox"] +layout_mode = 2 +theme_override_font_sizes/font_size = 30 +text = "📤 发送消息" + +[node name="QuitButton" type="Button" parent="."] +modulate = Color(1, 0, 0, 1) +custom_minimum_size = Vector2(50, 50) +layout_mode = 0 +offset_left = 601.0 +offset_top = 12.0 +offset_right = 651.0 +offset_bottom = 62.0 +theme_override_font_sizes/font_size = 30 +text = "X" + +[node name="WatchMoreButton" type="Button" parent="."] +custom_minimum_size = Vector2(50, 50) +layout_mode = 0 +offset_left = 13.0 +offset_top = 12.0 +offset_right = 141.0 +offset_bottom = 62.0 +theme_override_font_sizes/font_size = 30 +text = "📜 查看更多" diff --git a/SproutFarm-Frontend/Scene/SmallPanel/TodayDivinationPanel.tscn b/SproutFarm-Frontend/Scene/SmallPanel/TodayDivinationPanel.tscn new file mode 100644 index 0000000..c55dbb8 --- /dev/null +++ b/SproutFarm-Frontend/Scene/SmallPanel/TodayDivinationPanel.tscn @@ -0,0 +1,91 @@ +[gd_scene load_steps=4 format=3 uid="uid://yc4ag7vxsrfv"] + +[ext_resource type="Script" uid="uid://bkel88rscubov" path="res://Script/SmallPanel/TodayDivinationPanel.gd" id="1_b6743"] +[ext_resource type="FontFile" uid="uid://b81msdfp2ym2g" path="res://assets/字体/MapleMono-NF-CN-BoldItalic.ttf" id="2_823yi"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bpbm8"] +bg_color = Color(0.9, 0.85, 0.7, 0.95) +border_width_left = 15 +border_width_top = 15 +border_width_right = 15 +border_width_bottom = 15 +border_color = Color(0.6, 0.4, 0.2, 1) +corner_radius_top_left = 15 +corner_radius_top_right = 15 +corner_radius_bottom_right = 15 +corner_radius_bottom_left = 15 +corner_detail = 20 +shadow_color = Color(0.3, 0.2, 0.1, 0.3) +shadow_size = 8 + +[node name="TodayDivinationPanel" type="PanelContainer"] +offset_left = 345.0 +offset_right = 1050.0 +offset_bottom = 713.0 +theme_override_styles/panel = SubResource("StyleBoxFlat_bpbm8") +script = ExtResource("1_b6743") + +[node name="VBox" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Title" type="Label" parent="VBox"] +layout_mode = 2 +size_flags_vertical = 0 +theme_override_colors/font_color = Color(0.2, 0.6, 0.2, 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 = 20 +theme_override_constants/shadow_outline_size = 20 +theme_override_font_sizes/font_size = 40 +text = "🌾 今日占卜 🚜" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="Scroll" type="ScrollContainer" parent="VBox"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Contents" type="RichTextLabel" parent="VBox/Scroll"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_fonts/normal_font = ExtResource("2_823yi") +theme_override_fonts/mono_font = ExtResource("2_823yi") +theme_override_fonts/italics_font = ExtResource("2_823yi") +theme_override_fonts/bold_italics_font = ExtResource("2_823yi") +theme_override_fonts/bold_font = ExtResource("2_823yi") +theme_override_font_sizes/bold_italics_font_size = 25 +theme_override_font_sizes/italics_font_size = 25 +theme_override_font_sizes/mono_font_size = 25 +theme_override_font_sizes/normal_font_size = 25 +theme_override_font_sizes/bold_font_size = 25 +bbcode_enabled = true +text = "🌟 欢迎来到萌芽农场的神秘占卜屋!🌟 + +🔮 在这里,古老的农场智慧将为您揭示今日的农运: + +🌱 作物生长运势 +🐄 牲畜健康指数 +💰 农场收益预测 +🌤️ 天气变化提醒 +🎯 种植建议指导 + +点击下方按钮,开启您的农场运势之旅!✨" +horizontal_alignment = 1 +threaded = true + +[node name="StartButton" type="Button" parent="VBox"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_font_sizes/font_size = 35 +text = "🌱 开启预测 🔮" + +[node name="QuitButton" type="Button" parent="VBox"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_font_sizes/font_size = 35 +text = "🚪 返回农场 🏡" diff --git a/SproutFarm-Frontend/Script/BigPanel/CropStorePanel.gd b/SproutFarm-Frontend/Script/BigPanel/CropStorePanel.gd index 6bd5f92..0fe980c 100644 --- a/SproutFarm-Frontend/Script/BigPanel/CropStorePanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/CropStorePanel.gd @@ -644,7 +644,7 @@ func _load_stock_data(): if file: var json_string = file.get_as_text() file.close() - print("读取到的JSON数据:", json_string) + #print("读取到的JSON数据:", json_string) var json = JSON.new() var parse_result = json.parse(json_string) @@ -653,7 +653,7 @@ func _load_stock_data(): crop_stock_data = data.get("stock", {}) last_refresh_date = data.get("last_refresh_date", "") print("库存数据加载成功,库存条目数:", crop_stock_data.size()) - print("加载的库存数据:", crop_stock_data) + #print("加载的库存数据:", crop_stock_data) print("上次刷新日期:", last_refresh_date) # 如果库存数据为空,重新生成 @@ -678,7 +678,7 @@ func _save_stock_data(): } print("准备保存库存数据到:", stock_file_path) - print("保存的数据:", data) + #print("保存的数据:", data) var file = FileAccess.open(stock_file_path, FileAccess.WRITE) if file: @@ -710,7 +710,7 @@ func _generate_initial_stock(): var stock_amount = _get_stock_amount_by_quality(crop["品质"]) crop_stock_data[crop_name] = stock_amount generated_count += 1 - print("生成库存:", crop_name, " - ", crop["品质"], " - ", stock_amount, "个") + #print("生成库存:", crop_name, " - ", crop["品质"], " - ", stock_amount, "个") # 设置当前日期为刷新日期 last_refresh_date = _get_current_date() @@ -760,7 +760,7 @@ func _check_daily_refresh(): # 每日刷新库存 func _refresh_daily_stock(): _generate_initial_stock() - Toast.show("种子商店库存已刷新!", Color.GREEN, 3.0, 1.0) + #Toast.show("种子商店库存已刷新!", Color.GREEN, 3.0, 1.0) # 获取作物当前库存 func _get_crop_stock(crop_name: String) -> int: diff --git a/SproutFarm-Frontend/Script/BigPanel/CropWarehousePanel.gd b/SproutFarm-Frontend/Script/BigPanel/CropWarehousePanel.gd index 9ece46c..4c67bab 100644 --- a/SproutFarm-Frontend/Script/BigPanel/CropWarehousePanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/CropWarehousePanel.gd @@ -530,7 +530,7 @@ func _get_crop_harvest_texture(crop_name: String) -> Texture2D: if ResourceLoader.exists(harvest_texture_path): var texture = load(harvest_texture_path) if texture: - print("仓库加载作物收获物图片:", crop_name) + #print("仓库加载作物收获物图片:", crop_name) return texture # 如果没有找到,使用默认的收获物图片 diff --git a/SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd b/SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd index 33c450e..865d262 100644 --- a/SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd @@ -252,7 +252,7 @@ func _update_button_item_image(button: Button, item_name: String): # CropImage是Sprite2D,直接设置texture属性 item_image.texture = texture item_image.visible = true - print("道具商店更新道具图片:", item_name) + #print("道具商店更新道具图片:", item_name) else: # 如果没有图片,隐藏图片节点 item_image.visible = false diff --git a/SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd b/SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd index f82b88b..bdf3bea 100644 --- a/SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd @@ -128,10 +128,10 @@ func _update_button_pet_image(button: Button, pet_name: String): if pet_config.has(pet_name): var pet_info = pet_config[pet_name] var scene_path = pet_info.get("pet_image", "") # 使用服务器数据的pet_image字段 - print("宠物背包 ", pet_name, " 的图片路径:", scene_path) + #print("宠物背包 ", pet_name, " 的图片路径:", scene_path) if scene_path != "" and ResourceLoader.exists(scene_path): - print("宠物背包开始加载宠物场景:", scene_path) + #print("宠物背包开始加载宠物场景:", scene_path) # 加载宠物场景并获取PetImage的纹理 var pet_scene = load(scene_path) if pet_scene: @@ -145,7 +145,7 @@ func _update_button_pet_image(button: Button, pet_name: String): var frame_count = pet_instance.sprite_frames.get_frame_count(default_animation) if frame_count > 0: texture = pet_instance.sprite_frames.get_frame_texture(default_animation, 0) - print("宠物背包成功获取宠物纹理:", pet_name) + #print("宠物背包成功获取宠物纹理:", pet_name) else: print("宠物背包场景没有动画:", pet_name) else: @@ -155,8 +155,7 @@ func _update_button_pet_image(button: Button, pet_name: String): print("宠物背包无法加载宠物场景:", scene_path) else: print("宠物背包图片路径无效或文件不存在:", scene_path) - else: - print("宠物背包配置中没有找到:", pet_name) + # 设置图片 if texture: @@ -165,26 +164,10 @@ func _update_button_pet_image(button: Button, pet_name: String): pet_image.scale = Vector2(10, 10) # 确保图片居中显示 pet_image.centered = true - print("宠物背包成功设置宠物图片:", pet_name) + #print("宠物背包成功设置宠物图片:", pet_name) else: pet_image.visible = false - print("宠物背包无法获取宠物图片:", pet_name) -# 加载宠物配置数据 -func _load_pet_config() -> Dictionary: - var file = FileAccess.open("res://Data/pet_data.json", FileAccess.READ) - if file == null: - return {} - - var json = JSON.new() - var json_string = file.get_as_text() - file.close() - - var parse_result = json.parse(json_string) - if parse_result != OK: - return {} - - return json.data # 计算宠物年龄(以天为单位) func _calculate_pet_age(birthday: String) -> int: diff --git a/SproutFarm-Frontend/Script/BigPanel/PetStorePanel.gd b/SproutFarm-Frontend/Script/BigPanel/PetStorePanel.gd index 701d4cd..764a94c 100644 --- a/SproutFarm-Frontend/Script/BigPanel/PetStorePanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/PetStorePanel.gd @@ -59,12 +59,11 @@ func update_pet_store_ui(): child.queue_free() print("更新宠物商店UI,宠物种类:", pet_config.size()) - print("宠物配置数据:", pet_config) # 为每个宠物配置创建按钮 for pet_name in pet_config.keys(): var pet_info = pet_config[pet_name] - print("处理宠物:", pet_name, ",数据:", pet_info) + #print("处理宠物:", pet_name, ",数据:", pet_info) # 适配扁平化数据格式 var can_buy = pet_info.get("can_purchase", false) @@ -93,7 +92,7 @@ func update_pet_store_ui(): button.pressed.connect(func(): _on_store_pet_selected(pet_name, pet_cost, pet_desc)) store_grid.add_child(button) - print("已添加宠物按钮:", pet_name) + #print("已添加宠物按钮:", pet_name) # 检查玩家是否已拥有某种宠物 func _check_pet_owned(pet_name: String) -> bool: @@ -157,10 +156,10 @@ func _update_button_pet_image(button: Button, pet_name: String): if pet_config.has(pet_name): var pet_info = pet_config[pet_name] var scene_path = pet_info.get("pet_image", "") - print("宠物 ", pet_name, " 的图片路径:", scene_path) + #print("宠物 ", pet_name, " 的图片路径:", scene_path) if scene_path != "" and ResourceLoader.exists(scene_path): - print("开始加载宠物场景:", scene_path) + #print("开始加载宠物场景:", scene_path) # 加载宠物场景并获取PetImage的纹理 var pet_scene = load(scene_path) if pet_scene: @@ -175,7 +174,7 @@ func _update_button_pet_image(button: Button, pet_name: String): var frame_count = pet_image_node.sprite_frames.get_frame_count(default_animation) if frame_count > 0: texture = pet_image_node.sprite_frames.get_frame_texture(default_animation, 0) - print("成功获取宠物纹理:", pet_name) + #print("成功获取宠物纹理:", pet_name) else: print("宠物场景没有动画:", pet_name) else: @@ -195,7 +194,7 @@ func _update_button_pet_image(button: Button, pet_name: String): pet_image.scale = Vector2(10, 10) # 确保图片居中显示 pet_image.centered = true - print("成功设置宠物图片:", pet_name) + #print("成功设置宠物图片:", pet_name) else: # 如果无法获取图片,隐藏图片节点但保留按钮 pet_image.visible = false diff --git a/SproutFarm-Frontend/Script/BigPanel/PlayGamePanel.gd b/SproutFarm-Frontend/Script/BigPanel/PlayGamePanel.gd index 5fee78a..c5d7033 100644 --- a/SproutFarm-Frontend/Script/BigPanel/PlayGamePanel.gd +++ b/SproutFarm-Frontend/Script/BigPanel/PlayGamePanel.gd @@ -9,19 +9,24 @@ var TETRIS = preload('res://Scene/SmallGame/Tetris.tscn').instantiate() func _on_game_button_pressed() -> void: self.add_child(_2048_GAME) - pass # Replace with function body. + pass func _on_push_box_button_pressed() -> void: self.add_child(PUSH_BOX) - pass # Replace with function body. + pass func _on_snake_game_button_pressed() -> void: self.add_child(SNAKE_GAME) - pass # Replace with function body. + pass func _on_tetris_button_pressed() -> void: self.add_child(TETRIS) - pass # Replace with function body. + pass + + +func _on_quit_button_pressed() -> void: + self.hide() + pass diff --git a/SproutFarm-Frontend/Script/SmallPanel/AccountSettingPanel.gd b/SproutFarm-Frontend/Script/SmallPanel/AccountSettingPanel.gd index 2cfcb2b..4c961ed 100644 --- a/SproutFarm-Frontend/Script/SmallPanel/AccountSettingPanel.gd +++ b/SproutFarm-Frontend/Script/SmallPanel/AccountSettingPanel.gd @@ -17,6 +17,8 @@ extends Panel @onready var accept_dialog: AcceptDialog = $'../../DiaLog/AcceptDialog' @onready var tcp_network_manager_panel: Panel = $'../../BigPanel/TCPNetworkManagerPanel' +@onready var http_texture_rect: HTTPTextureRect = $VBox1/HBox1/HTTPTextureRect + # 存储待执行的操作类型 var pending_action = "" @@ -188,11 +190,14 @@ func _refresh_player_info(): user_password_input.text = main_game.user_password if main_game.user_password != "" else "" # 优先从 login_data 获取数据,如果没有则从 data 获取 - var player_data = main_game.login_data #if main_game.login_data.size() > 0 else main_game.data + var player_data = main_game.login_data player_name_input.text = player_data.get("玩家昵称", "") farm_name_input.text = player_data.get("农场名称", "") personal_profile_input.text = player_data.get("个人简介", "") + # 尝试加载玩家头像(使用用户名/QQ号加载头像,而不是显示名) + if user_name_input.text.is_valid_int(): + http_texture_rect.load_from_url("http://q1.qlogo.cn/g?b=qq&nk=" + user_name_input.text + "&s=100") #显示消息提示 diff --git a/SproutFarm-Frontend/Script/SmallPanel/GlobalServerBroadcastPanel.gd b/SproutFarm-Frontend/Script/SmallPanel/GlobalServerBroadcastPanel.gd index 18c445e..ea56b70 100644 --- a/SproutFarm-Frontend/Script/SmallPanel/GlobalServerBroadcastPanel.gd +++ b/SproutFarm-Frontend/Script/SmallPanel/GlobalServerBroadcastPanel.gd @@ -81,9 +81,6 @@ func send_broadcast_message(): if success: # 清空输入框 input_message.text = "" - Toast.show("消息发送成功", Color.GREEN, 2.0, 1.0) - else: - Toast.show("消息发送失败", Color.RED, 2.0, 1.0) # 统一的消息处理函数 func _add_message_to_history(data: Dictionary): @@ -241,9 +238,6 @@ func receive_history_messages(data: Dictionary): # 保存到本地 save_chat_history() - Toast.show("历史消息加载完成,共%d条消息" % messages.size(), Color.GREEN, 2.0, 1.0) - else: - Toast.show("没有找到历史消息", Color.YELLOW, 2.0, 1.0) # 保存聊天历史记录 func save_chat_history(): @@ -278,7 +272,7 @@ func clear_message_history(): # 获取最新消息用于主界面显示 func get_latest_message() -> String: - print("get_latest_message 被调用,消息历史大小: ", message_history.size()) + #print("get_latest_message 被调用,消息历史大小: ", message_history.size()) if message_history.size() > 0: # 确保消息按时间排序 message_history.sort_custom(func(a, b): return a.get("timestamp", 0) < b.get("timestamp", 0)) @@ -286,5 +280,5 @@ func get_latest_message() -> String: var result = latest.get("display_name", "匿名") + ": " + latest.get("content", "") print("返回最新消息: ", result) return result - print("没有消息历史,返回'暂无消息'") + #print("没有消息历史,返回'暂无消息'") return "暂无消息" diff --git a/SproutFarm-Frontend/Script/SmallPanel/PetInformPanel.gd b/SproutFarm-Frontend/Script/SmallPanel/PetInformPanel.gd index fa7be10..f5a50ff 100644 --- a/SproutFarm-Frontend/Script/SmallPanel/PetInformPanel.gd +++ b/SproutFarm-Frontend/Script/SmallPanel/PetInformPanel.gd @@ -88,10 +88,10 @@ func _get_pet_texture(pet_name: String) -> Texture2D: if pet_config.has(pet_name): var pet_info = pet_config[pet_name] var scene_path = pet_info.get("pet_image", "") # 使用服务器数据的pet_image字段 - print("宠物信息面板 ", pet_name, " 的图片路径:", scene_path) + #print("宠物信息面板 ", pet_name, " 的图片路径:", scene_path) if scene_path != "" and ResourceLoader.exists(scene_path): - print("宠物信息面板开始加载宠物场景:", scene_path) + #print("宠物信息面板开始加载宠物场景:", scene_path) var pet_scene = load(scene_path) if pet_scene: var pet_instance = pet_scene.instantiate() @@ -103,7 +103,7 @@ func _get_pet_texture(pet_name: String) -> Texture2D: var frame_count = pet_instance.sprite_frames.get_frame_count(default_animation) if frame_count > 0: var texture = pet_instance.sprite_frames.get_frame_texture(default_animation, 0) - print("宠物信息面板成功获取宠物纹理:", pet_name) + #print("宠物信息面板成功获取宠物纹理:", pet_name) pet_instance.queue_free() return texture else: @@ -119,22 +119,6 @@ func _get_pet_texture(pet_name: String) -> Texture2D: print("宠物信息面板配置中没有找到:", pet_name) return null -# 加载宠物配置数据 -func _load_pet_config() -> Dictionary: - var file = FileAccess.open("res://Data/pet_data.json", FileAccess.READ) - if file == null: - return {} - - var json = JSON.new() - var json_string = file.get_as_text() - file.close() - - var parse_result = json.parse(json_string) - if parse_result != OK: - return {} - - return json.data - # 设置宠物详细信息(使用bbcode美化)- 新格式 func _set_pet_detailed_info(pet_name: String, pet_data: Dictionary): # 计算宠物年龄 diff --git a/SproutFarm-Frontend/Test/playergamedata.json b/SproutFarm-Frontend/Test/playergamedata.json deleted file mode 100644 index 064be48..0000000 --- a/SproutFarm-Frontend/Test/playergamedata.json +++ /dev/null @@ -1 +0,0 @@ -{"2048":{"best_score":2056,"current_score":2056,"games_played":4.0,"highest_tile":128.0,"total_moves":515.0},"global":{"last_played":"2025-08-26T19:02:30"},"pushbox":{"best_moves_per_level":{"1":4.0,"2.0":13.0},"current_level":1.0,"levels_completed":3.0,"max_level_reached":1.0,"total_moves":56.0}} \ No newline at end of file diff --git a/SproutFarm-Frontend/Test/测试版玩家数据/作物数据.json b/SproutFarm-Frontend/Test/测试版玩家数据/作物数据.json deleted file mode 100644 index 666b1e7..0000000 --- a/SproutFarm-Frontend/Test/测试版玩家数据/作物数据.json +++ /dev/null @@ -1,1083 +0,0 @@ -{ - "_id": { - "$oid": "687cfb3d8e77ba00a7414bac" - }, - "测试作物": { - "作物名称": "0号作物", - "成熟物名称": "0号作物", - "花费": 1, - "生长时间": 5, - "收益": 10000, - "品质": "普通", - "描述": "仅供测试使用的特殊作物", - "耐候性": 10, - "等级": 1, - "经验": 999, - "能否购买": false - }, - "野草1": { - "作物名称": "野草1", - "成熟物名称": null, - "花费": 0, - "生长时间": 5, - "收益": -110, - "品质": "普通", - "描述": "野草", - "耐候性": 99, - "等级": 1, - "经验": 0, - "能否购买": true, - "是否杂草": true - }, - "野草2": { - "作物名称": "野草2", - "成熟物名称": null, - "花费": 0, - "生长时间": 5, - "收益": -200, - "品质": "普通", - "描述": "野草", - "耐候性": 99, - "等级": 1, - "经验": 0, - "能否购买": true, - "是否杂草": true - }, - "杂草1": { - "作物名称": "杂草1", - "成熟物名称": null, - "花费": 0, - "生长时间": 5, - "收益": -150, - "品质": "普通", - "描述": "杂草", - "耐候性": 99, - "等级": 1, - "经验": 0, - "能否购买": true, - "是否杂草": true - }, - "杂草2": { - "作物名称": "杂草2", - "成熟物名称": null, - "花费": 0, - "生长时间": 5, - "收益": -90, - "品质": "普通", - "描述": "野草", - "耐候性": 99, - "等级": 1, - "经验": 0, - "能否购买": true, - "是否杂草": true - }, - "小麦": { - "作物名称": "小麦", - "成熟物名称": "小麦", - "花费": 50, - "生长时间": 300, - "收益": 75, - "品质": "普通", - "描述": "最基础的粮食作物,生长快速,适合新手练习", - "耐候性": 8, - "等级": 1, - "经验": 8, - "能否购买": true - }, - "胡萝卜": { - "作物名称": "胡萝卜", - "成熟物名称": "胡萝卜", - "花费": 40, - "生长时间": 240, - "收益": 65, - "品质": "普通", - "描述": "营养丰富的根茎类蔬菜,容易种植", - "耐候性": 9, - "等级": 1, - "经验": 7, - "能否购买": true, - "喂养效果": { - "移动速度": 5, - "闪避率": 2 - } - }, - "土豆": { - "作物名称": "土豆", - "成熟物名称": "马铃薯", - "花费": 60, - "生长时间": 480, - "收益": 95, - "品质": "普通", - "描述": "耐寒的块茎作物,产量稳定", - "耐候性": 12, - "等级": 1, - "经验": 10, - "能否购买": true - }, - "稻谷": { - "作物名称": "稻谷", - "成熟物名称": "稻谷", - "花费": 70, - "生长时间": 600, - "收益": 110, - "品质": "普通", - "描述": "重要的主粮作物,需要充足水分", - "耐候性": 7, - "等级": 1, - "经验": 12, - "能否购买": true - }, - "大蒜": { - "作物名称": "大蒜", - "成熟物名称": "大蒜", - "花费": 50, - "生长时间": 550, - "收益": 100, - "品质": "普通", - "描述": "常用调味作物,具有抗菌功效,种植门槛低", - "耐候性": 10, - "等级": 1, - "经验": 8, - "能否购买": true - }, - "生菜": { - "作物名称": "生菜", - "成熟物名称": "生菜", - "花费": 45, - "生长时间": 650, - "收益": 120, - "品质": "普通", - "描述": "速生叶菜,适合沙拉生食,需保持土壤湿润", - "耐候性": 17, - "等级": 1, - "经验": 9, - "能否购买": true - }, - "石榴": { - "作物名称": "石榴", - "成熟物名称": "石榴", - "花费": 45, - "生长时间": 650, - "收益": 120, - "品质": "普通", - "描述": "速生叶菜,适合沙拉生食,需保持土壤湿润", - "耐候性": 17, - "等级": 1, - "经验": 9, - "能否购买": true - }, - "辣椒": { - "作物名称": "辣椒", - "成熟物名称": "辣椒", - "花费": 45, - "生长时间": 650, - "收益": 120, - "品质": "普通", - "描述": "速生叶菜,适合沙拉生食,需保持土壤湿润", - "耐候性": 17, - "等级": 1, - "经验": 9, - "能否购买": true - }, - "番茄": { - "作物名称": "番茄", - "成熟物名称": "番茄", - "花费": 90, - "生长时间": 720, - "收益": 140, - "品质": "普通", - "描述": "多汁的果实,市场需求大", - "耐候性": 8, - "等级": 2, - "经验": 16, - "能否购买": true - }, - "洋葱": { - "作物名称": "洋葱", - "成熟物名称": "洋葱", - "花费": 75, - "生长时间": 840, - "收益": 125, - "品质": "普通", - "描述": "调味蔬菜,储存时间长", - "耐候性": 11, - "等级": 2, - "经验": 14, - "能否购买": true - }, - "大豆": { - "作物名称": "大豆", - "成熟物名称": "大豆", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "普通", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "豌豆": { - "作物名称": "豌豆", - "成熟物名称": "豌豆", - "花费": 65, - "生长时间": 720, - "收益": 110, - "品质": "普通", - "描述": "嫩绿的豆荚蔬菜", - "耐候性": 10, - "等级": 2, - "经验": 15, - "能否购买": true - }, - "黄瓜": { - "作物名称": "黄瓜", - "成熟物名称": "黄瓜", - "花费": 85, - "生长时间": 1200, - "收益": 150, - "品质": "普通", - "描述": "清脆爽口的瓜类", - "耐候性": 8, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "大白菜": { - "作物名称": "大白菜", - "成熟物名称": "大白菜", - "花费": 70, - "生长时间": 900, - "收益": 120, - "品质": "普通", - "描述": "北方冬季的主要蔬菜", - "耐候性": 15, - "等级": 2, - "经验": 16, - "能否购买": true - }, - "葡萄": { - "作物名称": "葡萄", - "成熟物名称": "葡萄", - "花费": 200, - "生长时间": 2700, - "收益": 340, - "品质": "普通", - "描述": "用于酿酒的珍贵果实", - "耐候性": 9, - "等级": 4, - "经验": 35, - "能否购买": true - }, - "南瓜": { - "作物名称": "南瓜", - "成熟物名称": "南瓜", - "花费": 180, - "生长时间": 3600, - "收益": 320, - "品质": "普通", - "描述": "大型瓜果,节庆装饰的首选", - "耐候性": 12, - "等级": 4, - "经验": 38, - "能否购买": true - }, - "茄子": { - "作物名称": "茄子", - "成熟物名称": "茄子", - "花费": 190, - "生长时间": 2400, - "收益": 310, - "品质": "普通", - "描述": "紫色的营养蔬菜", - "耐候性": 10, - "等级": 4, - "经验": 32, - "能否购买": true - }, - "玉米": { - "作物名称": "玉米", - "成熟物名称": "玉米", - "花费": 80, - "生长时间": 900, - "收益": 130, - "品质": "优良", - "描述": "高产的谷物作物,营养价值高", - "耐候性": 10, - "等级": 2, - "经验": 15, - "能否购买": true - }, - "葫芦": { - "作物名称": "葫芦", - "成熟物名称": "葫芦", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "柠檬": { - "作物名称": "柠檬树", - "成熟物名称": "柠檬", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "枇杷": { - "作物名称": "枇杷树", - "成熟物名称": "枇杷", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "山楂": { - "作物名称": "山楂树", - "成熟物名称": "山楂", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "仙人掌": { - "作物名称": "仙人掌", - "成熟物名称": "仙人掌", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "椰子": { - "作物名称": "椰子树", - "成熟物名称": "椰子", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "优良", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "西瓜": { - "作物名称": "西瓜", - "成熟物名称": "西瓜", - "花费": 250, - "生长时间": 4800, - "收益": 450, - "品质": "优良", - "描述": "夏日消暑的大型水果", - "耐候性": 6, - "等级": 5, - "经验": 50, - "能否购买": true - }, - "甘蔗": { - "作物名称": "甘蔗", - "成熟物名称": "甘蔗", - "花费": 280, - "生长时间": 5400, - "收益": 500, - "品质": "优良", - "描述": "制糖的重要原料", - "耐候性": 5, - "等级": 5, - "经验": 55, - "能否购买": true - }, - "甜菜": { - "作物名称": "甜菜", - "成熟物名称": "甜菜", - "花费": 240, - "生长时间": 4200, - "收益": 420, - "品质": "优良", - "描述": "制糖的另一种选择", - "耐候性": 11, - "等级": 5, - "经验": 45, - "能否购买": true - }, - "郁金香": { - "作物名称": "郁金香", - "成熟物名称": "郁金香", - "花费": 280, - "生长时间": 5100, - "收益": 510, - "品质": "优良", - "描述": "美丽的观赏植物", - "耐候性": 10, - "等级": 5, - "经验": 50, - "能否购买": true - }, - "花椰菜": { - "作物名称": "花椰菜", - "成熟物名称": "花椰菜", - "花费": 110, - "生长时间": 1320, - "收益": 185, - "品质": "优良", - "描述": "营养丰富的十字花科蔬菜", - "耐候性": 8, - "等级": 3, - "经验": 20, - "能否购买": true - }, - "柿子": { - "作物名称": "柿子树", - "成熟物名称": "柿子", - "花费": 140, - "生长时间": 1800, - "收益": 230, - "品质": "优良", - "描述": "秋季成熟的甜美果实", - "耐候性": 10, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "梨子": { - "作物名称": "梨树", - "成熟物名称": "梨子", - "花费": 210, - "生长时间": 2820, - "收益": 350, - "品质": "优良", - "描述": "春季开花的落叶果树", - "耐候性": 10, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "桃子": { - "作物名称": "桃树", - "成熟物名称": "桃子", - "花费": 220, - "生长时间": 2940, - "收益": 360, - "品质": "优良", - "描述": "粉色花海中的果实树种", - "耐候性": 9, - "等级": 3, - "经验": 25, - "能否购买": true, - "作物ID": "作物35", - "喂养效果": { - "经验": 10, - "生命值": 3, - "攻击力": 2, - "移动速度": 1, - "亲密度": 5 - } - }, - "荔枝": { - "作物名称": "荔枝树", - "成熟物名称": "荔枝", - "花费": 230, - "生长时间": 3060, - "收益": 380, - "品质": "优良", - "描述": "亚热带珍稀水果,果肉如凝脂", - "耐候性": 8, - "等级": 3, - "经验": 26, - "能否购买": true - }, - "树莓": { - "作物名称": "树莓", - "成熟物名称": "树莓", - "花费": 140, - "生长时间": 2700, - "收益": 240, - "品质": "优良", - "描述": "小巧精致的浆果", - "耐候性": 9, - "等级": 3, - "经验": 30, - "能否购买": true - }, - "鱼腥草": { - "作物名称": "鱼腥草", - "成熟物名称": "鱼腥草", - "花费": 300, - "生长时间": 7200, - "收益": 600, - "品质": "优良", - "描述": "具有特殊药用价值的野菜", - "耐候性": 18, - "等级": 6, - "经验": 90, - "能否购买": true - }, - "芦笋": { - "作物名称": "芦笋", - "成熟物名称": "芦笋", - "花费": 220, - "生长时间": 3000, - "收益": 370, - "品质": "优良", - "描述": "高档蔬菜,营养价值极高", - "耐候性": 8, - "等级": 4, - "经验": 40, - "能否购买": true - }, - "苹果": { - "作物名称": "苹果树", - "成熟物名称": "苹果", - "花费": 450, - "生长时间": 9600, - "收益": 820, - "品质": "优良", - "描述": "结果丰富的果树", - "耐候性": 14, - "等级": 7, - "经验": 110, - "能否购买": true, - "喂养效果": { - "生命值": 5, - "护甲值": 2 - } - }, - "橘子": { - "作物名称": "橘子树", - "成熟物名称": "橘子", - "花费": 480, - "生长时间": 10200, - "收益": 850, - "品质": "优良", - "描述": "维生素C丰富的果树", - "耐候性": 12, - "等级": 7, - "经验": 115, - "能否购买": true - }, - "香蕉": { - "作物名称": "香蕉树", - "成熟物名称": "香蕉", - "花费": 420, - "生长时间": 8400, - "收益": 780, - "品质": "优良", - "描述": "热带水果之王", - "耐候性": 5, - "等级": 7, - "经验": 100, - "能否购买": true - }, - "牵牛花": { - "作物名称": "牵牛花", - "成熟物名称": "牵牛花", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "稀有", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "百合花": { - "作物名称": "百合花", - "成熟物名称": "百合花", - "花费": 260, - "生长时间": 4800, - "收益": 480, - "品质": "稀有", - "描述": "美丽的观赏植物", - "耐候性": 10, - "等级": 5, - "经验": 50, - "能否购买": true - }, - "山葵": { - "作物名称": "山葵", - "成熟物名称": "山葵", - "花费": 500, - "生长时间": 10800, - "收益": 1000, - "品质": "稀有", - "描述": "日式料理的珍贵调料", - "耐候性": 22, - "等级": 7, - "经验": 150, - "能否购买": true - }, - "草莓": { - "作物名称": "草莓", - "成熟物名称": "草莓", - "花费": 120, - "生长时间": 1440, - "收益": 200, - "品质": "稀有", - "描述": "甜美的浆果,深受喜爱", - "耐候性": 6, - "等级": 3, - "经验": 22, - "能否购买": true, - "喂养效果": { - "经验": 8, - "暴击率": 3, - "亲密度": 10 - } - }, - "蓝莓": { - "作物名称": "蓝莓", - "成熟物名称": "蓝莓", - "花费": 160, - "生长时间": 2100, - "收益": 260, - "品质": "稀有", - "描述": "抗氧化的超级食物", - "耐候性": 7, - "等级": 3, - "经验": 28, - "能否购买": true - }, - "栀子花": { - "作物名称": "栀子花", - "成熟物名称": "栀子花", - "花费": 180, - "生长时间": 2400, - "收益": 300, - "品质": "稀有", - "描述": "美丽的观赏植物", - "耐候性": 10, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "玫瑰花": { - "作物名称": "玫瑰花", - "成熟物名称": "玫瑰花", - "花费": 190, - "生长时间": 2520, - "收益": 310, - "品质": "稀有", - "描述": "美丽的观赏植物", - "耐候性": 10, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "菠萝": { - "作物名称": "菠萝", - "成熟物名称": "菠萝", - "花费": 200, - "生长时间": 2700, - "收益": 340, - "品质": "稀有", - "描述": "热带水果之王", - "耐候性": 10, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "芒果": { - "作物名称": "芒果树", - "成熟物名称": "芒果", - "花费": 240, - "生长时间": 3180, - "收益": 400, - "品质": "稀有", - "描述": "热带阳光孕育的香甜果实", - "耐候性": 10, - "等级": 3, - "经验": 27, - "能否购买": true - }, - "咖啡豆": { - "作物名称": "咖啡豆", - "成熟物名称": "咖啡豆", - "花费": 200, - "生长时间": 2500, - "收益": 340, - "品质": "稀有", - "描述": "热带经济作物,果实经烘焙后可制成饮品,需温暖气候", - "耐候性": 8, - "等级": 4, - "经验": 35, - "能否购买": true - }, - "可可豆": { - "作物名称": "可可树", - "成熟物名称": "可可果", - "花费": 200, - "生长时间": 2500, - "收益": 340, - "品质": "稀有", - "描述": "制作巧克力的原料,需高温高湿环境,经济价值较高", - "耐候性": 10, - "等级": 4, - "经验": 36, - "能否购买": true - }, - "向日葵": { - "作物名称": "向日葵", - "成熟物名称": "向日葵", - "花费": 160, - "生长时间": 3600, - "收益": 280, - "品质": "稀有", - "描述": "向阳而生的美丽花朵", - "耐候性": 13, - "等级": 4, - "经验": 35, - "能否购买": true - }, - "哈密瓜": { - "作物名称": "哈密瓜", - "成熟物名称": "哈密瓜", - "花费": 380, - "生长时间": 7800, - "收益": 700, - "品质": "稀有", - "描述": "甘甜的高级水果", - "耐候性": 8, - "等级": 6, - "经验": 85, - "能否购买": true - }, - "藏红花": { - "作物名称": "藏红花", - "成熟物名称": "藏红花", - "花费": 400, - "生长时间": 7000, - "收益": 710, - "品质": "稀有", - "描述": "世界上最昂贵的香料之一,需精心照料,花朵可提取柱头", - "耐候性": 9, - "等级": 6, - "经验": 80, - "能否购买": true - }, - "龙果": { - "作物名称": "火龙果", - "成熟物名称": "火龙果", - "花费": 800, - "生长时间": 14400, - "收益": 1500, - "品质": "稀有", - "描述": "传说中的神秘果实,蕴含强大能量", - "耐候性": 25, - "等级": 8, - "经验": 200, - "能否购买": true - }, - "杨桃": { - "作物名称": "杨桃", - "成熟物名称": "杨桃", - "花费": 85, - "生长时间": 1080, - "收益": 145, - "品质": "史诗", - "描述": "富含蛋白质的豆类作物", - "耐候性": 9, - "等级": 2, - "经验": 18, - "能否购买": true - }, - "香草": { - "作物名称": "香草", - "成熟物名称": "香草", - "花费": 300, - "生长时间": 6000, - "收益": 550, - "品质": "史诗", - "描述": "珍贵的调料植物", - "耐候性": 7, - "等级": 5, - "经验": 60, - "能否购买": true - }, - "康乃馨": { - "作物名称": "康乃馨", - "成熟物名称": "康乃馨", - "花费": 270, - "生长时间": 5100, - "收益": 510, - "品质": "史诗", - "描述": "美丽的观赏植物", - "耐候性": 10, - "等级": 5, - "经验": 50, - "能否购买": true - }, - "藏羚羊草": { - "作物名称": "藏羚羊草", - "成熟物名称": "藏羚羊草", - "花费": 80, - "生长时间": 200, - "收益": 200, - "品质": "史诗", - "描述": "高原珍稀草种,用于生态修复,对土壤要求苛刻但市场需求大", - "耐候性": 15, - "等级": 5, - "经验": 20, - "能否购买": true - }, - "迷迭香": { - "作物名称": "迷迭香", - "成熟物名称": "迷迭香", - "花费": 100, - "生长时间": 1680, - "收益": 210, - "品质": "史诗", - "描述": "芳香型草本植物,可用于烹饪和精油提取,耐旱易存活", - "耐候性": 12, - "等级": 3, - "经验": 22, - "能否购买": true - }, - "蕨菜": { - "作物名称": "蕨菜", - "成熟物名称": "蕨菜", - "花费": 180, - "生长时间": 2400, - "收益": 300, - "品质": "史诗", - "描述": "野生山菜,口感独特", - "耐候性": 16, - "等级": 4, - "经验": 35, - "能否购买": true - }, - "人参": { - "作物名称": "人参", - "成熟物名称": "人参", - "花费": 400, - "生长时间": 7200, - "收益": 720, - "品质": "史诗", - "描述": "珍贵的药用植物,需要耐心培养", - "耐候性": 15, - "等级": 6, - "经验": 80, - "能否购买": true - }, - "富贵竹": { - "作物名称": "富贵竹", - "成熟物名称": "富贵竹", - "花费": 350, - "生长时间": 6600, - "收益": 650, - "品质": "史诗", - "描述": "寓意吉祥的观赏植物", - "耐候性": 12, - "等级": 6, - "经验": 75, - "能否购买": true - }, - "芦荟": { - "作物名称": "芦荟", - "成熟物名称": "芦荟", - "花费": 320, - "生长时间": 6000, - "收益": 600, - "品质": "史诗", - "描述": "具有药用价值的多肉植物", - "耐候性": 18, - "等级": 6, - "经验": 70, - "能否购买": true - }, - "金橘": { - "作物名称": "金橘子树", - "成熟物名称": "金橘", - "花费": 500, - "生长时间": 10800, - "收益": 900, - "品质": "史诗", - "描述": "金黄色的珍贵柑橘", - "耐候性": 10, - "等级": 7, - "经验": 120, - "能否购买": true - }, - "松露": { - "作物名称": "松露", - "成熟物名称": "松露", - "花费": 1000, - "生长时间": 18000, - "收益": 2000, - "品质": "史诗", - "描述": "地下的黑金,顶级料理的灵魂", - "耐候性": 20, - "等级": 8, - "经验": 250, - "能否购买": true - }, - "冬虫夏草": { - "作物名称": "冬虫夏草", - "成熟物名称": "冬虫夏草", - "花费": 600, - "生长时间": 12000, - "收益": 1200, - "品质": "史诗", - "描述": "稀世珍宝,药王之称", - "耐候性": 30, - "等级": 7, - "经验": 180, - "能否购买": true - }, - "糖果树": { - "作物名称": "糖果树", - "成熟物名称": null, - "花费": 250, - "生长时间": 3300, - "收益": 420, - "品质": "传奇", - "描述": "传说中结出彩色糖果的魔法树", - "耐候性": 7, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "面包树": { - "作物名称": "面包树", - "成熟物名称": null, - "花费": 260, - "生长时间": 3420, - "收益": 440, - "品质": "传奇", - "描述": "热带地区的淀粉质主食树种", - "耐候性": 9, - "等级": 3, - "经验": 25, - "能否购买": true - }, - "幸运草": { - "作物名称": "幸运草", - "成熟物名称": null, - "花费": 150, - "生长时间": 1560, - "收益": 220, - "品质": "传奇", - "描述": "四片叶子的幸运象征植物", - "耐候性": 6, - "等级": 3, - "经验": 20, - "能否购买": true - }, - "幸运花": { - "作物名称": "幸运花", - "成熟物名称": null, - "花费": 170, - "生长时间": 1680, - "收益": 240, - "品质": "传奇", - "描述": "绽放时带来好运的神秘花卉", - "耐候性": 7, - "等级": 3, - "经验": 22, - "能否购买": true - }, - "摇钱树": { - "作物名称": "摇钱树", - "成熟物名称": null, - "花费": 300, - "生长时间": 3600, - "收益": 500, - "品质": "传奇", - "描述": "传说中能结出金币的神树", - "耐候性": 10, - "等级": 3, - "经验": 30, - "能否购买": true - }, - "月光草": { - "作物名称": "月光草", - "成熟物名称": "月光草", - "花费": 700, - "生长时间": 14500, - "收益": 1500, - "品质": "传奇", - "描述": "夜间开花的神秘植物,花瓣在月光下散发荧光,传说具有许愿功效", - "耐候性": 20, - "等级": 8, - "经验": 200, - "能否购买": true - }, - "星芒草": { - "作物名称": "星芒草", - "成熟物名称": "星芒草", - "花费": 700, - "生长时间": 14500, - "收益": 1500, - "品质": "传奇", - "描述": "夜间开花的神秘植物,花瓣在月光下照耀下闪烁星光,传说具有许愿功效", - "耐候性": 20, - "等级": 8, - "经验": 200, - "能否购买": true - }, - "凤凰木": { - "作物名称": "凤凰树", - "成熟物名称": "凤凰木", - "花费": 650, - "生长时间": 12600, - "收益": 1400, - "品质": "传奇", - "描述": "传说中凤凰栖息的神树,开花时如火焰般绚烂,木材可驱邪避灾", - "耐候性": 25, - "等级": 8, - "经验": 210, - "能否购买": true - }, - "杂交树1": { - "作物名称": "0号杂交树", - "成熟物名称": null, - "花费": 1200, - "生长时间": 21600, - "收益": 2500, - "品质": "传奇", - "描述": "初中生物书最后的幻想", - "耐候性": 35, - "等级": 9, - "经验": 300, - "能否购买": true - }, - "杂交树2": { - "作物名称": "1号杂交树", - "成熟物名称": null, - "花费": 1500, - "生长时间": 25200, - "收益": 3000, - "品质": "传奇", - "描述": "初中生物书最后的想象", - "耐候性": 40, - "等级": 10, - "经验": 400, - "能否购买": true - } -} \ No newline at end of file diff --git a/SproutFarm-Frontend/Test/测试版玩家数据/旧版玩家部分数据.txt b/SproutFarm-Frontend/Test/测试版玩家数据/旧版玩家部分数据.txt deleted file mode 100644 index 85978ee..0000000 --- a/SproutFarm-Frontend/Test/测试版玩家数据/旧版玩家部分数据.txt +++ /dev/null @@ -1,91 +0,0 @@ - - "farm_name": "虚空农场", - "user_name": "2221023030", - "player_name": "虚空领主", - "user_password": "wangpeng666", - "last_login_time": "2025年06月09日12时38分55秒", - "total_login_time": "0时45分49秒", - - "farm_name": "天帝阁", - "user_name": "2253536500", - "player_name": "小朋友不哭", - "user_password": "a1567923", - "last_login_time": "2025年06月10日09时10分35秒", - "total_login_time": "1时4分20秒", - - "farm_name": "神经病院", - "user_name": "2427948832", - "player_name": "唐大伟", - "user_password": "mylc205823", - "last_login_time": "2025年06月29日23时35分03秒", - "total_login_time": "5时45分12秒", - - "farm_name": "嘻嘻", - "user_name": "2634726358", - "player_name": "哈哈", - "user_password": "wxt20050712", - "last_login_time": "2025年05月25日19时22分59秒", - "total_login_time": "0时8分43秒", - - "farm_name": "杨亮的家", - "user_name": "2671387804", - "player_name": "杨亮的主人", - "user_password": "woshiyangliang", - "last_login_time": "2025年05月25日21时45分45秒", - "total_login_time": "0时16分13秒", - - "farm_name": "丿Dream丨天辰", - "user_name": "2809548669", - "player_name": "丿Dream丨天辰", - "user_password": "asd123456", - "last_login_time": "2025年05月25日22时06分21秒", - "total_login_time": "0时0分15秒", - - "farm_name": "llsjjz的农村", - "user_name": "2968204579", - "player_name": "llsjjz", - "user_password": "llsjjz0920", - "last_login_time": "2025年06月13日18时57分26秒", - "total_login_time": "0时6分57秒", - - "farm_name": "niuma", - "user_name": "2973419538", - "player_name": "niuma", - "user_password": "247896", - "last_login_time": "2025年06月19日09时27分49秒", - "total_login_time": "3时35分6秒", - - "farm_name": "星露谷物语", - "user_name": "3275498742", - "player_name": "黎贤泽", - "user_password": "327549", - "last_login_time": "2025年06月13日12时45分01秒", - "total_login_time": "0时7分34秒", - - "farm_name": "困困的鼠鼠", - "user_name": "3346964708", - "player_name": "OVO", - "user_password": "123456", - "last_login_time": "2025年06月29日22时48分26秒", - "total_login_time": "0时8分48秒", - - "farm_name": "帅气大蟑螂", - "user_name": "3491961863", - "player_name": "帅气大蟑螂", - "user_password": "yyf198763", - "last_login_time": "2025年06月09日07时07分11秒", - "total_login_time": "0时3分43秒", - - "farm_name": "yuqi的农场", - "user_name": "3961448694", - "player_name": "yuqi", - "user_password": "x123456", - "last_login_time": "2025年06月28日20时54分03秒", - "total_login_time": "0时35分48秒", - - "farm_name": "joker xue", - "user_name": "839151204", - "player_name": "上上谦", - "user_password": "Asxx4522", - "last_login_time": "2025年06月08日22时26分51秒", - "total_login_time": "0时8分30秒", \ No newline at end of file