From 592f708c00e371db5d364d77ed408bfb33e2bb7f Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 5 Feb 2021 04:45:50 +0000 Subject: [PATCH] Jorn God of Winter and Kaldrin the Rimestaff --- .../game/ability/effects/EffectEffect.java | 4 ++- .../forge/game/ability/effects/TapEffect.java | 15 +++------- .../game/ability/effects/UntapEffect.java | 30 ++++++++----------- ...n_god_of_winter_kaldring_the_rimestaff.txt | 28 +++++++++++++++++ 4 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/jorn_god_of_winter_kaldring_the_rimestaff.txt 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 1f7ae1be074..d7e1e7fec74 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 @@ -211,7 +211,9 @@ public class EffectEffect extends SpellAbilityEffect { } if (sa.hasParam("ForgetOnMoved")) { addForgetOnMovedTrigger(eff, sa.getParam("ForgetOnMoved")); - addForgetOnCastTrigger(eff); + if (!"Stack".equals(sa.getParam("ForgetOnMoved"))) { + addForgetOnCastTrigger(eff); + } } else if (sa.hasParam("ExileOnMoved")) { addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved")); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TapEffect.java index 07269b2620b..a9270845b53 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TapEffect.java @@ -3,10 +3,7 @@ package forge.game.ability.effects; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; +import forge.util.Lang; public class TapEffect extends SpellAbilityEffect { @@ -22,11 +19,8 @@ public class TapEffect extends SpellAbilityEffect { card.clearRemembered(); } - final TargetRestrictions tgt = sa.getTargetRestrictions(); - final List tgtCards = getTargetCards(sa); - - for (final Card tgtC : tgtCards) { - if (tgt != null && !tgtC.canBeTargetedBy(sa)) { + for (final Card tgtC : getTargetCards(sa)) { + if (sa.usesTargeting() && !tgtC.canBeTargetedBy(sa)) { continue; } if (tgtC.isInPlay()) { @@ -47,8 +41,7 @@ public class TapEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); sb.append("Tap "); - final List tgtCards = getTargetCards(sa); - sb.append(StringUtils.join(tgtCards, ", ")); + sb.append(Lang.joinHomogenous(getTargetCards(sa))); sb.append("."); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java index d2c1a94dbd5..0b12f681a9d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java @@ -8,15 +8,10 @@ import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.Lang; import forge.util.Localizer; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; - - public class UntapEffect extends SpellAbilityEffect { /* (non-Javadoc) @@ -33,8 +28,7 @@ public class UntapEffect extends SpellAbilityEffect { sb.append("up to ").append(sa.getParam("Amount")).append(" "); sb.append(sa.getParam("UntapType")).append("s"); } else { - List tgtCards = getTargetCards(sa); - sb.append(StringUtils.join(tgtCards, ", ")); + sb.append(Lang.joinHomogenous(getTargetCards(sa))); } sb.append("."); return sb.toString(); @@ -42,20 +36,22 @@ public class UntapEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final TargetRestrictions tgt = sa.getTargetRestrictions(); - if (sa.hasParam("UntapUpTo")) { untapChoose(sa, false); } else if (sa.hasParam("UntapExactly")) { untapChoose(sa, true); } else { - - final List tgtCards = getTargetCards(sa); - - for (final Card tgtC : tgtCards) { - if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) { + for (final Card tgtC : getTargetCards(sa)) { + if (sa.usesTargeting() && !tgtC.canBeTargetedBy(sa)) { + continue; + } + if (tgtC.isInPlay()) { tgtC.untap(); } + if (sa.hasParam("ETB")) { + // do not fire triggers + tgtC.setTapped(false); + } } } } @@ -74,9 +70,7 @@ public class UntapEffect extends SpellAbilityEffect { final int num = Integer.parseInt(sa.getParam("Amount")); final String valid = sa.getParam("UntapType"); - final List definedPlayers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); - - for (final Player p : definedPlayers) { + for (final Player p : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa)) { CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), valid, sa.getActivatingPlayer(), sa.getHostCard()); list = CardLists.filter(list, Presets.TAPPED); diff --git a/forge-gui/res/cardsfolder/upcoming/jorn_god_of_winter_kaldring_the_rimestaff.txt b/forge-gui/res/cardsfolder/upcoming/jorn_god_of_winter_kaldring_the_rimestaff.txt new file mode 100644 index 00000000000..722a5f4893e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jorn_god_of_winter_kaldring_the_rimestaff.txt @@ -0,0 +1,28 @@ +Name:Jorn, God of Winter +ManaCost:2 G +Types:Legendary Snow Creature God +PT:3/3 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntapAllSnow | TriggerDescription$ Whenever CARDNAME attacks, untap each snow permanent you control. +SVar:TrigUntapAllSnow:DB$ UntapAll | ValidCards$ Permanent.Snow+YouCtrl +SVar:PlayMain1:TRUE +AlternateMode:Modal +DeckNeeds:Type$Snow +DeckHas:Ability$Graveyard +Oracle:Whenever Jorn attacks, untap each snow permanent you control. + +ALTERNATE + +Name:Kaldring, the Rimestaff +ManaCost:1 U B +Types:Legendary Snow Artifact +A:AB$ Effect | Cost$ T | TgtZone$ Graveyard | ValidTgts$ Permanent.Snow+YouCtrl | TgtPrompt$ Choose target snow permanent card in your graveyard | StaticAbilities$ STPlay | RememberObjects$ Targeted | ForgetOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped. +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play target snow permanent card from your graveyard this turn. +SVar:DBEffect:DB$ Effect | RememberObjects$ ParentTarget | ForgetOnMoved$ Stack | ReplacementEffects$ ETBCreat | SVars$ DBTap,ToBattlefield,DBExile | References$ ETBCreat,DBTap,ToBattlefield,DBExile +SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBTap | Description$ If you do, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | Defined$ ReplacedCard | ETB$ True | SubAbility$ ToBattlefield +SVar:ToBattlefield:DB$ InternalEtbReplacement | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:STTapped:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ CARDNAME enters the battlefield tapped. +DeckNeeds:Type$Snow +DeckHas:Ability$Graveyard +Oracle:{T}: You may play target snow permanent card from your graveyard this turn. If you do, it enters the battlefield tapped.