From 24d4899cde345e9d2deb45c86bd49d9aa1d7d142 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 28 Aug 2024 21:54:48 +0800 Subject: [PATCH 1/3] add resetPlayerLocation on defeat --- .../forge/adventure/character/EntryActor.java | 2 +- .../adventure/character/PortalActor.java | 2 +- .../stage/ConsoleCommandInterpreter.java | 2 +- .../src/forge/adventure/stage/GameHUD.java | 2 +- .../src/forge/adventure/stage/GameStage.java | 26 ++++++++++++++-- .../src/forge/adventure/stage/MapStage.java | 13 +++++--- .../src/forge/adventure/stage/WorldStage.java | 31 ++++++++++++------- 7 files changed, 55 insertions(+), 23 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java index e0ab361151a..94d30e9de2f 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java @@ -43,7 +43,7 @@ public class EntryActor extends MapActor{ { if(targetMap==null||targetMap.isEmpty()) { - stage.exitDungeon(); + stage.exitDungeon(false); } else { diff --git a/forge-gui-mobile/src/forge/adventure/character/PortalActor.java b/forge-gui-mobile/src/forge/adventure/character/PortalActor.java index cdcce79539c..b3ad332b674 100644 --- a/forge-gui-mobile/src/forge/adventure/character/PortalActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/PortalActor.java @@ -39,7 +39,7 @@ public class PortalActor extends EntryActor { } if (currentAnimationType == PortalAnimationTypes.Active) { if (targetMap == null || targetMap.isEmpty()) { - stage.exitDungeon(); + stage.exitDungeon(false); } else { if (targetMap.equals(currentMap)) { stage.spawn(entryTargetObject); diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index fd1e12a6f90..c167b6312d3 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -193,7 +193,7 @@ public class ConsoleCommandInterpreter { }); registerCommand(new String[]{"leave"}, s -> { if (!MapStage.getInstance().isInMap()) return "not on a map"; - MapStage.getInstance().exitDungeon(); + MapStage.getInstance().exitDungeon(false); return "Got out"; }); registerCommand(new String[]{"debug", "collision"}, s -> { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 0b4200c2ada..a24ee414799 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -882,7 +882,7 @@ public class GameHUD extends Stage { @Override public boolean act(float v) { if (exitDungeon) { - MapStage.getInstance().exitDungeon(); + MapStage.getInstance().exitDungeon(false); setDisabled(exitToWorldMapActor, true, "[%120][+ExitToWorldMap]", "\uFF0F"); setDisabled(bookmarkActor, true, "[%120][+Bookmark]", "\uFF0F"); } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 0536a3ed3b7..06276abb114 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -34,6 +34,7 @@ import forge.adventure.scene.Scene; import forge.adventure.scene.StartScene; import forge.adventure.scene.TileMapScene; import forge.adventure.util.Controls; +import forge.adventure.util.Current; import forge.adventure.util.KeyBinding; import forge.adventure.util.MapDialog; import forge.adventure.util.Paths; @@ -46,7 +47,9 @@ import forge.card.ColorSet; import forge.deck.Deck; import forge.deck.DeckProxy; import forge.game.GameType; +import forge.gui.FThreads; import forge.gui.GuiBase; +import forge.screens.TransitionScreen; import forge.util.MyRandom; import java.util.HashMap; @@ -149,7 +152,7 @@ public abstract class GameStage extends Stage { dialog.getButtonTable().clear(); dialog.clearListeners(); - if (fb.getTexture() != null) { + if (fb != null && fb.getTexture() != null) { TextureRegion tr = new TextureRegion(fb.getTexture()); tr.flip(true, true); Image image = new Image(tr); @@ -166,7 +169,8 @@ public abstract class GameStage extends Stage { Timer.schedule(new Timer.Task() { @Override public void run() { - fb.dispose(); + if (fb != null) + fb.dispose(); } }, 0.5f); })).width(240f); @@ -634,4 +638,22 @@ public abstract class GameStage extends Stage { teleported(position); } + public void resetPlayerLocation() + { + PointOfInterest poi = Current.world().findPointsOfInterest("Spawn"); + if (poi != null) { + Timer.schedule(new Timer.Task() { + @Override + public void run() { + FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new TransitionScreen(() -> { + WorldStage.getInstance().setPosition(poi.getPosition()); + WorldStage.getInstance().loadPOI(poi); + Forge.clearTransitionScreen(); + showImageDialog(Forge.getLocalizer().getMessage("lblYouLostTheLastGame", Current.player().getName()), null); + }, null, false, true, false, false))); + } + }, 0.3f); + } + } + } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index 42928ee39f8..ed18cf2d303 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -605,7 +605,7 @@ public class MapStage extends GameStage { })); break; case "exit": - addMapActor(obj, new OnCollide(MapStage.this::exitDungeon)); + addMapActor(obj, new OnCollide(() -> MapStage.this.exitDungeon(false))); break; case "dialog": if (obj instanceof TiledMapTileMapObject) { @@ -749,13 +749,15 @@ public class MapStage extends GameStage { } } - public boolean exitDungeon() { + public boolean exitDungeon(boolean defeated) { WorldSave.getCurrentSave().autoSave(); AdventureQuestController.instance().updateQuestsLeave(); clearIsInMap(); AdventureQuestController.instance().showQuestDialogs(this); isLoadingMatch = false; effect = null; //Reset dungeon effects. + if (defeated) + WorldStage.getInstance().resetPlayerLocation(); Forge.switchScene(GameScene.instance()); return true; } @@ -799,10 +801,11 @@ public class MapStage extends GameStage { AdventureQuestController.instance().updateQuestsLose(currentMob); AdventureQuestController.instance().showQuestDialogs(MapStage.this); boolean defeated = Current.player().defeated(); - if (canFailDungeon && defeated) { + if (defeated) { //If hardcore mode is added, check and redirect to game over screen here - dungeonFailedDialog(); - exitDungeon(); + if (canFailDungeon) + dungeonFailedDialog(); + exitDungeon(true); } MapStage.this.stop(); currentMob = null; diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index aba1a56aea1..136c61767f8 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -188,11 +188,14 @@ public class WorldStage extends GameStage implements SaveFileContent { currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack); startPause(0.5f, () -> { currentMob.resetCollisionHeight(); - Current.player().defeated(); + boolean defeated = Current.player().defeated(); AdventureQuestController.instance().updateQuestsLose(currentMob); AdventureQuestController.instance().showQuestDialogs(MapStage.getInstance()); WorldStage.this.removeEnemy(currentMob); currentMob = null; + if (defeated) { + WorldStage.getInstance().resetPlayerLocation(); + } }); } } @@ -209,17 +212,9 @@ public class WorldStage extends GameStage implements SaveFileContent { if (point == collidingPoint) { continue; } - try { - WorldSave.getCurrentSave().autoSave(); - TileMapScene.instance().load(point.getPointOfInterest()); - stop(); - TileMapScene.instance().setFromWorldMap(true); - Forge.switchScene(TileMapScene.instance()); - point.getMapSprite().checkOut(); - } catch (Exception e) { - System.err.println("Error loading map..."); - e.printStackTrace(); - } + WorldSave.getCurrentSave().autoSave(); + loadPOI(point.getPointOfInterest()); + point.getMapSprite().checkOut(); } else { if (point == collidingPoint) { collidingPoint = null; @@ -229,6 +224,18 @@ public class WorldStage extends GameStage implements SaveFileContent { } } + public void loadPOI(PointOfInterest poi) { + try { + TileMapScene.instance().load(poi); + stop(); + TileMapScene.instance().setFromWorldMap(true); + Forge.switchScene(TileMapScene.instance()); + } catch (Exception e) { + System.err.println("Error loading map..."); + e.printStackTrace(); + } + } + @Override public boolean isColliding(Rectangle boundingRect) { if (currentModifications.containsKey(PlayerModification.Fly)) From 14c14b880de8cd637b0a58208a80b8cb75364896 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 29 Aug 2024 10:40:26 +0800 Subject: [PATCH 2/3] update message --- forge-gui-mobile/src/forge/adventure/stage/GameStage.java | 2 +- forge-gui/res/languages/de-DE.properties | 3 ++- forge-gui/res/languages/en-US.properties | 3 ++- forge-gui/res/languages/es-ES.properties | 3 ++- forge-gui/res/languages/fr-FR.properties | 3 ++- forge-gui/res/languages/it-IT.properties | 3 ++- forge-gui/res/languages/ja-JP.properties | 3 ++- forge-gui/res/languages/pt-BR.properties | 3 ++- forge-gui/res/languages/zh-CN.properties | 3 ++- 9 files changed, 17 insertions(+), 9 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 06276abb114..81f5276033d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -649,7 +649,7 @@ public abstract class GameStage extends Stage { WorldStage.getInstance().setPosition(poi.getPosition()); WorldStage.getInstance().loadPOI(poi); Forge.clearTransitionScreen(); - showImageDialog(Forge.getLocalizer().getMessage("lblYouLostTheLastGame", Current.player().getName()), null); + showImageDialog(Forge.getLocalizer().getMessage("lblYouDied", Current.player().getName()), null); }, null, false, true, false, false))); } }, 0.3f); diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index a6011f64349..5800f1eb37e 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -3419,4 +3419,5 @@ AdvBossIntro31=Was wird als nächstes passieren? AdvBossIntro32=Nicht blinzeln! AdvBossIntro33=Hier kann man nicht verlieren! AdvBossIntro34=Es gibt kein Zurück! -AdvBossIntro35=Jetzt geht es um alles oder nichts! \ No newline at end of file +AdvBossIntro35=Jetzt geht es um alles oder nichts! +lblYouDied={0}, du bist gestorben!!! \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index b197f00a078..09a4625ff6b 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3152,4 +3152,5 @@ AdvBossIntro31=What will happen next? AdvBossIntro32=Don't blink! AdvBossIntro33=You can't lose here! AdvBossIntro34=There's no turning back! -AdvBossIntro35=It's all or nothing now! \ No newline at end of file +AdvBossIntro35=It's all or nothing now! +lblYouDied={0}, You Died!!! \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index ef444654045..529ec6e7d75 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -3433,4 +3433,5 @@ AdvBossIntro31=¿Qué pasará después? AdvBossIntro32=¡No parpadees! AdvBossIntro33=¡No puedes perder aquí! AdvBossIntro34=¡No hay marcha atrás! -AdvBossIntro35=¡Ahora es todo o nada! \ No newline at end of file +AdvBossIntro35=¡Ahora es todo o nada! +lblYouDied={0}, ¡¡¡Moriste!!! \ No newline at end of file diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index db05b60783e..811de924891 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -3427,4 +3427,5 @@ AdvBossIntro31=Que va-t-il se passer ensuite? AdvBossIntro32=Ne clignez pas des yeux ! AdvBossIntro33=Vous ne pouvez pas perdre ici ! AdvBossIntro34=Il n'y a pas de retour en arrière! -AdvBossIntro35=C'est tout ou rien maintenant ! \ No newline at end of file +AdvBossIntro35=C'est tout ou rien maintenant ! +lblYouDied={0}, tu es mort !!! \ No newline at end of file diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index e470184c205..0b5b5c01062 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -3425,4 +3425,5 @@ AdvBossIntro31=Cosa succederà dopo? AdvBossIntro32=Non sbattere le palpebre! AdvBossIntro33=Non puoi perdere qui! AdvBossIntro34=Non si può tornare indietro! -AdvBossIntro35=Adesso è tutto o niente! \ No newline at end of file +AdvBossIntro35=Adesso è tutto o niente! +lblYouDied={0}, sei morto!!! \ No newline at end of file diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 1984f718ff1..6143bd2f9de 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -3421,4 +3421,5 @@ AdvBossIntro31=次は何が起こるのだろう? AdvBossIntro32=瞬きしないでください! AdvBossIntro33=ここで負けるわけにはいかない! AdvBossIntro34=もう後戻りはできない! -AdvBossIntro35=もう、オール・オア・ナッシングだ! \ No newline at end of file +AdvBossIntro35=もう、オール・オア・ナッシングだ! +lblYouDied={0}、死んだ!!! \ No newline at end of file diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 70002c16952..bb9249ffd30 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -3511,4 +3511,5 @@ AdvBossIntro31=O que vai acontecer à seguir? AdvBossIntro32=Não pisque! AdvBossIntro33=Você não pode perder aqui! AdvBossIntro34=Não há como voltar atrás! -AdvBossIntro35=É tudo ou nada agora! \ No newline at end of file +AdvBossIntro35=É tudo ou nada agora! +lblYouDied={0}, você morreu!!! \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 8659c9e213f..e5381c5a38f 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -3412,4 +3412,5 @@ AdvBossIntro31=接下来会发生什么? AdvBossIntro32=别眨眼! AdvBossIntro33=在这里你不能输! AdvBossIntro34=没有回头路了! -AdvBossIntro35=现在要么全有要么全无! \ No newline at end of file +AdvBossIntro35=现在要么全有要么全无! +lblYouDied={0},你死了!!! \ No newline at end of file From a3f8b0aca27271e999658709352bc81a3b885eab Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 29 Aug 2024 11:24:50 +0800 Subject: [PATCH 3/3] fix overlapping dialog, fix player position --- forge-gui-mobile/src/forge/GuiMobile.java | 2 +- .../adventure/player/AdventurePlayer.java | 5 ++-- .../src/forge/adventure/stage/GameStage.java | 24 +++++++++---------- .../src/forge/adventure/stage/MapStage.java | 16 ++++++------- 4 files changed, 22 insertions(+), 25 deletions(-) diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index ded55baea98..116e24915f9 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -153,7 +153,7 @@ public class GuiMobile implements IGuiBase { @Override public void showImageDialog(final ISkinImage image, final String message, final String title) { if (Forge.isMobileAdventureMode) { - FThreads.invokeInEdtNowOrLater(() -> MapStage.getInstance().showImageDialog("Achievement Earned\n"+message, (FBufferedImage)image)); + FThreads.invokeInEdtNowOrLater(() -> MapStage.getInstance().showImageDialog("Achievement Earned\n"+message, (FBufferedImage)image, null)); return; } new WaitCallback() { diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 6a564fd554c..3cc5f505946 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -737,11 +737,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public boolean defeated() { gold = (int) (gold - (gold * difficultyData.goldLoss)); - int newLife = (int) (life - (maxLife * difficultyData.lifeLoss)); - life = Math.max(1, newLife); + life = (int) (life - (maxLife * difficultyData.lifeLoss)); onLifeTotalChangeList.emit(); onGoldChangeList.emit(); - return newLife < 1; + return life < 1; //If true, the player would have had 0 or less, and thus is actually "defeated" if the caller cares about it } diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 81f5276033d..9db140ce354 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -147,7 +147,7 @@ public abstract class GameStage extends Stage { showDialog(); } - public void showImageDialog(String message, FBufferedImage fb) { + public void showImageDialog(String message, FBufferedImage fb, Runnable runnable) { dialog.getContentTable().clear(); dialog.getButtonTable().clear(); dialog.clearListeners(); @@ -173,6 +173,9 @@ public abstract class GameStage extends Stage { fb.dispose(); } }, 0.5f); + if (runnable != null) { + runnable.run(); + } })).width(240f); dialog.setKeepWithinStage(true); setDialogStage(GameHUD.getInstance()); @@ -642,18 +645,13 @@ public abstract class GameStage extends Stage { { PointOfInterest poi = Current.world().findPointsOfInterest("Spawn"); if (poi != null) { - Timer.schedule(new Timer.Task() { - @Override - public void run() { - FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new TransitionScreen(() -> { - WorldStage.getInstance().setPosition(poi.getPosition()); - WorldStage.getInstance().loadPOI(poi); - Forge.clearTransitionScreen(); - showImageDialog(Forge.getLocalizer().getMessage("lblYouDied", Current.player().getName()), null); - }, null, false, true, false, false))); - } - }, 0.3f); - } + showImageDialog(Forge.getLocalizer().getMessage("lblYouDied", Current.player().getName()), null, + () -> FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new TransitionScreen(() -> { + WorldStage.getInstance().setPosition(new Vector2(poi.getPosition().x - 16f, poi.getPosition().y + 16f)); + WorldStage.getInstance().loadPOI(poi); + Forge.clearTransitionScreen(); + }, null, false, true, false, false)))); + }//Spawn shouldn't be null } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index ed18cf2d303..e37b975f742 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -801,19 +801,18 @@ public class MapStage extends GameStage { AdventureQuestController.instance().updateQuestsLose(currentMob); AdventureQuestController.instance().showQuestDialogs(MapStage.this); boolean defeated = Current.player().defeated(); - if (defeated) { - //If hardcore mode is added, check and redirect to game over screen here - if (canFailDungeon) - dungeonFailedDialog(); - exitDungeon(true); - } + //If hardcore mode is added, check and redirect to game over screen here + if (canFailDungeon && !defeated) + dungeonFailedDialog(true); + else + exitDungeon(defeated); MapStage.this.stop(); currentMob = null; }); } } - private void dungeonFailedDialog() { + private void dungeonFailedDialog(boolean exit) { dialog.getButtonTable().clear(); dialog.getContentTable().clear(); dialog.clearListeners(); @@ -832,7 +831,8 @@ public class MapStage extends GameStage { public void clicked(InputEvent event, float x, float y) { L.skipToTheEnd(); super.clicked(event, x, y); - //exitDungeon(); + if (exit) + exitDungeon(false); } }); dialog.getButtonTable().add(ok).width(240f);