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
+5
View File
@@ -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;
}
+4
View File
@@ -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[]; // 对手的排名
+2 -2
View File
@@ -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 -2
View File
@@ -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-挑战过
+9 -1
View File
@@ -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);
+13 -1
View File
@@ -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 -2
View File
@@ -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;
+3
View File
@@ -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;
}
}