diff --git a/src/extensions.ts b/src/extensions.ts new file mode 100644 index 00000000000..4ebcf3974da --- /dev/null +++ b/src/extensions.ts @@ -0,0 +1,66 @@ +import "phaser"; + +//#region Methods/Interfaces + +/** + * Interface representing an object that can be passed to {@linkcode setPositionRelative}. + */ +interface GuideObject + extends Pick, + Pick, + Pick {} + +/** + * Set this object's position relative to another object with a given offset. + * @param guideObject - The object to base this object's position off of; must have defined + * x/y co-ordinates, an origin and width/height + * @param x - The X-position to set, relative to `guideObject`'s `x` value + * @param y - The Y-position to set, relative to `guideObject`'s `y` value + * @returns `this` + */ +function setPositionRelative( + this: T, + guideObject: GuideObject, + x: number, + y: number, +): T { + const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); + const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); + return this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); +} + +Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; +Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; +Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; +Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative; +Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; +Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; + +//#endregion + +//#region Declaration Merging + +interface hasSetPositionRelative { + /** + * Set this object's position relative to another object with a given offset. + * @param guideObject - The object to base this object's position off of; must have defined + * x/y co-ordinates, an origin and width/height + * @param x - The X-position to set, relative to `guideObject`'s `x` value + * @param y - The Y-position to set, relative to `guideObject`'s `y` value + * @returns `this` + */ + setPositionRelative: typeof setPositionRelative; +} + +declare module "phaser" { + namespace GameObjects { + interface Container extends hasSetPositionRelative {} + interface Sprite extends hasSetPositionRelative {} + interface Image extends hasSetPositionRelative {} + interface NineSlice extends hasSetPositionRelative {} + interface Text extends hasSetPositionRelative {} + interface Rectangle extends hasSetPositionRelative {} + } +} + +//#endregion diff --git a/src/init/init.ts b/src/init/init.ts index b80a35022b9..bfadbe27ad0 100644 --- a/src/init/init.ts +++ b/src/init/init.ts @@ -1,3 +1,5 @@ +import "#app/extensions"; // Setup Phaser extension methods/etc + import { initAbilities } from "#abilities/ability"; import { initBiomes } from "#balance/init-biomes"; import { initPokemonPrevolutions, initPokemonStarters } from "#balance/pokemon-evolutions"; diff --git a/src/main.ts b/src/main.ts index 9516fe9e6ab..96540e74587 100644 --- a/src/main.ts +++ b/src/main.ts @@ -30,37 +30,6 @@ window.addEventListener("unhandledrejection", event => { //alert(errorString); }); -interface GuideObject - extends Pick, - Pick, - Pick {} - -/** - * Set this object's position relative to another object with a given offset. - * @param guideObject - The object to base this object's position off of; must have defined - * x/y co-ordinates, an origin and width/height - * @param x - The X-position to set, relative to `guideObject`'s `x` value - * @param y - The Y-position to set, relative to `guideObject`'s `y` value - * @returns `this` - */ -function setPositionRelative( - this: T, - guideObject: GuideObject, - x: number, - y: number, -): T { - const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); - const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); - return this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); -} - -Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; -Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; - async function startGame(gameManifest?: Record): Promise { await initI18n(); const LoadingScene = (await import("./loading-scene")).LoadingScene; diff --git a/src/typings/phaser/index.d.ts b/src/typings/phaser/index.d.ts index aa4d257f9e0..59ea27ba899 100644 --- a/src/typings/phaser/index.d.ts +++ b/src/typings/phaser/index.d.ts @@ -1,38 +1,6 @@ import "phaser"; -/** - * Interface representing an object that can be passed to {@linkcode setPositionRelative}. - * @interface - */ -type GuideObject = Pick & - Pick & - Pick; - -type setPositionRelative = - /** - * Set this object's position relative to another object with a given offset. - * @param guideObject - The object to base this object's position off of; must have defined - * x/y co-ordinates, an origin and width/height - * @param x - The X-position to set, relative to `guideObject`'s `x` value - * @param y - The Y-position to set, relative to `guideObject`'s `y` value - * @returns `this` - */ - (this: T, guideObject: GuideObject, x: number, y: number) => T; - -interface hasSetPositionRelative { - setPositionRelative: setPositionRelative; -} - declare module "phaser" { - namespace GameObjects { - interface Container extends hasSetPositionRelative {} - interface Sprite extends hasSetPositionRelative {} - interface Image extends hasSetPositionRelative {} - interface NineSlice extends hasSetPositionRelative {} - interface Text extends hasSetPositionRelative {} - interface Rectangle extends hasSetPositionRelative {} - } - namespace Math { interface RandomDataGenerator { pick(array: ArrayLike): T; diff --git a/test/setup/vitest.setup.ts b/test/setup/vitest.setup.ts index 0bfbb6613f7..4bd194c7be4 100644 --- a/test/setup/vitest.setup.ts +++ b/test/setup/vitest.setup.ts @@ -42,7 +42,7 @@ vi.mock(import("i18next"), async importOriginal => { } return HttpResponse.json(json); } catch (err) { - console.log(`Failed to load locale ${filename}!`, err); + console.error(`Failed to load locale ${filename}\n`, err); return HttpResponse.json({}); } }), diff --git a/test/test-utils/test-file-initialization.ts b/test/test-utils/test-file-initialization.ts index c172e2d1da8..6a765dfa1f2 100644 --- a/test/test-utils/test-file-initialization.ts +++ b/test/test-utils/test-file-initialization.ts @@ -42,7 +42,8 @@ function initTestFile(): void { * @todo Investigate why this resets on new test suite start */ function setupStubs(): void { - Object.defineProperties(global, { + // TODO: Make this type safe + Object.defineProperties(globalThis, { localStorage: { value: mockLocalStorage(), }, @@ -76,25 +77,6 @@ function setupStubs(): void { }; navigator.getGamepads = () => []; setCookie(SESSION_ID_COOKIE_NAME, "fake_token"); - - /** - * Sets this object's position relative to another object with a given offset - * @param guideObject - The {@linkcode Phaser.GameObjects.GameObject} to base the position off of - * @param x - The relative x position - * @param y - The relative y position - */ - const setPositionRelative = function (guideObject: any, x: number, y: number): any { - const offsetX = guideObject.width * (-0.5 + (0.5 - guideObject.originX)); - const offsetY = guideObject.height * (-0.5 + (0.5 - guideObject.originY)); - return this.setPosition(guideObject.x + offsetX + x, guideObject.y + offsetY + y); - }; - - Phaser.GameObjects.Container.prototype.setPositionRelative = setPositionRelative; - Phaser.GameObjects.Sprite.prototype.setPositionRelative = setPositionRelative; - Phaser.GameObjects.Image.prototype.setPositionRelative = setPositionRelative; - Phaser.GameObjects.NineSlice.prototype.setPositionRelative = setPositionRelative; - Phaser.GameObjects.Text.prototype.setPositionRelative = setPositionRelative; - Phaser.GameObjects.Rectangle.prototype.setPositionRelative = setPositionRelative; HTMLCanvasElement.prototype.getContext = () => mockContext; } diff --git a/typedoc.config.js b/typedoc.config.js index 09d681a4bde..bf1f0860d21 100644 --- a/typedoc.config.js +++ b/typedoc.config.js @@ -16,6 +16,7 @@ const config = { entryPointStrategy: "expand", exclude: [ "src/polyfills.ts", + "src/extensions.ts", "src/vite.env.d.ts", "**/*+.test.ts", "test/test-utils/setup",