From b816bae232efa2d0912dc2d6c7e8b83c4ad543fe Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 19 Jul 2020 15:59:42 +0000 Subject: [PATCH] MayLook: refactor it to use timestamp, also handle facedown exile --- .../main/java/forge/game/StaticEffect.java | 41 ++--------------- .../src/main/java/forge/game/card/Card.java | 45 +++++++++++++++++-- .../java/forge/game/card/CardFactoryUtil.java | 3 +- .../main/java/forge/game/card/CardView.java | 30 +++---------- .../StaticAbilityContinuous.java | 4 +- .../forge/trackable/TrackableProperty.java | 1 - .../forge/player/PlayerControllerHuman.java | 4 +- 7 files changed, 55 insertions(+), 73 deletions(-) diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index d6ce1813d7e..8dd75487274 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -17,16 +17,13 @@ */ package forge.game; -import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardUtil; + import forge.game.player.Player; import forge.game.staticability.StaticAbility; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; @@ -182,12 +179,9 @@ public class StaticEffect { boolean setPT = false; String[] addHiddenKeywords = null; - String addColors = null; boolean removeMayPlay = false; boolean removeWithFlash = false; - List mayLookAt = null; - if (hasParam("ChangeColorWordsTo")) { changeColorWordsTo = getParam("ChangeColorWordsTo"); } @@ -200,31 +194,6 @@ public class StaticEffect { addHiddenKeywords = getParam("AddHiddenKeyword").split(" & "); } - if (hasParam("AddColor")) { - final String colors = getParam("AddColor"); - if (colors.equals("ChosenColor")) { - addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); - } else { - addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); - } - } - - if (hasParam("SetColor")) { - final String colors = getParam("SetColor"); - if (colors.equals("ChosenColor")) { - addColors = CardUtil.getShortColorsString(getSource().getChosenColors()); - } else { - addColors = CardUtil.getShortColorsString(new ArrayList<>(Arrays.asList(colors.split(" & ")))); - } - } - - if (hasParam("MayLookAt")) { - String look = getParam("MayLookAt"); - if ("True".equals(look)) { - look = "You"; - } - mayLookAt = AbilityUtils.getDefinedPlayers(source, look, null); - } if (hasParam("MayPlay")) { removeMayPlay = true; } @@ -303,15 +272,13 @@ public class StaticEffect { } // remove colors - if (addColors != null) { + if (hasParam("AddColor") || hasParam("SetColor")) { affectedCard.removeColor(getTimestamp()); } // remove may look at - if (mayLookAt != null) { - for (Player p : mayLookAt) { - affectedCard.setMayLookAt(p, false); - } + if (hasParam("MayLookAt")) { + affectedCard.removeMayLookAt(getTimestamp()); } if (removeMayPlay) { affectedCard.removeMayPlay(ability); 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 91aeeef211b..265570a2465 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -124,6 +124,10 @@ public class Card extends GameEntity implements Comparable { private final NavigableMap clonedStates = Maps.newTreeMap(); private final NavigableMap textChangeStates = Maps.newTreeMap(); + private final Map mayLook = Maps.newHashMap(); + private final PlayerCollection mayLookFaceDownExile = new PlayerCollection(); + private final PlayerCollection mayLookTemp = new PlayerCollection(); + private final Multimap cantHaveKeywords = MultimapBuilder.hashKeys().enumSetValues(Keyword.class).build(); private final Map counterTypeTimestamps = Maps.newHashMap(); @@ -2842,11 +2846,44 @@ public class Card extends GameEntity implements Comparable { return view.mayPlayerLook(player.getView()); } - public final void setMayLookAt(final Player player, final boolean mayLookAt) { - setMayLookAt(player, mayLookAt, false); + public final void addMayLookAt(final long timestamp, final Iterable list) { + PlayerCollection plist = new PlayerCollection(list); + mayLook.put(timestamp, plist); + if (isFaceDown() && isInZone(ZoneType.Exile)) { + mayLookFaceDownExile.addAll(plist); + } + updateMayLook(); } - public final void setMayLookAt(final Player player, final boolean mayLookAt, final boolean temp) { - view.setPlayerMayLook(player, mayLookAt, temp); + + public final void removeMayLookAt(final long timestamp) { + if (mayLook.remove(timestamp) != null) { + updateMayLook(); + } + } + + public final void addMayLookTemp(final Player player) { + if (mayLookTemp.add(player)) { + if (isFaceDown() && isInZone(ZoneType.Exile)) { + mayLookFaceDownExile.add(player); + } + updateMayLook(); + } + } + + public final void removeMayLookTemp(final Player player) { + if (mayLookTemp.remove(player)) { + updateMayLook(); + } + } + + public final void updateMayLook() { + PlayerCollection result = new PlayerCollection(); + for (PlayerCollection v : mayLook.values()) { + result.addAll(v); + } + result.addAll(mayLookFaceDownExile); + result.addAll(mayLookTemp); + getView().setPlayerMayLook(result); } public final CardPlayOption mayPlay(final StaticAbility sta) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index f2c7ea82d86..770a767d3f4 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -20,6 +20,7 @@ package forge.game.card; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -204,7 +205,7 @@ public class CardFactoryUtil { card.setNamedCard(name); card.turnFaceDown(); - card.setMayLookAt(player, true); + card.addMayLookAt(player.getGame().getNextTimestamp(), ImmutableList.of(player)); card.addSpellAbility(abilityRevealHiddenAgenda(card)); return true; } 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 9a1939bd67d..57ba9fa06db 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -353,33 +353,13 @@ public class CardView extends GameEntityView { public boolean mayPlayerLook(PlayerView pv) { TrackableCollection col = get(TrackableProperty.PlayerMayLook); - if (col != null && col.contains(pv)) { - return true; - } - col = get(TrackableProperty.PlayerMayLookTemp); return col != null && col.contains(pv); } - void setPlayerMayLook(Player p, boolean mayLook, boolean temp) { - TrackableProperty prop = temp ? TrackableProperty.PlayerMayLookTemp : TrackableProperty.PlayerMayLook; - TrackableCollection col = get(prop); - if (mayLook) { - if (col == null) { - col = new TrackableCollection<>(p.getView()); - set(prop, col); - } - else if (col.add(p.getView())) { - flagAsChanged(prop); - } - } - else if (col != null) { - if (col.remove(p.getView())) { - if (col.isEmpty()) { - set(prop, null); - } - else { - flagAsChanged(prop); - } - } + void setPlayerMayLook(Iterable list) { + if (Iterables.isEmpty(list)) { + set(TrackableProperty.PlayerMayLook, null); + } else { + set(TrackableProperty.PlayerMayLook, PlayerView.getCollection(list)); } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 457f3c3cf8e..03a54518b75 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -824,9 +824,7 @@ public final class StaticAbilityContinuous { } if (mayLookAt != null) { - for (Player p : mayLookAt) { - affectedCard.setMayLookAt(p, true); - } + affectedCard.addMayLookAt(se.getTimestamp(), mayLookAt); } if (withFlash != null) { affectedCard.addWithFlash(se.getTimestamp(), withFlash); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index f9b2e6b3253..8d09ad364df 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -54,7 +54,6 @@ public enum TrackableProperty { Remembered(TrackableTypes.StringType), NamedCard(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), - PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), EntityAttachedTo(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), GainControlTargets(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 ff8037e160e..9606b476eb8 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -161,7 +161,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return; } tempShownCards.add(c); - c.setMayLookAt(player, true, true); + c.addMayLookTemp(player); } @Override @@ -178,7 +178,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } for (final Card c : tempShownCards) { - c.setMayLookAt(player, false, true); + c.removeMayLookTemp(player); } tempShownCards.clear(); }