pvp:修改接口
This commit is contained in:
@@ -141,6 +141,8 @@ export const STATUS = {
|
||||
PVP_NOT_REACH_BOX_SCORE: { code: 20803, simStr: '未达到宝箱领取军功' },
|
||||
PVP_BOX_IS_GOT: { code: 20804, simStr: '宝箱已经领取' },
|
||||
PVP_CHALLENGE_TIMES_NOT_ENOUGH: { code: 20805, simStr: '挑战次数不足' },
|
||||
PVP_SET_ATTACK_CNT_NOT_ENOUGH: { code: 20806, simStr: '设置挑战阵容次数不足' },
|
||||
PVP_NOT_SET_ATTACK: { code: 20807, simStr: '未设置挑战阵容' },
|
||||
|
||||
// 军团 20900-20999
|
||||
GUILD_AUTH_NOT_ENOUGH: { code: 20900, simStr: '权限不足' },
|
||||
|
||||
@@ -108,15 +108,15 @@ export default class PvpDefense extends BaseModel {
|
||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
|
||||
.populate('role', 'head frame spine topLineupCe roleId roleName lv globalCeAttr')
|
||||
.populate('heroes.hero')
|
||||
.populate('oppPlayer.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes').lean({ getters: true, virtuals: true });
|
||||
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv title lv pLv defCe heroes').lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByTeamLv(seasonNum: number, min: number, max: number) {
|
||||
const result: PvpDefenseType[] = await PvpDefenseModel.find({ seasonNum, 'defense.pLv': { $gte: min, $lte: max } })
|
||||
.populate('role', 'head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr')
|
||||
.populate('role', '_id head frame spine heads frames spines topLineupCe roleId roleName lv globalCeAttr')
|
||||
.populate('heroes.hero')
|
||||
.populate('oppPlayer.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes')
|
||||
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes')
|
||||
.lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
}
|
||||
@@ -125,7 +125,7 @@ export default class PvpDefense extends BaseModel {
|
||||
delete update._id;
|
||||
let result: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId}, {$set:update}, {new: true})
|
||||
.populate('role', 'head frame spine heads frames spines topLineupCe roleId roleName lv')
|
||||
.populate('oppPlayer.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes').lean({ getters: true, virtuals: true });
|
||||
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName head frame spine heads frames spines rankLv pLv title lv defCe heroes').lean({ getters: true, virtuals: true });
|
||||
return result;
|
||||
}
|
||||
public static async updateInfo(roleId: string, update: pvpUpdateInter, lean = true) {
|
||||
|
||||
@@ -39,7 +39,11 @@ export default class PvpHistoryOpp extends BaseModel {
|
||||
defCe: number; // 防守战力,缩小过的
|
||||
@prop({ required: true, default: 0 })
|
||||
rankLv: number; // 对手排名
|
||||
@prop({ required: true, type: PvpEnemies, default: [] })
|
||||
@prop({ required: true })
|
||||
warId: number; // 对手选择的地图id
|
||||
@prop({ required: true })
|
||||
buff: number; // 对手选择的buff
|
||||
@prop({ required: true, type: PvpEnemies, default: [], _id: false })
|
||||
heroes: PvpEnemies[]; // 对手阵容
|
||||
@prop({ required: true, type: PvpOtherHeroes, default: [] })
|
||||
otherHeroes: PvpOtherHeroes[]; // 阵容以外所有武将信息
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { prop, Ref, mongoose } from '@typegoose/typegoose';
|
||||
import Hero, { } from '../../db/Hero';
|
||||
import Hero, { HeroType } from '../../db/Hero';
|
||||
import { PvpDefenseType } from '../../db/PvpDefense';
|
||||
import PvpHistoryOpp from '../../db/PvpHistoryOpp';
|
||||
import { PvpSeasonResultType } from '../../db/PvpSeasonResult';
|
||||
import { getPLvByScore } from '../../pubUtils/data';
|
||||
import { RewardInter } from '../../pubUtils/interface';
|
||||
|
||||
|
||||
@@ -18,6 +19,14 @@ export class DefenseHero {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// 防守阵容
|
||||
@@ -32,6 +41,14 @@ export class Defense {
|
||||
score: number; // 防守阵容的总军功
|
||||
@prop({ required: true })
|
||||
pLv: number; // 防守阵容的等级
|
||||
|
||||
constructor(heroes: DefenseHero[], score: number, warId: number, buff: number) {
|
||||
this.heroes = heroes;
|
||||
this.score = score;
|
||||
this.pLv = getPLvByScore(score);
|
||||
this.warId = warId;
|
||||
this.buff = buff;
|
||||
}
|
||||
}
|
||||
|
||||
// 挑战阵容武将
|
||||
@@ -50,6 +67,12 @@ export class Attack {
|
||||
score: number; // 防守阵容的总军功
|
||||
@prop({ required: true })
|
||||
pLv: number; // 防守阵容的等级
|
||||
|
||||
constructor(heroes: AttackHero[], score: number) {
|
||||
this.heroes = heroes;
|
||||
this.score = score;
|
||||
this.pLv = getPLvByScore(score);
|
||||
}
|
||||
}
|
||||
|
||||
// 两个阵容中的武将的分别的战力
|
||||
@@ -63,7 +86,7 @@ export class LineupCe {
|
||||
export class OppPlayer {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ ref: 'PvpHistoryOpp', type: mongoose.Schema.Types.ObjectId })
|
||||
@prop({ ref: () => PvpHistoryOpp, type: mongoose.Schema.Types.ObjectId })
|
||||
oppDef: Ref<PvpHistoryOpp>;
|
||||
@prop({ required: true })
|
||||
pos: number;
|
||||
@@ -115,6 +138,13 @@ export class DefenseHeroReturn {
|
||||
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 {
|
||||
@@ -124,19 +154,44 @@ export class DefenseLineupReturn {
|
||||
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 {
|
||||
warId: number;
|
||||
buff: number;
|
||||
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;
|
||||
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 {
|
||||
@@ -181,18 +236,47 @@ export class PvpDataReturn {
|
||||
challengeRefTime: number;
|
||||
receiveBox: number[] = [];
|
||||
hisScore: number = 0;
|
||||
heroScores: heroScoreReturn[] = [];
|
||||
heroScores: HeroScoreReturn[] = [];
|
||||
isFirstEntry: boolean = false;
|
||||
resultRecord: PvpSeasonResultRecord;
|
||||
|
||||
constructor(pvpDefense: PvpDefenseType) {
|
||||
setPvpDefense(pvpDefense: PvpDefenseType) {
|
||||
this.score = pvpDefense.score;
|
||||
this.winStreakNum = pvpDefense.winStreakNum;
|
||||
this.receiveBox = pvpDefense.receivedBox;
|
||||
this.hisScore = pvpDefense.hisScore;
|
||||
// this.oppPlayers
|
||||
// this.heroScores
|
||||
|
||||
this.refOppCnt = pvpDefense.refOppCnt;
|
||||
this.setAttackCnt = pvpDefense.setAttackCnt;
|
||||
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[]) {
|
||||
|
||||
@@ -2,6 +2,8 @@ import { prop, mongoose, Ref } from '@typegoose/typegoose';
|
||||
import { DicWarJson } from '../pubUtils/dictionary/DicWarJson';
|
||||
import Hero, { HeroType } from '../db/Hero';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { DicHero } from '../pubUtils/dictionary/DicHero';
|
||||
import { gameData } from '../pubUtils/data';
|
||||
|
||||
// 从玩家数据中覆盖warjson的部分字段
|
||||
export class PvpHeroInfo {
|
||||
@@ -41,13 +43,14 @@ export class PvpHeroInfo {
|
||||
this.quality = hero.quality;
|
||||
}
|
||||
|
||||
setRobotInfo(warjson: DicWarJson, actorId: number, lv: number, initialStar: number, quality: number) {
|
||||
setRobotInfo(actorId: number, lv: number) {
|
||||
let dicHero = gameData.hero.get(actorId);
|
||||
this.actorId = actorId;
|
||||
this.skinId = warjson.actorId;
|
||||
this.actorName = warjson.actorName;
|
||||
this.star = initialStar;
|
||||
this.skinId = actorId;
|
||||
this.actorName = dicHero.name;
|
||||
this.star = dicHero.initialStars;
|
||||
this.lv = lv;
|
||||
this.quality = quality;
|
||||
this.quality = dicHero.quality;
|
||||
}
|
||||
|
||||
setAttribute(attribute: string) {
|
||||
|
||||
@@ -32,15 +32,15 @@ export const PVP = {
|
||||
PVP_CHALLENGE_COUNTS: 10, // pvp初始挑战次数
|
||||
PVP_CHALLENGE_NORMALTIMES: 120, // pvp日常挑战次数刷新时间(分钟)
|
||||
PVP_CHALLENGE_FINALTIMES: 60, // PVP赛季最后一天挑战次数刷新时间(分钟)
|
||||
PVP_SEASON_DAYS: 30, // PVP一个赛季的时间
|
||||
PVP_SEASON_DAYS: "1&7|2&10|3&20", // PVP一个赛季的时间
|
||||
PVP_OPPONENT_FREEREFRESH: 3, // pvp挑战对手每日免费刷新次数
|
||||
PVP_WINREWARD_UPLIMIT: 10, // 连胜奖励军功加成上限
|
||||
PVP_LINEUP_HEROS: 6, // pvp最多上阵人数
|
||||
PVP_SET_ATTACK_FREE_CNT: 2, // pvp每天免费设挑战阵容的次数
|
||||
PVP_SET_ATTACK_CNT: 5, // pvp每天设置挑战阵容的次数(包括免费)
|
||||
PVP_SET_ATTACK_CNT_GOLD: 100, // pvp收费设置挑战阵容的花费
|
||||
PVP_DEFENSE_SUCCESS_REWARD: 5, // pvp防守成功积分奖励
|
||||
PVP_DEFENSE_SUCCESS_REWARD_MAX_CNT: 5, // 每天防守成功可以获得的奖励次数
|
||||
PVP_SET_ATTACK_CNT_GOLD: 100, // pvp收费设置挑战阵容的花费
|
||||
PVP_DEFENSE_SUCCESS_REWARD: 5, // pvp防守成功积分奖励
|
||||
PVP_DEFENSE_SUCCESS_REWARD_MAX_CNT: 5, // 每天防守成功可以获得的奖励
|
||||
};
|
||||
export const ARMY = {
|
||||
ARMY_CREAT_COST: 188, // 创建军团需要的元宝
|
||||
|
||||
Reference in New Issue
Block a user