From 84076a88a0cf098565a0dd8da85a1ff6efd5db7d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 2 Nov 2023 20:32:41 -0400 Subject: [PATCH] WHO: idris_soul_of_the_tardis.txt + support --- .../main/java/forge/game/StaticEffect.java | 8 ++-- .../src/main/java/forge/game/card/Card.java | 10 ++++ .../game/staticability/StaticAbility.java | 8 ++-- .../StaticAbilityContinuous.java | 48 ++++++++++++------- .../upcoming/idris_soul_of_the_tardis.txt | 12 +++++ 5 files changed, 62 insertions(+), 24 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/idris_soul_of_the_tardis.txt diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index f696b2b3456..d62e8dd5ec3 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -233,9 +233,11 @@ public class StaticEffect { } // remove abilities - if (hasParam("AddAbility") || hasParam("GainsAbilitiesOf") || hasParam("GainsAbilitiesOfDefined") - || hasParam("AddTrigger") || hasParam("AddStaticAbility") || hasParam("AddReplacementEffects") - || hasParam("RemoveAllAbilities") || hasParam("RemoveLandTypes")) { + if (hasParam("AddAbility") || hasParam("GainsAbilitiesOf") + || hasParam("GainsAbilitiesOfDefined") || hasParam("GainsTriggerAbsOf") + || hasParam("AddTrigger") || hasParam("AddStaticAbility") + || hasParam("AddReplacementEffects") || hasParam("RemoveAllAbilities") + || hasParam("RemoveLandTypes")) { affectedCard.removeChangedCardTraits(getTimestamp(), ability.getId()); } 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 eab036f9a31..48313103d3f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4515,6 +4515,16 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return result; } + public final Trigger addTriggerForStaticAbility(final Trigger trig, final StaticAbility stAb) { + String str = trig.toString() + trig.getId(); + Trigger result = storedTrigger.get(stAb, str); + if (result == null) { + result = trig.copy(this, false); + storedTrigger.put(stAb, str, result); + } + return result; + } + public void setStoredReplacements(Table table) { storedReplacementEffect.clear(); for (Table.Cell c : table.cellSet()) { diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 453f19a4478..2eb046c689d 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -145,11 +145,9 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone layers.add(StaticAbilityLayer.COLOR); } - if (hasParam("RemoveAllAbilities") || hasParam("GainsAbilitiesOf") || hasParam("GainsAbilitiesOfDefined")) { - layers.add(StaticAbilityLayer.ABILITIES); - } - - if (hasParam("AddKeyword") || hasParam("AddAbility") + if (hasParam("RemoveAllAbilities") || hasParam("GainsAbilitiesOf") + || hasParam("GainsAbilitiesOfDefined") || hasParam("GainsTriggerAbsOf") + || hasParam("AddKeyword") || hasParam("AddAbility") || hasParam("AddTrigger") || hasParam("RemoveTriggers") || hasParam("RemoveKeyword") || hasParam("AddReplacementEffects") || hasParam("AddStaticAbility") || hasParam("AddSVar") 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 11f462173f6..1324aa67c87 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -816,23 +816,10 @@ public final class StaticAbilityContinuous { } if (params.containsKey("GainsAbilitiesOf") || params.containsKey("GainsAbilitiesOfDefined")) { - CardCollection cardsIGainedAbilitiesFrom = new CardCollection(); + CardCollection cards = cardsGainedFrom(params.containsKey("GainsAbilitiesOfDefined") ? + "GainsAbilitiesOfDefined" : "GainsAbilitiesOf", params, hostCard, stAb, game); - if (params.containsKey("GainsAbilitiesOf")) { - final String[] valids = params.get("GainsAbilitiesOf").split(","); - List validZones; - if (params.containsKey("GainsAbilitiesOfZones")) { - validZones = ZoneType.listValueOf(params.get("GainsAbilitiesOfZones")); - } else { - validZones = ImmutableList.of(ZoneType.Battlefield); - } - cardsIGainedAbilitiesFrom.addAll(CardLists.getValidCards(game.getCardsIn(validZones), valids, hostCard.getController(), hostCard, stAb)); - } - if (params.containsKey("GainsAbilitiesOfDefined")) { - cardsIGainedAbilitiesFrom.addAll(AbilityUtils.getDefinedCards(hostCard, params.get("GainsAbilitiesOfDefined"), stAb)); - } - - for (Card c : cardsIGainedAbilitiesFrom) { + for (Card c : cards) { for (SpellAbility sa : c.getSpellAbilities()) { if (sa.isActivatedAbility()) { if (!stAb.matchesValidParam("GainsValidAbilities", sa)) { @@ -871,6 +858,17 @@ public final class StaticAbilityContinuous { } } + if (params.containsKey("GainsTriggerAbsOf")) { + CardCollection cards = cardsGainedFrom("GainsTriggerAbsOf", params, hostCard, stAb, game); + + for (Card c : cards) { + for (final Trigger trig : c.getTriggers()) { + final Trigger newTrigger = affectedCard.addTriggerForStaticAbility(trig, stAb); + addedTrigger.add(newTrigger); + } + } + } + // add static abilities if (addStatics != null) { for (String s : addStatics) { @@ -1001,6 +999,24 @@ public final class StaticAbilityContinuous { sourceCard.addLeavesPlayCommand(removeIgnore); } + private static CardCollection cardsGainedFrom(final String param, final Map params, + final Card hostCard, final StaticAbility stAb, final Game game) { + CardCollection cards = new CardCollection(); + if (param.contains("Defined")) { + cards.addAll(AbilityUtils.getDefinedCards(hostCard, params.get(param), stAb)); + } else { + final String[] valids = params.get(param).split(","); + List validZones; + if (params.containsKey("GainsAbilitiesOfZones")) { + validZones = ZoneType.listValueOf(params.get("GainsAbilitiesOfZones")); + } else { + validZones = ImmutableList.of(ZoneType.Battlefield); + } + cards.addAll(CardLists.getValidCards(game.getCardsIn(validZones), valids, hostCard.getController(), hostCard, stAb)); + } + return cards; + } + private static List getAffectedPlayers(final StaticAbility stAb) { final Map params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard(); diff --git a/forge-gui/res/cardsfolder/upcoming/idris_soul_of_the_tardis.txt b/forge-gui/res/cardsfolder/upcoming/idris_soul_of_the_tardis.txt new file mode 100644 index 00000000000..62e9307a06b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/idris_soul_of_the_tardis.txt @@ -0,0 +1,12 @@ +Name:Idris, Soul of the TARDIS +ManaCost:1 U R +Types:Legendary Creature Human Incarnation +PT:3/3 +K:Vanishing:3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another artifact you control until NICKNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | ChangeType$ Artifact.Other+YouCtrl | SelectPrompt$ Select another artifact you control | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.ExiledWithSource | GainsTriggerAbsOf$ Card.ExiledWithSource | GainsAbilitiesOfZones$ Exile | AddPower$ X | AddToughness$ X | Description$ NICKNAME has all activated and triggered abilities of the exiled card and gets +X/+X, where X is the exiled card's mana value. +SVar:X:Count$ValidExile Card.ExiledWithSource$CardManaCost +DeckHas:Ability$Counters|Sacrifice +DeckNeeds:Type$Artifact +Oracle:Vanishing 3\nImprint — When Idris, Soul of the TARDIS enters the battlefield, exile another artifact you control until Idris leaves the battlefield.\nIdris has all activated and triggered abilities of the exiled card and gets +X/+X, where X is the exiled card's mana value.