✨ feat(战场): 保存战阵连携顺序

This commit is contained in:
luying
2023-08-01 17:20:21 +08:00
parent 07bce370aa
commit f0ab9b0aeb
14 changed files with 102 additions and 33 deletions
@@ -22,6 +22,7 @@ import { BattleRecordModel } from '../../../db/BattleRecord';
import { isHeroHidden } from '../../../services/dataService';
import { getRemoteRplFilePath, getRemoteRplPrefix } from '../../../pubUtils/battleUtils';
import { pvpEndParamInter } from '../../../pubUtils/interface';
import { Combo } from '../../../domain/battleField/pvp';
export default function (app: Application) {
new HandlerService(app, {});
@@ -275,8 +276,8 @@ export class LadderHandler {
}
// 9. 设置防守阵容
async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }[] }, session: BackendSession) {
let { warId, heroes } = msg;
async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }[], combo: Combo[] }, session: BackendSession) {
let { warId, heroes, combo } = msg;
let roleId = session.get('roleId');
let ladderData = await LadderMatchModel.findByRoleId(roleId);
@@ -296,7 +297,7 @@ export class LadderHandler {
let dbHero = dbHeroes.find(ccur => ccur.hid == cur.actorId);
return dbHero && new LadderDefenseHero(cur, dbHero._id, dbHero.ce);
}).filter(cur => cur);
let defense = new LadderDefense(defenseHeroes, warId);
let defense = new LadderDefense(defenseHeroes, warId, combo);
ladderData = await LadderMatchModel.updateByRoleId(roleId, { defense, hasDefense: true });
// 返回
let result = new LadderDataReturn();
@@ -11,7 +11,7 @@ import { PvpDefenseModel, pvpUpdateInter } from '../../../db/PvpDefense';
import { PvpSeasonResultModel } from '../../../db/PvpSeasonResult';
import { Rank } from '../../../services/rankService';
import { checkTask, checkTaskInPvpEnd } from '../../../services/task/taskService';
import { Attack, Defense, DefenseHero, PvpDataReturn, pvpSaveDataReturn } from '../../../domain/battleField/pvp';
import { Attack, Combo, Defense, DefenseHero, PvpDataReturn, pvpSaveDataReturn } from '../../../domain/battleField/pvp';
import { DEBUG_MAGIC_WORD, FIGURE_UNLOCK_CONDITION, ITEM_CHANGE_REASON, LINEUP_NUM, REDIS_KEY, TASK_TYPE } from '../../../consts';
import { PVP } from '../../../pubUtils/dicParam';
import { addItems, getGoldObject, handleCost, unlockFigure } from '../../../services/role/rewardService';
@@ -158,7 +158,7 @@ export class PvpHandler {
let pvpHistoryOpp = <PvpHistoryOpp>curOpp.oppDef;
return resResult(STATUS.SUCCESS, { roleId: pvpHistoryOpp.oppRoleId, ...pick(pvpHistoryOpp, ['pos', 'title', 'warId', 'buff', 'heroes']) });
return resResult(STATUS.SUCCESS, { roleId: pvpHistoryOpp.oppRoleId, ...pick(pvpHistoryOpp, ['pos', 'title', 'warId', 'buff', 'heroes', 'combo']) });
}
@@ -490,8 +490,8 @@ export class PvpHandler {
}
//3. 保存防守阵容
async saveDefense(msg: { heroes: { actorId: number, dataId: number, order: number, ai: number, subHid?: number }[], warId: number, buff: number }, session: BackendSession) {
let { heroes, warId, buff } = msg;
async saveDefense(msg: { heroes: { actorId: number, dataId: number, order: number, ai: number, subHid?: number }[], warId: number, buff: number, combo: Combo[] }, session: BackendSession) {
let { heroes, warId, buff, combo } = msg;
let roleId = session.get('roleId');
if (heroes.length > LINEUP_NUM || heroes.length <= 0) {
return resResult(STATUS.WRONG_PARMS);
@@ -539,7 +539,7 @@ export class PvpHandler {
let defenseHeroes = heroes.map(cur => {
return new DefenseHero(cur, heroIdMap.get(cur.actorId));
});
let defense = new Defense(defenseHeroes, scores, warId, buff);
let defense = new Defense(defenseHeroes, scores, warId, buff, combo);
let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, pvpDefense.attack?.heroes??[], defense.heroes, dbHeroes);
await PvpSaveDataModel.createSaveData(roleId, warId, buff, defenseHeroes);
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { ...refChallengeObj, defense, lineupCe, hasDefense: true, seasonNum });
@@ -47,7 +47,7 @@ export class GVGBattleHandler {
async getTeams(msg: {}, session: BackendSession) {
const roleId = session.get('roleId');
let { configId } = getGVGConfig();
const teams = await GVGTeamModel.findByRole(roleId, '-_id teamCode index head frame spine lineup confirmConfigId')
const teams = await GVGTeamModel.findByRole(roleId, '-_id teamCode index head frame spine lineup combo confirmConfigId')
return resResult(STATUS.SUCCESS, { teams: teams.map(team => new MyTeamSimpleInfo(team, configId)) });
}
@@ -64,7 +64,7 @@ export class GVGBattleHandler {
const serverId = session.get('serverId');
const roleName = session.get('roleName');
const guildCode = session.get('guildCode');
const { cityId, index, head, spine, frame, lineup } = msg;
const { cityId, index, head, spine, frame, lineup, combo } = msg;
let { configId, period } = getGVGPeriodData();
if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD);
@@ -79,7 +79,7 @@ export class GVGBattleHandler {
let groupKey = await getGroupKey(serverId);
let role = await RoleModel.findByRoleId(roleId, 'lv title');
let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, roleName, serverId, leagueCode, leagueName, lv: role.lv, title: role.title }
let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, roleName, serverId, leagueCode, leagueName, lv: role.lv, title: role.title, combo }
if(lineup) {
let hids: number[] = [];
for(let { actorId, subHid } of lineup) {
@@ -499,7 +499,7 @@ export class GVGBattleHandler {
teamObj.setTime(defenseTeam.teamCode, defenseTeam);
let heroes = getOppHeroes(warId, defenseTeam.isRobot, defenseTeam.lineup)
return resResult(STATUS.SUCCESS, { battleCode: battleRecord.battleCode, warId, isRobot: defenseTeam.isRobot, heroes, curTeam: new MyTeamInfo(attackTeam), oppTeam: new MyTeamInfo(defenseTeam) });
return resResult(STATUS.SUCCESS, { battleCode: battleRecord.battleCode, warId, isRobot: defenseTeam.isRobot, heroes, combo: defenseTeam.combo, curTeam: new MyTeamInfo(attackTeam), oppTeam: new MyTeamInfo(defenseTeam) });
}
// 队伍停止攻击
@@ -29,6 +29,7 @@ import { Rank } from "../../../services/rankService";
import { getAllServerName } from "../../../services/redisService";
import { CheckMeterial } from "../../../services/role/checkMaterial";
import { checkGVGTask } from "../../../services/task/taskService";
import { Combo } from "../../../domain/battleField/pvp";
export default function (app: Application) {
new HandlerService(app, {});
@@ -68,7 +69,7 @@ export class GVGProduceHandler {
let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId, myLeague);
if(!myVestigeRank) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { rank, lineup, oppRanks, refreshCnt } = myVestigeRank;
let { rank, lineup, oppRanks, refreshCnt, combo } = myVestigeRank;
let lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, oppRanks);
@@ -78,7 +79,7 @@ export class GVGProduceHandler {
vestigeId,
myRank: rank,
score: dicRankMap?.get(rank)?.score||0,
lineup, lineupCe,
lineup, lineupCe, combo,
oppPlayers,
refreshCnt,
usedHeroes,
@@ -87,11 +88,11 @@ export class GVGProduceHandler {
}
// 编辑阵容
async saveLineup(msg: { vestigeId: number, lineup: [{ actorId: number, dataId: number, order: number, correspondingVar: number, subHid: number }] }, session: BackendSession) {
async saveLineup(msg: { vestigeId: number, lineup: [{ actorId: number, dataId: number, order: number, correspondingVar: number, subHid: number }], combo: Combo[] }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const { vestigeId, lineup: heroes } = msg;
const { vestigeId, lineup: heroes, combo } = msg;
if(!await checkVestige(serverId, vestigeId)) {
return resResult(STATUS.GVG_VESTIGE_ERR);
@@ -115,11 +116,12 @@ export class GVGProduceHandler {
let curHero = dbHeroes.find(cur => cur.hid == hero.actorId);
return { actorId: curHero.hid, dataId: hero.dataId, order: hero.order, subHid: hero.subHid, correspondingVar: hero.correspondingVar, ce: curHero.ce }
});
let vestigeRank = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { lineup, hasDefense: true });
let vestigeRank = await GVGVestigeRankModel.updateByRoleId(vestigeId, roleId, { lineup, combo, hasDefense: true });
return resResult(STATUS.SUCCESS, {
vestigeId,
lineup: vestigeRank.lineup,
combo: vestigeRank.combo,
lineupCe: vestigeRank.lineup.reduce((pre, cur) => pre + cur.ce, 0),
});
}
@@ -296,12 +298,12 @@ export class GVGProduceHandler {
}
// 布完阵开始挑战
async checkBattle(msg: { battleCode: string, heroes: { actorId: number, dataId: number, order: number, subHid: number }[] }, session: BackendSession) {
async checkBattle(msg: { battleCode: string, heroes: { actorId: number, dataId: number, order: number, subHid: number }[], combo: Combo[] }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const serverId = session.get('serverId');
const { battleCode, heroes } = msg;
const { battleCode, heroes, combo } = msg;
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.GVG_VESTIGE_REC_NOT_FOUND);
@@ -322,7 +324,7 @@ export class GVGProduceHandler {
if(!lock) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
// 向vestigerec保存阵容
const info = await generateAttackHeroInfo(heroes, dbHeroes);
const info = await generateAttackHeroInfo(heroes, dbHeroes, combo);
rec = await GVGVestigeRecModel.startBattle(battleCode, info.heroes, info.ce);
// 更新battleRecord
+17 -1
View File
@@ -748,13 +748,14 @@ export function checkRouteParam(route: string, msg: any) {
}
case "battle.pvpHandler.saveDefense":
{
let { heroes, warId, buff } = msg;
let { heroes, warId, buff, combo } = msg;
if (!checkNaturalArray(heroes)) return false;
if (!checkNaturalNumbers(warId, buff)) return false;
if (heroes.length > LINEUP_NUM) return false;
for (let { actorId, dataId, order, ai } of heroes) {
if (!checkNaturalNumbers(actorId, dataId, order, ai)) return false;
}
if(!checkCombo(combo)) return false
break;
}
case "battle.pvpHandler.receiveBox":
@@ -815,6 +816,7 @@ export function checkRouteParam(route: string, msg: any) {
for (let { actorId, dataId, order } of msg.heroes) {
if (!checkNaturalNumbers(actorId, dataId, order)) return false;
}
if(!checkCombo(msg.combo)) return false
break;
}
case "battle.ladderHandler.buyCnt":
@@ -2302,4 +2304,18 @@ function checkSeqId(...seqIds: (number | string)[]) {
if (!checkNaturalNumbers(<number>seqId) && !checkNaturalStrings(<string>seqId)) return false
}
return true;
}
function checkCombo(combo: {groupId: number, levelList: number[]}[]) {
if(combo) {
if(!isArray(combo)) return false;
for(let {groupId, levelList} of combo) {
if(!isNumber(groupId)) return false;
if(!isArray(levelList)) return false;
for(let lv of levelList) {
if(!isNumber(lv)) return false;
}
}
}
return true;
}
@@ -33,6 +33,7 @@ import { addGVGReward, combinePushItem } from "./gvgItemService";
import { calFighterContribute } from "./gvgPrepareService";
import { addVestigeLeagueRankRec, addVestigeRankMessage } from "./gvgRecService";
import { getGroupKey, getGVGServerType, getPeriodByTime } from "./gvgService";
import { Combo } from "../../domain/battleField/pvp";
let gvgFightTime = undefined;
@@ -249,7 +250,7 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
let info = new OppPlayerInfo();
info.initByPlayer(playerVestigeData.rank, role, league, true);
info.setPlayerHeroes(heroes, lineup);
info.setPlayerHeroes(heroes, lineup, playerVestigeData.combo||[]);
return info;
}
}
@@ -261,9 +262,9 @@ export async function generateAttackInfo(roleId: string, league: GVGLeagueType,
return info;
}
export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number, subHid: number }[], dbHeroes: HeroType[]) {
export async function generateAttackHeroInfo(lineup: { actorId: number, dataId: number, order: number, subHid: number }[], dbHeroes: HeroType[], combo: Combo[]) {
let info = new OppPlayerInfo();
info.setPlayerHeroes(dbHeroes, lineup);
info.setPlayerHeroes(dbHeroes, lineup, combo);
return info;
}
@@ -283,7 +284,7 @@ export async function getOppDetailData(rec: GVGVestigeRecType) {
const heroes = await HeroModel.findByHidRange(hids, rec.defenseRoleId, 'hid lv quality star colorStar skins ce skinId');
const artifactSeids = heroes.map(hero => hero.artifact);
const artifacts = await ArtifactModel.findbySeqIds(rec.defenseRoleId, artifactSeids);
result.setByPlayer(dicWarJson, defenseInfo, heroes, artifacts);
result.setByPlayer(dicWarJson, defenseInfo, heroes, artifacts, rec.defenseInfo.combo);
let attrByHid = await getHeroesAttributes(rec.defenseRoleId);
for(let [hid, attribute] of attrByHid) {
result.setAttribute(hid, attribute.getAttributesToString());