feat(gift): 修改宝箱保底机制

This commit is contained in:
liangtongchuan
2023-02-18 18:15:34 +08:00
committed by luying
parent 321d9d15ba
commit 199677e2a4
9 changed files with 1863 additions and 1688 deletions

View File

@@ -13,7 +13,7 @@ import { combineItems } from '../role/util';
import { recordGuildFund } from './timeLimitRankService';
import { filterGoods, isGoodsHidden, isHeroHidden } from '../dataService';
import { DicGiftPackagePlan } from '../../pubUtils/dictionary/DicGiftPackagePlan';
import { GiftPackageFloorModel } from '../../db/GiftPackageFloor';
import { Floor, GiftPackageFloorModel } from '../../db/GiftPackageFloor';
@@ -152,38 +152,114 @@ export function getSelectedReward(plans: DicGiftPackagePlan[], selected: Array<n
return selectedReward;
}
// 根据是否触发保底,更新抽取次数
function updateFloorCount(floors: Floor[], maxQaulity: number, isTrigger: boolean) {
for (let floor of floors) {
if (!isTrigger) {
floor.count++;
} else {
if (floor.quality <= maxQaulity) {
floor.count = 0;
} else {
floor.count++;
}
}
}
return floors;
}
// 将随机池子根据保底 id 进行分组
function groupByFloorId(plans: DicGiftPackagePlan[]): { [key: number]: DicGiftPackagePlan[] } {
return plans.reduce((acc, cur) => {
if (cur.floorId !== 0) {
if (!acc[cur.floorId]) acc[cur.floorId] = [];
acc[cur.floorId].push(cur);
}
return acc;
}, {} as { [key: number]: DicGiftPackagePlan[] });
}
// 初始化用户某个礼包的保底数据
async function initFloorData(floors: Floor[], floorPlans: { [key: number]: DicGiftPackagePlan[] }) {
for (let floorId in floorPlans) {
let hasFloorFlag = false;
for (let floor of floors) {
if (floor.id === parseInt(floorId)) {
hasFloorFlag = true;
continue;
}
}
if (!hasFloorFlag) {
floors.push({ id: parseInt(floorId), count: 0, quality: gameData.giftPackageFloor.get(parseInt(floorId)).quality });
}
}
}
async function randomSelectedData(pool: DicGiftPackagePlan[], roleId: string, giftPackageId: number, count: number) {
let rewards: RewardParam[] = [];
let floorPlan = pool.find(cur => cur.floorCount > 0);
let dropHistory = floorPlan? await GiftPackageFloorModel.findByPlanId(roleId, giftPackageId, floorPlan?.id): { getNum: 0, allNum: 0, getSum: 0, allSum: 0 };
let { getNum = 0, allNum = 0, getSum = 0, allSum = 0 } = dropHistory;
const floorPlans = groupByFloorId(pool);
let dropHistory = (floorPlans && Object.keys(floorPlans).length > 0) ? await GiftPackageFloorModel.findByGiftPackageId(roleId, giftPackageId): { floors: [], getSum: 0, allSum: 0 };
let { floors = [], getSum = 0, allSum = 0 } = dropHistory;
for(let i = 0; i < count; i++) {
for (let i = 0; i < count; i++) {
let randResult = getRandEelmWithWeight(pool)?.dic;
if(!randResult) continue;
if(!floorPlan) {
if (!randResult) continue;
// 如果没有保底池子,直接返回
if (!floorPlans || Object.keys(floorPlans).length === 0) {
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
continue;
}
let flag = randResult.id == floorPlan.id; // 是否获得
if(allNum - getNum >= floorPlan.floorFrequency - floorPlan.floorCount) {
flag = true;
initFloorData(floors, floorPlans);
// 检查随机结果的 id 是否在 floorPlans 中,是的话抽中保底
let flag = false;
for (let floorId in floorPlans) {
if (floorPlans[floorId].findIndex(cur => cur.id === randResult.id) !== -1) {
flag = true;
break;
}
}
if(flag) {
getNum ++; getSum++;
rewards.push({ type: floorPlan.contentType, id: floorPlan.content, count: floorPlan.count });
} else {
// 检查是否达到了保底次数,并且记录最大品质的 floorId
let maxQaulityFloorId = 0; // 最大品质的 floorId
let maxQaulity = 0;
if (!flag) {
for (let floor of floors) {
if (floor.count + 1 >= gameData.giftPackageFloor.get(floor.id).times) {
flag = true;
if (gameData.giftPackageFloor.get(floor.id).quality > maxQaulity) {
maxQaulityFloorId = floor.id;
maxQaulity = gameData.giftPackageFloor.get(floor.id).quality;
}
}
}
}
// 更新抽取次数,确定要返回的物品
if (flag && maxQaulityFloorId == 0) { // 抽到了保底物品
const quality = gameData.giftPackageFloor.get(randResult.floorId).quality;
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, quality, true);
getSum++;
console.log('got floorId: ', randResult.floorId, quality);
} else if (flag && maxQaulityFloorId > 0) { // 次数保底
let floorResult = getRandEelmWithWeight(floorPlans[maxQaulityFloorId])?.dic;
if (!floorResult) continue;
rewards.push({ type: floorResult.contentType, id: floorResult.content, count: floorResult.count });
updateFloorCount(floors, maxQaulity, true);
getSum++;
console.log('got floorId: ', maxQaulityFloorId, maxQaulity);
} else { // 未达到保底次数
rewards.push({ type: randResult.contentType, id: randResult.content, count: randResult.count });
updateFloorCount(floors, 0, false);
console.log('got floorId: ', randResult.floorId, 0);
}
allNum ++; allSum ++;
if(getNum >= floorPlan.floorCount) {
allNum = 0; getNum = 0;
}
allSum++;
}
if(floorPlan) {
await GiftPackageFloorModel.updateByPlanId(roleId, giftPackageId, floorPlan.id, {
getNum, allNum, getSum, allSum
if(floorPlans && Object.keys(floorPlans).length > 0) {
await GiftPackageFloorModel.updateByGiftPackageId(roleId, giftPackageId, {
floors, getSum, allSum
});
}
return rewards