fix pvp刷新对手时保存数据
This commit is contained in:
@@ -1,44 +1,8 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { EXPEDITION_WAR_RECORD_STATUS } from '../consts';
|
||||
import { Enemies } from './generalField'
|
||||
|
||||
class Enemies {
|
||||
@prop({ required: true })
|
||||
actorId: number; // 敌人id
|
||||
@prop({ required: false })
|
||||
actorName: string; // 敌人名
|
||||
@prop({ required: false })
|
||||
dataId: number; // 战场中唯一指向武将的代码
|
||||
@prop({ required: false })
|
||||
relation: number; // 角色属于我方还是地方
|
||||
@prop({ required: false })
|
||||
outIndex: number; // 程序将信息存入数组顺序
|
||||
@prop({ required: false })
|
||||
x: number; // 战场x坐标
|
||||
@prop({ required: false })
|
||||
y: number; // 战场y坐标
|
||||
@prop({ required: false })
|
||||
direction: number; // 朝向
|
||||
@prop({ required: false })
|
||||
var: number; // 变量
|
||||
@prop({ required: false })
|
||||
lv: number; // 角色等级
|
||||
@prop({ required: false })
|
||||
hide: number; // 是否隐藏
|
||||
@prop({ required: false })
|
||||
initial_ai: number; // AI类型
|
||||
@prop({ required: true })
|
||||
attribute: {hp: number, atk: number, matk: number, def: number, mdef: number, agi: number, luk: number, speed: number, hit: number, cri: number, flee: number, antCri: number, damageIncrease: number, damageDecrease: number, defIgnore: number, bloodSuck: number, ap: number}; // 属性
|
||||
@prop({ required: false })
|
||||
skill: string; // 技能
|
||||
@prop({ required: false })
|
||||
seid: string; // 技能
|
||||
@prop({ required: false })
|
||||
star: number; // 角色星级
|
||||
@prop({ required: false })
|
||||
spine: string; // S动画
|
||||
|
||||
}
|
||||
|
||||
class EnemiesCurHPAP {
|
||||
@prop({ required: true })
|
||||
@@ -72,7 +36,7 @@ export default class ExpeditionWarRecord extends BaseModel {
|
||||
@prop({ required: true, default: '' })
|
||||
enemyId: string; // 敌军队伍id或玩家id
|
||||
@prop({ required: true, type: Enemies, default: [], _id: false })
|
||||
enemies: Array<Enemies>; // 敌军数据
|
||||
enemies: Array<Enemies>; // 敌军数据
|
||||
@prop({ required: true, type: EnemiesCurHPAP, default: [], _id: false })
|
||||
enemiesCurHpAp: Array<EnemiesCurHPAP>; // 敌军数据
|
||||
@prop({ required: true, default: 0 })
|
||||
|
||||
@@ -2,8 +2,8 @@ import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typegoose/typegoose';
|
||||
import Hero, { } from './Hero';
|
||||
import Role, { } from './Role';
|
||||
import PvpDef, { } from './PvpDefense';
|
||||
import { PVP_PLAYER_POS, PVP_HERO_POS } from '../consts';
|
||||
import PvpHistoryOpp from './PvpHistoryOpp';
|
||||
|
||||
export interface pvpUpdateInter {
|
||||
_id?: string;
|
||||
@@ -91,14 +91,12 @@ export class Robot {
|
||||
export class OppPlayers {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ ref: 'PvpDefense', type: mongoose.Schema.Types.ObjectId })
|
||||
oppDef: Ref<PvpDef>;
|
||||
@prop({ ref: 'PvpHistoryOpp', type: mongoose.Schema.Types.ObjectId })
|
||||
oppDef: Ref<PvpHistoryOpp>;
|
||||
@prop({ required: true })
|
||||
pos: number;
|
||||
@prop({ required: true })
|
||||
isRobot: boolean;
|
||||
@prop({ required: true, type: Robot, default: null, _id: false })
|
||||
robot: Robot
|
||||
}
|
||||
|
||||
export class HeroScores {
|
||||
@@ -136,7 +134,7 @@ export default class PvpDefense extends BaseModel {
|
||||
isDefaultHero: boolean;
|
||||
@prop({ required: true, default: 0 })
|
||||
refOppCnt: number; // 刷新对手总次数,消耗可根据消耗表算出
|
||||
@prop({ required: true, default: 0 })
|
||||
@prop({ required: true, default: new Date() })
|
||||
refOppTime: Date; // 刷新对手时间
|
||||
@prop({ required: true, default: 0 })
|
||||
challengeCnt: number; // 可挑战次数
|
||||
@@ -159,7 +157,7 @@ export default class PvpDefense extends BaseModel {
|
||||
|
||||
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 } })
|
||||
.populate('role', 'headHid sHid topFiveCe roleId roleName')
|
||||
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
|
||||
.populate('heroes.hero')
|
||||
.sort({ updatedAt: -1 }).limit(100).lean(lean);
|
||||
return result;
|
||||
@@ -203,15 +201,9 @@ export default class PvpDefense extends BaseModel {
|
||||
|
||||
public static async findByRoleIdIncludeAll(roleId: string) {
|
||||
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
|
||||
.populate('role', 'headHid sHid topFiveCe roleId roleName')
|
||||
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
|
||||
.populate('heroes.hero')
|
||||
.populate({
|
||||
path: 'oppPlayers.oppDef',
|
||||
populate: {
|
||||
path: 'role heroes.hero',
|
||||
select: 'headHid sHid topFiveCe roleId roleName hid ceAttr globalCeAttr'
|
||||
}
|
||||
}).lean();
|
||||
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName headHid sHid rankLv pLv defCe heroes').lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -223,13 +215,8 @@ export default class PvpDefense extends BaseModel {
|
||||
public static async updateInfoAndInclude(roleId: string, update: pvpUpdateInter) {
|
||||
delete update._id;
|
||||
let result: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId}, {$set:update}, {new: true})
|
||||
.populate({
|
||||
path: 'oppPlayers.oppDef',
|
||||
populate: {
|
||||
path: 'role',
|
||||
select: 'headHid sHid topFiveCe roleId roleName'
|
||||
}
|
||||
}).lean();
|
||||
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
|
||||
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName headHid sHid rankLv pLv defCe').lean();
|
||||
return result;
|
||||
}
|
||||
public static async updateInfo(roleId: string, update: pvpUpdateInter, lean = true) {
|
||||
|
||||
67
shared/db/PvpHistoryOpp.ts
Normal file
67
shared/db/PvpHistoryOpp.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
|
||||
import { PvpEnemies } from './generalField';
|
||||
|
||||
export class HeroScores {
|
||||
@prop({ required: true })
|
||||
hid: number;
|
||||
@prop({ required: true })
|
||||
score: number;
|
||||
}
|
||||
|
||||
@index({ roleId: 1 })
|
||||
export default class PvpHistoryOpp extends BaseModel {
|
||||
@prop({ required: true })
|
||||
roleId: string; // 玩家id
|
||||
@prop({ required: true })
|
||||
pos: number; // 对手位置
|
||||
@prop({ required: true })
|
||||
oppRoleId: string; // 对手角色 id
|
||||
@prop({ required: true })
|
||||
roleName: string; // 角色名称
|
||||
@prop({ required: true, default: 19 })
|
||||
headHid: number; // 对手头像
|
||||
@prop({ required: true, default: 19 })
|
||||
sHid: number; // 对手形象
|
||||
@prop({ required: true, default: 0 })
|
||||
score: number; // 对手军功
|
||||
@prop({ required: true, default: 1 })
|
||||
pLv: number; // 对手等级
|
||||
@prop({ required: true, default: 1 })
|
||||
lv: number; // 对手角色等级
|
||||
@prop({ required: true, default: 1 })
|
||||
title: number; // 对手等级
|
||||
@prop({ required: true, default: 0 })
|
||||
defCe: number; // 防守战力
|
||||
@prop({ required: true, default: 0 })
|
||||
rankLv: number; // 对手排名
|
||||
@prop({ required: true, type: PvpEnemies, default: [] })
|
||||
heroes: PvpEnemies[]; // 对手阵容
|
||||
@prop({ required: true, default: 0 })
|
||||
status: number; // 状态 0-仅刷出 1-挑战过
|
||||
|
||||
public static async createPvpOpp(params: PvpOppCreateParam, lean = true) {
|
||||
const doc = new PvpHistoryOppModel();
|
||||
const update = Object.assign(doc.toJSON(), params);
|
||||
delete update._id;
|
||||
const defense: PvpHistoryOppType = await PvpHistoryOppModel.findOneAndUpdate({ roleId: params.roleId, pos: params.pos }, update, { upsert: true, new: true }).lean(lean);
|
||||
return defense;
|
||||
}
|
||||
|
||||
public static async findByRoleIdAndOppId(roleId: string, oppRoleId: string) {
|
||||
const result: PvpHistoryOppType = await PvpHistoryOppModel.findOne({ roleId, oppRoleId, status: 0 }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async setStatus(roleId: string, oppRoleId: string, status: number) {
|
||||
const result: PvpHistoryOppType = await PvpHistoryOppModel.findOneAndUpdate({ roleId, oppRoleId }, {status}, {new: true}).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const PvpHistoryOppModel = getModelForClass(PvpHistoryOpp);
|
||||
|
||||
export interface PvpHistoryOppType extends Pick<DocumentType<PvpHistoryOpp>, keyof PvpHistoryOpp> { };
|
||||
export type PvpOppCreateParam = Partial<PvpHistoryOppType>; // 将所有字段变成可选项
|
||||
@@ -2,6 +2,7 @@ import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { getBeforeDayDate } from '../pubUtils/timeUtil';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
import { PvpHeroInfo } from './generalField';
|
||||
|
||||
export class HeroesRecord {
|
||||
@prop({ required: true, default: 0 })
|
||||
@@ -20,6 +21,17 @@ export class HeroesRecord {
|
||||
heal: number; // 治疗
|
||||
@prop({ required: true, default: 0 })
|
||||
underDamage: number; // 承伤
|
||||
|
||||
constructor(pvpHero: PvpHeroInfo, damage: number, heal: number, underDamage: number) {
|
||||
this.hid = pvpHero.actorId;
|
||||
this.quality = pvpHero.quality;
|
||||
this.star = pvpHero.star;
|
||||
this.colorStar = pvpHero.colorStar;
|
||||
this.lv = pvpHero.lv;
|
||||
this.damage = damage;
|
||||
this.heal = heal;
|
||||
this.underDamage = underDamage;
|
||||
}
|
||||
}
|
||||
|
||||
export class PlayerInfo {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { prop } from '@typegoose/typegoose';
|
||||
import { DicWarJson } from '../pubUtils/dictionary/DicWarJson';
|
||||
import { HeroType } from './Hero';
|
||||
|
||||
export class CeAttrData {
|
||||
@prop({ required: true })
|
||||
@@ -120,3 +122,125 @@ export class CeAttrNumber {
|
||||
bloodSuck?: number = 0;
|
||||
}
|
||||
|
||||
// 从玩家数据中覆盖warjson的部分字段
|
||||
export class PvpHeroInfo {
|
||||
@prop({ required: true })
|
||||
actorId?: number = 0; // 敌人id
|
||||
@prop({ required: false })
|
||||
actorName?: string = ""; // 敌人名
|
||||
@prop({ required: false })
|
||||
outIndex?: number = 0; // 程序将信息存入数组顺序
|
||||
@prop({ required: false })
|
||||
star?: number = 0; // 角色星级
|
||||
@prop({ required: false })
|
||||
lv?: number = 0; // 角色等级
|
||||
@prop({ required: false })
|
||||
skill?: string = "0"; // 技能
|
||||
@prop({ required: false })
|
||||
seid?: string = "&"; // 技能
|
||||
@prop({ required: false })
|
||||
spine?: string = "0"; // S动画
|
||||
@prop({ required: false })
|
||||
colorStar?: number = 0; // 觉醒
|
||||
@prop({ required: false })
|
||||
quality?: number = 0; // 品质
|
||||
|
||||
@prop({ required: true, _id: false, default: new CeAttrNumber() })
|
||||
attribute?: CeAttrNumber; // 属性
|
||||
|
||||
setHeroInfo(hero: HeroType) {
|
||||
this.actorId = hero.hid;
|
||||
this.actorName = hero.hName;
|
||||
this.star = hero.star;
|
||||
this.lv = hero.lv;
|
||||
this.colorStar = hero.colorStar;
|
||||
this.quality = hero.quality;
|
||||
}
|
||||
|
||||
setRobotInfo(warjson: DicWarJson, lv: number, initialStar: number, quality: number) {
|
||||
this.actorId = warjson.actorId;
|
||||
this.actorName = warjson.actorName;
|
||||
this.star = initialStar;
|
||||
this.lv = lv;
|
||||
this.quality = quality;
|
||||
}
|
||||
|
||||
setAttribute(attribute: CeAttrNumber) {
|
||||
this.attribute = attribute;
|
||||
}
|
||||
|
||||
setOutIndex(order: number) {
|
||||
this.outIndex = order;
|
||||
}
|
||||
}
|
||||
|
||||
// 远征敌军
|
||||
export class Enemies extends PvpHeroInfo {
|
||||
@prop({ required: true })
|
||||
actorId: number; // 敌人id
|
||||
@prop({ required: false })
|
||||
actorName: string; // 敌人名
|
||||
@prop({ required: false })
|
||||
dataId: number; // 战场中唯一指向武将的代码
|
||||
@prop({ required: false })
|
||||
relation: number; // 角色属于我方还是地方
|
||||
@prop({ required: false })
|
||||
x: number; // 战场x坐标
|
||||
@prop({ required: false })
|
||||
y: number; // 战场y坐标
|
||||
@prop({ required: false })
|
||||
direction: number; // 朝向
|
||||
@prop({ required: false })
|
||||
var: number; // 变量
|
||||
@prop({ required: false })
|
||||
hide: number; // 是否隐藏
|
||||
@prop({ required: false })
|
||||
initial_ai: number; // AI类型
|
||||
|
||||
// warjson 出兵表
|
||||
// heroInfo 覆盖掉出兵表的相应参数
|
||||
constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo) {
|
||||
super();
|
||||
this.actorId = heroInfo.actorId != undefined? heroInfo.actorId: warjson.actorId;
|
||||
this.actorName = heroInfo.actorName != undefined? heroInfo.actorName: warjson.actorName;
|
||||
this.dataId = warjson.dataId;
|
||||
this.relation = warjson.relation;
|
||||
this.outIndex = heroInfo.outIndex != undefined? heroInfo.outIndex: warjson.outIndex;
|
||||
this.x = warjson.x;
|
||||
this.y = warjson.y;
|
||||
this.direction = warjson.direction;
|
||||
this.var = warjson.var;
|
||||
this.lv = heroInfo.lv != undefined? heroInfo.lv: warjson.lv;
|
||||
this.hide = warjson.hide;
|
||||
this.initial_ai = warjson.initial_ai;
|
||||
this.attribute = heroInfo.attribute;
|
||||
this.skill = heroInfo.skill != undefined? heroInfo.skill: warjson.skill;
|
||||
this.seid = heroInfo.seid != undefined? heroInfo.seid: warjson.seid;
|
||||
this.star = heroInfo.star != undefined? heroInfo.star: warjson.star;
|
||||
this.spine = heroInfo.spine!= undefined? heroInfo.spine: warjson.spine;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class PvpEnemies extends Enemies {
|
||||
@prop({ required: true })
|
||||
star: number;
|
||||
@prop({ required: true })
|
||||
colorStar: number;
|
||||
@prop({ required: true })
|
||||
quality: number;
|
||||
@prop({ required: true })
|
||||
lv: number;
|
||||
@prop({ required: true })
|
||||
score: number;
|
||||
|
||||
// score: 这个武将的军功
|
||||
constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo, score: number) {
|
||||
super(warjson, heroInfo);
|
||||
this.star = heroInfo.star;
|
||||
this.colorStar = heroInfo.colorStar;
|
||||
this.quality = heroInfo.quality;
|
||||
this.lv = heroInfo.lv;
|
||||
this.score = score;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
import { RoleType } from "../db/Role";
|
||||
import { Robot } from "../db/PvpDefense";
|
||||
import { reduceCe } from "./util";
|
||||
import { PvpHeroInfo, PvpEnemies } from "../db/generalField";
|
||||
|
||||
export interface RewardInter {
|
||||
id: number;
|
||||
@@ -121,13 +122,22 @@ export class RankParam {
|
||||
}
|
||||
}
|
||||
|
||||
export interface PlayerDetailHero {
|
||||
export class PlayerDetailHero {
|
||||
actorId: number;
|
||||
lv: number;
|
||||
star: number;
|
||||
colorStar: number;
|
||||
quality: number;
|
||||
score: number;
|
||||
|
||||
setPvpHeroInfo?(hero: PvpEnemies) {
|
||||
this.actorId = hero.actorId;
|
||||
this.lv = hero.lv;
|
||||
this.star = hero.star;
|
||||
this.colorStar = hero.colorStar;
|
||||
this.quality = hero.quality;
|
||||
this.score = hero.score;
|
||||
}
|
||||
}
|
||||
|
||||
export class PlayerDetail {
|
||||
|
||||
@@ -8,7 +8,7 @@ import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
|
||||
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
|
||||
|
||||
import { findIndex } from 'underscore';
|
||||
|
||||
const randomName = require("chinese-random-name");
|
||||
const moment = require('moment');
|
||||
|
||||
export function genCode(len) {
|
||||
@@ -516,3 +516,7 @@ export function getAllAttrStage() {
|
||||
};
|
||||
return attrs;
|
||||
}
|
||||
|
||||
export function getChineseName() {
|
||||
return randomName.generate()
|
||||
}
|
||||
Reference in New Issue
Block a user