Files
ZYZ/shared/db/RougelikeChara.ts

139 lines
5.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { COUNTER, ROUGELIKE_SKILLTYPE } from '../consts';
import BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
import { CounterModel } from './Counter';
export class Card {
@prop({ required: false })
index: number; // 卡槽没有那个index表示没有解锁
@prop({ required: false })
cardCode: string; //卡唯一code,为空串表示没安装
@prop({ required: false })
cardId: number; // 当为0的时候表示没有装入卡片
}
/**
* 每场获得角色(普通角色和高级角色)
*/
@index({ roleId: 1 })
@index({ gameCode: 1 })
@index({ gameCode: 1, charaCode: 1 })
export default class RougelikeChara extends BaseModel {
@prop({ required: true })
roleId: string; // 角色id
@prop({ required: true, default: '' })
gameCode: string; // 场次唯一code
@prop({ required: true, default: 0 })
seqId: number; // 角色卡排序
@prop({ required: true, default: '' })
charaCode: string; // 角色卡唯一id
@prop({ required: true, default: 0 })
charaId: number; // 角色卡id
@prop({ required: true, type: Card, default: [], _id: false })
cards: Card[];
@prop({ required: true, default: 0 })
hp: number; // 当前hp
@prop({ required: true, default: 0 })
maxHp: number; // 最大hp
@prop({ required: true, default: 0 })
ap: number; // 当前怒气
@prop({ required: true, default: 0 })
shield: number; // 盾
@prop({ required: true, default: 0 })
others: string; // 盾其他数据
@prop({ required: true, default: 0 })
roundSkill: number; // 玩家选择的回合技能卡
@prop({ required: true, default: 0 })
apSkill: number; // 玩家选择的怒气技能卡
@prop({ required: true, default: 0 })
getLayer: number; // 在哪一层获得的
@prop({ required: true, default: 0 })
getWay: number; // 在做什么的时候获得的
public static async createCharas(updateArr: RougelikeCharaPara[]) {
if (updateArr.length == 0) return [];
let num = await CounterModel.getNewCounterNum(COUNTER.ROUGE_CHARA, updateArr.length);
let resultArr: RougelikeCharaType[] = [];
for (let index = 0; index < updateArr.length; index++) {
let param = updateArr[index];
let seqId = num - updateArr.length + index + 1;
const { gameCode, charaCode } = param;
let data = await RougelikeCharaModel.findOneAndUpdate({ gameCode, charaCode }, { $set: { ...param, seqId } }, { new: true, upsert: true }).lean();
if (data) resultArr.push(data)
}
return resultArr
}
public static async updateByCode(gameCode: string, charaCode: string, params: { $set: RougelikeCharaPara }, lean = true) {
const result: RougelikeCharaType = await RougelikeCharaModel.findOneAndUpdate({ gameCode, charaCode }, params, { new: true }).lean(lean);
return result;
}
public static async findByGameCode(gameCode: string, lean = true) {
const result: RougelikeCharaType[] = await RougelikeCharaModel.find({ gameCode }).lean(lean);
return result;
}
public static async findByCode(gameCode: string, charaCode: string, lean = true) {
const result: RougelikeCharaType = await RougelikeCharaModel.findOne({ gameCode, charaCode }).lean(lean);
return result;
}
public static async findByCodes(gameCode: string, charaCodes: string[], lean = true) {
const result: RougelikeCharaType[] = await RougelikeCharaModel.find({ gameCode, charaCode: { $in: charaCodes } }).lean(lean);
return result;
}
public static async putOnOrOffSkillCard(gameCode: string, charaCode: string, skillType: ROUGELIKE_SKILLTYPE, id: number) {
if (skillType == ROUGELIKE_SKILLTYPE.AP) {
const result: RougelikeCharaType = await RougelikeCharaModel.findOneAndUpdate({ gameCode, charaCode }, { $set: { apSkill: id } }, { new: true }).lean();
return result;
} else {
const result: RougelikeCharaType = await RougelikeCharaModel.findOneAndUpdate({ gameCode, charaCode }, { $set: { roundSkill: id } }, { new: true }).lean();
return result;
}
}
public static async findByGameCodeAndCharaId(gameCode: string, charaId: number, lean = true) {
const result: RougelikeCharaType[] = await RougelikeCharaModel.find({ gameCode, charaId }).lean(lean);
return result;
}
public static async bulkWriteUpdate(updateArr: RougelikeCharaPara[]) {
if (updateArr.length == 0) return;
await RougelikeCharaModel.bulkWrite(updateArr.map((param) => {
delete param._id;
const { gameCode, charaCode } = param
return { updateOne: { filter: { gameCode, charaCode }, update: { $set: { ...param } }, upsert: true } }
}))
}
public static async deleteCharaByRoleId(roleId: string) {
let result = await RougelikeCharaModel.deleteMany({ roleId });
return result;
}
};
export const RougelikeCharaModel = getModelForClass(RougelikeChara);
export interface RougelikeCharaType extends Pick<DocumentType<RougelikeChara>, keyof RougelikeChara> { };
export type RougelikeCharaPara = Partial<RougelikeCharaType>; // 将所有字段变成可选项