[Home]AlexChurchill/MagicCardGenerator

ec2-3-138-138-144.us-east-2.compute.amazonaws.com | ToothyWiki | AlexChurchill | RecentChanges | Login | Webcomic

< [Generate!] ... Generator ... Discuss ... Limited ... CardList ... Type 4 ... Game1 ... Game2 ... Game3 ... Game4 >

Click on BNF: AlexChurchill/MagicCardGenerator to see completely randomly generated text that could (almost) appear on a MagicTheGathering card.



Take a look at the /MagicGeneratorDiscussion or /GeneratorLimited to see the silly cards people have received already, and their attempts to make up card name, type and mana costs for them. And on /TypeFourGenerated, people are not just making up these details, but playing games using these Generated cards!

The Magic Card Generator source may be seen below. It is available under the CreativeCommons? [Attribution-NonCommercial-ShareAlike 2.0 UK] license: others are free to create works based on it, provided they are distributed under the same license and not distributed for profit without AlexChurchill's prior permission.
The output of the generator is automatically and randomly created, and no copyright is asserted over the Generator creations. Magic: the Gathering is a trademark of Wizards of the Coast.

The generator is under constant development. Notific of bugs is appreciated, to AlexChurchill by email or Wiki.

References Elsewhere


Seems more appropriate here than on the card discussion page: This generator is obviously getting around a bit, as I've just seen it mentioned in [a StarCityGames article...]
Wow, cooool!! :)  Let the disjointed, overpowered madness continue!
I thought you guys might like to know that [Magic Lampoon]'s latest joke spoiler contains a card that's an obvious reference to your generator:
Royal Pain in the Assassin
BB
Sorcery
Choose the first one - destroy target tapped creature; or untap target blue artifact that came into play this turn; or enchanted Minotaurs you control gain protection from lands until end of turn.
--Ultros, from forum.cmc.redleaf.de
Cool - thanks! :) By comparison, here's a genuine Generated instant that reminded me of this:
Instant (red)
Choose one: unless any player pays X life, where X is the number of basic land types among lands you control, you reveal the top Y cards of your library, where Y is the number of enchantments any player controls. you put all sorcery cards from among them into hand and put the rest on the bottom of your library in any order and ~this~ deals 2 damage to target creature or player. Creatures damaged this way can't be regenerated. . If a creature damaged this way would be put into a graveyard this turn, remove it from the game instead. ; or unless an opponent sacrifices a creature, copy target Arcane spell and choose new targets for the copy


As well as the official discussion page, there are a bunch of other threads online discussing the creations of this generator. Those who enjoy reading people's reactions to the zany creations may find some threads here: [1][2][3][4][5][6][7][8][9][10]

In fact, people are playing a crazy game using the Generator on [this thread]. They each hit the Generator for one card and are forced to play it, generating a random colour and P/T if applicable, and having 5 mana of any colour available each pair of turns (from untap to untap) for activated abilities. No libraries or graveyards, and cards "drawn" are in hand but only usable to pay discard costs (all Generated things are considered to be tokens). Predictably, it's come out rather silly. So I rigged up an alternate shell around the generator to create creature P/Ts?, so people can play a similar game here on /TypeFourGenerated. See that page for the ensuing silliness. There are also Type Four games running [here]. --AC

On the tiny Magic forum Ultros hangs out on, there's a card making thread running where the previous round's winner posts a criteria for the card to be made for the next round, and everybody makes something for it.  On the last one he did, he had them get a generated card that they liked, and clean it up.  That post is here: [11]




Implementation



It's written in a FunctionalProgrammingLanguage based on BNF, created by MoonShadow for ToothyWiki: see GeneratorsForDummies for an intro to the syntax, and MoonShadow/GeneratorGenerator for gory details. Other things written in this include a [Tabloid Headline Generator], a [posh menu generator], an [incomprehensible essay generator], a [character generator] for the Exalted RPG, a [Fighting Fantasy-style dungeon], a [spam generator], an [excuse generator], and many others.


option ::= include = AlexChurchill/MCGAbilities
option ::= include = AlexChurchill/MCGEffects
option ::= include = AlexChurchill/MCGTargets
option ::= include = AlexChurchill/MCGTypes
option ::= include = AlexChurchill/GeneratorMaths
option ::= include = Vitenka/FlavourTextGenerator?
option ::= include = ChrisHowlett/ExaltedNameGenerator

bnf ::= preliminaryinit generatecard newline hr newline generatecard newline hr newline generatecard

generatecard ::= initflagsperm manacost##permcategory generatepermanent generateflavourtext | initflagsperm manacost##permcategory generatepermanent generateflavourtext | initflagsoneoff manacost_normal generateoneoff generateflavourtext
generatepermanent ::= choosenewpermanenttype##permcategory <<myText::=permanenttextbox##permcategory>> showtype cardprefixes myText cardsuffixes
generateoneoff ::= choosenewoneofftype <<myText::=spelltemplate>> showtype cardprefixes myText cardsuffixes
generateflavourtext ::= nothing | nothing | <br />-- SingleFlavour?

manacost_land ::= nothing
manacost_normal ::= cardmanacost newline
manacost_planeswalker ::= cardmanacost newline

convertedmanacostphrase ::= _convertedmanacostphrase##permcategory
_convertedmanacostphrase_land ::= nothing
_convertedmanacostphrase_normal ::= newline newline "Converted mana cost: " chooserandomcmc ""
_convertedmanacostphrase_planeswalker ::= _convertedmanacostphrase_normal
chooserandomcmc ::= integeronethroughfour | integeronethroughseven

spelltemplate ::= normalspell | normalspell | normalspell | normalspell | normalspell | normalspell | modalspell
normalspell ::= maybespellkeywordabilityprefix effecttext | effecttext{{lastspelleffecttext}} maybespellkeywordabilitysuffix
modalspell ::= "Choose one: " effecttext "; or " resetflags effecttext optionalfurthermodes maybeentwine
kickerspell ::= maybespellkeywordabilityprefix kickercost notekickercost ". " targetobtainingeffect ". If you paid the " nextkickercost " kicker cost, " maybeinstead specialtargeteffect maybespellkeywordabilitysuffix
optionalfurthermodes ::= nothing | nothing | nothing | nothing | "; or " resetflags effecttext optionalfurthermodes

permanenttextbox_normal ::= cardabilities
permanenttextbox_land ::= maybecipt landability maybemorelandabilities
permanenttextbox_planeswalker ::= resetpwflags <<myLoyalty::=integeronethroughseven>> "+" tinyinteger ": " effecttext newline resetpwflags "-" integeronethroughfour ": " effecttext newline resetpwflags <plus_op1::=myLoyalty> <plus_op2::=integeronethroughfour> _plus "-" plus_output ": " effecttext

Costs and Mana



multiplecost ::= costtext | costtext | costtext ", " nonmanacost
costtext ::= costinmana | nonmanacost
dynamiccosttext ::= dynamicmanacost | nonmanacost
nonmanacost ::= maybeTap | maybeTap | maybeSacThis? | "Discard a " discardablecard <param_discrete::=discardedmanacost> <param_continuous::=param_discrete> <param_colour::=discardedcolour> | sacrificecost | "Pay " integeronethroughfour " life" | "Tap an untapped " nonuntapnoncontrolqualifiedpermanent space playerSecondRef?##playerPaying " control" playerVerbSuffix##playerPaying
discardedmanacost ::= "the discarded card's converted mana cost"
discardedcolour ::= "the discarded card's colours"

largecost ::= largemanacost | largenonmanacost
largemanacost ::= integerthreethroughsix colouredmanacost colouredmanacost | integeronethroughfour colouredmanacost colouredmanacost
largenonmanacost ::= maybeSacThis? | "Discard a " discardablecard <param_discrete::=discardedmanacost> <param_continuous::=param_discrete> <param_colour::=discardedcolour> | sacrificecost | "Pay " integerthreethroughsix " life"

nocardmultiplecost ::= nocardcosttext | nocardcosttext | nocardcosttext ", " nocardnonmanacost
nocardcosttext ::= dynamicmanacost | nocardnonmanacost
nocardprobablymanacost ::= dynamicmanacost | dynamicmanacost | dynamicmanacost | dynamicmanacost | nocardmultiplecost
nocardnonmanacost ::= <sacCostUsed?::=used> <tapCostUsed?::=used> nonmanacost
manaorlifecost ::= costinmana | costinmana | integeronethroughseven " life"

justtapcost ::= T <tapCostUsed?::=used>
forcetapmulticost ::= <tapCostUsed?::=used> multiplecost ", T"

paysextracost ::= "pays " costinmana | "pays " costinmana | "discards a " discardablecard | "sacrifices a " noncontrolqualifiedpermanent | "pays " dynamicinteger_noXphrase " life" showsuffixes | "taps an untapped " nonuntapnoncontrolqualifiedpermanent " he or she controls"
discardablecard ::= card | card | cardtype " card"

optionaleffectpaycostclause ::= nothing | nothing | nothing | nothing | effectspecifiedsingleplayer{myPlr} " may pay " pushplayer dynamicmanacost popplayer ". If " playerSecondRef? space doverb##myPlr maybenapostrophet ", " | effectspecifiedsingleplayer{myPlr} " may " <tapCostUsed?::=used> pushplayer <playerPaying::=youornot##myPlr> nonmanacost popplayer ". If " playerSecondRef? space doverb##myPlr maybenapostrophet ", " <playerPaying::=you>
optionalpermpaycostclause ::= nothing | nothing | nothing | nothing | permunspecifiedplayer{myPlr} " may pay " pushplayer dynamicmanacost popplayer ". If " playerSecondRef? space doverb##myPlr maybenapostrophet ", " | permunspecifiedplayer{myPlr} " may " pushplayer <playerPaying::=youornot##myPlr> nocardnonmanacost popplayer ". If " playerSecondRef? space doverb##myPlr maybenapostrophet ", " <playerPaying::=you>

cardmanacost ::= monocolouredcardmanacost | monocolouredcardmanacost | monocolouredcardmanacost | multicolouredcost | costinmana
monocolouredcardmanacost ::= singlecolouredcost | cardgenericmanacost singlecolouredcost | cardgenericmanacost singlecolouredcost singlecolouredcost
cardgenericmanacost ::= integeronethroughfour | integeronethroughfour |
costinmana ::= colouredmanacost | integeronethroughfour | integeronethroughfour colouredmanacost
colouredmanacost ::= singlecolouredcost | singlecolouredcost | singlecolouredcost | singlecolouredcost | singlecolouredcost | singlecolouredcost | multicolouredcost
multicolouredcost ::= twocolouredcost | twocolouredcost | twocolouredcost | twocolouredcost | threecolouredcost | fivecolouredcost
singlecolouredcost ::= manasymbol##myColour | manasymbol##myColour{M} optionalmanasymbol
// manasymbol | manasymbol{M} optionalmanasymbol
optionalmanasymbol ::= nothing | M | M optionalmanasymbol
twocolouredcost ::= alliedmanacost | alliedmanacost | alliedmanacost | enemymanacost
alliedmanacost ::= manasymbol##myColour{M} manasuccessor##M | manasymbol##myColour{M} unlikelymanasymbol manasuccessor##M{M} unlikelymanasymbol | <M::=manasymbol##myColour> manapredecessor##M M | <M::=manasymbol##myColour> manapredecessor##M{M} unlikelymanasymbol manasuccessor##M{M} unlikelymanasymbol | hybridsymbol##myColour##1{M} optionalmanasymbol | hybridsymbol##myColour##2{M} optionalmanasymbol
// an allied activation cost on e.g. a blue card will be either patterned UB, WU, UUBBB or WWWU
// manasymbol{M} manasuccessor##M | manasymbol{M} unlikelymanasymbol manasuccessor##M{M} unlikelymanasymbol
enemymanacost ::= <M::=manasymbol##myColour> manapredecessor##M <M::=manasuccessor##M> M | <M::=manasymbol##myColour> manapredecessor##M{M} unlikelymanasymbol <M::=manasuccessor##M> manasuccessor##M{M} unlikelymanasymbol | hybridsymbol##myColour##3{M} optionalmanasymbol
// an enemy activation cost on e.g. a green card will be either RW or RRRWW
// manasymbol{M} <M::=manasuccessor##M> manasuccessor##M | manasymbol{M} unlikelymanasymbol <M::=manasuccessor##M> manasuccessor##M{M} unlikelymanasymbol
unlikelymanasymbol ::= nothing | nothing | M unlikelymanasymbol
threecolouredcost ::= <M::=manasymbol##myColour> manapredecessor##M M manasuccessor##M
fivecolouredcost ::= WUBRG

dynamicmanacost ::= colouredmanacost | colouredmanacost | integeronethroughfour | integeronethroughfour | integeronethroughfour colouredmanacost | integeronethroughfour colouredmanacost | useXvariable showsuffixes | useXvariable space singlecolourphrase space "mana" showsuffixes
sacrificecost ::= "Sacrifice a " noncontrolqualifiedland | "Sacrifice a " noncontrolqualifiedpermanent <param_discrete::=sacrificedpermscost> <param_continuous::=param_discrete> <param_colour::=sacrificedpermscolour> | "Sacrifice a " noncontrolqualifiedcreature <param_discrete::=sacrificedcreaturespt> <param_continuous::=param_discrete> <param_colour::=sacrificedctrscolour>
sacrificedpermscolour ::= "the sacrificed permanent's colours"
sacrificedpermscost ::= "the sacrificed permanent's mana cost"
sacrificedctrscolour ::= "the sacrificed creature's colours"
sacrificedcreaturespt ::= "the sacrificed creature's " numericalptexpression

equipcost ::= "Equip " nocardprobablymanacost
kickercost ::= "Kicker " nocardprobablymanacost
morphcost ::= "Morph " nocardprobablymanacost

dynamicmanatoadd ::= colouredmanacost | tinyinteger | tinyinteger colouredmanacost | <N::=tinyinteger> word##N " mana of any" spaceoneifmultiple##N " colour" | smallmanatoadd <suffixes::=genericforeachcounter>

spaceoneifmultiple_1 ::= nothing
spaceoneifmultiple_2 ::= " one"
spaceoneifmultiple_3 ::= " one"
spaceoneifmultiple_4 ::= " one"
spaceoneifmultiple_5 ::= " one"
spaceoneifmultiple_6 ::= " one"
spaceoneifmultiple_7 ::= " one"

maybeTap ::= _maybeTap##tapCostUsed?
_maybeTap_used ::= nonmanacost
_maybeTap_nothing2 ::= _maybeTap##playerPaying
_maybeTap_notyou ::= nonmanacost
_maybeTap_you ::= _maybeTap##myType
_maybeTap_ctr ::= T <tapCostUsed?::=used>
_maybeTap_art ::= T <tapCostUsed?::=used>
_maybeTap_ench ::= nonmanacost
_maybeTap_land ::= T <tapCostUsed?::=used>
_maybeTap_unknown ::= nonmanacost
// **** must reset these flags at start of each cost
maybeSacThis? ::= _maybeSacThis?##thisStillInPlay?
_maybe[SacThis no]? ::= nonmanacost
_maybe[SacThis yes]? ::= _maybeSacThis?##sacCostUsed?
_maybe[SacThis used]? ::= nonmanacost
_maybe[SacThis nothing2]? ::= _maybeSacThis?##playerPaying
_maybe[SacThis notyou]? ::= nonmanacost
_maybe[SacThis you]? ::= "Sacrifice ~this~" <sacCostUsed?::=used> <thisStillInPlay?::=no>


Modifying Permanents



creaturepropmodifier ::= creaturepropmodifier##myColour
creaturepropmodifier_white ::= get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | permanentpropmodifier | maybegainsnewcreatureability##myNestedness | "can't attack or block" | "can't attack" | "can block an additional creature" | "can block any number of creatures"
creaturepropmodifier_blue ::= permanentpropmodifier | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | maybegainsnewcreatureability##myNestedness | "can't be blocked" | "can't be blocked except by " noncombatqualifiedcreatures | become verbsuffix##myPluralSuffix? space newcreaturetype
creaturepropmodifier_black ::= permanentpropmodifier | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | maybegainsnewcreatureability##myNestedness | "can't block " | "can't be blocked except by " noncombatqualifiedcreatures
creaturepropmodifier_red ::= permanentpropmodifier | get verbsuffix##myPluralSuffix? space ptchange | get verbsuffix##myPluralSuffix? space ptchange | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | maybegainsnewcreatureability##myNestedness | "can't block" | "can't be blocked by more than one creature"
creaturepropmodifier_green ::= permanentpropmodifier | get verbsuffix##myPluralSuffix? space ptchange | get verbsuffix##myPluralSuffix? space ptchange | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | maybegainsnewcreatureability##myNestedness | gain verbsuffix##myPluralSuffix? space landmanaability
creaturepropmodifier_artifact ::= permanentpropmodifier | get verbsuffix##myPluralSuffix? space ptchange | gain verbsuffix##myPluralSuffix? space grantablecreaturekeywordability | maybegainsnewcreatureability##myNestedness | "can't be blocked except by " noncombatqualifiedcreatures | become verbsuffix##myPluralSuffix? space newcreaturetype

numberedcreaturepropmodifier ::= get verbsuffix##myPluralSuffix? space numberedptchange | get verbsuffix##myPluralSuffix? space numberedptchange | gain verbsuffix##myPluralSuffix? space numberedcreaturekeywordability
pluralnumberedcreaturepropmodifier ::= <myPluralSuffix?::=s> numberedcreaturepropmodifier <myPluralSuffix?::=nothing>

noncreaturepermanentpropmodifier ::= noncreaturepermanentpropmodifier##myColour
noncreaturepermanentpropmodifier_white ::= beverb##myPluralSuffix? " white" | gain verbsuffix##myPluralSuffix? space protection##myAbilityContext? | maybegainsnewnoncreatureability##myNestedness | noncreaturetypechangemodifier
noncreaturepermanentpropmodifier_blue ::= beverb##myPluralSuffix? space singlecolourphrase | maybegainsnewnoncreatureability##myNestedness | noncreaturetypechangemodifier | "can't be the target of " qualifiedspellsorabilities
noncreaturepermanentpropmodifier_black ::= beverb##myPluralSuffix? " black" | gain verbsuffix##myPluralSuffix? space grantablepermanentkeywordability | maybegainsnewnoncreatureability##myNestedness
noncreaturepermanentpropmodifier_red ::= gain verbsuffix##myPluralSuffix? space grantablepermanentkeywordability | maybegainsnewnoncreatureability##myNestedness
noncreaturepermanentpropmodifier_green ::= beverb##myPluralSuffix? space singlecolourphrase | maybegainsnewnoncreatureability##myNestedness | noncreaturetypechangemodifier | "can't be the target of " qualifiedspellsorabilities
noncreaturepermanentpropmodifier_artifact ::= gain verbsuffix##myPluralSuffix? space grantablepermanentkeywordability | maybegainsnewnoncreatureability##myNestedness | noncreaturetypechangemodifier | "can't be the target of " qualifiedspellsorabilities

permanentpropmodifier ::= permanentpropmodifier##myColour
permanentpropmodifier_white ::= beverb##myPluralSuffix? " white" | gain verbsuffix##myPluralSuffix? space protection##myAbilityContext? | maybegainsnewnoncreatureability##myNestedness
permanentpropmodifier_blue ::= beverb##myPluralSuffix? space singlecolourphrase | maybegainsnewnoncreatureability##myNestedness | typechangemodifier | "can't be the target of " qualifiedspellsorabilities
permanentpropmodifier_black ::= beverb##myPluralSuffix? " black " | gain verbsuffix##myPluralSuffix? space grantablepermanentkeywordability | maybegainsnewnoncreatureability##myNestedness
permanentpropmodifier_red ::= maybegainsnewnoncreatureability##myNestedness
permanentpropmodifier_green ::= beverb##myPluralSuffix? space singlecolourphrase | maybegainsnewnoncreatureability##myNestedness | typechangemodifier | "can't be the target of " qualifiedspellsorabilities
permanentpropmodifier_artifact ::= gain verbsuffix##myPluralSuffix? space grantablepermanentkeywordability | maybegainsnewnoncreatureability##myNestedness | typechangemodifier
typechangemodifier ::= beverb##myPluralSuffix? space aifsingular##myPluralSuffix? usefulnoncreaturepermanenttype myPluralSuffix? " in addition to " itpossessive##myPluralSuffix? " other types"

noncreaturetypechangemodifier ::= beverb##myPluralSuffix? space aifsingular##myPluralSuffix? usefulnoncreaturepermanenttype myPluralSuffix? " in addition to " itpossessive##myPluralSuffix? " other types" | beverb##myPluralSuffix? space aifsingular##myPluralSuffix? "creature" myPluralSuffix? " with power and toughness equal to " itpossessive##myPluralSuffix? " converted mana cost in addition to " itpossessive##myPluralSuffix? " other types" | beverb##myPluralSuffix? space aifsingular##myPluralSuffix? powertoughness " creature" myPluralSuffix? " in addition to " itpossessive##myPluralSuffix? " other types"

creaturepropmodifier_nothing2 ::= creaturepropmodifier
creaturepropmodifier_s ::= pluralcreaturepropmodifier
permanentpropmodifier_nothing2 ::= permanentpropmodifier
permanentpropmodifier_s ::= pluralcreaturepropmodifier
noncreaturepermanentpropmodifier_nothing2 ::= noncreaturepermanentpropmodifier
noncreaturepermanentpropmodifier_s ::= pluralnoncreaturepermanentpropmodifier

pluralcreaturepropmodifier ::= <myPluralSuffix?::=s> creaturepropmodifier <myPluralSuffix?::=nothing>
numberedpluralcreaturepropmodifier ::= "get " numberedptchange
pluralpermanentpropmodifier ::= <myPluralSuffix?::=s> permanentpropmodifier <myPluralSuffix?::=nothing>
pluralnoncreaturepermanentpropmodifier ::= <myPluralSuffix?::=s> noncreaturepermanentpropmodifier <myPluralSuffix?::=nothing>
pluraltypechangemodifier ::= <myPluralSuffix?::=s> typechangemodifier <myPluralSuffix?::=nothing>
pluralnoncreaturetypechangemodifier ::= <myPluralSuffix?::=s> noncreaturetypechangemodifier <myPluralSuffix?::=nothing>

pluralpropmodifier_ctr ::= pluralcreaturepropmodifier
pluralpropmodifier_nonctr ::= pluralnoncreaturepermanentpropmodifier
pluralpropmodifier_perm ::= pluralpermanentpropmodifier

timeorcostmodifier ::= "as though they had flash" | "without paying their mana cost" | "by paying " quote nocardcosttext quote " rather than paying their mana cost"
costmodifier ::= "without paying their mana cost" | "by paying " quote nocardcosttext quote " rather than paying their mana cost"
costmodification ::= integeronethroughfour " more" | "up to " integeronethroughfour " less" | "an additional " quote nocardnonmanacost quote

// Nested abilities
maybegainsnewcreatureability_true ::= creaturepropmodifier
maybegainsnewcreatureability_false ::= gainsnewcreatureability
gainsnewcreatureability ::= gain verbsuffix##myPluralSuffix? space quote pushAllFlags? <allowCIP::=false> <myAbilityContext?::=grantable> <myNestedness::=true> creatureability <myNestedness::=false> popAllFlags? quote

maybegainsnewnoncreatureability_true ::= noncreaturepermanentpropmodifier
maybegainsnewnoncreatureability_false ::= gain verbsuffix##myPluralSuffix? space quote pushAllFlags? <allowCIP::=false> <myAbilityContext?::=grantable> <myNestedness::=true> noncreatureability <myNestedness::=false> popAllFlags? quote

Trigger events



// some entries have _ps in their name. This indicates it may leave myPluralSuffix? in a non-blank state.
// For a non-_ps thing to call a _ps thing, it must blank myPluralSuffix? afterwards
// All _ps things must not call any subfunctions that could reference myPluralSuffix? in unsafe ways

event ::= <verbMood::=indicative> <passiveSubject::=singular> pushAllowCIP? event_ps##myColour popAllowCIP? <passiveSubject::=singular> <myPluralSuffix?::=nothing>
event_ps_white ::= playerevent | playerevent | combatevent | aoroneormore_ps colourtarget space zonechangeverb
event_ps_blue ::= playerevent | playerevent | aoroneormore_ps optionallyqualified_permanent space becometargeted setTargetPermanent?##myPluralSuffix? | aoroneormore_ps optionallyqualified_permanent space bebounced | aoroneormore_ps optionallyqualified_artifact space zonechangeverb | "a " optionallyqualified_spell space becountered
event_ps_black ::= playerevent | playerevent | aoroneormore_ps optionallyqualified_creature space bedamaged setTargetCreature?##myPluralSuffix? | aoroneormore_ps optionallyqualified_creature space regenerateverb setTargetCreature?##myPluralSuffix? | aoroneormore_ps optionallyqualified_creature space gotograveyard
event_ps_red ::= playerevent | combatevent | aoroneormore_ps optionallyqualified_creature space bedamaged setTargetCreature?##myPluralSuffix? | aoroneormore_ps optionallyqualified_permanent space becometargeted setTargetPermanent?##myPluralSuffix? | aoroneormore_ps optionallyqualified_artifact space zonechangeverb | aoroneormore_ps optionallyqualified_land space zonechangeverb
event_ps_green ::= playerevent | playerevent | aoroneormore_ps optionallyqualified_creature space zonechangeverb | aoroneormore_ps optionallyqualified_creature space regenerateverb setTargetCreature?##myPluralSuffix? | aoroneormore_ps colourtarget space zonechangeverb | "a " <passiveSubject::=singular> optionallyqualified_spell space becountered
event_ps_artifact ::= playerevent | aoroneormore_ps colourtarget space zonechangeverb
// <passiveSubject::=singular> "a " qualifiedpermanent space permanentverb setTargetOnePermanent? | <passiveSubject::=singular> "a " qualifiedcreature space creatureverb setTargetOneCreature? | permspecifiedplayer{myPlr}{passiveSubject} space playerverb

aoroneormore_ps ::= "a " <passiveSubject::=singular> <myPluralSuffix?::=nothing> | "a " <passiveSubject::=singular> <myPluralSuffix?::=nothing> | "a " <passiveSubject::=singular> <myPluralSuffix?::=nothing> | "one or more " <passiveSubject::=s> <myPluralSuffix?::=s>

combatevent ::= "a " optionallyqualified_creature space combatverb setTargetOneCreature? | "one or more creatures " combatverb setTargetMultiCreatures?

playerevent ::= permspecifiedplayer{myPlr}{passiveSubject} space playerverb##myColour
playerverb_white ::= gainorloselife | playacolouralignedspell
playerverb_blue ::= drawacard | playacolouralignedspell
playerverb_black ::= loselife | discardacard | sacrificeacreatureorpermanent | playacolouralignedspell
playerverb_red ::= becometargeted | bedamaged | playacolouralignedspell
playerverb_green ::= tapaland | gainlife | playacolouralignedspell
playerverb_artifact ::= gainorloselife | bedamaged | drawacard | playacolouralignedspell

permanentverb ::= zonechangeverb | zonechangeverb | becometargeted | becomeadjective
enchantmentverb ::= zonechangeverb <thisStillInPlay?::=no> | zonechangeverb <thisStillInPlay?::=no> | becometargeted | becomeadjective
// enchantmentverb refers to the enchanted permanent: if it changes zone, the Aura will disappear
// replaceablepermanentverb ::= ...none
creatureverb ::= creatureverb##thisStillInPlay?
creatureverb_no ::= dealdamage | dealdamage | combatverb | bedamaged | unusualcreatureverb
creatureverb_yes ::= zonechangeverb | zonechangeverb | zonechangeverb | dealdamage | dealdamage | combatverb | bedamaged | unusualcreatureverb

set[StillInPlay zonechangeverb]? ::= <thisStillInPlay?::=no>
set[StillInPlay dealdamage]? ::= nothing
set[StillInPlay combatverb]? ::= nothing
set[StillInPlay bedamaged]? ::= nothing
set[StillInPlay unusualcreatureverb]? ::= nothing

replaceablecreatureverb ::= dealdamage | dealdamage | bedamaged | gotograveyard | unusualcreatureverb
playerverb ::= playaspell | playaland | drawacard | discardacard | gainorloselife | bedamaged | tapaland
landverb ::= betappedformana | betappedformana | zonechangeverb | becometargeted | becomeadjective
replaceableplayerverb ::= drawacard | gainorloselife | bedamaged
unusualcreatureverb ::= "regenerate" permanentverbsuffix##verbMood | "regenerate" permanentverbsuffix##verbMood | beverb##verbMood " turned face up" addmorphprefix##processingThis

zonechangeverb ::= commonzonechangeverb | commonzonechangeverb | commonzonechangeverb | commonzonechangeverb | commonzonechangeverb | rarezonechangeverb
commonzonechangeverb ::= comesintoplay##allowCIP | comesintoplay##allowCIP | "leave" permanentverbsuffix##verbMood " the battlefield" | gotograveyard
rarezonechangeverb ::= bebounced | beverb##verbMood " exiled"
comesintoplay_true ::= "enter" permanentverbsuffix##verbMood " the battlefield"
comesintoplay_false ::= commonzonechangeverb
gotograveyard ::= beverb##verbMood " put into a graveyard from the battlefield"
becometargeted ::= "become" permanentverbsuffix##verbMood " the target of a " qualifiedoneoffspellorability
becomeadjective ::= "become" permanentverbsuffix##verbMood space permanentadjective
regenerateverb ::= "regenerate" permanentverbsuffix##verbMood
bebounced ::= beverb##verbMood " returned to " itpossessive##myPluralSuffix? " owner's hand"
becountered ::= beverb##verbMood " countered"
dealdamage ::= "deal" permanentverbsuffix##verbMood space damageorcombatdamage " to a player" setTargetOnePlayer? | "deal" permanentverbsuffix##verbMood space damageorcombatdamage " to a creature" setTargetOneCreature? | "deal" permanentverbsuffix##verbMood space damageorcombatdamage
playaspell ::= "cast" playerverbsuffix##verbMood " a " qualifiedspell
playaland ::= "play" playerverbsuffix##verbMood " a land"
tapaland ::= "tap" playerverbsuffix##verbMood " a land for mana"
gainorloselife ::= gainlife | loselife
gainlife ::= "gain" playerverbsuffix##verbMood " life"
loselife ::= "lose" playerverbsuffix##verbMood " life"
bedamaged ::= beverb##verbMood " dealt damage"
betappedformana ::= beverb##verbMood " tapped for mana"
drawacard ::= "draw" playerverbsuffix##verbMood " a card"
discardacard ::= "discard" playerverbsuffix##verbMood " a card"
discardcard ::= "draw" playerverbsuffix##verbMood " a card"
combatverb ::= "block" permanentverbsuffix##verbMood | "block" permanentverbsuffix##verbMood " a creature" setTargetOneCreature? | "block" permanentverbsuffix##verbMood " one or more creatures" setTargetMultiCreatures? | "become" permanentverbsuffix##verbMood " blocked" | "become" permanentverbsuffix##verbMood " blocked by a creature" setTargetOneCreature? | "become" permanentverbsuffix##verbMood " blocked by one or more creatures" setTargetMultiCreatures?
sacrificeacreatureorpermanent ::= sacrificeacreature | sacrificeapermanent
sacrificeacreature ::= "sacrifice" playerverbsuffix##verbMood " a " optionallyqualified_creature
sacrificeapermanent ::= "sacrifice" playerverbsuffix##verbMood " a " optionallyqualified_permanent
playacolouralignedspell ::= "cast" playerverbsuffix##verbMood " a " colourtarget##myColour " spell"

specialtargetevent ::= <verbMood::=indicative> <passiveSubject::=myTargetPluralSuffix?> specialtargetevent##myTargetType?
specialtargetevent_ctr ::= "When " myTarget space creatureverb " this turn, "
specialtargetevent_nonctr ::= "When " myTarget space permanentverb " this turn, "
specialtargetevent_perm ::= "When " myTarget space permanentverb " this turn, "
specialtargetevent_plr ::= "When " myTarget space <playerVerbSuffix::=myTargetVerbSuffix?> playerverb " this turn, "



Player words



specificplayer ::= playeryou | playertgtopp
effectspecifiedplayer ::= playeryou | playeryou | playeryou | playereachplr | playertgtopp | playertgtplr
effectspecifiedsingleplayer ::= playeryou | playeryou | playertgtopp | playertgtplr
effectspecifiedsinglenontargetplayer ::= playeryou | playeryou | playeranopp
permspecifiedplayer ::= playeryou | playeryou | playeranopp
permunspecifiedplayer ::= playeryou | playeryou | playeranopp | playeranyplr
permspecifiedplayers ::= playeryou | playeryou | playereachplr | playereachopp
permspecifiedplayergroup ::= playeryou | playeranyplr | playerallplrs | playeryouropps
nonyouspecifiedplayer ::= playertgtopp | playeranopp | playeranyplr
nonyouspecifiedplayers ::= playertgtopp | playeranopp | playereachopp
notjustyouspecifiedplayers ::= playertgtopp | playereachopp | playereachplr

effectspecifiedplayer_false ::= effectspecifiedplayer
effectspecifiedplayer_true ::= playertgtopp setTargetOnePlayer? <targetting::=false> | playertgtplr setTargetOnePlayer? <targetting::=false>

playeryou ::= <playerVerbSuffix::=nothing> <playerSecondRef?::=you> "you"
playeranopp ::= <playerVerbSuffix::=s> <playerSecondRef?::=that_player> "an opponent"
playertgtopp ::= <playerVerbSuffix::=s> <playerSecondRef?::=that_player> "target opponent"
playeranyplr ::= <playerVerbSuffix::=s> <playerSecondRef?::=a_player> "any player"
playereachplr ::= <playerVerbSuffix::=s> <playerSecondRef?::=those_players> "each player"
playereachopp ::= <playerVerbSuffix::=s> <playerSecondRef?::=that_player> "each opponent"
playertgtplr ::= <playerVerbSuffix::=s> <playerSecondRef?::=that_player> "target player"
// these next two only appear in groups
playerallplrs ::= <playerVerbSuffix::=nothing> <playerSecondRef?::=they> "all players"
playeryouropps ::= <playerVerbSuffix::=nothing> <playerSecondRef?::=they> "your opponents"
that_player ::= that_player2
that_player2 ::= "that player"
those_players ::= those_players2
those_players2 ::= "those players"
a_player ::= "a player"

effectspecifiedsingleplayerpossessive ::= <myPlr::=effectspecifiedsingleplayer> newpossessive##myPlr
permspecifiedplayerpossessive ::= <myPlr::=permspecifiedplayer> newpossessive##myPlr
permspecifiedplayerspossessive ::= <myPlr::=permspecifiedplayers> newpossessive##myPlr

possessive_playeryou ::= "your"
possessive_playeranopp ::= "his or her"
possessive_playeranyplr ::= "his or her"
possessive_playereachplr ::= "his or her"
possessive_playereachopp ::= "his or her"
possessive_playertgtopp ::= "his or her"
possessive_playertgtplr ::= "his or her"
possessive_playeryouropps ::= "their"
possessive_playerallplrs ::= "their"
possessive_that_player2 ::= "his or her"
possessive_those_players2 ::= "their"
newpossessive_playeryou ::= playeryou "r"
newpossessive_playeranopp ::= playeranopp "'s"
newpossessive_playeranyplr ::= playeranyplr "'s"
newpossessive_playereachplr ::= playereachplr "'s"
newpossessive_playereachopp ::= playereachopp "'s"
newpossessive_playertgtopp ::= playertgtopp "'s"
newpossessive_playertgtplr ::= playertgtplr "'s"
newpossessive_playeryouropps ::= playeryouropps "'"
newpossessive_playerallplrs ::= playerallplrs "'"

// ** if I assigned possessive_playeryou to "your" (etc), would it evaluate the assignments contained in definition of playeryou etc?
// ** using a version that definitely will

doverb_playeryou ::= do
doverb_playeranopp ::= does
doverb_playeranyplr ::= does
doverb_playereachplr ::= does
doverb_playereachopp ::= does
doverb_playertgtopp ::= does
doverb_playertgtplr ::= does
doverb_playerallplrs ::= do
doverb_playeryouropps ::= do
doverb_that_player2 ::= does
doverb_those_players2 ::= do
haveverb_playeryou ::= have
haveverb_playeranopp ::= has
haveverb_playeranyplr ::= has
haveverb_playereachplr ::= has
haveverb_playereachopp ::= has
haveverb_playertgtopp ::= has
haveverb_playertgtplr ::= has
haveverb_playerallplrs ::= have
haveverb_playeryouropps ::= have
haveverb_that_player2 ::= has
haveverb_those_players2 ::= have

beverb_playeryou ::= are
beverb_playeranopp ::= is
beverb_playeranyplr ::= is
beverb_playereachplr ::= is
beverb_playereachopp ::= is
beverb_playertgtopp ::= is
beverb_playertgtplr ::= is
beverb_playerallplrs ::= are
beverb_playeryouropps ::= are
beverb_that_player2 ::= is
beverb_those_players2 ::= are

beverb_subjunctive ::= be
beverb_indicative ::= beverb##passiveSubject
beverb_singular ::= is
beverb_nothing2 ::= is
beverb_s ::= are


youornot_playeryou ::= you
youornot_playeranopp ::= notyou
youornot_playeranyplr ::= notyou
youornot_playereachplr ::= notyou
youornot_playereachopp ::= notyou
youornot_playertgtopp ::= notyou
youornot_playertgtplr ::= notyou
youornot_playerallplrs ::= notyou
youornot_playeryouropps ::= notyou

player[SecondRef you]? ::= you
player[SecondRef notyou]? ::= "he or she"
player[VerbSuffix you]? ::= nothing
player[VerbSuffix notyou]? ::= s


Power and Toughness



ptexpression ::= power | power | toughness | "both power and toughness" | "total power and toughness"
numericalptexpression ::= power | power | toughness | "total power and toughness"
powertoughness ::= integeronethroughfour{lastchosenP} slash lastchosenP | integeronethroughfour{lastchosenP} slash lastchosenP | integeronethroughfour slash integeronethroughfour

ptchange ::= chooseptnumbers ptchange##myColour
ptchange_white ::= +1/+1 | + ptnum2 slash + ptnum1 | +0 slash + ptnum1
ptchange_blue ::= - ptnum1 /-0
ptchange_black ::= - ptnum1 slash - ptnum2 | - ptnum2 slash - ptnum1 | - ptnum1 slash - ptnum1
ptchange_red ::= + ptnum1 slash +0 | + ptnum1 slash +0 | + ptnum1 slash +0 | + ptnum1 slash - ptnum1 | + ptnum1 slash - ptnum2
ptchange_green ::= + ptnum1 slash + ptnum2
ptchange_artifact ::= + ptnum1 slash + ptnum2 | + ptnum1 slash + ptnum2 | - ptnum1 slash + ptnum1

// YAY FOREACH - no more worrying about intervening Xvar overwrites, at least not in this section
chooseptnumbers ::= <ptnum1::=integeronethroughfour> pt2eqpt1 | <ptnum1::=integeronethroughfour> pt2eqpt1 | <ptnum1::=integeronethroughfour> <ptnum2::=integeronethroughfour> | <ptnum1::=dynamicinteger_noXphrase> pt2eqpt1
pt2eqpt1 ::= <ptnum2::=ptnum1>

numberedptchange ::= <tmp##param_discrete##that_many::=numberedptchangeproper> <tmp##that_many##that_many::=numberedptchangethatmany> tmp##param_discrete##that_many
// can say "sacrifice a creature. target creature gets +X/+X, where X is the sacrificed creature's power", but not "sacrifice any number of lands. target creature gets +X/+X, where X is that many". Must say "+1/+1 for each one". (Ideally would be "for each creature sacrificed this way" --or better yet "sacrifice X creatures, then do something with X"--, but...)

numberedptchangeproper ::= numberedptchangeproper##myColour <suffixes::=xisparamdiscrete>
xisparamdiscrete ::= ", where " Xvar " is " param_discrete
numberedptchangeproper_white ::= + nextvar##Xvar{Xvar} /+ Xvar | +0/+ nextvar##Xvar{Xvar}
numberedptchangeproper_blue ::= - nextvar##Xvar{Xvar} /-0
numberedptchangeproper_black ::= - nextvar##Xvar{Xvar} /- Xvar
numberedptchangeproper_red ::= + nextvar##Xvar{Xvar} /+0
numberedptchangeproper_green ::= + nextvar##Xvar{Xvar} /+ Xvar
numberedptchangeproper_artifact ::= + nextvar##Xvar{Xvar} /+ Xvar | +0/+ nextvar##Xvar{Xvar}

numberedptchangethatmany ::= smallptchange <suffixes::=space_foreachone>
space_foreachone = " for each one"
smallptchange ::= smallptchange##myColour
smallptchange_white ::= +1/+1 | +0/+1
smallptchange_blue ::= -1/-0
smallptchange_black ::= -1/-1
smallptchange_red ::= +1/+0 | +1/+0 | +1/+0 | +1/-1
smallptchange_green ::= +1/+1
smallptchange_artifact ::= +1/+1 | +1/+1 | +0/+1 | -1/+1

Miscellaneous



funword_white ::= destiny | money
funword_blue ::= time | leak
funword_black ::= doom | warp
funword_red ::= speed | improbability
funword_green ::= warp | speed
funword_artifact ::= time | leak

optionalpreventativeconditionprefix ::= nothing | nothing | nothing | nothing | nothing | nothing | nothing | nothing | nothing | nothing | nothing | nothing | "unless " nonyouspecifiedplayer space paysextracost ", "
optionalpreventativeconditionsuffix ::= nothing | nothing | nothing | nothing | " unless " nonyouspecifiedplayer space paysextracost
optionaldamagemodifier ::= nothing | nothing | nothing | ". "damagemodifier
damagemodifier ::= dmgmod_noprevent optionaldamagemodifier | dmgmod_noregen optionaldamagemodifier | dmgmod_rfg | dmgmod_steal
//redirecting damage isn't a concept the rules even support any longer
dmgmod_noprevent ::= "This damage can't be prevented"
dmgmod_noregen ::= "Creatures damaged this way can't be regenerated this turn"
dmgmod_rfg ::= "If a creature damaged this way would be put into a graveyard this turn, exile it instead"
dmgmod_steal ::= "When a creature damaged this way is put into a graveyard from the battlefield this turn, return it to the battlefield under your control"
duration ::= "until end of turn" | "until end of turn" | "until end of turn" | "until end of turn" | "until end of turn" | "(This effect doesn't end)"
showsuffixesandduration ::= " until end of turn" showsuffixes | " until end of turn" showsuffixes | " until end of turn" showsuffixes | " until end of turn" showsuffixes | " until end of turn" showsuffixes | showsuffixes " (This effect doesn't end)"
combatadjective ::= attacking | blocking | unblocked | "attacking or blocking"
handorplay ::= hand | "the battlefield"
instantorsorcery ::= instant | sorcery | "instant or sorcery"
creaturesorpermanents ::= creatures | permanents
damageorcombatdamage ::= damage | "combat damage"
artifactorenchantment ::= artifact myPluralSuffix? | enchantment myPluralSuffix? | artifact myPluralSuffix? " or enchantment" myPluralSuffix?
auraorequipment ::= Aura | Equipment
auraorequipment_white ::= Aura | Equipment
auraorequipment_blue ::= Aura | Equipment
auraorequipment_red ::= Equipment
auraorequipment_green ::= Aura
auraorequipment_artifact ::= Equipment
maybebasic ::= nothing | "basic "
maybenon ::= nothing | "non"
maybenapostrophet ::= nothing | "n't"
maybeinstead ::= nothing | insteadspace
insteadspace ::= "instead "
maybeyoumay ::= nothing | "you may "
spellandpermanentadjective ::= colourphrase | manacostphrase | controlphrasefromeffect
controlphrasefromeffect ::= effectspecifiedsinglenontargetplayer " control" playerVerbSuffix
maybecipt ::= nothing | nothing | cipt
cipt ::= "~this~ enters the battlefield tapped." newline

manacostphrase ::= "with converted mana cost " dynamicinteger inequality showsuffixes
modifiablephrase ::= "basic land type" | "colour word" | "creature type" | "coloured mana symbol"

conditiontext ::= "Threshold - If you have seven or more cards in your graveyard, " | "As long as " statecondition ", "
statecondition ::= commonstatecondition##mySrc | commonstatecondition##mySrc | unusualstatecondition
commonstatecondition_ctr ::= "~this~ is untapped" | "~this~ is attacking" | permunspecifiedplayer " control" playerVerbSuffix " a " noncontrolqualifiedpermanent
commonstatecondition_ench ::= permunspecifiedplayer " control" playerVerbSuffix " a " noncontrolqualifiedpermanent
commonstatecondition_art ::= "~this~ is untapped" | permunspecifiedplayer " control" playerVerbSuffix " a " noncontrolqualifiedpermanent
commonstatecondition_land ::= "~this~ is untapped" | permunspecifiedplayer " control" playerVerbSuffix " a " noncontrolqualifiedpermanent
commonstatecondition_unknown ::= permunspecifiedplayer " control" playerVerbSuffix " a " noncontrolqualifiedpermanent
unusualstatecondition ::= permunspecifiedplayer " control" playerVerbSuffix " no " noncontrolqualifiedpermanents | genericcounter " is " integeronethroughfour inequality
conceivablestatecondition ::= nothing | nothing | nothing | maybestatecondition
maybestatecondition ::= nothing | nothing | nothing | " as long as " statecondition

phaseorstep ::= "upkeep" | "upkeep" | "upkeep" | "upkeep" | "precombat main phase" | "end step" | "combat phase"
optionalspendrestriction ::= nothing | nothing | nothing | nothing | nothing | ". Spend this mana only on " qualifiedspellsorabilities "."
activatedability_s ::= "activated abilities" myAbilityMod?
activatedability_nothing2 ::= "activated ability"
spellorability_s ::= "spells and activated abilities" myAbilityMod?
spellorability_nothing2 ::= "spell or ability"
thatarentmana ::= " that aren't mana abilities"
targetifsingular_nothing2 ::= "target "
targetifsingular_s ::= nothing
aifsingular_nothing2 ::= "a "
aifsingular_s ::= nothing
itorthey_s ::= "they"
itorthey_nothing2 ::= "it"
itorthem_s ::= "them"
itorthem_nothing2 ::= "it"
itorthem_nothing ::= "it"
itpossessive_s ::= "their"
itpossessive_nothing2 ::= "its"
library_nothing2 ::= library
library_s ::= libraries
andoror_inclusive ::= and
andoror_exclusive ::= or
aorall ::= a | all
therest ::= "the rest"

unusualcreatureadjective ::= nothing | unusualcreatureadjmaybetoken##myTokenQual? | facedown | maybenon "legendary" | equipped | enchanted
permanentadjective ::= untapped | tapped | untapped | tapped | untapped | tapped | maybenon "legendary" | enchanted
unusualcreatureadjmaybetoken_used ::= unusualcreatureadjective
unusualcreatureadjmaybetoken_nothing2 ::= maybenon "token" <myTokenQual?::=used>

artifactness_ctr ::= nothing | nothing | nothing | spaceartifact
artifactness_ench ::= nothing | nothing | nothing | spaceartifact
artifactness_art ::= nothing | spaceartifact | spaceartifact | spaceartifact
artifactness_land ::= nothing | nothing | nothing | spaceartifact
artifactness_unknown ::= nothing | nothing | nothing | spaceartifact
spaceartifact ::= " artifact"

nextvar_nothing2 ::= X
nextvar_X ::= Y
nextvar_Y ::= Z
nextvar_Z ::= X
delayedXvar ::= Xvar
// nextvar_Xvar ::= nextvar##Xvar | nextvar##Xvar | nextvar##Xvar | nextvar##Xvar | Y{Xvar}

that_many ::= that_many2
that_many2 ::= "that many"
that_much ::= "that much"
that_creature ::= "that creature"
those_creatures ::= "those creatures"
that_permanent ::= "that permanent"
those_permanents ::= "those permanents"
thatattachee ::= "that " attachee

creaturecountertypeword ::= plus1plus1
creaturecountertype ::= "+1/+1 counter"
othercreaturecountertypeword ::= plus1plus1 | plus1plus1 | plus1plus1 | minus1minus1
othercreaturecountertype ::= othercreaturecountertypeword " counter"
landcountertypeword ::= storage | mining | depletion | charge
countertype_ctr ::= creaturecountertype
countertype_nonctr ::= genericcountertype
countertype_perm ::= creaturecountertype | genericcountertype
genericcountertype ::= "charge counter"
// | "charge counter" | "fade counter"
plus1plus1 ::= "+1/+1"
minus1minus1 ::= "-1/-1"
CARDNAME ::= "~this~"

newabilityline ::= toggleMyColour? abilitysplitter##myNestedness

abilitysplitter_true ::= quote " and " quote
abilitysplitter_false ::= newline

generateName ::= ntRandString?

Colours



selectMyPermColour? ::= selectSingleColour? | selectSingleColour? | selectSingleColour? | selectSingleColour? | selectSingleColour? | selectSingleColour? | selectArtifact | selectLand
selectMyOneOffColour? ::= selectSingleColour?

selectSingleColour? ::= <myColour::=justcolourword> <colourswap##myColour::=myColour> <myNumColours?::=1> <myColour_1::=myColour> <amicoloured_white::=false> <amicoloured_blue::=false> <amicoloured_black::=false> <amicoloured_red::=false> <amicoloured_green::=false> <amicoloured##myColour::=true>
selectArtifact ::= <myColour::=artifact> <amicoloured_white::=false> <amicoloured_blue::=false> <amicoloured_black::=false> <amicoloured_red::=false> <amicoloured_green::=false> <colourswap##myColour::=myColour> <myNumColours?::=0>
selectLand ::= <permcategory::=land> selectSingleColour? | <permcategory::=land> selectSingleColour? | <permcategory::=land> selectArtifact

// When adding an extra colour, maintain the circular linked list of colourswap_colour(N) = colour(N+1)
addExtraColour? ::= <tmp##myNumColours?::=add[ExtraColour yes]?> <tmp_5::=nothing> tmp##myNumColours?
add[ExtraColour yes]? ::= <prevNumColours?::=myNumColours?> <myNumColours?::=succ##myNumColours?> findNewUnusedColour? <myColour##myNumColours?::=newColour> <prevColour::=myColour> <nextColour::=colourswap##prevColour> <colourswap##newColour::=colourswap##prevColour> <colourswap##prevColour::=newColour> <amicoloured##newColour::=true> <myColour::=newColour>

findNewUnusedColour? ::= <newColour::=justcolourword> <amithiscolour::=amicoloured##newColour> findNewUnusedColour?##amithiscolour
find[NewUnusedColour false]? ::= nothing
find[NewUnusedColour true]? ::= findNewUnusedColour?

showMyColour? ::= showMyColour?##myNumColours?
show[MyColour 0]? ::= myColour
show[MyColour 1]? ::= myColour_1
show[MyColour 2]? ::= myColour_1 " and " myColour_2
show[MyColour 3]? ::= myColour_1 ", " myColour_2 " and " myColour_3
show[MyColour 4]? ::= myColour_1 ", " myColour_2 ", " myColour_3 " and " myColour_4
show[MyColour 5]? ::= "white, blue, black, red and green"

toggleMyColour? ::= <myColour::=colourswap##myColour> <tmp##myColour::=conceivablyAddExtraColour?> <tmp_land::=nothing> <tmp_artifact::=nothing> tmp##myColour
maybeToggleMyColour? ::= toggleMyColour? | nothing
conceivablyAddExtraColour? ::= nothing | nothing | nothing | maybeAddExtraColour?
maybeAddExtraColour? ::= nothing | nothing | nothing | addExtraColour?


colourphrase ::= colourword | colourword | colourword | colourword | colourword | "non" colourword
colourword ::= white | blue | black | red | green | white | blue | black | red | green | multicoloured | colourless
justcolourword ::= white | blue | black | red | green

maybecolourphrase ::= nothing | nothing | singlecolourphrase
maybedefinitecolourphrase ::= nothing | nothing | definitecolourphrase

newcolour ::= white | blue | black | red | green | white | blue | black | red | green | justcolourword " and " justcolourword | colourless
singlecolourphrase ::= white | blue | black | red | green | white | blue | black | red | green | colourless | "the colour of your choice"
definitecolourphrase ::= white | blue | black | red | green | white | blue | black | red | green | colourless

// colourtargets used for zone-change triggers or play-a-foo triggers
colourtarget ::= colourtarget##myColour myPluralSuffix?
colourtarget_white ::= enchantment | artifact | auraorequipment | "white creature" | choosesinglecommoncreaturetype_white
colourtarget_blue ::= instant | instant | instantorsorcery | "blue creature" | choosesinglecommoncreaturetype_blue
colourtarget_black ::= creature | "black creature" | choosesinglecommoncreaturetype_black
colourtarget_red ::= artifact | land | "red creature" | choosesinglecommoncreaturetype_red
colourtarget_green ::= enchantment | land | creature | "green creature" | choosesinglecommoncreaturetype_green
colourtarget_artifact ::= artifact | artifact | Equipment | creature | "artifact creature" | choosesinglecommoncreaturetype_artifact

manasymbol ::= W | U | B | R | G
manasuccessor_W ::= U
manasuccessor_U ::= B
manasuccessor_B ::= R
manasuccessor_R ::= G
manasuccessor_G ::= W
manapredecessor_W ::= G
manapredecessor_U ::= W
manapredecessor_B ::= U
manapredecessor_R ::= B
manapredecessor_G ::= R
manasymbol_white ::= W
manasymbol_blue ::= U
manasymbol_black ::= B
manasymbol_red ::= R
manasymbol_green ::= G
manasymbol_artifact ::= W | U | B | R | G
hybridsymbol_white_1 ::= "(G/W)"
hybridsymbol_white_2 ::= "(W/U)"
hybridsymbol_white_3 ::= "(G/U)"
hybridsymbol_blue_1 ::= "(W/U)"
hybridsymbol_blue_2 ::= "(U/B)"
hybridsymbol_blue_3 ::= "(W/B)"
hybridsymbol_black_1 ::= "(U/B)"
hybridsymbol_black_2 ::= "(B/R)"
hybridsymbol_black_3 ::= "(U/R)"
hybridsymbol_red_1 ::= "(B/R)"
hybridsymbol_red_2 ::= "(R/G)"
hybridsymbol_red_3 ::= "(B/G)"
hybridsymbol_green_1 ::= "(R/G)"
hybridsymbol_green_2 ::= "(G/W)"
hybridsymbol_green_3 ::= "(R/W)"
hybridsymbol_artifact_1 ::= "(W/U)" | "(U/B)" | "(B/R)" | "(R/G)" | "(G/W)"
hybridsymbol_artifact_2 ::= "(W/U)" | "(U/B)" | "(B/R)" | "(R/G)" | "(G/W)"
hybridsymbol_artifact_3 ::= "(W/B)" | "(U/R)" | "(B/G)" | "(R/W)" | "(G/U)"


Numbers



genericcounter ::= genericsmallcounter | genericsmallcounter | genericlargecounter
genericsmallcounter ::= "the number of cards in " permspecifiedplayerpossessive " hand" | "the number of " qualifiedspells " cast this turn" | "the number of basic land types among lands " permspecifiedplayer " control" playerVerbSuffix | "the number of " countableproperty " among " myCardType? space permspecifiedplayer " control" playerVerbSuffix showsuffixes | "the number of poison counters " permspecifiedplayer{myPlr} space haveverb##myPlr | "the amount of " maybedefinitecolourphrase " mana in " permspecifiedplayerpossessive " mana pool"
genericlargecounter ::= "the number of " qualifiedpermanents " on the battlefield" | "the number of " optionallyqualifiedcreatures " on the battlefield" | permspecifiedplayerpossessive " life total" | "the number of " noncontrolqualifiedpermanents space permspecifiedplayer " control" playerVerbSuffix
countableproperty ::= "basic land types" <myCardType?::=lands> | "colours" <myCardType?::=creaturesorpermanents> | "card types" <myCardType?::=permanents> <suffixes::=reminder_permtypes>

genericforeachcounter ::= smallforeachcounter | smallforeachcounter | largeforeachcounter
smallforeachcounter ::= " for each card in " permspecifiedplayerpossessive " hand" | " for each card in " permspecifiedplayerpossessive " graveyard" | " for each " qualifiedspell " cast this turn" | " for each basic land type among lands " permspecifiedplayer " control" playerVerbSuffix | " for each " countableforeachproperty " among " myCardType? space permspecifiedplayer " control" playerVerbSuffix showsuffixes | " for each poison counter " permspecifiedplayer{myPlr} space haveverb##myPlr
largeforeachcounter ::= " for each " qualifiedpermanent " on the battlefield" | " for each " optionallyqualified_creature " on the battlefield" | " for each " noncontrolqualifiedpermanent space permspecifiedplayer " control" playerVerbSuffix
countableforeachproperty ::= "basic land type" <myCardType?::=lands> | "colour" <myCardType?::=creaturesorpermanents> | "card type" <myCardType?::=permanents> <suffixes::=reminder_permtypes>
reminder_permtypes ::= " (The card types are artifact, creature, enchantment, instant, land, planeswalker, sorcery and tribal)"

// could rework the lastDynamicInt? to use deep assign if we could be bothered
dynamicinteger ::= integeronethroughfour{lastDynamicInt?} | integeronethroughseven{lastDynamicInt?} | integeronethroughfour{lastDynamicInt?} | integeronethroughseven{lastDynamicInt?} | useXvariable
dynamicinteger_noXphrase ::= integeronethroughfour{lastDynamicInt?} | integeronethroughseven{lastDynamicInt?} | integeronethroughfour{lastDynamicInt?} | integeronethroughseven{lastDynamicInt?} | 1{lastDynamicInt?} <suffixes::=genericforeachcounter>

useXvariable ::= usenewx | maybeoldx
usenewx ::= nextvar##Xvar{Xvar}{lastDynamicInt?} <suffixes::=Xdefinition>
usenewunqualifiedx ::= nextvar##Xvar{Xvar}{lastDynamicInt?} <suffixes::=nothing>
maybeoldx ::= <tmp##Xvar::=useoldx> <tmp##nothing2::=usenewx> tmp##Xvar
useoldx ::= Xvar{lastDynamicInt?}
smalldynamicinteger ::= integeronethroughfour{lastDynamicInt?} | tinyinteger{lastDynamicInt?} | integeronethroughfour{lastDynamicInt?} | tinyinteger{lastDynamicInt?} | nextvar##Xvar{Xvar}{lastDynamicInt?} <suffixes::=Xdefinitionsmall>
smalldynamicinteger_noXphrase ::= integeronethroughfour{lastDynamicInt?} | tinyinteger{lastDynamicInt?} | integeronethroughfour{lastDynamicInt?} | tinyinteger{lastDynamicInt?} | 1{lastDynamicInt?} <suffixes::=smallforeachcounter>


Xdefinition ::= ", where " Xvar " is " genericcounter
Xdefinitionsmall ::= ", where " Xvar " is " genericsmallcounter
inequality ::= " or less" | " or less" | " or less" | " or more" | " or more" | " or more" | nothing

tinyinteger ::= 1 | 1 | 2 | 2 | 3
integeronethroughfour ::= 1 | 2 | 3 | 4
integertwothroughfive ::= 2 | 3 | 4 | 5
integerthreethroughsix ::= 3 | 4 | 5 | 6
integeronethroughseven ::= 1 | 2 | 3 | 4 | 5 | 6 | 7
zeroortinyinteger ::= 0 | 1 | 1 | 2 | 2 | 3
integerzerothroughfour ::= 0 | 1 | 2 | 3 | 4
integerzerothroughseven ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7

word_1 ::= "one"
word_2 ::= "two"
word_3 ::= "three"
word_4 ::= "four"
word_5 ::= "five"
word_6 ::= "six"
word_7 ::= "seven"
word_X ::= "X"
word_Y ::= "Y"
word_Z ::= "Z"
ind_word_1 ::= "a"
ind_word_2 ::= "two"
ind_word_3 ::= "three"
ind_word_4 ::= "four"
ind_word_5 ::= "five"
ind_word_6 ::= "six"
ind_word_7 ::= "seven"
ind_word_X ::= "X"
ind_word_Y ::= "Y"
ind_word_Z ::= "Z"

pluralsuffix_0 ::= s
pluralsuffix_zero ::= s
pluralsuffix_1 ::= nothing
pluralsuffix_one ::= nothing
pluralsuffix_2 ::= s
pluralsuffix_two ::= s
pluralsuffix_3 ::= s
pluralsuffix_three ::= s
pluralsuffix_4 ::= s
pluralsuffix_four ::= s
pluralsuffix_5 ::= s
pluralsuffix_five ::= s
pluralsuffix_6 ::= s
pluralsuffix_six ::= s
pluralsuffix_7 ::= s
pluralsuffix_seven ::= s
pluralsuffix_X ::= s
pluralsuffix_Y ::= s
pluralsuffix_Z ::= s
pluralsuffix_a ::= nothing
pluralsuffix_all ::= s

inanyorder_0 ::= nothing
inanyorder_1 ::= nothing
inanyorder_2 ::= " in any order"
inanyorder_3 ::= " in any order"
inanyorder_4 ::= " in any order"
inanyorder_5 ::= " in any order"
inanyorder_6 ::= " in any order"
inanyorder_7 ::= " in any order"
inanyorder_X ::= " in any order"
inanyorder_Y ::= " in any order"
inanyorder_Z ::= " in any order"

nextcardinal_nothing2 ::= first
nextcardinal_first ::= second
nextcardinal_second ::= third
nextcardinal_third ::= fourth
nextcardinal_fourth ::= fifth

Stacks


// Golden rule of stacks in this generator: push commands are store-then-push; pop commands are pop-then-read

initstacks ::= <stacklevel::=u>
push ::= <prevlevel##1##stacklevel::=stacklevel> <stacklevel::=1##stacklevel>
pop ::= <stacklevel::=prevlevel##stacklevel>

pushAllFlags? ::= pushparams pushAllowCIP? pushplayer <stack##stacklevel::=mySpd> push <stack##stacklevel::=myPluralSuffix?> <myPluralSuffix?::=nothing> push
popAllFlags? ::= pop <myPluralSuffix?::=stack##stacklevel> pop <mySpd::=stack##stacklevel> popplayer popAllowCIP? popparams

// The type, player, counter and creaturetype stacks don't blank the value of myType / myCounter / myCtrType? when pushed

pushMyType? ::= <stack##stacklevel::=myType> push
popMyType? ::= pop <myType::=stack##stacklevel>

pushplayer ::= <stack##stacklevel::=myPlr> push <stack##stacklevel::=playerSecondRef?> push <stack##stacklevel::=playerVerbSuffix> push
popplayer ::= pop <playerVerbSuffix::=stack##stacklevel> pop <playerSecondRef?::=stack##stacklevel> pop <myPlr::=stack##stacklevel>

pushcounter ::= <stack##stacklevel::=myCounter> push
popcounter ::= pop <myCounter::=stack##stacklevel>

pushCtrType? ::= <stack##stacklevel::=myCtrType?> push
popCtrType? ::= pop <myCtrType?::=stack##stacklevel>

// The suffixes stack blanks the current "suffixes" after pushing it

showsuffixes ::= <copysuffixes::=suffixes> <suffixes::=nothing> copysuffixes
pushsuffixes ::= <stack##stacklevel::=suffixes> <suffixes::=nothing> push
popsuffixes ::= pop <suffixes::=stack##stacklevel>
popshowsuffixes ::= popsuffixes showsuffixes

// The params stack blanks the current params after pushing them

pushparams ::= <stack##stacklevel::=myTarget> <myTarget::=nothing> push <stack##stacklevel::=param_discrete> <param_discrete::=nothing> push <stack##stacklevel::=param_continuous> <param_continuous::=nothing> push <stack##stacklevel::=param_colour> <param_colour::=nothing> push <stack##stacklevel::=param_creature> <param_creature::=nothing> push <stack##stacklevel::=param_spell> <param_spell::=nothing> push

popparams ::= pop <param_spell::=stack##stacklevel> pop <param_creature::=stack##stacklevel> pop <param_colour::=stack##stacklevel> pop <param_continuous::=stack##stacklevel> pop <param_discrete::=stack##stacklevel> pop <myTarget::=stack##stacklevel>

// The allowCIP and colour stacks force a specified value when pushed

pushNoAllowCIP? ::= <stack##stacklevel::=allowCIP> <allowCIP::=false> push
pushAllowCIP? ::= <stack##stacklevel::=allowCIP> <allowCIP::=true> push
popAllowCIP? ::= pop <allowCIP::=stack##stacklevel>

pushForceColour? ::= <stack##stacklevel::=myColour> push <tmp##myColour::=nothing> <tmp##artifact::=choosenewcolour> tmp##myColour
popColour ::= pop <myColour::=stack##stacklevel>

Verb Suffixes



permanentverbsuffix_subjunctive ::= nothing
permanentverbsuffix_indicative ::= s
playerverbsuffix_subjunctive ::= nothing
playerverbsuffix_indicative ::= playerVerbSuffix

// one permanent shareS; two permanentS share
verbsuffix_nothing2 ::= s
verbsuffix_s ::= nothing

Card Prefixes and Suffixes



addequipcostprefixandequipmenttype ::= <typespecificprefix::=equipcostnewline> <subtype1::=equipmentsubtype>
addenchantabilityprefixandauratype ::= <typespecificprefix::=enchantabilitynewline> <subtype1::=aurasubtype>
addkickercostprefix ::= <cardprefixes##prefixnum::=kickercostnewline> nextprefixnum notekickercost
notekickercost ::= <nextkickercost::=nextcardinal##nextkickercost>
addflippedformsuffix ::= <flippedformsuffix::=flippedform>
addmorphprefix_false ::= nothing
addmorphprefix_true ::= addmorphprefix##morphprefixused
addmorphprefix_used ::= nothing
addmorphprefix_nothing2 ::= <cardprefixes##prefixnum::=morphcostnewline> <morphprefixused::=used> nextprefixnum

nextprefixnum ::= <prefixnum::=succ##prefixnum>
cardprefixes ::= typespecificprefix cardprefixes_1 cardprefixes_2
cardsuffixes ::= flippedformsuffix
enchantabilitynewline ::= enchantability newline
equipcostnewline ::= equipcost newline
morphcostnewline ::= morphcost newline
kickercostnewline ::= kickercost newline

flippedform ::= resetcardprefixesandsuffixes newline "- - - - -" newline rarelynewpermtype <forcelegend::=yes> <allowCIP::=false> showtype <myFlip::=yes> <myAbilityContext?::=grantable> <<myText::=cardabilities>> cardprefixes myText <myFlip::=no> <myAbilityContext?::=specific>
rarelynewpermtype ::= nothing | nothing | nothing | nothing | nothing | choosenewpermanenttype_normal

resetcardprefixesandsuffixes ::= <cardprefixes_1::=nothing> <cardprefixes_2::=nothing> <typespecificprefix::=nothing> <flippedformsuffix::=nothing> <morphprefixused::=nothing> <prefixnum::=1>


Flags



definitiontest ::= <_dt##dt_valuetotest::=dt_defined> <_dt##nothing::=dt_undefined> _dt##dt_valuetotest

initflagsperm ::= initflags selectMyPermCategory? selectMyPermColour? selectMyCreatureType? initdeepflags
selectMyPermCategory? ::= selectNormalPermCategory? | selectNormalPermCategory? | selectNormalPermCategory? | selectNormalPermCategory? | maybeSelectPlaneswalker?
maybeSelectPlaneswalker? ::= selectNormalPermCategory? | selectNormalPermCategory? | selectNormalPermCategory? | selectNormalPermCategory? | selectPlaneswalker
selectNormalPermCategory? ::= <permcategory::=normal>
selectPlaneswalker ::= <permcategory::=planeswalker>
initflagsoneoff ::= initflags selectNormalPermCategory? selectMyOneOffColour? selectMyCreatureType?
initflags ::= <suffixes::=nothing> <myManaQual?::=nothing> <nextkickercost::=nothing> <myPluralSuffix?::=nothing> <cipcountersourceused::=no> <forcelegend::=no> <forcetribal::=no> <processingThis::=false> <subtype1::=nothing> <imprintcategory::=chooseimprintcategory> <myqualifiedpermanent::=newqualifiedpermanent> <myqualifiedcreature::=newqualifiedcreature> <myNestedness::=false> <myPutCards?::=nothing> <myAbilityMod?::=nothing> <myFlip::=no> resetcardprefixesandsuffixes resetflags initstacks
initdeepflags ::= <enchanttypegeneral::=permanentorpermtype> <<enchanttypespecific::=optionallyqualified##enchanttypegeneral>>
resetflags ::= resetcostflags <myControlFlag?::=nothing> <tapStatus::=nothing> <legendaryStatus::=nothing> <param_discrete::=nothing> <param_continuous::=nothing> <param_spell::=nothing> <param_colour::=nothing> <param_creature::=nothing> <Xvar::=nothing> <myTargetPluralSuffix?::=nothing> <mySpellPluralSuffix?::=nothing> <myCombatAdjective?::=nothing> <myColourAdjective?::=nothing> <myPTFlag::=nothing> <mySpd::=inst> <targetting::=false> <myAbilityContext?::=specific> <myTokenQual?::=nothing> <qualifiedLandAllowed?::=true> resetallowCIP##forcelegend
resetcostflags ::= <tapCostUsed?::=nothing> <sacCostUsed?::=nothing> <thisStillInPlay?::=yes> <playerPaying::=you>
resetpwflags ::= resetflags <mySpd::=sorc>
resetallowCIP_no ::= <allowCIP::=true>
resetallowCIP_yes ::= nothing
// variables not needing resetting:
// always defined before use: myType, mySrc, myPlr, M, N, PM, myTokenType?, myTokenNumber?, myAbility, tmp, lastDynamicInt?, lastZone, and others
// always blanked after use: suffixes, myManaQual?, myPluralSuffix?, myNestedness
// desired continuous: myCtrType?, myColour, myGold, colour1, colour2, nextkickercost, myqualifiedpermanent, myqualifiedcreature, morphprefixused

Punctuation



colon ::= ":"
slash ::= "/"
plusorminus ::= "+" | "-"
newline ::= "
"
nothing ::= nothing2
nothing2 ::= ""
space ::= " "
quote ::= "''"
hr ::= "<hr>"
option ::= spaces = 0

Concepts Not Being Used


Definitely not being used due to being too obscure or swingy: (The output here is better if it's built from reasonably frequent Magic concepts. In general an effect has to have been on at least ten cards, preferably rather more.)
Referring to cards from a particular expansion (a la MTG: Apocalypse Chime). Indestructability. Instant win/lose effects. Turn-control (MTG: Mindslaver) or mulligan (MTG: Serum Powder) effects. Dividing cards into piles. Taking extra turns. Subgames.
Modal activated abilities (MTG: Atalya, Samite Master, MTG: Ulasht, the Hate Seed) or triggered abilities (MTG: Putrid Warrior, MTG: Orzhov Pontiff). Colour bleed spells (MTG: Vigor Mortis).

To Do


Known bugs I'm likely to fix:
I don't have too much of a problem with that. I'd treat it like MTG: Copy Enchantment: an enchantment already in play suddenly discovering it needs to enchant something. That came up in [my current game on the CMC forums]. The card-global variable enchanttype means that it can't switch what it enchants. --AC
OK, technically under the rules this doesn't work. But I suggest we play it as if it does work, until I fix it. --AC

Known bugs I may not fix:

A wise question. I think my answer is no, it's not a bug, because it's pretty much WorkingAsIntended. The cards are just more fun when they're more complex. However, I agree the eight-ability mammoths are fairly unwieldy, and so I've edited it to make them more unlikely. --AC
Are they 'just more fun'?  Let's take random (how else) example from the generator:
Creature - Sliver (3/2, blue)
U: target Wizard gains All green creatures gain ~this~ comes into play with 2 +1/+1 counters on it
~this~ comes into play with 2 +1/+1 counters on it
Discard a card, T: put a +1/+1 counter on ~this~
~this~ comes into play with 2 +1/+1 counters on it
UU: put a +1/+1 counter on ~this~
Remove a +1/+1 counter from ~this~: any number of target Dragons gain All Slivers become a Slivers until end of turn
T, Pay 2 life, remove 4 +1/+1 counters from ~this~: two target Elves get -X/-0, where X is the number of permanents in play (This effect doesn't end at end of turn)
U, remove 1 +1/+1 counter from ~this~: put 1 1/1 colourless Sliver creature token with trample into play
Remove a +1/+1 counter from ~this~: attach target Equipment to target creature. (Control of that Equipment doesn't change.) until end of turn
All creatures with toughness less than or equal to 2 can't be blocked
Is this any fun to play?  Or are you going to be spending your entire time with the creature thinking 'hang on - what does it do again?'.  And given that you're only going to be using the strongest ability or two, what's the point in the extra ones?  Speaking personally, if I want lots of abilities, I'd prefer them to be spread over a number of cards; it's easier to understand, and feels more creative to combo them that way.  --Angoel
Hopefully when those abilities do come up now, they'll at least be easier to comprehend.

I guess people's opinions of fun differ. Like I say, I have edited it so that that kind of thing should be less common... but personally? I say, yes, that's absolutely a blast to play! A huge chunk of the fun of Magic for me comes from figuring out the complex interactions between many different effects. The only irritating thing about that example is that it's too strong to get a +1/+1 counter for UU. But apart from that, it's great fun! To always bear in mind that cards in your hand can turn into +1/+1 counters which can in turn become Sliver tokens, Equipment movement or Elf shrinkages... If you add something else that lets you sacrifice Wizards to draw cards, something that lets you change the creature type of red creatures and something that makes all Slivers red, for example, then you've got an engine... if you spot it! Which is what makes /TypeFourGenerated so much fun. Your point about having them spread out is a fair one, and is why I have made the edit I just mentioned; I'm trying to achieve a balance between keeping the cards interesting and making them a manageable size. That's my opinion, anyway; I'd be curious what others think. --AC
I'm a bit of a halfway point, I think. The cards that just have 1 line of text always strike me a little disappointing - especially when (as in my most recent game with Snapdragon) you get a reprint of an existing card! On the other hand, while the odd leviathian of rules is fun, too many do get very confusing. It's possible that Alex's change will get the right balance now - I think we need more Playtesting! (But I'm on holiday, and hence unlikely to wiki much, from Friday until 3rd Jan). --CH
Reprints of existing cards can be quite fun. For example, it's perfectly possible for the Generator to create MTG: Mind's Eye, MTG: Loxodon Warhammer, MTG: Dimir Infiltrator, MTG: Kokusho, the Evening Star, and any number of other funky cards. But things like MTG: Wind Drake will be an order of magnitude or two more common, of course... which, to be fair, is the way Limited should be. One possibility could be that I further reduce the average number of lines on a card, but make /TypeFourGenerated involve generating-and-playing two cards per turn. --AC

I've been thinking about taking out the effects that say "target creature gains big long potentially multi-line ability". They've caused two different bugs today and others in the past, they're often confusing, and they're some of the biggest culprits of the excessive bloat that Angoel objected to. I'd leave in the ability to grant flying, first strike and so on, but only keyword abilities. On the other hand, the bigger ones are silly and great fun on occasion. What do people think? --AC
I've never played with them, but from the perspective of clicking refresh and seeing what's interesting, I'd rather see "All lands gain 'All Slivers gain 'whenever....' until end of turn'" than "All elves gain flying". But then, I've never had to really consider the gameplay implications seriously. --Edwin
Tough call. It can get quite confusing - but it can be in a good way. It does make bugs more likely - but I think my stack should help sort that. As a gut feeling, it might work best if there was some way of limiting granted abilities to be one-deep only (so a card with "All lands gain 'huge-long-multiline-ability'" is fair game, but we wouldn't get "All lands gain 'All slivers gain 'whenever an artifact leaves play, target beast gains '...'''"). Not sure how hairy that would be to implement. --CH

Possibly to be implemented:
They've both been considered. Dredge was rejected for power concerns in /TypeFourGenerated and other Limited settings. When you have an infinite library, it's too strong. Radiance is a bit fiddly, especially as it [applies wider than just creatures], and it would have to involve retroactively applying a prefix once the qualifiedtarget was chosen. Plus many effects won't work on multiple creatures ("Attach target Aura to target creature and each other creature that shares a colour with it"?). So it's not accidental that those two don't exist. Radiance is just about possible; Dredge I'd need quite some convincing to put in. --AC
Valid points. Radiance could, presumably, be added without the keyword, but no urgency. Dredge could probably be put back if the MCG was ever used for non-Type 4 purposes again, but I agree that it should sit on the sidelines for now. --CH

I've noticed that the /TypeFourCreatureGenerator has been generating things other than creatures. Is this a bug that's been introduced recently?
Ooh. Yes, that's yet more fallout from me introducing a third "category" of permanent types (lands, creatures/artifacts/enchantments, and now planeswalkers). Now fixed - thanks! --AC
Enchantment generator seems to be broken similarly, and any chance of getting an instant generator? Also, there have been a number of occasions where it seems to have dropped the card entirely...is this just a server load problem?
If what you're seeing is just "(...)", then that means the generation has taken too many steps, usually indicating an infinite loop. I'd guess Alex would quite like seeds for debugging if you see that. --CH
Never mind, I figured that out.  The problem was I was issuing "!gen" in IRC and sometimes absolutely no output, not even (...), was being relayed, but it turns out that was just a bug I had introduced that broke the response-dividing in case of a card that went beyond 400 characters.  It's no longer a problem.


CategoryGenerator

ec2-3-138-138-144.us-east-2.compute.amazonaws.com | ToothyWiki | AlexChurchill | RecentChanges | Login | Webcomic
This page is read-only | View other revisions | Recently used referrers
Last edited November 22, 2020 9:29 pm (viewing revision 452, which is the newest) (diff)
Search: