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..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 @@ -254,7 +254,8 @@ public class PlayEffect extends SpellAbilityEffect { if (sa.hasParam("ShowCardToActivator")) { game.getAction().revealTo(tgtCard, activator); } - + if (singleOption && sa.getTargetCard() == null) + 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(); 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 744ce070396..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,7 +477,6 @@ public class CardView extends GameEntityView { void updateNamedCard2(Card c) { set(TrackableProperty.NamedCard2, c.getNamedCard2()); } - 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 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-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/gamemodes/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputConfirm.java index ba4ce9dd2a4..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,8 @@ 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); } else { InputConfirm inp; 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), diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 1a9fbefd397..52b164a653f 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -286,6 +286,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont 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);