56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
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 }
|
|
}
|