✨ 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 { isHeroHidden } from '../../../services/dataService';
import { getRemoteRplFilePath, getRemoteRplPrefix } from '../../../pubUtils/battleUtils'; import { getRemoteRplFilePath, getRemoteRplPrefix } from '../../../pubUtils/battleUtils';
import { pvpEndParamInter } from '../../../pubUtils/interface'; import { pvpEndParamInter } from '../../../pubUtils/interface';
import { Combo } from '../../../domain/battleField/pvp';
export default function (app: Application) { export default function (app: Application) {
new HandlerService(app, {}); new HandlerService(app, {});
@@ -275,8 +276,8 @@ export class LadderHandler {
} }
// 9. 设置防守阵容 // 9. 设置防守阵容
async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }[] }, session: BackendSession) { async saveDefense(msg: { warId: number, heroes: { actorId: number, ai: number, dataId: number, order: number, subHid?: number }[], combo: Combo[] }, session: BackendSession) {
let { warId, heroes } = msg; let { warId, heroes, combo } = msg;
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let ladderData = await LadderMatchModel.findByRoleId(roleId); let ladderData = await LadderMatchModel.findByRoleId(roleId);
@@ -296,7 +297,7 @@ export class LadderHandler {
let dbHero = dbHeroes.find(ccur => ccur.hid == cur.actorId); let dbHero = dbHeroes.find(ccur => ccur.hid == cur.actorId);
return dbHero && new LadderDefenseHero(cur, dbHero._id, dbHero.ce); return dbHero && new LadderDefenseHero(cur, dbHero._id, dbHero.ce);
}).filter(cur => cur); }).filter(cur => cur);
let defense = new LadderDefense(defenseHeroes, warId); let defense = new LadderDefense(defenseHeroes, warId, combo);
ladderData = await LadderMatchModel.updateByRoleId(roleId, { defense, hasDefense: true }); ladderData = await LadderMatchModel.updateByRoleId(roleId, { defense, hasDefense: true });
// 返回 // 返回
let result = new LadderDataReturn(); let result = new LadderDataReturn();
@@ -11,7 +11,7 @@ import { PvpDefenseModel, pvpUpdateInter } from '../../../db/PvpDefense';
import { PvpSeasonResultModel } from '../../../db/PvpSeasonResult'; import { PvpSeasonResultModel } from '../../../db/PvpSeasonResult';
import { Rank } from '../../../services/rankService'; import { Rank } from '../../../services/rankService';
import { checkTask, checkTaskInPvpEnd } from '../../../services/task/taskService'; 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 { DEBUG_MAGIC_WORD, FIGURE_UNLOCK_CONDITION, ITEM_CHANGE_REASON, LINEUP_NUM, REDIS_KEY, TASK_TYPE } from '../../../consts';
import { PVP } from '../../../pubUtils/dicParam'; import { PVP } from '../../../pubUtils/dicParam';
import { addItems, getGoldObject, handleCost, unlockFigure } from '../../../services/role/rewardService'; import { addItems, getGoldObject, handleCost, unlockFigure } from '../../../services/role/rewardService';
@@ -158,7 +158,7 @@ export class PvpHandler {
let pvpHistoryOpp = <PvpHistoryOpp>curOpp.oppDef; 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. 保存防守阵容 //3. 保存防守阵容
async saveDefense(msg: { heroes: { actorId: number, dataId: number, order: number, ai: number, subHid?: number }[], warId: number, buff: number }, session: BackendSession) { 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 } = msg; let { heroes, warId, buff, combo } = msg;
let roleId = session.get('roleId'); let roleId = session.get('roleId');
if (heroes.length > LINEUP_NUM || heroes.length <= 0) { if (heroes.length > LINEUP_NUM || heroes.length <= 0) {
return resResult(STATUS.WRONG_PARMS); return resResult(STATUS.WRONG_PARMS);
@@ -539,7 +539,7 @@ export class PvpHandler {
let defenseHeroes = heroes.map(cur => { let defenseHeroes = heroes.map(cur => {
return new DefenseHero(cur, heroIdMap.get(cur.actorId)); 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); let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, pvpDefense.attack?.heroes??[], defense.heroes, dbHeroes);
await PvpSaveDataModel.createSaveData(roleId, warId, buff, defenseHeroes); await PvpSaveDataModel.createSaveData(roleId, warId, buff, defenseHeroes);
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { ...refChallengeObj, defense, lineupCe, hasDefense: true, seasonNum }); pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { ...refChallengeObj, defense, lineupCe, hasDefense: true, seasonNum });
@@ -47,7 +47,7 @@ export class GVGBattleHandler {
async getTeams(msg: {}, session: BackendSession) { async getTeams(msg: {}, session: BackendSession) {
const roleId = session.get('roleId'); const roleId = session.get('roleId');
let { configId } = getGVGConfig(); 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)) }); 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 serverId = session.get('serverId');
const roleName = session.get('roleName'); const roleName = session.get('roleName');
const guildCode = session.get('guildCode'); 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(); let { configId, period } = getGVGPeriodData();
if (period != GVG_PERIOD.BATTLE) return resResult(STATUS.GVG_NOT_BATTLE_PERIOD); 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 groupKey = await getGroupKey(serverId);
let role = await RoleModel.findByRoleId(roleId, 'lv title'); 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) { if(lineup) {
let hids: number[] = []; let hids: number[] = [];
for(let { actorId, subHid } of lineup) { for(let { actorId, subHid } of lineup) {
@@ -499,7 +499,7 @@ export class GVGBattleHandler {
teamObj.setTime(defenseTeam.teamCode, defenseTeam); teamObj.setTime(defenseTeam.teamCode, defenseTeam);
let heroes = getOppHeroes(warId, defenseTeam.isRobot, defenseTeam.lineup) 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 { getAllServerName } from "../../../services/redisService";
import { CheckMeterial } from "../../../services/role/checkMaterial"; import { CheckMeterial } from "../../../services/role/checkMaterial";
import { checkGVGTask } from "../../../services/task/taskService"; import { checkGVGTask } from "../../../services/task/taskService";
import { Combo } from "../../../domain/battleField/pvp";
export default function (app: Application) { export default function (app: Application) {
new HandlerService(app, {}); new HandlerService(app, {});
@@ -68,7 +69,7 @@ export class GVGProduceHandler {
let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId, myLeague); let myVestigeRank = await getMyVestigeRank(configId, groupKey, vestigeId, roleId, myLeague);
if(!myVestigeRank) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); 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 lineupCe = lineup.reduce((pre, cur) => pre + cur.ce, 0);
let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, oppRanks); let oppPlayers = await getOppPlayerByRanks(serverId, groupKey, vestigeId, oppRanks);
@@ -78,7 +79,7 @@ export class GVGProduceHandler {
vestigeId, vestigeId,
myRank: rank, myRank: rank,
score: dicRankMap?.get(rank)?.score||0, score: dicRankMap?.get(rank)?.score||0,
lineup, lineupCe, lineup, lineupCe, combo,
oppPlayers, oppPlayers,
refreshCnt, refreshCnt,
usedHeroes, 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 roleId = session.get('roleId');
const serverId = session.get('serverId'); const serverId = session.get('serverId');
const { vestigeId, lineup: heroes } = msg; const { vestigeId, lineup: heroes, combo } = msg;
if(!await checkVestige(serverId, vestigeId)) { if(!await checkVestige(serverId, vestigeId)) {
return resResult(STATUS.GVG_VESTIGE_ERR); return resResult(STATUS.GVG_VESTIGE_ERR);
@@ -115,11 +116,12 @@ export class GVGProduceHandler {
let curHero = dbHeroes.find(cur => cur.hid == hero.actorId); 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 } 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, { return resResult(STATUS.SUCCESS, {
vestigeId, vestigeId,
lineup: vestigeRank.lineup, lineup: vestigeRank.lineup,
combo: vestigeRank.combo,
lineupCe: vestigeRank.lineup.reduce((pre, cur) => pre + cur.ce, 0), 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 roleId = session.get('roleId');
const roleName = session.get('roleName'); const roleName = session.get('roleName');
const serverId = session.get('serverId'); const serverId = session.get('serverId');
const { battleCode, heroes } = msg; const { battleCode, heroes, combo } = msg;
let rec = await GVGVestigeRecModel.findByBattleCode(battleCode); let rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
if(!rec || rec.attackRoleId != roleId) return resResult(STATUS.GVG_VESTIGE_REC_NOT_FOUND); 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); if(!lock) return resResult(STATUS.GVG_VESTIGE_CHECK_BATTLE_STATUS_ERR);
// 向vestigerec保存阵容 // 向vestigerec保存阵容
const info = await generateAttackHeroInfo(heroes, dbHeroes); const info = await generateAttackHeroInfo(heroes, dbHeroes, combo);
rec = await GVGVestigeRecModel.startBattle(battleCode, info.heroes, info.ce); rec = await GVGVestigeRecModel.startBattle(battleCode, info.heroes, info.ce);
// 更新battleRecord // 更新battleRecord
+17 -1
View File
@@ -748,13 +748,14 @@ export function checkRouteParam(route: string, msg: any) {
} }
case "battle.pvpHandler.saveDefense": case "battle.pvpHandler.saveDefense":
{ {
let { heroes, warId, buff } = msg; let { heroes, warId, buff, combo } = msg;
if (!checkNaturalArray(heroes)) return false; if (!checkNaturalArray(heroes)) return false;
if (!checkNaturalNumbers(warId, buff)) return false; if (!checkNaturalNumbers(warId, buff)) return false;
if (heroes.length > LINEUP_NUM) return false; if (heroes.length > LINEUP_NUM) return false;
for (let { actorId, dataId, order, ai } of heroes) { for (let { actorId, dataId, order, ai } of heroes) {
if (!checkNaturalNumbers(actorId, dataId, order, ai)) return false; if (!checkNaturalNumbers(actorId, dataId, order, ai)) return false;
} }
if(!checkCombo(combo)) return false
break; break;
} }
case "battle.pvpHandler.receiveBox": case "battle.pvpHandler.receiveBox":
@@ -815,6 +816,7 @@ export function checkRouteParam(route: string, msg: any) {
for (let { actorId, dataId, order } of msg.heroes) { for (let { actorId, dataId, order } of msg.heroes) {
if (!checkNaturalNumbers(actorId, dataId, order)) return false; if (!checkNaturalNumbers(actorId, dataId, order)) return false;
} }
if(!checkCombo(msg.combo)) return false
break; break;
} }
case "battle.ladderHandler.buyCnt": case "battle.ladderHandler.buyCnt":
@@ -2302,4 +2304,18 @@ function checkSeqId(...seqIds: (number | string)[]) {
if (!checkNaturalNumbers(<number>seqId) && !checkNaturalStrings(<string>seqId)) return false if (!checkNaturalNumbers(<number>seqId) && !checkNaturalStrings(<string>seqId)) return false
} }
return true; 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 { calFighterContribute } from "./gvgPrepareService";
import { addVestigeLeagueRankRec, addVestigeRankMessage } from "./gvgRecService"; import { addVestigeLeagueRankRec, addVestigeRankMessage } from "./gvgRecService";
import { getGroupKey, getGVGServerType, getPeriodByTime } from "./gvgService"; import { getGroupKey, getGVGServerType, getPeriodByTime } from "./gvgService";
import { Combo } from "../../domain/battleField/pvp";
let gvgFightTime = undefined; let gvgFightTime = undefined;
@@ -249,7 +250,7 @@ export async function generateDefenseInfo(roleId: string, vestigeId: number, ran
let info = new OppPlayerInfo(); let info = new OppPlayerInfo();
info.initByPlayer(playerVestigeData.rank, role, league, true); info.initByPlayer(playerVestigeData.rank, role, league, true);
info.setPlayerHeroes(heroes, lineup); info.setPlayerHeroes(heroes, lineup, playerVestigeData.combo||[]);
return info; return info;
} }
} }
@@ -261,9 +262,9 @@ export async function generateAttackInfo(roleId: string, league: GVGLeagueType,
return info; 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(); let info = new OppPlayerInfo();
info.setPlayerHeroes(dbHeroes, lineup); info.setPlayerHeroes(dbHeroes, lineup, combo);
return info; 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 heroes = await HeroModel.findByHidRange(hids, rec.defenseRoleId, 'hid lv quality star colorStar skins ce skinId');
const artifactSeids = heroes.map(hero => hero.artifact); const artifactSeids = heroes.map(hero => hero.artifact);
const artifacts = await ArtifactModel.findbySeqIds(rec.defenseRoleId, artifactSeids); 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); let attrByHid = await getHeroesAttributes(rec.defenseRoleId);
for(let [hid, attribute] of attrByHid) { for(let [hid, attribute] of attrByHid) {
result.setAttribute(hid, attribute.getAttributesToString()); result.setAttribute(hid, attribute.getAttributesToString());
+5
View File
@@ -8,6 +8,7 @@ import { DicGVGAreaPoint } from "../pubUtils/dictionary/DicGVGAreaPoint";
import { InitTeamParam, SaveTeamUpdateParam } from "../domain/gvgField/gvgDb"; import { InitTeamParam, SaveTeamUpdateParam } from "../domain/gvgField/gvgDb";
import { GVGHeroInfo } from "../domain/dbGeneral"; import { GVGHeroInfo } from "../domain/dbGeneral";
import { GVG_BATTLE_PRE_TIME, GVG_CATAPULT, GVG_ROBOT } from "../consts"; import { GVG_BATTLE_PRE_TIME, GVG_CATAPULT, GVG_ROBOT } from "../consts";
import { Combo } from "../domain/battleField/pvp";
@index({ roleId: 1, index: 1 }) @index({ roleId: 1, index: 1 })
@index({ teamCode: 1 }) @index({ teamCode: 1 })
@@ -110,6 +111,9 @@ export default class GVGTeam extends BaseModel {
@prop({ required: true, type: () => GVGHeroInfo, _id: false }) @prop({ required: true, type: () => GVGHeroInfo, _id: false })
lineup: GVGHeroInfo[]; lineup: GVGHeroInfo[];
@prop({ required: true, type: () => Combo, _id: false })
combo: Combo[];
@prop({ required: true }) @prop({ required: true })
lineupCe: number; lineupCe: number;
@@ -137,6 +141,7 @@ export default class GVGTeam extends BaseModel {
const teamCode = genCode(8); const teamCode = genCode(8);
const insert = Object.assign(doc.toJSON(), { ...initParam, teamCode }); const insert = Object.assign(doc.toJSON(), { ...initParam, teamCode });
delete insert.lineup; delete insert.lineup;
delete insert.combo;
const team: GVGTeamType | null = await GVGTeamModel.findOneAndUpdate({ roleId, index }, { $setOnInsert: insert, $set: updateParam }, { upsert: true, new: true }).lean(); const team: GVGTeamType | null = await GVGTeamModel.findOneAndUpdate({ roleId, index }, { $setOnInsert: insert, $set: updateParam }, { upsert: true, new: true }).lean();
return team; return team;
} }
+4
View File
@@ -2,6 +2,7 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, mongoose } from '@typegoose/typegoose'; import { index, getModelForClass, prop, DocumentType, mongoose } from '@typegoose/typegoose';
import { RoleType } from './Role'; import { RoleType } from './Role';
import { getZeroPoint } from '../pubUtils/timeUtil'; import { getZeroPoint } from '../pubUtils/timeUtil';
import { Combo } from '../domain/battleField/pvp';
export class Lineup { export class Lineup {
@prop({ required: true }) @prop({ required: true })
@@ -58,6 +59,9 @@ export default class GVGVestigeRank extends BaseModel {
@prop({ required: true, type: Lineup, default: [], _id: false }) @prop({ required: true, type: Lineup, default: [], _id: false })
lineup: Lineup[]; // 阵容 lineup: Lineup[]; // 阵容
@prop({ required: true, type: () => Combo, default: [], _id: false })
combo: Combo[]; // 阵容
@prop({ required: true, type: Number, default: [], _id: false }) @prop({ required: true, type: Number, default: [], _id: false })
oppRanks: number[]; // 对手的排名 oppRanks: number[]; // 对手的排名
+2 -2
View File
@@ -115,8 +115,8 @@ export default class PvpDefense extends BaseModel {
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }) const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
.populate('role', 'serverId head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr title') .populate('role', 'serverId head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr title')
.populate('heroes.hero') .populate('heroes.hero')
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes warId buff') .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').lean({ getters: true, virtuals: true }); .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; return result;
} }
+11 -2
View File
@@ -11,6 +11,13 @@ export class HeroScores {
score: number; score: number;
} }
export class Combo {
@prop({ required: true })
groupId: number;
@prop({ required: true, type: Number })
levelList: number[];
}
@index({ roleId: 1, oppRoleId: 1 }) @index({ roleId: 1, oppRoleId: 1 })
export default class PvpHistoryOpp extends BaseModel { export default class PvpHistoryOpp extends BaseModel {
@prop({ required: true }) @prop({ required: true })
@@ -47,9 +54,11 @@ export default class PvpHistoryOpp extends BaseModel {
warId: number; // 对手选择的地图id warId: number; // 对手选择的地图id
@prop({ required: true }) @prop({ required: true })
buff: number; // 对手选择的buff buff: number; // 对手选择的buff
@prop({ required: true, type: PvpEnemies, default: [], _id: false }) @prop({ required: true, type: () => PvpEnemies, default: [], _id: false })
heroes: PvpEnemies[]; // 对手阵容 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[]; // 阵容以外所有武将信息 otherHeroes: PvpOtherHeroes[]; // 阵容以外所有武将信息
@prop({ required: true, default: 0 }) @prop({ required: true, default: 0 })
status: number; // 状态 0-仅刷出 1-挑战过 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 { DicLadderDifficultRatio } from "../../pubUtils/dictionary/DicLadderDifficultRatio";
import { DicWarJson } from "../../pubUtils/dictionary/DicWarJson"; import { DicWarJson } from "../../pubUtils/dictionary/DicWarJson";
import { RoleRankInfo } from "../rank"; import { RoleRankInfo } from "../rank";
import { Combo } from "./pvp";
// ladderMatch表 // ladderMatch表
export class LadderDefenseHero { export class LadderDefenseHero {
@@ -46,10 +47,13 @@ export class LadderDefense {
warId: number; warId: number;
@prop({ required: true, type: LadderDefenseHero, _id: false }) @prop({ required: true, type: LadderDefenseHero, _id: false })
heroes: LadderDefenseHero[]; 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.heroes = heroes;
this.warId = warId; this.warId = warId;
this.combo = combo;
} }
} }
@@ -208,6 +212,7 @@ export class LadderDefenseReturn {
warId: number; warId: number;
defCe: number = 0; defCe: number = 0;
heroes: LadderDefenseHeroReturn[] = []; heroes: LadderDefenseHeroReturn[] = [];
combo: Combo[] = [];
constructor(defense: LadderDefense) { constructor(defense: LadderDefense) {
if(!defense) return; if(!defense) return;
@@ -216,6 +221,7 @@ export class LadderDefenseReturn {
this.defCe += defenseHero.ce; this.defCe += defenseHero.ce;
this.heroes.push(new LadderDefenseHeroReturn(defenseHero)); this.heroes.push(new LadderDefenseHeroReturn(defenseHero));
} }
this.combo = defense.combo;
} }
} }
@@ -429,6 +435,7 @@ export class LadderOppDetailReturn {
title: number = 1; title: number = 1;
warId: number = 0; warId: number = 0;
heroes: LadderOppDetailHeroReturn[] = []; heroes: LadderOppDetailHeroReturn[] = [];
combo: Combo[] = [];
defCe: number = 0; defCe: number = 0;
constructor(ladderRec: LadderMatchRecType) { constructor(ladderRec: LadderMatchRecType) {
@@ -448,6 +455,7 @@ export class LadderOppDetailReturn {
this.title = role.title; this.title = role.title;
if(ladderMatch.defense) { if(ladderMatch.defense) {
this.warId = ladderMatch.defense.warId; this.warId = ladderMatch.defense.warId;
this.combo = ladderMatch.defense.combo||[];
let heroes = ladderMatch.defense.heroes||[]; let heroes = ladderMatch.defense.heroes||[];
for(let hero of heroes) { for(let hero of heroes) {
let warJson = warJsons.find(cur => cur.dataId == hero.dataId); 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 { export class Defense {
@prop({ required: true }) @prop({ required: true })
@@ -55,8 +62,10 @@ export class Defense {
score: number; // 防守阵容的总军功 score: number; // 防守阵容的总军功
@prop({ required: true }) @prop({ required: true })
pLv: number; // 防守阵容的等级 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.heroes = heroes;
this.score = scores.reduce((pre, cur) => pre + cur, 0); this.score = scores.reduce((pre, cur) => pre + cur, 0);
let {pLv, score} = getPlvAndScore(scores); let {pLv, score} = getPlvAndScore(scores);
@@ -64,6 +73,7 @@ export class Defense {
this.score = score; this.score = score;
this.warId = warId; this.warId = warId;
this.buff = buff; this.buff = buff;
this.combo = combo;
} }
} }
@@ -176,6 +186,7 @@ export class DefenseLineupReturn {
score: number; score: number;
pLv: number; pLv: number;
ce: number; ce: number;
combo: Combo[];
constructor(defense: Defense, defenseCe: number) { constructor(defense: Defense, defenseCe: number) {
this.warId = defense.warId; this.warId = defense.warId;
@@ -184,6 +195,7 @@ export class DefenseLineupReturn {
this.score = defense.score; this.score = defense.score;
this.pLv = defense.pLv; this.pLv = defense.pLv;
this.ce = defenseCe; 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 { DicWarJson } from "../../pubUtils/dictionary/DicWarJson";
import { GVGHeroInfo } from "../dbGeneral"; import { GVGHeroInfo } from "../dbGeneral";
import { LineupHero } from "../roleField/hero"; import { LineupHero } from "../roleField/hero";
import { Combo } from "../battleField/pvp";
export class OppPlayerHeroInfo { export class OppPlayerHeroInfo {
@prop({ required: true }) @prop({ required: true })
@@ -100,6 +101,8 @@ export class OppPlayerInfo {
isSuccess: boolean = false; // 是否胜利 isSuccess: boolean = false; // 是否胜利
@prop({ required: true, default: [], type: OppPlayerHeroInfo, _id: false }) @prop({ required: true, default: [], type: OppPlayerHeroInfo, _id: false })
heroes: OppPlayerHeroInfo[] = []; // 武将 heroes: OppPlayerHeroInfo[] = []; // 武将
@prop({ required: true, default: [], type: () => Combo, _id: false })
combo: Combo[] = []; // 武将
@prop({ required: true }) @prop({ required: true })
isRobot: boolean = false; // 原排名 isRobot: boolean = false; // 原排名
@@ -119,13 +122,14 @@ export class OppPlayerInfo {
this.leagueName = league.name; 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) { for(let hero of heroes) {
let obj = new OppPlayerHeroInfo(); let obj = new OppPlayerHeroInfo();
obj.setByDefenseHero(hero, lineup); obj.setByDefenseHero(hero, lineup);
this.ce += hero.ce; this.ce += hero.ce;
this.heroes.push(obj); this.heroes.push(obj);
} }
this.combo = combo;
} }
initByRobot(dic: DicGVGVestige, heroes: OppPlayerHeroInfo[], isSuccess: boolean) { initByRobot(dic: DicGVGVestige, heroes: OppPlayerHeroInfo[], isSuccess: boolean) {
@@ -228,6 +232,7 @@ export class OppDetailData{
status: number; status: number;
time: number; time: number;
heroes: OppDetailHeroData[] = []; heroes: OppDetailHeroData[] = [];
combo: Combo[] = [];
lineupCe: number = 0; lineupCe: number = 0;
constructor(rec: GVGVestigeRecType, obj: {status: number, time: number}) { constructor(rec: GVGVestigeRecType, obj: {status: number, time: number}) {
@@ -240,7 +245,7 @@ export class OppDetailData{
this.time = obj.time; 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) { for(let warJson of dicWarJson) {
let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId); let defenseHero = defenseHeroes.find(cur => cur.dataId == warJson.dataId);
if(!defenseHero) continue; if(!defenseHero) continue;
@@ -250,6 +255,7 @@ export class OppDetailData{
this.heroes.push(hero); this.heroes.push(hero);
this.lineupCe += curHero.ce; this.lineupCe += curHero.ce;
} }
this.combo = combo;
} }
setAttribute(hid: number, attribute: string) { setAttribute(hid: number, attribute: string) {
@@ -265,6 +271,7 @@ export interface SaveTeamParam {
frame: number; frame: number;
spine: number; spine: number;
lineup?: LineupHero[]; lineup?: LineupHero[];
combo: Combo[];
} }
export interface SaveTeamUpdateParam { export interface SaveTeamUpdateParam {
@@ -273,6 +280,7 @@ export interface SaveTeamUpdateParam {
frame: number; frame: number;
spine: number; spine: number;
lineup?: GVGHeroInfo[]; lineup?: GVGHeroInfo[];
combo: Combo[];
lineupCe?: number; lineupCe?: number;
cityId?: number; cityId?: number;
areaId?: number; areaId?: number;
+3
View File
@@ -15,6 +15,7 @@ import { GVGCityType } from "../../db/GVGCity";
import { GVGTeamMem } from "../battleField/gvgBattle"; import { GVGTeamMem } from "../battleField/gvgBattle";
import { GVGTeamType } from "../../db/GVGTeam"; import { GVGTeamType } from "../../db/GVGTeam";
import { GVGRoleDataType } from "../../db/GVGRoleData"; import { GVGRoleDataType } from "../../db/GVGRoleData";
import { Combo } from "../battleField/pvp";
class LeagueLeaderInfo { class LeagueLeaderInfo {
name: string; // 盟主名 name: string; // 盟主名
@@ -777,6 +778,7 @@ export class MyTeamSimpleInfo {
order: number; // 行动 order: number; // 行动
subHid: number; subHid: number;
}[]; }[];
combo: Combo[];
hasConfirm: boolean; hasConfirm: boolean;
constructor(team: GVGTeamType, configId: number) { constructor(team: GVGTeamType, configId: number) {
@@ -787,6 +789,7 @@ export class MyTeamSimpleInfo {
this.spine = team.spine; this.spine = team.spine;
this.lineup = team.lineup.map(({ actorId, dataId, outIndex, subActorId }) => ({ actorId, dataId, order: outIndex, subHid: subActorId })); this.lineup = team.lineup.map(({ actorId, dataId, outIndex, subActorId }) => ({ actorId, dataId, order: outIndex, subHid: subActorId }));
this.hasConfirm = team.confirmConfigId == configId; this.hasConfirm = team.confirmConfigId == configId;
this.combo = team.combo;
} }
} }