From b1f482e22cc0a6a93e69afa2e60b7442e9d8830a Mon Sep 17 00:00:00 2001 From: Fabi <192151969+fabske0@users.noreply.github.com> Date: Sat, 20 Dec 2025 21:49:00 +0100 Subject: [PATCH] [Refactor] Remove `BattleScene#eventManager` (#6868) * remove EventManager from battleScene * remove `MockEventManager` --- src/battle-scene.ts | 12 ++++-------- src/phases/title-phase.ts | 2 +- src/timed-event-manager.ts | 18 ++++++++++++++++++ .../encounters/delibirdy-encounter.test.ts | 6 ++---- test/test-utils/game-wrapper.ts | 4 ++-- .../mocks/mock-timed-event-manager.ts | 19 ------------------- 6 files changed, 27 insertions(+), 34 deletions(-) delete mode 100644 test/test-utils/mocks/mock-timed-event-manager.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 8a999665919..fec0c2c6823 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -22,7 +22,6 @@ import { InvertPostFX } from "#app/pipelines/invert"; import { SpritePipeline } from "#app/pipelines/sprite"; import { SceneBase } from "#app/scene-base"; import { startingWave } from "#app/starting-wave"; -import { TimedEventManager } from "#app/timed-event-manager"; import { UiInputs } from "#app/ui-inputs"; import { pokemonPrevolutions } from "#balance/pokemon-evolutions"; import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#balance/starters"; @@ -310,7 +309,7 @@ export class BattleScene extends SceneBase { private bgm: AnySound; private bgmResumeTimer: Phaser.Time.TimerEvent | null; - private bgmCache: Set = new Set(); + private readonly bgmCache: Set = new Set(); private playTimeTimer: Phaser.Time.TimerEvent; public rngCounter = 0; @@ -318,9 +317,7 @@ export class BattleScene extends SceneBase { public rngOffset = 0; public inputMethod: string; - private infoToggles: InfoToggle[] = []; - - public eventManager: TimedEventManager; + private readonly infoToggles: InfoToggle[] = []; /** * Allows subscribers to listen for events @@ -336,7 +333,6 @@ export class BattleScene extends SceneBase { constructor() { super("battle"); this.phaseManager = new PhaseManager(); - this.eventManager = new TimedEventManager(); this.updateGameInfo(); initGlobalScene(this); } @@ -3651,7 +3647,7 @@ export class BattleScene extends SceneBase { let availableEncounters: MysteryEncounter[] = []; const previousEncounter = this.mysteryEncounterSaveData.encounteredEvents.at(-1)?.type ?? null; // TODO: This being `null` is a bit weird - const disabledEncounters = this.eventManager.getEventMysteryEncountersDisabled(); + const disabledEncounters = timedEventManager.getEventMysteryEncountersDisabled(); const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType)?.filter(enc => !disabledEncounters.includes(enc)) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available @@ -3663,7 +3659,7 @@ export class BattleScene extends SceneBase { return false; } if ( - this.eventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier + timedEventManager.getMysteryEncounterTierForEvent(encounterType, encounterCandidate.encounterTier) !== tier ) { return false; } diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index f942925c935..c2307c98965 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -214,7 +214,7 @@ export class TitlePhase extends Phase { const generateDaily = (seed: string) => { globalScene.gameMode = getGameMode(GameModes.DAILY); // Daily runs don't support all challenges yet (starter select restrictions aren't considered) - globalScene.eventManager.startEventChallenges(); + timedEventManager.startEventChallenges(); globalScene.setSeed(seed); globalScene.resetSeed(); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 632e2b336d8..4a811f45c41 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -491,7 +491,16 @@ const timedEvents: readonly TimedEvent[] = [ ]; export class TimedEventManager { + /** + * Whether the timed event manager is disabled. + * Used to disable events in testing. + */ + private disabled: boolean; + isActive(event: TimedEvent) { + if (this.disabled) { + return false; + } const now = new Date(); return event.startDate < now && now < event.endDate; } @@ -687,6 +696,15 @@ export class TimedEventManager { getEventDailyStartingItems(): readonly ModifierTypeKeys[] { return this.activeEvent()?.dailyRunStartingItems ?? []; } + + /** + * Disable the timed event manager. Used for testing. + */ + public disable(): void { + this.disabled = true; + } + + // todo: add option to enable to aloow for testing timed events } export class TimedEventDisplay extends Phaser.GameObjects.Container { diff --git a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index e844949a5bd..fe17f091d0e 100644 --- a/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -357,8 +357,7 @@ describe("Delibird-y - Mystery Encounter", () => { }); }); - // TODO: fix mocking of events (and remove `BattleScene#eventManager`) - it.skip("Should decrease held item stacks and give the player a Healing Charm", async () => { + it("Should decrease held item stacks and give the player a Healing Charm", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 2 Soul Dew on party lead @@ -379,8 +378,7 @@ describe("Delibird-y - Mystery Encounter", () => { expect(healingCharmAfter?.stackCount).toBe(1); }); - // TODO: fix mocking of events (and remove `BattleScene#eventManager`) - it.todo("Should remove held item and give the player a Healing Charm", async () => { + it("Should remove held item and give the player a Healing Charm", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 1 Soul Dew on party lead diff --git a/test/test-utils/game-wrapper.ts b/test/test-utils/game-wrapper.ts index bfaa645c99b..fcb392caee0 100644 --- a/test/test-utils/game-wrapper.ts +++ b/test/test-utils/game-wrapper.ts @@ -1,6 +1,7 @@ // @ts-nocheck - TODO: remove this import { BattleScene } from "#app/battle-scene"; +import { timedEventManager } from "#app/global-event-manager"; // biome-ignore lint/performance/noNamespaceImport: Necessary in order to mock the var import * as appConstants from "#constants/app-constants"; import { MoveAnim } from "#data/battle-anims"; @@ -10,7 +11,6 @@ import { MockClock } from "#test/test-utils/mocks/mock-clock"; import { MockGameObjectCreator } from "#test/test-utils/mocks/mock-game-object-creator"; import { MockLoader } from "#test/test-utils/mocks/mock-loader"; import { MockTextureManager } from "#test/test-utils/mocks/mock-texture-manager"; -import { MockTimedEventManager } from "#test/test-utils/mocks/mock-timed-event-manager"; import { MockContainer } from "#test/test-utils/mocks/mocks-container/mock-container"; import { PokedexMonContainer } from "#ui/pokedex-mon-container"; import fs from "node:fs"; @@ -196,7 +196,7 @@ export class GameWrapper { this.scene.make = new MockGameObjectCreator(mockTextureManager); this.scene.time = new MockClock(this.scene); this.scene.remove = vi.fn(); // TODO: this should be stubbed differently - this.scene.eventManager = new MockTimedEventManager(); // Disable Timed Events + timedEventManager.disable(); } } diff --git a/test/test-utils/mocks/mock-timed-event-manager.ts b/test/test-utils/mocks/mock-timed-event-manager.ts deleted file mode 100644 index c1f9c34bec2..00000000000 --- a/test/test-utils/mocks/mock-timed-event-manager.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TimedEventManager } from "#app/timed-event-manager"; -import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER } from "#balance/starters"; - -/** Mock TimedEventManager so that ongoing events don't impact tests */ -export class MockTimedEventManager extends TimedEventManager { - // biome-ignore lint/nursery/noUselessUndefined: Changes return type to void instead of undefined - override activeEvent(): undefined { - return; - } - override isEventActive(): boolean { - return false; - } - override getClassicFriendshipMultiplier(): number { - return CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; - } - override getShinyEncounterMultiplier(): number { - return 1; - } -}