import BaseModel from './BaseModel'; import { index, getModelForClass, prop } from '@typegoose/typegoose'; 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动画 } /** * 远征记录 */ @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; // 是否通过, 0-挑战中 1-成功 2-挑战失败 @prop({ required: true, default: false }) received: boolean; // 本关战胜后宝箱是否领取 @prop({ required: true, default: false }) reward: string; // 领取的宝箱奖励 @prop({ required: true, default: 0 }) enemyFrom: number; // 敌军数据来源:1-配表的敌军队,2-玩家 @prop({ required: true, default: '' }) enemyId: string; // 敌军队伍id或玩家id @prop({ required: true, type: Enemies, default: [] }) enemies: Array; // 敌军数据 public static async getRecordByCode(expeditionCode: string, lean = true) { const result = await ExpeditionWarRecordModel.find({ expeditionCode }).select('expeditionId battleId battleCode battleStatus received').sort({expeditionId: 1}).lean(lean); return result; } public static async getRecordByCodeAndId(expeditionCode: string, expeditionId: number, lean = true) { const result = await ExpeditionWarRecordModel.findOne({ expeditionCode, expeditionId }).select('expeditionId battleId battleCode battleStatus received enemyFrom enemies').lean(lean); return result; } public static async saveRecord(expeditionCode: string, expeditionId: number, params: {roleId: string, battleId: number, enemyFrom: number, enemyId: string, enemies: Array}, lean = true) { const doc = new ExpeditionWarRecordModel(); const update = Object.assign(doc.toJSON(), params, {expeditionCode, expeditionId}); const result = await ExpeditionWarRecordModel.findOneAndUpdate({ expeditionCode, expeditionId }, update, {new: true, upsert: true}).select('expeditionId battleId battleCode battleStatus received enemyFrom enemies').lean(lean); return result; } public static async updateStatus(expeditionCode: string, expeditionId: number, battleStatus: number, battleCode: string, lean = true) { const result = 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) { for(let {dataId, hp, ap} of enemies) { console.log('updateEnemiesStatus',ap) await ExpeditionWarRecordModel.findOneAndUpdate( {expeditionCode, expeditionId, 'enemies.dataId': dataId }, {$set: {'enemies.$.attribute.hp': hp, 'enemies.$.attribute.ap': ap}} ) } const result = ExpeditionWarRecordModel.findOneAndUpdate( {expeditionCode, expeditionId}, {$set: {battleStatus}}, {new: true} ).lean(lean); return result; } public static async updateBoxStatus(expeditionCode: string, expeditionId: number, received: boolean, reward: string, lean = true) { const result = await ExpeditionWarRecordModel.findOneAndUpdate({ expeditionCode, expeditionId }, {received, reward}, {new: true}).lean(lean); return result; } } export const ExpeditionWarRecordModel = getModelForClass(ExpeditionWarRecord);