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: "User not found"
|
||
};
|
||
}
|
||
|
||
return {
|
||
code: 200,
|
||
data: user.fight_heros,
|
||
msg: "Fight heros retrieved successfully"
|
||
};
|
||
} catch (error) {
|
||
console.error("Get fight heros error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Get fight heros error: ${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: "User not found"
|
||
};
|
||
}
|
||
|
||
// 验证位置参数
|
||
if (position < 0 || position > 4) {
|
||
return {
|
||
code: -3,
|
||
msg: "Invalid position, must be 0-4"
|
||
};
|
||
}
|
||
|
||
// 验证英雄ID
|
||
if (typeof heroId !== 'number' || heroId < 0) {
|
||
return {
|
||
code: -3,
|
||
msg: "Invalid hero ID"
|
||
};
|
||
}
|
||
|
||
// 如果不是移除操作,检查英雄是否存在
|
||
if (heroId > 0 && !user.heros[heroId]) {
|
||
return {
|
||
code: -6,
|
||
msg: "Hero not owned"
|
||
};
|
||
}
|
||
|
||
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: `Fight hero position ${position} updated successfully`
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `Set fight hero fail`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("Set fight hero error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Set fight hero error: ${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: "User not found"
|
||
};
|
||
}
|
||
|
||
// 验证数据格式
|
||
if (!fightHeros || typeof fightHeros !== 'object') {
|
||
return {
|
||
code: -3,
|
||
msg: "Invalid fight heros data format"
|
||
};
|
||
}
|
||
|
||
// 验证每个位置和英雄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: `Invalid position: ${pos}`
|
||
};
|
||
}
|
||
|
||
if (typeof heroId !== 'number' || heroId < 0) {
|
||
return {
|
||
code: -3,
|
||
msg: `Invalid hero ID for position ${pos}: ${heroId}`
|
||
};
|
||
}
|
||
|
||
// 如果不是移除操作,检查英雄是否存在
|
||
if (heroId > 0 && !user.heros[heroId]) {
|
||
return {
|
||
code: -6,
|
||
msg: `Hero ${heroId} not owned for position ${pos}`
|
||
};
|
||
}
|
||
}
|
||
|
||
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: "Fight heros updated successfully"
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `Update fight heros fail`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("Update fight heros error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Update fight heros error: ${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: "User not found"
|
||
};
|
||
}
|
||
|
||
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: "Active fight heros retrieved successfully"
|
||
};
|
||
} catch (error) {
|
||
console.error("Get active fight heros error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Get active fight heros error: ${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: "User not found"
|
||
};
|
||
}
|
||
|
||
// 验证位置参数
|
||
if (position1 < 0 || position1 > 4 || position2 < 0 || position2 > 4) {
|
||
return {
|
||
code: -3,
|
||
msg: "Invalid positions, must be 0-4"
|
||
};
|
||
}
|
||
|
||
if (position1 === position2) {
|
||
return {
|
||
code: -3,
|
||
msg: "Cannot swap same position"
|
||
};
|
||
}
|
||
|
||
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: `Fight heros swapped successfully`
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `Swap fight heros fail`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("Swap fight heros error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Swap fight heros error: ${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: "User not found"
|
||
};
|
||
}
|
||
|
||
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: "Fight heros reset successfully"
|
||
};
|
||
} else {
|
||
return {
|
||
code: -1,
|
||
msg: `Reset fail, ${JSON.stringify(resetRes)}`
|
||
};
|
||
}
|
||
} catch (error) {
|
||
console.error("Reset fight heros error:", error);
|
||
return {
|
||
code: -5,
|
||
msg: `Reset fight heros error: ${error.message}`
|
||
};
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
getFightHeros,
|
||
setFightHero,
|
||
updateFightHeros,
|
||
getActiveFightHeros,
|
||
swapFightHeros,
|
||
resetFightHeros
|
||
};
|
||
|