继续更新UI

This commit is contained in:
2025-09-24 15:06:30 +08:00
parent 26b856d74e
commit df57f3c5ec
59 changed files with 1415 additions and 2898 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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)

Binary file not shown.

View File

@@ -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:
"""控制台命令处理类"""

View File

@@ -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)

View File

View File

@@ -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':

View File

@@ -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}")

View File

@@ -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-随机种植各种花卉-星期一,星期三,星期五,星期日零点种植

View File

@@ -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服务器"""

View File

@@ -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

View File

@@ -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'
]

View File

@@ -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:
"""获取当前音量"""

View File

@@ -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头像的便捷方法

View File

@@ -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"}
}

View File

@@ -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": "钻石剑"
}
}

View File

@@ -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:

View File

@@ -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

View File

@@ -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="."]

View File

@@ -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 = "❌ 取消"

View File

@@ -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"]

View File

@@ -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
# 只对teamAattacker队伍的宠物生效
for pet in all_pets:
@@ -1215,7 +1170,6 @@ func execute_team_heal():
#执行团队狂暴
func execute_team_rage():
"""执行团队狂暴功能"""
var raged_count = 0
# 只对teamAattacker队伍的宠物生效
for pet in all_pets:
@@ -1246,7 +1200,6 @@ func execute_team_rage():
#执行团队护盾
func execute_team_shield():
"""执行团队护盾功能"""
var shielded_count = 0
# 只对teamAattacker队伍的宠物生效
for pet in all_pets:

View File

@@ -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

View File

@@ -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"]
}

View File

@@ -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": "钻石剑"
}
}

View File

@@ -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 = "✅ 保存信息"

View File

@@ -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 = "📜 查看更多"

View File

@@ -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 = "🚪 返回农场 🏡"

View File

@@ -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:

View File

@@ -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
# 如果没有找到,使用默认的收获物图片

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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")
#显示消息提示

View File

@@ -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 "暂无消息"

View File

@@ -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):
# 计算宠物年龄

View File

@@ -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}}

View File

@@ -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秒",