// 新用户初始化数据配置文件 // 用于管理新用户注册时的默认游戏数据 /** * 数据版本号 - 用于数据结构升级和兼容性管理 * 格式: 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, // 升级经验 }; /** * 默认出战英雄配置 * 位置 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 = { }; /** * 默认天赋数据 * ID 1001-1007 对应不同的天赋技能 */ const DEFAULT_TALS = { }; /** * 默认装备数据 * ID 1001-1005 对应不同部位的装备 */ const DEFAULT_EQUIPS = { }; /** * 获取完整的新用户初始化数据 * @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 }) };