Files
ZYZ/shared/domain/battleField/pvp.ts
2022-05-24 21:23:18 +08:00

307 lines
8.7 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { prop, Ref, mongoose } from '@typegoose/typegoose';
import Hero from '../../db/Hero';
import { PvpDefenseType } from '../../db/PvpDefense';
import PvpHistoryOpp from '../../db/PvpHistoryOpp';
import { PvpSeasonResultType } from '../../db/PvpSeasonResult';
import { getPlvAndScore } from '../../pubUtils/data';
import { RewardInter } from '../../pubUtils/interface';
// 防守阵容武将
export class DefenseHero {
@prop({ required: true })
actorId: number; // 武将id
@prop({ required: true })
ai: number; // ai逻辑1-进攻型 2-防守型
@prop({ required: true })
dataId: number;
@prop({ required: true })
order: number;
@prop({ ref: 'Hero', type: mongoose.Schema.Types.ObjectId })
hero: Ref<Hero>;
constructor(param: { actorId: number, ai: number, dataId: number, order: number }, heroId: string) {
this.actorId = param.actorId;
this.ai = param.ai;
this.dataId = param.dataId;
this.order = param.order;
this.hero = heroId;
}
}
// 防守阵容
export class Defense {
@prop({ required: true })
warId: number;
@prop({ required: true })
buff: number;
@prop({ required: true, type: DefenseHero, _id: false })
heroes: DefenseHero[];
@prop({ required: true })
score: number; // 防守阵容的总军功
@prop({ required: true })
pLv: number; // 防守阵容的等级
constructor(heroes: DefenseHero[], scores: number[], warId: number, buff: number) {
this.heroes = heroes;
this.score = scores.reduce((pre, cur) => pre + cur, 0);
let {pLv, score} = getPlvAndScore(scores);
this.pLv = pLv,
this.score = score;
this.warId = warId;
this.buff = buff;
}
}
// 挑战阵容武将
export class AttackHero {
@prop({ required: true })
actorId: number; // 武将id
@prop({ required: true })
order: number;
}
// 挑战阵容
export class Attack {
@prop({ required: true, type: AttackHero, _id: false })
heroes: AttackHero[];
@prop({ required: true })
score: number; // 防守阵容的总军功
@prop({ required: true })
pLv: number; // 防守阵容的等级
constructor(heroes: AttackHero[], scores: number[]) {
this.heroes = heroes;
this.score = scores.reduce((pre, cur) => pre + cur, 0);
let {pLv, score} = getPlvAndScore(scores);
this.pLv = pLv;
this.score = score;
}
}
// 两个阵容中的武将的分别的战力
export class LineupCe {
@prop({ required: true })
hid: number; // 武将id
@prop({ required: true })
ce: number; // 战力
}
export class OppPlayer {
@prop({ required: true })
roleId: string;
@prop({ ref: () => PvpHistoryOpp, type: mongoose.Schema.Types.ObjectId })
oppDef: Ref<PvpHistoryOpp>;
@prop({ required: true })
pos: number;
@prop({ required: true })
isRobot: boolean;
}
export class HeroScore {
@prop({ required: true })
hid: number;
@prop({ required: true })
score: number;
}
export class Reward {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
export class HeroReward {
@prop({ required: true })
hid: number;
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
}
export class OppPlayerReturn {
pos: number;
roleId: string;
roleName: string;
head: number;
frame: number;
spine: number;
lv: number;
pLv: number;
defCe: number;
rankLv: number;
addScore: number;
plusScore: number;
}
// 防守阵容武将
export class DefenseHeroReturn {
actorId: number; // 武将id
ai: number; // ai逻辑1-进攻型 2-防守型
dataId: number;
order: number;
constructor(defenseHero: DefenseHero) {
this.actorId = defenseHero.actorId;
this.ai = defenseHero.ai;
this.dataId = defenseHero.dataId;
this.order = defenseHero.order;
}
}
export class DefenseLineupReturn {
warId: number;
buff: number;
heroes: DefenseHeroReturn[];
score: number;
pLv: number;
ce: number;
constructor(defense: Defense, defenseCe: number) {
this.warId = defense.warId;
this.buff = defense.buff;
this.heroes = defense.heroes.map(cur => new DefenseHeroReturn(cur));
this.score = defense.score;
this.pLv = defense.pLv;
this.ce = defenseCe;
}
}
export class AttackLineupReturn {
heroes: AttackHero[];
score: number;
pLv: number;
ce: number;
constructor(attack: Attack, attackCe: number) {
this.heroes = attack.heroes;
this.score = attack.score;
this.pLv = attack.pLv;
this.ce = attackCe;
}
}
export class HeroScoreReturn extends HeroScore {
isDefense: boolean = false;
constructor(heroScore: HeroScore, defense: Defense) {
super();
this.hid = heroScore.hid;
this.score = heroScore.score;
if(defense && defense.heroes) {
let index = defense.heroes.findIndex(cur => cur.actorId == this.hid);
if(index != -1) {
this.isDefense = true;
}
}
}
}
export class SeasonDataReturn {
score: number;
heroScores: HeroScore[];
seasonNum: number;
seasonEndTime: number;
rankLv: number;
constructor(pvpSeasonResult: PvpSeasonResultType) {
this.score = pvpSeasonResult.score;
this.heroScores = pvpSeasonResult.heroScores;
this.seasonNum = pvpSeasonResult.seasonNum;
this.seasonEndTime = pvpSeasonResult.seasonEndTime;
this.rankLv = pvpSeasonResult.rankLv;
}
}
export class PvpSeasonResultRecord {
oldSeasonData: SeasonDataReturn;
heroGoods: HeroReward[];
rankGoods: RewardInter[];
constructor(pvpSeasonResult: PvpSeasonResultType) {
this.oldSeasonData = new SeasonDataReturn(pvpSeasonResult);
this.heroGoods = pvpSeasonResult.heroGoods;
this.rankGoods = pvpSeasonResult.rankGoods;
}
}
export class PvpDataReturn {
seasonNum: number;
seasonEndTime: number;
myRank: number = 0;
oppPlayers: OppPlayerReturn[] = [];
defense: DefenseLineupReturn = null;
attack: AttackLineupReturn = null;
score: number = 0;
winStreakNum: number = 0;
refOppCnt: number;
setAttackCnt: number;
buyAttackCnt: number;
challengeCnt: number;
challengeRefTime: number;
seasonWinNum: number;
receivedBox: number[] = [];
hisScore: number = 0;
heroScores: HeroScoreReturn[] = [];
isFirstEntry: boolean = false;
resultRecord: PvpSeasonResultRecord;
setPvpDefense(pvpDefense: PvpDefenseType) {
this.score = pvpDefense.score;
this.winStreakNum = pvpDefense.winStreakNum;
this.seasonWinNum = pvpDefense.seasonWinNum;
this.receivedBox = pvpDefense.receivedBox;
this.hisScore = pvpDefense.hisScore;
this.refOppCnt = pvpDefense.refOppCnt;
this.setAttackCnt = pvpDefense.setAttackCnt;
this.buyAttackCnt = pvpDefense.buyAttackCnt;
this.challengeCnt = pvpDefense.challengeCnt;
this.challengeRefTime = pvpDefense.challengeRefTime;
let { attackCe, defenseCe } = PvpDataReturn.getAttackAndDefenseCe(pvpDefense);
if(pvpDefense.attack) this.attack = new AttackLineupReturn(pvpDefense.attack, attackCe);
if(pvpDefense.defense) this.defense = new DefenseLineupReturn(pvpDefense.defense, defenseCe);
this.heroScores = pvpDefense.heroScores.map(cur => new HeroScoreReturn(cur, pvpDefense.defense));
}
static getAttackAndDefenseCe(pvpDefense: PvpDefenseType) {
let { lineupCe, attack, defense } = pvpDefense;
let attackCe = 0, defenseCe = 0;
for(let { hid, ce } of lineupCe) {
if(attack && attack.heroes) {
let hero = attack.heroes.find(cur => cur.actorId == hid);
if(hero) attackCe += ce;
}
if(defense && defense.heroes) {
let hero = defense.heroes.find(cur => cur.actorId == hid);
if(hero) defenseCe += ce;
}
}
return { attackCe, defenseCe };
}
setIsFirstEntry(isFirstEntry: boolean) {
this.isFirstEntry = isFirstEntry;
}
setOppPlayers(oppPlayers: OppPlayerReturn[]) {
this.oppPlayers = oppPlayers;
}
setMyRank(rankLv: number) {
this.myRank = rankLv;
}
setPvpConfig(seasonNum: number, seasonEndTime: number) {
this.seasonNum = seasonNum;
this.seasonEndTime = seasonEndTime;
}
setPvpSeasonResult(pvpSeasonResult: PvpSeasonResultType) {
this.resultRecord = new PvpSeasonResultRecord(pvpSeasonResult);
}
}