寻宝:协助次数&匹配范围修改
This commit is contained in:
@@ -1,43 +1,33 @@
|
||||
import { MemComBtlTeam } from './../domain/battleField/ComBattleTeamField';
|
||||
import { ItemModel } from './../db/Item';
|
||||
import { ITEM_CHANGE_REASON, IT_TYPE } from './../consts';
|
||||
import { COM_BTL_QUALITY } from './../consts/constModules/itemConst';
|
||||
import { FriendRelationModel } from './../db/FriendRelation';
|
||||
import { RoleModel, RoleType } from './../db/Role';
|
||||
import { EquipPrintDropType, EquipPrintDropModel } from './../db/EquipPrintDrop';
|
||||
import { FriendPointModel } from './../db/FriendPoint';
|
||||
import { STATUS } from './../consts/statusCode';
|
||||
import { COM_TEAM_STATUS, FRIEND_DROP_TYPE, COM_BTL_CONST, FRIEND_DROP_MAX } from './../consts';
|
||||
import { RoleStatus, ComBattleTeamModel, ComBattleTeamType } from './../db/ComBattleTeam';
|
||||
import { getRandEelm, getRandValue, resResult, ratioReward, getRandValueByMinMax, getRandEelmWithWeight, getRobotInfo } from "../pubUtils/util";
|
||||
import { getRandRobot, transBossHpArr } from "./battleService";
|
||||
import { difference, omit } from 'underscore';
|
||||
import { Channel, ChannelService, pinus } from 'pinus';
|
||||
import { TREASURE, EXTERIOR } from '../pubUtils/dicParam';
|
||||
import { getFriendLvAdd } from './friendService';
|
||||
import { getRoleIds } from '../pubUtils/friendUtil';
|
||||
import { getTeamSearchByQuality, rmRoleFromQueue } from './redisService';
|
||||
import { getTeamSearchByLv, rmRoleFromQueue } from './redisService';
|
||||
import { addUserToChannel } from './roleService';
|
||||
import { ChannelUser } from '../domain/ChannelUser';
|
||||
import { getRewardByBlueprtId, gameData, getBossHpByBlueprtId } from '../pubUtils/data';
|
||||
import { getFriendPointObject } from '../pubUtils/itemUtils';
|
||||
import { DicWar } from '../pubUtils/dictionary/DicWar';
|
||||
import { getRewardByBlueprtId, gameData, getBossHpByBlueprtId, getDicBlueprtById } from '../pubUtils/data';
|
||||
import { getZeroPointD, nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { dispatch } from '../pubUtils/dispatcher';
|
||||
import { handleCost } from './rewardService';
|
||||
|
||||
/**
|
||||
* 在给定的品质列表中随机返回一定数量的藏宝图Id
|
||||
* @param qualityArr 品质数组,在所有给定品质的藏宝图中筛选1
|
||||
* @param lv 品质数组,在所有给定品质的藏宝图中筛选1
|
||||
* @param cnt 返回藏宝图数量
|
||||
*/
|
||||
export function getRandBlueprtId(qualityArr: number[], lvRange: number, cnt = 1) {
|
||||
if (!qualityArr || !qualityArr.length) return null;
|
||||
let blueprtIdArr: number[] = [];
|
||||
for (let q of qualityArr) {
|
||||
blueprtIdArr = blueprtIdArr.concat(gameData.blueprtWithQualityAndStar.get(`${q}_${lvRange}`));
|
||||
}
|
||||
if (blueprtIdArr.length === 0) return null;
|
||||
export function getRandBlueprtId(lv: number, cnt = 1) {
|
||||
if (!gameData.blueprtByLv.has(lv)) return null;
|
||||
let blueprtIdArr: number[] = gameData.blueprtByLv.get(lv)||[];
|
||||
|
||||
const res = getRandEelm(blueprtIdArr, cnt);
|
||||
// console.log('******** getRandBlueprtId', blueprtIdArr, cnt, res)
|
||||
@@ -167,37 +157,14 @@ export async function getRealReward(blueprtId: number, roleSt: RoleStatus) {
|
||||
}
|
||||
|
||||
export async function getAllAssistCnt(roleId: string) {
|
||||
let cntMap = await getAssistTimesByQuality(roleId);
|
||||
let cnt = [];
|
||||
for (let i = 0; i < COM_BTL_QUALITY.length; ++i) {
|
||||
cnt[i] = cntMap.get(i + 1) || 0;
|
||||
}
|
||||
return cnt;
|
||||
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, getZeroPointD(), true);
|
||||
return teams.length;
|
||||
}
|
||||
|
||||
export async function getAssistTimesByQuality(roleId: string, qualityArr?: number[]) {
|
||||
let teams = await ComBattleTeamModel.getAssistTeamsByTime(roleId, qualityArr, getZeroPointD(), true);
|
||||
let cntMap = new Map<number, number>();
|
||||
teams.forEach(team => {
|
||||
if (team && team.quality && team.roleStatus) {
|
||||
for (let st of team.roleStatus) {
|
||||
if (st.roleId !== roleId || st.isFrd) {
|
||||
continue;
|
||||
}
|
||||
let cnt = cntMap.get(team.quality) || 0;
|
||||
cntMap.set(team.quality, cnt + 1)
|
||||
}
|
||||
}
|
||||
});
|
||||
return cntMap;
|
||||
}
|
||||
|
||||
export async function getFrd(roleId: string, quality: number) {
|
||||
export async function getFrd(roleId: string) {
|
||||
let isFrd = false;
|
||||
let assistTimes = await getAssistTimesByQuality(roleId, [quality]);
|
||||
let assistTime = assistTimes.get(quality);
|
||||
let { assistanceTime } = gameData.xunbao.get(quality);
|
||||
if (assistTime >= assistanceTime) isFrd = true;
|
||||
let cnt = await getAllAssistCnt(roleId);
|
||||
if (cnt >= TREASURE.TREASURE_ASSIST_TIME) isFrd = true;
|
||||
return isFrd;
|
||||
}
|
||||
|
||||
@@ -242,7 +209,7 @@ function updateRobotKilled(bossHp: number, roleSt: RoleStatus) {
|
||||
}
|
||||
|
||||
export async function handleComBtlProgress(teamStatus: MemComBtlTeam, robotHurtTimer: Map<string, NodeJS.Timer>, teamMap: Map<string, MemComBtlTeam>, channel: Channel) {
|
||||
const { teamCode, roleIds, capId, quality } = teamStatus;
|
||||
const { teamCode } = teamStatus;
|
||||
// 判断战斗是否结束
|
||||
let battleSt = checkComBattleResult(teamStatus);
|
||||
teamStatus.status = battleSt;
|
||||
@@ -351,15 +318,15 @@ export function clearRobotHurtTimer(teamStatus, robotHurtTimer: Map<string, Node
|
||||
/**
|
||||
* @description 检查寻宝等级是否合法
|
||||
* @export
|
||||
* @param {number} lv 玩家等级
|
||||
* @param {number} lvRange 藏宝图等级范围
|
||||
* @param {number} playerLv 玩家等级
|
||||
* @param {number} blueprtLv 藏宝图等级
|
||||
* @returns
|
||||
*/
|
||||
export function comBtlLvInvalid(lv: number, lvRange: number) {
|
||||
const range = gameData.comBtlLvRange.get(lvRange);
|
||||
export function comBtlLvInvalid(playerLv: number, blueprtLv: number) {
|
||||
const range = gameData.comBtlLvRange.get(blueprtLv);
|
||||
if (!range) return true;
|
||||
let { min, max } = range;
|
||||
return lv < min || lv > max;
|
||||
return playerLv < min || playerLv > max;
|
||||
}
|
||||
|
||||
export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map<string, MemComBtlTeam>, roleId: string, teamDisTimer: Map<string, NodeJS.Timer>, channel) {
|
||||
@@ -501,18 +468,17 @@ async function teammateValid(roleInfo: Partial<RoleType>, roleId: string, roleId
|
||||
* @param {string} roleId 要加入玩家的信息
|
||||
* @param {string[]} roleIds 队伍中当前玩家列表
|
||||
* @param {number} ceLimit
|
||||
* @param {number} quality
|
||||
* @returns
|
||||
*/
|
||||
export async function getValidTeammateRoleSt(roleId: string, roleIds: string[], ceLimit: number, quality: number) {
|
||||
export async function getValidTeammateRoleSt(roleId: string, roleIds: string[], ceLimit: number) {
|
||||
let roleInfo = await RoleModel.findByRoleId(roleId, null, true);
|
||||
let { roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, topLineupCe, lv } = roleInfo;
|
||||
let { roleName, head = EXTERIOR.EXTERIOR_FACE, frame = EXTERIOR.EXTERIOR_FACECASE, spine = EXTERIOR.EXTERIOR_APPEARANCE, topLineupCe, lv: playerLv } = roleInfo;
|
||||
|
||||
const valid = await teammateValid(roleInfo, roleId, roleIds, ceLimit);
|
||||
if (!valid) return null;
|
||||
|
||||
let isFrd = await getFrd(roleId, quality);
|
||||
const result = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, lv);
|
||||
let isFrd = await getFrd(roleId);
|
||||
const result = new RoleStatus(roleId, roleName, false, isFrd, head, frame, spine, topLineupCe, playerLv);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -532,36 +498,7 @@ export async function teammateInBlackList(roleId: string, roleIds: string[]) {
|
||||
}
|
||||
|
||||
export function blueprtIdValid(id: number) {
|
||||
const goodData = gameData.goods.get(id);
|
||||
return goodData && goodData.itid === IT_TYPE.BLUEPRT && COM_BTL_QUALITY.indexOf(goodData.quality) !== -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 创建 ComBattleTeam 的数据结构
|
||||
* @export
|
||||
* @param {string} teamCode
|
||||
* @param {boolean} pub
|
||||
* @param {number} blueprtId
|
||||
* @param {number} status
|
||||
* @param {string} capId
|
||||
* @param {number} ceLimit
|
||||
* @param {number} bossHp
|
||||
* @param {number} quality
|
||||
* @param {BossHp[]} bossHpArr
|
||||
* @returns
|
||||
*/
|
||||
export function createComTeamData(teamCode: string, pub: boolean, blueprtId: number, capId: string, ceLimit: number) {
|
||||
const { equipLvl, quality } = gameData.goods.get(blueprtId);
|
||||
const { bossHpSum, bossHpArr } = getBossHpByBlueprtId(blueprtId);
|
||||
const curRnd = 0;
|
||||
const roleCnt = 1;
|
||||
const timeout = false;
|
||||
const bossCurHp = bossHpSum;
|
||||
const bossHp = bossHpSum;
|
||||
const status = COM_TEAM_STATUS.DEFAULT;
|
||||
return {
|
||||
teamCode, pub, blueprtId, status, capId, ceLimit, bossHp, bossCurHp, quality, bossHpArr: transBossHpArr(bossHpArr), curRnd, roleCnt, timeout, lvRange: equipLvl, blacklist: []
|
||||
};
|
||||
return gameData.blueprt.has(id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -619,14 +556,14 @@ export function addRoleStToTeam(comTeam: MemComBtlTeam, roleSt: RoleStatus) {
|
||||
* @returns
|
||||
*/
|
||||
export async function addValidSearchingRoles(comTeam: MemComBtlTeam, channelService: ChannelService) {
|
||||
const { quality, equipLvl } = gameData.goods.get(comTeam.blueprtId);
|
||||
let teammates = await getTeamSearchByQuality(quality, equipLvl);
|
||||
const { lv } = getDicBlueprtById(comTeam.blueprtId);
|
||||
let teammates = await getTeamSearchByLv(lv);
|
||||
if (teammates && teammates.length) {
|
||||
for (let teammate of teammates) {
|
||||
const { roleId: teammateRoleId, sid } = teammate;
|
||||
const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, comTeam.ceLimit, quality);
|
||||
const st = await getValidTeammateRoleSt(teammateRoleId, comTeam.roleIds, comTeam.ceLimit);
|
||||
if (!st) continue;
|
||||
await rmRoleFromQueue(teammateRoleId, sid, COM_BTL_QUALITY, null); // 匹配成功后删除redis中该用户的匹配记录
|
||||
await rmRoleFromQueue(teammateRoleId, sid); // 匹配成功后删除redis中该用户的匹配记录
|
||||
addRoleStToTeam(comTeam, st);
|
||||
const channel = channelService.getChannel(comTeam.teamCode, false);
|
||||
addUserToChannel(channel, new ChannelUser(teammateRoleId, sid));
|
||||
|
||||
Reference in New Issue
Block a user