pokerogue/src/ui/ui.ts

157 lines
4.4 KiB
TypeScript
Raw Normal View History

2023-03-28 19:54:52 +01:00
import { default as BattleScene } from '../battle-scene';
import UiHandler from './uiHandler';
import BattleMessageUiHandler from './battle-message-ui-handler';
import CommandUiHandler from './command-ui-handler';
import PartyUiHandler from './party-ui-handler';
import FightUiHandler from './fight-ui-handler';
import MessageUiHandler from './message-ui-handler';
import ConfirmUiHandler from './confirm-ui-handler';
2023-03-28 19:54:52 +01:00
import ModifierSelectUiHandler from './modifier-select-ui-handler';
2023-04-02 03:59:07 +01:00
import BallUiHandler from './ball-ui-handler';
import SummaryUiHandler from './summary-ui-handler';
2023-03-28 19:54:52 +01:00
export enum Mode {
MESSAGE = 0,
COMMAND,
FIGHT,
2023-04-02 03:59:07 +01:00
BALL,
CONFIRM,
2023-03-28 19:54:52 +01:00
MODIFIER_SELECT,
PARTY,
SUMMARY
2023-03-28 19:54:52 +01:00
};
const transitionModes = [
Mode.PARTY,
Mode.SUMMARY
];
2023-03-28 19:54:52 +01:00
export default class UI extends Phaser.GameObjects.Container {
private mode: Mode;
private handlers: UiHandler[];
private overlay: Phaser.GameObjects.Rectangle;
2023-04-07 05:17:55 +01:00
private transitioning: boolean;
2023-03-28 19:54:52 +01:00
constructor(scene: BattleScene) {
super(scene, 0, scene.game.canvas.height / 6);
this.mode = Mode.MESSAGE;
this.handlers = [
new BattleMessageUiHandler(scene),
new CommandUiHandler(scene),
new FightUiHandler(scene),
2023-04-02 03:59:07 +01:00
new BallUiHandler(scene),
new ConfirmUiHandler(scene),
2023-03-28 19:54:52 +01:00
new ModifierSelectUiHandler(scene),
new PartyUiHandler(scene),
new SummaryUiHandler(scene)
2023-03-28 19:54:52 +01:00
];
}
2023-04-07 05:17:55 +01:00
setup(): void {
2023-03-28 19:54:52 +01:00
for (let handler of this.handlers) {
handler.setup();
}
this.overlay = this.scene.add.rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0);
this.overlay.setOrigin(0, 0);
(this.scene as BattleScene).uiContainer.add(this.overlay);
this.overlay.setVisible(false);
2023-03-28 19:54:52 +01:00
}
2023-04-07 05:17:55 +01:00
getHandler(): UiHandler {
2023-03-28 19:54:52 +01:00
return this.handlers[this.mode];
}
2023-04-07 05:17:55 +01:00
getMessageHandler(): BattleMessageUiHandler {
2023-03-28 19:54:52 +01:00
return this.handlers[Mode.MESSAGE] as BattleMessageUiHandler;
}
2023-04-07 05:17:55 +01:00
processInput(keyCode: integer): void {
if (this.transitioning)
return;
2023-03-28 19:54:52 +01:00
this.getHandler().processInput(keyCode);
}
2023-04-07 05:17:55 +01:00
showText(text: string, delay?: integer, callback?: Function, callbackDelay?: integer, prompt?: boolean): void {
2023-03-28 19:54:52 +01:00
const handler = this.getHandler();
if (handler instanceof MessageUiHandler)
(handler as MessageUiHandler).showText(text, delay, callback, callbackDelay, prompt);
else
this.getMessageHandler().showText(text, delay, callback, callbackDelay, prompt);
}
2023-04-07 05:17:55 +01:00
clearText(): void {
2023-03-28 19:54:52 +01:00
const handler = this.getHandler();
if (handler instanceof MessageUiHandler)
(handler as MessageUiHandler).clearText();
else
this.getMessageHandler().clearText();
}
setCursor(cursor: integer): boolean {
const changed = this.getHandler().setCursor(cursor);
if (changed)
this.playSelect();
return changed;
}
2023-04-07 05:17:55 +01:00
playSelect(): void {
2023-03-28 19:54:52 +01:00
this.scene.sound.play('select');
}
2023-04-07 05:17:55 +01:00
playError(): void {
2023-03-28 19:54:52 +01:00
this.scene.sound.play('error');
}
private setModeInternal(mode: Mode, clear: boolean, args: any[]): Promise<void> {
return new Promise(resolve => {
if (this.mode === mode) {
resolve();
return;
}
const doSetMode = () => {
2023-04-07 05:17:55 +01:00
if (clear)
this.getHandler().clear();
this.mode = mode;
this.getHandler().show(args);
resolve();
};
2023-04-09 05:22:14 +01:00
if ((transitionModes.indexOf(this.mode) > -1 || transitionModes.indexOf(mode) > -1) && !(this.scene as BattleScene).auto) {
2023-04-07 05:17:55 +01:00
this.transitioning = true;
this.overlay.setAlpha(0);
this.overlay.setVisible(true);
this.scene.tweens.add({
targets: this.overlay,
alpha: 1,
duration: 250,
2023-04-07 05:17:55 +01:00
ease: 'Sine.easeOut',
onComplete: () => {
2023-04-07 05:17:55 +01:00
this.scene.time.delayedCall(100, () => {
doSetMode();
this.scene.tweens.add({
targets: this.overlay,
alpha: 0,
duration: 250,
2023-04-07 05:17:55 +01:00
ease: 'Sine.easeIn',
onComplete: () => this.overlay.setVisible(false)
});
2023-04-07 05:17:55 +01:00
this.transitioning = false;
});
}
});
} else
doSetMode();
});
}
setMode(mode: Mode, ...args: any[]): Promise<void> {
return this.setModeInternal(mode, true, args);
2023-03-28 19:54:52 +01:00
}
setModeWithoutClear(mode: Mode, ...args: any[]): Promise<void> {
return this.setModeInternal(mode, false, args);
2023-03-28 19:54:52 +01:00
}
}