From 901392152319a14489ba5924761147b705f6c41b Mon Sep 17 00:00:00 2001 From: Xavion3 Date: Fri, 7 Jun 2024 13:01:13 +1000 Subject: [PATCH] [Bug] Fix speed tie code (#1895) * Fix speed tie code * Fix off by one error * Shuffle before sorting to make code cleaner --- src/phases.ts | 5 +++-- src/utils.ts | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index bb875fe2470..3b4cb021ccf 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -633,11 +633,12 @@ export abstract class FieldPhase extends BattlePhase { const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[]; const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[]; - let orderedTargets: Pokemon[] = playerField.concat(enemyField).sort((a: Pokemon, b: Pokemon) => { + // We shuffle the list before sorting so speed ties produce random results + let orderedTargets: Pokemon[] = Utils.randSeedShuffle(playerField.concat(enemyField)).sort((a: Pokemon, b: Pokemon) => { const aSpeed = a?.getBattleStat(Stat.SPD) || 0; const bSpeed = b?.getBattleStat(Stat.SPD) || 0; - return aSpeed < bSpeed ? 1 : aSpeed > bSpeed ? -1 : !this.scene.randBattleSeedInt(2) ? -1 : 1; + return bSpeed - aSpeed; }); const speedReversed = new Utils.BooleanHolder(false); diff --git a/src/utils.ts b/src/utils.ts index 68f6e323af1..42736add1fa 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -127,6 +127,23 @@ export function randSeedEasedWeightedItem(items: T[], easingFunction: string return items[Math.floor(easedValue * items.length)]; } +/** + * Shuffle a list using the seeded rng. Utilises the Fisher-Yates algorithm. + * @param {Array} items An array of items. + * @returns {Array} A new shuffled array of items. + */ +export function randSeedShuffle(items: T[]): T[] { + if (items.length <= 1) { + return items; + } + const newArray = items.slice(0); + for (let i = items.length - 1; i > 0; i--) { + const j = Phaser.Math.RND.integerInRange(0, i); + [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; + } + return newArray; +} + export function getFrameMs(frameCount: integer): integer { return Math.floor((1 / 60) * 1000 * frameCount); }