🐞 fix(巅峰演武): 修改等级计算、2倍碾压

This commit is contained in:
zhangxk
2023-10-13 17:03:06 +08:00
parent 73a44e9828
commit b82d525f7f
5 changed files with 38 additions and 20 deletions

View File

@@ -409,7 +409,7 @@ export class PvpHandler {
if(subHid && (!dicHero || dicHero.urType != 1)) return resResult(STATUS.HERO_CAN_NOT_SET_SUB); if(subHid && (!dicHero || dicHero.urType != 1)) return resResult(STATUS.HERO_CAN_NOT_SET_SUB);
if(subHid && heroes.findIndex(hero => hero.actorId == subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE); if(subHid && heroes.findIndex(hero => hero.actorId == subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE);
} }
let attack = new Attack(heroes, scores); let attack = new Attack(heroes, scores, pvpDefense.heroScores);
let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, attack.heroes, pvpDefense.defense?.heroes??[], []); let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, attack.heroes, pvpDefense.defense?.heroes??[], []);
// 刷对手 // 刷对手
let role = <RoleType>pvpDefense.role; let role = <RoleType>pvpDefense.role;
@@ -454,7 +454,7 @@ export class PvpHandler {
if(subHid && (!dicHero || dicHero.urType != 1)) return resResult(STATUS.HERO_CAN_NOT_SET_SUB); if(subHid && (!dicHero || dicHero.urType != 1)) return resResult(STATUS.HERO_CAN_NOT_SET_SUB);
if(subHid && heroes.findIndex(hero => hero.actorId == subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE); if(subHid && heroes.findIndex(hero => hero.actorId == subHid) != -1) return resResult(STATUS.HERO_SUB_DUPLICATE);
} }
let attack = new Attack(heroes, scores); let attack = new Attack(heroes, scores, pvpDefense.heroScores);
let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, attack.heroes, pvpDefense.defense?.heroes??[], []); let lineupCe = await generPvpLineupCe(roleId, pvpDefense.lineupCe, attack.heroes, pvpDefense.defense?.heroes??[], []);
// 保存 // 保存
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { attack, lineupCe }); pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { attack, lineupCe });
@@ -543,7 +543,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, combo); let defense = new Defense(defenseHeroes, scores, warId, buff, combo, pvpDefense.heroScores);
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 });
@@ -763,7 +763,7 @@ export class PvpHandler {
if (!curOpp) return resResult(STATUS.PVP_ROLE_NOT_FOUND); if (!curOpp) return resResult(STATUS.PVP_ROLE_NOT_FOUND);
let oppDef = <PvpHistoryOppType>curOpp.oppDef; let oppDef = <PvpHistoryOppType>curOpp.oppDef;
// 战力检测 // 战力检测
if (attackCe <= oppDef.defCe) return resResult(STATUS.PVP_SWEEP_NOT_CE); if (attackCe <= oppDef.defCe * 2) return resResult(STATUS.PVP_SWEEP_NOT_CE);
// 对手记录更新 // 对手记录更新
await PvpHistoryOppModel.setStatus(oppDef._id.toString(), 1); await PvpHistoryOppModel.setStatus(oppDef._id.toString(), 1);
@@ -784,15 +784,15 @@ export class PvpHandler {
let update: pvpUpdateInter = {}; let update: pvpUpdateInter = {};
const myHeroes: pvpEndParamInter[] = heroes.map(hid => { return { hid, damage: 0, heal: 0, underDamage: 0 } }) const myHeroes: pvpEndParamInter[] = heroes.map(hid => { return { hid, damage: 0, heal: 0, underDamage: 0 } })
const myRecInfo = await generMyRecInfo(pvpDefense, role, true, curOpp.pos, myHeroes); const myRecInfo = await generMyRecInfo(pvpDefense, role, true, curOpp.pos, myHeroes);
let { attackInfo, showHeroScores, updateParam } = myRecInfo let { attackInfo, showHeroScores, updateParam } = myRecInfo;
update = { ...update, ...updateParam }; update = { ...update, ...updateParam };
const oppHeroes: pvpEndParamInter[] = oppDef.heroes.map(cur => { return { hid: cur.actorId, damage: 0, heal: 0, underDamage: 0 } }) const oppHeroes: pvpEndParamInter[] = oppDef.heroes.map(cur => { return { hid: cur.actorId, damage: 0, heal: 0, underDamage: 0 } })
const defenseInfo = await generPVPOppRecInfo(true, curOpp, oppHeroes, serverId); const defenseInfo = await generPVPOppRecInfo(true, curOpp, oppHeroes, serverId);
update = { ...update, oppBeforePlayers: pvpDefense.oppPlayers }; update = { ...update, oppBeforePlayers: pvpDefense.oppPlayers };
await PvpRecordModel.updateByRec(battleCode, {roleId1:roleId, roleId2:oppRoleId, warId, attackInfo, defenseInfo, createTime: nowSeconds(), timeout: false });
// 刷新对手 // 刷新对手
let oppPlayers = await refreshEnemies(role, seasonNum, pvpDefense.score, pvpDefense.attack.score, pvpDefense.attack.pLv || 1); let oppPlayers = await refreshEnemies(role, seasonNum, pvpDefense.score, pvpDefense.attack.score, pvpDefense.attack.pLv || 1);
update.oppPlayers = oppPlayers; update.oppPlayers = oppPlayers;

View File

@@ -511,13 +511,16 @@ export async function generMyRecInfo(pvpDefense: PvpDefenseType, role: RoleType,
} }
export function calLineupScore(lineup: Attack|Defense, heroScores: HeroScore[]) { export function calLineupScore(lineup: Attack|Defense, heroScores: HeroScore[]) {
if(!lineup) return lineup; // if(!lineup) return lineup;
let scores: number[] = []; let scores: number[] = [];
for(let { actorId } of lineup.heroes) { // for(let { actorId } of lineup.heroes) {
let hs = heroScores.find(cur => cur.hid == actorId); // let hs = heroScores.find(cur => cur.hid == actorId);
if(hs) { // if(hs) {
scores.push(hs.score); // scores.push(hs.score);
} // }
// }
for(let {score} of heroScores){
scores.push(score);
} }
let { pLv, score } = getPlvAndScore(scores); let { pLv, score } = getPlvAndScore(scores);
return {...lineup, score, pLv} return {...lineup, score, pLv}

View File

@@ -157,6 +157,11 @@ export default class PvpRecord extends BaseModel {
return result; return result;
} }
public static async updateByRec(battleCode: string, param: {roleId1: string, roleId2: string, warId: number, attackInfo: PvpRecordPlayerInfo, defenseInfo: PvpRecordPlayerInfo, createTime: number, timeout?: boolean }) {
const result = await PvpRecordModel.findOneAndUpdate({ battleCode }, param, { new: true, upsert: true }).lean();
return result;
}
public static async getRecByRoleId( roleId: string, limit = 15, lean = true) { public static async getRecByRoleId( roleId: string, limit = 15, lean = true) {
// await this.delPvpRecords(); // await this.delPvpRecords();
let t = <number>getTimeFun().getBeforeDayWithHour(3); let t = <number>getTimeFun().getBeforeDayWithHour(3);

View File

@@ -65,10 +65,14 @@ export class Defense {
@prop({ required: true, type: () => Combo, _id: false }) @prop({ required: true, type: () => Combo, _id: false })
combo: Combo[]; // 防守阵容的等级 combo: Combo[]; // 防守阵容的等级
constructor(heroes: DefenseHero[], scores: number[], warId: number, buff: number, combo: Combo[]) { constructor(heroes: DefenseHero[], scores: number[], warId: number, buff: number, combo: Combo[], heroScores:HeroScore[]) {
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 newScores: number[] = [];
for(let {score} of heroScores){
newScores.push(score);
}
let {pLv, score} = getPlvAndScore(newScores);
this.pLv = pLv, this.pLv = pLv,
this.score = score; this.score = score;
this.warId = warId; this.warId = warId;
@@ -96,10 +100,14 @@ export class Attack {
@prop({ required: true }) @prop({ required: true })
pLv: number; // 防守阵容的等级 pLv: number; // 防守阵容的等级
constructor(heroes: AttackHero[], scores: number[]) { constructor(heroes: AttackHero[], scores: number[], heroScores:HeroScore[]) {
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 newScores: number[] = [];
for(let {score} of heroScores){
newScores.push(score);
}
let {pLv, score} = getPlvAndScore(newScores);
this.pLv = pLv; this.pLv = pLv;
this.score = score; this.score = score;
} }

View File

@@ -13,7 +13,7 @@ import { dicTower, loadTower } from "./dictionary/DicTower";
import { dicTowerTask, loadTowerTask } from "./dictionary/DicTowerTask"; import { dicTowerTask, loadTowerTask } from "./dictionary/DicTowerTask";
import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar, dicComBattleReward } from "./dictionary/DicWar"; import { dicWar, dicWarPvp, dicDailyWarByType, loadWar, dicHeroIdByWar, dicComBattleReward } from "./dictionary/DicWar";
import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson"; import { dicWarJson, loadWarJson } from "./dictionary/DicWarJson";
import { AUCTION_TIME, BOSS_HP_RATIO_TYPE } from "../consts"; import { AUCTION_TIME, BOSS_HP_RATIO_TYPE, LINEUP_NUM } from "../consts";
import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions"; import { dicFashions, dicFashionsByHeroId, loadFashions } from "./dictionary/DicFashions";
import { friendShipByIndex, friendShips, friendShipsByLv, friendShipsMax, loadFriendShip } from "./dictionary/DicFriendShip"; import { friendShipByIndex, friendShips, friendShipsByLv, friendShipsMax, loadFriendShip } from "./dictionary/DicFriendShip";
import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQualityUp"; import { dicHeroQualityUp, loadHeroQualityUp } from "./dictionary/DicHeroQualityUp";
@@ -645,9 +645,11 @@ export function getPlvAndScore(scores: number[] = []) {
return b - a; return b - a;
} }
}); });
let maxScore = scores.slice(0, 6).reduce((acc, curr) => acc + curr, 0); let maxScore = scores.slice(0, LINEUP_NUM).reduce((acc, curr) => acc + curr, 0);
let score = scores.reduce((pre, cur) => pre + cur, 0); let score = scores.reduce((pre, cur) => pre + cur, 0);
return { score, pLv: getPLvByScore(maxScore * param.PVP.PVP_LINEUP_HEROS) }; // return { score, pLv: getPLvByScore(maxScore * param.PVP.PVP_LINEUP_HEROS) };
return { score, pLv: getPLvByScore(maxScore) };
} }
export function getPvpHeroRewardsByScore(score: number) { export function getPvpHeroRewardsByScore(score: number) {