寻宝:匹配多选

This commit is contained in:
luying
2022-02-25 17:16:17 +08:00
parent 224383b31e
commit 2db328759e
4 changed files with 49 additions and 35 deletions
@@ -101,10 +101,10 @@ export class ComBattleHandler {
* @returns * @returns
* @memberof ComBattleHandler * @memberof ComBattleHandler
*/ */
async searchTeam(msg: { lv: number }, session: BackendSession) { async searchTeam(msg: { lv: number[] }, session: BackendSession) {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let sid = session.get('sid'); let sid = session.get('sid');
const { lv = 1 } = msg; const { lv: lvs = [] } = msg;
const roleInfo = await RoleModel.findByRoleId(roleId, null, true); const roleInfo = await RoleModel.findByRoleId(roleId, null, true);
const { lv: playerLv } = roleInfo; const { lv: playerLv } = roleInfo;
let { topLineupCe = 1000 } = roleInfo; let { topLineupCe = 1000 } = roleInfo;
@@ -113,30 +113,26 @@ export class ComBattleHandler {
return resResult(STATUS.COM_BATTLE_IS_RUNNING); return resResult(STATUS.COM_BATTLE_IS_RUNNING);
} }
if (comBtlLvInvalid(playerLv, lv)) { if (comBtlLvInvalid(playerLv, lvs)) {
return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH);
} }
if (!gameData.blueprtByLv.has(lv)) { const teams = await ComBattleTeamModel.getOtherTeamByLvAndSt(roleId, lvs, COM_TEAM_STATUS.DEFAULT, topLineupCe);
return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR);
}
const teams = await ComBattleTeamModel.getOtherTeamByLvAndSt(roleId, lv, COM_TEAM_STATUS.DEFAULT, topLineupCe);
const team: ComBattleTeamType = await oneTeamNotInBlack(teams, roleId); const team: ComBattleTeamType = await oneTeamNotInBlack(teams, roleId);
if (team && team.roleIds.length < 3 && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.indexOf(roleId) === -1 && team.blacklist && team.blacklist.indexOf(roleId) === -1) { if (team && team.roleIds.length < 3 && team.status === COM_TEAM_STATUS.DEFAULT && team.roleIds.indexOf(roleId) === -1 && team.blacklist && team.blacklist.indexOf(roleId) === -1) {
return resResult(STATUS.SUCCESS, {teamCode: team.teamCode}); return resResult(STATUS.SUCCESS, {teamCode: team.teamCode});
} }
let teamCode = session.get('teamCode'); let teamCode = session.get('teamCode');
await setTeamSearchReq(roleId, sid, lv); await setTeamSearchReq(roleId, sid, lvs);
let thiz = this; let thiz = this;
// 倒计时匹配两个机器人 // 倒计时匹配两个机器人
setTimeout(async () => { setTimeout(async () => {
let inQueue = await checkRoleInQueue(roleId, sid, lv); let inQueue = await checkRoleInQueue(roleId, sid, lvs);
if (!inQueue) return; if (!inQueue) return;
await rmRoleFromQueue(roleId, sid, lv); await rmRoleFromQueue(roleId, sid, lvs);
// 创建队伍 // 创建队伍
let blueprtId = getRandBlueprtId(lv).pop(); let blueprtId = getRandBlueprtId(lvs).pop();
let comTeam = new MemComBtlTeam(teamCode, false, blueprtId, 'robot', 0) let comTeam = new MemComBtlTeam(teamCode, false, blueprtId, 'robot', 0)
let isFrd = await getFrd(roleId); let isFrd = await getFrd(roleId);
@@ -147,7 +143,7 @@ export class ComBattleHandler {
addUserToChannel(channel, new ChannelUser(roleId, sid)); addUserToChannel(channel, new ChannelUser(roleId, sid));
// 创建并添加机器人 // 创建并添加机器人
await addRobotsToTeam(comTeam, roleId, topLineupCe, lv, thiz.teamMap, thiz.teamDisTimer, channel, 2); await addRobotsToTeam(comTeam, roleId, topLineupCe, playerLv, thiz.teamMap, thiz.teamDisTimer, channel, 2);
await ComBattleTeamModel.createTeam(comTeam); await ComBattleTeamModel.createTeam(comTeam);
thiz.teamMap.set(teamCode, comTeam); thiz.teamMap.set(teamCode, comTeam);
@@ -196,7 +192,7 @@ export class ComBattleHandler {
if (lv < COM_BTL_CONST.ENABLE_LV) { if (lv < COM_BTL_CONST.ENABLE_LV) {
return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
} else if (comBtlLvInvalid(lv, teamStatus.lv)) { } else if (comBtlLvInvalid(lv, [teamStatus.lv])) {
return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH); return resResult(STATUS.COM_BATTLE_ASSIST_LV_NOT_ENOUGH);
} else if (topLineupCe < teamStatus.ceLimit) { } else if (topLineupCe < teamStatus.ceLimit) {
return resResult(STATUS.COM_BATTLE_CE_LIMIT); return resResult(STATUS.COM_BATTLE_CE_LIMIT);
+16 -8
View File
@@ -25,9 +25,14 @@ import { handleCost } from './rewardService';
* @param lv 品质数组,在所有给定品质的藏宝图中筛选1 * @param lv 品质数组,在所有给定品质的藏宝图中筛选1
* @param cnt 返回藏宝图数量 * @param cnt 返回藏宝图数量
*/ */
export function getRandBlueprtId(lv: number, cnt = 1) { export function getRandBlueprtId(lvs: number[], cnt = 1) {
if (!gameData.blueprtByLv.has(lv)) return null; if (!lvs || !lvs.length) return null;
let blueprtIdArr: number[] = gameData.blueprtByLv.get(lv)||[];
let blueprtIdArr: number[] = [];
for (let lv of lvs) {
blueprtIdArr = blueprtIdArr.concat(gameData.blueprtByLv.get(lv));
}
if (blueprtIdArr.length === 0) return null;
const res = getRandEelm(blueprtIdArr, cnt); const res = getRandEelm(blueprtIdArr, cnt);
// console.log('******** getRandBlueprtId', blueprtIdArr, cnt, res) // console.log('******** getRandBlueprtId', blueprtIdArr, cnt, res)
@@ -322,11 +327,14 @@ export function clearRobotHurtTimer(teamStatus, robotHurtTimer: Map<string, Node
* @param {number} blueprtLv 藏宝图等级 * @param {number} blueprtLv 藏宝图等级
* @returns * @returns
*/ */
export function comBtlLvInvalid(playerLv: number, blueprtLv: number) { export function comBtlLvInvalid(playerLv: number, blueprtLvs: number[]) {
const range = gameData.comBtlLvRange.get(blueprtLv); for(let blueprtLv of blueprtLvs) {
if (!range) return true; const range = gameData.comBtlLvRange.get(blueprtLv);
let { min, max } = range; if (!range) return true;
return playerLv < min || playerLv > max; let { min, max } = range;
if(playerLv < min || playerLv > max) return false;
}
return true
} }
export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map<string, MemComBtlTeam>, roleId: string, teamDisTimer: Map<string, NodeJS.Timer>, channel) { export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map<string, MemComBtlTeam>, roleId: string, teamDisTimer: Map<string, NodeJS.Timer>, channel) {
+21 -11
View File
@@ -158,10 +158,15 @@ function getComTeamValue(roleId: string, sid: string) {
* @param {number} lvRange * @param {number} lvRange
* @returns * @returns
*/ */
export async function setTeamSearchReq(roleId: string, sid: string, lv: number) { export async function setTeamSearchReq(roleId: string, sid: string, lvs: number[]) {
let cmds = [];
lvs.forEach(lv => {
if (lv) {
cmds.push(['sadd', getComTeamKey(lv), getComTeamValue(roleId, sid)]);
}
});
const res = await redisClient().multi(cmds).execAsync();
const res = await redisClient().saddAsync(getComTeamKey(lv), [getComTeamValue(roleId, sid)]);
console.log('setTeamSearchReq: ', res);
return res; return res;
} }
@@ -172,11 +177,13 @@ export async function setTeamSearchReq(roleId: string, sid: string, lv: number)
* @param {string} sid * @param {string} sid
* @param {number} lv 如果不填表示所有品阶 * @param {number} lv 如果不填表示所有品阶
*/ */
export async function rmRoleFromQueue(roleId: string, sid: string, lv?: number) { export async function rmRoleFromQueue(roleId: string, sid: string, lvs?: number[]) {
let cmds = []; let cmds = [];
if (lv) { if (lvs) {
cmds.push(['srem', getComTeamKey(lv), getComTeamValue(roleId, sid)]); for(let lv of lvs) {
cmds.push(['srem', getComTeamKey(lv), getComTeamValue(roleId, sid)]);
}
} else { } else {
for (let range of comBtlRanges()) { for (let range of comBtlRanges()) {
cmds.push(['srem', getComTeamKey(range), getComTeamValue(roleId, sid)]); cmds.push(['srem', getComTeamKey(range), getComTeamValue(roleId, sid)]);
@@ -216,11 +223,14 @@ export async function getTeamSearchByLv(lv: number) {
* @param {number} lv * @param {number} lv
* @returns * @returns
*/ */
export async function checkRoleInQueue(roleId: string, sid: string, lv: number) { export async function checkRoleInQueue(roleId: string, sid: string, lvs: number[]) {
let res = await redisClient().sismemberAsync(getComTeamKey(lv), `${roleId}:${sid}`); for (let lv of lvs) {
if (res) { let res = await redisClient().sismemberAsync(getComTeamKey(lv), `${roleId}:${sid}`);
return true; if (res) {
} return true;
}
};
return false; return false;
} }
+2 -2
View File
@@ -289,9 +289,9 @@ export default class ComBattleTeam extends BaseModel {
return team; return team;
} }
public static async getOtherTeamByLvAndSt(roleId: string, lv: number, status: number, ce = 0, pub = true, cntLmt = 2, lean = true) { public static async getOtherTeamByLvAndSt(roleId: string, lvs: number[], status: number, ce = 0, pub = true, cntLmt = 2, lean = true) {
const curTime = new Date(Date.now() - 10 * 60 * 1000); // 10分钟之前 const curTime = new Date(Date.now() - 10 * 60 * 1000); // 10分钟之前
const team: ComBattleTeamType[] = await ComBattleTeamModel.find({ lv, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean); const team: ComBattleTeamType[] = await ComBattleTeamModel.find({ lv: { $in: lvs }, status, ceLimit: {$lte: ce}, pub, roleCnt: {$lte: cntLmt}, roleIds: {$nin: [roleId]}, updatedAt: {$gte: curTime}}).lean(lean);
return team; return team;
} }