diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index b2b8fa39ffa..b04ba570a51 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -290,7 +290,6 @@ public class GameCopier { // TODO: Is this correct? Does it not duplicate keywords from enchantments and such? for (KeywordInterface kw : c.getHiddenExtrinsicKeywords()) newCard.addHiddenExtrinsicKeyword(kw); - newCard.setExtrinsicKeyword(Lists.newArrayList(c.getExtrinsicKeyword())); if (c.isTapped()) { newCard.setTapped(true); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index a4a1ae8e869..b8af9a537ad 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -3,6 +3,8 @@ package forge.game.ability.effects; import java.util.Arrays; import java.util.List; +import com.google.common.collect.Lists; + import forge.GameCommand; import forge.card.mana.ManaCost; import forge.game.Game; @@ -11,6 +13,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.event.GameEventCardStatsChanged; import forge.game.player.Player; import forge.game.spellability.Ability; import forge.game.spellability.SpellAbility; @@ -35,23 +38,26 @@ public class ControlGainEffect extends SpellAbilityEffect { if (tgts.isEmpty()) { sb.append(" (nothing)"); } else { - for (final Card c : getDefinedCards(sa)) { - sb.append(" "); - if (c.isFaceDown()) { - sb.append("Face-down creature (").append(c.getId()).append(')'); - } else { - sb.append(c); - } - } + for (final Card c : tgts) { + sb.append(" "); + if (c.isFaceDown()) { + sb.append("Face-down creature (").append(c.getId()).append(')'); + } else { + sb.append(c); + } + } } sb.append("."); + if (sa.hasParam("Untap")) { + sb.append(" Untap it."); + } + return sb.toString(); } private static void doLoseControl(final Card c, final Card host, - final boolean tapOnLose, final List addedKeywords, - final long tStamp) { + final boolean tapOnLose, final long tStamp) { if (null == c || c.hasKeyword("Other players can't gain control of CARDNAME.")) { return; } @@ -61,12 +67,6 @@ public class ControlGainEffect extends SpellAbilityEffect { if (tapOnLose) { c.tap(); } - - if (null != addedKeywords) { - for (final String kw : addedKeywords) { - c.removeExtrinsicKeyword(kw); - } - } } // if host.removeGainControlTargets(c); @@ -82,7 +82,7 @@ public class ControlGainEffect extends SpellAbilityEffect { final boolean remember = sa.hasParam("RememberControlled"); final boolean forget = sa.hasParam("ForgetControlled"); final List destroyOn = sa.hasParam("DestroyTgt") ? Arrays.asList(sa.getParam("DestroyTgt").split(",")) : null; - final List kws = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null; + final List keywords = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null; final List lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null; final List controllers = getDefinedPlayersOrTargeted(sa, "NewController"); @@ -125,15 +125,22 @@ public class ControlGainEffect extends SpellAbilityEffect { tgtC.untap(); } - if (null != kws) { - for (final String kw : kws) { - tgtC.addExtrinsicKeyword(kw); - if (kw.equals("Haste")) { - tgtC.updateStateForView(); // ensure that summoning sickness icon is removed + final List kws = Lists.newArrayList(); + if (null != keywords) { + for (final String kw : keywords) { + if (kw.startsWith("HIDDEN")) { + tgtC.addHiddenExtrinsicKeyword(kw); + } else { + kws.add(kw); } } } + if (!kws.isEmpty()) { + tgtC.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, tStamp); + game.fireEvent(new GameEventCardStatsChanged(tgtC)); + } + if (remember && !sa.getHostCard().isRemembered(tgtC)) { sa.getHostCard().addRemembered(tgtC); } @@ -143,7 +150,7 @@ public class ControlGainEffect extends SpellAbilityEffect { } if (lose != null) { - final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws); + final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source); if (lose.contains("LeavesPlay")) { sa.getHostCard().addLeavesPlayCommand(loseControl); } @@ -183,6 +190,26 @@ public class ControlGainEffect extends SpellAbilityEffect { } } + if (keywords != null) { + // Add keywords only until end of turn + final GameCommand untilKeywordEOT = new GameCommand() { + private static final long serialVersionUID = -42244224L; + + @Override + public void run() { + if (keywords.size() > 0) { + for (String kw : keywords) { + if (kw.startsWith("HIDDEN")) { + tgtC.removeHiddenExtrinsicKeyword(kw); + } + } + tgtC.removeChangedCardKeywords(tStamp); + } + } + }; + game.getEndOfTurn().addUntil(untilKeywordEOT); + } + game.getAction().controllerChangeZoneCorrection(tgtC); } // end foreach target } @@ -236,14 +263,13 @@ public class ControlGainEffect extends SpellAbilityEffect { * @return a {@link forge.GameCommand} object. */ private static GameCommand getLoseControlCommand(final Card c, - final long tStamp, final boolean bTapOnLose, final Card hostCard, - final List kws) { + final long tStamp, final boolean bTapOnLose, final Card hostCard) { final GameCommand loseControl = new GameCommand() { private static final long serialVersionUID = 878543373519872418L; @Override public void run() { - doLoseControl(c, hostCard, bTapOnLose, kws, tStamp); + doLoseControl(c, hostCard, bTapOnLose, tStamp); c.getSVars().remove("SacMe"); } }; 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 900da08cee7..26c21399155 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -94,7 +94,6 @@ public class Card extends GameEntity implements Comparable { private final CardDamageHistory damageHistory = new CardDamageHistory(); private Map> countersAddedBy = Maps.newTreeMap(); - private KeywordCollection extrinsicKeyword = new KeywordCollection(); // Hidden keywords won't be displayed on the card private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection(); @@ -3727,7 +3726,6 @@ public class Card extends GameEntity implements Comparable { if (!removeIntrinsic) { keywords.insertAll(state.getIntrinsicKeywords()); } - keywords.insertAll(extrinsicKeyword.getValues()); // see if keyword changes are in effect for (final KeywordsChange ck : changedCardKeywords.values()) { @@ -3755,11 +3753,6 @@ public class Card extends GameEntity implements Comparable { return; } } - for (KeywordInterface kw : extrinsicKeyword.getValues()) { - if (!visitor.visit(kw)) { - return; - } - } } else { for (KeywordInterface kw : getUnhiddenKeywords(state)) { if (!visitor.visit(kw)) { @@ -3927,53 +3920,6 @@ public class Card extends GameEntity implements Comparable { } } - public Collection getExtrinsicKeyword() { - return extrinsicKeyword.getValues(); - } - public final void setExtrinsicKeyword(final List a) { - extrinsicKeyword.clear(); - extrinsicKeyword.addAll(a); - } - public void setExtrinsicKeyword(Collection extrinsicKeyword2) { - extrinsicKeyword.clear(); - extrinsicKeyword.insertAll(extrinsicKeyword2); - } - - public void addExtrinsicKeyword(final String s) { - if (s.startsWith("HIDDEN")) { - addHiddenExtrinsicKeyword(s); - } - else { - extrinsicKeyword.add(s); - } - } - - public void removeExtrinsicKeyword(final String s) { - if (s.startsWith("HIDDEN")) { - removeHiddenExtrinsicKeyword(s); - } - else if (extrinsicKeyword.remove(s)) { - currentState.getView().updateKeywords(this, currentState); - } - } - - public void removeAllExtrinsicKeyword(final String s) { - final List strings = Lists.newArrayList(); - strings.add(s); - boolean needKeywordUpdate = false; - if (extrinsicKeyword.removeAll(strings)) { - needKeywordUpdate = true; - } - strings.add("HIDDEN " + s); - if (hiddenExtrinsicKeyword.removeAll(strings)) { - view.updateNonAbilityText(this); - needKeywordUpdate = true; - } - if (needKeywordUpdate) { - currentState.getView().updateKeywords(this, currentState); - } - } - // Hidden Keywords will be returned without the indicator HIDDEN public final List getHiddenExtrinsicKeywords() { ListKeywordVisitor visitor = new ListKeywordVisitor(); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 1c177ec82fa..f96d0f8af38 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -255,7 +255,6 @@ public final class CardUtil { newCopy.setBaseToughness(in.getCurrentToughness() + in.getTempToughnessBoost() + in.getSemiPermanentToughnessBoost()); newCopy.setCounters(Maps.newEnumMap(in.getCounters())); - newCopy.setExtrinsicKeyword(in.getExtrinsicKeyword()); newCopy.setColor(in.determineColor().getColor()); newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn()); diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 7c3106b9364..7835a67cdaf 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -209,11 +209,10 @@ public class Untap extends Phase { // Remove temporary keywords for (final Card c : player.getCardsIn(ZoneType.Battlefield)) { - c.removeAllExtrinsicKeyword("This card doesn't untap during your next untap step."); - c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step."); + c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next untap step."); if (c.hasKeyword("This card doesn't untap during your next two untap steps.")) { - c.removeAllExtrinsicKeyword("HIDDEN This card doesn't untap during your next two untap steps."); - c.addHiddenExtrinsicKeyword("HIDDEN This card doesn't untap during your next untap step."); + c.removeHiddenExtrinsicKeyword("This card doesn't untap during your next two untap steps."); + c.addHiddenExtrinsicKeyword("This card doesn't untap during your next untap step."); } }