[Refactor] Remove BattleScene#eventManager (#6868)

* remove EventManager from battleScene

* remove `MockEventManager`
This commit is contained in:
Fabi 2025-12-20 21:49:00 +01:00 committed by GitHub
parent fc42530ca3
commit b1f482e22c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 27 additions and 34 deletions

View File

@ -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<string> = new Set();
private readonly bgmCache: Set<string> = 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;
}

View File

@ -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();

View File

@ -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 {

View File

@ -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

View File

@ -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();
}
}

View File

@ -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;
}
}