2023-04-05 13:35:15 +01:00
|
|
|
import BattleScene from "../battle-scene";
|
|
|
|
import { Mode } from "./ui";
|
|
|
|
import UiHandler from "./uiHandler";
|
2023-04-06 16:30:22 +01:00
|
|
|
import * as Utils from "../utils";
|
2023-04-07 03:24:13 +01:00
|
|
|
import { PlayerPokemon } from "../pokemon";
|
|
|
|
import { Type } from "../type";
|
|
|
|
import { TextStyle, addTextObject } from "../text";
|
|
|
|
import Move from "../move";
|
2023-04-05 13:35:15 +01:00
|
|
|
|
2023-04-06 15:05:12 +01:00
|
|
|
enum Page {
|
|
|
|
PROFILE,
|
|
|
|
MOVES
|
|
|
|
}
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
export enum SummaryUiMode {
|
|
|
|
DEFAULT,
|
|
|
|
LEARN_MOVE
|
|
|
|
}
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
export default class SummaryUiHandler extends UiHandler {
|
2023-04-07 03:24:13 +01:00
|
|
|
private summaryUiMode: SummaryUiMode;
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
private summaryContainer: Phaser.GameObjects.Container;
|
2023-04-06 16:30:22 +01:00
|
|
|
private summaryPageContainer: Phaser.GameObjects.Container;
|
2023-04-07 03:24:13 +01:00
|
|
|
private movesContainer: Phaser.GameObjects.Container;
|
|
|
|
private moveCursorObj: Phaser.GameObjects.Sprite;
|
|
|
|
private selectedMoveCursorObj: Phaser.GameObjects.Sprite;
|
|
|
|
private extraMoveRowContainer: Phaser.GameObjects.Container;
|
2023-04-06 16:30:22 +01:00
|
|
|
private summaryPageTransitionContainer: Phaser.GameObjects.Container;
|
2023-04-06 15:05:12 +01:00
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
private pokemon: PlayerPokemon;
|
|
|
|
private newMove: Move;
|
|
|
|
private moveSelectFunction: Function;
|
2023-04-06 16:30:22 +01:00
|
|
|
private transitioning: boolean;
|
2023-04-05 13:35:15 +01:00
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
private moveSelect: boolean;
|
|
|
|
private moveCursor: integer;
|
|
|
|
private selectedMoveIndex: integer;
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
constructor(scene: BattleScene) {
|
|
|
|
super(scene, Mode.SUMMARY);
|
|
|
|
}
|
|
|
|
|
|
|
|
setup() {
|
|
|
|
const ui = this.getUi();
|
|
|
|
|
|
|
|
this.summaryContainer = this.scene.add.container(0, 0);
|
|
|
|
this.summaryContainer.setVisible(false);
|
|
|
|
ui.add(this.summaryContainer);
|
|
|
|
|
|
|
|
const summaryBg = this.scene.add.image(0, 0, 'summary_bg');
|
2023-04-06 15:05:12 +01:00
|
|
|
summaryBg.setOrigin(0, 1);
|
2023-04-05 13:35:15 +01:00
|
|
|
this.summaryContainer.add(summaryBg);
|
|
|
|
|
2023-04-06 16:30:22 +01:00
|
|
|
const getSummaryPageBg = () => {
|
|
|
|
const ret = this.scene.add.sprite(0, 0, this.getPageKey(0));
|
|
|
|
ret.setOrigin(0, 1);
|
|
|
|
return ret;
|
|
|
|
};
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
this.summaryContainer.add((this.summaryPageContainer = this.scene.add.container(106, 0)));
|
|
|
|
this.summaryPageContainer.add(getSummaryPageBg());
|
|
|
|
this.summaryPageContainer.setVisible(false);
|
|
|
|
this.summaryContainer.add((this.summaryPageTransitionContainer = this.scene.add.container(106, 0)));
|
|
|
|
this.summaryPageTransitionContainer.add(getSummaryPageBg());
|
|
|
|
this.summaryPageTransitionContainer.setVisible(false);
|
2023-04-06 15:05:12 +01:00
|
|
|
}
|
|
|
|
|
2023-04-06 16:30:22 +01:00
|
|
|
getPageKey(page?: integer) {
|
|
|
|
if (page === undefined)
|
|
|
|
page = this.cursor;
|
|
|
|
return `summary_${Page[page].toLowerCase()}`;
|
2023-04-05 13:35:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
show(args: any[]) {
|
|
|
|
super.show(args);
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
this.pokemon = args[0] as PlayerPokemon;
|
|
|
|
this.summaryUiMode = args.length > 1 ? args[1] as SummaryUiMode : SummaryUiMode.DEFAULT;
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
this.summaryContainer.setVisible(true);
|
2023-04-06 16:30:22 +01:00
|
|
|
this.cursor = -1;
|
2023-04-07 03:24:13 +01:00
|
|
|
|
|
|
|
this.pokemon.cry();
|
|
|
|
|
|
|
|
switch (this.summaryUiMode) {
|
|
|
|
case SummaryUiMode.DEFAULT:
|
|
|
|
this.setCursor(Page.PROFILE);
|
|
|
|
break;
|
|
|
|
case SummaryUiMode.LEARN_MOVE:
|
|
|
|
this.newMove = args[2] as Move;
|
|
|
|
this.moveSelectFunction = args[3] as Function;
|
|
|
|
|
|
|
|
this.setCursor(Page.MOVES);
|
|
|
|
this.showMoveSelect();
|
|
|
|
break;
|
|
|
|
}
|
2023-04-05 13:35:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
processInput(keyCode: integer) {
|
2023-04-06 16:30:22 +01:00
|
|
|
if (this.transitioning)
|
|
|
|
return;
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
const ui = this.getUi();
|
|
|
|
const keyCodes = Phaser.Input.Keyboard.KeyCodes;
|
2023-04-06 15:05:12 +01:00
|
|
|
|
2023-04-06 16:30:22 +01:00
|
|
|
let success = false;
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
if (this.moveSelect) {
|
|
|
|
if (keyCode === keyCodes.Z) {
|
|
|
|
if (this.moveCursor < this.pokemon.moveset.length) {
|
|
|
|
if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE)
|
|
|
|
this.moveSelectFunction(this.moveCursor);
|
|
|
|
else
|
|
|
|
this.selectedMoveIndex = this.moveCursor;
|
|
|
|
success = true;
|
|
|
|
} else if (this.moveCursor === 4)
|
|
|
|
this.processInput(keyCodes.X);
|
|
|
|
} else if (keyCode === keyCodes.X) {
|
|
|
|
this.hideMoveSelect();
|
|
|
|
success = true;
|
|
|
|
} else {
|
|
|
|
switch (keyCode) {
|
|
|
|
case keyCodes.UP:
|
|
|
|
success = this.setCursor(this.moveCursor ? this.moveCursor - 1 : 4);
|
|
|
|
break;
|
|
|
|
case keyCodes.DOWN:
|
|
|
|
success = this.setCursor(this.moveCursor < 4 ? this.moveCursor + 1 : 0);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-04-06 16:30:22 +01:00
|
|
|
} else {
|
2023-04-07 03:24:13 +01:00
|
|
|
if (keyCode === keyCodes.Z) {
|
|
|
|
if (this.cursor === Page.MOVES) {
|
|
|
|
this.showMoveSelect();
|
|
|
|
success = true;
|
|
|
|
}
|
|
|
|
} else if (keyCode === keyCodes.X) {
|
|
|
|
ui.setMode(Mode.PARTY);
|
|
|
|
success = true;
|
|
|
|
} else {
|
|
|
|
const pages = Utils.getEnumValues(Page);
|
|
|
|
switch (keyCode) {
|
|
|
|
case keyCodes.LEFT:
|
|
|
|
if (this.cursor)
|
|
|
|
success = this.setCursor(this.cursor - 1);
|
|
|
|
break;
|
|
|
|
case keyCodes.RIGHT:
|
|
|
|
if (this.cursor < pages.length - 1)
|
|
|
|
success = this.setCursor(this.cursor + 1);
|
|
|
|
break;
|
|
|
|
}
|
2023-04-06 16:30:22 +01:00
|
|
|
}
|
2023-04-06 15:05:12 +01:00
|
|
|
}
|
2023-04-06 16:30:22 +01:00
|
|
|
|
|
|
|
if (success)
|
|
|
|
ui.playSelect();
|
2023-04-05 13:35:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
setCursor(cursor: integer): boolean {
|
2023-04-07 03:24:13 +01:00
|
|
|
let changed: boolean;
|
|
|
|
|
|
|
|
if (this.moveSelect) {
|
|
|
|
changed = this.moveCursor !== cursor;
|
|
|
|
if (changed) {
|
|
|
|
this.moveCursor = cursor;
|
|
|
|
|
|
|
|
if (!this.moveCursorObj) {
|
|
|
|
this.moveCursorObj = this.scene.add.sprite(-2, 0, 'summary_moves_cursor', 'highlight');
|
|
|
|
this.moveCursorObj.setOrigin(0, 1);
|
|
|
|
this.movesContainer.add(this.moveCursorObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.moveCursorObj.setY(16 * this.moveCursor + 1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
changed = this.cursor !== cursor;
|
|
|
|
if (changed) {
|
|
|
|
const forward = this.cursor < cursor;
|
|
|
|
this.cursor = cursor;
|
|
|
|
|
|
|
|
if (this.summaryPageContainer.visible) {
|
|
|
|
this.transitioning = true;
|
|
|
|
this.populatePageContainer(this.summaryPageTransitionContainer, forward ? cursor : cursor + 1);
|
|
|
|
if (forward)
|
|
|
|
this.summaryPageTransitionContainer.x += 214;
|
|
|
|
else
|
|
|
|
this.populatePageContainer(this.summaryPageContainer);
|
|
|
|
this.scene.tweens.add({
|
|
|
|
targets: this.summaryPageTransitionContainer,
|
|
|
|
x: forward ? '-=214' : '+=214',
|
|
|
|
duration: 250,
|
|
|
|
onComplete: () => {
|
|
|
|
if (forward)
|
|
|
|
this.populatePageContainer(this.summaryPageContainer);
|
|
|
|
else
|
|
|
|
this.summaryPageTransitionContainer.x -= 214;
|
|
|
|
this.summaryPageTransitionContainer.setVisible(false);
|
|
|
|
this.transitioning = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
this.summaryPageTransitionContainer.setVisible(true);
|
|
|
|
} else {
|
2023-04-06 16:30:22 +01:00
|
|
|
this.populatePageContainer(this.summaryPageContainer);
|
2023-04-07 03:24:13 +01:00
|
|
|
this.summaryPageContainer.setVisible(true);
|
|
|
|
}
|
2023-04-06 16:30:22 +01:00
|
|
|
}
|
2023-04-05 13:35:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
}
|
|
|
|
|
2023-04-06 16:30:22 +01:00
|
|
|
populatePageContainer(pageContainer: Phaser.GameObjects.Container, page?: Page) {
|
|
|
|
if (page === undefined)
|
|
|
|
page = this.cursor;
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
if (pageContainer.getAll().length > 1) {
|
|
|
|
if (this.movesContainer)
|
|
|
|
this.movesContainer.removeAll(true);
|
2023-04-06 16:30:22 +01:00
|
|
|
pageContainer.removeBetween(1, undefined, true);
|
2023-04-07 03:24:13 +01:00
|
|
|
}
|
|
|
|
const pageBg = (pageContainer.getAt(0) as Phaser.GameObjects.Sprite);
|
|
|
|
pageBg.setTexture(this.getPageKey(page));
|
2023-04-06 16:30:22 +01:00
|
|
|
|
|
|
|
switch (page) {
|
|
|
|
case Page.MOVES:
|
2023-04-07 03:24:13 +01:00
|
|
|
this.movesContainer = this.scene.add.container(5, -pageBg.height + 26);
|
|
|
|
pageContainer.add(this.movesContainer);
|
|
|
|
|
|
|
|
this.extraMoveRowContainer = this.scene.add.container(0, 64);
|
|
|
|
this.movesContainer.add(this.extraMoveRowContainer);
|
|
|
|
|
|
|
|
const extraRowOverlay = this.scene.add.image(-2, 1, 'summary_moves_overlay_row');
|
|
|
|
extraRowOverlay.setOrigin(0, 1);
|
|
|
|
this.extraMoveRowContainer.add(extraRowOverlay);
|
|
|
|
|
|
|
|
const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? this.newMove.name : 'CANCEL',
|
|
|
|
this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_RED : TextStyle.SUMMARY);
|
|
|
|
extraRowText.setOrigin(0, 1);
|
|
|
|
this.extraMoveRowContainer.add(extraRowText);
|
|
|
|
|
|
|
|
for (let m = 0; m < 4; m++) {
|
|
|
|
const move = m < this.pokemon.moveset.length ? this.pokemon.moveset[m] : null;
|
|
|
|
|
|
|
|
if (move) {
|
|
|
|
const typeIcon = this.scene.add.sprite(0, 16 * m, 'types', Type[move.getMove().type].toLowerCase());
|
|
|
|
typeIcon.setOrigin(0, 1);
|
|
|
|
this.movesContainer.add(typeIcon);
|
|
|
|
}
|
|
|
|
|
|
|
|
const moveText = addTextObject(this.scene, 35, 16 * m, move ? move.getName() : '-', TextStyle.SUMMARY);
|
|
|
|
moveText.setOrigin(0, 1);
|
|
|
|
this.movesContainer.add(moveText);
|
|
|
|
}
|
2023-04-06 16:30:22 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-07 03:24:13 +01:00
|
|
|
showMoveSelect() {
|
|
|
|
this.moveSelect = true;
|
|
|
|
this.setCursor(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
hideMoveSelect() {
|
|
|
|
if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) {
|
|
|
|
this.moveSelectFunction(4);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.moveSelect = false;
|
|
|
|
}
|
|
|
|
|
2023-04-05 13:35:15 +01:00
|
|
|
clear() {
|
|
|
|
super.clear();
|
2023-04-07 03:24:13 +01:00
|
|
|
this.pokemon = null;
|
2023-04-06 16:30:22 +01:00
|
|
|
this.cursor = -1;
|
2023-04-07 03:24:13 +01:00
|
|
|
this.newMove = null;
|
|
|
|
this.moveSelectFunction = null;
|
2023-04-05 13:35:15 +01:00
|
|
|
this.summaryContainer.setVisible(false);
|
2023-04-06 16:30:22 +01:00
|
|
|
this.summaryPageContainer.setVisible(false);
|
2023-04-05 13:35:15 +01:00
|
|
|
}
|
|
|
|
}
|