248 lines
6.1 KiB
JavaScript
248 lines
6.1 KiB
JavaScript
// 新用户初始化数据配置文件
|
||
// 用于管理新用户注册时的默认游戏数据
|
||
|
||
/**
|
||
* 数据版本号 - 用于数据结构升级和兼容性管理
|
||
* 格式: 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 })
|
||
};
|