Files
ZYZ/shared/db/RougelikeRecord.ts
2023-09-20 13:46:28 +08:00

109 lines
4.1 KiB
TypeScript
Raw 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 BaseModel from './BaseModel';
import { getModelForClass, prop, DocumentType, index } from '@typegoose/typegoose';
export class RewardInter {
@prop({ required: true })
id: number;
@prop({ required: true })
count: number;
@prop({ required: true })
expireTime?: number;
}
/**
* 每场获得的圣物&特性卡
*/
@index({ roleId: 1 })
@index({ gameCode: 1 })
@index({ roleId: 1, status: 1 })
export default class RougelikeRecord extends BaseModel {
@prop({ required: true })
roleId: string; // 角色id
@prop({ required: true, default: '' })
gameCode: string; // 每场唯一code
@prop({ required: true, default: 0 })
grade: number; // 难度
@prop({ required: true, default: 0 })
type: number; // 试炼类型
@prop({ required: true, default: 0 })
authorType: number; // 流派类型
@prop({ required: true, default: 0 })
maxLayer: number; // 总共多少层
@prop({ required: true, default: 0 })
curLayer: number; // 当前在第几层
@prop({ required: true, default: 0 })
status: number; // 0-选角色卡, 1-进行中 2-已达成
@prop({ required: true, default: 0 })
score: number; // 本场获得的积分
@prop({ required: true, type: RewardInter, default: [], _id: false })
takeoutReward: RewardInter[]; // 本场获得了的奖励灵石记录一下id&count
@prop({ required: true, default: false })
hasReceivedTakeout: boolean; // 是否已带出
@prop({ required: true, default: 0 })
coin: number; // 试炼币
@prop({ required: true, default: 0 })
coinTotal: number; // 试炼币累计值
@prop({ required: true, default: 0 })
techScore: number; // 科技分
// public static async updateByGameCode(gameCode: string, params: { $set: RougelikeRecordPara, $inc?: { coin?: number, score?: number, techScore?: number } }, lean = true) {
// let doc = new RougelikeRecordModel();
// let insert = Object.assign(doc);
// for (let key in params.$inc) {
// if (insert[key] != undefined) delete insert[key];
// }
// for (let key in params.$set) {
// if (insert[key] != undefined) delete insert[key];
// }
// const result: RougelikeRecordType = await RougelikeRecordModel.findOneAndUpdate({ gameCode }, { $setOnInsert: insert, ...params }, { new: true, upsert: true }).lean(lean);
// return result;
// }
public static async updateByGameCode(gameCode: string, params: { $set?: RougelikeRecordPara, $inc?: { coin?: number, coinTotal?: number, score?: number, techScore?: number } }, lean = true) {
const result: RougelikeRecordType = await RougelikeRecordModel.findOneAndUpdate({ gameCode }, params, { new: true, upsert: true }).lean(lean);
return result;
}
public static async findByGameCode(gameCode: string, lean = true) {
const result: RougelikeRecordType = await RougelikeRecordModel.findOne({ gameCode }).lean(lean);
return result;
}
public static async findByRoleIdAndStatus(roleId: string, status: number, lean = true) {
const result: RougelikeRecordType = await RougelikeRecordModel.findOne({ roleId, status: { $lt: status } }).lean(lean);
return result;
}
public static async takeout(gameCode: string) {
const result: RougelikeRecordType = await RougelikeRecordModel.findOneAndUpdate({ gameCode }, { $set: { hasReceivedTakeout: true } }, { new: true }).lean();
return result;
}
public static async costCoin(gameCode: string, costCoin: number) {
const result: RougelikeRecordType = await RougelikeRecordModel.findOneAndUpdate({ gameCode, coin: { $gte: costCoin } }, { $inc: { coin: -costCoin } }, { new: true }).lean();
return result;
}
};
export const RougelikeRecordModel = getModelForClass(RougelikeRecord);
export interface RougelikeRecordType extends Pick<DocumentType<RougelikeRecord>, keyof RougelikeRecord> { };
export type RougelikeRecordPara = Partial<RougelikeRecordType>; // 将所有字段变成可选项