添加获得对手

This commit is contained in:
luying
2021-01-06 20:25:06 +08:00
parent 524cdc11c7
commit a339b8adcc
4 changed files with 120 additions and 20 deletions

View File

@@ -1,12 +1,13 @@
/**
* 体力系统
*/
import { PvpDefenseModel, Heroes, OppPlayers, Robot } from '../db/pvpDefense';
import { PvpDefenseModel, Heroes, OppPlayers, Robot, PvpDefenseType } from '../db/pvpDefense';
import { RoleType } from '../db/Role';
import { PVP_PLAYER_POS, PVP_HERO_POS, ROBOT_NAME } from '../consts';
import { dicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
import { getRandomIndexByLen, genCode, getRandomByLen } from '../pubUtils/util';
import { oppPlayersInter } from '../pubUtils/interface';
import { gameData } from "../pubUtils/data";
@@ -28,7 +29,7 @@ export async function initPvpInfo(role: RoleType) {
//初始化对手人阵容TODO
let oppPlayers: Array<OppPlayers> = await refreshEnemies(role, 0, 1);
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, heroes, oppPlayers, defCe: role.topFiveCe });
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, role: role._id, heroes, oppPlayers, defCe: role.topFiveCe });
//加入排行榜 TODO
return result;
}
@@ -41,21 +42,51 @@ export async function checkPvp(role: RoleType) {
return result;
}
/**
* 返回对手三人信息
*
* @param oppPlayers pvpDefense表中的oppPlayers字段需要populate过的
* @param pLv 玩家本人的队伍等级
*/
export function getEnemies(oppPlayers: OppPlayers[], winStreakNum: number) {
let result = new Array<oppPlayersInter>();
for(let {pos, isRobot, oppDef, robot} of oppPlayers) {
let dicOpponent = dicPvpOpponent.get(pos);
if(isRobot) {
let { roleId, roleName, headHid, sHid, pLv, defCe } = robot;
result.push({
pos, roleId, roleName, headHid, sHid, pLv, defCe,
addScore: dicOpponent.score,
plusScore: getPlusScore(winStreakNum)
});
} else {
let opp = <PvpDefenseType>oppDef;
let role = <RoleType>opp.role;
let { roleId, roleName, headHid, sHid } = role;
let { pLv, defCe } = opp;
result.push({
pos, roleId, roleName, headHid, sHid, pLv, defCe,
addScore: dicOpponent.score,
plusScore: getPlusScore(winStreakNum)
});
}
}
return result
}
// 刷新对手
// TODO 刷新对手
export async function refreshEnemies(role: RoleType, score: number, pLv: number) {
let { roleId, topFiveCe } = role;
let oppPlayers = new Array<OppPlayers>();
let opp = dicPvpOpponent.values()
for(let { id, maxLv, minLv, ratio } of opp) {
for(let dicOpp of opp) {
let flag = false; // 是否筛选成功
if(score > 3000) { // TODO 将这个放到const
flag = await matchPlayer(oppPlayers, id, roleId, pLv + minLv, pLv + maxLv);
flag = await matchPlayer(oppPlayers, roleId, pLv, dicOpp);
// TODO 当前后分数段没有时,返回前一名的玩家
if(!flag) flag = matchRobot(oppPlayers, id, topFiveCe, ratio);
if(!flag) flag = matchRobot(oppPlayers, topFiveCe, pLv, dicOpp);
} else {
flag = matchRobot(oppPlayers, id, topFiveCe, ratio);
flag = matchRobot(oppPlayers, topFiveCe, pLv, dicOpp);
}
if(!flag) continue;
}
@@ -63,8 +94,9 @@ export async function refreshEnemies(role: RoleType, score: number, pLv: number)
return oppPlayers;
}
async function matchPlayer(oppPlayers: OppPlayers[], pos: number, roleId: string, minLv: number, maxLv: number ) {
let range = await PvpDefenseModel.findByTeamLv(minLv, maxLv);
async function matchPlayer(oppPlayers: OppPlayers[], roleId: string, pLv: number, dicOpp: DicPvpOpponent ) {
let { id: pos, minLv, maxLv } = dicOpp
let range = await PvpDefenseModel.findByTeamLv(pLv + minLv, pLv + maxLv);
if(range.length <= 0) return false;
let index = getRandomIndexByLen(range.length);
@@ -86,7 +118,8 @@ async function matchPlayer(oppPlayers: OppPlayers[], pos: number, roleId: string
return true;
}
function matchRobot(oppPlayers: OppPlayers[], pos: number, myCe: number, ratio: number) {
function matchRobot(oppPlayers: OppPlayers[], myCe: number, pLv: number, dicOpp: DicPvpOpponent) {
let { id: pos, minLv, maxLv, ratio } = dicOpp;
let range = gameData.pvpWar;
if(range.length <= 0) return false;
@@ -96,7 +129,7 @@ function matchRobot(oppPlayers: OppPlayers[], pos: number, myCe: number, ratio:
let roleId = generateRobotRoleId();
let roleName = getRandomByLen(ROBOT_NAME);
let robot = new Robot(roleId, roleName, Math.floor(myCe * ratio), result.war_id)
let robot = new Robot(roleId, roleName, Math.floor(myCe * ratio), Math.floor(pLv + (minLv + maxLv)/2), result.war_id)
oppPlayers.push({
oppDef: null,
pos,
@@ -106,10 +139,19 @@ function matchRobot(oppPlayers: OppPlayers[], pos: number, myCe: number, ratio:
return true
}
// 生成机器人roleId
function generateRobotRoleId() {
return `${genCode(10)}_r`;
}
// 根据roleId判断是不是机器人
export function checkRoleIsRobot(roleId: string) {
return !!roleId.match(/_r/);
}
// 根据连胜次数,获得加成的积分
export function getPlusScore(win: number) {
let result = win - 1;
if(result > 10) result = 10;
return result;
}