import { STEP_CHEST_LEVEL, STEP_CHEST_RATE, STEP_SCORE_MAX, STEP_SCORE_MIN } from 'common/Constants' import { ActivityChest, ChestStatusEnum } from 'models/ActivityChest' import { ZError } from 'zutils' const chestCfg = require('../../configs/chest.json') const chestLevelMap = new Map() for (let cfg of chestCfg.chests) { chestLevelMap.set(cfg.level, cfg) } export const generateNewChest = (uid: string, activity: string, level = 1, status = ChestStatusEnum.LOCKED) => { let cfg = chestLevelMap.get(level) if (!cfg) { throw new ZError(11, 'chest cfg not found') } let scoreInit = Math.floor(Math.random() * (cfg.initScoreMax - cfg.initScoreMin + 1) + cfg.initScoreMin) let chest = new ActivityChest({ user: uid, activity: activity, level: level, maxBounsCount: cfg.maxBounsCount, bounsCfg: cfg.bounsCfg, scoreInit, status, }) return chest } export const generateChestLevel = function (): number { const levelDefine = STEP_CHEST_LEVEL let randomLevel = Math.floor(Math.random() * levelDefine[levelDefine.length - 1]) let level = 1 for (let i = 0; i < levelDefine.length; i++) { if (randomLevel < levelDefine[i]) { level = i + 1 break } } return level } export const generateStepReward = (uid: string, activity: string, step: number) => { let score = 0 let chests = [] for (let i = 0; i < step; i++) { score += Math.floor(Math.random() * (STEP_SCORE_MAX - STEP_SCORE_MIN + 1) + STEP_SCORE_MIN) if (Math.random() < STEP_CHEST_RATE) { let randomLevel = generateChestLevel() let chest = generateNewChest(uid, activity, randomLevel, ChestStatusEnum.NORMAL) chests.push(chest) } } return { score, chests } }