// 节日活动 - 火神祭祀 import { ActivityModelType } from '../../db/Activity'; import { ActivityForgeModelType } from '../../db/ActivityForge'; import { parseGoodStr } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; // 后台格式 interface ForgeManualInDb { id: number; // 图谱id name: string; // 图谱名 imageName: string; // 图片 dayIndex: number; // 第几天解锁 material: string; // 配方比例id&count totalMaterialCnt: number; // 最大材料数量 quality: number; // 品质 reward: string; // 铸造成功可获得的奖励,id&count freeCnt: number; // 可免费铸造次数(总) maxBuyCnt: number; // 最大可购买次数(总) } interface ForgeHintInDb { failCnt: number; hintType: number; // 1-提示总额 2-提示材料多了还是少了 3-材料具体配比提示 } interface ForgeDataInDb { manuals: ForgeManualInDb[]; // 图谱 consume: string; // 购买铸造次数消耗的元宝 hint: ForgeHintInDb[]; // 失败提示法 } // 商品数据 export class ForgeManual { id: number; // 图谱id name: string; // 图谱名 imageName: string; // 图片 dayIndex: number; // 第几天解锁 material: string; // id&count,正确的配比 reward: string; // 铸造成功可获得的奖励,id&count freeCnt: number; // 可免费铸造次数 maxBuyCnt: number; // 今天可以购买的次数 totalMaterialCnt: number; // 最大材料数量 quality: number; // 品质 buildCnt: number = 0; // 已经铸造了的次数 buildCnt < freeCnt + buyCnt buyCnt: number = 0; // 今天已购买次数 failCnt: number = 0; // 猜错的次数 hintType: number = 0; // 应该给的提示类型 1-总数提示 2-材料多了少了的提示 3-具体配比提示 constructor(data: ForgeManualInDb) { this.id = data.id; this.name = data.name; this.imageName = data.imageName; this.dayIndex = data.dayIndex; this.material = data.material; this.reward = data.reward; this.freeCnt = data.freeCnt; this.maxBuyCnt = data.maxBuyCnt; this.totalMaterialCnt = data.totalMaterialCnt; this.quality = data.quality; } public setPlayerData(playerData: ActivityForgeModelType, todayIndex: number, hintDic?: ForgeHintInDb[]) { this.buildCnt = playerData.buildCnt||0; this.buyCnt = playerData.buyCnt||0; let todayFailRecord = playerData.record?.filter(cur => cur.todayIndex == todayIndex && cur.isSuccess == false)||[]; this.failCnt = todayFailRecord.length; if(hintDic) this.calHintType(hintDic); } public calHintType(hintDic: ForgeHintInDb[]) { for(let { failCnt, hintType } of hintDic) { if(this.failCnt >= failCnt) { this.hintType = hintType; } } } public checkMaterial(playerMaterial: { id: number, count: number }[]) { let configMaterial = parseGoodStr(this.material); for(let { id, count } of configMaterial) { let playerCount = playerMaterial.find(cur => cur.id == id)?.count||0; if(playerCount != count) return false; } for(let { id, count } of playerMaterial) { let configCount = configMaterial.find(cur => cur.id == id)?.count||0; if(configCount != count) return false; } return true; } } export class ForgeData extends ActivityBase { manuals: ForgeManual[] = []; // 图谱 consume: string; // 购买铸造次数的消耗 hint: ForgeHintInDb[]; constructor(activityData: ActivityModelType, createTime: number, serverTime: number) { super(activityData, createTime, serverTime) this.initData(activityData.data) } public initData(data: string): void { let dataObj: ForgeDataInDb = JSON.parse(data); if(!dataObj) return; this.hint = dataObj.hint||[]; this.consume = dataObj.consume||''; for(let data of (dataObj.manuals||[])) { this.manuals.push(new ForgeManual(data)); } } public setPlayerRecords(playerData: ActivityForgeModelType[]) { for(let data of playerData) { let manual = this.manuals.find(cur => cur.id == data.manualId); if(manual) manual.setPlayerData(data, this.todayIndex); manual.calHintType(this.hint); } } public findManual(id: number) { return this.manuals.find(cur => cur.id == id); } public getShowResult() { return { ...this.getBaseKeys(), manuals: this.manuals, consume: this.consume } } }