[QoL] Show move description via info button (#4165)

* Show move desc via info button

* Update src/ui/move-info-overlay.ts

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
This commit is contained in:
gruxor 2024-09-22 11:31:53 -04:00 committed by GitHub
parent 4475eec607
commit 590758f616
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 81 additions and 10 deletions

View File

@ -1,4 +1,4 @@
import BattleScene from "../battle-scene"; import BattleScene, { InfoToggle } from "../battle-scene";
import { addTextObject, TextStyle } from "./text"; import { addTextObject, TextStyle } from "./text";
import { getTypeDamageMultiplierColor, Type } from "../data/type"; import { getTypeDamageMultiplierColor, Type } from "../data/type";
import { Command } from "./command-ui-handler"; import { Command } from "./command-ui-handler";
@ -10,9 +10,10 @@ import i18next from "i18next";
import {Button} from "#enums/buttons"; import {Button} from "#enums/buttons";
import Pokemon, { PokemonMove } from "#app/field/pokemon"; import Pokemon, { PokemonMove } from "#app/field/pokemon";
import { CommandPhase } from "#app/phases/command-phase"; import { CommandPhase } from "#app/phases/command-phase";
import MoveInfoOverlay from "./move-info-overlay";
import { BattleType } from "#app/battle"; import { BattleType } from "#app/battle";
export default class FightUiHandler extends UiHandler { export default class FightUiHandler extends UiHandler implements InfoToggle {
public static readonly MOVES_CONTAINER_NAME = "moves"; public static readonly MOVES_CONTAINER_NAME = "moves";
private movesContainer: Phaser.GameObjects.Container; private movesContainer: Phaser.GameObjects.Container;
@ -26,6 +27,7 @@ export default class FightUiHandler extends UiHandler {
private accuracyText: Phaser.GameObjects.Text; private accuracyText: Phaser.GameObjects.Text;
private cursorObj: Phaser.GameObjects.Image | null; private cursorObj: Phaser.GameObjects.Image | null;
private moveCategoryIcon: Phaser.GameObjects.Sprite; private moveCategoryIcon: Phaser.GameObjects.Sprite;
private moveInfoOverlay : MoveInfoOverlay;
protected fieldIndex: integer = 0; protected fieldIndex: integer = 0;
protected cursor2: integer = 0; protected cursor2: integer = 0;
@ -85,6 +87,24 @@ export default class FightUiHandler extends UiHandler {
this.accuracyText.setOrigin(1, 0.5); this.accuracyText.setOrigin(1, 0.5);
this.accuracyText.setVisible(false); this.accuracyText.setVisible(false);
this.moveInfoContainer.add(this.accuracyText); this.moveInfoContainer.add(this.accuracyText);
// prepare move overlay
const overlayScale = 1;
this.moveInfoOverlay = new MoveInfoOverlay(this.scene, {
delayVisibility: true,
scale: overlayScale,
onSide: true,
right: true,
x: 0,
y: -MoveInfoOverlay.getHeight(overlayScale, true),
width: (this.scene.game.canvas.width / 6) + 4,
hideEffectBox: true,
hideBg: true
});
ui.add(this.moveInfoOverlay);
// register the overlay to receive toggle events
this.scene.addInfoToggle(this.moveInfoOverlay);
this.scene.addInfoToggle(this);
} }
show(args: any[]): boolean { show(args: any[]): boolean {
@ -103,6 +123,8 @@ export default class FightUiHandler extends UiHandler {
this.setCursor(this.getCursor()); this.setCursor(this.getCursor());
} }
this.displayMoves(); this.displayMoves();
this.toggleInfo(false); // in case cancel was pressed while info toggle is active
this.active = true;
return true; return true;
} }
@ -160,6 +182,27 @@ export default class FightUiHandler extends UiHandler {
return success; return success;
} }
toggleInfo(visible: boolean): void {
if (visible) {
this.movesContainer.setVisible(false);
this.cursorObj?.setVisible(false);
}
this.scene.tweens.add({
targets: [this.movesContainer, this.cursorObj],
duration: Utils.fixedInt(125),
ease: "Sine.easeInOut",
alpha: visible ? 0 : 1
});
if (!visible) {
this.movesContainer.setVisible(true);
this.cursorObj?.setVisible(true);
}
}
isActive(): boolean {
return this.active;
}
getCursor(): integer { getCursor(): integer {
return !this.fieldIndex ? this.cursor : this.cursor2; return !this.fieldIndex ? this.cursor : this.cursor2;
} }
@ -167,6 +210,7 @@ export default class FightUiHandler extends UiHandler {
setCursor(cursor: integer): boolean { setCursor(cursor: integer): boolean {
const ui = this.getUi(); const ui = this.getUi();
this.moveInfoOverlay.clear();
const changed = this.getCursor() !== cursor; const changed = this.getCursor() !== cursor;
if (changed) { if (changed) {
if (!this.fieldIndex) { if (!this.fieldIndex) {
@ -220,6 +264,7 @@ export default class FightUiHandler extends UiHandler {
//** Changes the text color and shadow according to the determined TextStyle */ //** Changes the text color and shadow according to the determined TextStyle */
this.ppText.setColor(this.getTextColor(ppColorStyle, false)); this.ppText.setColor(this.getTextColor(ppColorStyle, false));
this.ppText.setShadowColor(this.getTextColor(ppColorStyle, true)); this.ppText.setShadowColor(this.getTextColor(ppColorStyle, true));
this.moveInfoOverlay.show(pokemonMove.getMove());
pokemon.getOpponents().forEach((opponent) => { pokemon.getOpponents().forEach((opponent) => {
opponent.updateEffectiveness(this.getEffectivenessText(pokemon, opponent, pokemonMove)); opponent.updateEffectiveness(this.getEffectivenessText(pokemon, opponent, pokemonMove));
@ -307,8 +352,10 @@ export default class FightUiHandler extends UiHandler {
this.accuracyLabel.setVisible(false); this.accuracyLabel.setVisible(false);
this.accuracyText.setVisible(false); this.accuracyText.setVisible(false);
this.moveCategoryIcon.setVisible(false); this.moveCategoryIcon.setVisible(false);
this.moveInfoOverlay.clear();
messageHandler.bg.setVisible(true); messageHandler.bg.setVisible(true);
this.eraseCursor(); this.eraseCursor();
this.active = false;
} }
clearMoves() { clearMoves() {

View File

@ -15,12 +15,16 @@ export interface MoveInfoOverlaySettings {
//location and width of the component; unaffected by scaling //location and width of the component; unaffected by scaling
x?: number; x?: number;
y?: number; y?: number;
width?: number; // default is always half the screen, regardless of scale /** Default is always half the screen, regardless of scale */
width?: number;
/** Determines whether to display the small secondary box */
hideEffectBox?: boolean;
hideBg?: boolean;
} }
const EFF_HEIGHT = 46; const EFF_HEIGHT = 48;
const EFF_WIDTH = 82; const EFF_WIDTH = 82;
const DESC_HEIGHT = 46; const DESC_HEIGHT = 48;
const BORDER = 8; const BORDER = 8;
const GLOBAL_SCALE = 6; const GLOBAL_SCALE = 6;
@ -38,6 +42,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
private acc: Phaser.GameObjects.Text; private acc: Phaser.GameObjects.Text;
private typ: Phaser.GameObjects.Sprite; private typ: Phaser.GameObjects.Sprite;
private cat: Phaser.GameObjects.Sprite; private cat: Phaser.GameObjects.Sprite;
private descBg: Phaser.GameObjects.NineSlice;
private options : MoveInfoOverlaySettings; private options : MoveInfoOverlaySettings;
@ -52,9 +57,9 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
// prepare the description box // prepare the description box
const width = (options?.width || MoveInfoOverlay.getWidth(scale, scene)) / scale; // divide by scale as we always want this to be half a window wide const width = (options?.width || MoveInfoOverlay.getWidth(scale, scene)) / scale; // divide by scale as we always want this to be half a window wide
const descBg = addWindow(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0), options?.top ? EFF_HEIGHT : 0, width - (options?.onSide ? EFF_WIDTH : 0), DESC_HEIGHT); this.descBg = addWindow(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0), options?.top ? EFF_HEIGHT : 0, width - (options?.onSide ? EFF_WIDTH : 0), DESC_HEIGHT);
descBg.setOrigin(0, 0); this.descBg.setOrigin(0, 0);
this.add(descBg); this.add(this.descBg);
// set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected
this.desc = addTextObject(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE } }); this.desc = addTextObject(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE } });
@ -125,6 +130,14 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
this.acc.setOrigin(1, 0.5); this.acc.setOrigin(1, 0.5);
this.val.add(this.acc); this.val.add(this.acc);
if (options?.hideEffectBox) {
this.val.setVisible(false);
}
if (options?.hideBg) {
this.descBg.setVisible(false);
}
// hide this component for now // hide this component for now
this.setVisible(false); this.setVisible(false);
} }
@ -176,8 +189,19 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem
this.active = false; this.active = false;
} }
toggleInfo(force?: boolean): void { toggleInfo(visible: boolean): void {
this.setVisible(force ?? !this.visible); if (visible) {
this.setVisible(true);
}
this.scene.tweens.add({
targets: this.desc,
duration: Utils.fixedInt(125),
ease: "Sine.easeInOut",
alpha: visible ? 1 : 0
});
if (!visible) {
this.setVisible(false);
}
} }
isActive(): boolean { isActive(): boolean {