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 28f26ae520a..48e2646c629 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -3007,18 +3007,10 @@ public class AbilityUtils { } } else { final Spell newSA = (Spell) s.copy(controller); - SpellAbilityRestriction res = new SpellAbilityRestriction(); - // timing restrictions still apply - res.setPlayerTurn(s.getRestrictions().getPlayerTurn()); - res.setOpponentTurn(s.getRestrictions().getOpponentTurn()); - res.setPhases(s.getRestrictions().getPhases()); - res.setZone(null); - newSA.setRestrictions(res); - // timing restrictions still apply - if (res.checkTimingRestrictions(tgtCard, newSA) - // still need to check the other restrictions like Aftermath - && res.checkOtherRestrictions(tgtCard, newSA, controller)) { - newSA.setCastFromPlayEffect(true); + newSA.getRestrictions().setZone(null); + newSA.setCastFromPlayEffect(true); + // extra timing restrictions still apply + if (newSA.canPlay()) { sas.add(newSA); } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 16cc3e9c99f..46fb064f17f 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1713,14 +1713,7 @@ public class Player extends GameEntity implements Comparable { if (!canCastSorcery() && (landSa == null || !landSa.withFlash(land, this))) { return false; } - } - // CantBeCast static abilities - if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { - return false; - } - - if (land != null && !ignoreZoneAndTiming) { final boolean mayPlay = landSa == null ? !land.mayPlay(this).isEmpty() : landSa.getMayPlay() != null; if (land.getOwner() != this && !mayPlay) { return false; @@ -1732,6 +1725,11 @@ public class Player extends GameEntity implements Comparable { } } + // CantBeCast static abilities + if (StaticAbilityCantBeCast.cantPlayLandAbility(landSa, land, this)) { + return false; + } + // **** Check for land play limit per turn **** // Dev Mode if (getMaxLandPlaysInfinite()) { diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 351be674fba..057ca219569 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -72,7 +72,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } // CR 118.6 cost is unpayable - if (getPayCosts().hasManaCost() && getPayCosts().getCostMana().getMana().isNoCost()) { + if (!isCastFromPlayEffect() && getPayCosts().hasManaCost() && getPayCosts().getCostMana().getMana().isNoCost()) { return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 3a425af9465..615d27406c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -353,6 +353,10 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { public final boolean checkActivatorRestrictions(final Card c, final SpellAbility sa) { Player activator = sa.getActivatingPlayer(); + if (sa.isCastFromPlayEffect()) { + return true; + } + if (sa.isSpell()) { // Spells should always default to "controller" but use mayPlay check. final CardPlayOption o = c.mayPlay(sa.getMayPlay()); @@ -615,14 +619,12 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { return false; } - if (!sa.isCastFromPlayEffect()) { - if (!checkTimingRestrictions(c, sa)) { - return false; - } + if (!checkActivatorRestrictions(c, sa)) { + return false; + } - if (!checkActivatorRestrictions(c, sa)) { - return false; - } + if (!checkTimingRestrictions(c, sa)) { + return false; } if (!checkZoneRestrictions(c, sa)) { diff --git a/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt b/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt index d3fc598d604..fe3e82eb96c 100644 --- a/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt +++ b/forge-gui/res/cardsfolder/z/zenos_yae_galvus_shinryu_transcendent_rival.txt @@ -2,7 +2,7 @@ Name:Zenos yae Galvus ManaCost:3 B B Types:Legendary Creature Human Noble Warrior PT:4/4 -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ My First Friend — When CARDNAME enters, choose a creature an opponent controls. Until end of turn, creatures other than Zenos yae Galvus and the chosen creature get -2/-2. +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ My First Friend — When CARDNAME enters, choose a creature an opponent controls. Until end of turn, creatures other than CARDNAME and the chosen creature get -2/-2. SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.OppCtrl | Mandatory$ True | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature.Other+!ChosenCardStrict | IsCurse$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.ChosenCardStrict | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When the chosen creature leaves the battlefield, transform CARDNAME.