From 7ed7fec8086ad1d52f7b6d7c273b0fbf9d129d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20T=2E?= <99520451+Vassiat@users.noreply.github.com> Date: Wed, 11 Sep 2024 23:12:20 -0400 Subject: [PATCH 1/3] [BUG][UI/UX] Correction of errors when ``` Save & Quit``` and ``` Log out``` (#3105) * Fixes confirmation issues in SAVE_AND_QUIT and LOG_OUT * Added LOADING mode to prevent spamming from SAVE_AND_QUIT and LOG_OUT buttons, and added option to set black background for LOADING mode * Fixed conditional statement to ensure robustness in live environments to avoid potential issues in production * Good overlay position --- src/ui/menu-ui-handler.ts | 40 ++++++++++++++++++++++++++++---------- src/ui/modal-ui-handler.ts | 19 ++++++++++++++++++ 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index adbb3089e5c..b8c3cfd1364 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -460,6 +460,7 @@ export default class MenuUiHandler extends MessageUiHandler { } } } + this.showText("", 0); switch (adjustedCursor) { case MenuOptions.GAME_SETTINGS: ui.setOverlayMode(Mode.SETTINGS); @@ -548,15 +549,28 @@ export default class MenuUiHandler extends MessageUiHandler { case MenuOptions.SAVE_AND_QUIT: if (this.scene.currentBattle) { success = true; + const doSaveQuit = () => { + ui.setMode(Mode.LOADING, { + buttonActions: [], fadeOut: () => + this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => { + + this.scene.reset(true); + }) + }); + }; if (this.scene.currentBattle.turn > 1) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)), () => { + if (!this.active) { + this.showText("", 0); + return; + } + ui.setOverlayMode(Mode.CONFIRM, doSaveQuit, () => { ui.revertMode(); - ui.showText("", 0); + this.showText("", 0); }, false, -98); }); } else { - this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => this.scene.reset(true)); + doSaveQuit(); } } else { error = true; @@ -565,19 +579,25 @@ export default class MenuUiHandler extends MessageUiHandler { case MenuOptions.LOG_OUT: success = true; const doLogout = () => { - Utils.apiFetch("account/logout", true).then(res => { - if (!res.ok) { - console.error(`Log out failed (${res.status}: ${res.statusText})`); - } - Utils.removeCookie(Utils.sessionIdKey); - updateUserInfo().then(() => this.scene.reset(true, true)); + ui.setMode(Mode.LOADING, { + buttonActions: [], fadeOut: () => Utils.apiFetch("account/logout", true).then(res => { + if (!res.ok) { + console.error(`Log out failed (${res.status}: ${res.statusText})`); + } + Utils.removeCookie(Utils.sessionIdKey); + updateUserInfo().then(() => this.scene.reset(true, true)); + }) }); }; if (this.scene.currentBattle) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { + if (!this.active) { + this.showText("", 0); + return; + } ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { ui.revertMode(); - ui.showText("", 0); + this.showText("", 0); }, false, -98); }); } else { diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 5f586ec8db7..2aeafa68b23 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -89,6 +89,25 @@ export abstract class ModalUiHandler extends UiHandler { show(args: any[]): boolean { if (args.length >= 1 && "buttonActions" in args[0]) { super.show(args); + if (args[0].hasOwnProperty("fadeOut") && typeof args[0].fadeOut === "function") { + const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(); + + const overlay = this.scene.add.rectangle(( this.getWidth() + marginLeft + marginRight) / 2, (this.getHeight() + marginTop + marginBottom) / 2,this.scene.game.canvas.width / 6,this.scene.game.canvas.height /6, 0); + overlay.setOrigin(0.5,0.5); + overlay.setName("rect-ui-overlay-modal"); + overlay.setAlpha(0); + + this.modalContainer.add(overlay); + this.modalContainer.moveTo(overlay,0); + + this.scene.tweens.add({ + targets: overlay, + alpha: 1, + duration: 250, + ease: "Sine.easeOut", + onComplete: args[0].fadeOut + }); + } const config = args[0] as ModalConfig; From 0af59bbb14d9d0b3d2b0a661e0a76c5a7e41189f Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Thu, 12 Sep 2024 00:13:57 -0400 Subject: [PATCH 2/3] [Refactor] Fix linter issue (#4191) --- src/ui/modal-ui-handler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 2aeafa68b23..80a39d7bf7f 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -92,13 +92,13 @@ export abstract class ModalUiHandler extends UiHandler { if (args[0].hasOwnProperty("fadeOut") && typeof args[0].fadeOut === "function") { const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(); - const overlay = this.scene.add.rectangle(( this.getWidth() + marginLeft + marginRight) / 2, (this.getHeight() + marginTop + marginBottom) / 2,this.scene.game.canvas.width / 6,this.scene.game.canvas.height /6, 0); - overlay.setOrigin(0.5,0.5); + const overlay = this.scene.add.rectangle(( this.getWidth() + marginLeft + marginRight) / 2, (this.getHeight() + marginTop + marginBottom) / 2, this.scene.game.canvas.width / 6, this.scene.game.canvas.height /6, 0); + overlay.setOrigin(0.5, 0.5); overlay.setName("rect-ui-overlay-modal"); overlay.setAlpha(0); this.modalContainer.add(overlay); - this.modalContainer.moveTo(overlay,0); + this.modalContainer.moveTo(overlay, 0); this.scene.tweens.add({ targets: overlay, From 2f0a53ba46ddf946774b32ff647a7a875114e7f7 Mon Sep 17 00:00:00 2001 From: cam Date: Thu, 12 Sep 2024 00:49:18 -0400 Subject: [PATCH 3/3] [Sprite] Added default head spots to spinda (#4188) Spritesheets front & front shiny --- public/images/pokemon/327.png | Bin 2780 -> 3108 bytes public/images/pokemon/shiny/327.png | Bin 2785 -> 3108 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/327.png b/public/images/pokemon/327.png index 81e636db632caba0d5bffd3ddc9393a3e5cb56de..c103de3916dfbd0ee8fbdb94fd5ffc1eb191a779 100644 GIT binary patch literal 3108 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 literal 2785 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 j{NsJHFgI(uz