diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index bec6e19c4d6..b9768cf13d7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1352,7 +1352,7 @@ public class ComputerUtil { if (valid.contains("Creature.YouCtrl") || valid.contains("Other+YouCtrl") ) { - final SpellAbility sa = t.getTriggeredSA(); + final SpellAbility sa = t.getOverridingAbility(); if (sa != null && sa.getApi() == ApiType.Pump && sa.hasParam("KW") && sa.getParam("KW").contains("Haste")) { return true; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 2a49bae9d59..8607e9342e2 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -894,6 +894,9 @@ public class Game { public void clearCaches() { spabCache.clear(); cardCache.clear(); + + lastStateBattlefield.clear(); + lastStateGraveyard.clear(); //playerCache.clear(); } 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 548e7001496..e4989484b0c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1056,23 +1056,6 @@ public class Card extends GameEntity implements Comparable { } } - public final Object getTriggeringObject(final AbilityKey typeIn) { - Object triggered = null; - if (!currentState.getTriggers().isEmpty()) { - for (final Trigger t : currentState.getTriggers()) { - final SpellAbility sa = t.getTriggeredSA(); - if (sa == null) { - continue; - } - triggered = sa.hasTriggeringObject(typeIn) ? sa.getTriggeringObject(typeIn) : null; - if (triggered != null) { - break; - } - } - } - return triggered; - } - public final int getSunburstValue() { return sunburstValue; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 163df5aefb8..54e43d95dfb 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -680,7 +680,6 @@ public class CardFactory { wrapperAbility.setTrigger(true); wrapperAbility.setMandatory(sa.isMandatory()); wrapperAbility.setDescription(wrapperAbility.getStackDescription()); - t.setTriggeredSA(wrapperAbility); return wrapperAbility; } 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 5af7a98602f..dc873bfd7dd 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -34,7 +34,6 @@ import forge.game.GameEntity; import forge.game.GameEntityCounterTable; import forge.game.GameLogEntryType; import forge.game.ability.AbilityFactory; -import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.CardPredicates.Presets; @@ -954,11 +953,6 @@ public class CardFactoryUtil { return doXMath(c.getRegeneratedThisTurn(), m, c); } - // TriggeringObjects - if (sq[0].startsWith("Triggered")) { - return doXMath(xCount((Card) c.getTriggeringObject(AbilityKey.Card), sq[0].substring(9)), m, c); - } - if (sq[0].contains("YourStartingLife")) { return doXMath(cc.getStartingLife(), m, c); } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index ac88826838d..6c5b5eac174 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -6,6 +6,7 @@ import forge.card.MagicColor; import forge.game.Direction; import forge.game.Game; import forge.game.GameEntity; +import forge.game.GameObject; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.card.CardPredicates.Presets; @@ -15,7 +16,6 @@ import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.OptionalCost; import forge.game.spellability.SpellAbility; -import forge.game.trigger.Trigger; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Expressions; @@ -392,30 +392,20 @@ public class CardProperty { } } else if (property.startsWith("AttachedTo")) { final String restriction = property.split("AttachedTo ")[1]; - if (restriction.equals("Targeted")) { - if (!source.getCurrentState().getTriggers().isEmpty()) { - for (final Trigger t : source.getCurrentState().getTriggers()) { - final SpellAbility sa = t.getTriggeredSA(); - final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); - for (final Card c : cards) { - if (card.getEquipping() != c && !c.equals(card.getEntityAttachedTo())) { - return false; - } - } + + if (card.getEntityAttachedTo() == null) { + return false; + } + + if (!card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility)) { + boolean found = false; + for (final GameObject o : AbilityUtils.getDefinedObjects(source, restriction, spellAbility)) { + if (o.equals(card.getEntityAttachedTo())) { + found = true; + break; } - } else { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); - for (final Card c : cards) { - if (card.getEquipping() == c || c.equals(card.getEntityAttachedTo())) { // handle multiple targets - return true; - } - } - } - return false; } - } else { - if ((card.getEntityAttachedTo() == null || !card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility))) { + if (!found) { return false; } } @@ -856,15 +846,6 @@ public class CardProperty { } } return false; - case "TriggeredCard": - final Object triggeringObject = source.getTriggeringObject(AbilityKey.fromString(restriction.substring("Triggered".length()))); - if (!(triggeringObject instanceof Card)) { - return false; - } - if (card.sharesCardTypeWith((Card) triggeringObject)) { - return true; - } - return false; case "EachTopLibrary": final CardCollection cards = new CardCollection(); for (Player p : game.getPlayers()) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 256bbf07a3a..81ceddeab56 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1996,4 +1996,24 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setXManaCostPaid(final Integer n) { xManaCostPaid = n; } + + public void removeFromGame() { + if (getHostCard() == null) { + return; + } + + getHostCard().getGame().removeSpellAbility(this); + + if (subAbility != null) { + subAbility.removeFromGame(); + } + for (AbilitySub sa : additionalAbilities.values()) { + sa.removeFromGame(); + } + for (List list : additionalAbilityLists.values()) { + for (AbilitySub sa : list) { + sa.removeFromGame(); + } + } + } } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 8388fa3ccdf..d6b065f923d 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -29,7 +29,6 @@ import forge.game.card.CardState; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; -import forge.game.spellability.Ability; import forge.game.spellability.OptionalCost; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -472,27 +471,6 @@ public abstract class Trigger extends TriggerReplacementBase { this.id = id; } - private Ability triggeredSA; - - /** - * Gets the triggered sa. - * - * @return the triggered sa - */ - public final Ability getTriggeredSA() { - return this.triggeredSA; - } - - /** - * Sets the triggered sa. - * - * @param sa - * the triggered sa to set - */ - public void setTriggeredSA(final Ability sa) { - this.triggeredSA = sa; - } - public void addRemembered(Object o) { this.triggerRemembered.add(o); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 33a8e48663e..2fa84917bb5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -628,7 +628,6 @@ public class TriggerHandler { else { game.getStack().addSimultaneousStackEntry(wrapperAbility); } - regtrig.setTriggeredSA(wrapperAbility); regtrig.triggerRun(); diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 55532468591..ce5fc31cfcb 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -563,4 +563,10 @@ public class WrappedAbility extends Ability { public void setXManaCostPaid(final Integer n) { sa.setXManaCostPaid(n); } + + @Override + public void removeFromGame() { + super.removeFromGame(); + getHostCard().getGame().removeSpellAbility(this.getWrappedAbility()); + } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 569ccd529af..cce6b249fd2 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -638,7 +638,13 @@ public class MagicStack /* extends MyObservable */ implements Iterable