Files
ZYZ/shared/domain/activityField/guideGachaField.ts
2022-08-01 20:06:37 +08:00

122 lines
3.9 KiB
TypeScript

import { ActivityModelType } from '../../db/Activity';
import { ActivityBase } from './activityField';
import { prop } from '@typegoose/typegoose';
import { getTimeFunM } from '../../pubUtils/timeUtil';
import { UserGachaType } from '../../db/UserGacha';
import { GUIDE_GACHA_STAGE } from '../../consts';
import { RECRUIT } from '../../pubUtils/dicParam';
export class SimpleResult {
@prop({ required: true })
planId: number;
@prop({ required: true })
hid: number;
@prop({ required: true })
isTransfer: boolean;
}
/**
* @description 特殊引导候选列表
* @memberof UserGacha
*/
export class Candidate {
@prop({ required: true })
id: number; // 列表id
@prop({ required: true })
isChosen: boolean; // 是否被选中
@prop({ required: true })
pullCnt: number; // 引导第几次保存的
@prop({ required: true, type: () => SimpleResult, _id: false })
list: SimpleResult[]; // 列表
constructor(id: number, pullCnt: number, result: SimpleResult[]) {
this.id = id;
this.isChosen = false;
this.pullCnt = pullCnt;
this.list = result;
}
}
interface GuideGachaDataInDb {
gachaId: number; // 抽卡卡池id
chooseTime: number; // 开始后几天内可以选卡
}
// 抽卡数据
export class GuideGachaData extends ActivityBase {
gachaId: number = 0;
stage: GUIDE_GACHA_STAGE = GUIDE_GACHA_STAGE.PULL;
chooseTime: number = 0;
pullCnt: number = 0;
hasChoosen: boolean = false;
latest: SimpleResult[] = [];
candidates: Candidate[] = [];
constructor(activityData: ActivityModelType, createTime: number, serverTime: number) {
super(activityData, createTime, serverTime);
this.initData(activityData.data);
}
public initData(data: string) {
let obj: GuideGachaDataInDb = JSON.parse(data);
this.gachaId = obj.gachaId;
this.chooseTime = <number>getTimeFunM(this.beginTime).getAfterDayWithHour(obj.chooseTime);
this.stage = Date.now() < this.chooseTime? GUIDE_GACHA_STAGE.PULL: GUIDE_GACHA_STAGE.DECIDE;
}
public setPlayerData(userGacha: UserGachaType) {
if(userGacha) {
this.pullCnt = userGacha.pullCnt;
this.candidates = userGacha.candidates;
this.hasChoosen = userGacha.candidates.findIndex(cur => cur.isChosen) != -1;
this.latest = userGacha.guideResultList;
}
}
public canPull() {
return this.stage == GUIDE_GACHA_STAGE.PULL && this.pullCnt < RECRUIT.RECRUIT_FIRST_RECRUIT;
}
public canDecide() {
return this.stage == GUIDE_GACHA_STAGE.DECIDE && !this.hasChoosen;
}
public chooseCandidate(id: number) {
let candidate = this.candidates.find(cur => cur.id == id);
if(!candidate) return false;
candidate.isChosen = true;
return candidate;
}
public setCandidate(id: number) {
if(!this.latest || this.latest.length == 0) return false;
let newObj = new Candidate(id, this.pullCnt, this.latest);
let index = this.candidates.findIndex(cur => cur.id == id);
if(index == -1) {
this.candidates.push(newObj);
} else {
this.candidates[index] = newObj;
}
return true
}
public autoSave() {
if(this.pullCnt - this.candidates.length + RECRUIT.RECRUIT_FIRST_RECRUIT_SAVE > RECRUIT.RECRUIT_FIRST_RECRUIT) {
for(let i = 1; i <= RECRUIT.RECRUIT_FIRST_RECRUIT_SAVE; i++) {
let candidate = this.candidates.find(cur => cur.id == i);
if(!candidate) {
this.candidates.push(new Candidate(i, this.pullCnt, this.latest));
return true;
}
}
}
return false;
}
public neverChoose() {
return this.stage == GUIDE_GACHA_STAGE.DECIDE && this.candidates.length <= 0;
}
}