diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index aefb53e2a8b..b78a6271577 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Null; import com.google.common.collect.Lists; +import forge.Forge; import forge.adventure.data.*; import forge.adventure.util.*; import forge.adventure.world.WorldSave; @@ -78,7 +79,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { } private void clearDecks() { - for (int i = 0; i < NUMBER_OF_DECKS; i++) decks[i] = new Deck("Empty Deck"); + for (int i = 0; i < NUMBER_OF_DECKS; i++) decks[i] = new Deck(Forge.getLocalizer().getMessage("lblEmptyDeck")); deck = decks[0]; selectedDeckIndex = 0; } @@ -347,7 +348,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { for (int i = 0; i < NUMBER_OF_DECKS; i++) { if (!data.containsKey("deck_name_" + i)) { if (i == 0) decks[i] = deck; - else decks[i] = new Deck("Empty Deck"); + else decks[i] = new Deck(Forge.getLocalizer().getMessage("lblEmptyDeck")); continue; } decks[i] = new Deck(data.readString("deck_name_" + i)); @@ -845,4 +846,31 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public void removeQuest(AdventureQuestData quest) { quests.remove(quest); } + + /** + * Deletes a deck by replacing the current selected deck with a new deck + */ + public void deleteDeck() { + deck = decks[selectedDeckIndex] = new Deck(Forge.getLocalizer().getMessage("lblEmptyDeck")); + } + + /** + * Attempts to copy a deck to an empty slot. + * + * @return int - index of new copy slot, or -1 if no slot was available + */ + public int copyDeck() { + for (int i = 0; i < decks.length; i++ ){ + if (isEmptyDeck(i)) { + decks[i] = (Deck)deck.copyTo(deck.getName() + " (" + Forge.getLocalizer().getMessage("lblCopy") + ")"); + return i; + } + } + + return -1; + } + + public boolean isEmptyDeck(int deckIndex) { + return decks[deckIndex].isEmpty() && decks[deckIndex].getName().equals(Forge.getLocalizer().getMessage("lblEmptyDeck")); + } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java index bb71bd02e4d..bc21ed3329f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DeckSelectScene.java @@ -61,10 +61,48 @@ public class DeckSelectScene extends UIScene { textInput.setText(Current.player().getSelectedDeck().getName()); showRenameDialog(); }); + ui.onButtonPress("copy", DeckSelectScene.this::copy); + ui.onButtonPress("delete", DeckSelectScene.this::maybeDelete); defColor = ui.findActor("return").getColor(); window.add(root); } + private void copy() { + if (Current.player().isEmptyDeck(currentSlot)) return; + int index = Current.player().copyDeck(); + if (index == -1) { + showDialog(createGenericDialog(Forge.getLocalizer().getMessage("lblCopy"), Forge.getLocalizer().getMessage("lblNoAvailableSlots"), + Forge.getLocalizer().getMessage("lblOk"), + null, this::removeDialog, null)); + } + else { + updateDeckButton(index); + select(index); + scrollPane.scrollTo(buttons.get(index).getX(), buttons.get(index).getY(), 0, 0); + } + } + + private void maybeDelete() { + if (Current.player().isEmptyDeck(currentSlot)) return; + Dialog deleteDialog = createGenericDialog(Forge.getLocalizer().getMessage("lblDelete"), Forge.getLocalizer().getMessage("lblAreYouSureProceedDelete"), + Forge.getLocalizer().getMessage("lblOk"), + Forge.getLocalizer().getMessage("lblAbort"), this::delete, this::removeDialog); + + showDialog(deleteDialog); + } + + private void delete() { + Current.player().deleteDeck(); + updateDeckButton(currentSlot); + removeDialog(); + } + + private void updateDeckButton(int index) { + buttons.get(index).setText(Current.player().getDeck(index).getName()); + buttons.get(index).getTextraLabel().layout(); + buttons.get(index).layout(); + } + private void showRenameDialog() { if (renameDialog == null) { renameDialog = createGenericDialog(Forge.getLocalizer().getMessage("lblRenameDeck"), null, diff --git a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java index 887f18f9b6f..cf6fd2f7799 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java @@ -243,8 +243,11 @@ public class UIScene extends Scene { if (label != null) dialog.text(label); TextraButton yes = Controls.newTextButton(stringYes, runnableYes); - TextraButton no = Controls.newTextButton(stringNo, runnableNo); - dialog.button(yes).button(no); + dialog.button(yes); + if (stringNo != null) { + TextraButton no = Controls.newTextButton(stringNo, runnableNo); + dialog.button(no); + } return dialog; } diff --git a/forge-gui/res/adventure/Shandalar/ui/deck_selector.json b/forge-gui/res/adventure/Shandalar/ui/deck_selector.json index d171071ed74..0ca362d7b99 100644 --- a/forge-gui/res/adventure/Shandalar/ui/deck_selector.json +++ b/forge-gui/res/adventure/Shandalar/ui/deck_selector.json @@ -25,7 +25,7 @@ "width": 100, "height": 30, "x": 365, - "y": 60 + "y": 10 }, { "type": "TextButton", @@ -34,7 +34,7 @@ "width": 100, "height": 30, "x": 365, - "y": 120 + "y": 60 }, { "type": "TextButton", @@ -44,7 +44,25 @@ "width": 100, "height": 30, "x": 365, - "y": 180 + "y": 110 + }, + { + "type": "TextButton", + "name": "copy", + "text": "tr(lblCopy)", + "width": 100, + "height": 30, + "x": 365, + "y": 160 + }, + { + "type": "TextButton", + "name": "delete", + "text": "tr(lblDelete)", + "width": 100, + "height": 30, + "x": 365, + "y": 210 } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/deck_selector_portrait.json b/forge-gui/res/adventure/Shandalar/ui/deck_selector_portrait.json index 9972c0107e7..d1b9cdb1a71 100644 --- a/forge-gui/res/adventure/Shandalar/ui/deck_selector_portrait.json +++ b/forge-gui/res/adventure/Shandalar/ui/deck_selector_portrait.json @@ -15,16 +15,25 @@ "x": 4, "y": 4, "width": 262, - "height": 442 + "height": 414 }, { "type": "TextButton", - "name": "return", - "text": "tr(lblBack)", + "name": "delete", + "text": "tr(lblDelete)", "width": 86, "height": 30, "x": 4, - "y": 448 + "y": 418 + }, + { + "type": "TextButton", + "name": "copy", + "text": "tr(lblCopy)", + "width": 86, + "height": 30, + "x": 92, + "y": 418 }, { "type": "TextButton", @@ -32,16 +41,27 @@ "text": "tr(lblRename)", "width": 86, "height": 30, - "x": 92, + "x": 180, + "y": 418 + }, + { + "type": "TextButton", + "name": "return", + "text": "tr(lblBack)", + "binding": "Back", + "width": 130, + "height": 30, + "x": 4, "y": 448 }, { "type": "TextButton", "name": "edit", "text": "tr(lblEdit)", - "width": 86, + "binding": "Use", + "width": 130, "height": 30, - "x": 180, + "x": 136, "y": 448 } ] diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 19688b1830d..70c2c019e3d 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -2961,3 +2961,5 @@ lblExitToWoldMap=Zurück zur Weltkarte? lblStartArena=Willst du in die Arena gehen? lblWouldYouLikeDestroy=Möchten Sie {0} zerstören? lblAdventureDescription=Im Abenteuermodus erkunden Sie die sich ständig ändernde Landschaft von Shandalar und Duell-Kreaturen; um Gold, Scherben, Ausrüstung und neue Karten zu gewinnen, sie alle zu sammeln und der Beste zu werden! +lblEmptyDeck=Leeres Kartendeck +lblNoAvailableSlots=Keine verfgbaren Slots diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 5189e430adb..ddcc90817c0 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2969,4 +2969,6 @@ lblBoon=Boon lblExitToWoldMap=Exit to the World Map? lblStartArena=Do you want to go into the Arena? lblWouldYouLikeDestroy=Would you like to destroy {0}? -lblAdventureDescription=Adventure mode is where you explore the ever-changing landscape of Shandalar, and duel creatures to gain gold, shards, equipment and new cards to become the best and collect them all! \ No newline at end of file +lblAdventureDescription=Adventure mode is where you explore the ever-changing landscape of Shandalar, and duel creatures to gain gold, shards, equipment and new cards to become the best and collect them all! +lblEmptyDeck=Empty Deck +lblNoAvailableSlots=No available slots \ 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 e32553c66d6..7049e2651fa 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2963,4 +2963,6 @@ lblBoon=Boon lblExitToWoldMap=Salir al mapa del mundo? lblStartArena=¿Quieres ir a la arena? lblWouldYouLikeDestroy=¿Le gustaría destruir {0}? -lblAdventureDescription=¡El modo de aventura es donde exploras el paisaje siempre cambiante de Shandalar, y criaturas de duelo para ganar oro, fragmentos, equipos y nuevas tarjetas para convertirte en el mejor y recogerlas a todos! \ No newline at end of file +lblAdventureDescription=El modo de aventura es donde exploras el paisaje siempre cambiante de Shandalar, y criaturas de duelo para ganar oro, fragmentos, equipos y nuevas tarjetas para convertirte en el mejor y recogerlas a todos! +lblEmptyDeck=Baraja de cartas vaca +lblNoAvailableSlots=No hay ranuras disponibles diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 47aefb3a90f..62f6c4d2af7 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -2965,4 +2965,6 @@ lblBoon=Aubaine lblExitToWoldMap=Sortir sur la carte du monde? lblStartArena=Voulez-vous entrer dans l'arène? lblWouldYouLikeDestroy=Souhaitez-vous détruire {0}? -lblAdventureDescription=Le mode aventure est l'endroit où vous explorez le paysage en constante évolution de Shandalar, et des créatures duel pour gagner de l'or, des éclats, de l'équipement et de nouvelles cartes pour devenir les meilleurs et les récupérer tous! \ No newline at end of file +lblAdventureDescription=Le mode aventure est l'endroit où vous explorez le paysage en constante évolution de Shandalar, et des créatures duel pour gagner de l'or, des éclats, de l'équipement et de nouvelles cartes pour devenir les meilleurs et les récupérer tous! +lblEmptyDeck=Jeu de cartes vide +lblNoAvailableSlots=Aucune fente disponible diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index e27c9a00769..5b1fd660af8 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -2967,3 +2967,5 @@ lblExitToWoldMap=Esci alla mappa del mondo? lblStartArena=Vuoi andare nell'arena? lblWouldYouLikeDestroy=Vorresti distruggere {0}? lblAdventureDescription=La modalità Adventure è dove esplori il paesaggio in continua evoluzione di Shandalar e le creature di duello per guadagnare oro, frammenti, attrezzature e nuove carte per diventare i migliori e raccoglierle tutte! +lblEmptyDeck=Mazzo di carte vuoto +lblNoAvailableSlots=Nessuno slot disponibile diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index f4992d475cd..84cd585e088 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -2962,4 +2962,6 @@ lblBoon=ブーン lblExitToWoldMap=世界地図に終了しますか? lblStartArena=アリーナに行きたいですか? lblWouldYouLikeDestroy={0}を破壊しますか? -lblAdventureDescription=アドベンチャーモードは、金、破片、機器、新しいカードを獲得して最高のものになり、すべてを集めるために、Shandalarの絶えず変化する風景と決闘の生き物を探求する場所です! \ No newline at end of file +lblAdventureDescription=アドベンチャーモードは、金、破片、機器、新しいカードを獲得して最高のものになり、すべてを集めるために、Shandalarの絶えず変化する風景と決闘の生き物を探求する場所です! +lblEmptyDeck=空のトランプデッキ +lblNoAvailableSlots=使用可能なスロットがありませる。 diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 2982074468c..d84c38c03b0 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -3052,4 +3052,7 @@ lblBoon=Boon lblExitToWoldMap=Sair para o mapa do mundo? lblStartArena=Você quer entrar na arena? lblWouldYouLikeDestroy=Você gostaria de destruir {0}? -lblAdventureDescription=O modo de aventura é onde você explora a paisagem em constante mudança de Shandalar, e duelo para ganhar ouro, fragmentos, equipamentos e novos cartões para se tornarem os melhores e colecioná-los! \ No newline at end of file +lblAdventureDescription=O modo de aventura é onde você explora a paisagem em constante mudança de Shandalar, e duelo para ganhar ouro, fragmentos, equipamentos e novos cartões para se tornarem os melhores e colecioná-los! +lblEmptyDeck=Baralho de cartas vazio +lblNoAvailableSlots=No h slots disponveis + diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index d15e7bfcbb3..00b22fec9b9 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -2945,4 +2945,6 @@ lblBoon=恩赐 lblExitToWoldMap=退出世界地图? lblStartArena=您想进入竞技场吗? lblWouldYouLikeDestroy=您想销毁{0}吗? -lblAdventureDescription=冒险模式是您探索山达尔(Shandalar)不断变化的景观,以及决斗生物获得黄金,碎片,设备和新卡片,使其成为最好的,并收集所有这些! \ No newline at end of file +lblAdventureDescription=冒险模式是您探索山达尔(Shandalar)不断变化的景观,以及决斗生物获得黄金,碎片,设备和新卡片,使其成为最好的,并收集所有这些! +lblEmptyDeck=空牌 - 空牌 +lblNoAvailableSlots=没有可用的槽位