import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; import { EXPEDITION_WAR_RECORD_STATUS } from '../consts'; 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 }) dataId: number; // 战场中唯一指向武将的代码 @prop({ required: true }) hp: number; // 生命 @prop({ required: true }) ap: number; // 怒气 } /** * 远征记录 */ @index({ expeditionCode: 1, expeditionId: 1 }) export default class ExpeditionWarRecord extends BaseModel { @prop({ required: true, default: '' }) roleId: string; // 角色 id @prop({ required: true, default: '' }) expeditionCode: string; // 远征的唯一标识 @prop({ required: true, default: 0 }) expeditionId: number; // 远征序号 @prop({ required: true, default: 0 }) battleId: number; // 相关关卡id @prop({ required: true, default: '' }) battleCode: string; // 关联关卡唯一值 @prop({ required: true, default: 0 }) battleStatus: number; // 是否通过, -1-已生成 0-可挑战 1-成功 2-挑战失败 @prop({ required: true, default: 0 }) enemyFrom: number; // 敌军数据来源:1-配表的敌军队,2-玩家 @prop({ required: true, default: '' }) enemyId: string; // 敌军队伍id或玩家id @prop({ required: true, type: Enemies, default: [], _id: false }) enemies: Array; // 敌军数据 @prop({ required: true, type: EnemiesCurHPAP, default: [], _id: false }) enemiesCurHpAp: Array; // 敌军数据 @prop({ required: true, default: 0 }) ce: number; // 敌军战力 public static async getRecordByCode(expeditionCode: string, lean = true) { const result: ExpeditionWarRecordType[] = await ExpeditionWarRecordModel.find({ expeditionCode, battleStatus: {$gte: EXPEDITION_WAR_RECORD_STATUS.WAITING} }).select('expeditionId battleId battleCode battleStatus ce').sort({expeditionId: 1}).lean(lean); return result; } public static async getRecordByCodeAndId(expeditionCode: string, expeditionId: number, lean = true) { const result: ExpeditionWarRecordType = await ExpeditionWarRecordModel.findOne({ expeditionCode, expeditionId }).select('expeditionId battleId battleCode battleStatus enemyFrom enemies enemiesCurHpAp ce').lean(lean); return result; } public static async saveRecord(expeditionCode: string, expeditionId: number, params: {roleId: string, battleId: number, enemyFrom: number, enemyId: string, enemies: Array, battleStatus: number}, lean = true) { const doc = new ExpeditionWarRecordModel(); const update = Object.assign(doc.toJSON(), params, {expeditionCode, expeditionId}); const result: ExpeditionWarRecordType = await ExpeditionWarRecordModel.findOneAndUpdate({ expeditionCode, expeditionId }, update, {new: true, upsert: true}).select('expeditionId battleId battleCode battleStatus enemyFrom enemies enemiesCurHpAp ce').lean(lean); return result; } public static async updateStatus(expeditionCode: string, expeditionId: number, battleStatus: number, lean = true) { const result: ExpeditionWarRecordType = await ExpeditionWarRecordModel.findOneAndUpdate({ expeditionCode, expeditionId }, {battleStatus}, {new: true}).lean(lean); return result; } public static async updateBattleCode(expeditionCode: string, expeditionId: number, battleStatus: number, battleCode: string, lean = true) { const result: ExpeditionWarRecordType = await ExpeditionWarRecordModel.findOneAndUpdate({ expeditionCode, expeditionId }, {battleStatus, battleCode}, {new: true}).lean(lean); return result; } public static async updateEnemiesStatus(expeditionCode: string, expeditionId: number, battleStatus: number, enemies: Array<{dataId: number, hp: number, ap: number}>, lean = true) { const result: ExpeditionWarRecordType = await ExpeditionWarRecordModel.findOneAndUpdate( {expeditionCode, expeditionId}, {$set: {battleStatus}, enemiesCurHpAp: enemies}, {new: true} ).lean(lean); return result; } public static async deleteAccount(roleId: string) { let result = await ExpeditionWarRecordModel.deleteMany({roleId}); return result; } } export const ExpeditionWarRecordModel = getModelForClass(ExpeditionWarRecord); export interface ExpeditionWarRecordType extends Pick, keyof ExpeditionWarRecord>{};