From 50bbae75777e82cbcd30e0759c34ad454ecc93a6 Mon Sep 17 00:00:00 2001 From: RedstonewolfX <108761527+RedstonewolfX@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:42:32 -0400 Subject: [PATCH] Fix stupid game Patches some more bugs that occurred due to past me not fixing everything properly when I updated the game --- src/phases/field-phase.ts | 33 +++++++++++++++++++++++++++++++++ src/system/game-data.ts | 10 ++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts index 02d1f1395d3..1d611a4f2a6 100644 --- a/src/phases/field-phase.ts +++ b/src/phases/field-phase.ts @@ -1,9 +1,42 @@ import { BattlePhase } from "./battle-phase"; import Pokemon from "#app/field/pokemon"; +import { BattlerIndex } from "#app/battle.js"; +import * as Utils from "../utils"; +import { Stat } from "#app/enums/stat.js"; +import { TrickRoomTag } from "#app/data/arena-tag.js"; type PokemonFunc = (pokemon: Pokemon) => void; export abstract class FieldPhase extends BattlePhase { + getOrder(): BattlerIndex[] { + const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[]; + const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[]; + + // We shuffle the list before sorting so speed ties produce random results + let orderedTargets: Pokemon[] = playerField.concat(enemyField); + // We seed it with the current turn to prevent an inconsistency where it + // was varying based on how long since you last reloaded + this.scene.executeWithSeedOffset(() => { + orderedTargets = Utils.randSeedShuffle(orderedTargets); + }, this.scene.currentBattle.turn, this.scene.waveSeed); + + orderedTargets.sort((a: Pokemon, b: Pokemon) => { + const aSpeed = a?.getBattleStat(Stat.SPD) || 0; + const bSpeed = b?.getBattleStat(Stat.SPD) || 0; + + return bSpeed - aSpeed; + }); + + const speedReversed = new Utils.BooleanHolder(false); + this.scene.arena.applyTags(TrickRoomTag, speedReversed); + + if (speedReversed.value) { + orderedTargets = orderedTargets.reverse(); + } + + return orderedTargets.map(t => t.getFieldIndex() + (!t.isPlayer() ? BattlerIndex.ENEMY : 0)); + } + executeForAll(func: PokemonFunc): void { const field = this.scene.getField(true).filter(p => p.summonData); field.forEach(pokemon => func(pokemon)); diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 338334a5019..103115058eb 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -983,10 +983,12 @@ export class GameData { const sessionData = this.parseSessionData(sessionDataStr); sessionData.autoSlot = autoSlot!; for (let i = 0; i <= 5; i++) { - const speciesToCheck = getPokemonSpecies(sessionData.party[i]?.species); - if (sessionData.party[i]?.abilityIndex === 1) { - if (speciesToCheck.ability1 === speciesToCheck.ability2 && speciesToCheck.abilityHidden !== Abilities.NONE && speciesToCheck.abilityHidden !== speciesToCheck.ability1) { - sessionData.party[i].abilityIndex = 2; + if (sessionData.party[i]) { + const speciesToCheck = getPokemonSpecies(sessionData.party[i]?.species); + if (sessionData.party[i]?.abilityIndex === 1) { + if (speciesToCheck.ability1 === speciesToCheck.ability2 && speciesToCheck.abilityHidden !== Abilities.NONE && speciesToCheck.abilityHidden !== speciesToCheck.ability1) { + sessionData.party[i].abilityIndex = 2; + } } } }