Files
ZYZ/shared/db/RougelikeRecord.ts
T

109 lines
4.1 KiB
TypeScript

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>; // 将所有字段变成可选项