371 lines
8.5 KiB
JavaScript
371 lines
8.5 KiB
JavaScript
// 出战英雄操作模块
|
||
const { getOrCreaterUser } = require('./auth');
|
||
|
||
const user_db_name = "cocos_users";
|
||
|
||
/**
|
||
* 获取出战英雄配置
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function getFightHeros(db, openid) {
|
||
try {
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
return {
|
||
code: 200,
|
||
data: user.fight_heros,
|
||
msg: "出战英雄获取成功"
|
||
};
|
||
} catch (error) {
|
||
console.error("获取出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `获取出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 设置出战英雄
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @param {number} position 出战位置 (0-4)
|
||
* @param {number} heroId 英雄ID,0表示移除
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function setFightHero(db, openid, position, heroId) {
|
||
try {
|
||
const _ = db.command;
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
// 验证位置参数
|
||
if (position < 0 || position > 4) {
|
||
return {
|
||
code: -3,
|
||
msg: "无效的位置,必须是0-4"
|
||
};
|
||
}
|
||
|
||
// 验证英雄ID
|
||
if (typeof heroId !== 'number' || heroId < 0) {
|
||
return {
|
||
code: -3,
|
||
msg: "无效的英雄ID"
|
||
};
|
||
}
|
||
|
||
// 如果不是移除操作,检查英雄是否存在
|
||
if (heroId > 0 && !user.heros[heroId]) {
|
||
return {
|
||
code: -6,
|
||
msg: "未拥有该英雄"
|
||
};
|
||
}
|
||
|
||
const oldHeroId = user.fight_heros[position];
|
||
|
||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||
data: {
|
||
[`fight_heros.${position}`]: _.set(heroId),
|
||
last_save_time: _.set(Date.now())
|
||
}
|
||
});
|
||
|
||
if (updateRes?.stats?.updated >= 1) {
|
||
return {
|
||
code: 200,
|
||
data: {
|
||
position: position,
|
||
old_hero_id: oldHeroId,
|
||
new_hero_id: heroId
|
||
},
|
||
msg: `出战英雄位置 ${position} 更新成功`
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `设置出战英雄失败`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("设置出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `设置出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 批量设置出战英雄
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @param {Object} fightHeros 出战英雄配置对象
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function updateFightHeros(db, openid, fightHeros) {
|
||
try {
|
||
const _ = db.command;
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
// 验证数据格式
|
||
if (!fightHeros || typeof fightHeros !== 'object') {
|
||
return {
|
||
code: -3,
|
||
msg: "无效的出战英雄数据格式"
|
||
};
|
||
}
|
||
|
||
// 验证每个位置和英雄ID
|
||
for (const pos in fightHeros) {
|
||
const position = parseInt(pos);
|
||
const heroId = fightHeros[pos];
|
||
|
||
if (isNaN(position) || position < 0 || position > 4) {
|
||
return {
|
||
code: -3,
|
||
msg: `无效的位置: ${pos}`
|
||
};
|
||
}
|
||
|
||
if (typeof heroId !== 'number' || heroId < 0) {
|
||
return {
|
||
code: -3,
|
||
msg: `位置 ${pos} 的英雄ID无效: ${heroId}`
|
||
};
|
||
}
|
||
|
||
// 如果不是移除操作,检查英雄是否存在
|
||
if (heroId > 0 && !user.heros[heroId]) {
|
||
return {
|
||
code: -6,
|
||
msg: `位置 ${pos} 未拥有英雄 ${heroId}`
|
||
};
|
||
}
|
||
}
|
||
|
||
const newFightHeros = { ...user.fight_heros, ...fightHeros };
|
||
|
||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||
data: {
|
||
fight_heros: _.set(newFightHeros),
|
||
last_save_time: _.set(Date.now())
|
||
}
|
||
});
|
||
|
||
if (updateRes?.stats?.updated >= 1) {
|
||
return {
|
||
code: 200,
|
||
data: newFightHeros,
|
||
msg: "出战英雄更新成功"
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `更新出战英雄失败`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("更新出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `更新出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取当前出战英雄列表(不包含空位)
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function getActiveFightHeros(db, openid) {
|
||
try {
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
const activeHeros = [];
|
||
for (let i = 0; i < 5; i++) {
|
||
const heroId = user.fight_heros[i];
|
||
if (heroId && heroId > 0) {
|
||
activeHeros.push({
|
||
position: i,
|
||
hero_id: heroId,
|
||
hero_data: user.heros[heroId] || null
|
||
});
|
||
}
|
||
}
|
||
|
||
return {
|
||
code: 200,
|
||
data: {
|
||
active_heros: activeHeros,
|
||
total_count: activeHeros.length
|
||
},
|
||
msg: "获取活跃出战英雄成功"
|
||
};
|
||
} catch (error) {
|
||
console.error("获取活跃出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `获取活跃出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 交换两个出战位置的英雄
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @param {number} position1 位置1 (0-4)
|
||
* @param {number} position2 位置2 (0-4)
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function swapFightHeros(db, openid, position1, position2) {
|
||
try {
|
||
const _ = db.command;
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
// 验证位置参数
|
||
if (position1 < 0 || position1 > 4 || position2 < 0 || position2 > 4) {
|
||
return {
|
||
code: -3,
|
||
msg: "无效的位置,必须是0-4"
|
||
};
|
||
}
|
||
|
||
if (position1 === position2) {
|
||
return {
|
||
code: -3,
|
||
msg: "不能交换相同位置"
|
||
};
|
||
}
|
||
|
||
const hero1 = user.fight_heros[position1];
|
||
const hero2 = user.fight_heros[position2];
|
||
|
||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||
data: {
|
||
[`fight_heros.${position1}`]: _.set(hero2),
|
||
[`fight_heros.${position2}`]: _.set(hero1),
|
||
last_save_time: _.set(Date.now())
|
||
}
|
||
});
|
||
|
||
if (updateRes?.stats?.updated >= 1) {
|
||
return {
|
||
code: 200,
|
||
data: {
|
||
position1: position1,
|
||
position2: position2,
|
||
hero1_moved_to: hero1,
|
||
hero2_moved_to: hero2
|
||
},
|
||
msg: `出战英雄交换成功`
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `交换出战英雄失败`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("交换出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `交换出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 重置出战英雄配置
|
||
* @param {Object} db 数据库实例
|
||
* @param {string} openid 用户openid
|
||
* @returns {Object} 操作结果
|
||
*/
|
||
async function resetFightHeros(db, openid) {
|
||
try {
|
||
const _ = db.command;
|
||
const { getNewUserInitData } = require('../user_init_data');
|
||
let user = await getOrCreaterUser(db, openid);
|
||
if (!user) {
|
||
return {
|
||
code: -4,
|
||
msg: "未找到用户"
|
||
};
|
||
}
|
||
|
||
const defaultData = getNewUserInitData();
|
||
|
||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||
data: {
|
||
fight_heros: _.set(defaultData.fight_heros),
|
||
last_save_time: _.set(Date.now()),
|
||
reset_time: _.set(Date.now())
|
||
}
|
||
});
|
||
|
||
if (resetRes?.stats?.updated >= 1) {
|
||
return {
|
||
code: 200,
|
||
data: defaultData.fight_heros,
|
||
msg: "出战英雄重置成功"
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `重置失败, ${JSON.stringify(resetRes)}`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("重置出战英雄错误:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `重置出战英雄错误: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
getFightHeros,
|
||
setFightHero,
|
||
updateFightHeros,
|
||
getActiveFightHeros,
|
||
swapFightHeros,
|
||
resetFightHeros
|
||
};
|
||
|