From 041fbfe5232c99b46c013b2a84601a94cf903501 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 1 Apr 2022 13:26:23 +0000 Subject: [PATCH] Update check to viewable cards --- 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/trackable/TrackableProperty.java | 1 + .../forge/screens/match/views/VCardDisplayArea.java | 10 ++++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) 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 33125a3ea8f..cd2df2231b5 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -477,6 +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.indexOf(pv) != -1; + } 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 @@ -877,6 +881,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-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index c13ce18bc25..f704c9ae727 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -15,6 +15,7 @@ import forge.card.CardRenderer.CardStackPosition; import forge.card.CardZoom; import forge.card.CardZoom.ActivateHandler; import forge.game.card.CardView; +import forge.game.zone.ZoneType; import forge.gui.FThreads; import forge.gui.GuiBase; import forge.screens.match.MatchController; @@ -365,8 +366,13 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH } public boolean selectCard(boolean selectEntireStack) { - if (!getCard().getController().equals(MatchController.instance.getCurrentPlayer()) && !getCard().mayPlayerLook(MatchController.instance.getCurrentPlayer())) { - return false; + if (!getCard().getController().equals(MatchController.instance.getCurrentPlayer()) && !ZoneType.Battlefield.equals(getCard().getZone())) { + if (getCard().mayPlayerLook(MatchController.instance.getCurrentPlayer())) { // can see the card, check if can play... + if (!getCard().getMayPlayPlayers(MatchController.instance.getCurrentPlayer())) + return false; + } else { + return false; + } } if (MatchController.instance.getGameController().selectCard(getCard(), getOtherCardsToSelect(selectEntireStack), null)) { Gdx.graphics.requestRendering();