From f59ebf64e92a1466c1eca2ab2d1482757cf53e80 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 2 Sep 2024 21:38:19 +0800 Subject: [PATCH] update adventure defeat penalty - random armor crack (unusable) - add difficulty indicator in load game preview (red - insane, gold - hard, green - normal, cyan - easy) --- .../src/forge/adventure/data/ItemData.java | 1 + .../adventure/player/AdventurePlayer.java | 18 ++++++++++++++ .../src/forge/adventure/scene/DuelScene.java | 6 ++--- .../forge/adventure/scene/InventoryScene.java | 10 +++++--- .../forge/adventure/scene/SaveLoadScene.java | 24 ++++++++++++++++++- .../stage/ConsoleCommandInterpreter.java | 6 ++--- .../src/forge/adventure/stage/GameStage.java | 3 ++- .../src/forge/adventure/stage/MapStage.java | 1 - .../src/forge/adventure/util/Current.java | 16 +++++++++++++ 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 ++- 17 files changed, 88 insertions(+), 21 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java index 2505f4cdb00..aaff00409cf 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ItemData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -23,6 +23,7 @@ public class ItemData { public boolean usableOnWorldMap; public boolean usableInPoi; + public boolean isCracked; public String commandOnUse; public int shardsNeeded; public DialogData dialogOnUse; diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 6362f3709f5..a1a5b56e3ef 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -842,6 +842,20 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return false; } + public ItemData getRandomEquippedArmor() { + Array armor = new Array<>(); + for (String name : equippedItems.values()) { + ItemData data = ItemData.getItem(name); + if (data != null + && ("Boots".equalsIgnoreCase(data.equipmentSlot) + || "Body".equalsIgnoreCase(data.equipmentSlot) + || "Neck".equalsIgnoreCase(data.equipmentSlot))) { + armor.add(data); + } + } + return armor.random(); + } + public ItemData getEquippedAbility1() { for (String name : equippedItems.values()) { ItemData data = ItemData.getItem(name); @@ -879,6 +893,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return difficultyData; } + public boolean isHardorInsaneDifficulty() { + return "Hard".equalsIgnoreCase(difficultyData.name) || "Insane".equalsIgnoreCase(difficultyData.name); + } + public void renameDeck(String text) { deck = (Deck) deck.copyTo(text); decks[selectedDeckIndex] = deck; diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index c154af0e4d0..6c711650c75 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -302,7 +302,7 @@ public class DuelScene extends ForgeScene { } else if (this.eventData != null) { deck = eventData.nextOpponent.getDeck(); } else { - deck = currentEnemy.copyPlayerDeck ? this.playerDeck : currentEnemy.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Insane") || Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); + deck = currentEnemy.copyPlayerDeck ? this.playerDeck : currentEnemy.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().isHardorInsaneDifficulty()); } RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants, deck, null, false, null, null); @@ -410,9 +410,7 @@ public class DuelScene extends ForgeScene { this.eventData = eventData; if (eventData != null && eventData.eventRules == null) eventData.eventRules = new AdventureEventData.AdventureEventRules(AdventureEventController.EventFormat.Constructed, 1.0f); - this.arenaBattleChallenge = isArena - && (Current.player().getDifficulty().name.equalsIgnoreCase("Hard") - || Current.player().getDifficulty().name.equalsIgnoreCase("Insane")); + this.arenaBattleChallenge = isArena && Current.player().isHardorInsaneDifficulty(); if (eventData != null && eventData.registeredDeck != null) this.playerDeck = eventData.registeredDeck; else diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 442081fa5c1..b7651596470 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -218,10 +218,13 @@ public class InventoryScene extends UIScene { } } + public void clearItemDescription() { + itemDescription.setText(""); + } private void setSelected(Button actor) { selected = actor; if (actor == null) { - itemDescription.setText(""); + clearItemDescription(); deleteButton.setDisabled(true); equipButton.setDisabled(true); useButton.setDisabled(true); @@ -246,7 +249,7 @@ public class InventoryScene extends UIScene { if (Current.player().getShards() < data.shardsNeeded) useButton.setDisabled(true); - if (data.equipmentSlot == null || data.equipmentSlot.isEmpty()) { + if (data.equipmentSlot == null || data.equipmentSlot.isEmpty() || data.isCracked) { equipButton.setDisabled(true); } else { equipButton.setDisabled(false); @@ -261,7 +264,8 @@ public class InventoryScene extends UIScene { button.layout(); } } - itemDescription.setText(data.name + "\n[%98]" + data.getDescription()); + String status = data.isCracked ? " (" + Forge.getLocalizer().getMessage("lblCracked") + ")" : ""; + itemDescription.setText(data.name + status + "\n[%98]" + data.getDescription()); } else if (deckLocation.containsKey(actor)){ Deck data = (deckLocation.get(actor)); diff --git a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java index 2ac83e3c0c1..14bf9185907 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java @@ -379,6 +379,28 @@ public class SaveLoadScene extends UIScene { } public String getSaveFileSuffix() { - return ASCII_179 + GameScene.instance().getAdventurePlayerLocation(true, true); + String difficulty; + switch (AdventurePlayer.current().getDifficulty().name) { + case "easy": + case "Easy": + difficulty = "[%99][CYAN]\uFF0A[WHITE]"; + break; + case "normal": + case "Normal": + difficulty = "[%99][GREEN]\uFF0A[WHITE]"; + break; + case "hard": + case "Hard": + difficulty = "[%99][GOLD]\uFF0A[WHITE]"; + break; + case "insane": + case "Insane": + difficulty = "[%99][RED]\uFF0A[WHITE]"; + break; + default: + difficulty = "[%99][WHITE]"; + break; + } + return ASCII_179 + difficulty + GameScene.instance().getAdventurePlayerLocation(true, true); } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index c167b6312d3..4ef484a0f2f 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -254,7 +254,7 @@ public class ConsoleCommandInterpreter { }); registerCommand(new String[]{"dumpEnemyDeckColors"}, s -> { for (EnemyData E : new Array.ArrayIterator<>(WorldData.getAllEnemies())) { - Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); + Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().isHardorInsaneDifficulty()); DeckProxy DP = new DeckProxy(D, "Constructed", GameType.Constructed, null); ColorSet colorSet = DP.getColor(); System.out.printf("%s: Colors: %s (%s%s%s%s%s%s)\n", D.getName(), DP.getColor(), @@ -270,7 +270,7 @@ public class ConsoleCommandInterpreter { }); registerCommand(new String[]{"dumpEnemyDeckList"}, s -> { for (EnemyData E : new Array.ArrayIterator<>(WorldData.getAllEnemies())) { - Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); + Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().isHardorInsaneDifficulty()); DeckProxy DP = new DeckProxy(D, "Constructed", GameType.Constructed, null); System.out.printf("Deck: %s\n%s\n\n", D.getName(), DP.getDeck().getMain().toCardList("\n") ); @@ -279,7 +279,7 @@ public class ConsoleCommandInterpreter { }); registerCommand(new String[]{"dumpEnemyColorIdentity"}, s -> { for (EnemyData E : new Array.ArrayIterator<>(WorldData.getAllEnemies())) { - Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); + Deck D = E.generateDeck(Current.player().isFantasyMode(), Current.player().isUsingCustomDeck() || Current.player().isHardorInsaneDifficulty()); DeckProxy DP = new DeckProxy(D, "Constructed", GameType.Constructed, null); System.out.printf("%s Colors: %s | Deck Colors: %s (%s)%s\n", E.name, E.colors, DP.getColorIdentity().toEnumSet().toString(), DP.getName() , E.boss ? " - BOSS" : ""); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 5d09f6238c4..9ecb5fb67e2 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -658,11 +658,12 @@ public abstract class GameStage extends Stage { Timer.schedule(new Timer.Task() { @Override public void run() { - showImageDialog(Forge.getLocalizer().getMessage("lblYouDied", Current.player().getName()), null, + showImageDialog(Current.generateDefeatMessage(), null, () -> FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new TransitionScreen(() -> { Forge.advFreezePlayerControls = false; WorldStage.getInstance().setPosition(new Vector2(poi.getPosition().x - 16f, poi.getPosition().y + 16f)); WorldStage.getInstance().loadPOI(poi); + WorldSave.getCurrentSave().autoSave(); Forge.clearTransitionScreen(); }, Forge.takeScreenshot(), "")))); } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index 728b6fad50b..7d762f4b7f8 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -750,7 +750,6 @@ public class MapStage extends GameStage { } public boolean exitDungeon(boolean defeated) { - WorldSave.getCurrentSave().autoSave(); AdventureQuestController.instance().updateQuestsLeave(); clearIsInMap(); AdventureQuestController.instance().showQuestDialogs(this); diff --git a/forge-gui-mobile/src/forge/adventure/util/Current.java b/forge-gui-mobile/src/forge/adventure/util/Current.java index 4978d00cca5..013835e9948 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Current.java +++ b/forge-gui-mobile/src/forge/adventure/util/Current.java @@ -1,6 +1,9 @@ package forge.adventure.util; +import forge.Forge; +import forge.adventure.data.ItemData; import forge.adventure.player.AdventurePlayer; +import forge.adventure.scene.InventoryScene; import forge.adventure.world.World; import forge.adventure.world.WorldSave; import forge.deck.Deck; @@ -24,5 +27,18 @@ public class Current { public static void setLatestDeck(Deck generateDeck) { deck=generateDeck; } + public static String generateDefeatMessage() {; + String message = Forge.getLocalizer().getMessage("lblYouDied", player().getName()); + if (player().isHardorInsaneDifficulty()) { + ItemData itemData = player().getRandomEquippedArmor(); + if (itemData != null) { + itemData.isCracked = true; + player().equip(itemData); //unequip... + InventoryScene.instance().clearItemDescription(); + message += "\n{GRADIENT=RED;GRAY;1;1}" + itemData.name + " {ENDGRADIENT}" + Forge.getLocalizer().getMessage("lblCracked"); + } + } + return message; + } } diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 0dfbf110283..4d02b28a191 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -3433,4 +3433,5 @@ lblHideNoSell=No-Sell Ausblenden lblShowNoSell=No-Sell Anzeigen lblShowAll=Alle Anzeigen lblHideCollection=Sammlung Ausblenden -lblShowCollection=Sammlung Anzeigen \ No newline at end of file +lblShowCollection=Sammlung Anzeigen +lblCracked=Geknackt! \ 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 b7b4123ea3a..80863cca86b 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3166,4 +3166,5 @@ lblHideNoSell=Hide No-Sell lblShowNoSell=Show No-Sell lblShowAll=Show All lblHideCollection=Hide Collection -lblShowCollection=Show Collection \ No newline at end of file +lblShowCollection=Show Collection +lblCracked=Cracked! \ 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 36d40cee076..36ffbc1b600 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -3447,4 +3447,5 @@ lblHideNoSell=Ocultar No Vender lblShowNoSell=Mostrar No Vender lblShowAll=Mostrar Todo lblHideCollection=Ocultar Colección -lblShowCollection=Mostrar Colección \ No newline at end of file +lblShowCollection=Mostrar Colección +lblCracked=¡Agrietado! \ 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 a75eef9ebc3..1941f39fa0e 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -3441,4 +3441,5 @@ lblHideNoSell=Masquer Non-Vente lblShowNoSell=Afficher Non-Vente lblShowAll=Afficher Tout lblHideCollection=Masquer la Collection -lblShowCollection=Afficher la Collection \ No newline at end of file +lblShowCollection=Afficher la Collection +lblCracked=Fissuré! \ 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 d5f5a0b96c4..14d613f27cd 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -3439,4 +3439,5 @@ lblHideNoSell=Nascondi Non Vendita lblShowNoSell=Mostra Non Vendita lblShowAll=Mostra Tutto lblHideCollection=Nascondi Collezione -lblShowCollection=Mostra Collezione \ No newline at end of file +lblShowCollection=Mostra Collezione +lblCracked=Incrinato! \ 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 8538de7fa7c..e08a27e1a8a 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -3435,4 +3435,5 @@ lblHideNoSell=ノーセールを隠す lblShowNoSell=ノーセールを表示 lblShowAll=すべて表示 lblHideCollection=コレクションを非表示にする -lblShowCollection=ショーコレクション \ No newline at end of file +lblShowCollection=ショーコレクション +lblCracked=ひび割れた! \ 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 7d8584be098..3ff8bc9b44c 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -3525,4 +3525,5 @@ lblHideNoSell=Ocultar Não Vender lblShowNoSell=Mostrar Não-Venda lblShowAll=Mostrar Tudo lblHideCollection=Ocultar Coleção -lblShowCollection=Mostrar Coleção \ No newline at end of file +lblShowCollection=Mostrar Coleção +lblCracked=Rachado! \ 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 830fe496650..b77274cf232 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -3426,4 +3426,5 @@ lblHideNoSell=隐藏不卖 lblShowNoSell=显示不卖 lblShowAll=显示全部 lblHideCollection=隐藏收藏 -lblShowCollection=展会系列 \ No newline at end of file +lblShowCollection=展会系列 +lblCracked=破裂了! \ No newline at end of file