✨ feat(战场): 保存战阵连携顺序
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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[]; // 对手的排名
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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-挑战过
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user