助力后给新用户一个锁住的箱子
This commit is contained in:
parent
a0ba5249fc
commit
4e48150c1e
@ -5,8 +5,7 @@
|
|||||||
"name": "Wooden Chest",
|
"name": "Wooden Chest",
|
||||||
"initScoreMin": 10,
|
"initScoreMin": 10,
|
||||||
"initScoreMax": 50,
|
"initScoreMax": 50,
|
||||||
"maxBonus": 10,
|
"bounsCfg": [5, 10],
|
||||||
"minBonus": 5,
|
|
||||||
"maxBounsCount": 10
|
"maxBounsCount": 10
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -14,8 +13,7 @@
|
|||||||
"name": "Iron Chest",
|
"name": "Iron Chest",
|
||||||
"initScoreMin": 20,
|
"initScoreMin": 20,
|
||||||
"initScoreMax": 60,
|
"initScoreMax": 60,
|
||||||
"maxBonus": 20,
|
"bounsCfg": [10, 20],
|
||||||
"minBonus": 10,
|
|
||||||
"maxBounsCount": 15
|
"maxBounsCount": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -23,8 +21,7 @@
|
|||||||
"name": "Bronze Chest",
|
"name": "Bronze Chest",
|
||||||
"initScoreMin": 30,
|
"initScoreMin": 30,
|
||||||
"initScoreMax": 80,
|
"initScoreMax": 80,
|
||||||
"maxBonus": 30,
|
"bounsCfg": [15,30],
|
||||||
"minBonus": 15,
|
|
||||||
"maxBounsCount": 20
|
"maxBounsCount": 20
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -32,8 +29,7 @@
|
|||||||
"name": "Sliver Chest",
|
"name": "Sliver Chest",
|
||||||
"initScoreMin": 40,
|
"initScoreMin": 40,
|
||||||
"initScoreMax": 100,
|
"initScoreMax": 100,
|
||||||
"maxBonus": 40,
|
"bounsCfg": [20, 40],
|
||||||
"minBonus": 20,
|
|
||||||
"maxBounsCount": 50
|
"maxBounsCount": 50
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ZError, SyncLocker, ZRedisClient, BaseController, ROLE_ANON, role, router } from 'zutils'
|
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 { ActivityUser } from 'models/ActivityUser'
|
||||||
import { mongoose } from '@typegoose/typegoose'
|
import { mongoose } from '@typegoose/typegoose'
|
||||||
import { rankKey, rankLevel, updateRankScore } from 'services/rank.svr'
|
import { rankKey, rankLevel, updateRankScore } from 'services/rank.svr'
|
||||||
@ -12,6 +12,25 @@ const chestLevelMap = new Map()
|
|||||||
for (let cfg of chestCfg.chests) {
|
for (let cfg of chestCfg.chests) {
|
||||||
chestLevelMap.set(cfg.level, cfg)
|
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()
|
const session = await mongoose.startSession()
|
||||||
session.startTransaction()
|
session.startTransaction()
|
||||||
try {
|
try {
|
||||||
// TODO:: 检查用户是否符合助力条件
|
// TODO:: 待规则确定后, 检查用户是否符合助力条件
|
||||||
const chest = await ActivityChest.findOne({ shareCode: code, activity: user.activity }).session(session)
|
const chest = await ActivityChest.findOne({ shareCode: code, activity: user.activity }).session(session)
|
||||||
if (chest.bonusUsers.includes(uid)) {
|
if (chest.bonusUsers.includes(uid)) {
|
||||||
throw new ZError(10, 'user already enhanced')
|
throw new ZError(10, 'user already enhanced')
|
||||||
@ -86,10 +105,10 @@ class BoxController extends BaseController {
|
|||||||
if (chest.bonusUsers.length >= chest.maxBounsCount) {
|
if (chest.bonusUsers.length >= chest.maxBounsCount) {
|
||||||
throw new ZError(12, 'enhanced times exceed')
|
throw new ZError(12, 'enhanced times exceed')
|
||||||
}
|
}
|
||||||
if (chest.status === 9) {
|
if (chest.status === ChestStatusEnum.OPENED) {
|
||||||
throw new ZError(13, 'chest already opened')
|
throw new ZError(13, 'chest already opened')
|
||||||
}
|
}
|
||||||
if (chest.status === 0) {
|
if (chest.status === ChestStatusEnum.LOCKED) {
|
||||||
throw new ZError(14, 'chest is locked')
|
throw new ZError(14, 'chest is locked')
|
||||||
}
|
}
|
||||||
if (chest.user === uid) {
|
if (chest.user === uid) {
|
||||||
@ -100,7 +119,12 @@ class BoxController extends BaseController {
|
|||||||
chest.bonusScores.push(score)
|
chest.bonusScores.push(score)
|
||||||
chest.scoreBonus += score
|
chest.scoreBonus += score
|
||||||
await chest.save({ session })
|
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()
|
await session.commitTransaction()
|
||||||
session.endSession()
|
session.endSession()
|
||||||
return {
|
return {
|
||||||
|
@ -5,6 +5,11 @@ import { BaseModule } from './Base'
|
|||||||
import { convert } from 'zutils/utils/number.util'
|
import { convert } from 'zutils/utils/number.util'
|
||||||
const alphabet = '3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI'
|
const alphabet = '3fBCM8j17XNA9xYun4wmLWep2oHFlhPcgyEJskqOz6GK0UtV5ZRaDSvrTbidQI'
|
||||||
|
|
||||||
|
export enum ChestStatusEnum {
|
||||||
|
LOCKED = 0,
|
||||||
|
NORMAL = 1,
|
||||||
|
OPENED = 9,
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 活动宝箱
|
* 活动宝箱
|
||||||
*/
|
*/
|
||||||
@ -33,14 +38,14 @@ class ActivityChestClass extends BaseModule {
|
|||||||
@prop()
|
@prop()
|
||||||
public shareCode: string
|
public shareCode: string
|
||||||
// 0 锁定, 1 未开启 9 已开启
|
// 0 锁定, 1 未开启 9 已开启
|
||||||
@prop({ default: 0 })
|
@prop({ enum: ChestStatusEnum, default: ChestStatusEnum.LOCKED })
|
||||||
public status: number
|
public status: ChestStatusEnum
|
||||||
@prop()
|
@prop()
|
||||||
public user: string
|
public user: string
|
||||||
@prop()
|
@prop()
|
||||||
public activity: string
|
public activity: string
|
||||||
// 品级
|
// 品级
|
||||||
@prop({ default: 0 })
|
@prop({ default: 1 })
|
||||||
public level: number
|
public level: number
|
||||||
// 最大助力次数
|
// 最大助力次数
|
||||||
@prop()
|
@prop()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user