Files
heros/build-templates/wechatgame/cloud_functions/cocos_cloud/user_init_data.js
2025-08-18 21:13:10 +08:00

248 lines
6.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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