From 438b2f83b2790a4c94a5383eded6c05e5a7f4127 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 31 Mar 2022 20:04:28 +0800 Subject: [PATCH 01/12] [Mobile] Fix Mobile GUI getAbilityToPlay closes #2127 --- .../src/main/java/forge/screens/match/CMatchUI.java | 5 +++++ .../src/forge/screens/match/MatchController.java | 11 +++++++++++ .../forge/screens/match/views/VCardDisplayArea.java | 2 +- .../java/forge/gamemodes/net/server/NetGuiGame.java | 5 +++++ .../src/main/java/forge/gui/interfaces/IGuiGame.java | 1 + .../main/java/forge/player/PlayerControllerHuman.java | 6 +++++- 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index dd8e8d006ed..635165dbfbf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -414,6 +414,11 @@ public final class CMatchUI cCombat.update(); } // showCombat(CombatView) + @Override + public void showZoom(CardView card) { + //do nothing since this is for mobile GUI + } + @Override public void updateDayTime(String daytime) { super.updateDayTime(daytime); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 6773711bed2..e8bc156c2c1 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -12,6 +12,7 @@ import forge.deck.Deck; import forge.game.player.Player; import forge.item.IPaperCard; import forge.screens.TransitionScreen; +import forge.screens.match.views.VCardDisplayArea; import forge.util.collect.FCollection; import org.apache.commons.lang3.StringUtils; @@ -354,6 +355,16 @@ public class MatchController extends AbstractGuiGame { public void showCombat() { } + @Override + public void showZoom(CardView card) { + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + VCardDisplayArea.CardAreaPanel.get(card).showZoom(); + } + }); + } + @Override public void showManaPool(final PlayerView player) { final VPlayerPanel playerPanel = view.getPlayerPanel(player); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 30f6773cd40..2485900c456 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -393,7 +393,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH return false; } - private void showZoom() { + public void showZoom() { if (displayArea == null) { return; } final List cards = displayArea.orderedCards; diff --git a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java index c3788e4b3fb..10f2afcff08 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java @@ -69,6 +69,11 @@ public class NetGuiGame extends AbstractGuiGame { send(ProtocolMethod.showCombat); } + @Override + public void showZoom(CardView card) { + //do nothing + } + @Override public void showPromptMessage(final PlayerView playerView, final String message) { updateGameView(); diff --git a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java index 9cf1c96fb09..3b802061dd5 100644 --- a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java @@ -38,6 +38,7 @@ public interface IGuiGame { void openView(TrackableCollection myPlayers); void afterGameEnd(); void showCombat(); + void showZoom(CardView card); void showPromptMessage(PlayerView playerView, String message); void showCardPromptMessage(PlayerView playerView, String message, CardView card); void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 1a9fbefd397..ad926c60720 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -270,8 +270,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public SpellAbility getAbilityToPlay(final Card hostCard, final List abilities, final ITriggerEvent triggerEvent) { + boolean setDummy = false; // make sure another human player can't choose opponents cards just because he might see them - if (triggerEvent != null && !hostCard.isInPlay() && !hostCard.getOwner().equals(player) && + if ((triggerEvent != null||GuiBase.getInterface().isLibgdxPort()) && !hostCard.isInPlay() && !hostCard.getOwner().equals(player) && !hostCard.getController().equals(player) && // If player cast Shaman's Trance, they can play spells from any Graveyard (if other effects allow it to be cast) (!player.hasKeyword("Shaman's Trance") || !hostCard.isInZone(ZoneType.Graveyard))) { @@ -283,6 +284,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } if (noPermission) { + //simulate default activate action to show zoom so we don't give a hint that the selected card is a spell + if (GuiBase.getInterface().isLibgdxPort()) + getGui().showZoom(hostCard.getView()); return null; } } From c5143c7f34cfc5b582084f69119f1316ec48bc6c Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 31 Mar 2022 20:07:19 +0800 Subject: [PATCH 02/12] remove unused variable --- forge-gui/src/main/java/forge/player/PlayerControllerHuman.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index ad926c60720..c5a384e74ce 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -270,7 +270,6 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public SpellAbility getAbilityToPlay(final Card hostCard, final List abilities, final ITriggerEvent triggerEvent) { - boolean setDummy = false; // make sure another human player can't choose opponents cards just because he might see them if ((triggerEvent != null||GuiBase.getInterface().isLibgdxPort()) && !hostCard.isInPlay() && !hostCard.getOwner().equals(player) && !hostCard.getController().equals(player) && From 9e2d4692636dd15ae339a1d982c248b02e68b77e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 31 Mar 2022 20:18:57 +0800 Subject: [PATCH 03/12] NPE prevention --- .../src/forge/screens/match/MatchController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index e8bc156c2c1..25410ee1087 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -360,7 +360,11 @@ public class MatchController extends AbstractGuiGame { FThreads.invokeInEdtLater(new Runnable() { @Override public void run() { - VCardDisplayArea.CardAreaPanel.get(card).showZoom(); + try { + VCardDisplayArea.CardAreaPanel.get(card).showZoom(); + } catch (Exception e) { + e.printStackTrace(); + } } }); } From 218caf8b33c9746acb0d1027509b499ca658982d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 07:08:36 +0800 Subject: [PATCH 04/12] Update check --- .../java/forge/game/ability/effects/PlayEffect.java | 4 +++- forge-game/src/main/java/forge/game/card/Card.java | 7 +++++++ .../src/main/java/forge/game/card/CardView.java | 10 +++++++++- .../main/java/forge/trackable/TrackableProperty.java | 1 + .../main/java/forge/player/PlayerControllerHuman.java | 11 +++++++---- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 10e67f4e9fa..5ee44e050a3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -254,7 +254,8 @@ public class PlayEffect extends SpellAbilityEffect { if (sa.hasParam("ShowCardToActivator")) { game.getAction().revealTo(tgtCard, activator); } - + if (singleOption && sa.getTargetCard() == null) + sa.setTargetCard(tgtCard);// show card to play rathern than showing the source card if (singleOption && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())))) { if (wasFaceDown) { tgtCard.turnFaceDownNoUpdate(); @@ -304,6 +305,7 @@ public class PlayEffect extends SpellAbilityEffect { if (!sa.hasParam("CastFaceDown")) { // only one mode can be used + tgtCard.setMayPlay(sa.getActivatingPlayer(), true, null, false, true, null); tgtSA = sa.getActivatingPlayer().getController().getAbilityToPlay(tgtCard, sas); } else { // For Illusionary Mask effect diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index fe98e67b667..eebad79b618 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3337,6 +3337,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } return result; } + public final List getMayPlayPlayers() { + List result = Lists.newArrayList(); + for (CardPlayOption o : mayPlay.values()) { + result.add(o.getPlayer()); + } + return result; + } public final void setMayPlay(final Player player, final boolean withoutManaCost, final Cost altManaCost, final boolean withFlash, final boolean grantZonePermissions, final StaticAbility sta) { this.mayPlay.put(sta, new CardPlayOption(player, sta, withoutManaCost, altManaCost, withFlash, grantZonePermissions)); } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 3027fd09c99..cf0919f0e8d 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -477,7 +477,10 @@ public class CardView extends GameEntityView { void updateNamedCard2(Card c) { set(TrackableProperty.NamedCard2, c.getNamedCard2()); } - + public boolean getMayPlayPlayers(PlayerView pv) { + TrackableCollection col = get(TrackableProperty.MayPlayPlayers); + return col != null && col.contains(pv); + } public boolean mayPlayerLook(PlayerView pv) { TrackableCollection col = get(TrackableProperty.PlayerMayLook); return col != null && col.contains(pv); @@ -877,6 +880,11 @@ public class CardView extends GameEntityView { updateZoneText(c); updateDamage(c); + if (c.getMayPlayPlayers().isEmpty()) + set(TrackableProperty.MayPlayPlayers, null); + else + set(TrackableProperty.MayPlayPlayers, PlayerView.getCollection(c.getMayPlayPlayers())); + if (c.getIntensity(false) > 0) { updateIntensity(c); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 59d71f7a4b4..5d2dcdc36f8 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -73,6 +73,7 @@ public enum TrackableProperty { NamedCard(TrackableTypes.StringType), NamedCard2(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), + MayPlayPlayers(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), EntityAttachedTo(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), UntilLeavesBattlefield(TrackableTypes.CardViewCollectionType), diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index c5a384e74ce..e9ab54ddeca 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -271,7 +271,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public SpellAbility getAbilityToPlay(final Card hostCard, final List abilities, final ITriggerEvent triggerEvent) { // make sure another human player can't choose opponents cards just because he might see them - if ((triggerEvent != null||GuiBase.getInterface().isLibgdxPort()) && !hostCard.isInPlay() && !hostCard.getOwner().equals(player) && + if (triggerEvent != null && !hostCard.isInPlay() && !hostCard.getOwner().equals(player) && !hostCard.getController().equals(player) && // If player cast Shaman's Trance, they can play spells from any Graveyard (if other effects allow it to be cast) (!player.hasKeyword("Shaman's Trance") || !hostCard.isInZone(ZoneType.Graveyard))) { @@ -283,9 +283,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } if (noPermission) { - //simulate default activate action to show zoom so we don't give a hint that the selected card is a spell - if (GuiBase.getInterface().isLibgdxPort()) - getGui().showZoom(hostCard.getView()); + return null; + } + } + if (!hostCard.getController().equals(player)) { + if (!hostCard.getMayPlayPlayers().contains(player)) { + getGui().showZoom(hostCard.getView()); return null; } } From 4b20a6cdc709bf6f6dbd5435679bb1b9aff86415 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 10:41:02 +0800 Subject: [PATCH 05/12] Update check again --- .../java/forge/gamemodes/match/input/InputBase.java | 11 +++++++++-- .../main/java/forge/player/PlayerControllerHuman.java | 3 +-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java index a6e10c3d992..9041edf7849 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputBase.java @@ -27,6 +27,7 @@ import forge.game.player.Player; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityView; +import forge.gui.GuiBase; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.player.PlayerControllerHuman; @@ -123,10 +124,16 @@ public abstract class InputBase implements java.io.Serializable, Input { controller.getGui().showPromptMessage(getOwner(), message); } protected final void showMessage(final String message, final SpellAbilityView sav) { - controller.getGui().showCardPromptMessage(getOwner(), message, sav.getHostCard()); + if (GuiBase.isNetworkplay()) //todo additional check to pass this + controller.getGui().showPromptMessage(getOwner(), message); + else + controller.getGui().showCardPromptMessage(getOwner(), message, sav.getHostCard()); } protected final void showMessage(final String message, final CardView card) { - controller.getGui().showCardPromptMessage(getOwner(), message, card); + if (GuiBase.isNetworkplay()) //todo additional check to pass this + controller.getGui().showPromptMessage(getOwner(), message); + else + controller.getGui().showCardPromptMessage(getOwner(), message, card); } protected String getTurnPhasePriorityMessage(final Game game) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index e9ab54ddeca..31c8b781766 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -285,8 +285,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (noPermission) { return null; } - } - if (!hostCard.getController().equals(player)) { + } else if (!hostCard.isInPlay() && !hostCard.getController().equals(player)) { if (!hostCard.getMayPlayPlayers().contains(player)) { getGui().showZoom(hostCard.getView()); return null; From fbc5ea41931e6bb4ec72cdda9460c8e7c3134d03 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 12:20:57 +0800 Subject: [PATCH 06/12] update ProtocolMethod --- forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java index e8bf8957670..b73ab851d2d 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java @@ -76,7 +76,7 @@ public enum ProtocolMethod { refreshField (Mode.SERVER, Void.TYPE), // TODO case "setPlayerAvatar": openZones (Mode.SERVER, PlayerZoneUpdates.class, PlayerView.class, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class), - restoreOldZones (Mode.SERVER, Void.TYPE, PlayerView.class, Iterable/*PlayerZoneUpdates*/.class), + restoreOldZones (Mode.SERVER, Void.TYPE, PlayerView.class, PlayerZoneUpdates.class), isUiSetToSkipPhase (Mode.SERVER, Boolean.TYPE, PlayerView.class, PhaseType.class), setRememberedActions(Mode.SERVER, Void.TYPE), nextRememberedAction(Mode.SERVER, Void.TYPE), From 746a2ce568cf5952bc4d32bec4e8ae926eabfd25 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 16:43:05 +0800 Subject: [PATCH 07/12] remove unnecessary methods --- .../main/java/forge/game/ability/effects/PlayEffect.java | 3 +-- forge-game/src/main/java/forge/game/card/Card.java | 7 ------- forge-game/src/main/java/forge/game/card/CardView.java | 9 --------- .../main/java/forge/game/spellability/SpellAbility.java | 7 +++++++ .../src/main/java/forge/trackable/TrackableProperty.java | 1 - .../java/forge/gamemodes/match/input/InputConfirm.java | 2 ++ .../main/java/forge/player/PlayerControllerHuman.java | 5 ----- 7 files changed, 10 insertions(+), 24 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 5ee44e050a3..4a1323b46a2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -255,7 +255,7 @@ public class PlayEffect extends SpellAbilityEffect { game.getAction().revealTo(tgtCard, activator); } if (singleOption && sa.getTargetCard() == null) - sa.setTargetCard(tgtCard);// show card to play rathern than showing the source card + sa.setPlayEffectCard(tgtCard);// show card to play rather than showing the source card if (singleOption && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())))) { if (wasFaceDown) { tgtCard.turnFaceDownNoUpdate(); @@ -305,7 +305,6 @@ public class PlayEffect extends SpellAbilityEffect { if (!sa.hasParam("CastFaceDown")) { // only one mode can be used - tgtCard.setMayPlay(sa.getActivatingPlayer(), true, null, false, true, null); tgtSA = sa.getActivatingPlayer().getController().getAbilityToPlay(tgtCard, sas); } else { // For Illusionary Mask effect diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index eebad79b618..fe98e67b667 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3337,13 +3337,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } return result; } - public final List getMayPlayPlayers() { - List result = Lists.newArrayList(); - for (CardPlayOption o : mayPlay.values()) { - result.add(o.getPlayer()); - } - return result; - } public final void setMayPlay(final Player player, final boolean withoutManaCost, final Cost altManaCost, final boolean withFlash, final boolean grantZonePermissions, final StaticAbility sta) { this.mayPlay.put(sta, new CardPlayOption(player, sta, withoutManaCost, altManaCost, withFlash, grantZonePermissions)); } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 3103e86601a..33125a3ea8f 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -477,10 +477,6 @@ public class CardView extends GameEntityView { void updateNamedCard2(Card c) { set(TrackableProperty.NamedCard2, c.getNamedCard2()); } - public boolean getMayPlayPlayers(PlayerView pv) { - TrackableCollection col = get(TrackableProperty.MayPlayPlayers); - return col != null && col.contains(pv); - } public boolean mayPlayerLook(PlayerView pv) { TrackableCollection col = get(TrackableProperty.PlayerMayLook); // TODO don't use contains as it only queries the backing HashSet which is problematic for netplay because of unsynchronized player ids @@ -881,11 +877,6 @@ public class CardView extends GameEntityView { updateZoneText(c); updateDamage(c); - if (c.getMayPlayPlayers().isEmpty()) - set(TrackableProperty.MayPlayPlayers, null); - else - set(TrackableProperty.MayPlayPlayers, PlayerView.getCollection(c.getMayPlayPlayers())); - if (c.getIntensity(false) > 0) { updateIntensity(c); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 9b77523a995..17a3a23cdc8 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -113,6 +113,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private ManaCost multiKickerManaCost; private Player activatingPlayer; private Player targetingPlayer; + private Card playEffectCard; private Pair controlledByPlayer; private ManaCostBeingPaid manaCostBeingPaid; private boolean spentPhyrexian = false; @@ -1788,6 +1789,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit targetChosen.add(card); setStackDescription(getHostCard().getName() + " - targeting " + card); } + public void setPlayEffectCard(final Card card) { + playEffectCard = card; + } + public Card getPlayEffectCard() { + return playEffectCard; + } /** *

diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 5d2dcdc36f8..59d71f7a4b4 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -73,7 +73,6 @@ public enum TrackableProperty { NamedCard(TrackableTypes.StringType), NamedCard2(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), - MayPlayPlayers(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), EntityAttachedTo(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), UntilLeavesBattlefield(TrackableTypes.CardViewCollectionType), diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java index ba4ce9dd2a4..b711389930b 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java @@ -80,6 +80,8 @@ public class InputConfirm extends InputSyncronizedBase { return controller.getGui().confirm((sa.getTargetCard()==null)?null:CardView.get(sa.getTargetCard()), message, defaultIsYes, options); if (ApiType.Play.equals(sa.getApi()) && sa.getHostCard() != null && sa.getHostCard().getImprintedCards().size() == 1) return controller.getGui().confirm((sa.getHostCard().getImprintedCards().get(0)==null)?null:CardView.get(sa.getHostCard().getImprintedCards().get(0)), message, defaultIsYes, options); + if (ApiType.Play.equals(sa.getApi()) && sa.getPlayEffectCard() != null) + return controller.getGui().confirm(CardView.get(sa.getPlayEffectCard()), message, defaultIsYes, options); return controller.getGui().confirm(CardView.get(sa.getHostCard()), message, defaultIsYes, options); } else { InputConfirm inp; diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 31c8b781766..1a9fbefd397 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -285,11 +285,6 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (noPermission) { return null; } - } else if (!hostCard.isInPlay() && !hostCard.getController().equals(player)) { - if (!hostCard.getMayPlayPlayers().contains(player)) { - getGui().showZoom(hostCard.getView()); - return null; - } } spellViewCache = SpellAbilityView.getMap(abilities); final SpellAbilityView resultView = getGui().getAbilityToPlay(CardView.get(hostCard), From d0624068f52e0900357f15a6425668701b4b5fac Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 17:12:37 +0800 Subject: [PATCH 08/12] update check for mobile --- .../java/forge/player/PlayerControllerHuman.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 1a9fbefd397..0770e97acbe 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -286,6 +286,21 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return null; } } + if (GuiBase.getInterface().isLibgdxPort()) { //todo add better check + if (hostCard.isInZone(ZoneType.Hand) && !hostCard.getController().equals(player)) { + boolean noPermission = true; + for (CardPlayOption o : hostCard.mayPlay(player)) { + if (o.grantsZonePermissions()) { + noPermission = false; + break; + } + } + if (noPermission) { + getGui().showZoom(hostCard.getView()); + return null; + } + } + } spellViewCache = SpellAbilityView.getMap(abilities); final SpellAbilityView resultView = getGui().getAbilityToPlay(CardView.get(hostCard), Lists.newArrayList(spellViewCache.keySet()), triggerEvent); From b7977c628cfc2103ee19e1725a60e3aadfce45b6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 18:48:28 +0800 Subject: [PATCH 09/12] remove check, add note here since it occurs only on mobile GUI --- .../java/forge/player/PlayerControllerHuman.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 0770e97acbe..52b164a653f 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -286,21 +286,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return null; } } - if (GuiBase.getInterface().isLibgdxPort()) { //todo add better check - if (hostCard.isInZone(ZoneType.Hand) && !hostCard.getController().equals(player)) { - boolean noPermission = true; - for (CardPlayOption o : hostCard.mayPlay(player)) { - if (o.grantsZonePermissions()) { - noPermission = false; - break; - } - } - if (noPermission) { - getGui().showZoom(hostCard.getView()); - return null; - } - } - } + //FIXME - on mobile gui it allows the card to cast from opponent hands issue #2127, investigate where the bug occurs before this method is called spellViewCache = SpellAbilityView.getMap(abilities); final SpellAbilityView resultView = getGui().getAbilityToPlay(CardView.get(hostCard), Lists.newArrayList(spellViewCache.keySet()), triggerEvent); From edc4fa78fbbfc5893fa44dd87de9d86a885ac7da Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 18:51:33 +0800 Subject: [PATCH 10/12] remove extras --- .../main/java/forge/screens/match/CMatchUI.java | 5 ----- .../src/forge/screens/match/MatchController.java | 14 -------------- .../screens/match/views/VCardDisplayArea.java | 2 +- .../forge/gamemodes/net/server/NetGuiGame.java | 5 ----- .../main/java/forge/gui/interfaces/IGuiGame.java | 1 - 5 files changed, 1 insertion(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 635165dbfbf..dd8e8d006ed 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -414,11 +414,6 @@ public final class CMatchUI cCombat.update(); } // showCombat(CombatView) - @Override - public void showZoom(CardView card) { - //do nothing since this is for mobile GUI - } - @Override public void updateDayTime(String daytime) { super.updateDayTime(daytime); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 25410ee1087..f8f0f154163 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -355,20 +355,6 @@ public class MatchController extends AbstractGuiGame { public void showCombat() { } - @Override - public void showZoom(CardView card) { - FThreads.invokeInEdtLater(new Runnable() { - @Override - public void run() { - try { - VCardDisplayArea.CardAreaPanel.get(card).showZoom(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - @Override public void showManaPool(final PlayerView player) { final VPlayerPanel playerPanel = view.getPlayerPanel(player); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 2485900c456..30f6773cd40 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -393,7 +393,7 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH return false; } - public void showZoom() { + private void showZoom() { if (displayArea == null) { return; } final List cards = displayArea.orderedCards; diff --git a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java index 10f2afcff08..c3788e4b3fb 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java @@ -69,11 +69,6 @@ public class NetGuiGame extends AbstractGuiGame { send(ProtocolMethod.showCombat); } - @Override - public void showZoom(CardView card) { - //do nothing - } - @Override public void showPromptMessage(final PlayerView playerView, final String message) { updateGameView(); diff --git a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java index 3b802061dd5..9cf1c96fb09 100644 --- a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java @@ -38,7 +38,6 @@ public interface IGuiGame { void openView(TrackableCollection myPlayers); void afterGameEnd(); void showCombat(); - void showZoom(CardView card); void showPromptMessage(PlayerView playerView, String message); void showCardPromptMessage(PlayerView playerView, String message, CardView card); void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk); From cf9fbcac9dff09746159721eb3208f00f174132d Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 19:06:15 +0800 Subject: [PATCH 11/12] remove duplicate --- .../src/main/java/forge/gamemodes/match/input/InputConfirm.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java index b711389930b..ff638c30c50 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java @@ -78,8 +78,6 @@ public class InputConfirm extends InputSyncronizedBase { return controller.getGui().confirm(null, message, defaultIsYes, options); if (sa.getTargets() != null && sa.getTargets().isTargetingAnyCard() && sa.getTargets().size() == 1) return controller.getGui().confirm((sa.getTargetCard()==null)?null:CardView.get(sa.getTargetCard()), message, defaultIsYes, options); - if (ApiType.Play.equals(sa.getApi()) && sa.getHostCard() != null && sa.getHostCard().getImprintedCards().size() == 1) - return controller.getGui().confirm((sa.getHostCard().getImprintedCards().get(0)==null)?null:CardView.get(sa.getHostCard().getImprintedCards().get(0)), message, defaultIsYes, options); if (ApiType.Play.equals(sa.getApi()) && sa.getPlayEffectCard() != null) return controller.getGui().confirm(CardView.get(sa.getPlayEffectCard()), message, defaultIsYes, options); return controller.getGui().confirm(CardView.get(sa.getHostCard()), message, defaultIsYes, options); From 68102b8ac357200637100564886ea95b7c08b400 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 19:10:06 +0800 Subject: [PATCH 12/12] unused import --- forge-gui-mobile/src/forge/screens/match/MatchController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index f8f0f154163..6773711bed2 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -12,7 +12,6 @@ import forge.deck.Deck; import forge.game.player.Player; import forge.item.IPaperCard; import forge.screens.TransitionScreen; -import forge.screens.match.views.VCardDisplayArea; import forge.util.collect.FCollection; import org.apache.commons.lang3.StringUtils;