助力后给新用户一个锁住的箱子

This commit is contained in:
CounterFire2023 2024-03-26 14:07:44 +08:00
parent a0ba5249fc
commit 4e48150c1e
3 changed files with 41 additions and 16 deletions

View File

@ -5,8 +5,7 @@
"name": "Wooden Chest",
"initScoreMin": 10,
"initScoreMax": 50,
"maxBonus": 10,
"minBonus": 5,
"bounsCfg": [5, 10],
"maxBounsCount": 10
},
{
@ -14,8 +13,7 @@
"name": "Iron Chest",
"initScoreMin": 20,
"initScoreMax": 60,
"maxBonus": 20,
"minBonus": 10,
"bounsCfg": [10, 20],
"maxBounsCount": 15
},
{
@ -23,8 +21,7 @@
"name": "Bronze Chest",
"initScoreMin": 30,
"initScoreMax": 80,
"maxBonus": 30,
"minBonus": 15,
"bounsCfg": [15,30],
"maxBounsCount": 20
},
{
@ -32,8 +29,7 @@
"name": "Sliver Chest",
"initScoreMin": 40,
"initScoreMax": 100,
"maxBonus": 40,
"minBonus": 20,
"bounsCfg": [20, 40],
"maxBounsCount": 50
}
]

View File

@ -1,5 +1,5 @@
import { ZError, SyncLocker, ZRedisClient, BaseController, ROLE_ANON, role, router } from 'zutils'
import { ActivityChest } from 'models/ActivityChest'
import { ActivityChest, ChestStatusEnum } from 'models/ActivityChest'
import { ActivityUser } from 'models/ActivityUser'
import { mongoose } from '@typegoose/typegoose'
import { rankKey, rankLevel, updateRankScore } from 'services/rank.svr'
@ -12,6 +12,25 @@ const chestLevelMap = new Map()
for (let cfg of chestCfg.chests) {
chestLevelMap.set(cfg.level, cfg)
}
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.scoreMax - cfg.scoreMin + 1) + cfg.scoreMin)
let chest = new ActivityChest({
user: uid,
activity: activity,
level: level,
maxBounsCount: cfg.maxBounsCount,
bounsCfg: cfg.bounsCfg,
scoreInit,
status,
})
return chest
}
/**
*
*/
@ -78,7 +97,7 @@ class BoxController extends BaseController {
const session = await mongoose.startSession()
session.startTransaction()
try {
// TODO:: 检查用户是否符合助力条件
// TODO:: 待规则确定后, 检查用户是否符合助力条件
const chest = await ActivityChest.findOne({ shareCode: code, activity: user.activity }).session(session)
if (chest.bonusUsers.includes(uid)) {
throw new ZError(10, 'user already enhanced')
@ -86,10 +105,10 @@ class BoxController extends BaseController {
if (chest.bonusUsers.length >= chest.maxBounsCount) {
throw new ZError(12, 'enhanced times exceed')
}
if (chest.status === 9) {
if (chest.status === ChestStatusEnum.OPENED) {
throw new ZError(13, 'chest already opened')
}
if (chest.status === 0) {
if (chest.status === ChestStatusEnum.LOCKED) {
throw new ZError(14, 'chest is locked')
}
if (chest.user === uid) {
@ -100,7 +119,12 @@ class BoxController extends BaseController {
chest.bonusScores.push(score)
chest.scoreBonus += score
await chest.save({ session })
// TODO:: 新用户给一个锁住的箱子
const chestsForUser = await ActivityChest.find({ user: uid, activity: user.activity }).session(session)
// 如果用户没有宝箱, 则说明用户是新用户, 生成一个宝箱
if (chestsForUser.length === 0) {
const newChest = generateNewChest(uid, user.activity, 1, ChestStatusEnum.LOCKED)
await newChest.save({ session })
}
await session.commitTransaction()
session.endSession()
return {

View File

@ -5,6 +5,11 @@ import { BaseModule } from './Base'
import { convert } from 'zutils/utils/number.util'
const alphabet = '3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI'
export enum ChestStatusEnum {
LOCKED = 0,
NORMAL = 1,
OPENED = 9,
}
/**
*
*/
@ -33,14 +38,14 @@ class ActivityChestClass extends BaseModule {
@prop()
public shareCode: string
// 0 锁定, 1 未开启 9 已开启
@prop({ default: 0 })
public status: number
@prop({ enum: ChestStatusEnum, default: ChestStatusEnum.LOCKED })
public status: ChestStatusEnum
@prop()
public user: string
@prop()
public activity: string
// 品级
@prop({ default: 0 })
@prop({ default: 1 })
public level: number
// 最大助力次数
@prop()