mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-03-29 04:59:56 +00:00
[Enhancement] Refactor egg counter (#1996)
* refactor egg counter * add documentation
This commit is contained in:
parent
65ddd49d64
commit
5d358fc57f
@ -12,7 +12,8 @@ import { achvs } from "./system/achv";
|
|||||||
import { pokemonPrevolutions } from "./data/pokemon-evolutions";
|
import { pokemonPrevolutions } from "./data/pokemon-evolutions";
|
||||||
import { EggTier } from "./data/enums/egg-type";
|
import { EggTier } from "./data/enums/egg-type";
|
||||||
import PokemonInfoContainer from "./ui/pokemon-info-container";
|
import PokemonInfoContainer from "./ui/pokemon-info-container";
|
||||||
import EggsToHatchCountContainer from "./ui/eggs-to-hatch-count-container";
|
import EggCounterContainer from "./ui/egg-counter-container";
|
||||||
|
import { EggCountChangedEvent } from "./events/egg";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class that represents egg hatching
|
* Class that represents egg hatching
|
||||||
@ -24,7 +25,7 @@ export class EggHatchPhase extends Phase {
|
|||||||
/** The number of eggs that are hatching */
|
/** The number of eggs that are hatching */
|
||||||
private eggsToHatchCount: integer;
|
private eggsToHatchCount: integer;
|
||||||
/** The container that lists how many eggs are hatching */
|
/** The container that lists how many eggs are hatching */
|
||||||
private eggsToHatchCountContainer: EggsToHatchCountContainer;
|
private eggCounterContainer: EggCounterContainer;
|
||||||
|
|
||||||
/** The scene handler for egg hatching */
|
/** The scene handler for egg hatching */
|
||||||
private eggHatchHandler: EggHatchSceneHandler;
|
private eggHatchHandler: EggHatchSceneHandler;
|
||||||
@ -110,10 +111,8 @@ export class EggHatchPhase extends Phase {
|
|||||||
this.eggContainer.add(this.eggLightraysOverlay);
|
this.eggContainer.add(this.eggLightraysOverlay);
|
||||||
this.eggHatchContainer.add(this.eggContainer);
|
this.eggHatchContainer.add(this.eggContainer);
|
||||||
|
|
||||||
this.eggsToHatchCountContainer = new EggsToHatchCountContainer(this.scene, this.eggsToHatchCount);
|
this.eggCounterContainer = new EggCounterContainer(this.scene, this.eggsToHatchCount);
|
||||||
this.eggsToHatchCountContainer.setup();
|
this.eggHatchContainer.add(this.eggCounterContainer);
|
||||||
|
|
||||||
this.eggHatchContainer.add(this.eggsToHatchCountContainer);
|
|
||||||
|
|
||||||
const getPokemonSprite = () => {
|
const getPokemonSprite = () => {
|
||||||
const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub");
|
const ret = this.scene.add.sprite(this.eggHatchBg.displayWidth / 2, this.eggHatchBg.displayHeight / 2, "pkmn__sub");
|
||||||
@ -308,13 +307,6 @@ export class EggHatchPhase extends Phase {
|
|||||||
* Function to do the logic and animation of completing a hatch and revealing the Pokemon
|
* Function to do the logic and animation of completing a hatch and revealing the Pokemon
|
||||||
*/
|
*/
|
||||||
doReveal(): void {
|
doReveal(): void {
|
||||||
// Update/reduce count of hatching eggs when revealed if count is at least 1
|
|
||||||
// If count is 0, hide eggsToHatchCountContainer instead
|
|
||||||
if (this.eggsToHatchCount > 1) {
|
|
||||||
this.eggsToHatchCount -= 1;
|
|
||||||
} else {
|
|
||||||
this.eggsToHatchCountContainer.setVisible(false);
|
|
||||||
}
|
|
||||||
const isShiny = this.pokemon.isShiny();
|
const isShiny = this.pokemon.isShiny();
|
||||||
if (this.pokemon.species.subLegendary) {
|
if (this.pokemon.species.subLegendary) {
|
||||||
this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY);
|
this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY);
|
||||||
@ -336,10 +328,8 @@ export class EggHatchPhase extends Phase {
|
|||||||
this.pokemonSprite.setPipelineData("variant", this.pokemon.variant);
|
this.pokemonSprite.setPipelineData("variant", this.pokemon.variant);
|
||||||
this.pokemonSprite.setVisible(true);
|
this.pokemonSprite.setVisible(true);
|
||||||
this.scene.time.delayedCall(Utils.fixedInt(250), () => {
|
this.scene.time.delayedCall(Utils.fixedInt(250), () => {
|
||||||
if (this.eggsToHatchCount < 10) {
|
this.eggsToHatchCount--;
|
||||||
this.eggsToHatchCountContainer.setWindowToDefaultSize();
|
this.eggHatchHandler.eventTarget.dispatchEvent(new EggCountChangedEvent(this.eggsToHatchCount));
|
||||||
}
|
|
||||||
this.eggsToHatchCountContainer.eggCountText.setText(`${this.eggsToHatchCount}`);
|
|
||||||
this.pokemon.cry();
|
this.pokemon.cry();
|
||||||
if (isShiny) {
|
if (isShiny) {
|
||||||
this.scene.time.delayedCall(Utils.fixedInt(500), () => {
|
this.scene.time.delayedCall(Utils.fixedInt(500), () => {
|
||||||
|
21
src/events/egg.ts
Normal file
21
src/events/egg.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
export enum EggEventType {
|
||||||
|
/**
|
||||||
|
* Triggers when egg count is changed.
|
||||||
|
* @see {@linkcode MoveUsedEvent}
|
||||||
|
*/
|
||||||
|
EGG_COUNT_CHANGED = "onEggCountChanged"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container class for {@linkcode EggEventType.EGG_COUNT_CHANGED} events
|
||||||
|
* @extends Event
|
||||||
|
*/
|
||||||
|
export class EggCountChangedEvent extends Event {
|
||||||
|
/** The updated egg count. */
|
||||||
|
public eggCount: integer;
|
||||||
|
|
||||||
|
constructor(eggCount: number) {
|
||||||
|
super(EggEventType.EGG_COUNT_CHANGED);
|
||||||
|
this.eggCount = eggCount;
|
||||||
|
}
|
||||||
|
}
|
@ -5191,15 +5191,15 @@ export class EggLapsePhase extends Phase {
|
|||||||
return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1;
|
return Overrides.IMMEDIATE_HATCH_EGGS_OVERRIDE ? true : --egg.hatchWaves < 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
let eggsToHatchCount: integer = eggsToHatch.length;
|
let eggCount: integer = eggsToHatch.length;
|
||||||
|
|
||||||
if (eggsToHatchCount) {
|
if (eggCount) {
|
||||||
this.scene.queueMessage(i18next.t("battle:eggHatching"));
|
this.scene.queueMessage(i18next.t("battle:eggHatching"));
|
||||||
|
|
||||||
for (const egg of eggsToHatch) {
|
for (const egg of eggsToHatch) {
|
||||||
this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg, eggsToHatchCount));
|
this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg, eggCount));
|
||||||
if (eggsToHatchCount > 0) {
|
if (eggCount > 0) {
|
||||||
eggsToHatchCount--;
|
eggCount--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
88
src/ui/egg-counter-container.ts
Normal file
88
src/ui/egg-counter-container.ts
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
import BattleScene from "#app/battle-scene.js";
|
||||||
|
import { addWindow } from "./ui-theme";
|
||||||
|
import { addTextObject, TextStyle } from "./text";
|
||||||
|
import { EggCountChangedEvent, EggEventType } from "#app/events/egg.js";
|
||||||
|
import EggHatchSceneHandler from "./egg-hatch-scene-handler";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A container that displays the count of hatching eggs.
|
||||||
|
* Extends Phaser.GameObjects.Container.
|
||||||
|
*/
|
||||||
|
export default class EggCounterContainer extends Phaser.GameObjects.Container {
|
||||||
|
private readonly WINDOW_DEFAULT_WIDTH = 37;
|
||||||
|
private readonly WINDOW_MEDIUM_WIDTH = 42;
|
||||||
|
private readonly WINDOW_HEIGHT = 26;
|
||||||
|
private readonly onEggCountChangedEvent = (event: Event) => this.onEggCountChanged(event);
|
||||||
|
|
||||||
|
private battleScene: BattleScene;
|
||||||
|
private eggCount: integer;
|
||||||
|
private eggCountWindow: Phaser.GameObjects.NineSlice;
|
||||||
|
private eggCountText: Phaser.GameObjects.Text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {BattleScene} scene - The scene to which this container belongs.
|
||||||
|
* @param {number} eggCount - The number of eggs to hatch.
|
||||||
|
*/
|
||||||
|
constructor(scene: BattleScene, eggCount: integer) {
|
||||||
|
super(scene, 0, 0);
|
||||||
|
this.eggCount = eggCount;
|
||||||
|
this.battleScene = scene;
|
||||||
|
|
||||||
|
const uiHandler = this.battleScene.ui.getHandler() as EggHatchSceneHandler;
|
||||||
|
|
||||||
|
uiHandler.eventTarget.addEventListener(EggEventType.EGG_COUNT_CHANGED, this.onEggCountChangedEvent);
|
||||||
|
this.setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the container, creating the window, egg sprite, and egg count text.
|
||||||
|
*/
|
||||||
|
private setup(): void {
|
||||||
|
const windowWidth = this.eggCount > 9 ? this.WINDOW_MEDIUM_WIDTH : this.WINDOW_DEFAULT_WIDTH;
|
||||||
|
|
||||||
|
this.eggCountWindow = addWindow(this.battleScene, 5, 5, windowWidth, this.WINDOW_HEIGHT);
|
||||||
|
this.setVisible(this.eggCount > 1);
|
||||||
|
|
||||||
|
this.add(this.eggCountWindow);
|
||||||
|
|
||||||
|
const eggSprite = this.battleScene.add.sprite(19, 18, "egg", "egg_0");
|
||||||
|
eggSprite.setScale(0.32);
|
||||||
|
|
||||||
|
this.eggCountText = addTextObject(this.battleScene, 28, 13, `${this.eggCount}`, TextStyle.MESSAGE, { fontSize: "66px" });
|
||||||
|
|
||||||
|
this.add(eggSprite);
|
||||||
|
this.add(this.eggCountText);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the window size to the default width and height.
|
||||||
|
*/
|
||||||
|
private setWindowToDefaultSize(): void {
|
||||||
|
this.eggCountWindow.setSize(this.WINDOW_DEFAULT_WIDTH, this.WINDOW_HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles window size, the egg count to show, and whether it should be displayed.
|
||||||
|
*
|
||||||
|
* @param event {@linkcode Event} being sent
|
||||||
|
* @returns void
|
||||||
|
*/
|
||||||
|
private onEggCountChanged(event: Event): void {
|
||||||
|
const eggCountChangedEvent = event as EggCountChangedEvent;
|
||||||
|
if (!eggCountChangedEvent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const eggCount = eggCountChangedEvent.eggCount;
|
||||||
|
|
||||||
|
if (eggCount < 10) {
|
||||||
|
this.setWindowToDefaultSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eggCount > 0) {
|
||||||
|
this.eggCountText.setText(eggCount.toString());
|
||||||
|
} else {
|
||||||
|
this.eggCountText.setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,14 @@ import {Button} from "../enums/buttons";
|
|||||||
export default class EggHatchSceneHandler extends UiHandler {
|
export default class EggHatchSceneHandler extends UiHandler {
|
||||||
public eggHatchContainer: Phaser.GameObjects.Container;
|
public eggHatchContainer: Phaser.GameObjects.Container;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows subscribers to listen for events
|
||||||
|
*
|
||||||
|
* Current Events:
|
||||||
|
* - {@linkcode EggEventType.EGG_COUNT_CHANGED} {@linkcode EggCountChangedEvent}
|
||||||
|
*/
|
||||||
|
public readonly eventTarget: EventTarget = new EventTarget();
|
||||||
|
|
||||||
constructor(scene: BattleScene) {
|
constructor(scene: BattleScene) {
|
||||||
super(scene, Mode.EGG_HATCH_SCENE);
|
super(scene, Mode.EGG_HATCH_SCENE);
|
||||||
}
|
}
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
import BattleScene from "#app/battle-scene.js";
|
|
||||||
import { addWindow } from "./ui-theme";
|
|
||||||
import { addTextObject, TextStyle } from "./text";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A container that displays the count of hatching eggs.
|
|
||||||
* Extends Phaser.GameObjects.Container.
|
|
||||||
*/
|
|
||||||
export default class EggsToHatchCountContainer extends Phaser.GameObjects.Container {
|
|
||||||
private readonly WINDOW_DEFAULT_WIDTH = 37;
|
|
||||||
private readonly WINDOW_MEDIUM_WIDTH = 42;
|
|
||||||
private readonly WINDOW_HEIGHT = 26;
|
|
||||||
|
|
||||||
private eggsToHatchCount: integer;
|
|
||||||
private eggsToHatchCountWindow: Phaser.GameObjects.NineSlice;
|
|
||||||
|
|
||||||
public eggCountText: Phaser.GameObjects.Text;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {BattleScene} scene - The scene to which this container belongs.
|
|
||||||
* @param {number} eggsToHatchCount - The number of eggs to hatch.
|
|
||||||
*/
|
|
||||||
constructor(scene: BattleScene, eggsToHatchCount: integer) {
|
|
||||||
super(scene, 0, 0);
|
|
||||||
this.eggsToHatchCount = eggsToHatchCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets up the container, creating the window, egg sprite, and egg count text.
|
|
||||||
*/
|
|
||||||
setup(): void {
|
|
||||||
const windowWidth = this.eggsToHatchCount > 9 ? this.WINDOW_MEDIUM_WIDTH : this.WINDOW_DEFAULT_WIDTH;
|
|
||||||
|
|
||||||
this.eggsToHatchCountWindow = addWindow(this.scene as BattleScene, 5, 5, windowWidth, this.WINDOW_HEIGHT);
|
|
||||||
this.setVisible(this.eggsToHatchCount > 1);
|
|
||||||
|
|
||||||
this.add(this.eggsToHatchCountWindow);
|
|
||||||
|
|
||||||
const eggSprite = this.scene.add.sprite(19, 18, "egg", "egg_0");
|
|
||||||
eggSprite.setScale(0.32);
|
|
||||||
|
|
||||||
this.eggCountText = addTextObject(this.scene, 28, 13, `${this.eggsToHatchCount}`, TextStyle.MESSAGE, { fontSize: "66px" });
|
|
||||||
|
|
||||||
this.add(eggSprite);
|
|
||||||
this.add(this.eggCountText);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the window size to the default width and height.
|
|
||||||
*/
|
|
||||||
setWindowToDefaultSize(): void {
|
|
||||||
this.eggsToHatchCountWindow.setSize(this.WINDOW_DEFAULT_WIDTH, this.WINDOW_HEIGHT);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user