diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java b/forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java index f1cbd1d20fb..7790807270e 100644 --- a/forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java +++ b/forge-adventure/src/main/java/forge/adventure/scene/DeckEditScene.java @@ -26,8 +26,8 @@ import java.util.Map; */ public class DeckEditScene extends ForgeScene { public class AdventureDeckEditor extends FDeckEditor { - public AdventureDeckEditor(boolean commander) { - super(commander ? EditorType.QuestCommander : EditorType.Quest, "", false, new FEvent.FEventHandler() { + public AdventureDeckEditor( ) { + super( EditorType.Quest, "", false, new FEvent.FEventHandler() { @Override public void handleEvent(FEvent e) { AdventureApplicationAdapter.instance.switchToLast(); @@ -40,24 +40,36 @@ public class DeckEditScene extends ForgeScene { QuestSpellShop.updateDecksForEachCard(); } + @Override + protected boolean allowDelete() { + return false; + } + @Override + protected boolean allowsSave() { + return false; + } + @Override + protected boolean allowsAddBasic() { + return false; + } + @Override + protected boolean allowRename() { + return false; + } + @Override + protected boolean isLimitedEditor() { + return true; + } + @Override protected Map getColOverrides(ItemManagerConfig config) { Map colOverrides = new HashMap<>(); - switch (config) { - case QUEST_EDITOR_POOL: - ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); - break; - case QUEST_DECK_EDITOR: - ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); - ItemColumn.addColOverride(config, colOverrides, ColumnDef.DECKS, QuestSpellShop.fnDeckCompare, QuestSpellShop.fnDeckGet); - break; - default: - colOverrides = null; //shouldn't happen - break; - } + ItemColumn.addColOverride(config, colOverrides, ColumnDef.NEW, FModel.getQuest().getCards().getFnNewCompare(), FModel.getQuest().getCards().getFnNewGet()); + ItemColumn.addColOverride(config, colOverrides, ColumnDef.DECKS, QuestSpellShop.fnDeckCompare, QuestSpellShop.fnDeckGet); return colOverrides; } + public void refresh() { for(TabPage page:tabPages) { @@ -96,7 +108,7 @@ public class DeckEditScene extends ForgeScene { FModel.getQuest().getCards().addSingleCard(card.getKey(), card.getValue()); - Deck deck = AdventurePlayer.current().getDeck(); + Deck deck = AdventurePlayer.current().getSelectedDeck(); getScreen(); screen.getEditorType().getController().setDeck(deck); screen.refresh(); @@ -112,7 +124,7 @@ public class DeckEditScene extends ForgeScene { @Override public FScreen getScreen() { - return screen==null?screen = new AdventureDeckEditor(false):screen; + return screen==null?screen = new AdventureDeckEditor():screen; } } diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java b/forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java new file mode 100644 index 00000000000..22bbd7faa37 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/scene/DeckSelectScene.java @@ -0,0 +1,144 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.IntMap; +import forge.adventure.AdventureApplicationAdapter; +import forge.adventure.util.Controls; +import forge.adventure.util.Current; +import forge.adventure.world.AdventurePlayer; + +public class DeckSelectScene extends UIScene { + private final IntMap buttons = new IntMap<>(); + Color defColor; + Dialog dialog; + TextField textInput; + Table layout; + Label header; + int currentSlot = 0; + + public DeckSelectScene() { + super("ui/deck_selector.json"); + } + + + + + private TextButton addDeckSlot(String name, int i) { + TextButton button = Controls.newTextButton("-"); + button.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + try { + if(!button.isDisabled()) + select(i); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + layout.add(Controls.newLabel(name)).expandX(); + layout.add(button).expandX(); + buttons.put(i, button); + layout.row(); + return button; + + } + + public void back() { + AdventureApplicationAdapter.instance.switchToLast(); + } + + public boolean select(int slot) { + currentSlot = slot; + + for (IntMap.Entry butt : new IntMap.Entries (buttons)) { + butt.value.setColor(defColor); + } + if (buttons.containsKey(slot)) { + TextButton button = buttons.get(slot); + button.setColor(Color.RED); + } + Current.player().setSelectedDeckSlot(slot); + + return true; + } + + + + @Override + public boolean keyPressed(int keycode) + { + if (keycode == Input.Keys.ESCAPE) + { + back(); + } + return true; + } + @Override + public void enter() { + select(Current.player().getSelectedDeckIndex()); + for(int i=0;i rename())).align(Align.left); + dialog.getButtonTable().add(Controls.newTextButton("Abort", () -> dialog.hide())).align(Align.left); + + ui.onButtonPress("return",()-> back()); + ui.onButtonPress("edit",()-> edit()); + ui.onButtonPress("rename",()-> { + textInput.setText(Current.player().getSelectedDeck().getName()); + dialog.show(stage); + stage.setKeyboardFocus(textInput); + }); + defColor = ui.findActor("return").getColor(); + + + ScrollPane scrollPane = ui.findActor("deckSlots"); + scrollPane.setActor(layout); + } + + private void rename() { + dialog.hide(); + String text=textInput.getText(); + Current.player().renameDeck(text); + buttons.get(currentSlot).setText(Current.player().getDeck(currentSlot).getName()); + } + private void edit() { + + AdventureApplicationAdapter.instance.switchScene(SceneType.DeckEditScene.instance); + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java index e62347041fa..10fd7438fe1 100644 --- a/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java +++ b/forge-adventure/src/main/java/forge/adventure/scene/DuelScene.java @@ -47,13 +47,14 @@ public class DuelScene extends ForgeScene { public void GameEnd() { + boolean winner=humanPlayer == hostedMatch.getGame().getMatch().getWinner(); Gdx.app.postRunnable(() -> { SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music Scene last= AdventureApplicationAdapter.instance.switchToLast(); if(last instanceof HudScene) { - ((HudScene)last).stage.setWinner(humanPlayer == hostedMatch.getGame().getMatch().getWinner()); + ((HudScene)last).stage.setWinner(winner); } }); @@ -66,7 +67,7 @@ public class DuelScene extends ForgeScene { appliedVariants.add(GameType.Constructed); List players = new ArrayList<>(); - Deck playerDeck=(Deck)AdventurePlayer.current().getDeck().copyTo("PlayerDeckCopy"); + Deck playerDeck=(Deck)AdventurePlayer.current().getSelectedDeck().copyTo("PlayerDeckCopy"); int missingCards= Config.instance().getConfigData().minDeckSize-playerDeck.getMain().countAll(); if(missingCards>0) playerDeck.getMain().add("Wastes",missingCards); diff --git a/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java b/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java index b5d66aade45..452098d1d49 100644 --- a/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java +++ b/forge-adventure/src/main/java/forge/adventure/scene/ForgeInput.java @@ -23,7 +23,6 @@ public class ForgeInput extends FGestureAdapter { private static char lastKeyTyped; private static boolean keyTyped, shiftKeyDown; private final ForgeScene forgeScene; - private final Forge.KeyInputAdapter keyInputAdapter = null; //mouseMoved and scrolled events for desktop version private int mouseMovedX, mouseMovedY; @@ -67,7 +66,7 @@ public class ForgeInput extends FGestureAdapter { back(); } */ - if (keyInputAdapter == null) { + if (Forge.keyInputAdapter == null) { if (Forge.KeyInputAdapter.isModifierKey(keyCode)) { return false; //don't process modifiers keys for unknown adapter } @@ -81,7 +80,7 @@ public class ForgeInput extends FGestureAdapter { } return container.keyDown(keyCode); } - return keyInputAdapter.keyDown(keyCode); + return Forge.keyInputAdapter.keyDown(keyCode); } @Override @@ -90,21 +89,21 @@ public class ForgeInput extends FGestureAdapter { if (keyCode == Input.Keys.SHIFT_LEFT || keyCode == Input.Keys.SHIFT_RIGHT) { shiftKeyDown = false; } - if (keyInputAdapter != null) { - return keyInputAdapter.keyUp(keyCode); + if (Forge.keyInputAdapter != null) { + return Forge.keyInputAdapter.keyUp(keyCode); } return false; } @Override public boolean keyTyped(char ch) { - if (keyInputAdapter != null) { + if (Forge.keyInputAdapter != null) { if (ch >= ' ' && ch <= '~') { //only process this event if character is printable //prevent firing this event more than once for the same character on the same key down, otherwise it fires too often if (lastKeyTyped != ch || !keyTyped) { keyTyped = true; lastKeyTyped = ch; - return keyInputAdapter.keyTyped(ch); + return Forge.keyInputAdapter.keyTyped(ch); } } } @@ -130,8 +129,8 @@ public class ForgeInput extends FGestureAdapter { public boolean touchDown(int x, int y, int pointer, int button) { if (pointer == 0) { //don't change listeners when second finger goes down for zoom updatePotentialListeners(x, y); - if (keyInputAdapter != null) { - if (!keyInputAdapter.allowTouchInput() || !potentialListeners.contains(keyInputAdapter.getOwner())) { + if (Forge.keyInputAdapter != null) { + if (!Forge.keyInputAdapter.allowTouchInput() || !potentialListeners.contains(Forge.keyInputAdapter.getOwner())) { //endKeyInput(); //end key input if needed } } diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java b/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java index 1e981669645..b5010d7da30 100644 --- a/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java +++ b/forge-adventure/src/main/java/forge/adventure/scene/SaveLoadScene.java @@ -95,7 +95,7 @@ public class SaveLoadScene extends UIScene { public void loadSave() { if (save) { - textInput.setText("Save Game " + currentSlot); + textInput.setText(buttons.get(currentSlot).getText().toString()); dialog.show(stage); stage.setKeyboardFocus(textInput); } else { diff --git a/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java b/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java index 3a4188cf35f..52eb0610c0d 100644 --- a/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java +++ b/forge-adventure/src/main/java/forge/adventure/scene/SceneType.java @@ -13,7 +13,8 @@ public enum SceneType { DeckEditScene(new forge.adventure.scene.DeckEditScene()), TileMapScene(new forge.adventure.scene.TileMapScene()), RewardScene(new forge.adventure.scene.RewardScene()), - InnScene(new forge.adventure.scene.InnScene()); + InnScene(new forge.adventure.scene.InnScene()), + DeckSelectScene(new forge.adventure.scene.DeckSelectScene()); public final forge.adventure.scene.Scene instance; diff --git a/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java b/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java index ad414572f1e..750d9b17cf7 100644 --- a/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java +++ b/forge-adventure/src/main/java/forge/adventure/stage/GameHUD.java @@ -107,7 +107,7 @@ public class GameHUD extends Stage { private Object openDeck() { - AdventureApplicationAdapter.instance.switchScene(SceneType.DeckEditScene.instance); + AdventureApplicationAdapter.instance.switchScene(SceneType.DeckSelectScene.instance); return null; } diff --git a/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java b/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java index 2a21e4d1d0c..1cdb46cb6ad 100644 --- a/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java +++ b/forge-adventure/src/main/java/forge/adventure/world/AdventurePlayer.java @@ -8,6 +8,7 @@ import forge.adventure.data.HeroListData; import forge.adventure.util.*; import forge.deck.CardPool; import forge.deck.Deck; +import forge.deck.DeckSection; import java.io.Serializable; @@ -15,6 +16,7 @@ import java.io.Serializable; * Class that represents the player (not the player sprite) */ public class AdventurePlayer implements Serializable, SaveFileContent { + public static final int NUMBER_OF_DECKS=10; private Deck deck; private int avatarIndex; private int heroRace; @@ -25,7 +27,17 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private int gold=0; private int maxLife=20; private int life=20; + private int selectedDeckIndex=0; + private Deck[] decks=new Deck[NUMBER_OF_DECKS]; private final DifficultyData difficultyData=new DifficultyData(); + public AdventurePlayer() + { + + for(int i=0;i=0&&slot Dscreens = new ArrayDeque<>(); diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 1ea1d071e98..e255f877093 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -353,12 +353,19 @@ public class FDeckEditor extends TabPageScreen { editorType.getController().load(editDeckPath, editDeckName); } - btnSave.setCommand(new FEventHandler() { - @Override - public void handleEvent(FEvent e) { - save(null); - } - }); + if(allowsSave()) + { + btnSave.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + save(null); + } + }); + } + else + { + btnSave.setVisible(false); + } btnMoreOptions.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -367,38 +374,39 @@ public class FDeckEditor extends TabPageScreen { protected void buildMenu() { final Localizer localizer = Localizer.getInstance(); - addItem(new FMenuItem(localizer.getMessage("lblAddBasicLands"), FSkinImage.LANDLOGO, new FEventHandler() { - @Override - public void handleEvent(FEvent e) { - CardEdition defaultLandSet; - switch (editorType) { - case Draft: - case Sealed: - case QuestDraft: - //suggest a random set from the ones used in the limited card pool that have all basic lands - Set availableEditionCodes = new HashSet<>(); - for (PaperCard p : deck.getAllCardsInASinglePool().toFlatList()) { - availableEditionCodes.add(FModel.getMagicDb().getEditions().get(p.getEdition())); + if (allowsAddBasic()) + addItem(new FMenuItem(localizer.getMessage("lblAddBasicLands"), FSkinImage.LANDLOGO, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + CardEdition defaultLandSet; + switch (editorType) { + case Draft: + case Sealed: + case QuestDraft: + //suggest a random set from the ones used in the limited card pool that have all basic lands + Set availableEditionCodes = new HashSet<>(); + for (PaperCard p : deck.getAllCardsInASinglePool().toFlatList()) { + availableEditionCodes.add(FModel.getMagicDb().getEditions().get(p.getEdition())); + } + defaultLandSet = CardEdition.Predicates.getRandomSetWithAllBasicLands(availableEditionCodes); + break; + case Quest: + defaultLandSet = FModel.getQuest().getDefaultLandSet(); + break; + default: + defaultLandSet = DeckProxy.getDefaultLandSet(deck); + break; } - defaultLandSet = CardEdition.Predicates.getRandomSetWithAllBasicLands(availableEditionCodes); - break; - case Quest: - defaultLandSet = FModel.getQuest().getDefaultLandSet(); - break; - default: - defaultLandSet = DeckProxy.getDefaultLandSet(deck); - break; + AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, defaultLandSet, new Callback() { + @Override + public void run(CardPool landsToAdd) { + getMainDeckPage().addCards(landsToAdd); + } + }); + dialog.show(); + setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck is visible below dialog } - AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, defaultLandSet, new Callback() { - @Override - public void run(CardPool landsToAdd) { - getMainDeckPage().addCards(landsToAdd); - } - }); - dialog.show(); - setSelectedPage(getMainDeckPage()); //select main deck page if needed so main deck is visible below dialog - } - })); + })); if (!isLimitedEditor()) { addItem(new FMenuItem(localizer.getMessage("lblImportFromClipboard"), Forge.hdbuttons ? FSkinImage.HDIMPORT : FSkinImage.OPEN, new FEventHandler() { @Override @@ -655,7 +663,13 @@ public class FDeckEditor extends TabPageScreen { return null; //never use backdrop for editor } - private boolean isLimitedEditor() { + protected boolean allowsSave() { + return true; + } + protected boolean allowsAddBasic() { + return true; + } + protected boolean isLimitedEditor() { switch (editorType) { case Draft: case Sealed: @@ -1819,7 +1833,7 @@ public class FDeckEditor extends TabPageScreen { final Localizer localizer = Localizer.getInstance(); name = "[" + localizer.getMessage("lblNewDeck") + "]"; } - if (!saved) { + if (!saved && editor.allowsSave()) { name = "*" + name; } editor.lblName.setText(name); diff --git a/forge-gui/res/adventure/Shandalar/ui/deck_selector.json b/forge-gui/res/adventure/Shandalar/ui/deck_selector.json new file mode 100644 index 00000000000..853b0160104 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/ui/deck_selector.json @@ -0,0 +1,51 @@ +{ + "width": 480, + "height": 270, + "yDown": true, + "elements":[ + { + "type" : "Image", + "image":"ui/title_bg.png", + "width": 480, + "height": 270 + } , + + { + "type" : "Scroll", + "name": "deckSlots", + "x": 10, + "y": 10 , + "width": 344, + "height": 235 + } , + { + "type" : "TextButton", + "name" : "return" , + "text" : "Back" , + "width": 48, + "height": 16, + "x": 15, + "y": 250 + } , + { + "type" : "TextButton", + "name" : "rename" , + "text" : "Rename Deck" , + "width": 48, + "height": 16, + "x": 115, + "y": 250 + } , + { + "type" : "TextButton", + "name" : "edit" , + "text" : "Edit Deck" , + "width": 48, + "height": 16, + "x": 215, + "y": 250 + } + ] + + +} \ No newline at end of file