Tie Break failsafe correction (#8596)
Some checks are pending
CI / build (push) Waiting to run
CI / docs_validate (push) Waiting to run
CI / allcontributors (push) Waiting to run

Co-authored-by: hedara90 <90hedara@gmail.com>
This commit is contained in:
grintoul 2025-12-23 13:08:18 +00:00 committed by GitHub
parent 7ff31d5e2f
commit c27f770db9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -556,6 +556,33 @@ static void BattleTest_Run(void *data)
PrintTestName();
}
static bool32 IsTieBreakTag(enum RandomTag tag)
{
switch (tag)
{
case RNG_AI_SCORE_TIE_SINGLES:
case RNG_AI_SCORE_TIE_DOUBLES_MOVE:
case RNG_AI_SCORE_TIE_DOUBLES_TARGET:
return TRUE;
default:
break;
}
return FALSE;
}
static void SanitizeTieCounts(void)
{
if (DATA.trial.scoreTieCount < 1)
DATA.trial.scoreTieCount = 1;
if (DATA.trial.scoreTieCount > MAX_MON_MOVES)
DATA.trial.scoreTieCount = MAX_MON_MOVES;
if (DATA.trial.targetTieCount < 1)
DATA.trial.targetTieCount = 1;
if (DATA.trial.targetTieCount >= gBattlersCount)
DATA.trial.targetTieCount = (gBattlersCount - 1);
}
u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller)
{
STATE->didRunRandomly = TRUE;
@ -577,7 +604,7 @@ u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32
if (!reject)
{
if (STATE->trials != (hi - lo + 1))
if ((STATE->trials != (hi - lo + 1)) && !(IsTieBreakTag(tag)))
Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniform called from %p with tag %d and inconsistent trials %d and %d", caller, tag, STATE->trials, hi - lo + 1);
return STATE->runTrial + lo;
}
@ -651,6 +678,10 @@ static u32 BattleTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 (
return turn->rng.value;
}
}
if (IsTieBreakTag(tag))
SanitizeTieCounts();
//trials
switch (tag)
{
@ -661,12 +692,12 @@ static u32 BattleTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 (
case SCORE_TIE_HI:
return (DATA.trial.scoreTieCount - 1);
case SCORE_TIE_RANDOM:
if (DATA.trial.scoreTieCount == 0)
return 0; // Failsafe
else
return RandomUniformTrials(tag, lo, hi, reject, caller);
return RandomUniformTrials(tag, lo, hi, reject, caller);
case SCORE_TIE_CHOSEN:
return DATA.scoreTieOverride;
if (DATA.scoreTieOverride >= DATA.trial.scoreTieCount)
return (DATA.trial.scoreTieCount - 1);
else
return DATA.scoreTieOverride;
default:
return 0;
}
@ -676,12 +707,12 @@ static u32 BattleTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 (
case TARGET_TIE_HI:
return (DATA.trial.targetTieCount - 1);
case TARGET_TIE_RANDOM:
if (DATA.trial.targetTieCount == 0)
return 0; // Failsafe
else
return RandomUniformTrials(tag, lo, hi, reject, caller);
return RandomUniformTrials(tag, lo, hi, reject, caller);
case TARGET_TIE_CHOSEN:
return DATA.targetTieOverride;
if (DATA.targetTieOverride >= DATA.trial.targetTieCount)
return (DATA.trial.targetTieCount - 1);
else
return DATA.targetTieOverride;
default:
return 0;
}