云环境和本地调试 添加

This commit is contained in:
2025-08-18 17:00:40 +08:00
parent addc61e2a9
commit a824d9a124
155 changed files with 6531 additions and 997 deletions

View File

@@ -0,0 +1,274 @@
// 新用户初始化数据配置文件
// 用于管理新用户注册时的默认游戏数据
/**
* 数据版本号 - 用于数据结构升级和兼容性管理
* 格式: MAJOR.MINOR.PATCH
* MAJOR: 重大结构变更,不向后兼容
* MINOR: 新增字段,向后兼容
* PATCH: 数值调整,完全兼容
*/
const DATA_VERSION = "1.0.0";
/**
* 基础游戏数据默认值
*/
const DEFAULT_GAME_DATA = {
score: 0, // 游戏分数
mission: 1, // 当前关卡
gold: 100, // 金币 - 升级主要资源
diamond: 100, // 钻石 - 商店购买及双倍奖励资源
meat: 0, // 肉类资源
exp: 0, // 升级经验
// 英雄升星石头资源
ghstone: 0, // 绿色英雄石 - 普通英雄升星
bhstone: 0, // 蓝色英雄石 - 稀有英雄升星
phlestone: 0, // 紫色英雄石 - 史诗英雄升星
rhstone: 0, // 红色英雄石 - 传说英雄升星
// 抽卡和解锁资源
herocard: 0, // 英雄卡 - 抽卡凭证
ckey: 0, // 铜钥匙 - 解锁稀有英雄/兑换金币
skey: 0, // 银钥匙 - 解锁史诗英雄/兑换金币
gkey: 0 // 金钥匙 - 解锁传说英雄/兑换金币
};
/**
* 默认出战英雄配置
* 位置 0-4 对应 5个出战位置
* 0 表示该位置为空
*/
const DEFAULT_FIGHT_HEROS = {
0: 5001, // 第1个位置默认英雄5001
1: 5005, // 第2个位置默认英雄5005
2: 0, // 第3个位置
3: 0, // 第4个位置
4: 0 // 第5个位置
};
/**
* 默认英雄属性数据
* 每个英雄包含: uuid(唯一标识), lv(等级), 其他属性可扩展
*/
const DEFAULT_HEROS = {
5001: {
uuid: 5001,
lv: 1, // 初始等级
exp: 0, // 英雄经验
star: 1, // 星级
power: 100 // 战力
},
5005: {
uuid: 5005,
lv: 1,
exp: 0,
star: 1,
power: 120
},
5007: {
uuid: 5007,
lv: 1,
exp: 0,
star: 1,
power: 90
}
};
/**
* 默认道具数据
* ID 1001-1007 对应不同类型的道具
*/
const DEFAULT_ITEMS = {
1001: 0, // 生命药水
1002: 0, // 魔法药水
1003: 0, // 力量药水
1004: 0, // 敏捷药水
1005: 0, // 智力药水
1006: 0, // 复活卷轴
1007: 0 // 传送卷轴
};
/**
* 默认天赋数据
* ID 1001-1007 对应不同的天赋技能
*/
const DEFAULT_TALS = {
1001: 0, // 攻击强化
1002: 0, // 防御强化
1003: 0, // 生命强化
1004: 0, // 速度强化
1005: 0, // 暴击强化
1006: 0, // 经验强化
1007: 0 // 金币强化
};
/**
* 默认装备数据
* ID 1001-1005 对应不同部位的装备
*/
const DEFAULT_EQUIPS = {
1001: 0, // 武器
1002: 0, // 头盔
1003: 0, // 胸甲
1004: 0, // 护腿
1005: 0 // 靴子
};
/**
* 获取完整的新用户初始化数据
* @returns {Object} 包含所有默认数据的对象
*/
function getNewUserInitData() {
return {
data_version: DATA_VERSION,
init_time: Date.now(),
data: { ...DEFAULT_GAME_DATA },
fight_heros: { ...DEFAULT_FIGHT_HEROS },
heros: JSON.parse(JSON.stringify(DEFAULT_HEROS)), // 深拷贝避免引用问题
items: { ...DEFAULT_ITEMS },
tals: { ...DEFAULT_TALS },
equips: { ...DEFAULT_EQUIPS }
};
}
/**
* 获取特定类型的默认数据
* @param {string} dataType 数据类型: 'data', 'fight_heros', 'heros', 'items', 'tals', 'equips'
* @returns {Object} 指定类型的默认数据
*/
function getDefaultDataByType(dataType) {
const dataMap = {
data: DEFAULT_GAME_DATA,
fight_heros: DEFAULT_FIGHT_HEROS,
heros: DEFAULT_HEROS,
items: DEFAULT_ITEMS,
tals: DEFAULT_TALS,
equips: DEFAULT_EQUIPS
};
const defaultData = dataMap[dataType];
if (!defaultData) {
throw new Error(`Unknown data type: ${dataType}`);
}
// 返回深拷贝以避免修改原始数据
return JSON.parse(JSON.stringify(defaultData));
}
/**
* 检查数据版本兼容性
* @param {string} userDataVersion 用户数据版本
* @returns {Object} 兼容性检查结果
*/
function checkDataVersionCompatibility(userDataVersion) {
if (!userDataVersion) {
return {
compatible: false,
needsUpgrade: true,
message: "No version found, needs full upgrade"
};
}
const [userMajor, userMinor, userPatch] = userDataVersion.split('.').map(Number);
const [currentMajor, currentMinor, currentPatch] = DATA_VERSION.split('.').map(Number);
if (userMajor < currentMajor) {
return {
compatible: false,
needsUpgrade: true,
message: "Major version mismatch, needs full upgrade"
};
}
if (userMajor === currentMajor && userMinor < currentMinor) {
return {
compatible: true,
needsUpgrade: true,
message: "Minor version update available"
};
}
if (userMajor === currentMajor && userMinor === currentMinor && userPatch < currentPatch) {
return {
compatible: true,
needsUpgrade: true,
message: "Patch update available"
};
}
return {
compatible: true,
needsUpgrade: false,
message: "Data version is up to date"
};
}
/**
* 合并用户数据和默认数据
* 确保用户数据包含所有必需的字段
* @param {Object} userData 用户现有数据
* @returns {Object} 合并后的完整数据
*/
function mergeUserDataWithDefaults(userData) {
const defaultData = getNewUserInitData();
const mergedData = {
data_version: DATA_VERSION,
init_time: userData.init_time || Date.now(),
data: { ...defaultData.data, ...userData.data },
fight_heros: { ...defaultData.fight_heros, ...userData.fight_heros },
heros: { ...defaultData.heros, ...userData.heros },
items: { ...defaultData.items, ...userData.items },
tals: { ...defaultData.tals, ...userData.tals },
equips: { ...defaultData.equips, ...userData.equips }
};
return mergedData;
}
/**
* 验证数据结构完整性
* @param {Object} gameData 要验证的游戏数据
* @returns {Object} 验证结果
*/
function validateDataStructure(gameData) {
const requiredFields = ['data', 'fight_heros', 'heros', 'items', 'tals', 'equips'];
const missingFields = [];
for (const field of requiredFields) {
if (!gameData[field] || typeof gameData[field] !== 'object') {
missingFields.push(field);
}
}
if (missingFields.length > 0) {
return {
valid: false,
missingFields,
message: `Missing or invalid fields: ${missingFields.join(', ')}`
};
}
return {
valid: true,
message: "Data structure is valid"
};
}
// 导出所有功能函数
module.exports = {
DATA_VERSION,
getNewUserInitData,
getDefaultDataByType,
checkDataVersionCompatibility,
mergeUserDataWithDefaults,
validateDataStructure,
// 导出原始数据常量(只读)
DEFAULT_GAME_DATA: Object.freeze({ ...DEFAULT_GAME_DATA }),
DEFAULT_FIGHT_HEROS: Object.freeze({ ...DEFAULT_FIGHT_HEROS }),
DEFAULT_HEROS: Object.freeze(JSON.parse(JSON.stringify(DEFAULT_HEROS))),
DEFAULT_ITEMS: Object.freeze({ ...DEFAULT_ITEMS }),
DEFAULT_TALS: Object.freeze({ ...DEFAULT_TALS }),
DEFAULT_EQUIPS: Object.freeze({ ...DEFAULT_EQUIPS })
};