From b2fc1844befd96eb7627ea57c0167931a7fb1ac9 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 26 Jul 2019 05:47:21 +0000 Subject: [PATCH] EffectSource: now they can know about the SpellAbility that did the Effect for Epic --- .../main/java/forge/game/ability/AbilityUtils.java | 4 ++-- .../forge/game/ability/SpellAbilityEffect.java | 9 +++++---- .../ability/effects/CopySpellAbilityEffect.java | 6 ++++-- .../forge/game/ability/effects/EffectEffect.java | 2 +- .../forge/game/ability/effects/PlayEffect.java | 2 +- .../game/ability/effects/RegenerateBaseEffect.java | 2 +- forge-game/src/main/java/forge/game/card/Card.java | 14 ++++++++++++++ .../main/java/forge/game/card/CardFactoryUtil.java | 8 ++++---- 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index d1e4633ea37..7ad85d9c666 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1296,8 +1296,8 @@ public class AbilityUtils { } } else if (defined.equals("EffectSource")) { - if (card.getEffectSource() != null) { - sas.addAll(card.getEffectSource().getSpellAbilities()); + if (card.getEffectSourceAbility() != null) { + sas.add(card.getEffectSourceAbility().getRootAbility()); } } else if (defined.equals("SourceFirstSpell")) { diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 83c102a99ee..6c468779186 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -341,7 +341,7 @@ public abstract class SpellAbilityEffect { protected static void addLeaveBattlefieldReplacement(final Card card, final SpellAbility sa, final String zone) { final Card host = sa.getHostCard(); final Game game = card.getGame(); - final Card eff = createEffect(host, sa.getActivatingPlayer(), host.getName() + "'s Effect", host.getImageKey()); + final Card eff = createEffect(sa, sa.getActivatingPlayer(), host.getName() + "'s Effect", host.getImageKey()); addLeaveBattlefieldReplacement(eff, zone); @@ -378,8 +378,9 @@ public abstract class SpellAbilityEffect { } // create a basic template for Effect to be used somewhere else - protected static Card createEffect(final Card hostCard, final Player controller, final String name, + protected static Card createEffect(final SpellAbility sa, final Player controller, final String name, final String image) { + final Card hostCard = sa.getHostCard(); final Game game = hostCard.getGame(); final Card eff = new Card(game.nextCardId(), game); eff.setTimestamp(game.getNextTimestamp()); @@ -404,7 +405,7 @@ public abstract class SpellAbilityEffect { eff.setColor(hostCard.determineColor().getColor()); } eff.setImmutable(true); - eff.setEffectSource(hostCard); + eff.setEffectSource(sa); return eff; } @@ -440,7 +441,7 @@ public abstract class SpellAbilityEffect { // build an Effect with that infomation String name = host.getName() + "'s Effect"; - final Card eff = createEffect(host, controller, name, host.getImageKey()); + final Card eff = createEffect(sa, controller, name, host.getImageKey()); if (cards != null) { eff.addRemembered(cards); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 26ca842301d..fcb79639e2b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -174,10 +174,12 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { if (sa.hasParam("Epic")) { copy.getHostCard().removeIntrinsicKeyword("Epic"); SpellAbility sub = copy; - while (sub.getSubAbility() != null) { + while (sub.getSubAbility() != null && !sub.hasParam("Epic")) { sub = sub.getSubAbility(); } - sub.getParent().setSubAbility(null); + if (sub != null) { + sub.getParent().setSubAbility(sub.getSubAbility()); + } } copies.add(copy); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index 13897ae29fa..99bbdbff128 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -116,7 +116,7 @@ public class EffectEffect extends SpellAbilityEffect { image = hostCard.getImageKey(); } - final Card eff = createEffect(hostCard, controller, name, image); + final Card eff = createEffect(sa, controller, name, image); // Grant SVars first in order to give references to granted abilities if (effectSVars != null) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index e0431306d95..38dceefcb16 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -286,7 +286,7 @@ public class PlayEffect extends SpellAbilityEffect { final Player controller = sa.getActivatingPlayer(); final String name = hostCard.getName() + "'s Effect"; final String image = hostCard.getImageKey(); - final Card eff = createEffect(hostCard, controller, name, image); + final Card eff = createEffect(sa, controller, name, image); eff.addRemembered(c); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java index e84307bb801..d4ff911c8ef 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java @@ -23,7 +23,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect { // create Effect for Regeneration final Card eff = createEffect( - hostCard, sa.getActivatingPlayer(), hostCard.getName() + "'s Regeneration", hostCard.getImageKey()); + sa, sa.getActivatingPlayer(), hostCard.getName() + "'s Regeneration", hostCard.getImageKey()); eff.addRemembered(list); addForgetOnMovedTrigger(eff, "Battlefield"); 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 20797fb1b74..900da08cee7 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -105,6 +105,8 @@ public class Card extends GameEntity implements Comparable { // if this card is attached or linked to something, what card is it currently attached to private Card encoding, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; + private SpellAbility effectSourceAbility = null; + private GameEntity entityAttachedTo = null; private GameEntity mustAttackEntity = null; @@ -5609,12 +5611,24 @@ public class Card extends GameEntity implements Comparable { } public Card getEffectSource() { + if (effectSourceAbility != null) { + return effectSourceAbility.getHostCard(); + } return effectSource; } + + public SpellAbility getEffectSourceAbility() { + return effectSourceAbility; + } + public void setEffectSource(Card src) { effectSource = src; } + public void setEffectSource(SpellAbility sa) { + effectSourceAbility = sa; + } + public boolean isStartsGameInPlay() { return startsGameInPlay; } 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 d06dce25b32..a958d18e9ae 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3906,14 +3906,14 @@ public class CardFactoryUtil { // Epic does modify existing SA, and does not add new one // Add the Epic effect as a subAbility - String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent"; + String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent | Epic$ True"; final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr.toString(), card); - card.setSVar("EpicCantBeCast", "Mode$ CantBeCast | ValidCard$ Card | Caster$ You | EffectZone$ Command | Description$ For the rest of the game, you can't cast spells."); - card.setSVar("EpicTrigger", "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ EpicCopy | TriggerDescription$ " + newSA.setSVar("EpicCantBeCast", "Mode$ CantBeCast | ValidCard$ Card | Caster$ You | EffectZone$ Command | Description$ For the rest of the game, you can't cast spells."); + newSA.setSVar("EpicTrigger", "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ EpicCopy | TriggerDescription$ " + "At the beginning of each of your upkeeps, copy " + card.toString() + " except for its epic ability."); - card.setSVar("EpicCopy", "DB$ CopySpellAbility | Defined$ EffectSource | Epic$ True"); + newSA.setSVar("EpicCopy", "DB$ CopySpellAbility | Defined$ EffectSource | Epic$ True"); final SpellAbility origSA = card.getFirstSpellAbility();