Card: add Keyword methods that work with Keyword Enum

This commit is contained in:
Hanmac
2018-05-06 16:54:53 +02:00
parent e0b1bc7cd0
commit 91d80f49f4
21 changed files with 249 additions and 164 deletions

View File

@@ -553,8 +553,9 @@ public class Game {
final CardCollection all = new CardCollection();
Visitor<Card> visitor = new Visitor<Card>() {
@Override
public void visit(Card card) {
public boolean visit(Card card) {
all.add(card);
return true;
}
};
forEachCardInGame(visitor);

View File

@@ -792,7 +792,7 @@ public class GameAction {
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(final Card c) {
public boolean visit(final Card c) {
// need to get Card from preList if able
final Card co = preList.get(c);
for (int i = 0; i < co.getStaticAbilities().size(); i++) {
@@ -808,6 +808,7 @@ public class GameAction {
if (!co.getStaticCommandList().isEmpty()) {
staticList.add(co);
}
return true;
}
});

View File

@@ -31,6 +31,7 @@ import forge.game.ability.ApiType;
import forge.game.card.*;
import forge.game.card.CardPlayOption.PayManaCost;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
import forge.game.player.Player;
import forge.game.spellability.*;
@@ -482,8 +483,8 @@ public final class GameActionUtil {
}
}
if (source.hasKeyword("Conspire")) {
int amount = source.getAmountOfKeyword("Conspire");
if (source.hasKeyword(Keyword.CONSPIRE)) {
int amount = source.getAmountOfKeyword(Keyword.CONSPIRE);
for (int kwInstance = 1; kwInstance <= amount; kwInstance++) {
for (int i = 0; i < abilities.size(); i++) {
final SpellAbility newSA = abilities.get(i).copy();

View File

@@ -24,6 +24,7 @@ import forge.game.card.CardDamageMap;
import forge.game.card.CounterType;
import forge.game.event.GameEventCardAttachment;
import forge.game.event.GameEventCardAttachment.AttachMethod;
import forge.game.keyword.Keyword;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.collect.FCollection;
@@ -275,6 +276,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable {
}
public abstract boolean hasKeyword(final String keyword);
public abstract boolean hasKeyword(final Keyword keyword);
// GameEntities can now be Enchanted
public final CardCollectionView getEnchantedBy(boolean allowModify) {

View File

@@ -1007,11 +1007,11 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public final boolean hasFirstStrike() {
return hasKeyword("First Strike");
return hasKeyword(Keyword.FIRST_STRIKE);
}
public final boolean hasDoubleStrike() {
return hasKeyword("Double Strike");
return hasKeyword(Keyword.DOUBLE_STRIKE);
}
public final boolean hasSecondStrike() {
@@ -2338,11 +2338,11 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public final boolean hasSickness() {
return sickness && !hasKeyword("Haste");
return sickness && !hasKeyword(Keyword.HASTE);
}
public final boolean isSick() {
return sickness && isCreature() && !hasKeyword("Haste");
return sickness && isCreature() && !hasKeyword(Keyword.HASTE);
}
public boolean hasBecomeTargetThisTurn() {
@@ -3217,6 +3217,15 @@ public class Card extends GameEntity implements Comparable<Card> {
visitHiddenExtreinsicKeywords(visitor);
}
@Override
public final boolean hasKeyword(Keyword keyword) {
return hasKeyword(keyword, currentState);
}
public final boolean hasKeyword(Keyword key, CardState state) {
return state.hasKeyword(key);
}
@Override
public final boolean hasKeyword(String keyword) {
return hasKeyword(keyword, currentState);
@@ -3227,9 +3236,9 @@ public class Card extends GameEntity implements Comparable<Card> {
keyword = keyword.substring(7);
}
CountKeywordVisitor visitor = new CountKeywordVisitor(keyword);
HasKeywordVisitor visitor = new HasKeywordVisitor(keyword, false);
visitKeywords(state, visitor);
return visitor.getCount() > 0;
return visitor.getResult();
}
public final void updateKeywords() {
@@ -3345,20 +3354,26 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
state.setCachedKeywords(keywords.getValues());
state.setCachedKeywords(keywords);
}
private void visitUnhiddenKeywords(CardState state, Visitor<KeywordInterface> visitor) {
if (changedCardKeywords.isEmpty()) {
// Fast path that doesn't involve temp allocations.
for (KeywordInterface kw : state.getIntrinsicKeywords()) {
visitor.visit(kw);
if (!visitor.visit(kw)) {
return;
}
}
for (KeywordInterface kw : extrinsicKeyword.getValues()) {
visitor.visit(kw);
if (!visitor.visit(kw)) {
return;
}
}
} else {
for (KeywordInterface kw : getUnhiddenKeywords(state)) {
visitor.visit(kw);
if (!visitor.visit(kw)) {
return;
}
}
}
}
@@ -3571,7 +3586,9 @@ public class Card extends GameEntity implements Comparable<Card> {
}
private void visitHiddenExtreinsicKeywords(Visitor<KeywordInterface> visitor) {
for (KeywordInterface inst : hiddenExtrinsicKeyword.getValues()) {
visitor.visit(inst);
if (!visitor.visit(inst)) {
return;
}
}
}
@@ -3820,18 +3837,18 @@ public class Card extends GameEntity implements Comparable<Card> {
return hasStartOfKeyword(keyword, currentState);
}
public final boolean hasStartOfKeyword(String keyword, CardState state) {
CountKeywordVisitor visitor = new CountKeywordVisitor(keyword, true);
HasKeywordVisitor visitor = new HasKeywordVisitor(keyword, true);
visitKeywords(state, visitor);
return visitor.getCount() > 0;
return visitor.getResult();
}
public final boolean hasStartOfUnHiddenKeyword(String keyword) {
return hasStartOfUnHiddenKeyword(keyword, currentState);
}
public final boolean hasStartOfUnHiddenKeyword(String keyword, CardState state) {
CountKeywordVisitor visitor = new CountKeywordVisitor(keyword, true);
HasKeywordVisitor visitor = new HasKeywordVisitor(keyword, true);
visitUnhiddenKeywords(state, visitor);
return visitor.getCount() > 0;
return visitor.getResult();
}
public final boolean hasAnyKeyword(final Iterable<String> keywords) {
@@ -3856,25 +3873,42 @@ public class Card extends GameEntity implements Comparable<Card> {
return visitor.getCount();
}
public final int getAmountOfKeyword(final Keyword k) {
return getAmountOfKeyword(k, currentState);
}
public final int getAmountOfKeyword(final Keyword k, CardState state) {
return state.getCachedKeyword(k).size();
}
// This is for keywords with a number like Bushido, Annihilator and Rampage.
// It returns the total.
public final int getKeywordMagnitude(final String k) {
public final int getKeywordMagnitude(final Keyword k) {
return getKeywordMagnitude(k, currentState);
}
public final int getKeywordMagnitude(final String k, CardState state) {
/**
* use it only for real keywords and not with hidden ones
*
* @param Keyword k
* @param CardState state
* @return Int
*/
public final int getKeywordMagnitude(final Keyword k, CardState state) {
int count = 0;
for (final KeywordInterface inst : getKeywords(state)) {
for (final KeywordInterface inst : state.getCachedKeyword(k)) {
String kw = inst.getOriginal();
if (kw.startsWith(k)) {
final String[] parse = kw.contains(":") ? kw.split(":") : kw.split(" ");
final String s = parse[1];
if (StringUtils.isNumeric(s)) {
count += Integer.parseInt(s);
} else {
String svar = StringUtils.join(parse);
if (state.hasSVar(svar)) {
count += AbilityUtils.calculateAmount(this, state.getSVar(svar), null);
}
// this can't be used yet for everything because of X values in Bushido X
// KeywordInterface#getAmount
// KeywordCollection#getAmount
final String[] parse = kw.contains(":") ? kw.split(":") : kw.split(" ");
final String s = parse[1];
if (StringUtils.isNumeric(s)) {
count += Integer.parseInt(s);
} else {
String svar = StringUtils.join(parse);
if (state.hasSVar(svar)) {
count += AbilityUtils.calculateAmount(this, state.getSVar(svar), null);
}
}
}
@@ -4538,7 +4572,7 @@ public class Card extends GameEntity implements Comparable<Card> {
final Game game = source.getGame();
boolean wither = (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither)
|| source.hasKeyword("Wither") || source.hasKeyword("Infect"));
|| source.hasKeyword(Keyword.WITHER) || source.hasKeyword(Keyword.INFECT));
if (isInPlay()) {
if (wither) {
@@ -4551,7 +4585,7 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
if (source.hasKeyword("Deathtouch") && isCreature()) {
if (source.hasKeyword(Keyword.DEATHTOUCH) && isCreature()) {
setHasBeenDealtDeathtouchDamage(true);
damageType = DamageType.Deathtouch;
}
@@ -4943,7 +4977,7 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public final boolean canBeDestroyed() {
return isInPlay() && (!hasKeyword("Indestructible") || (isCreature() && getNetToughness() <= 0));
return isInPlay() && (!hasKeyword(Keyword.INDESTRUCTIBLE) || (isCreature() && getNetToughness() <= 0));
}
public final boolean canBeSacrificed() {
@@ -4983,10 +5017,7 @@ public class Card extends GameEntity implements Comparable<Card> {
final MutableBoolean result = new MutableBoolean(true);
visitKeywords(currentState, new Visitor<KeywordInterface>() {
@Override
public void visit(KeywordInterface kw) {
if (result.isFalse()) {
return;
}
public boolean visit(KeywordInterface kw) {
switch (kw.getOriginal()) {
case "Shroud":
StringBuilder sb = new StringBuilder();
@@ -5015,6 +5046,7 @@ public class Card extends GameEntity implements Comparable<Card> {
}
break;
}
return result.isTrue();
}
});
if (result.isFalse()) {
@@ -5506,11 +5538,12 @@ public class Card extends GameEntity implements Comparable<Card> {
}
@Override
public void visit(KeywordInterface inst) {
public boolean visit(KeywordInterface inst) {
final String kw = inst.getOriginal();
if ((startOf && kw.startsWith(keyword)) || kw.equals(keyword)) {
count++;
}
return true;
}
public int getCount() {
@@ -5518,13 +5551,38 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
private static final class HasKeywordVisitor extends Visitor<KeywordInterface> {
private String keyword;
private final MutableBoolean result = new MutableBoolean(false);
private boolean startOf;
private HasKeywordVisitor(String keyword, boolean startOf) {
this.keyword = keyword;
this.startOf = startOf;
}
@Override
public boolean visit(KeywordInterface inst) {
final String kw = inst.getOriginal();
if ((startOf && kw.startsWith(keyword)) || kw.equals(keyword)) {
result.setTrue();
}
return result.isFalse();
}
public boolean getResult() {
return result.isTrue();
}
}
// Collects all the keywords into a list.
private static final class ListKeywordVisitor extends Visitor<KeywordInterface> {
private List<KeywordInterface> keywords = Lists.newArrayList();
@Override
public void visit(KeywordInterface kw) {
public boolean visit(KeywordInterface kw) {
keywords.add(kw);
return true;
}
public List<KeywordInterface> getKeywords() {
@@ -5645,7 +5703,7 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public boolean withFlash(Player p) {
if (hasKeyword("Flash")) {
if (hasKeyword(Keyword.FLASH)) {
return true;
}
if (withFlash.containsValue(p)) {

View File

@@ -12,6 +12,7 @@ import com.google.common.collect.Sets;
import com.google.common.collect.Table;
import forge.game.GameEntity;
import forge.game.keyword.Keyword;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
@@ -53,7 +54,7 @@ public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
sourceLKI.getGame().getTriggerHandler().runTrigger(TriggerType.DamageDealtOnce, runParams, false);
if (sourceLKI.hasKeyword("Lifelink")) {
if (sourceLKI.hasKeyword(Keyword.LIFELINK)) {
sourceLKI.getController().gainLife(sum, sourceLKI, sa);
}
}

View File

@@ -1196,7 +1196,7 @@ public class CardFactoryUtil {
}
if (sq[0].contains("BushidoPoint")) {
return doXMath(c.getKeywordMagnitude("Bushido"), m, c);
return doXMath(c.getKeywordMagnitude(Keyword.BUSHIDO), m, c);
}
if (sq[0].contains("TimesKicked")) {
return doXMath(c.getKickerMagnitude(), m, c);
@@ -4036,7 +4036,7 @@ public class CardFactoryUtil {
return false;
}
if (this.getHostCard().isInstant() || this.getHostCard().hasKeyword("Flash")) {
if (this.getHostCard().isInstant() || this.getHostCard().hasKeyword(Keyword.FLASH)) {
return true;
}

View File

@@ -26,6 +26,7 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.collect.FCollectionView;
@@ -250,6 +251,13 @@ public class CardLists {
}
return nKeyword;
}
public static int getAmountOfKeyword(final Iterable<Card> cardList, final Keyword keyword) {
int nKeyword = 0;
for (final Card c : cardList) {
nKeyword += c.getAmountOfKeyword(keyword);
}
return nKeyword;
}
// cardType is like "Land" or "Goblin", returns a new CardCollection that is a
// subset of current CardList
public static CardCollection getNotType(Iterable<Card> cardList, String cardType) {

View File

@@ -19,7 +19,6 @@ package forge.game.card;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.card.*;
import forge.card.mana.ManaCost;
@@ -28,6 +27,7 @@ import forge.game.CardTraitBase;
import forge.game.ForgeScript;
import forge.game.GameObject;
import forge.game.card.CardView.CardStateView;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordCollection;
import forge.game.keyword.KeywordInterface;
import forge.game.player.Player;
@@ -60,7 +60,7 @@ public class CardState extends GameObject {
private String imageKey = "";
private Map<String, String> sVars = Maps.newTreeMap();
private List<KeywordInterface> cachedKeywords = Lists.newArrayList();
private KeywordCollection cachedKeywords = new KeywordCollection();
private CardRarity rarity = CardRarity.Unknown;
private String setCode = CardEdition.UNKNOWN.getCode();
@@ -167,12 +167,19 @@ public class CardState extends GameObject {
}
public final Collection<KeywordInterface> getCachedKeywords() {
return cachedKeywords;
return cachedKeywords.getValues();
}
public final void setCachedKeywords(final Collection<KeywordInterface> col) {
cachedKeywords.clear();
cachedKeywords.addAll(col);
public final Collection<KeywordInterface> getCachedKeyword(final Keyword keyword) {
return cachedKeywords.getValues(keyword);
}
public final void setCachedKeywords(final KeywordCollection col) {
cachedKeywords = col;
}
public final boolean hasKeyword(Keyword key) {
return cachedKeywords.contains(key);
}
public final Collection<KeywordInterface> getIntrinsicKeywords() {

View File

@@ -27,6 +27,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardDamageMap;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.trigger.TriggerType;
@@ -692,7 +693,7 @@ public class Combat {
continue;
}
boolean trampler = attacker.hasKeyword("Trample");
boolean trampler = attacker.hasKeyword(Keyword.TRAMPLE);
orderedBlockers = blockersOrderedForDamageAssignment.get(attacker);
assignedDamage = true;
// If the Attacker is unblocked, or it's a trampler and has 0 blockers, deal damage to defender

View File

@@ -29,6 +29,7 @@ import forge.game.GameEntity;
import forge.game.GlobalRuleChange;
import forge.game.card.*;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -985,17 +986,17 @@ public class CombatUtil {
}
// rare case:
if (blocker.hasKeyword("Shadow")
if (blocker.hasKeyword(Keyword.SHADOW)
&& blocker.hasKeyword("CARDNAME can block creatures with shadow as though they didn't have shadow.")) {
return false;
}
if (attacker.hasKeyword("Shadow") && !blocker.hasKeyword("Shadow")
if (attacker.hasKeyword(Keyword.SHADOW) && !blocker.hasKeyword(Keyword.SHADOW)
&& !blocker.hasKeyword("CARDNAME can block creatures with shadow as though they didn't have shadow.")) {
return false;
}
if (!attacker.hasKeyword("Shadow") && blocker.hasKeyword("Shadow")) {
if (!attacker.hasKeyword(Keyword.SHADOW) && blocker.hasKeyword(Keyword.SHADOW)) {
return false;
}
@@ -1034,11 +1035,11 @@ public class CombatUtil {
}
}
if (blocker.hasKeyword("CARDNAME can block only creatures with flying.") && !attacker.hasKeyword("Flying")) {
if (blocker.hasKeyword("CARDNAME can block only creatures with flying.") && !attacker.hasKeyword(Keyword.FLYING)) {
return false;
}
if (attacker.hasKeyword("Flying") && !blocker.hasKeyword("Flying") && !blocker.hasKeyword("Reach")) {
if (attacker.hasKeyword(Keyword.FLYING) && !blocker.hasKeyword(Keyword.FLYING) && !blocker.hasKeyword(Keyword.REACH)) {
boolean stillblock = false;
for (KeywordInterface inst : blocker.getKeywords()) {
String k = inst.getOriginal();
@@ -1055,15 +1056,16 @@ public class CombatUtil {
}
}
if (attacker.hasKeyword("Horsemanship") && !blocker.hasKeyword("Horsemanship")) {
if (attacker.hasKeyword(Keyword.HORSEMANSHIP) && !blocker.hasKeyword(Keyword.HORSEMANSHIP)) {
return false;
}
if (attacker.hasKeyword("Fear") && !blocker.isArtifact() && !blocker.isBlack()) {
// color is hardcoded there
if (attacker.hasKeyword(Keyword.FEAR) && !blocker.isArtifact() && !blocker.isBlack()) {
return false;
}
if (attacker.hasKeyword("Intimidate") && !blocker.isArtifact() && !blocker.sharesColorWith(attacker)) {
if (attacker.hasKeyword(Keyword.INTIMIDATE) && !blocker.isArtifact() && !blocker.sharesColorWith(attacker)) {
return false;
}

View File

@@ -10,6 +10,7 @@ import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
import forge.game.card.*;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player;
@@ -210,7 +211,7 @@ public class CostAdjustment {
}
if (sa.isSpell()) {
if (sa.getHostCard().hasKeyword("Delve")) {
if (sa.getHostCard().hasKeyword(Keyword.DELVE)) {
sa.getHostCard().clearDelved();
final CardCollection delved = new CardCollection();
@@ -235,10 +236,10 @@ public class CostAdjustment {
game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false);
}
}
if (sa.getHostCard().hasKeyword("Convoke")) {
if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) {
adjustCostByConvokeOrImprovise(cost, sa, false, test);
}
if (sa.getHostCard().hasKeyword("Improvise")) {
if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) {
adjustCostByConvokeOrImprovise(cost, sa, true, test);
}
} // isSpell

View File

@@ -143,6 +143,10 @@ public class KeywordCollection implements Iterable<String>, Serializable {
return map.values();
}
public Collection<KeywordInterface> getValues(final Keyword keyword) {
return map.get(keyword);
}
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {

View File

@@ -30,6 +30,7 @@ import forge.game.ability.effects.DetachedCardEffect;
import forge.game.card.*;
import forge.game.card.CardPredicates.Presets;
import forge.game.event.*;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordCollection;
import forge.game.keyword.KeywordInterface;
import forge.game.keyword.KeywordCollection.KeywordCollectionView;
@@ -1070,6 +1071,11 @@ public class Player extends GameEntity implements Comparable<Player> {
return keywords.contains(keyword);
}
@Override
public final boolean hasKeyword(final Keyword keyword) {
return keywords.contains(keyword);
}
private void updateKeywords() {
keywords.clear();
@@ -2773,4 +2779,8 @@ public class Player extends GameEntity implements Comparable<Player> {
this.updateZoneForView(com);
}
public final int countExaltedBonus() {
return CardLists.getAmountOfKeyword(this.getCardsIn(ZoneType.Battlefield), Keyword.EXALTED);
}
}

View File

@@ -86,7 +86,7 @@ public class ReplacementHandler {
// Round up Static replacement effects
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card crd) {
public boolean visit(Card crd) {
for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) {
// Use "CheckLKIZone" parameter to test for effects that care abut where the card was last (e.g. Kalitas, Traitor of Ghet
@@ -111,6 +111,7 @@ public class ReplacementHandler {
possibleReplacers.add(replacementEffect);
}
}
return true;
}
});
@@ -307,7 +308,7 @@ public class ReplacementHandler {
public void cleanUpTemporaryReplacements() {
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card c) {
public boolean visit(Card c) {
for (int i = 0; i < c.getReplacementEffects().size(); i++) {
ReplacementEffect rep = c.getReplacementEffects().get(i);
if (rep.isTemporary()) {
@@ -315,14 +316,16 @@ public class ReplacementHandler {
i--;
}
}
return true;
}
});
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card c) {
public boolean visit(Card c) {
for (int i = 0; i < c.getReplacementEffects().size(); i++) {
c.getReplacementEffects().get(i).setTemporarilySuppressed(false);
}
return true;
}
});
}

View File

@@ -61,7 +61,7 @@ public class TriggerHandler {
public final void cleanUpTemporaryTriggers() {
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card c) {
public boolean visit(Card c) {
boolean changed = false;
for (int i = 0; i < c.getTriggers().size(); i++) {
Trigger trigger = c.getTriggers().get(i);
@@ -74,11 +74,12 @@ public class TriggerHandler {
if (changed) {
c.updateStateForView();
}
return true;
}
});
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card c) {
public boolean visit(Card c) {
boolean changed = false;
for (int i = 0; i < c.getTriggers().size(); i++) {
if (c.getTriggers().get(i).isSuppressed()) {
@@ -89,6 +90,7 @@ public class TriggerHandler {
if (changed) {
c.updateStateForView();
}
return true;
}
});
}
@@ -226,12 +228,13 @@ public class TriggerHandler {
activeTriggers.clear();
game.forEachCardInGame(new Visitor<Card>() {
@Override
public void visit(Card c) {
public boolean visit(Card c) {
for (final Trigger t : c.getTriggers()) {
if (isTriggerActive(t)) {
activeTriggers.add(t);
}
}
return true;
}
});
}

View File

@@ -51,6 +51,7 @@ import forge.game.event.GameEventSpellAbilityCast;
import forge.game.event.GameEventSpellRemovedFromStack;
import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventZone;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.player.PlayerController.ManaPaymentPurpose;
import forge.game.replacement.ReplacementEffect;
@@ -119,7 +120,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
public final boolean isSplitSecondOnStack() {
for(SpellAbilityStackInstance si : stack) {
if (si.isSpell() && si.getSourceCard().hasKeyword("Split second")) {
if (si.isSpell() && si.getSourceCard().hasKeyword(Keyword.SPLIT_SECOND)) {
return true;
}
}