From f0ab9b0aebbc273ee3d88cfe5b6e0b55ee978675 Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 1 Aug 2023 17:20:21 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(=E6=88=98=E5=9C=BA):=20?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=88=98=E9=98=B5=E8=BF=9E=E6=90=BA=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/battle/handler/ladderHandler.ts | 7 ++++--- .../app/servers/battle/handler/pvpHandler.ts | 10 +++++----- .../servers/guild/handler/gvgBattleHandler.ts | 8 ++++---- .../servers/guild/handler/gvgFightHandler.ts | 18 ++++++++++-------- game-server/app/services/checkParam.ts | 18 +++++++++++++++++- .../app/services/gvg/gvgFightService.ts | 9 +++++---- shared/db/GVGTeam.ts | 5 +++++ shared/db/GVGVestigeRank.ts | 4 ++++ shared/db/PvpDefense.ts | 4 ++-- shared/db/PvpHistoryOpp.ts | 13 +++++++++++-- shared/domain/battleField/ladder.ts | 10 +++++++++- shared/domain/battleField/pvp.ts | 14 +++++++++++++- shared/domain/gvgField/gvgDb.ts | 12 ++++++++++-- shared/domain/gvgField/returnData.ts | 3 +++ 14 files changed, 102 insertions(+), 33 deletions(-) diff --git a/game-server/app/servers/battle/handler/ladderHandler.ts b/game-server/app/servers/battle/handler/ladderHandler.ts index 7d3845538..9c0c2444a 100644 --- a/game-server/app/servers/battle/handler/ladderHandler.ts +++ b/game-server/app/servers/battle/handler/ladderHandler.ts @@ -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(); diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index f25ad086d..6240fc258 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -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 = 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 }); diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index 70bb8c6cd..e3dd8abec 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -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) }); } // 队伍停止攻击 diff --git a/game-server/app/servers/guild/handler/gvgFightHandler.ts b/game-server/app/servers/guild/handler/gvgFightHandler.ts index 932d896de..d127eabfd 100644 --- a/game-server/app/servers/guild/handler/gvgFightHandler.ts +++ b/game-server/app/servers/guild/handler/gvgFightHandler.ts @@ -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 diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index 7e40d833b..46918d745 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -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(seqId) && !checkNaturalStrings(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; } \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgFightService.ts b/game-server/app/services/gvg/gvgFightService.ts index ba4e22f55..0707a78ee 100644 --- a/game-server/app/services/gvg/gvgFightService.ts +++ b/game-server/app/services/gvg/gvgFightService.ts @@ -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()); diff --git a/shared/db/GVGTeam.ts b/shared/db/GVGTeam.ts index 2a8a21e45..3b5b0db70 100644 --- a/shared/db/GVGTeam.ts +++ b/shared/db/GVGTeam.ts @@ -8,6 +8,7 @@ import { DicGVGAreaPoint } from "../pubUtils/dictionary/DicGVGAreaPoint"; import { InitTeamParam, SaveTeamUpdateParam } from "../domain/gvgField/gvgDb"; import { GVGHeroInfo } from "../domain/dbGeneral"; import { GVG_BATTLE_PRE_TIME, GVG_CATAPULT, GVG_ROBOT } from "../consts"; +import { Combo } from "../domain/battleField/pvp"; @index({ roleId: 1, index: 1 }) @index({ teamCode: 1 }) @@ -110,6 +111,9 @@ export default class GVGTeam extends BaseModel { @prop({ required: true, type: () => GVGHeroInfo, _id: false }) lineup: GVGHeroInfo[]; + @prop({ required: true, type: () => Combo, _id: false }) + combo: Combo[]; + @prop({ required: true }) lineupCe: number; @@ -137,6 +141,7 @@ export default class GVGTeam extends BaseModel { const teamCode = genCode(8); const insert = Object.assign(doc.toJSON(), { ...initParam, teamCode }); delete insert.lineup; + delete insert.combo; const team: GVGTeamType | null = await GVGTeamModel.findOneAndUpdate({ roleId, index }, { $setOnInsert: insert, $set: updateParam }, { upsert: true, new: true }).lean(); return team; } diff --git a/shared/db/GVGVestigeRank.ts b/shared/db/GVGVestigeRank.ts index 06b47d04a..f35433ccf 100644 --- a/shared/db/GVGVestigeRank.ts +++ b/shared/db/GVGVestigeRank.ts @@ -2,6 +2,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType, mongoose } from '@typegoose/typegoose'; import { RoleType } from './Role'; import { getZeroPoint } from '../pubUtils/timeUtil'; +import { Combo } from '../domain/battleField/pvp'; export class Lineup { @prop({ required: true }) @@ -58,6 +59,9 @@ export default class GVGVestigeRank extends BaseModel { @prop({ required: true, type: Lineup, default: [], _id: false }) lineup: Lineup[]; // 阵容 + @prop({ required: true, type: () => Combo, default: [], _id: false }) + combo: Combo[]; // 阵容 + @prop({ required: true, type: Number, default: [], _id: false }) oppRanks: number[]; // 对手的排名 diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index 8bfde2c98..969f6f58d 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -115,8 +115,8 @@ export default class PvpDefense extends BaseModel { const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }) .populate('role', 'serverId head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr title') .populate('heroes.hero') - .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff') - .populate('oppBeforePlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff').lean({ getters: true, virtuals: true }); + .populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff combo') + .populate('oppBeforePlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff combo').lean({ getters: true, virtuals: true }); return result; } diff --git a/shared/db/PvpHistoryOpp.ts b/shared/db/PvpHistoryOpp.ts index 6d14cdbee..7ef0ccfc8 100644 --- a/shared/db/PvpHistoryOpp.ts +++ b/shared/db/PvpHistoryOpp.ts @@ -11,6 +11,13 @@ export class HeroScores { score: number; } +export class Combo { + @prop({ required: true }) + groupId: number; + @prop({ required: true, type: Number }) + levelList: number[]; +} + @index({ roleId: 1, oppRoleId: 1 }) export default class PvpHistoryOpp extends BaseModel { @prop({ required: true }) @@ -47,9 +54,11 @@ export default class PvpHistoryOpp extends BaseModel { warId: number; // 对手选择的地图id @prop({ required: true }) buff: number; // 对手选择的buff - @prop({ required: true, type: PvpEnemies, default: [], _id: false }) + @prop({ required: true, type: () => PvpEnemies, default: [], _id: false }) heroes: PvpEnemies[]; // 对手阵容 - @prop({ required: true, type: PvpOtherHeroes, default: [] }) + @prop({ required: true, type: () => Combo }) + combo: Combo[]; // 状态 0-仅刷出 1-挑战过 + @prop({ required: true, type: () => PvpOtherHeroes, default: [] }) otherHeroes: PvpOtherHeroes[]; // 阵容以外所有武将信息 @prop({ required: true, default: 0 }) status: number; // 状态 0-仅刷出 1-挑战过 diff --git a/shared/domain/battleField/ladder.ts b/shared/domain/battleField/ladder.ts index ee63a64ee..00e358c3c 100644 --- a/shared/domain/battleField/ladder.ts +++ b/shared/domain/battleField/ladder.ts @@ -10,6 +10,7 @@ import { EXTERIOR, LADDER } from "../../pubUtils/dicParam"; import { DicLadderDifficultRatio } from "../../pubUtils/dictionary/DicLadderDifficultRatio"; import { DicWarJson } from "../../pubUtils/dictionary/DicWarJson"; import { RoleRankInfo } from "../rank"; +import { Combo } from "./pvp"; // ladderMatch表 export class LadderDefenseHero { @@ -46,10 +47,13 @@ export class LadderDefense { warId: number; @prop({ required: true, type: LadderDefenseHero, _id: false }) heroes: LadderDefenseHero[]; + @prop({ required: true, type: () => Combo, _id: false }) + combo: Combo[]; - constructor(heroes: LadderDefenseHero[], warId: number) { + constructor(heroes: LadderDefenseHero[], warId: number, combo: Combo[]) { this.heroes = heroes; this.warId = warId; + this.combo = combo; } } @@ -208,6 +212,7 @@ export class LadderDefenseReturn { warId: number; defCe: number = 0; heroes: LadderDefenseHeroReturn[] = []; + combo: Combo[] = []; constructor(defense: LadderDefense) { if(!defense) return; @@ -216,6 +221,7 @@ export class LadderDefenseReturn { this.defCe += defenseHero.ce; this.heroes.push(new LadderDefenseHeroReturn(defenseHero)); } + this.combo = defense.combo; } } @@ -429,6 +435,7 @@ export class LadderOppDetailReturn { title: number = 1; warId: number = 0; heroes: LadderOppDetailHeroReturn[] = []; + combo: Combo[] = []; defCe: number = 0; constructor(ladderRec: LadderMatchRecType) { @@ -448,6 +455,7 @@ export class LadderOppDetailReturn { this.title = role.title; if(ladderMatch.defense) { this.warId = ladderMatch.defense.warId; + this.combo = ladderMatch.defense.combo||[]; let heroes = ladderMatch.defense.heroes||[]; for(let hero of heroes) { let warJson = warJsons.find(cur => cur.dataId == hero.dataId); diff --git a/shared/domain/battleField/pvp.ts b/shared/domain/battleField/pvp.ts index 6f5c8af2b..42ab6e5a2 100644 --- a/shared/domain/battleField/pvp.ts +++ b/shared/domain/battleField/pvp.ts @@ -43,6 +43,13 @@ export class DefenseHero extends DefenseHeroInSaveData { } +export class Combo { + @prop({ required: true }) + groupId: number; + @prop({ required: true, type: Number }) + levelList: number[]; +} + // 防守阵容 export class Defense { @prop({ required: true }) @@ -55,8 +62,10 @@ export class Defense { score: number; // 防守阵容的总军功 @prop({ required: true }) pLv: number; // 防守阵容的等级 + @prop({ required: true, type: () => Combo, _id: false }) + combo: Combo[]; // 防守阵容的等级 - constructor(heroes: DefenseHero[], scores: number[], warId: number, buff: number) { + constructor(heroes: DefenseHero[], scores: number[], warId: number, buff: number, combo: Combo[]) { this.heroes = heroes; this.score = scores.reduce((pre, cur) => pre + cur, 0); let {pLv, score} = getPlvAndScore(scores); @@ -64,6 +73,7 @@ export class Defense { this.score = score; this.warId = warId; this.buff = buff; + this.combo = combo; } } @@ -176,6 +186,7 @@ export class DefenseLineupReturn { score: number; pLv: number; ce: number; + combo: Combo[]; constructor(defense: Defense, defenseCe: number) { this.warId = defense.warId; @@ -184,6 +195,7 @@ export class DefenseLineupReturn { this.score = defense.score; this.pLv = defense.pLv; this.ce = defenseCe; + this.combo = defense.combo; } } diff --git a/shared/domain/gvgField/gvgDb.ts b/shared/domain/gvgField/gvgDb.ts index f5a21f687..db403e629 100644 --- a/shared/domain/gvgField/gvgDb.ts +++ b/shared/domain/gvgField/gvgDb.ts @@ -10,6 +10,7 @@ import { DicGVGVestige } from "../../pubUtils/dictionary/DicGVGVestige"; import { DicWarJson } from "../../pubUtils/dictionary/DicWarJson"; import { GVGHeroInfo } from "../dbGeneral"; import { LineupHero } from "../roleField/hero"; +import { Combo } from "../battleField/pvp"; export class OppPlayerHeroInfo { @prop({ required: true }) @@ -100,6 +101,8 @@ export class OppPlayerInfo { isSuccess: boolean = false; // 是否胜利 @prop({ required: true, default: [], type: OppPlayerHeroInfo, _id: false }) heroes: OppPlayerHeroInfo[] = []; // 武将 + @prop({ required: true, default: [], type: () => Combo, _id: false }) + combo: Combo[] = []; // 武将 @prop({ required: true }) isRobot: boolean = false; // 原排名 @@ -119,13 +122,14 @@ export class OppPlayerInfo { this.leagueName = league.name; } - setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number, subHid: number}[]) { + setPlayerHeroes(heroes: HeroType[], lineup: {actorId: number, dataId: number, order: number, subHid: number}[], combo: Combo[]) { for(let hero of heroes) { let obj = new OppPlayerHeroInfo(); obj.setByDefenseHero(hero, lineup); this.ce += hero.ce; this.heroes.push(obj); } + this.combo = combo; } initByRobot(dic: DicGVGVestige, heroes: OppPlayerHeroInfo[], isSuccess: boolean) { @@ -228,6 +232,7 @@ export class OppDetailData{ status: number; time: number; heroes: OppDetailHeroData[] = []; + combo: Combo[] = []; lineupCe: number = 0; constructor(rec: GVGVestigeRecType, obj: {status: number, time: number}) { @@ -240,7 +245,7 @@ export class OppDetailData{ this.time = obj.time; } - setByPlayer(dicWarJson: DicWarJson[], defenseHeroes: OppPlayerHeroInfo[], heroes: HeroType[], artifacts: ArtifactModelType[]) { + setByPlayer(dicWarJson: DicWarJson[], defenseHeroes: OppPlayerHeroInfo[], heroes: HeroType[], artifacts: ArtifactModelType[], combo: Combo[]) { for(let warJson of dicWarJson) { let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId); if(!defenseHero) continue; @@ -250,6 +255,7 @@ export class OppDetailData{ this.heroes.push(hero); this.lineupCe += curHero.ce; } + this.combo = combo; } setAttribute(hid: number, attribute: string) { @@ -265,6 +271,7 @@ export interface SaveTeamParam { frame: number; spine: number; lineup?: LineupHero[]; + combo: Combo[]; } export interface SaveTeamUpdateParam { @@ -273,6 +280,7 @@ export interface SaveTeamUpdateParam { frame: number; spine: number; lineup?: GVGHeroInfo[]; + combo: Combo[]; lineupCe?: number; cityId?: number; areaId?: number; diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts index 7e5e973c4..b63e52eee 100644 --- a/shared/domain/gvgField/returnData.ts +++ b/shared/domain/gvgField/returnData.ts @@ -15,6 +15,7 @@ import { GVGCityType } from "../../db/GVGCity"; import { GVGTeamMem } from "../battleField/gvgBattle"; import { GVGTeamType } from "../../db/GVGTeam"; import { GVGRoleDataType } from "../../db/GVGRoleData"; +import { Combo } from "../battleField/pvp"; class LeagueLeaderInfo { name: string; // 盟主名 @@ -777,6 +778,7 @@ export class MyTeamSimpleInfo { order: number; // 行动 subHid: number; }[]; + combo: Combo[]; hasConfirm: boolean; constructor(team: GVGTeamType, configId: number) { @@ -787,6 +789,7 @@ export class MyTeamSimpleInfo { this.spine = team.spine; this.lineup = team.lineup.map(({ actorId, dataId, outIndex, subActorId }) => ({ actorId, dataId, order: outIndex, subHid: subActorId })); this.hasConfirm = team.confirmConfigId == configId; + this.combo = team.combo; } }