添加获取对手阵容,开始战斗,结算
This commit is contained in:
@@ -1,13 +1,18 @@
|
||||
import {Application, BackendSession} from 'pinus';
|
||||
const _ = require('underscore');
|
||||
import { gameData } from '../../../pubUtils/data';
|
||||
import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, } from '../../../services/pvpService';
|
||||
import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, getPlusScore, getLvByScore, } from '../../../services/pvpService';
|
||||
import { RoleModel, RoleType } from '../../../db/Role';
|
||||
import { STATUS } from '../../../consts/statusCode';
|
||||
import { resResult } from '../../../pubUtils/util';
|
||||
import { resResult, reduceCe, genCode } from '../../../pubUtils/util';
|
||||
import { SystemConfigModel } from '../../../db/SystemConfig'
|
||||
|
||||
import { PvpDefenseModel } from '../../../db/PvpDefense';
|
||||
import { PvpDefenseModel, PvpDefenseType, OppPlayers } from '../../../db/PvpDefense';
|
||||
import { oppHeroesDefenseInter, pvpEndParamInter } from '../../../pubUtils/interface';
|
||||
import { HeroType } from '../../../db/Hero';
|
||||
import { CeAttrNumber } from '../../../db/generalField';
|
||||
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
|
||||
import { BattleRecordModel } from '../../../db/BattleRecord';
|
||||
export default function(app: Application) {
|
||||
return new PvpHandler(app);
|
||||
}
|
||||
@@ -49,6 +54,192 @@ export class PvpHandler {
|
||||
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { oppPlayers });
|
||||
let result = getEnemies(pvpDefense.oppPlayers, pvpDefense.winStreakNum);
|
||||
|
||||
return resResult(STATUS.SUCCESS, { data: result });
|
||||
return resResult(STATUS.SUCCESS, { oppPlayers: result, refOppCnt: 0 });
|
||||
}
|
||||
|
||||
// 获取对手阵容具体信息
|
||||
async getOppoPlayer (msg: { roleId: string }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
|
||||
let oppoRoleId = msg.roleId;
|
||||
let pvpDefense = await PvpDefenseModel.findByRoleIdIncludeAll(roleId);
|
||||
let { oppPlayers } = pvpDefense;
|
||||
let role = <RoleType>pvpDefense.role;
|
||||
|
||||
let curOpp = oppPlayers.find(cur => cur.roleId == oppoRoleId);
|
||||
if(!curOpp) return resResult(STATUS.PVP_ROLE_NOT_FOUND);
|
||||
|
||||
let system = await SystemConfigModel.findSystemConfig();
|
||||
let mapWarJson = gameData.warJson.get(system.warId);
|
||||
|
||||
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
|
||||
});
|
||||
}
|
||||
}
|
||||
} 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
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return resResult(STATUS.SUCCESS, { roleId: oppoRoleId, pos: curOpp.pos, heroes });
|
||||
}
|
||||
|
||||
// 开战
|
||||
async pvpStart (msg: { warId: number, heroes: number[], roleId: string }, session: BackendSession) {
|
||||
const { warId, heroes, roleId: oppRoleId } = msg;
|
||||
let roleId = session.get('roleId');
|
||||
let roleName = session.get('roleName');
|
||||
|
||||
let warInfo = gameData.war.get(warId);
|
||||
if(!warInfo) {
|
||||
return resResult(STATUS.BATTLE_MISS_INFO);
|
||||
}
|
||||
|
||||
let checkHeroes = await checkBattleHeroesByHid(roleId, heroes);
|
||||
if(!checkHeroes) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
|
||||
|
||||
const pvpDefense = await PvpDefenseModel.findByRoleId(roleId);
|
||||
if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN);
|
||||
let { oppPlayers } = pvpDefense;
|
||||
let curOpp = oppPlayers.find(cur => cur.roleId == oppRoleId);
|
||||
if(!curOpp) return resResult(STATUS.PVP_ROLE_NOT_FOUND)
|
||||
|
||||
const battleCode = genCode(8); // 关卡唯一值
|
||||
|
||||
await BattleRecordModel.updateBattleRecordByCode(battleCode, {
|
||||
$set: {
|
||||
roleId, roleName, warId,
|
||||
status: 0,
|
||||
warName: warInfo.gk_name,
|
||||
warType: warInfo.warType,
|
||||
record: { heroes, pos: curOpp.pos, oppRoleId }
|
||||
}
|
||||
}, true);
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode
|
||||
});
|
||||
}
|
||||
|
||||
// 结算
|
||||
async pvpEnd (msg: { battleCode: string, isSuccess: boolean, myHeroes: pvpEndParamInter[], oppHeroes: pvpEndParamInter[] }, session: BackendSession) {
|
||||
|
||||
let roleId = session.get('roleId');
|
||||
let roleName = session.get('roleName');
|
||||
|
||||
const { battleCode, isSuccess, myHeroes, oppHeroes } = msg;
|
||||
|
||||
const BattleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode, true);
|
||||
if(!BattleRecord || BattleRecord.status != 0) {
|
||||
return resResult(STATUS.BATTLE_STATUS_WRONG);
|
||||
}
|
||||
|
||||
let flag = 1; // 对比hero信息
|
||||
let { record: { heroes: dbHeroes, oppRoleId, pos } } = BattleRecord;
|
||||
for(let {hid} of myHeroes) {
|
||||
if(dbHeroes.indexOf(hid) == -1) flag = 0;
|
||||
}
|
||||
if(!flag) {
|
||||
return resResult(STATUS.BATTLE_INFO_VALIDATE_ERR);
|
||||
}
|
||||
|
||||
// 更新军功
|
||||
let pvpDefense = await PvpDefenseModel.findByRoleId(roleId);
|
||||
if(!pvpDefense) return resResult(STATUS.PVP_NOT_OPEN);
|
||||
let { oppPlayers, winStreakNum, heroScores, score } = pvpDefense;
|
||||
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 showHeroScores = new Array<{hid: number, addScore: number, plusScore: number, score: number}>();
|
||||
for(let { hid, damage, heal, hurt } 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;
|
||||
}
|
||||
score += 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;
|
||||
}
|
||||
}
|
||||
let pLv = getLvByScore(heroScores);
|
||||
|
||||
// 刷新对手
|
||||
const role = await RoleModel.findByRoleId(roleId);
|
||||
let newOppPlayers: Array<OppPlayers> = await refreshEnemies(role, score, pLv);
|
||||
|
||||
pvpDefense = await PvpDefenseModel.updateInfoAndInclude(roleId, { oppPlayers: newOppPlayers, heroScores, score, pLv, winStreakNum });
|
||||
let result = getEnemies(pvpDefense.oppPlayers, pvpDefense.winStreakNum);
|
||||
|
||||
|
||||
// 更新battleRecord
|
||||
await BattleRecordModel.updateBattleRecordByCode(battleCode, {
|
||||
$set: { status: isSuccess?1:2 }
|
||||
}, true);
|
||||
|
||||
// TODO 记录战报
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode, isSuccess,
|
||||
score, pLv, myRank: 0,
|
||||
heroScores: showHeroScores,
|
||||
oppPlayers: result
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user