Files
rogue/src/ui/GameUI.ts
Peter Stockings ce68470ab1 Another refactor
2026-01-05 13:24:56 +11:00

101 lines
3.2 KiB
TypeScript

import Phaser from "phaser";
import { type World, type EntityId, type CombatantActor, type Stats } from "../core/types";
import { HudComponent } from "./components/HudComponent";
import { MenuComponent } from "./components/MenuComponent";
import { InventoryOverlay } from "./components/InventoryOverlay";
import { CharacterOverlay } from "./components/CharacterOverlay";
import { DeathOverlay } from "./components/DeathOverlay";
import { PersistentButtonsComponent } from "./components/PersistentButtonsComponent";
export default class GameUI extends Phaser.Scene {
private hud: HudComponent;
private menu: MenuComponent;
private inventory: InventoryOverlay;
private character: CharacterOverlay;
private death: DeathOverlay;
private persistentButtons: PersistentButtonsComponent;
constructor() {
super({ key: "GameUI" });
this.hud = new HudComponent(this);
this.menu = new MenuComponent(this);
this.inventory = new InventoryOverlay(this);
this.character = new CharacterOverlay(this);
this.death = new DeathOverlay(this);
this.persistentButtons = new PersistentButtonsComponent(this);
}
create() {
this.hud.create();
this.menu.create();
this.inventory.create();
this.character.create();
this.death.create();
this.persistentButtons.create();
const gameScene = this.scene.get("GameScene");
// Listen for updates from GameScene
gameScene.events.on("update-ui", (data: { world: World; playerId: EntityId; floorIndex: number }) => {
this.updateUI(data.world, data.playerId, data.floorIndex);
});
gameScene.events.on("toggle-menu", () => {
this.menu.toggle();
this.emitMenuStates();
});
gameScene.events.on("toggle-inventory", () => {
const open = this.inventory.toggle();
if (open) {
this.menu.setVisible(false);
this.character.setVisible(false);
}
this.emitMenuStates();
});
gameScene.events.on("toggle-character", () => {
const open = this.character.toggle();
if (open) {
this.menu.setVisible(false);
this.inventory.setVisible(false);
}
this.emitMenuStates();
});
gameScene.events.on("close-menu", () => {
this.menu.setVisible(false);
this.inventory.setVisible(false);
this.character.setVisible(false);
this.emitMenuStates();
});
gameScene.events.on("restart-game", () => {
this.death.hide();
});
}
private emitMenuStates() {
const gameScene = this.scene.get("GameScene");
gameScene.events.emit("menu-toggled", this.menu.isOpen);
gameScene.events.emit("inventory-toggled", this.inventory.isOpen);
gameScene.events.emit("character-toggled", this.character.isOpen);
}
showDeathScreen(data: { floor: number; gold: number; stats: Stats }) {
this.death.show(data);
}
private updateUI(world: World, playerId: EntityId, floorIndex: number) {
const player = world.actors.get(playerId) as CombatantActor;
if (!player) return;
this.hud.update(player.stats, floorIndex);
this.inventory.update(player);
this.character.update(player);
}
}