diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index 8c5e3351bab..75ff7d136c4 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -103,6 +103,9 @@ public final class CardFacePredicates { if (!hasManaCost(input, manaCost)) { return false; } + } else if (m.contains("cmcEQ")) { + int i = Integer.parseInt(m.substring(5)); + if (!hasCMC(input, i)) return false; } else if (!hasProperty(input, m)) { return false; } @@ -122,6 +125,11 @@ public final class CardFacePredicates { return mC.equals(input.getManaCost().getShortString()); } + static protected boolean hasCMC(ICardFace input, final int value) { + ManaCost cost = input.getManaCost(); + return cost != null && cost.getCMC() == value; + } + } public static Predicate valid(final String val) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java index e7f09c53919..2bd45869040 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java @@ -253,6 +253,8 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { if (!"Permanent".equals(duration) && !perpetual) { if ("UntilControllerNextUntap".equals(duration)) { game.getUntap().addUntil(c.getController(), unanimate); + } else if ("UntilAnimatedFaceup".equals(duration)) { + c.addFaceupCommand(unanimate); } else { addUntilCommand(sa, unanimate); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index e2eae0a4087..227183084e1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -21,6 +21,7 @@ import forge.game.spellability.SpellAbility; import forge.util.Aggregates; import forge.util.Lang; import forge.util.Localizer; +import org.apache.commons.lang3.StringUtils; public class ChooseCardNameEffect extends SpellAbilityEffect { @@ -119,6 +120,10 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { Predicate cpp = Predicates.alwaysTrue(); if (sa.hasParam("ValidCards")) { //Calculating/replacing this must happen before running valid in CardFacePredicates + if (valid.contains("cmcEQ") && !StringUtils.isNumeric(valid.split("cmcEQ")[1])) { + String s = valid.split("cmcEQ")[1]; + valid = valid.replace(s, String.valueOf(AbilityUtils.calculateAmount(host, s, sa))); + } if (valid.contains("ManaCost=")) { if (valid.contains("ManaCost=Equipped")) { String s = host.getEquipping().getManaCost().getShortString(); 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 73f01183068..716ffaea0bb 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2819,7 +2819,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { addedManaStrings.add(sAbility); } - if (!sAbility.endsWith(state.getName() + "\r\n")) { + boolean alwaysShow = false; + if (!sa.isIntrinsic()) alwaysShow = true; // allows added abilities to show on face-down stuff (e.g. Morph,Cloaked) + if (!sAbility.endsWith(state.getName() + "\r\n") || alwaysShow) { sb.append(sAbility); sb.append("\r\n"); } diff --git a/forge-gui/res/cardsfolder/upcoming/roalesk_prime_specimen.txt b/forge-gui/res/cardsfolder/upcoming/roalesk_prime_specimen.txt new file mode 100644 index 00000000000..ab5f835fe36 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/roalesk_prime_specimen.txt @@ -0,0 +1,16 @@ +Name:Roalesk, Prime Specimen +ManaCost:2 G U +Types:Legendary Creature Human Mutant +PT:4/5 +K:Flying +T:Mode$ TurnFaceUp | ValidCard$ Card.Self,Permanent.Other+YouCtrl | Execute$ TrigRandom | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME or another permanent you control is turned face up, you may pay {X}. If you do, if X is 1 or more, conjure a duplicate of a random creature card with mana value X into your hand. Cloak it. It gains "{G/U}: Turn this creature face up" for as long as it remains face down. +SVar:TrigRandom:AB$ NameCard | Cost$ X | ConditionCheckSVar$ X | ValidCards$ Creature.cmcEQX | AtRandom$ True | SubAbility$ DBConjure +SVar:DBConjure:DB$ MakeCard | Name$ ChosenName | Conjure$ True | ConditionCheckSVar$ X | Zone$ Hand | RememberMade$ True | SubAbility$ DBCloak +SVar:DBCloak:DB$ Cloak | Defined$ Remembered | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Duration$ UntilAnimatedFaceup | Abilities$ ABTurn | SubAbility$ DBCleanup +SVar:ABTurn:AB$ SetState | Cost$ GU | Defined$ Self | Mode$ TurnFaceUp | SpellDescription$ Turn this creature face up. +SVar:DBCleanup:DB$ Cleanup | ClearNamedCard$ True | ClearRemembered$ True +SVar:X:Count$xPaid +K:Disguise:G U +DeckHints:Keyword$Morph|Megamorph|Disguise +Oracle:Flying\nWhenever Roalesk, Prime Specimen or another permanent you control is turned face up, you may pay {X}. If you do, if X is 1 or more, conjure a duplicate of a random creature card with mana value X into your hand. Cloak it. It gains "{G/U}: Turn this creature face up" for as long as it remains face down.\nDisguise {G}{U}