优化杀分时不触发中大奖
This commit is contained in:
@@ -109,6 +109,13 @@ class PlayStartLogic
|
||||
Log::warning("档位 {$tier} 方向 {$direction} 无任何 DiceReward,重新摇取档位");
|
||||
continue;
|
||||
}
|
||||
if ($usePoolWeights) {
|
||||
$tierRewards = self::filterOutSuperWinOnlyGrids($tierRewards);
|
||||
if (empty($tierRewards)) {
|
||||
Log::warning("档位 {$tier} 方向 {$direction} 杀分档位下排除 5/30 后无可用奖励,重新摇取档位");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
try {
|
||||
$chosen = self::drawRewardByWeight($tierRewards);
|
||||
} catch (\RuntimeException $e) {
|
||||
@@ -133,10 +140,17 @@ class PlayStartLogic
|
||||
$rewardWinCoin = $isTierT5 ? $realEv : (100 + $realEv);
|
||||
|
||||
// 豹子判定:5/30 必豹子;10/15/20/25 按 DiceRewardConfig 中 BIGWIN 该点数的 weight 判定(0-10000,10000=100%)
|
||||
// 杀分档位:不触发豹子,5/30 已在上方抽取时排除,10/15/20/25 仅生成非豹子组合
|
||||
$superWinCoin = 0;
|
||||
$isWin = 0;
|
||||
$bigWinRealEv = 0.0;
|
||||
if (in_array($rollNumber, self::SUPER_WIN_GRID_NUMBERS, true)) {
|
||||
if ($usePoolWeights) {
|
||||
// 杀分档位:绝不触发豹子,仅生成非豹子组合,不发放豹子奖金
|
||||
$isWin = 0;
|
||||
$superWinCoin = 0.0;
|
||||
$rollArray = $this->generateNonSuperWinRollArrayWithSum($rollNumber);
|
||||
} else {
|
||||
$bigWinConfig = DiceRewardConfig::getCachedByTierAndGridNumber('BIGWIN', $rollNumber);
|
||||
$alwaysSuperWin = in_array($rollNumber, self::SUPER_WIN_ALWAYS_GRID_NUMBERS, true);
|
||||
$doSuperWin = $alwaysSuperWin;
|
||||
@@ -164,6 +178,7 @@ class PlayStartLogic
|
||||
} else {
|
||||
$rollArray = $this->generateNonSuperWinRollArrayWithSum($rollNumber);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$rollArray = $this->generateRollArrayFromSum($rollNumber);
|
||||
}
|
||||
@@ -330,6 +345,21 @@ class PlayStartLogic
|
||||
/** 该组配置权重均为 0 时抛出,供调用方重试 */
|
||||
private const EXCEPTION_WEIGHT_ALL_ZERO = 'REWARD_WEIGHT_ALL_ZERO';
|
||||
|
||||
/** 杀分档位需排除的豹子号:5 和 30 只能组成豹子,无法生成非豹子组合 */
|
||||
private const KILL_MODE_EXCLUDE_GRIDS = [5, 30];
|
||||
|
||||
/**
|
||||
* 杀分档位下排除 grid_number=5/30 的奖励(5/30 只能豹子,无法剔除)
|
||||
* @return array 排除后的奖励列表,保持索引连续
|
||||
*/
|
||||
private static function filterOutSuperWinOnlyGrids(array $rewards): array
|
||||
{
|
||||
return array_values(array_filter($rewards, function ($r) {
|
||||
$g = (int) ($r['grid_number'] ?? 0);
|
||||
return !in_array($g, self::KILL_MODE_EXCLUDE_GRIDS, true);
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* 按权重抽取一条配置:仅 weight>0 参与抽取(weight=0 不会被摇到)
|
||||
* 使用 [0, total) 浮点随机,支持最小权重 0.1%(如 weight=0.1),避免整数随机导致小权重失真
|
||||
@@ -463,6 +493,14 @@ class PlayStartLogic
|
||||
if (empty($tierRewards)) {
|
||||
continue;
|
||||
}
|
||||
// 免费券或 killScore 池:与实际流程一致,排除 5/30 且不触发豹子
|
||||
$useKillMode = ($lotteryType === 1) || ($config !== null && (string) ($config->name ?? '') === 'killScore');
|
||||
if ($useKillMode) {
|
||||
$tierRewards = self::filterOutSuperWinOnlyGrids($tierRewards);
|
||||
if (empty($tierRewards)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
try {
|
||||
$chosen = self::drawRewardByWeight($tierRewards);
|
||||
} catch (\RuntimeException $e) {
|
||||
@@ -488,6 +526,12 @@ class PlayStartLogic
|
||||
$isWin = 0;
|
||||
$bigWinRealEv = 0.0;
|
||||
if (in_array($rollNumber, self::SUPER_WIN_GRID_NUMBERS, true)) {
|
||||
if ($useKillMode) {
|
||||
// 杀分档位:绝不触发豹子,仅生成非豹子组合,不发放豹子奖金
|
||||
$isWin = 0;
|
||||
$superWinCoin = 0.0;
|
||||
$rollArray = $this->generateNonSuperWinRollArrayWithSum($rollNumber);
|
||||
} else {
|
||||
$bigWinConfig = DiceRewardConfig::getCachedByTierAndGridNumber('BIGWIN', $rollNumber);
|
||||
$alwaysSuperWin = in_array($rollNumber, self::SUPER_WIN_ALWAYS_GRID_NUMBERS, true);
|
||||
$doSuperWin = $alwaysSuperWin;
|
||||
@@ -510,6 +554,7 @@ class PlayStartLogic
|
||||
} else {
|
||||
$rollArray = $this->generateNonSuperWinRollArrayWithSum($rollNumber);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$rollArray = $this->generateRollArrayFromSum($rollNumber);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user