Files
heros/build-templates/wechatgame/cloud_functions/cocos_cloud/modules/heros.js

457 lines
9.9 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.

// 英雄数据操作模块
const { getOrCreaterUser } = require('./auth');
const user_db_name = "cocos_users";
/**
* 获取所有英雄数据
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @returns {Object} 操作结果
*/
async function getHeros(db, openid) {
try {
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
return {
code: 200,
data: user.heros,
msg: "获取英雄列表成功"
};
} catch (error) {
console.error("获取英雄列表错误:", error);
return {
code: -5,
msg: `获取英雄列表错误: ${error.message}`
};
}
}
/**
* 获取单个英雄数据
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @returns {Object} 操作结果
*/
async function getHero(db, openid, heroId) {
try {
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
const hero = user.heros[heroId];
if (!hero) {
return {
code: -6,
msg: "未找到英雄"
};
}
return {
code: 200,
data: hero,
msg: "获取英雄成功"
};
} catch (error) {
console.error("获取英雄错误:", error);
return {
code: -5,
msg: `获取英雄错误: ${error.message}`
};
}
}
/**
* 添加新英雄
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @param {Object} heroData 英雄数据(可选)
* @returns {Object} 操作结果
*/
async function addHero(db, openid, heroId, heroData = null) {
try {
const _ = db.command;
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
// 检查英雄是否已存在
if (user.heros[heroId]) {
return {
code: -7,
msg: "英雄已存在"
};
}
// 使用提供的数据或默认数据
const newHero = heroData || {
uuid: heroId,
lv: 1,
exp: 0,
star: 1,
power: 100
};
// 确保uuid字段正确
newHero.uuid = heroId;
let updateRes = await db.collection(user_db_name).doc(user._id).update({
data: {
[`heros.${heroId}`]: _.set(newHero),
last_save_time: _.set(Date.now())
}
});
if (updateRes?.stats?.updated >= 1) {
return {
code: 200,
data: newHero,
msg: `英雄 ${heroId} 添加成功`
};
} else {
return {
code: -1,
msg: `添加英雄失败`
};
}
} catch (error) {
console.error("添加英雄错误:", error);
return {
code: -5,
msg: `添加英雄错误: ${error.message}`
};
}
}
/**
* 更新英雄属性
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @param {Object} updateData 要更新的属性
* @returns {Object} 操作结果
*/
async function updateHero(db, openid, heroId, updateData) {
try {
const _ = db.command;
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
// 检查英雄是否存在
if (!user.heros[heroId]) {
return {
code: -6,
msg: "未找到英雄"
};
}
// 验证更新数据
if (!updateData || typeof updateData !== 'object') {
return {
code: -3,
msg: "无效的更新数据格式"
};
}
const currentHero = user.heros[heroId];
const newHero = { ...currentHero, ...updateData };
// 确保uuid字段不被修改
newHero.uuid = heroId;
let updateRes = await db.collection(user_db_name).doc(user._id).update({
data: {
[`heros.${heroId}`]: _.set(newHero),
last_save_time: _.set(Date.now())
}
});
if (updateRes?.stats?.updated >= 1) {
return {
code: 200,
data: {
old_data: currentHero,
new_data: newHero
},
msg: `英雄 ${heroId} 更新成功`
};
} else {
return {
code: -1,
msg: `更新英雄失败`
};
}
} catch (error) {
console.error("更新英雄错误:", error);
return {
code: -5,
msg: `更新英雄错误: ${error.message}`
};
}
}
/**
* 设置英雄属性
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @param {string} property 属性名
* @param {any} value 属性值
* @returns {Object} 操作结果
*/
async function setHeroProperty(db, openid, heroId, property, value) {
try {
const _ = db.command;
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
// 检查英雄是否存在
if (!user.heros[heroId]) {
return {
code: -6,
msg: "未找到英雄"
};
}
// 防止修改uuid
if (property === 'uuid') {
return {
code: -3,
msg: "不可修改英雄UUID"
};
}
const oldValue = user.heros[heroId][property];
let updateRes = await db.collection(user_db_name).doc(user._id).update({
data: {
[`heros.${heroId}.${property}`]: _.set(value),
last_save_time: _.set(Date.now())
}
});
if (updateRes?.stats?.updated >= 1) {
return {
code: 200,
data: {
hero_id: heroId,
property: property,
old_value: oldValue,
new_value: value
},
msg: `英雄 ${heroId} 属性 ${property} 更新成功`
};
} else {
return {
code: -1,
msg: `设置英雄属性失败`
};
}
} catch (error) {
console.error("设置英雄属性错误:", error);
return {
code: -5,
msg: `设置英雄属性错误: ${error.message}`
};
}
}
/**
* 英雄升级
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @param {number} levels 升级级数默认1级
* @returns {Object} 操作结果
*/
async function levelUpHero(db, openid, heroId, exp,gold,levels = 1) {
try {
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
// 检查英雄是否存在
if (!user.heros[heroId]) {
return {
code: -6,
msg: "未找到英雄"
};
}
if (typeof levels !== 'number' || levels < 1) {
return {
code: -3,
msg: "等级必须为正数"
};
}
let exp_result=await spendDataField(db, openid, 'exp', exp);
if(exp_result.code!==200){
return {
code: -1,
msg: `升级失败,经验不足`
};
}
let gold_result=await spendDataField(db, openid, 'gold', gold);
if(gold_result.code!==200){
await addDataField(db, openid, 'exp', exp);
return {
code: -1,
msg: `升级失败,金币不足`
};
}
const currentLevel = user.heros[heroId].lv || 1;
const newLevel = currentLevel + levels;
return await setHeroProperty(db, openid, heroId, 'lv', newLevel);
} catch (error) {
console.error("英雄升级错误:", error);
return {
code: -5,
msg: `英雄升级错误: ${error.message}`
};
}
}
/**
* 删除英雄
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @param {number} heroId 英雄ID
* @returns {Object} 操作结果
*/
async function deleteHero(db, openid, heroId) {
try {
const _ = db.command;
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
// 检查英雄是否存在
if (!user.heros[heroId]) {
return {
code: -6,
msg: "未找到英雄"
};
}
// 检查英雄是否在出战阵容中
for (let pos = 0; pos < 5; pos++) {
if (user.fight_heros[pos] === heroId) {
return {
code: -8,
msg: `英雄位于出战位置 ${pos},请先从出战阵容移除`
};
}
}
const deletedHero = user.heros[heroId];
let updateRes = await db.collection(user_db_name).doc(user._id).update({
data: {
[`heros.${heroId}`]: _.remove(),
last_save_time: _.set(Date.now())
}
});
if (updateRes?.stats?.updated >= 1) {
return {
code: 200,
data: deletedHero,
msg: `英雄 ${heroId} 删除成功`
};
} else {
return {
code: -1,
msg: `删除英雄失败`
};
}
} catch (error) {
console.error("删除英雄错误:", error);
return {
code: -5,
msg: `删除英雄错误: ${error.message}`
};
}
}
/**
* 获取已拥有的英雄ID列表
* @param {Object} db 数据库实例
* @param {string} openid 用户openid
* @returns {Object} 操作结果
*/
async function getOwnedHeroIds(db, openid) {
try {
let user = await getOrCreaterUser(db, openid);
if (!user) {
return {
code: -4,
msg: "未找到用户"
};
}
const heroIds = Object.keys(user.heros).map(Number);
return {
code: 200,
data: {
hero_ids: heroIds,
total_count: heroIds.length
},
msg: "获取已拥有英雄ID成功"
};
} catch (error) {
console.error("获取已拥有英雄ID错误:", error);
return {
code: -5,
msg: `获取已拥有英雄ID错误: ${error.message}`
};
}
}
module.exports = {
getHeros,
getHero,
addHero,
updateHero,
setHeroProperty,
levelUpHero,
deleteHero,
getOwnedHeroIds
};