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; } }