pvp刷新规则,区段没有人时刷前后一名
This commit is contained in:
@@ -1,25 +1,24 @@
|
||||
import {Application, BackendSession} from 'pinus';
|
||||
const _ = require('underscore');
|
||||
import { gameData, getPvpBoxs } from '../../../pubUtils/data';
|
||||
import { refreshEnemies, getEnemies, getPlusScore, getLvByScore, defaultHeroes, comsumeChallengeCnt, refresh, findPvpDefByRoleId, checkRoleIsRobot, getRefOppCnt, findPvpDefAllByRoleId } from '../../../services/pvpService';
|
||||
import { refreshEnemies, getEnemies, getLvByScore, defaultHeroes, comsumeChallengeCnt, refresh, findPvpDefByRoleId, checkRoleIsRobot, getRefOppCnt, findPvpDefAllByRoleId, generPVPOppRecInfo, generMyRecInfo, getRobotLineup, getPlayerLineup } from '../../../services/pvpService';
|
||||
import { RoleModel, RoleType } from '../../../db/Role';
|
||||
import { STATUS } from '../../../consts/statusCode';
|
||||
import { resResult, reduceCe, genCode } from '../../../pubUtils/util';
|
||||
import { resResult, genCode } from '../../../pubUtils/util';
|
||||
import { SystemConfigModel } from '../../../db/SystemConfig'
|
||||
|
||||
import { PvpDefenseModel, PvpDefenseType, OppPlayers } from '../../../db/PvpDefense';
|
||||
import { PvpDefenseModel, OppPlayers } from '../../../db/PvpDefense';
|
||||
import { oppHeroesDefenseInter, pvpEndParamInter, RankParam, PlayerDetail, PlayerDetailHero } from '../../../pubUtils/interface';
|
||||
import { PVP_HERO_POS, REDIS_KEY } from '../../../consts';
|
||||
|
||||
import { addItems } from '../../../services/rewardService';
|
||||
import { HeroType, HeroModel } from '../../../db/Hero';
|
||||
import { CeAttrNumber } from '../../../db/generalField';
|
||||
import { HeroModel } from '../../../db/Hero';
|
||||
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
|
||||
import { BattleRecordModel } from '../../../db/BattleRecord';
|
||||
import { PvpRecordModel, HeroesRecord } from '../../../db/PvpRecord';
|
||||
import { setPvpDefResult } from '../../../services/timeTaskService';
|
||||
import { existsRank, initRank, getRank, setRank, getMyRank } from '../../../services/redisService';
|
||||
import { handleCost } from '../../../services/rewardService';
|
||||
import { matchPlayerByRank } from '../../../services/pvpService';
|
||||
|
||||
export default function(app: Application) {
|
||||
return new PvpHandler(app);
|
||||
@@ -90,52 +89,9 @@ export class PvpHandler {
|
||||
|
||||
let heroes = new Array<oppHeroesDefenseInter>();
|
||||
if(curOpp.isRobot) { // 机器人
|
||||
let { pos, robot } = curOpp;
|
||||
let { warId } = robot;
|
||||
let dicWarJson = gameData.warJson.get(warId);
|
||||
let dicOpp = gameData.pvpOpponent.get(pos);
|
||||
for(let json of dicWarJson) {
|
||||
let curDicMapJson = mapWarJson.find(cur => cur.dataId == json.dataId);
|
||||
const { actorId, actorName, attribute, skill, seid, star, spine, relation } = json;
|
||||
if(relation == 2 && actorId > 0) { // 默认格子
|
||||
let newAttribute = new CeAttrNumber();
|
||||
for(let attrName in newAttribute) {
|
||||
newAttribute[attrName] = Math.floor(attribute[attrName] * role.topFiveCe / 10000 * dicOpp.ratio);
|
||||
}
|
||||
newAttribute['speed'] = 0;
|
||||
newAttribute['ap'] = 0;
|
||||
|
||||
let heroInfo = { actorId, actorName, skill, seid, star, spine, attribute: newAttribute, lv: role.lv };
|
||||
heroes.push({
|
||||
...curDicMapJson, ...heroInfo
|
||||
});
|
||||
}
|
||||
}
|
||||
heroes = await getRobotLineup(mapWarJson, curOpp, role.topFiveCe, role.lv);
|
||||
} else { // 真人
|
||||
let oppDef = <PvpDefenseType>curOpp.oppDef;
|
||||
let role = <RoleType>oppDef.role;
|
||||
let { globalCeAttr } = role;
|
||||
for(let { actorId, hero, dataId, order } of oppDef.heroes) {
|
||||
let curDicMapJson = mapWarJson.find(cur => cur.dataId == dataId);
|
||||
let dicHero = gameData.hero.get(actorId);
|
||||
let h = <HeroType>hero;
|
||||
let { ceAttr } = h;
|
||||
let newAttribute = new CeAttrNumber();
|
||||
for(let attrName in newAttribute) {
|
||||
let { base, ratioUp, fixUp, equipUp } = ceAttr[attrName];
|
||||
let { ratioUp: ratioUp2, fixUp: fixUp2 } = globalCeAttr[attrName];
|
||||
let result = base * ( 1 + ratioUp + ratioUp2) + fixUp + fixUp2 + equipUp;
|
||||
newAttribute[attrName] += reduceCe(result);
|
||||
}
|
||||
newAttribute['speed'] = 0;
|
||||
newAttribute['ap'] = 0;
|
||||
|
||||
let heroInfo = { outIndex: order, actorId, actorName: dicHero.name, skill:0, seid:'&', star: h.star, spine: 0, attribute: newAttribute, lv: h.lv };
|
||||
heroes.push({
|
||||
...curDicMapJson, ...heroInfo
|
||||
});
|
||||
}
|
||||
|
||||
heroes = await getPlayerLineup(mapWarJson, curOpp);
|
||||
}
|
||||
|
||||
return resResult(STATUS.SUCCESS, { roleId: oppoRoleId, pos: curOpp.pos, heroes });
|
||||
@@ -212,80 +168,22 @@ export class PvpHandler {
|
||||
let curOpp = oppPlayers.find(cur => cur.roleId == oppRoleId && cur.pos == pos);
|
||||
if(!curOpp) return resResult(STATUS.PVP_ROLE_NOT_FOUND);
|
||||
|
||||
const dicOpp = gameData.pvpOpponent.get(pos);
|
||||
let plusScore = getPlusScore(winStreakNum);
|
||||
|
||||
let myHeroRecords = new Array<HeroesRecord>();
|
||||
let showHeroScores = new Array<{hid: number, addScore: number, plusScore: number, score: number}>();
|
||||
let addSumScore = 0;
|
||||
for(let { hid, damage, heal, underDamage } of myHeroes) {
|
||||
let curHeroScore = heroScores.find(cur => cur.hid == hid);
|
||||
if(isSuccess) {
|
||||
if(!curHeroScore) {
|
||||
curHeroScore = {
|
||||
hid, score: dicOpp.score + plusScore
|
||||
};
|
||||
heroScores.push(curHeroScore);
|
||||
} else {
|
||||
curHeroScore.score += dicOpp.score + plusScore;
|
||||
}
|
||||
addSumScore += dicOpp.score + plusScore;
|
||||
showHeroScores.push({
|
||||
hid, addScore: dicOpp.score, plusScore, score: curHeroScore.score
|
||||
});
|
||||
winStreakNum ++;
|
||||
} else {
|
||||
showHeroScores.push({
|
||||
hid, addScore: 0, plusScore: 0, score: curHeroScore.score
|
||||
});
|
||||
winStreakNum = 0;
|
||||
}
|
||||
const myHero = await HeroModel.findByHidAndRole(hid, roleId, 'quality star colorStar lv');
|
||||
let { quality, star, colorStar, lv} = myHero;
|
||||
myHeroRecords.push({
|
||||
hid, quality, star, colorStar, lv, damage, heal, underDamage
|
||||
});
|
||||
}
|
||||
|
||||
let oppHeroRecords = new Array<HeroesRecord>();
|
||||
for(let { hid, damage, heal, underDamage } of oppHeroes) {
|
||||
if(curOpp.isRobot) {
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
let { quality, initialStars: star } = dicHero;
|
||||
oppHeroRecords.push({
|
||||
hid, quality, star, colorStar: 0, lv: 0, damage, heal, underDamage
|
||||
});
|
||||
} else {
|
||||
const myHero = await HeroModel.findByHidAndRole(hid, roleId, 'quality star colorStar lv');
|
||||
let { quality, star, colorStar, lv} = myHero;
|
||||
oppHeroRecords.push({
|
||||
hid, quality, star, colorStar, lv, damage, heal, underDamage
|
||||
});
|
||||
}
|
||||
}
|
||||
const role = await RoleModel.findByRoleId(roleId);
|
||||
const myRecInfo = await generMyRecInfo(heroScores, winStreakNum, role, isSuccess, pos, myHeroes);
|
||||
let { attackInfo, showHeroScores, addSumScore } = myRecInfo
|
||||
|
||||
score += addSumScore;
|
||||
if(score > hisScore) hisScore = score;
|
||||
let pLv = getLvByScore(heroScores);
|
||||
|
||||
const defenseInfo = await generPVPOppRecInfo(isSuccess, curOpp, oppRoleId, oppHeroes);
|
||||
|
||||
// 战报记录
|
||||
await PvpRecordModel.createRec({roleId1: roleId, roleId2: oppRoleId, warId: BattleRecord.battleId, attackInfo, defenseInfo});
|
||||
|
||||
// 刷新对手
|
||||
const role = await RoleModel.findByRoleId(roleId);
|
||||
let newOppPlayers: Array<OppPlayers> = await refreshEnemies(role, score, pLv);
|
||||
|
||||
let oppRole;
|
||||
if(curOpp.isRobot) {
|
||||
oppRole = { ...curOpp.robot, title: 1, topFiveCe: curOpp.robot.defCe};
|
||||
} else {
|
||||
oppRole = await RoleModel.findByRoleId(oppRoleId);
|
||||
}
|
||||
|
||||
// TODO 战报记录方法抽象
|
||||
await PvpRecordModel.createRec({roleId1: roleId, roleId2: oppRoleId, warId: BattleRecord.battleId, attackInfo: {
|
||||
roleId, roleName, lv: role.lv, sHid: role.sHid, headHid: role.headHid, title: role.title, ce: role.topFiveCe, heroes: myHeroRecords, isSuccess, score: isSuccess?addSumScore:0
|
||||
}, defenseInfo: {
|
||||
roleId: oppRole.roleId, roleName: oppRole.roleName, lv: oppRole.lv, sHid: oppRole.sHid, headHid: oppRole.headHid, title: oppRole.title, ce: oppRole.topFiveCe, heroes: myHeroRecords, isSuccess: !isSuccess, score: 0
|
||||
}})
|
||||
|
||||
// 更新battleRecord
|
||||
await BattleRecordModel.updateBattleRecordByCode(battleCode, {
|
||||
$set: { status: isSuccess?1:2 }
|
||||
|
||||
Reference in New Issue
Block a user