pvp创建获取
This commit is contained in:
@@ -31,14 +31,14 @@ export enum ROLE_TERAPH {
|
||||
END = 4
|
||||
}
|
||||
|
||||
export enum PVP_POS {
|
||||
export enum PVP_PLAYER_POS {
|
||||
START = 1,
|
||||
END = 3
|
||||
}
|
||||
|
||||
export enum PVP_PLAYER_POS {
|
||||
export enum PVP_HERO_POS {
|
||||
START = 1,
|
||||
END = 9
|
||||
END = 5
|
||||
}
|
||||
|
||||
export enum EQUIP_TYPE {
|
||||
|
||||
@@ -223,12 +223,13 @@ export const REDIS_KEY = {
|
||||
}
|
||||
|
||||
export const FUNC_OPT_TYPE = {
|
||||
LEVEL_UP: 1,
|
||||
BATTLE_END: 2
|
||||
LEVEL_UP: 1,
|
||||
BATTLE_END: 2
|
||||
}
|
||||
|
||||
export const FUNCS_ID = {
|
||||
EVENT: 1
|
||||
EVENT: 1,
|
||||
PVP: 2
|
||||
}
|
||||
|
||||
export const FRIEND_DROP_TYPE = {
|
||||
@@ -308,4 +309,4 @@ export const EQUIP_STRENGTHEN_TYPE = {
|
||||
SINGLE: 1, // 单件单级强化
|
||||
SINGLE_QUICK: 2, // 单件一键强化
|
||||
ALL_QUICK: 3 // 武将全部装备栏一键强化
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,6 +328,7 @@ export const FUNC_OPT_TYPE = {
|
||||
BATTLE_END: 2
|
||||
}
|
||||
|
||||
|
||||
export const FUNCS_ID = {
|
||||
EVENT: 1
|
||||
}
|
||||
|
||||
+21
-16
@@ -3,10 +3,9 @@ import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typ
|
||||
import Hero, { } from './Hero';
|
||||
import Role, { } from './Role';
|
||||
import PvpDef, { } from './PvpDefense';
|
||||
import { PVP_PLAYER_POS, PVP_POS } from '../consts';
|
||||
import SystemConfig, { } from './SystemConfig';
|
||||
import { PVP_PLAYER_POS, PVP_HERO_POS } from '../consts';
|
||||
|
||||
class Heroes {
|
||||
export class Heroes {
|
||||
@prop({ required: true })
|
||||
actorId: number; // 武将id
|
||||
@prop({ ref: Hero, type: mongoose.Schema.Types.ObjectId })
|
||||
@@ -32,13 +31,14 @@ function getInitialOppPlayers() {
|
||||
|
||||
// 初始化
|
||||
function getInitialOppHeros() {
|
||||
let players = new Array<OppPlayers>();
|
||||
for(let i = PVP_POS.START; i <= PVP_POS.END; i++) {
|
||||
let p = new OppPlayers();
|
||||
let heros = new Array<Heroes>();
|
||||
for(let i = PVP_HERO_POS.START; i <= PVP_HERO_POS.END; i++) {
|
||||
let p = new Heroes();
|
||||
p.pos = i;
|
||||
players.push(p);
|
||||
p.order = i;
|
||||
heros.push(p);
|
||||
}
|
||||
return players;
|
||||
return heros;
|
||||
}
|
||||
|
||||
class Robot {
|
||||
@@ -54,7 +54,7 @@ class Robot {
|
||||
topFiveCe: number;
|
||||
}
|
||||
|
||||
class OppPlayers {
|
||||
export class OppPlayers {
|
||||
@prop({ ref: 'PvpDefense', type: mongoose.Schema.Types.ObjectId })
|
||||
oppDef: Ref<PvpDef>;
|
||||
@prop({ required: true })
|
||||
@@ -65,7 +65,7 @@ class OppPlayers {
|
||||
robot: Robot
|
||||
}
|
||||
|
||||
class HidScores {
|
||||
class HeroScores {
|
||||
@prop({ required: true })
|
||||
hid: number;
|
||||
@prop({ required: true })
|
||||
@@ -92,21 +92,21 @@ export default class PvpDefense extends BaseModel {
|
||||
defCe: number; //防守ce
|
||||
@prop({ required: true, type: OppPlayers, default: getInitialOppPlayers(), _id: false })
|
||||
oppPlayers: Array<OppPlayers>;
|
||||
@prop({ ref: 'SystemConfig', type: mongoose.Schema.Types.ObjectId })
|
||||
map: Ref<SystemConfig>;
|
||||
@prop({ required: true, type: HidScores, default: [] })
|
||||
hidScores: Array<HidScores>;
|
||||
@prop({ required: true, type: HeroScores, default: [] })
|
||||
heroScores: Array<HeroScores>;
|
||||
@prop({ required: true, default: true })
|
||||
isDefaultHero: boolean;
|
||||
public static async findByRoleId(roleId: string, lean = true) {
|
||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static async findByScale(roleId: string, min: number, max: number, lean = true) {
|
||||
const result: PvpDefenseType[] = await PvpDefenseModel.find({ roleId: { $ne: roleId }, defCe: { $lte: max, $gte: min } }).sort({ updatedAt: -1 }).limit(100).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async createPvpDefense(params: { roleId: string, roleName: string, heroes: Array<any>, defCe: number }, lean = true) {
|
||||
public static async createPvpDefense(params: { roleId: string, roleName: string, heroes: Array<Heroes>, oppPlayers: Array<OppPlayers>, defCe: number }, lean = true) {
|
||||
const doc = new PvpDefenseModel();
|
||||
const update = Object.assign(doc.toJSON(), params);
|
||||
const defense: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({ roleId: params.roleId }, update, { upsert: true, new: true }).lean(lean);
|
||||
@@ -141,6 +141,11 @@ export default class PvpDefense extends BaseModel {
|
||||
let result = await PvpDefenseModel.deleteMany({ roleId });
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByRoleIdIncludeAll(roleId: string, lean = true) {
|
||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }).populate('role', 'Heroes.hero', 'OppPlayers.oppDef').lean(lean);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const PvpDefenseModel = getModelForClass(PvpDefense);
|
||||
|
||||
+6
-2
@@ -1,10 +1,11 @@
|
||||
import { HANG_UP_CONSTS, ROLE_TERAPH } from './../consts';
|
||||
import BaseModel from './BaseModel';
|
||||
import { CeAttrRole } from './generalField';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typegoose/typegoose';
|
||||
import User from './User';
|
||||
import { shouldRefresh } from '../pubUtils/util';
|
||||
import { initRoleAtrr } from '../pubUtils/playerCe';
|
||||
import Hero,{} from '../db/Hero';
|
||||
interface roleUpdate {
|
||||
ce?: number;
|
||||
_id?:number;
|
||||
@@ -24,6 +25,8 @@ class TopHero {
|
||||
hid: number; // 武将id
|
||||
@prop({ required: true })
|
||||
ce: number; // 战力
|
||||
@prop({ ref: Hero, type: mongoose.Schema.Types.ObjectId })
|
||||
hero: Ref<Hero>;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +57,7 @@ class Teraph{
|
||||
@prop({ required: true, default: 1 })
|
||||
id: number; // 神像的id
|
||||
@prop({ required: true, default: 1 })
|
||||
grade: number; // 等级
|
||||
grade: number; // 等级
|
||||
@prop({ required: true, default: 0 })
|
||||
hp: number;
|
||||
@prop({ required: true, default: 0 })
|
||||
@@ -231,6 +234,7 @@ export default class Role extends BaseModel {
|
||||
const update = Object.assign(doc.toJSON(), roleInfo, { userInfo: user, serverType: user.serverType, serverId });
|
||||
initRoleAtrr(update);
|
||||
const role: RoleType = await RoleModel.findOneAndUpdate({ 'userInfo.uid': uid, serverId }, update, { upsert: true, new: true }).lean(lean);
|
||||
|
||||
return role;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,9 +6,11 @@ export default class SystemConfig extends BaseModel {
|
||||
@prop({ required: true, default: 1})
|
||||
id: number;
|
||||
@prop({ required: true })
|
||||
map: number; // 地图
|
||||
@prop({ required: true })
|
||||
warId: number; // 地图
|
||||
@prop({ required: true, default: 1 })
|
||||
seasonNum: number; // 赛季
|
||||
@prop({ required: true })
|
||||
seasonEndTime: number; //赛季结束的时间
|
||||
public static async findSystemConfig(lean = true) {
|
||||
const result: SystemConfigType = await SystemConfigModel.findOne({ id: 1 }).lean(lean);
|
||||
return result;
|
||||
|
||||
@@ -247,3 +247,8 @@ export function getSuit(id: number) {
|
||||
const suitInfo = gameData.suit.get(id);
|
||||
return suitInfo;
|
||||
}
|
||||
|
||||
export function getFuncsSwitch(id:number) {
|
||||
const funcInfo = gameData.funcsSwitch.get(id);
|
||||
return funcInfo;
|
||||
}
|
||||
@@ -19,7 +19,7 @@ export interface DicFuncSwitch {
|
||||
const str = readJsonFile(FILENAME.DIC_FUNC_SWITCH);
|
||||
let arr = JSON.parse(str);
|
||||
|
||||
export const dicFuncSwitch = new Array<DicFuncSwitch>();
|
||||
export const dicFuncSwitch = new Map<number, DicFuncSwitch>();
|
||||
arr.forEach(o => {
|
||||
dicFuncSwitch.push(o);
|
||||
dicFuncSwitch.set(o.id, o);
|
||||
});
|
||||
|
||||
@@ -106,7 +106,7 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
||||
let incHeroCe = calPlayerCe(role.globalCeAttr, hero, type, args);
|
||||
|
||||
incPlayerCe += incHeroCe;
|
||||
await calculateTopFive(role, hero.hid, hero.ce); // 计算更新最强五人战力
|
||||
await calculateTopFive(role, hero.hid, hero.ce, hero._id); // 计算更新最强五人战力
|
||||
await HeroModel.updateHeroInfo(roleId, hero.hid, hero);
|
||||
await PvpDefenseModel.updateCe(roleId, hero.hid, hero.ce); // 更新pvp防守阵最强五人战力
|
||||
pushHeros.push({
|
||||
@@ -121,18 +121,18 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array<HeroType>,
|
||||
return { pushHeros, role, topFiveCe }
|
||||
}
|
||||
|
||||
async function calculateTopFive(role: RoleType, hid: number, ce: number) {
|
||||
async function calculateTopFive(role: RoleType, hid: number, ce: number, heroId: string) {
|
||||
let topFive = role?.topFive || new Array();
|
||||
|
||||
topFive.sort((a, b) => { return b.ce - a.ce }); // 0-5,最大-最小
|
||||
let index = topFive.findIndex(cur => cur.hid == hid);
|
||||
if (index == -1) { // 不在最强列表
|
||||
if (topFive.length < 5) { // 不满5人
|
||||
topFive.push({ hid, ce });
|
||||
topFive.push({ hid, ce, hero: heroId });
|
||||
} else if (topFive.length == 5) {
|
||||
if (ce > topFive[topFive.length - 1].ce) { // 跻身最强5人
|
||||
topFive.pop();
|
||||
topFive.push({ hid, ce });
|
||||
topFive.push({ hid, ce, hero: heroId });
|
||||
}
|
||||
} else {
|
||||
topFive.splice(5, topFive.length - 5);
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 体力系统
|
||||
*/
|
||||
import { PvpDefenseModel, Heroes, OppPlayers } from '../db/pvpDefense';
|
||||
import { RoleType } from '../db/Role';
|
||||
export async function initPvpInfo(role: RoleType) {
|
||||
let heroes: Array<Heroes> = [];
|
||||
//初始化最强5人阵容
|
||||
for (let i = 1; i <= role.topFive.length; i++) {
|
||||
let item = role.topFive[i - 1];
|
||||
if (item.hid) {
|
||||
heroes.push({
|
||||
actorId: item.hid,
|
||||
hero: item.hero,
|
||||
ce: item.ce,
|
||||
pos: i,
|
||||
order: i,
|
||||
});
|
||||
}
|
||||
}
|
||||
//初始化对手人阵容TODO
|
||||
let oppPlayers: Array<OppPlayers> = [];
|
||||
|
||||
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, heroes, oppPlayers, defCe: role.topFiveCe });
|
||||
//加入排行榜 TODO
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function checkPvp(role: RoleType) {
|
||||
let result = await PvpDefenseModel.findByRoleId(role.roleId);
|
||||
if (!!result)
|
||||
return result;
|
||||
result = await initPvpInfo(role);
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user