云环境和本地调试 添加
This commit is contained in:
@@ -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 })
|
||||
};
|
||||
Reference in New Issue
Block a user