diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index 22f11d22c8f..63e2051f076 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -198,6 +198,22 @@ public PaperCard removeCardName(String name) { return null; } + /** + * Removes a card from any section it's found in, prioritizing the sideboard over other sections. + */ + public void removeAnteCard(PaperCard card) { + if (has(DeckSection.Sideboard) && get(DeckSection.Sideboard).contains(card)) { + get(DeckSection.Sideboard).remove(card); + return; + } + for (CardPool pool : parts.values()) { + if(pool.contains(card)) { + pool.remove(card); + return; + } + } + } + // will return new if it was absent public CardPool getOrCreate(DeckSection deckSection) { CardPool p = get(deckSection); diff --git a/forge-game/src/main/java/forge/game/GameOutcome.java b/forge-game/src/main/java/forge/game/GameOutcome.java index 875d5718b8d..41144102659 100644 --- a/forge-game/src/main/java/forge/game/GameOutcome.java +++ b/forge-game/src/main/java/forge/game/GameOutcome.java @@ -58,11 +58,21 @@ public AnteResult() { } public void addWon(List cards) { - this.wonCards.addAll(cards); + for(PaperCard c : cards) { + if(lostCards.contains(c)) + lostCards.remove(c); + else + wonCards.add(c); + } } public void addLost(List cards) { - this.lostCards.addAll(cards); + for(PaperCard c : cards) { + if(wonCards.contains(c)) + wonCards.remove(c); + else + lostCards.add(c); + } } } diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index a48a8785f79..3320c5c8b70 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -445,6 +445,16 @@ private void executeOwnershipChanges(Game lastGame) { } } + public GameOutcome.AnteResult getAnteResult(RegisteredPlayer player) { + GameOutcome.AnteResult out = new GameOutcome.AnteResult(); + for (GameOutcome outcome : gameOutcomes.values()) { + GameOutcome.AnteResult gameAnte = outcome.getAnteResult(player); + out.addWon(gameAnte.wonCards); + out.addLost(gameAnte.lostCards); + } + return out; + } + /** * Fire only the events after they became real for gamestate and won't get replaced.
* The events are sent to UI, log and sound system. Network listeners are under development. diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 8d1448e197d..c241530fbba 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -1196,24 +1196,10 @@ public boolean keyDown(int keyCode) { shiftKeyDown = true; } - // Cursor keys emulate swipe gestures - // First we touch the screen and later swipe (fling) in the direction of the key pressed - if (keyCode == Keys.LEFT) { - touchDown(0, 0, 0, 0); - return fling(1000, 0); - } - if (keyCode == Keys.RIGHT) { - touchDown(0, 0, 0, 0); - return fling(-1000, 0); - } - if (keyCode == Keys.UP) { - touchDown(0, 0, 0, 0); - return fling(0, -1000); - } - if (keyCode == Keys.DOWN) { - touchDown(0, 0, 0, 0); - return fling(0, 1000); - } + if (keyCode == Keys.LEFT || keyCode == Keys.RIGHT || keyCode == Keys.UP || keyCode == Keys.DOWN) + if(emulateSwipe(keyCode)) + return true; + if (keyCode == Keys.BACK) { if ((destroyThis && !isMobileAdventureMode) || (splashScreen != null && splashScreen.isShowModeSelector())) exitAnimation(false); @@ -1237,6 +1223,19 @@ else if (onHomeScreen() && isLandscapeMode()) return keyInputAdapter.keyDown(keyCode); } + private boolean emulateSwipe (int keyCode) { + // Cursor keys emulate swipe gestures + // First we touch the screen and later swipe (fling) in the direction of the key pressed + touchDown(0, 0, 0, 0); + return switch (keyCode) { + case Keys.LEFT -> fling(1000, 0); + case Keys.RIGHT -> fling(-1000, 0); + case Keys.UP -> fling(0, -1000); + case Keys.DOWN -> fling(0, 1000); + default -> false; + }; + } + @Override public boolean keyUp(int keyCode) { keyTyped = false; //reset on keyUp diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 0db85a5997b..4e9e6d7ec65 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -111,14 +111,28 @@ public void GameEnd() { } // Mostly for ante handling, but also blacker lotus - GameOutcome.AnteResult anteResult = hostedMatch.getGame().getOutcome().getAnteResult(humanPlayer); + GameOutcome.AnteResult anteResult = hostedMatch.getAnteResult(humanPlayer); if (anteResult != null) { - for (PaperCard card : anteResult.wonCards) { - Current.player().addCard(card); + if (eventData != null) { + //In an event. Apply the ante result to the current event deck. + eventData.registeredDeck.getOrCreate(DeckSection.Sideboard).add(anteResult.wonCards); + if(eventData.draftedDeck != null) + eventData.draftedDeck.getOrCreate(DeckSection.Sideboard).add(anteResult.wonCards); + for(PaperCard card : anteResult.lostCards) { + eventData.registeredDeck.removeAnteCard(card); + if(eventData.draftedDeck != null) + eventData.draftedDeck.removeAnteCard(card); + } + //Could also add the cards to the opponent's pool, but their games aren't simulated and they never edit their decks. } - for (PaperCard card : anteResult.lostCards) { - // We could clean this up by trying to combine all the lostCards into a mapping, but good enough for now - Current.player().removeLostCardFromPools(card); + else { + for (PaperCard card : anteResult.wonCards) { + Current.player().addCard(card); + } + for (PaperCard card : anteResult.lostCards) { + // We could clean this up by trying to combine all the lostCards into a mapping, but good enough for now + Current.player().removeLostCardFromPools(card); + } } } } catch (Exception e) { diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index f2ed5fee7ad..755a801afd2 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -1238,10 +1238,12 @@ public boolean keyDown(int keyCode) { boolean usingListView = currentView == listView; switch(keyCode) { - case(Input.Keys.DPAD_RIGHT): + case Input.Keys.DPAD_RIGHT: + case Input.Keys.PAGE_DOWN: setSelectedIndexRelative(usingListView ? 10 : 1); return true; case Input.Keys.DPAD_LEFT: + case Input.Keys.PAGE_UP: setSelectedIndexRelative(usingListView ? -10 : -1); return true; case Input.Keys.DPAD_DOWN: diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java index 979c75a8f5d..94d5b562e88 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java @@ -365,6 +365,10 @@ public boolean isMatchOver() { return isMatchOver; } + public GameOutcome.AnteResult getAnteResult(RegisteredPlayer player) { + return match.getAnteResult(player); + } + private final class MatchUiEventVisitor extends IGameEventVisitor.Base implements IUiEventVisitor { @Override public Void visit(final UiEventBlockerAssigned event) {