From 24d4899cde345e9d2deb45c86bd49d9aa1d7d142 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 28 Aug 2024 21:54:48 +0800 Subject: [PATCH] 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))