From 850f6656c756d712628b9687d8b77bc7f63fb496 Mon Sep 17 00:00:00 2001 From: zhangxk Date: Wed, 18 Oct 2023 21:41:24 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix(=E5=B9=B8=E8=BF=90=E8=BD=AC?= =?UTF-8?q?=E7=9B=98=E4=BC=98=E5=8C=96):=20=E4=BF=AE=E6=94=B9=E4=BF=9D?= =?UTF-8?q?=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/activity/handler/luckyHandler.ts | 6 +- shared/db/ActivityLuckyRec.ts | 83 ++++++++++-------- shared/domain/activityField/luckyField.ts | 85 +++++++++++-------- 3 files changed, 99 insertions(+), 75 deletions(-) diff --git a/game-server/app/servers/activity/handler/luckyHandler.ts b/game-server/app/servers/activity/handler/luckyHandler.ts index b0e80b7c5..d08266fb7 100644 --- a/game-server/app/servers/activity/handler/luckyHandler.ts +++ b/game-server/app/servers/activity/handler/luckyHandler.ts @@ -59,11 +59,11 @@ export class LuckyTurntableNewHandler { let costResult = await handleCost(roleId, sid, cost, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL); if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let { result, records, goodResult, pool, floorCount } = playerData.pull(roleName, count); - await ActivityLuckyModel.updateData(serverId, activityId, roleId, playerData.roundIndex, { ...pick(playerData, ['todayCount', 'count', 'records', 'greatRewardCount']), refTodayCount: new Date() }); + let { result, records, goodResult, pool, floor } = playerData.pull(roleName, count); + await ActivityLuckyModel.updateData(serverId, activityId, roleId, playerData.roundIndex, { ...pick(playerData, ['todayCount', 'count', 'records', 'floorRecord']), refTodayCount: new Date() }); await addItems(roleId, roleName, sid, goodResult, ITEM_CHANGE_REASON.ACT_TURNTABLE_PULL); - return resResult(STATUS.SUCCESS, { result, records, todayCount: playerData.todayCount, count: playerData.count, pool, floorCount }); + return resResult(STATUS.SUCCESS, { result, records, todayCount: playerData.todayCount, count: playerData.count, pool, floor }); } diff --git a/shared/db/ActivityLuckyRec.ts b/shared/db/ActivityLuckyRec.ts index 05d4ee4b8..805202599 100644 --- a/shared/db/ActivityLuckyRec.ts +++ b/shared/db/ActivityLuckyRec.ts @@ -12,6 +12,14 @@ export class TurntableRecord { count: number; } +export class FloorRecord { + @prop({ required: true }) + id: number; + + @prop({ required: true }) + count: number; +} + /** * 幸运转盘活动 */ @@ -19,55 +27,58 @@ export class TurntableRecord { export default class Activity_Lucky_Rec extends BaseModel { - @prop({ required: true }) - activityId: number; // 活动id + @prop({ required: true }) + activityId: number; // 活动id - @prop({ required: true }) - serverId: number; // 区id + @prop({ required: true }) + serverId: number; // 区id - @prop({ required: true }) - roleId: string; // 用户id + @prop({ required: true }) + roleId: string; // 用户id - @prop({ required: true }) - roundIndex: number; // 循环次数 + @prop({ required: true }) + roundIndex: number; // 循环次数 - @prop({ required: true }) - count: number; // 抽卡次数 + @prop({ required: true }) + count: number; // 抽卡次数 - @prop({ required: true }) - greatRewardCount: number; // 中头奖次数 + @prop({ required: true }) + greatRewardCount: number; // 中头奖次数 - @prop({ required: true }) - todayCount: number; // 本日抽卡 + @prop({ required: true }) + todayCount: number; // 本日抽卡 - @prop({ required: true }) - refTodayCount: Date; // 本日抽卡刷新时间 + @prop({ required: true }) + refTodayCount: Date; // 本日抽卡刷新时间 - @prop({ required: true, type: TurntableRecord, _id: false }) - records: TurntableRecord[]; // 本日抽卡刷新时间 + @prop({ required: true, type: TurntableRecord, _id: false }) + records: TurntableRecord[]; // 本日抽卡刷新时间 - @prop({ required: true, type: Number }) - box: number[]; // 宝箱已领取次数 + @prop({ required: true, type: Number }) + box: number[]; // 宝箱已领取次数 - public static async findByActivityId(serverId: number, activityId: number, roleId: string, roundIndex: number) { - let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOne({ roleId, activityId, serverId, roundIndex }).lean(); - return rec; - } + @prop({ required: true, type: FloorRecord, _id: false }) + floorRecord: FloorRecord[] - public static async updateData(serverId: number, activityId: number, roleId: string, roundIndex: number, update: ActivityLuckyModelTypeParam) { - let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, { $set: update }, { upsert: true, new: true }).lean(); - return rec; - } + public static async findByActivityId(serverId: number, activityId: number, roleId: string, roundIndex: number) { + let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOne({ roleId, activityId, serverId, roundIndex }).lean(); + return rec; + } - public static async refreshTodayCount(serverId: number, activityId: number, roleId: string, roundIndex: number) { - let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, {$set: { todayCount: 0, refTodayCount: new Date() }}).lean(); - return rec; - } + public static async updateData(serverId: number, activityId: number, roleId: string, roundIndex: number, update: ActivityLuckyModelTypeParam) { + let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, { $set: update }, { upsert: true, new: true }).lean(); + return rec; + } - public static async receiveBox(serverId: number, activityId: number, roleId: string, roundIndex: number, boxCount: number) { - let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, {$addToSet: { box: boxCount }}, { new: true }).lean(); - return rec; - } + public static async refreshTodayCount(serverId: number, activityId: number, roleId: string, roundIndex: number) { + let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, { $set: { todayCount: 0, refTodayCount: new Date() } }).lean(); + return rec; + } + + public static async receiveBox(serverId: number, activityId: number, roleId: string, roundIndex: number, boxCount: number) { + let rec: ActivityLuckyModelType = await ActivityLuckyModel.findOneAndUpdate({ roleId, activityId, serverId, roundIndex }, { $addToSet: { box: boxCount } }, { new: true }).lean(); + return rec; + } } export const ActivityLuckyModel = getModelForClass(Activity_Lucky_Rec); diff --git a/shared/domain/activityField/luckyField.ts b/shared/domain/activityField/luckyField.ts index b04b3bcc8..090f71136 100644 --- a/shared/domain/activityField/luckyField.ts +++ b/shared/domain/activityField/luckyField.ts @@ -3,7 +3,7 @@ import { ActivityModelType } from '../../db/Activity'; import { RewardInter } from '../../pubUtils/interface'; import { getRandEelmWithWeight, parseGoodStr } from '../../pubUtils/util'; import { ActivityBase } from './activityField'; -import { ActivityLuckyModelType, TurntableRecord } from '../../db/ActivityLuckyRec'; +import { ActivityLuckyModelType, FloorRecord, TurntableRecord } from '../../db/ActivityLuckyRec'; /************** 在数据库中的格式 ***********/ @@ -17,7 +17,6 @@ interface TurntablePoolInDb { interface TurntableFloorInDb { // 保底,每sum次必出count个头奖,头奖:权重最低的一项 sum: number; - count: number; id: number; } @@ -81,18 +80,19 @@ export class LuckyData extends ActivityBase { cost: string; // 抽1次的消耗 freeCount: number; // 免费次数 pool: LuckyPool[] = []; - // greateReward: LuckyPool; // 头奖,weight最小的那一个 box: LuckyBox[] = []; floor: { // 保底 sum: number; - count: number; id: number; + floorCount?: number; + }[]; todayCount: number = 0; // 今天抽了几次 count: number = 0; // 一共抽了几次 records: TurntableRecord[] = []; // 奖励记录 - greatRewardCount: number = 0; // 已抽次数,用于计算保底 + + floorRecord: FloorRecord[] = []; // public getCost(count: number) { if (this.todayCount < this.freeCount) { @@ -116,16 +116,22 @@ export class LuckyData extends ActivityBase { let pool: LuckyPool[] = []; for (let obj of this.pool) { let { gid, numLimit } = obj; - if (numLimit != -1 || numLimit > (gidMap.get(gid) || 0)) pool.push(obj); + if (numLimit == -1 || numLimit > (gidMap.get(gid) || 0)) pool.push(obj); } return pool; } // 保底 private getFloor(pool: LuckyPool[]) { - let ret: TurntableFloorInDb = { sum: 0, count: 0, id: 0 }; - for (let { sum, count, id } of this.floor) { - if (this.greatRewardCount > (sum - count) && this.greatRewardCount <= sum) { - if ((ret?.sum || 0) < sum) ret = { sum, count, id }; + let ret: TurntableFloorInDb = { sum: 0, id: 0 }; + for (let { sum, id } of this.floor) { + let floorRecord = this.floorRecord.find(cur => cur.id == id); + let count = 0; + if (floorRecord) count = floorRecord.count + 1; + if ((count == sum || count % sum == 0) && count != 0) { + if (sum > ret.sum) { + ret = { sum, id }; + if (floorRecord) floorRecord.count = 0; + } } } @@ -138,6 +144,23 @@ export class LuckyData extends ActivityBase { return {}; } + //获取保底 + public getFloorCount() { + for (let obj of this.floor) { + let { sum, id } = obj; + let pool = this.pool.find(cur => cur.id == id) + if (!pool || pool.numLimit <= pool.getCnt) obj.floorCount = 0; + else { + let count = this.floorRecord.find(cur => cur.id == id)?.count || 0; + if (count % sum == 0) obj.floorCount = sum; + else { + obj.floorCount = sum - (count % sum); + } + } + } + return this.floor; + } + public pull(roleName: string, count: number) { let records: (string | number)[][] = []; @@ -147,34 +170,26 @@ export class LuckyData extends ActivityBase { // 1.次数上限 let pool = this.getPoolByRecordNum(); // 2.保底 - this.greatRewardCount++; let { newPool } = this.getFloor(pool); let randResult = newPool; - if (newPool) { - let floor = this.floor.find(cur => cur.id == newPool.id) - if (floor && floor.sum == this.greatRewardCount) { - this.greatRewardCount = 0; - } + if (!newPool) { + randResult = getRandEelmWithWeight(pool).dic; + } + if (randResult) { let tempPool = this.pool.find(cur => cur.id == randResult.id); if (tempPool) { tempPool.getCnt = (tempPool.getCnt || 0) + 1; } - } - else { - randResult = getRandEelmWithWeight(pool).dic; - if (randResult) { - let floor = this.floor.find(cur => cur.id == randResult.id); - let tempPool = this.pool.find(cur => cur.id == randResult.id); - if (tempPool) { - tempPool.getCnt = (tempPool.getCnt || 0) + 1; + for (let obj of this.floor) { + let floorRecord = this.floorRecord.find(cur => cur.id == obj.id); + if (obj.id != randResult.id) { + if (!floorRecord) this.floorRecord.push({ id: obj.id, count: 1 }); + else floorRecord.count++; + } else { + if (floorRecord) floorRecord.count = 0; } - if (floor && floor.count <= tempPool.getCnt) { - this.greatRewardCount = 0; - } } - } - if (randResult) { this.count++; this.todayCount++; let record = { roleName, gid: randResult.gid, count: randResult.count }; @@ -184,7 +199,7 @@ export class LuckyData extends ActivityBase { goodResult.push({ id: randResult.gid, count: randResult.count }); } } - return { result, records, goodResult, pool: this.pool.map(pool => pool.getShowResult()), floorCount: this.greatRewardCount }; + return { result, records, goodResult, pool: this.pool.map(pool => pool.getShowResult()), floor: this.getFloorCount() }; } // 宝箱是否可以领取 @@ -203,19 +218,20 @@ export class LuckyData extends ActivityBase { public setPlayerRecords(playerData: ActivityLuckyModelType) { if (!playerData) return null - let { todayCount, count, records, box, greatRewardCount } = playerData; + let { todayCount, count, records, box, floorRecord = [] } = playerData; this.todayCount = todayCount; this.count = count; this.records = records; for (let boxData of this.box) { boxData.setReceived(box); } - this.greatRewardCount = greatRewardCount; let gidMap = this.getGidMap(); for (let obj of this.pool) { obj.getCnt = (gidMap.get(obj.gid) || 0); } + + this.floorRecord = floorRecord; } public initData(data: string) { @@ -225,9 +241,6 @@ export class LuckyData extends ActivityBase { for (let pool of dataObj.pool) { let poolObj = new LuckyPool(pool); this.pool.push(poolObj); - // if (!this.greateReward || this.greateReward.weight > poolObj.weight) { - // this.greateReward = poolObj; - // } } for (let box of dataObj.box) { this.box.push(new LuckyBox(box)); @@ -245,7 +258,7 @@ export class LuckyData extends ActivityBase { box: this.box, pool: this.pool.map(pool => pool.getShowResult()), records: this.records.map(record => [record.roleName, record.gid, record.count]), - floorCount: this.greatRewardCount, + floor: this.getFloorCount(), } }