task-svr/src/services/game.svr.ts
CounterFire2023 689ad09734 bug fix
2024-03-26 18:32:03 +08:00

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 }
}