diff --git a/data/magic.mse-game/add_cards_scripts b/data/magic.mse-game/add_cards_scripts
index df6e7114..4ef298ee 100644
--- a/data/magic.mse-game/add_cards_scripts
+++ b/data/magic.mse-game/add_cards_scripts
@@ -60,34 +60,31 @@ add cards script:
description: Adds a rare card of each color to the set
script:
[ new_card([casting_cost: "W", rarity: "rare"]) , new_card([casting_cost: "U", rarity: "rare"]) , new_card([casting_cost: "B", rarity: "rare"]) , new_card([casting_cost: "R", rarity: "rare"]) , new_card([casting_cost: "G", rarity: "rare"]) ]
-
add cards script:
- name: &Cube
- description: Custom list of cube cards
- script:
- [
- new_card([ name: "Thousand-Faced Shadow", super_type: "Creature", sub_type: "Human Ninja", rule_text: "Ninjutsu [2][U][U] ([2][U][U], Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nFlying\nWhen Thousand-Faced Shadow enters the battlefield from your hand, if it's attacking, create a token that's a copy of another target attacking creature. The token enters the battlefield tapped and attacking.", casting_cost: "U", power: "1", toughness: "1", illustrator: "Ekaterina Burmak", card_color: "blue", rarity: "mythic rare"])
- , new_card([ name: "Sea Gate Stormcaller", super_type: "Creature", sub_type: "Human Wizard", rule_text: "Kicker [4][U]\nWhen Sea Gate Stormcaller enters the battlefield, copy the next instant or sorcery spell with mana value 2 or less you cast this turn when you cast it. If Sea Gate Stormcaller was kicked, copy that spell twice instead. You may choose new targets for the copies.", casting_cost: "1U", power: "2", toughness: "1", illustrator: "Anna Steinbauer", card_color: "blue", rarity: "mythic rare"])
- , new_card([ name: "Thieving Skydiver", super_type: "Creature", sub_type: "Merfolk Rogue", rule_text: "Kicker [X]. X can't be 0. (You may pay an additional [X] as you cast this spell.)\nFlying\nWhen Thieving Skydiver enters the battlefield, if it was kicked, gain control of target artifact with mana value X or less. If that artifact is an Equipment, attach it to Thieving Skydiver.", casting_cost: "1U", power: "2", toughness: "1", illustrator: "Kieran Yanner", card_color: "blue", rarity: "mythic rare"])
- , new_card([ name: "Watcher for Tomorrow", super_type: "Creature", sub_type: "Human Wizard", rule_text: "Hideaway 4 (When this creature enters the battlefield, look at the top four cards of your library, exile one face down, then put the rest on the bottom in a random order.)\nWatcher for Tomorrow enters the battlefield tapped.\nWhen Watcher for Tomorrow leaves the battlefield, put the exiled card into its owner's hand.", casting_cost: "1U", power: "2", toughness: "1", illustrator: "Tommy Arnold", card_color: "blue", rarity: "mythic rare"])
- , new_card([ name: "Snap", super_type: "Instant", rule_text: "Return target creature to its owner's hand. Untap up to two lands.", flavor_text: "Good riddance.", casting_cost: "1U", illustrator: "Mike Raabe", card_color: "blue", rarity: "mythic rare"])
- , new_card([ name: "Thopter Foundry", super_type: "Artifact", rule_text: "[1], Sacrifice a nontoken artifact: Create a 1/1 blue Thopter artifact creature token with flying. You gain 1 life.", flavor_text: "\"Etherium is limited. Innovation is not.\"\n—Tezzeret", casting_cost: "W/BU", illustrator: "Ralph Horsley", card_color: "black, blue, white", rarity: "mythic rare"])
- , new_card([ name: "Sword of the Meek", super_type: "Artifact", sub_type: "Equipment", rule_text: "Equipped creature gets +1/+2.\nEquip [2]\nWhenever a 1/1 creature enters the battlefield under your control, you may return Sword of the Meek from your graveyard to the battlefield, then attach it to that creature.", casting_cost: "2", illustrator: "Franz Vohwinkel", rarity: "mythic rare"])
- , new_card([ name: "Infernal Grasp", super_type: "Instant", rule_text: "Destroy target creature. You lose 2 life.", flavor_text: "Ancient evils dwell within the burning chasm called the Ashmouth, ever ready to devour those foolish enough to travel alone.", casting_cost: "1B", illustrator: "Naomi Baker", card_color: "black", rarity: "mythic rare"])
- , new_card([ name: "Dualcaster Mage", super_type: "Creature", sub_type: "Human Wizard", rule_text: "Flash\nWhen Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy.", flavor_text: "\"It has been my experience that disasters like to strike in pairs.\"", casting_cost: "1RR", power: "2", toughness: "2", illustrator: "Matt Stewart", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Burst Lightning", super_type: "Instant", rule_text: "Kicker [4] (You may pay an additional [4] as you cast this spell.)\nBurst Lightning deals 2 damage to any target. If this spell was kicked, it deals 4 damage instead.", casting_cost: "R", illustrator: "Vance Kovacs", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Rite of Flame", super_type: "Sorcery", rule_text: "Add [R][R], then add [R] for each card named Rite of Flame in each graveyard.", flavor_text: "Deep beneath the ice, beneath the soil and the rock, Dominaria's fire still burned hot.", casting_cost: "R", illustrator: "Dany Orizio", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Cathartic Reunion", super_type: "Sorcery", rule_text: "As an additional cost to cast this spell, discard two cards.\nDraw three cards.", flavor_text: "The chasm of years and worlds collapsed under the power of their embrace.", casting_cost: "1R", illustrator: "Howard Lyon", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Finale of Promise", super_type: "Sorcery", rule_text: "You may cast up to one target instant card and/or up to one target sorcery card from your graveyard each with mana value X or less without paying their mana costs. If a spell cast this way would be put into your graveyard, exile it instead. If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies.", casting_cost: "XRR", illustrator: "Jaime Jones", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Endurance", super_type: "Creature", sub_type: "Elemental Incarnation", rule_text: "Flash\nReach\nWhen Endurance enters the battlefield, up to one target player puts all the cards from their graveyard on the bottom of their library in a random order.\nEvoke—Exile a green card from your hand.", casting_cost: "1GG", power: "3", toughness: "4", illustrator: "Svetlin Velinov", card_color: "green", rarity: "mythic rare"])
- , new_card([ name: "Arboreal Grazer", super_type: "Creature", sub_type: "Beast", rule_text: "Reach\nWhen Arboreal Grazer enters the battlefield, you may put a land card from your hand onto the battlefield tapped.", flavor_text: "\"We fight to stop a tyrant, but we also fight for the gentle creatures who have no concept of what befalls their world.\"\n—Vivien Reid", casting_cost: "G", power: "0", toughness: "3", illustrator: "Jason Rainville", card_color: "green", rarity: "mythic rare"])
- , new_card([ name: "Avacyn's Pilgrim", super_type: "Creature", sub_type: "Human Monk", rule_text: "[T]: Add [W].", flavor_text: "\"Avacyn's protection is everywhere. From the holy church to the sacred glade, all that we see is under her blessed watch.\"", casting_cost: "G", power: "1", toughness: "1", illustrator: "Jana Schirmer & Johannes Voss", card_color: "green, white", rarity: "mythic rare"])
- , new_card([ name: "Elvish Mystic", super_type: "Creature", sub_type: "Elf Druid", rule_text: "[T]: Add [G].", flavor_text: "\"Life grows everywhere. My kin merely find those places where it grows strongest.\"\n—Nissa Revane", casting_cost: "G", power: "1", toughness: "1", illustrator: "Wesley Burt", card_color: "green", rarity: "mythic rare"])
- , new_card([ name: "Krark, the Thumbless", super_type: "Legendary Creature", sub_type: "Goblin Wizard", rule_text: "Whenever you cast an instant or sorcery spell, flip a coin. If you lose the flip, return that spell to its owner's hand. If you win the flip, copy that spell, and you may choose new targets for the copy.\nPartner (You can have two commanders if both have partner.)", flavor_text: "\"Double or nothing.\"", casting_cost: "1R", power: "2", toughness: "2", illustrator: "Mathias Kollros", card_color: "red", rarity: "mythic rare"])
- , new_card([ name: "Oni-Cult Anvil", super_type: "Artifact", rule_text: "Whenever one or more artifacts you control leave the battlefield during your turn, create a 1/1 colorless Construct artifact creature token. This ability triggers only once each turn.\n[T], Sacrifice an artifact: Oni-Cult Anvil deals 1 damage to each opponent. You gain 1 life.", casting_cost: "BR", illustrator: "Yeong-Hao Han", card_color: "black, red", rarity: "mythic rare"])
- , new_card([ name: "Prismari Command", super_type: "Instant", rule_text: "Choose two —\n• Prismari Command deals 2 damage to any target.\n• Target player draws two cards, then discards two cards.\n• Target player creates a Treasure token.\n• Destroy target artifact.", casting_cost: "1UR", illustrator: "Johannes Voss", card_color: "red, blue", rarity: "mythic rare"])
- , new_card([ name: "Korvold, Fae-Cursed King", super_type: "Legendary Creature", sub_type: "Dragon Noble", rule_text: "Flying\nWhenever Korvold, Fae-Cursed King enters the battlefield or attacks, sacrifice another permanent.\nWhenever you sacrifice a permanent, put a +1/+1 counter on Korvold and draw a card.", flavor_text: "Transformed at his own wedding, he promptly ate the banquet, the gifts, and the guests.", casting_cost: "2BRG", power: "4", toughness: "4", illustrator: "Wisnu Tan", card_color: "black, green, red", rarity: "mythic rare"])
- , new_card([ name: "Sol Ring", super_type: "Artifact", rule_text: "[T]: Add [C][C].", casting_cost: "1", illustrator: "Mark Tedin", rarity: "mythic rare"])
- , new_card([ name: "Witch's Oven", super_type: "Artifact", rule_text: "[T], Sacrifice a creature: Create a Food token. If the sacrificed creature's toughness was 4 or greater, create two Food tokens instead. (They're artifacts with \"[2], [T], Sacrifice this artifact: You gain 3 life.\")", flavor_text: "The wafting smells are both scrumptious and suspicious.", casting_cost: "1", illustrator: "Alexander Forssberg", rarity: "mythic rare"])
- , new_card([ name: "Silver Raven", super_type: "Artifact Creature", sub_type: "Bird", rule_text: "Flying\nWhen Silver Raven enters the battlefield, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.)", flavor_text: "Wings take flight on whispered wind.", casting_cost: "U", power: "1", toughness: "1", illustrator: "Joe Slucher", card_color: "blue", rarity: "mythic rare"])
- ]
+ name: &Design Skeleton Full
+ description: Basic skeleton of 19C,11U,7R,2M/color, 1U,1R/color pair, 6C,15U,8R,5M/colorless. Type "skeleton_info()" in console tab/help
+ script: skeleton_script()
+add cards script:
+ name: &Design Skeleton Commons
+ description: Basic skeleton of 19C/color. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_commons)
+add cards script:
+ name: &Design Skeleton Uncommons
+ description: Basic skeleton of 11U/color. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_uncommons, prefix:"U", rarity:"uncommon")
+add cards script:
+ name: &Design Skeleton Rares
+ description: Basic skeleton of 7R/color. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_rares, prefix:"R", rarity:"rare")
+add cards script:
+ name: &Design Skeleton Mythics
+ description: Basic skeleton of 2M/color. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_mythics, prefix:"M", rarity:"mythic rare")
+add cards script:
+ name: &Design Skeleton Gold Uncommons
+ description: Basic skeleton of 1U/color combination. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_gold_uncommons, prefix:"UM", rarity:"uncommon", letter_list:blank_list_10, mana_list:mana_list_ally+mana_list_enemy)
+add cards script:
+ name: &Design Skeleton Gold Rares
+ description: Basic skeleton of 1R/color combination. Type "skeleton_info()" into the console tab to change the numbers.
+ script: skeleton_runner(count:skeleton_gold_rares, prefix:"RM", rarity:"rare", letter_list:blank_list_10, mana_list:mana_list_ally+mana_list_enemy)
diff --git a/data/magic.mse-game/auto_replace b/data/magic.mse-game/auto_replace
index 0f047205..59a1aba5 100644
--- a/data/magic.mse-game/auto_replace
+++ b/data/magic.mse-game/auto_replace
@@ -25,30 +25,1057 @@ auto replace:
-
replace:
—
+#
+#Utility replacements
auto replace:
- match: CIP
- replace: enters the battlefield
+ match: LTB
+ replace: leaves the battlefield
+auto replace:
+ match: EOT
+ replace: end of turn
+auto replace:
+ match: UEOT
+ replace: until end of turn
+auto replace:
+ match: ueot
+ replace: until end of turn
+auto replace:
+ match: UEPT
+ replace: until end of turn
+auto replace:
+ match: uept
+ replace: until end of turn
+auto replace:
+ match: BYES
+ replace: At the beginning of your end step
+auto replace:
+ match: BNES
+ replace: At the beginning of the next end step
auto replace:
match: AAA
- replace: as an additional cost to cast
+ replace: As an additional cost to cast
+auto replace:
+ match: CMC
+ replace: mana value
+auto replace:
+ match: cmc
+ replace: mana value
+auto replace:
+ match: MV
+ replace: mana value
+auto replace:
+ match: mv
+ replace: mana value
+auto replace:
+ match: ETT
+ replace: End the turn.
auto replace:
match: @
- replace: LEGENDNAME
+ replace: LEGENDNAME>
auto replace:
match: ~
- replace: CARDNAME
+ replace: CARDNAME>
+auto replace:
+ match: '
+ replace: ’
auto replace:
match: ::
replace: •
auto replace:
match: ->
- replace: •
+ replace: •
+auto replace:
+ match: WETB
+ replace: When CARDNAME enters the battlefield
+auto replace:
+ match: CEBT
+ replace: CARDNAME enters the battlefield tapped.
auto replace:
match: ETB
replace: enters the battlefield
auto replace:
- match: etbt
- replace: enters the battlefield tapped
+ match: etb
+ replace: enters the battlefield
+auto replace:
+ match: battlefieldA
+ replace: enters the battlefield or attacks,
+auto replace:
+ match: battlefieldT
+ replace: battlefield tapped
+auto replace:
+ match: WTD
+ replace: When CARDNAME dies
+auto replace:
+ match: WTA
+ replace: Whenever CARDNAME attacks,
+auto replace:
+ match: WTB
+ replace: Whenever CARDNAME blocks,
+auto replace:
+ match: SAC
+ replace: Sacrifice a creature:
+auto replace:
+ match: SAX
+ replace: sacrifice a creature
+auto replace:
+ match: P&T
+ replace: power and toughness
+auto replace:
+ match: BPT
+ replace: base power and toughness
+#
+#Abilities
+auto replace:
+ match: CBC
+ replace: CARDNAME can't be countered.
+auto replace:
+ match: CBSA
+ replace: CARDNAME can't be countered by spells or abilities.
+auto replace:
+ match: WTT
+ replace: Whenever CARDNAME becomes the target of a spell
+auto replace:
+ match: ILL
+ replace: When CARDNAME becomes the target of a spell or ability, sacrifice it.
+auto replace:
+ match: ANYCARD
+ replace: Search your library for a card and put that card into your hand. Then shuffle your library.
+auto replace:
+ match: TUTOR
+ replace: Search your library for a card, reveal it, and put it into your hand. Then shuffle your library.
+auto replace:
+ match: BLAND
+ replace: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.
+auto replace:
+ match: FLICKER
+ replace: Exile target creature you control, then return that card to the battlefield under your control.
+auto replace:
+ match: BOUNCE
+ replace: Return target creature to its owner's hand.
+auto replace:
+ match: FIRE
+ replace: [R]: CARDNAME gets +1/+0 until end of turn.
+auto replace:
+ match: SHADE
+ replace: [B]: CARDNAME gets +1/+1 until end of turn.
+auto replace:
+ match: CTS
+ replace: Counter target spell.
+auto replace:
+ match: CTA
+ replace: Counter target ability.
+auto replace:
+ match: CT.SA
+ replace: Counter target spell or ability.
+auto replace:
+ match: CBB
+ replace: CARDNAME can't be blocked.
+auto replace:
+ match: CCB
+ replace: CARDNAME can't block.
+auto replace:
+ match: ATE
+ replace: CARDNAME attacks each turn if able.
+auto replace:
+ match: ACE
+ replace: CARDNAME attacks each combat if able.
+auto replace:
+ match: CBTT
+ replace: Target creature can't block this turn.
+auto replace:
+ match: SAB
+ replace: Whenever CARDNAME deals combat damage to a player,
+auto replace:
+ match: TUCK
+ replace: Put target creature on the bottom of its owner's library.
+auto replace:
+ match: TOP
+ replace: Put target creature on top of its owner's library.
+auto replace:
+ match: WARP
+ replace: The owner of target creature shuffles it into their library.
+auto replace:
+ match: EXTRA
+ replace: Take an extra turn after this one.
+auto replace:
+ match: DEA
+ replace: Destroy target artifact or enchantment.
+auto replace:
+ match: DTA
+ replace: Destroy target artifact.
+auto replace:
+ match: DTE
+ replace: Destroy target enchantment.
+auto replace:
+ match: DAL
+ replace: Destroy target artifact or land.
+auto replace:
+ match: DTF
+ replace: Destroy target creature with flying.
+auto replace:
+ match: DTL
+ replace: Destroy target land.
+auto replace:
+ match: CLONE
+ replace: You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield.
+auto replace:
+ match: MUR
+ replace: Destroy target creature.
+auto replace:
+ match: DTAC
+ replace: Destroy target attacking creature.
+auto replace:
+ match: DTBC
+ replace: Destroy target blocking creature.
+auto replace:
+ match: DTABC
+ replace: Destroy target attacking or blocking creature.
+auto replace:
+ match: ORING
+ replace: When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. (That creature returns under its owner's control.)
+auto replace:
+ match: WIDE
+ replace: CARDNAME can block any number of creatures.
+auto replace:
+ match: PLATINUM
+ replace: You can't lose the game and your opponents can't win the game.
+auto replace:
+ match: ABYSSAL
+ replace: You can't win the game and your opponents can't lose the game.
+auto replace:
+ match: ABOC
+ replace: at the beginning of combat
+auto replace:
+ match: ABOY
+ replace: at the beginning of combat on your turn
+auto replace:
+ match: SMITE
+ replace: Destroy target creature with power 4 or greater.
+auto replace:
+ match: PAC
+ replace: Enchanted creature can’t attack or block.
+auto replace:
+ match: ARR
+ replace: Enchanted creature can’t attack or block, and its activated abilities can’t be activated.
+auto replace:
+ match: PTEC
+ replace: CARDNAME's power and toughness are equal to the number of creatures you control.
+auto replace:
+ match: REA
+ replace: Put target creature card from a graveyard onto the battlefield under your control.
+auto replace:
+ match: UNT
+ replace: Whenever another creature enters the battlefield, untap CARDNAME.
+auto replace:
+ match: XATK
+ replace: Untap all creatures that attacked this turn. After this main phase, there is an additional combat phase followed by an additional main phase.
+auto replace:
+ match: LTC
+ replace: Target land becomes the basic land type of your choice.
+auto replace:
+ match: CUR
+ replace: Whenever this creature deals combat damage to an opponent, draw a card.
+auto replace:
+ match: FREEZE
+ replace: Tap target creature. That creature doesn't untap during its controller's next untap step.
+auto replace:
+ match: LOCK
+ replace: Enchanted creature doesn't untap.
+auto replace:
+ match: LOOT
+ replace: Draw a card, then discard a card.
+auto replace:
+ match: RUMMAGE
+ replace: Discard a card, then draw a card.
+auto replace:
+ match: WIS
+ replace: This creature's power and toughness are equal to the number of cards in our hand.
+auto replace:
+ match: COPYS
+ replace: Copy target instant or sorcery spell. You may choose new targets for the copy.
+auto replace:
+ match: REDIRECT
+ replace: Change the target of target spell with a single target.
+auto replace:
+ match: CONTROL
+ replace: Gain control of target creature.
+auto replace:
+ match: STEAL
+ replace: Gain control of target creature until end of turn.
+auto replace:
+ match: TOUT
+ replace: Tap or untap target
+auto replace:
+ match: WINDFALL
+ replace: Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way.
+auto replace:
+ match: WHEEL
+ replace: Each player discards their hand, then draws seven cards.
+auto replace:
+ match: POLYMORPH
+ replace: Exile target creature. Its controller reveals cards from the top of their library until they reveals a creature card. That player puts that card onto the battlefield.
+auto replace:
+ match: CANE
+ replace: Shuffle your graveyard into your library.
+auto replace:
+ match: KHABAL
+ replace: Whenever another creature dies, put a +1/+1 counter on this creature.
+auto replace:
+ match: FUNERAL
+ replace: Whenever another creature you control dies,
+auto replace:
+ match: LOMBOTOMY
+ replace: Choose a nonland card name. Search target player's graveyard hand and library for all cards with that name and exile them.
+auto replace:
+ match: SENGIR
+ replace: When a creature damaged by this creature dies, put a +1/+1 counter on this creature.
+auto replace:
+ match: SPECTER
+ replace: When this creature deals combat damage to an opponent, that player discards a card.
+auto replace:
+ match: OSF
+ replace: Target creature you control deals damage to equal to its power to another target creature.
+auto replace:
+ match: LURE
+ replace: CARDNAME must be blocked this turn if able.
+auto replace:
+ match: WIDELURE
+ replace: All creatures able to block CARDNAME do so.
+auto replace:
+ match: DAUNT
+ replace: CARDNAME can't be blocked by creatures with power 2 or less.
+auto replace:
+ match: HYDRA
+ replace: CARDNAME enters the battlefield with X +1/+1 counters on it.
+auto replace:
+ match: FOG
+ replace: Prevent all combat damage that would be dealt this turn.
+auto replace:
+ match: STALK
+ replace: CARDNAME can't be blocked by more than one creature.
+auto replace:
+ match: STRAMPLE
+ replace: You may have CARDNAME assign its combat damage as though it weren't blocked.
+auto replace:
+ match: AOT
+ replace: Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn.
+auto replace:
+ match: FLOWSTONE
+ replace: Target creature gets +1/-1 until end of turn.
+auto replace:
+ match: BOOST
+ replace: Put a +1/+1 counter on target creature.
+auto replace:
+ match: WITHER
+ replace: Put a -1/-1 counter on target creature.
+auto replace:
+ match: DEFLECT
+ replace: The next time a source of your choice would deal damage to you this turn, prevent that damage. If damage is prevented this way, CARDNAME deals that much damage to that source's controller.
+auto replace:
+ match: TCOP
+ replace: target creature or player
+auto replace:
+ match: FORATK
+ replace: Target creature attacks this turn if able.
+auto replace:
+ match: MEDDLING
+ replace: As CARDNAME enters the battlefield, choose a nonland card name. Spells with the chosen name can't be cast.
+auto replace:
+ match: SILENCE
+ replace: Your opponents can't cast spells this turn. (Spells cast before this resolves are unaffected.)
+auto replace:
+ match: TWIST
+ replace: Switch target creature's power and toughness until end of turn.
+auto replace:
+ match: PUNCH
+ replace: Target creature you control deals damage equal to its power to target creature you don't control.
+auto replace:
+ match: FURNACE
+ replace: If a source would deal damage to a permanent or player, it deals double that damage to that permanent or player instead.
+auto replace:
+ match: MANAFLARE
+ replace: Whenever a player taps a land for mana, that player adds one mana of any type that land produced.
+auto replace:
+ match: HOWLING
+ replace: At the beginning of each player's draw step, that player draws an additional card.
+auto replace:
+ match: DEATHSAC
+ replace: Whenever a creature you control dies, each opponent sacrifices a creature.
+auto replace:
+ match: SHROUD
+ replace: can't be the target of spells or abilities.
+auto replace:
+ match: PROWESS
+ replace: Whenever you cast a noncreature spell,
+auto replace:
+ match: CCMC
+ replace: Counter target spell with mana value X.
+auto replace:
+ match: UNMORPH
+ replace: When CARDNAME is turned face up,
+auto replace:
+ match: SPECTER
+ replace: When this creature deals combat damage to an opponent, that player discards a card.
+auto replace:
+ match: GY
+ replace: graveyard
+auto replace:
+ match: RELENTLESS
+ replace: A deck can have any number of cards named CARDNAME.
+auto replace:
+ match: HIFLY
+ replace: CARDNAME can block only creatures with flying.
+#
+#Ability word replacements
+auto replace:
+ match: THRESHOLDP
+ replace: Threshold — {Effect} as long as seven or more cards are in your graveyard.
+auto replace:
+ match: THRESHOLDS
+ replace: Threshold — If seven or more cards are in your graveyard, {Effect}
+auto replace:
+ match: IMPRINT
+ replace: Imprint — When CARDNAME enters the battlefield, you may exile a {something} from {somewhere}.
+auto replace:
+ match: CHANNEL
+ replace: Channel — {Cost}, discard CARDNAME: {Effect}
+auto replace:
+ match: SWEEP
+ replace: Sweep — Return any number of {Basic Land Type} you control to their owner's hand. {Effect based on number returned.}
+auto replace:
+ match: RADIANCE
+ replace: Radiance — Target creature and each other creature that shares a color with it
+auto replace:
+ match: HELLBENTS
+ replace: Hellbent — If you have no cards in hand, {Effect}
+auto replace:
+ match: HELLBENTP
+ replace: Hellbent — {Effect}, as long as you have no cards in hand.
+auto replace:
+ match: GRANDEUR
+ replace: Grandeur — Discard another card named CARDNAME: {Effect}
+auto replace:
+ match: KINSHIP
+ replace: Kinship — At the beginning of your upkeep, you may look at the top card of your library. If that card shares a creature type with CARDNAME, you may reveal it. If you do, {Effect}.
+auto replace:
+ match: CHROMA
+ replace: Chroma — {Effect} based on the number of {Color} mana symbols {Somewhere}
+auto replace:
+ match: DOMAIN
+ replace: Domain — {Effect} for each basic land type among lands you control.
+auto replace:
+ match: LANDFALLP
+ replace: Landfall — Whenever a land enters the battlefield under your control,
+auto replace:
+ match: LANDFALLS
+ replace: Landfall — If you had a land enter the battlefield under your control this turn, {Effect}.
+auto replace:
+ match: METALCRAFTP
+ replace: Metalcraft — {Effect} as long as you control three or more artifacts.
+auto replace:
+ match: METALCRAFTS
+ replace: Metalcraft — If you control three or more artifacts, {Effect}.
+auto replace:
+ match: JOINFORCES
+ replace: Join Forces — Starting with you, {Effect}.
+auto replace:
+ match: MORBID
+ replace: Morbid — {Effect} if a creature died this turn.
+auto replace:
+ match: FATEFULHOURS
+ replace: Fateful hour — If you have 5 or less life, {Effect}.
+auto replace:
+ match: FATEFULHOURP
+ replace: Fateful hour — As long as you have 5 or less life,
+auto replace:
+ match: BLOODRUSH
+ replace: Bloodrush — {COST}, Discard CARDNAME: Target attacking creature gets
+auto replace:
+ match: BATTALION
+ replace: Battalion — Whenever CARDNAME and at least two other creatures attack,
+auto replace:
+ match: HEROIC
+ replace: Heroic — Whenever you cast a spell that targets CARDNAME, {Effect}.
+auto replace:
+ match: TEMPTINGOFFER
+ replace: Tempting offer — {Do Something}. Each opponent may {Do that thing}. For each opponent who does, {Do that thing again}.
+auto replace:
+ match: INSPIRED
+ replace: Inspired — Whenever CARDNAME becomes untapped,
+auto replace:
+ match: CONSTELLATION
+ replace: Constellation — Whenever CARDNAME or another enchantment enters the battlefield under your control,
+auto replace:
+ match: STRIVE
+ replace: Strive — CARDNAME costs {COST} more to cast for each target beyond the first.
+auto replace:
+ match: WILLOFTHECOUNCIL
+ replace: Will of the Council — Starting with you, each player votes for {Blank 1} or {Blank 2}. If {Blank 1} gets more votes, {Effect 1}. If {Blank 2} gets more votes or the vote is tied, {Effect 2}.
+auto replace:
+ match: PARLEY
+ replace: Parley — Each player reveals the top card of their library. For each nonland card revealed this way, {Effect}.
+auto replace:
+ match: RAID
+ replace: Raid — If you attacked with a creature this turn, {Effect}.
+auto replace:
+ match: FEROCIOUSS
+ replace: Ferocious — If you control a creature with power 4 or greater, {Effect}.
+auto replace:
+ match: LIEUTENANT
+ replace: Lieutenant — As long as you control your commander, CARDNAME gets {Effect} and creatures you control have {Effect}.
+auto replace:
+ match: FORMIDABLES
+ replace: Formidable — If creatures you control have total power 8 or greater, {Effect}.
+auto replace:
+ match: FORMIDABLEP
+ replace: Formidable — As long as creatures you control have total power 8 or greater, {Effect}.
+auto replace:
+ match: SPELLMASTERYS
+ replace: Spell Mastery — If there are two or more instant and/or sorcery cards in your graveyard, {Effect}.
+auto replace:
+ match: SPELLMASTERYP
+ replace: Spell Mastery — As long as there are two or more instant and/or sorcery cards in your graveyard, {Effect}.
+auto replace:
+ match: RALLY
+ replace: Rally — Whenever CARDNAME or another Ally enters the battlefield under your control, {Effect}.
+auto replace:
+ match: COHORT
+ replace: Cohort — [T], Tap an untapped Ally you control: {Effect}.
+auto replace:
+ match: CONVERGE
+ replace: Converge — {Effect} for each color of mana spent to cast CARDNAME.
+auto replace:
+ match: DELIRIUMS
+ replace: Delirium — If there are four or more card types among cards in your graveyard, {Effect}.
+auto replace:
+ match: DELIRIUMP
+ replace: Delirium — {Effect} as long as there are four or more card types among cards in your graveyard.
+auto replace:
+ match: COUNCILSDILEMMA
+ replace: Council's dilemma — Starting with you, each player votes for {Blank 1} or {Blank 2}. For each {Blank 1} vote, {Effect 1}. For each {Blank 2} vote, {Effect 2}.
+auto replace:
+ match: REVOLT
+ replace: Revolt — If a permanent you controlled left the battlefield this turn, {Effect}.
+auto replace:
+ match: ENRAGE
+ replace: Enrage — Whenever CARDNAME is dealt damage, {Effect}.
+auto replace:
+ match: ADDENDUM
+ replace: Addendum — If you cast this spell during your main phase,
+#
+#X replacements
+auto replace:
+ match: GRIND1
+ replace: Target player reveals cards from the top of their library until they reveal a land card, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND2
+ replace: Target player reveals cards from the top of their library until they reveal two land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND3
+ replace: Target player reveals cards from the top of their library until they reveal three land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND4
+ replace: Target player reveals cards from the top of their library until they reveal four land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND5
+ replace: Target player reveals cards from the top of their library until they reveal five land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND6
+ replace: Target player reveals cards from the top of their library until they reveal six land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND7
+ replace: Target player reveals cards from the top of their library until they reveal seven land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND8
+ replace: Target player reveals cards from the top of their library until they reveal eight land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND9
+ replace: Target player reveals cards from the top of their library until they reveal nine land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRIND.10
+ replace: Target player reveals cards from the top of their library until they reveal ten land cards, then puts those cards into their graveyard.
+auto replace:
+ match: GRINDX
+ replace: Target player reveals cards from the top of their library until they reveal X land cards, then puts those cards into their graveyard.
+auto replace:
+ match: SDT2
+ replace: Look at the top two cards of your library, then put them back in any order.
+auto replace:
+ match: SDT3
+ replace: Look at the top three cards of your library, then put them back in any order.
+auto replace:
+ match: SDT4
+ replace: Look at the top four cards of your library, then put them back in any order.
+auto replace:
+ match: SDT5
+ replace: Look at the top five cards of your library, then put them back in any order.
+auto replace:
+ match: DRAIN1
+ replace: Each opponent loses 1 life. You gain life equal to the life lost this way.
+auto replace:
+ match: DRAIN2
+ replace: Each opponent loses 2 life. You gain life equal to the life lost this way.
+auto replace:
+ match: DRAIN3
+ replace: Each opponent loses 3 life. You gain life equal to the life lost this way.
+auto replace:
+ match: DRAIN4
+ replace: Each opponent loses 4 life. You gain life equal to the life lost this way.
+auto replace:
+ match: DRAIN5
+ replace: Each opponent loses 5 life. You gain life equal to the life lost this way.
+auto replace:
+ match: DRAINX
+ replace: Each opponent loses X life. You gain life equal to the life lost this way.
+auto replace:
+ match: PING1
+ replace: [T]: CARDNAME deals 1 damage to target creature, player, or planeswalker.
+auto replace:
+ match: PING2
+ replace: [T]: CARDNAME deals 2 damage to target creature, player, or planeswalker.
+auto replace:
+ match: PING3
+ replace: [T]: CARDNAME deals 3 damage to target creature, player, or planeswalker.
+auto replace:
+ match: FATESEAL1
+ replace: Look at the top card of target opponent's library. You may put that card on the bottom of that player's library.
+auto replace:
+ match: FATESEAL2
+ replace: Look at the top two cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL3
+ replace: Look at the top three cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL4
+ replace: Look at the top four cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL5
+ replace: Look at the top five cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL6
+ replace: Look at the top six cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL7
+ replace: Look at the top seven cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL8
+ replace: Look at the top eight cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEAL9
+ replace: Look at the top nine cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: FATESEALX
+ replace: Look at the top X cards of an target opponent's library, then put any number of them on the bottom of that player's library and the rest on top in any order.
+auto replace:
+ match: ANTHEM1
+ replace: Creatures you control get +1/+1.
+auto replace:
+ match: ANTHEM2
+ replace: Creatures you control get +2/+2.
+auto replace:
+ match: ANTHEM3
+ replace: Creatures you control get +3/+3.
+auto replace:
+ match: ANTHEM4
+ replace: Creatures you control get +4/+4.
+auto replace:
+ match: ANTHEM5
+ replace: Creatures you control get +5/+5.
+auto replace:
+ match: ANTHEM6
+ replace: Creatures you control get +6/+6.
+auto replace:
+ match: ANTHEM7
+ replace: Creatures you control get +7/+7.
+auto replace:
+ match: ANTHEM8
+ replace: Creatures you control get +8/+8.
+auto replace:
+ match: ANTHEM9
+ replace: Creatures you control get +9/+9.
+auto replace:
+ match: ANTHEMX
+ replace: Creatures you control get +X/+X.
+auto replace:
+ match: ANTIHEM1
+ replace: Creatures your opponents control get -1/-1.
+auto replace:
+ match: ANTIHEM2
+ replace: Creatures your opponents control get -2/-2.
+auto replace:
+ match: ANTIHEM3
+ replace: Creatures your opponents control get -3/-3.
+auto replace:
+ match: ANTIHEM4
+ replace: Creatures your opponents control get -4/-4.
+auto replace:
+ match: ANTIHEM5
+ replace: Creatures your opponents control get -5/-5.
+auto replace:
+ match: ANTIHEMX
+ replace: Creatures your opponents control get -X/-X.
+auto replace:
+ match: CTX
+ replace: Counter target spell unless its controller pays [X].
+auto replace:
+ match: CT1
+ replace: Counter target spell unless its controller pays [1].
+auto replace:
+ match: CT2
+ replace: Counter target spell unless its controller pays [2].
+auto replace:
+ match: CT3
+ replace: Counter target spell unless its controller pays [3].
+auto replace:
+ match: CT4
+ replace: Counter target spell unless its controller pays [4].
+auto replace:
+ match: CT5
+ replace: Counter target spell unless its controller pays [5].
+auto replace:
+ match: GROW1
+ replace: Target creature gets +1/+1 until end of turn.
+auto replace:
+ match: GROW2
+ replace: Target creature gets +2/+2 until end of turn.
+auto replace:
+ match: GROW3
+ replace: Target creature gets +3/+3 until end of turn.
+auto replace:
+ match: GROW4
+ replace: Target creature gets +4/+4 until end of turn.
+auto replace:
+ match: GROW5
+ replace: Target creature gets +5/+5 until end of turn.
+auto replace:
+ match: GROW6
+ replace: Target creature gets +6/+6 until end of turn.
+auto replace:
+ match: GROW7
+ replace: Target creature gets +7/+7 until end of turn.
+auto replace:
+ match: GROW8
+ replace: Target creature gets +8/+8 until end of turn.
+auto replace:
+ match: GROW9
+ replace: Target creature gets +9/+9 until end of turn.
+auto replace:
+ match: GROWX
+ replace: Target creature gets +X/+X until end of turn.
+auto replace:
+ match: PUMP1
+ replace: Target creature gets +1/+0 until end of turn.
+auto replace:
+ match: PUMP2
+ replace: Target creature gets +2/+0 until end of turn.
+auto replace:
+ match: PUMP3
+ replace: Target creature gets +3/+0 until end of turn.
+auto replace:
+ match: PUMP4
+ replace: Target creature gets +4/+0 until end of turn.
+auto replace:
+ match: PUMP5
+ replace: Target creature gets +5/+0 until end of turn.
+auto replace:
+ match: PUMP6
+ replace: Target creature gets +6/+0 until end of turn.
+auto replace:
+ match: PUMP7
+ replace: Target creature gets +7/+0 until end of turn.
+auto replace:
+ match: PUMP8
+ replace: Target creature gets +8/+0 until end of turn.
+auto replace:
+ match: PUMP9
+ replace: Target creature gets +9/+0 until end of turn.
+auto replace:
+ match: PUMPX
+ replace: Target creature gets +X/+0 until end of turn.
+auto replace:
+ match: IMPULSE1
+ replace: Exile the top card of your library. Until end of turn, you may play that card.
+auto replace:
+ match: IMPULSE2
+ replace: Exile the top two cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE3
+ replace: Exile the top three cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE4
+ replace: Exile the top four cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE5
+ replace: Exile the top five cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE6
+ replace: Exile the top six cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE7
+ replace: Exile the top seven cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE8
+ replace: Exile the top eight cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE9
+ replace: Exile the top nine cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSE.10
+ replace: Exile the top ten cards of your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: IMPULSEALL
+ replace: Exile your library. Until end of turn, you may play cards exiled this way.
+auto replace:
+ match: WEAK1
+ replace: Target creature gets -1/-0 until end of turn.
+auto replace:
+ match: WEAK2
+ replace: Target creature gets -2/-0 until end of turn.
+auto replace:
+ match: WEAK3
+ replace: Target creature gets -3/-0 until end of turn.
+auto replace:
+ match: WEAK4
+ replace: Target creature gets -4/-0 until end of turn.
+auto replace:
+ match: WEAK5
+ replace: Target creature gets -5/-0 until end of turn.
+auto replace:
+ match: WEAK6
+ replace: Target creature gets -6/-0 until end of turn.
+auto replace:
+ match: WEAK7
+ replace: Target creature gets -7/-0 until end of turn.
+auto replace:
+ match: WEAK8
+ replace: Target creature gets -8/-0 until end of turn.
+auto replace:
+ match: WEAK9
+ replace: Target creature gets -9/-0 until end of turn.
+auto replace:
+ match: WEAKX
+ replace: Target creature gets -X/-0 until end of turn.
+auto replace:
+ match: SHRINK1
+ replace: Target creature gets -1/-1 until end of turn.
+auto replace:
+ match: SHRINK2
+ replace: Target creature gets -2/-2 until end of turn.
+auto replace:
+ match: SHRINK3
+ replace: Target creature gets -3/-3 until end of turn.
+auto replace:
+ match: SHRINK4
+ replace: Target creature gets -4/-4 until end of turn.
+auto replace:
+ match: SHRINK5
+ replace: Target creature gets -5/-5 until end of turn.
+auto replace:
+ match: SHRINK6
+ replace: Target creature gets -6/-6 until end of turn.
+auto replace:
+ match: SHRINK7
+ replace: Target creature gets -7/-7 until end of turn.
+auto replace:
+ match: SHRINK8
+ replace: Target creature gets -8/-8 until end of turn.
+auto replace:
+ match: SHRINK9
+ replace: Target creature gets -9/-9 until end of turn.
+auto replace:
+ match: SHRINKX
+ replace: Target creature gets -X/-X until end of turn.
+auto replace:
+ match: PREVENT1
+ replace: Prevent the next 1 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT2
+ replace: Prevent the next 2 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT3
+ replace: Prevent the next 3 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT4
+ replace: Prevent the next 4 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT5
+ replace: Prevent the next 5 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT6
+ replace: Prevent the next 6 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT7
+ replace: Prevent the next 7 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT8
+ replace: Prevent the next 8 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENT9
+ replace: Prevent the next 9 damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: PREVENTX
+ replace: Prevent the next X damage that would be dealt to target creature or player this turn.
+auto replace:
+ match: +1C1
+ replace: Put a +1/+1 counter on
+auto replace:
+ match: +1C2
+ replace: Put two +1/+1 counters on
+auto replace:
+ match: +1C3
+ replace: Put three +1/+1 counters on
+auto replace:
+ match: +1C4
+ replace: Put four +1/+1 counters on
+auto replace:
+ match: +1C5
+ replace: Put five +1/+1 counters on
+auto replace:
+ match: +1C6
+ replace: Put six +1/+1 counters on
+auto replace:
+ match: +1C7
+ replace: Put seven +1/+1 counters on
+auto replace:
+ match: +1C8
+ replace: Put eight +1/+1 counters on
+auto replace:
+ match: +1C9
+ replace: Put nine +1/+1 counters on
+auto replace:
+ match: +1CX
+ replace: Put X +1/+1 counters on
+auto replace:
+ match: -1C1
+ replace: Put a -1/-1 counter on
+auto replace:
+ match: -1C2
+ replace: Put two -1/-1 counters on
+auto replace:
+ match: -1C3
+ replace: Put three -1/-1 counters on
+auto replace:
+ match: -1C4
+ replace: Put four -1/-1 counters on
+auto replace:
+ match: -1C5
+ replace: Put five -1/-1 counters on
+auto replace:
+ match: -1C6
+ replace: Put six -1/-1 counters on
+auto replace:
+ match: -1C7
+ replace: Put seven -1/-1 counters on
+auto replace:
+ match: -1C8
+ replace: Put eight -1/-1 counters on
+auto replace:
+ match: -1C9
+ replace: Put nine -1/-1 counters on
+auto replace:
+ match: -1CX
+ replace: Put X -1/-1 counters on
+auto replace:
+ match: PW+1
+ replace: [+1 loyalty]
+auto replace:
+ match: PW+2
+ replace: [+2 loyalty]
+auto replace:
+ match: PW+3
+ replace: [+3 loyalty]
+auto replace:
+ match: PW+4
+ replace: [+4 loyalty]
+auto replace:
+ match: PW+5
+ replace: [+5 loyalty]
+auto replace:
+ match: PW+6
+ replace: [+6 loyalty]
+auto replace:
+ match: PW+7
+ replace: [+7 loyalty]
+auto replace:
+ match: PW+8
+ replace: [+8 loyalty]
+auto replace:
+ match: PW+9
+ replace: [+9 loyalty]
+auto replace:
+ match: PW+0
+ replace: [+1 loyalty]
+auto replace:
+ match: PW+X
+ replace: [+X loyalty]
+auto replace:
+ match: PW-1
+ replace: [-1 loyalty]
+auto replace:
+ match: PW-2
+ replace: [-2 loyalty]
+auto replace:
+ match: PW-3
+ replace: [-3 loyalty]
+auto replace:
+ match: PW-4
+ replace: [-4 loyalty]
+auto replace:
+ match: PW-5
+ replace: [-5 loyalty]
+auto replace:
+ match: PW-6
+ replace: [-6 loyalty]
+auto replace:
+ match: PW-7
+ replace: [-7 loyalty]
+auto replace:
+ match: PW-8
+ replace: [-8 loyalty]
+auto replace:
+ match: PW-9
+ replace: [-9 loyalty]
+auto replace:
+ match: PW-0
+ replace: [-0 loyalty]
+auto replace:
+ match: PW-X
+ replace: [-X loyalty]
+auto replace:
+ match: PW1
+ replace: [1 loyalty]
+auto replace:
+ match: PW2
+ replace: [2 loyalty]
+auto replace:
+ match: PW3
+ replace: [3 loyalty]
+auto replace:
+ match: PW4
+ replace: [4 loyalty]
+auto replace:
+ match: PW5
+ replace: [5 loyalty]
+auto replace:
+ match: PW6
+ replace: [6 loyalty]
+auto replace:
+ match: PW7
+ replace: [7 loyalty]
+auto replace:
+ match: PW8
+ replace: [8 loyalty]
+auto replace:
+ match: PW9
+ replace: [9 loyalty]
+auto replace:
+ match: PW0
+ replace: [0 loyalty]
+auto replace:
+ match: PWx
+ replace: [X loyalty]
+#
+#Phyrexian and 2brid Mana Replacements
auto replace:
match: phyW
replace: ([H/W] can be paid with either [W] or 2 life.)
@@ -66,124 +1093,355 @@ auto replace:
replace: ([H/G] can be paid with either [G] or 2 life.)
auto replace:
match: twoW
- replace: ([2/W] can be paid with any two mana or with [W].)
+ replace: ([2/W] can be paid with any two mana or with [W]. This card's mana value is )
auto replace:
match: twoU
- replace: ([2/U] can be paid with any two mana or with [U].)
+ replace: ([2/U] can be paid with any two mana or with [U]. This card's mana value is )
auto replace:
match: twoB
- replace: ([2/B] can be paid with any two mana or with [B].)
+ replace: ([2/B] can be paid with any two mana or with [B]. This card's mana value is )
auto replace:
match: twoR
- replace: ([2/R] can be paid with any two mana or with [R].)
+ replace: ([2/R] can be paid with any two mana or with [R]. This card's mana value is )
auto replace:
match: twoG
- replace: ([2/G] can be paid with any two mana or with [G].)
+ replace: ([2/G] can be paid with any two mana or with [G]. This card's mana value is )
auto replace:
- match: TWALK
- replace: Take an extra turn after this one.
+ match: twoC
+ replace: ([2/C] can be paid with any two mana or with [C]. This card's mana value is )
+auto replace:
+ match: HWU
+ replace: ([W/U] can be paid with either [W] or [U].)
+auto replace:
+ match: HUB
+ replace: ([U/B] can be paid with either [U] or [B].)
+auto replace:
+ match: HBR
+ replace: ([B/R] can be paid with either [B] or [R].)
+auto replace:
+ match: HRG
+ replace: ([R/G] can be paid with either [R] or [G].)
+auto replace:
+ match: HGW
+ replace: ([G/W] can be paid with either [G] or [W].)
+auto replace:
+ match: HWB
+ replace: ([W/B] can be paid with either [W] or [B].)
+auto replace:
+ match: HUR
+ replace: ([U/R] can be paid with either [U] or [R].)
+auto replace:
+ match: HBG
+ replace: ([B/G] can be paid with either [B] or [G].)
+auto replace:
+ match: HRW
+ replace: ([R/W] can be paid with either [R] or [W].)
+auto replace:
+ match: HGU
+ replace: ([G/U] can be paid with either [G] or [U].)
+auto replace:
+ match: HCW
+ replace: ([C/W] can be paid with either [C] or [W].)
+auto replace:
+ match: HCU
+ replace: ([C/U] can be paid with either [C] or [U].)
+auto replace:
+ match: HCB
+ replace: ([C/B] can be paid with either [C] or [B].)
+auto replace:
+ match: HCR
+ replace: ([C/R] can be paid with either [C] or [R].)
+auto replace:
+ match: HCG
+ replace: ([C/G] can be paid with either [C] or [G].)
+#
+#Tap to add Mana Replacements
+auto replace:
+ match: TAM
+ replace: [T]: Add one mana of any color.
+auto replace:
+ match: TAT
+ replace: [T]: Add one mana of any type.
auto replace:
match: TAW
- replace: [T]: Add [W] to your mana pool.
+ replace: [T]: Add [W].
auto replace:
match: TAU
- replace: [T]: Add [U] to your mana pool.
+ replace: [T]: Add [U].
auto replace:
match: TAB
- replace: [T]: Add [B] to your mana pool.
+ replace: [T]: Add [B].
auto replace:
match: TAR
- replace: [T]: Add [R] to your mana pool.
+ replace: [T]: Add [R].
auto replace:
match: TAG
- replace: [T]: Add [G] to your mana pool.
+ replace: [T]: Add [G].
auto replace:
match: TAC
- replace: [T]: Add [C] to your mana pool.
+ replace: [T]: Add [C].
+auto replace:
+ match: TAS
+ replace: [T]: Add [S].
+auto replace:
+ match: TAD
+ replace: [T]: Add [C][C].
auto replace:
match: TWU
- replace: [T]: Add [W] or [U] to your mana pool.
+ replace: [T]: Add [W] or [U].
auto replace:
match: TUB
- replace: [T]: Add [U] or [B] to your mana pool.
+ replace: [T]: Add [U] or [B].
auto replace:
match: TBR
- replace: [T]: Add [B] or [R] to your mana pool.
+ replace: [T]: Add [B] or [R].
auto replace:
match: TRG
- replace: [T]: Add [R] or [G] to your mana pool.
+ replace: [T]: Add [R] or [G].
auto replace:
match: TGW
- replace: [T]: Add [G] or [W] to your mana pool.
+ replace: [T]: Add [G] or [W].
auto replace:
match: TWB
- replace: [T]: Add [W] or [B] to your mana pool.
+ replace: [T]: Add [W] or [B].
auto replace:
match: TUR
- replace: [T]: Add [U] or [R] to your mana pool.
+ replace: [T]: Add [U] or [R].
auto replace:
match: TBG
- replace: [T]: Add [B] or [G] to your mana pool.
+ replace: [T]: Add [B] or [G].
auto replace:
match: TRW
- replace: [T]: Add [R] or [W] to your mana pool.
+ replace: [T]: Add [R] or [W].
auto replace:
match: TGU
- replace: [T]: Add [G] or [U] to your mana pool.
+ replace: [T]: Add [G] or [U].
+auto replace:
+ match: TCW
+ replace: [T]: Add [C] or [W].
+auto replace:
+ match: TCU
+ replace: [T]: Add [C] or [U].
+auto replace:
+ match: TCB
+ replace: [T]: Add [C] or [B].
+auto replace:
+ match: TCR
+ replace: [T]: Add [C] or [R].
+auto replace:
+ match: TCG
+ replace: [T]: Add [C] or [G].
auto replace:
match: twub
- replace: [T]: Add [W], [U], or [B] to your mana pool.
+ replace: [T]: Add [W], [U], or [B].
auto replace:
match: tubr
- replace: [T]: Add [U], [B], or [R] to your mana pool.
+ replace: [T]: Add [U], [B], or [R].
auto replace:
match: tbrg
- replace: [T]: Add [B], [R], or [G] to your mana pool.
+ replace: [T]: Add [B], [R], or [G].
auto replace:
match: trgw
- replace: [T]: Add [R], [G], or [W] to your mana pool.
+ replace: [T]: Add [R], [G], or [W].
auto replace:
match: tgwu
- replace: [T]: Add [G], [W] or [U] to your mana pool.
+ replace: [T]: Add [G], [W] or [U].
auto replace:
match: twbg
- replace: [T]: Add [W], [B], or [G] to your mana pool.
+ replace: [T]: Add [W], [B], or [G].
auto replace:
match: turw
- replace: [T]: Add [U], [R], or [W] to your mana pool.
+ replace: [T]: Add [U], [R], or [W].
auto replace:
match: tbgu
- replace: [T]: Add [B], [G], or [U] to your mana pool.
+ replace: [T]: Add [B], [G], or [U].
auto replace:
match: trwb
- replace: [T]: Add [R], [W], or [B] to your mana pool.
+ replace: [T]: Add [R], [W], or [B].
auto replace:
match: tgur
- replace: [T]: Add [G], [U], or [R] to your mana pool.
+ replace: [T]: Add [G], [U], or [R].
auto replace:
match: twbr
- replace: [T]: Add [W], [B], or [R] to your mana pool.
+ replace: [T]: Add [W], [B], or [R].
auto replace:
match: turg
- replace: [T]: Add [U], [R], or [G] to your mana pool.
+ replace: [T]: Add [U], [R], or [G].
auto replace:
match: tbgw
- replace: [T]: Add [B], [G], or [W] to your mana pool.
+ replace: [T]: Add [B], [G], or [W].
auto replace:
match: trwu
- replace: [T]: Add [R], [W], or [U] to your mana pool.
+ replace: [T]: Add [R], [W], or [U].
auto replace:
match: tgub
- replace: [T]: Add [G], [U], or [B] to your mana pool.
+ replace: [T]: Add [G], [U], or [B].
+#
+#Token creation
auto replace:
- match: WTD
- replace: When CARDNAME dies
+ match: TREASURE1
+ replace: Create a Treasure token. (It’s an artifact with “[T], Sacrifice this artifact: Add one mana of any color.”)
auto replace:
- match: WTT
- replace: Whenever CARDNAME becomes the target of a spell
+ match: TREASURE2
+ replace: Create two Treasure tokens. (They’re artifacts with “[T], Sacrifice this artifact: Add one mana of any color.”)
auto replace:
- match: ANYCARD
- replace: Search your library for a card and put that card into your hand. Then shuffle your library.
+ match: TREASURE3
+ replace: Create three Treasure tokens. (They’re artifacts with “[T], Sacrifice this artifact: Add one mana of any color.”)
auto replace:
- match: TUTOR
- replace: Search your library for a card, reveal it, and put it into your hand. Then shuffle your library.
\ No newline at end of file
+ match: TREASURE4
+ replace: Create four Treasure tokens. (They’re artifacts with “[T], Sacrifice this artifact: Add one mana of any color.”)
+auto replace:
+ match: TREASURE5
+ replace: Create five Treasure tokens. (They’re artifacts with “[T], Sacrifice this artifact: Add one mana of any color.”)
+auto replace:
+ match: TREASUREX
+ replace: Create X Treasure tokens. (They’re artifacts with “[T], Sacrifice this artifact: Add one mana of any color.”)
+auto replace:
+ match: FOOD1
+ replace: Create a Food token. (It’s an artifact with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: FOOD2
+ replace: Create two Food tokens. (They’re artifacts with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: FOOD3
+ replace: Create three Food tokens. (They’re artifacts with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: FOOD4
+ replace: Create four Food tokens. (They’re artifacts with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: FOOD5
+ replace: Create five Food tokens. (They’re artifacts with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: FOODX
+ replace: Create X Food tokens. (They’re artifacts with “[2], [T], Sacrifice this artifact: You gain 3 life.”)
+auto replace:
+ match: CLUE1
+ replace: Create a Clue token. (It's an artifact with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: CLUE2
+ replace: Create two Clue tokens. (They're artifacts with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: CLUE3
+ replace: Create three Clue tokens. (They're artifacts with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: CLUE4
+ replace: Create four Clue tokens. (They're artifacts with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: CLUE5
+ replace: Create five Clue tokens. (They're artifacts with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: CLUEX
+ replace: Create X Clue tokens. (They're artifacts with "[2], Sacrifice this artifact: Draw a card.")
+auto replace:
+ match: GOBLIN
+ replace: create a 1/1 red Goblin creature token.
+auto replace:
+ match: SOLDIER
+ replace: create a 1/1 white Soldier creature token.
+auto replace:
+ match: WARRIOR
+ replace: create a 1/1 white Warrior creature token.
+auto replace:
+ match: 11ELEMENTAL
+ replace: create a 1/1 red Elemental creature token.
+auto replace:
+ match: 31ELEMENTAL
+ replace: create a 3/1 red Elemental creature token.
+auto replace:
+ match: SCION
+ replace: create a 1/1 colorless Eldrazi Scion creature token with "Sacrifice this creature: Add [C]."
+auto replace:
+ match: SPAWN
+ replace: create a 0/1 colorless Eldrazi Spawn creature token with "Sacrifice this creature: Add [C]."
+auto replace:
+ match: BEAST
+ replace: create a 3/3 green Beast creature token.
+auto replace:
+ match: WOLF
+ replace: create a 2/2 green Wolf creature token.
+auto replace:
+ match: ZOMBIE
+ replace: create a 2/2 black Zombie creature token.
+auto replace:
+ match: WVAMPIRE
+ replace: create a 1/1 white Vampire creature token.
+auto replace:
+ match: DINOSAUR
+ replace: create a 3/3 green Dinosaur creature token with trample.
+auto replace:
+ match: THOPTER
+ replace: create a 1/1 colorless Thopter artifact creature token with flying.
+auto replace:
+ match: SERVO
+ replace: create a 1/1 colorless Servo artifact creature token.
+auto replace:
+ match: ANGEL
+ replace: create a 4/4 white Angel creature token with flying.
+auto replace:
+ match: 44DRAGON
+ replace: create a 4/4 red Dragon creature token with flying.
+auto replace:
+ match: 55DRAGON
+ replace: create a 5/5 red Dragon creature token with flying.
+auto replace:
+ match: WSPIRIT
+ replace: create a 1/1 white Spirit creature token with flying.
+auto replace:
+ match: CSPIRIT
+ replace: create a 1/1 colorless Spirit creature token.
+auto replace:
+ match: PLANT
+ replace: create a 0/1 green Plant creature token.
+auto replace:
+ match: SAPROLING
+ replace: create a 1/1 green Saproling creature token.
+auto replace:
+ match: MONK
+ replace: create a 1/1 white Monk creature token with prowess.
+auto replace:
+ match: GERM
+ replace: create a 0/0 black Germ creature token.
+auto replace:
+ match: WURM
+ replace: Create a 5/5 green Wurm creature token with trample.
+auto replace:
+ match: SQUIRREL
+ replace: create a 1/1 green Squirrel creature token.
+auto replace:
+ match: CENTAUR
+ replace: create a 3/3 green Centaur creature token.
+auto replace:
+ match: ELFWAR
+ replace: create a 1/1 green Elf Warrior creature token.
+auto replace:
+ match: ELFDRUID
+ replace: create a 1/1 green Elf Druid creature token with “[T]: Add [G].”
+auto replace:
+ match: INSECT
+ replace: create a 1/1 green Insect creature token.
+auto replace:
+ match: MERFOLK
+ replace: create a 1/1 blue Merfolk creature token with hexproof.
+auto replace:
+ match: KNIGHT
+ replace: create a 2/2 white Knight creature token with vigilance.
+auto replace:
+ match: BIRD
+ replace: create a 1/1 white Bird creature token with flying.
+auto replace:
+ match: KORALLY
+ replace: create a 1/1 white Kor Ally creature token.
+auto replace:
+ match: KORSOLDIER
+ replace: create a 1/1 white Kor Soldier creature token.
+auto replace:
+ match: DRAKE
+ replace: create a 2/2 blue Drake creature token with flying.
+auto replace:
+ match: ELDRAZIHORROR
+ replace: create a 3/2 colorless Eldrazi Horror creature token.
+#
+#Coding
+auto replace:
+ match: CELSEP
+ replace: {if has_pt() then "this creature" else "this permanent"}
\ No newline at end of file
diff --git a/data/magic.mse-game/card_fields b/data/magic.mse-game/card_fields
index a4289c55..90b793b8 100644
--- a/data/magic.mse-game/card_fields
+++ b/data/magic.mse-game/card_fields
@@ -14,6 +14,8 @@ card field:
choice: flip
choice: split
choice: fuse split
+ choice: adventure
+ choice: aftermath
choice: double faced
choice: planeswalker
choice: shifted
@@ -26,6 +28,7 @@ card field:
choice: masterpiece
choice: nightbreak
choice: plane card
+ choice: saga
script:
stylesheet # updates when the style changes
card_shape() # determined by the style
@@ -40,7 +43,7 @@ card field:
card list column: 1
card list width: 150
description: The name of the card
- script: if contains(card.shape, match:"split") or contains(card.shape, match:"flip") or contains(card.shape, match:"double faced") then card.name + " // " + card.name_2 else card.name
+ script: if has_two_names() then card.name + " // " + card.name_2 else card.name
############################# Background stuff
card field:
type: color
@@ -54,7 +57,7 @@ card field:
color: rgb(255,255,255)
choice:
name: silver
- color: rgb(128,128,128)
+ color: rgb(200,200,200)
choice:
name: gold
color: rgb(200,180,0)
@@ -108,7 +111,14 @@ card field:
card list visible: false
identifying: true
show statistics: false
+ script: name_checker(value)
description: The name of the card
+card field:
+ type: text
+ name: alias
+ card list visible: false
+ show statistics: false
+ description: The alias of the card
card field:
type: text
name: casting cost
@@ -155,12 +165,6 @@ card field:
choice: eldrazi
description: On transforming cards, is this the day or the night side?
show statistics: false
-card field:
- type: text
- name: dfc switch
- default: card_number()
- description: On transforming cards, is this the front or the back side?
- show statistics: false
card field:
type: multiple choice
name: indicator
@@ -270,7 +274,7 @@ card field:
card field:
type: text
name: rule text
- script: text_filter(input: value, card_name: card.name)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"text")
show statistics: false
multi line: true
description: The rules text for the card
@@ -287,9 +291,16 @@ card field:
multi line: true
save value: false
show statistics: false
+ position hint: 105
script:
- combined_editor(field1: card.rule_text, separator: "\n", field2: card.flavor_text)
+ if mainframe_walker() then
+ mainframe_walker_text_script()
+ else if alt_text() then
+ alt_text_script()
+ else
+ combined_editor(field1: card.rule_text, separator: "\n", field2: card.flavor_text)
description: The rules and flavor text for the card; use up and down arrows to switch
+######################### Watermark
card field:
type: choice
name: watermark
@@ -297,33 +308,110 @@ card field:
position hint: 200
include file: /magic-watermarks.mse-include/watermark-names
description: A watermark for below the textbox, this can be a big mana symbol used on basic lands, or a guild symbol
-############################# Loyalty
+###############################Leveler textboxes
card field:
type: text
- name: loyalty
- icon: stats/toughness.png
- position hint: 59
- description: The initial loyalty of a planeswalker
+ name: level 0
+ description: The zeroth level of a creature
+ show statistics: false
card field:
type: text
name: loyalty cost 1
show statistics: false
description: The loyalty cost for the first ability of a planeswalker
+card field:
+ type: text
+ name: level 1
+ description: The first level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 1 text
+ default: if transfer_levels() then card.rule_text else ""
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv1")
+ show statistics: false
+ multi line: true
+ position hint: 110
+ description: The first level text for the card
card field:
type: text
name: loyalty cost 2
show statistics: false
description: The loyalty cost for the second ability of a planeswalker
+card field:
+ type: text
+ name: level 2
+ description: The second level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 2 text
+ default: if transfer_levels() then card.rule_text_2 else ""
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv2")
+ show statistics: false
+ multi line: true
+ position hint: 120
+ description: The second level text for the card
card field:
type: text
name: loyalty cost 3
show statistics: false
description: The loyalty cost for the third ability of a planeswalker
+card field:
+ type: text
+ name: level 3
+ description: The third level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 3 text
+ default: card.rule_text_3
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv3")
+ show statistics: false
+ multi line: true
+ position hint: 130
+ description: The third level text for the card
card field:
type: text
name: loyalty cost 4
show statistics: false
description: The loyalty cost for the fourth ability of a planeswalker
+card field:
+ type: text
+ name: level 4
+ description: The fourth level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 4 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv4")
+ show statistics: false
+ multi line: true
+ position hint: 4
+ description: The fourth level text for the card
+############################# Notes
+card field:
+ type: text
+ name: sorted notes
+ multi line: true
+ save value: false
+ show statistics: false
+ script: card.notes
+ description: A mirror of card notes to make it sortable.
+card field:
+ type: text
+ name: custom index
+ save value: false
+ show statistics: false
+ position hint: 900
+ script: custom_index()
+############################# Loyalty
+card field:
+ type: text
+ name: loyalty
+ icon: stats/toughness.png
+ position hint: 59
+ description: The initial loyalty of a planeswalker
card field:
type: text
name: loyalty cost 5
@@ -344,32 +432,6 @@ card field:
name: loyalty cost 8
show statistics: false
description: The loyalty cost for the eighth ability of a planeswalker
-############################# Levels
-card field:
- type: text
- name: level 0
- description: The zeroth level of a creature
- show statistics: false
-card field:
- type: text
- name: level 1
- description: The first level of a card
- show statistics: false
-card field:
- type: text
- name: level 2
- description: The second level of a card
- show statistics: false
-card field:
- type: text
- name: level 3
- description: The third level of a card
- show statistics: false
-card field:
- type: text
- name: level 4
- description: The fourth level of a card
- show statistics: false
############################# PT
card field:
type: text
@@ -445,6 +507,13 @@ card field:
editable: true
save value: true
show statistics: false
+card field:
+ type: text
+ name: card code text 2
+ default: card.card_code_text
+ editable: true
+ save value: true
+ show statistics: false
############################# Copyright stuff
card field:
type: text
@@ -513,9 +582,9 @@ card field:
type: radio
choice:
name: reversed
- enabled: { card_color_color_count(card.card_color) >= 2 and not chosen(choice:"overlay",card.card_color_2) }
+ enabled: { card_color_color_count(card.card_color_2) >= 2 and not chosen(choice:"overlay",card.card_color_2) }
script: card_color_filter(value)
- default: card_color(casting_cost: card.casting_cost_2, type: card.super_type_2, rules_text: card.rule_text_2, watermark: card.watermark_2, card_name: card.name_2, default: card.card_color)
+ default: card_color(casting_cost: card.casting_cost_2, type: card.super_type_2, rules_text: card.rule_text_2, watermark: card.watermark_2, card_name: card.name_2, default: "colorless")
show statistics: false
description: The frame of a card
card field:
@@ -523,13 +592,24 @@ card field:
name: name 2
identifying: true
show statistics: false
- description: The name of a card
+ description: The second name of a card
+card field:
+ type: text
+ name: alias 2
+ show statistics: false
+ description: The second alias of a card
card field:
type: text
name: name 3
identifying: true
show statistics: false
- description: The name of a card
+ description: The third name of a card
+card field:
+ type: text
+ name: alias 3
+ identifying: true
+ show statistics: false
+ description: The third alias of a card
card field:
type: text
name: casting cost 2
@@ -678,21 +758,6 @@ card field:
script: card.rarity
editable: false
show statistics: false
-card field:
- type: choice
- name: rarity 3
- icon: stats/rarity.png
- choice: basic land
- choice: common
- choice: uncommon
- choice: rare
- choice: mythic rare
- choice: special
- choice: masterpiece
- initial: common
- # Third rarity is not locked
- editable: true
- show statistics: false
card field:
type: multiple choice
name: indicator 2
@@ -737,35 +802,35 @@ card field:
card field:
type: text
name: rule text 2
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"text2")
show statistics: false
multi line: true
description: The rules text of the card
card field:
type: text
name: rule text 3
- script: text_filter(input: value, card_name: card.name)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"text3")
show statistics: false
multi line: true
description: The rules text of the card
card field:
type: text
name: rule text 4
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"text4")
show statistics: false
multi line: true
description: The rules text of the card
card field:
type: text
name: rule text 5
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"text5")
show statistics: false
multi line: true
description: The rules text of the card
card field:
type: text
name: rule text 6
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"text6")
show statistics: false
multi line: true
description: The rules text of the card
@@ -781,6 +846,7 @@ card field:
script: flavor_text_filter(value)
multi line: true
show statistics: false
+
card field:
type: text
name: text 2
@@ -788,7 +854,12 @@ card field:
save value: false
show statistics: false
script:
- combined_editor(field1: card.rule_text_2, separator: "\n", field2: card.flavor_text_2)
+ if mainframe_walkerb() then
+ mainframe_walker_text_scriptb()
+ else if alt_textb() then
+ alt_text_scriptb()
+ else
+ combined_editor(field1: card.rule_text_2, separator: "\n", field2: card.flavor_text_2)
description: The rules and flavor text of the card
card field:
type: text
@@ -937,71 +1008,105 @@ card field:
save value: false
script: (if is_masterpiece() then set.masterpiece_set_code else set.set_code) + " • " + set.set_language
show statistics: false
-#################################Leveler textboxes
-card field:
- type: text
- name: level 1 text
- default: card.rule_text
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text for the card
-card field:
- type: text
- name: level 2 text
- default: card.rule_text_2
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text for the card
-card field:
- type: text
- name: level 3 text
- default: card.rule_text_3
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text for the card
-card field:
- type: text
- name: level 4 text
- default: card.rule_text_3
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text for the card
+########################back Leveler textboxes
card field:
type: text
name: level 5 text
- default: card.rule_text_2
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv5")
show statistics: false
multi line: true
- description: The rules text for the card
+ description: The fifth level text for the card
card field:
type: text
name: level 6 text
- default: card.rule_text_6
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv6")
show statistics: false
multi line: true
- description: The rules text for the card
+ description: The sixth level text for the card
card field:
type: text
name: level 7 text
- default: card.rule_text_6
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv7")
show statistics: false
multi line: true
- description: The rules text for the card
+ description: The seventh level text for the card
card field:
type: text
name: level 8 text
- default: card.rule_text_6
- script: text_filter(input: value, card_name: card.name_2)
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv8")
show statistics: false
multi line: true
- description: The rules text for the card
+ description: The eighth level text for the card
+card field:
+ type: text
+ name: level 9 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv9")
+ show statistics: false
+ multi line: true
+ description: The ninth level text for the card
+card field:
+ type: text
+ name: level 10 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv10")
+ show statistics: false
+ multi line: true
+ description: The tenth level text for the card
+card field:
+ type: text
+ name: level 11 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv11")
+ show statistics: false
+ multi line: true
+ description: The eleventh level text for the card
+card field:
+ type: text
+ name: level 12 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias != "" then card.alias else card.name, margin_code:"lv12")
+ show statistics: false
+ multi line: true
+ description: The twelvth level text for the card
+card field:
+ type: text
+ name: level 13 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv13")
+ show statistics: false
+ multi line: true
+ description: The thirteenth level text for the card
+card field:
+ type: text
+ name: level 14 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv14")
+ show statistics: false
+ multi line: true
+ description: The fourteenth level text for the card
+card field:
+ type: text
+ name: level 15 text
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"lv15")
+ show statistics: false
+ multi line: true
+ description: The fifteenth level text for the card
+card field:
+ type: text
+ name: level 5
+ description: The fifth level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 6
+ description: The sixth level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 7
+ description: The seventh level of a card
+ show statistics: false
+card field:
+ type: text
+ name: level 8
+ description: The eighth level of a card
+ show statistics: false
+
card field:
type: text
name: power 4
@@ -1089,6 +1194,64 @@ card field:
card list name: P/T6
show statistics: false
description: Power/Toughness of a creature
+card field:
+ type: text
+ name: power 7
+ icon: stats/power.png
+ show statistics: false
+ script: type_over_pt(value)
+ description: The power of a creature
+card field:
+ type: text
+ name: toughness 7
+ icon: stats/toughness.png
+ show statistics: false
+ description: The toughness of a creature
+card field:
+ type: text
+ name: pt 7
+ save value: false
+ script:
+ combined_editor(
+ field1: card.power_7,
+ separator: language().pt_separator,
+ field2: card.toughness_7,
+ soft_before_empty: true,
+ hide_when_empty: true
+ )
+ card list width: 50
+ card list name: P/T7
+ show statistics: false
+ description: Power/Toughness of a creature
+card field:
+ type: text
+ name: power 8
+ icon: stats/power.png
+ show statistics: false
+ script: type_over_pt(value)
+ description: The power of a creature
+card field:
+ type: text
+ name: toughness 8
+ icon: stats/toughness.png
+ show statistics: false
+ description: The toughness of a creature
+card field:
+ type: text
+ name: pt 8
+ save value: false
+ script:
+ combined_editor(
+ field1: card.power_8,
+ separator: language().pt_separator,
+ field2: card.toughness_8,
+ soft_before_empty: true,
+ hide_when_empty: true
+ )
+ card list width: 50
+ card list name: P/T8
+ show statistics: false
+ description: Power/Toughness of a creature
card field:
type: text
name: cmc
@@ -1111,7 +1274,48 @@ card field:
name: mainframe image 2
show statistics: false
description: An extra image of the card
-
+card field:
+ type: text
+ name: special text
+ show statistics: false
+ script: special_text()
+ save value: true
+ description: Full text for exporting.
+card field:
+ type: text
+ name: special text 2
+ show statistics: false
+ script: special_text2()
+ save value: true
+ description: Full text for exporting.
+card field:
+ type: text
+ name: time modified
+ show statistics: false
+ save value: false
+ script: card.time_modified
+card field:
+ type: text
+ name: time created
+ show statistics: false
+ save value: false
+ script: card.time_created
+card field:
+ type: text
+ name: chapter text
+ show statistics: false
+ multi line: true
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name, margin_code:"unknown")
+ default: if not a_saga() then "" else if card.rule_text != "" then card.rule_text else "(" + saga_reminder() + ")"
+ description: The saga reminder text
+card field:
+ type: text
+ name: chapter text 2
+ show statistics: false
+ multi line: true
+ script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"unknown")
+ default: if not b_saga() then "" else "(" + saga_reminderb() + ")"
+ description: The saga reminder text
############################# Exposing Internal Fields?
diff --git a/data/magic.mse-game/card_fields - copy b/data/magic.mse-game/card_fields - copy
deleted file mode 100644
index 0d3c8dba..00000000
--- a/data/magic.mse-game/card_fields - copy
+++ /dev/null
@@ -1,786 +0,0 @@
-############################################################## Card fields
-
-############################# Automatic fields
-
-# The 'shape' of the card (flip, split, etc.)
-card field:
- type: choice
- name: shape
- save value: false
- show statistics: false
- editable: false
- choice: normal
- choice: token
- choice: flip
- choice: split
- choice: fuse split
- choice: double faced
- choice: planeswalker
- choice: shifted
- choice: rulestip
- choice: leveler
- choice: augment
- choice: counter
- choice: checklist
- choice: emblem
- script:
- stylesheet # indicate that this value should be updated when the stylesheet changes
- card_shape() # determined by the style
-card field:
- type: text
- name: full name
- save value: false
- show statistics: false
- editable: false
- card list visible: true
- card list name: Name
- card list column: 1
- card list width: 150
- description: The name of the card
- script: if contains(card.shape, match:"split") or contains(card.shape, match:"flip") or contains(card.shape, match:"double faced") then card.name + " // " + card.name_2 else card.name
-############################# Background stuff
-card field:
- type: color
- name: border color
- default: set.border_color
- choice:
- name: black
- color: rgb(0,0,0)
- choice:
- name: white
- color: rgb(255,255,255)
- choice:
- name: silver
- color: rgb(128,128,128)
- choice:
- name: gold
- color: rgb(200,180,0)
- show statistics: false
- description: The border of the card; can be any solid color.
-card field:
- type: multiple choice
- name: card color
- empty choice: colorless
- choice: white
- choice: blue
- choice: black
- choice: red
- choice:
- name: green
- line below: true
- choice: artifact
- choice: land
- choice: multicolor
- choice:
- name: hybrid
- enabled: { card_color_color_count(card.card_color) >= 2 }
- line below: true
- choice:
- name: horizontal
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: vertical
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: radial
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: overlay
- enabled: { card_color_color_count(card.card_color) == 2 and chosen(choice:"hybrid",card.card_color) }
- type: radio
- choice:
- name: reversed
- enabled: { card_color_color_count(card.card_color) >= 2 and not chosen(choice:"overlay",card.card_color) }
- script: card_color_filter(value)
- default: card_color(casting_cost: card.casting_cost, rules_text: card.rule_text, type: card.super_type, watermark: card.watermark, card_name: card.name, default: "colorless")
- show statistics: false
- description: The frame of the card, used to indicate card color.
-
-############################# Name line
-card field:
- type: text
- name: name
- card list visible: false
- identifying: true
- show statistics: false
- description: The name of the card
-card field:
- type: text
- name: casting cost
- icon: stats/casting_cost.png
- position hint: 1
- script: mana_filter(value)
- card list visible: true
- card list column: 2
- card list alignment: right
- card list width: 50
- card list name: CC
- description: The casting cost of the card
-card field:
- type: choice
- name: card symbol
- position hint: 10
- icon: stats/card_symbol.png
- choice: none
- choice: tombstone
- description: Symbol for this card (tombstone)
-card field:
- type: choice
- name: type symbol
- default: typesymbol_type(type: card.super_type)
- card list visible: false
- show statistics: false
- choice: artifact
- choice: creature
- choice: enchantment
- choice: instant
- choice: land
- choice: multitype
- choice: planeswalker
- choice: sorcery
- choice: none
- description: The card type symbol for this card
-card field:
- type: choice
- name: transformation
- choice: day
- choice: night
- description: On transforming cards, is this the day or the night side?
- show statistics: false
-card field:
- type: multiple choice
- name: indicator
- empty choice: colorless
- choice: white
- choice: blue
- choice: black
- choice: red
- choice:
- name: green
- line below: true
- choice: artifact
- choice: land
- choice: multicolor
- choice:
- name: hybrid
- enabled: { card_color_color_count(card.card_color) >= 2 }
- line below: true
- choice:
- name: horizontal
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: vertical
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: radial
- enabled: { card_color_color_count(card.card_color) >= 2 }
- type: radio
- choice:
- name: overlay
- enabled: { card_color_color_count(card.card_color) == 2 and chosen(choice:"hybrid",card.card_color) }
- type: radio
- choice:
- name: reversed
- enabled: { card_color_color_count(card.card_color) >= 2 and not chosen(choice:"overlay",card.card_color) }
- script: card_color_filter(value)
- default: card.card_color
- show statistics: false
- description: The color indicator of the card, used to indicate card color.
-
-############################# Image
-card field:
- type: image
- name: image
- show statistics: false
- description: The image of the card
-
-############################# Card type
-card field:
- type: text
- name: super type
- icon: stats/card_type.png
- position hint: 30
- script: super_type_filter(value)
- show statistics: false
-card field:
- type: text
- name: sub type
- icon: stats/creature_type.png
- position hint: 31
- script: sub_type_filter(value, type:card.super_type)
-card field:
- type: text
- name: type
- show statistics: false
- save value: false
- script:
- # Either just supertype, or subtype - supertype
- combined_editor(
- field1: card.super_type,
- separator: language().type_separator,
- field2: card.sub_type,
- soft_before_empty: true,
- hide_when_empty: true
- )
- card list visible: true
- card list column:4
- description: The type of this card, type - to go the sub type
-card field:
- type: choice
- name: rarity
- icon: stats/rarity.png
- position hint: 100
- choice: basic land
- choice: common
- choice: uncommon
- choice: rare
- choice: mythic rare
- choice: special
- initial: common
- card list visible: true
- card list column: 6
- description: The rarity of the card, to edit the symbol switch to the 'set info' tab
- choice colors:
- basic land: rgb(109,62,39)
- common: rgb(33,33,33)
- uncommon: rgb(224,224,224)
- mythic rare: rgb(202, 49, 35)
- rare: rgb(255,207,52)
- special: rgb(190,0,255)
-
-############################# Text box
-card field:
- type: text
- name: rule text
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text for the card
-card field:
- type: text
- name: flavor text
- script: flavor_text_filter(value)
- show statistics: false
- multi line: true
- description: The flavor text for the card
-card field:
- type: text
- name: text
- multi line: true
- save value: false
- show statistics: false
- script:
- combined_editor(field1: card.rule_text, separator: "\n", field2: card.flavor_text)
- description: The rules and flavor text for the card; use up and down arrows to switch
-card field:
- type: choice
- name: watermark
- icon: stats/watermark.png
- position hint: 200
- include file: /magic-watermarks.mse-include/watermark-names
- description: A watermark for below the textbox, this can be a big mana symbol used on basic lands, or a guild symbol
-
-############################# Loyalty
-card field:
- type: text
- name: loyalty
- icon: stats/toughness.png
- position hint: 59
- description: The initial loyalty of a planeswalker
-card field:
- type: text
- name: loyalty cost 1
- show statistics: false
- description: The loyalty cost for the first ability of a planeswalker
-card field:
- type: text
- name: loyalty cost 2
- show statistics: false
- description: The loyalty cost for the second ability of a planeswalker
-card field:
- type: text
- name: loyalty cost 3
- show statistics: false
- description: The loyalty cost for the third ability of a planeswalker
-card field:
- type: text
- name: loyalty cost 4
- show statistics: false
- description: The loyalty cost for the fourth ability of a planeswalker
- default: if card.power_2 !="" then card.power_2 else card.power #For back compatibility with past templates. Take out a couple versions after 0.3.8
-card field:
- type: text
- name: loyalty cost 5
- show statistics: false
- description: The loyalty cost for the fifth ability of a planeswalker
- default: card.toughness_2 #For back compatibility with past templates. Take out a couple versions after 0.3.8
-card field:
- type: text
- name: loyalty cost 6
- show statistics: false
- description: The loyalty cost for the sixth ability of a planeswalker
-card field:
- type: text
- name: loyalty cost 7
- show statistics: false
- description: The loyalty cost for the seventh ability of a planeswalker
-card field:
- type: text
- name: loyalty cost 8
- show statistics: false
- description: The loyalty cost for the eighth ability of a planeswalker
-############################# Levels
-card field:
- type: text
- name: level 1
- description: The first level of a creature
- show statistics: false
-card field:
- type: text
- name: level 2
- description: The second level of a creature
- show statistics: false
-############################# PT
-card field:
- type: text
- name: power
- icon: stats/power.png
- show statistics: false
- script: type_over_pt(value)
- description: The power of a creature
-card field:
- type: text
- name: toughness
- show statistics: false
- icon: stats/toughness.png
- description: The toughness of a creature
-card field:
- type: text
- name: pt
- save value: false
- script:
- combined_editor(
- field1: card.power,
- separator: language().pt_separator,
- field2: card.toughness,
- soft_before_empty: true,
- hide_when_empty: true
- )
- card list visible: true
- card list column: 5
- card list width: 50
- card list name: P/T
- description: Power/toughness of a creature
- show statistics: false
-
-############################# Card sorting / numbering
-card field:
- type: text
- name: card number
- save value: false
- script: card_number() + "/" + card_count()
- sort script: rarity_sort() + card.card_number
- card list visible: true
- card list column: 10
- card list width: 50
- card list name: #
- card list alignment: right
- editable: false
- show statistics: false
-card field:
- type: text
- name: card number m15
- save value: false
- script: card_number_m15() + "/" + card_count_m15()
- sort script: rarity_sort() + card.card_number
- card list visible: false
- editable: false
- show statistics: false
-card field:
- type: text
- name: custom card number
- save value: true
- editable: true
- show statistics: false
-card field:
- type: text
- name: set code
- editable: false
- save value: false
- script: set.set_code + " ⋅ " + set.set_language
- show statistics: false
-card field:
- type: text
- name: card code text
- editable: true
- save value: true
- show statistics: false
-############################# Copyright stuff
-card field:
- type: text
- name: illustrator
- icon: stats/illustrator.png
- position hint: 210
- default: set.artist
- description: Illustrator of this card, the default value can be changed on the 'set info' tab
-card field:
- type: text
- name: copyright
- default: set.copyright
- show statistics: false
-card field:
- type: text
- name: copyright line
- save value: false
- show statistics: false
- script:
- if set.automatic_card_numbers then
- combined_editor(field1: card.copyright, separator: " ", field2: card.card_number)
- else
- forward_editor(field: card.copyright)
- description: Copyright of this card and cardnumber, the default value can be changed on the 'set info' tab
-
-############################################################## Duplicate fields (split/flip cards)
-# Based on flip templates by Wolfwood
-# These are a direct copy of the fields above, only with a 2
-
-
-card field:
- type: multiple choice
- name: card color 2
- icon: stats/card_color.png
- empty choice: colorless
- choice: white
- choice: blue
- choice: black
- choice: red
- choice:
- name: green
- line below: true
- choice: artifact
- choice: land
- choice: multicolor
- choice:
- name: hybrid
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- line below: true
- choice:
- name: horizontal
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: vertical
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: radial
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: overlay
- enabled: { card_color_color_count(card.card_color_2) == 2 and chosen(choice:"hybrid",card.card_color_2) }
- type: radio
- choice:
- name: reversed
- enabled: { card_color_color_count(card.card_color) >= 2 and not chosen(choice:"overlay",card.card_color_2) }
- script: card_color_filter(value)
- default: card_color(casting_cost: card.casting_cost_2, type: card.super_type_2, rules_text: card.rule_text_2, watermark: card.watermark_2, card_name: card.name_2, default: card.card_color)
- show statistics: false
- description: The frame of a card
-card field:
- type: text
- name: name 2
- identifying: true
- show statistics: false
- description: The name of a card
-card field:
- type: text
- name: casting cost 2
- icon: stats/casting_cost.png
- script: mana_filter(value)
- card list alignment: right
- card list width: 50
- card list name: CC
- show statistics: false
- description: The casting cost of a card
-card field:
- type: text
- name: casting cost 3
- icon: stats/casting_cost.png
- script: mana_filter(value)
- show statistics: false
- description: The casting cost of a card
-card field:
- type: choice
- name: card symbol 2
- icon: stats/card_symbol.png
- choice: none
- choice: tombstone
- show statistics: false
- description: The card symbol of the card (Tombstone)
-card field:
- type: choice
- name: type symbol 2
- default: typesymbol_type(type: card.super_type_2)
- card list visible: false
- show statistics: false
- choice: artifact
- choice: creature
- choice: enchantment
- choice: instant
- choice: land
- choice: multitype
- choice: planeswalker
- choice: sorcery
- choice: none
- description: The card type symbol for this card
-card field:
- type: choice
- name: transformation 2
- choice: night
- choice: day
- description: On transforming cards, is this the day or the night side?
- show statistics: false
-card field:
- type: image
- name: image 2
- show statistics: false
- description: The image of the card
-card field:
- type: text
- name: super type 2
- icon: stats/creature_type.png
- show statistics: false
- script: super_type_filter(value)
-card field:
- type: text
- name: sub type 2
- icon: stats/creature_type.png
- show statistics: false
- script: sub_type_filter(value, type:card.super_type_2)
-card field:
- type: text
- name: type 2
- save value: false
- script:
- combined_editor(
- field1: card.super_type_2,
- separator: language().type_separator,
- field2: card.sub_type_2,
- soft_before_empty: true,
- hide_when_empty: true
- )
- show statistics: false
- description: The type of the card; type "-" to go from type to subtype
-card field:
- type: choice
- name: rarity 2
- icon: stats/rarity.png
- choice: basic land
- choice: common
- choice: uncommon
- choice: rare
- choice: mythic rare
- choice: special
- initial: common
- # Both rarities will be the same
- script: card.rarity
- editable: false
- show statistics: false
-card field:
- type: multiple choice
- name: indicator 2
- empty choice: colorless
- choice: white
- choice: blue
- choice: black
- choice: red
- choice:
- name: green
- line below: true
- choice: artifact
- choice: land
- choice: multicolor
- choice:
- name: hybrid
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- line below: true
- choice:
- name: horizontal
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: vertical
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: radial
- enabled: { card_color_color_count(card.card_color_2) >= 2 }
- type: radio
- choice:
- name: overlay
- enabled: { card_color_color_count(card.card_color_2) == 2 and chosen(choice:"hybrid",card.card_color_2) }
- type: radio
- choice:
- name: reversed
- enabled: { card_color_color_count(card.card_color_2) >= 2 and not chosen(choice:"overlay",card.card_color_2) }
- script: card_color_filter(value)
- default: card.card_color_2
- show statistics: false
- description: The color indicator of the card, used to indicate card color.
-card field:
- type: text
- name: rule text 2
- script: text_filter(input: value, card_name: card.name_2)
- show statistics: false
- multi line: true
- description: The rules text of the card
-card field:
- type: text
- name: rule text 3
- script: text_filter(input: value, card_name: card.name)
- show statistics: false
- multi line: true
- description: The rules text of the card
-card field:
- type: text
- name: rule text 4
- script: text_filter(input: value, card_name: card.name_2)
- show statistics: false
- multi line: true
- description: The rules text of the card
-card field:
- type: text
- name: rule text 5
- script: text_filter(input: value, card_name: card.name_2)
- show statistics: false
- multi line: true
- description: The rules text of the card
-card field:
- type: text
- name: rule text 6
- script: text_filter(input: value, card_name: card.name_2)
- show statistics: false
- multi line: true
- description: The rules text of the card
-card field:
- type: text
- name: flavor text 2
- script: flavor_text_filter(value)
- multi line: true
- show statistics: false
-card field:
- type: text
- name: text 2
- multi line: true
- save value: false
- show statistics: false
- script:
- combined_editor(field1: card.rule_text_2, separator: "\n", field2: card.flavor_text_2)
- description: The rules and flavor text of the card
-card field:
- type: choice
- name: watermark 2
- include file: /magic-watermarks.mse-include/watermark-names
- icon: stats/watermark.png
- show statistics: false
- description: A watermark for below the textbox, this can be a big mana symbol used on basic lands, a special symbol, or a guild symbol
-card field:
- type: text
- name: loyalty 2
- icon: stats/toughness.png
- show statistics: false
- description: The initial loyalty of a planeswalker
-card field:
- type: text
- name: power 2
- icon: stats/power.png
- show statistics: false
- script: type_over_pt(value)
- description: The power of a creature
-card field:
- type: text
- name: toughness 2
- icon: stats/toughness.png
- show statistics: false
- description: The toughness of a creature
-card field:
- type: text
- name: pt 2
- save value: false
- script:
- combined_editor(
- field1: card.power_2,
- separator: language().pt_separator,
- field2: card.toughness_2,
- soft_before_empty: true,
- hide_when_empty: true
- )
- card list width: 50
- card list name: P/T2
- show statistics: false
- description: Power/Toughness of a creature
-card field:
- type: text
- name: power 3
- icon: stats/power.png
- show statistics: false
- script: type_over_pt(value)
- description: The power of a creature
-card field:
- type: text
- name: toughness 3
- icon: stats/toughness.png
- show statistics: false
- description: The toughness of a creature
-card field:
- type: text
- name: pt 3
- save value: false
- script:
- combined_editor(
- field1: card.power_3,
- separator: language().pt_separator,
- field2: card.toughness_3,
- soft_before_empty: true,
- hide_when_empty: true
- )
- card list width: 50
- card list name: P/T3
- show statistics: false
- description: Power/Toughness of a creature
-card field:
- type: text
- name: illustrator 2
- icon: stats/illustrator.png
- default: set.artist
- show statistics: false
- description: The illustrator of the image
-card field:
- type: text
- name: copyright 2
- default: set.copyright
- show statistics: false
-card field:
- type: text
- name: copyright line 2
- save value: false
- show statistics: false
- script:
- if set.automatic_card_numbers then
- combined_editor(field1: card.copyright_2, separator: " ", field2: card.card_number)
- else
- forward_editor(field: card.copyright_2)
- description: The copyright and card number of the card
-card field:
- type: text
- name: set code 2
- editable: false
- save value: false
- script: set.set_code + " ⋅ " + set.set_language
- show statistics: false
diff --git a/data/magic.mse-game/game b/data/magic.mse-game/game
index 5a03b335..b0e5c924 100644
--- a/data/magic.mse-game/game
+++ b/data/magic.mse-game/game
@@ -5,7 +5,7 @@ installer group: magic/game files
icon: card-back.png
position hint: 01
-version: 2016-01-11
+version: 2020-04-25
depends on:
package: magic-blends.mse-include
version: 2014-06-25
@@ -20,13 +20,13 @@ init script: include file: script
############################################################## Lots of lists
################## There be dragons here. -Liosan ##########################
-
include file: card_fields
include file: set_fields
include file: statistics
include file: add_cards_scripts
include file: packs
include file: keywords
+include file: keywords_custom
include file: word_lists
include file: auto_replace
diff --git a/data/magic.mse-game/game mainframe b/data/magic.mse-game/game mainframe
deleted file mode 100644
index e2ac2f56..00000000
--- a/data/magic.mse-game/game mainframe
+++ /dev/null
@@ -1,52 +0,0 @@
-mse version: 2.0.0
-short name: Magic
-full name: Magic the Gathering
-installer group: magic/game files
-icon: card-back.png
-position hint: 01
-
-version: 2016-01-11
-depends on:
- package: magic-blends.mse-include
- version: 2014-06-25
-depends on:
- package: magic-watermarks.mse-include
- version: 2007-09-23
-
-############################################################## The script
-
-init script: include file: mainframe_scripts
-
-############################################################## Lots of lists
-
-################## There be dragons here. -Liosan ##########################
-
-include file: mainframe_card_fields
-include file: mainframe_set_fields
-include file: statistics
-include file: mainframe_patch
-include file: keywords
-include file: word_lists
-include file: auto_replace
-
-
-############################################################## Other stuff
-
-card list color script:
- input := card.card_color
- if input == "white" then rgb(156,130,90)
- else if input == "blue" then rgb(0,64,168)
- else if input == "black" then rgb(0,0,0)
- else if input == "red" then rgb(168,0,0)
- else if input == "green" then rgb(0,168,0)
- else (
- artifact := chosen(choice:"artifact")
- land := chosen(choice:"land")
- multi := chosen(choice:"multicolor")
- hybrid := chosen(choice:"hybrid")
- if land then rgb(109,62,39) # land
- else if multi and input != "artifact, multicolor" then rgb(130,110,0) # multicolor
- else if hybrid then rgb(115,0,160) # hybrid
- else if artifact then rgb(72,90,100) # artifact
- else rgb(119,83,83) # colorless
- )
diff --git a/data/magic.mse-game/game the backup b/data/magic.mse-game/game the backup
deleted file mode 100644
index aa373533..00000000
--- a/data/magic.mse-game/game the backup
+++ /dev/null
@@ -1,53 +0,0 @@
-mse version: 2.0.0
-short name: Magic
-full name: Magic the Gathering
-installer group: magic/game files
-icon: card-back.png
-position hint: 01
-
-version: 2016-01-11
-depends on:
- package: magic-blends.mse-include
- version: 2014-06-25
-depends on:
- package: magic-watermarks.mse-include
- version: 2007-09-23
-
-############################################################## The script
-
-init script: include file: script
-
-############################################################## Lots of lists
-
-################## There be dragons here. -Liosan ##########################
-
-include file: card_fields
-include file: set_fields
-include file: statistics
-include file: mainframe_patch
-include file: keywords
-include file: word_lists
-include file: add_cards_scripts
-include file: auto_replace
-
-
-############################################################## Other stuff
-
-card list color script:
- input := card.card_color
- if input == "white" then rgb(156,130,90)
- else if input == "blue" then rgb(0,64,168)
- else if input == "black" then rgb(0,0,0)
- else if input == "red" then rgb(168,0,0)
- else if input == "green" then rgb(0,168,0)
- else (
- artifact := chosen(choice:"artifact")
- land := chosen(choice:"land")
- multi := chosen(choice:"multicolor")
- hybrid := chosen(choice:"hybrid")
- if land then rgb(109,62,39) # land
- else if multi and input != "artifact, multicolor" then rgb(130,110,0) # multicolor
- else if hybrid then rgb(115,0,160) # hybrid
- else if artifact then rgb(72,90,100) # artifact
- else rgb(119,83,83) # colorless
- )
diff --git a/data/magic.mse-game/icons/language-br.png b/data/magic.mse-game/icons/language-br.png
new file mode 100644
index 00000000..9b1a5538
Binary files /dev/null and b/data/magic.mse-game/icons/language-br.png differ
diff --git a/data/magic.mse-game/icons/language-ru.png b/data/magic.mse-game/icons/language-ru.png
new file mode 100644
index 00000000..5aee4031
Binary files /dev/null and b/data/magic.mse-game/icons/language-ru.png differ
diff --git a/data/magic.mse-game/keyword fix/keywords b/data/magic.mse-game/keyword fix/keywords
deleted file mode 100644
index a0fd6a12..00000000
--- a/data/magic.mse-game/keyword fix/keywords
+++ /dev/null
@@ -1,1193 +0,0 @@
-
-############################################################## We have keywords
-
-has keywords: true
-
-############################################################## Keyword mode
-
-keyword mode:
- name: old
- description: Old keywords (Banding, Phasing, etc.)
-keyword mode:
- name: core
- description: Core set keywords (Flying, Haste, etc.)
-keyword mode:
- name: expert
- description: Expert set keywords (Cycling, Vanishing, etc.)
-keyword mode:
- name: pseudo
- description: Pseudo keyword / Ability words (Hellbent, Threshold, etc.)
-keyword mode:
- name: action
- description: Keyword actions, reminder text at end of line (Scry, Regenerate, etc.)
-keyword mode:
- is default: true
- name: custom
- description: Custom keywords
-
-############################################################## Keyword parameter types
-
-keyword parameter type:
- name: mana
- match: [HSCTQXYZI0-9WUBRG/|]+
- refer script:
- name: normal
- description: No changes made
- script: \{{input}\}
- refer script:
- name: converted mana cost
- description: Converts mana to number
- # "0" left in so users can easily see how to edit script.
- script: \{cmc({input})\}
- refer script:
- name: colored mana cost
- description: Converts mana to number of colored mana
- # "0" left in so users can easily see how to edit script.
- script: \{colored_mana({input})\}
-
-# By pichoro and bunnierein
-keyword parameter type:
- name: cost
- match: [ ][HSCTQXYZI0-9WUBRG/|]*|[-—][^(\n]*
- separator before is: [ —-]
- separator after is: [.]
- optional: false
- # note: the separator is part of match
- refer script:
- name: normal
- description: When using mana only costs, doesn't include anything extra in the reminder text
- script: \{{input}\}
- refer script:
- name: add "pay an additional " for mana costs
- description: When using mana only costs, words the reminder text as "pay an additional "
- script: \{for_mana_costs(add:"pay an additional ", {input})\}
- refer script:
- name: add "pay " for mana costs
- description: When using mana only costs, words the reminder text as "pay "
- script: \{for_mana_costs(add:"pay ", {input})\}
- separator script: long_dash()
-
-keyword parameter type:
- name: number
- match: [XYZ0-9]+
- refer script:
- name: normal
- description: (1,2,3)
- script: \{{input}\}
- refer script:
- name: as words
- description: (one, two, three)
- script: \{english_number({input})\}
- refer script:
- name: as words, use "a" for 1
- description: (a, two, three)
- script: \{english_number_a({input})\}
- refer script:
- name: as words, use "" for 1
- description: (, two, three)
- script: \{english_number_multiple({input})\}
- refer script:
- name: as ordinal words
- description: (first, second, third)
- script: \{english_number_ordinal({input})\}
-
-keyword parameter type:
- name: action
- match: [^(:\n]+
- separator after is: [.]
- reminder script: alternative_cost()
-
-keyword parameter type:
- name: one_word
- match: [A-Za-z0-9]+
-
-keyword parameter type:
- name: name
- match: [^(.:;\n—]+
- refer script:
- name: normal
- description: No changes made.
- script: \{{input}\}
- refer script:
- name: singular
- description: Removes plurality from words.
- script: \{english_singular({input})\}
- refer script:
- name: separate words with "and/or"
- description: Changes spaces to " and/or ". "Elf Warrior" becomes "Elf and/or Warrior".
- script: \{separate_words(spacer: " and/or ", {input})\}
- refer script:
- name: separate words with "or"
- description: Changes spaces to " or ". "Elf Warrior" becomes "Elf or Warrior".
- script: \{separate_words(spacer: " or ", {input})\}
-
-keyword parameter type:
- name: prefix
- description: Prefix for things like "walk"
- optional: false
-# match: [A-Z][a-z, ]*([A-Z][a-z, ]*\xEB00) # commented out because it stopped prefix param from working, version below allows all "walks", including "Dame Judi Denchwalk", doesn't trigger #in middle of sentences, and doesn't trigger in chains of keywords.
-# match: [A-Z][A-Z,a-z’ ]* # commented out due to still not working
- match: [^(.:;\n—]+
- example: Forest
-keyword parameter type:
- name: english_number
- match: [ upto]*[(an? |one |two |three |four |five |six |seven |eight |nine |ten )]*
-
-keyword parameter type:
- name: a
- match: [an?]*
-keyword parameter type:
- name: nonland
- match: ( n?o?n?l?a?n?d? ?)
-
-############################# All Magic keywords
-# By JrEye and Neko_Asakami, Updated by Pichoro and Buttock1234
-
-# Alpha
-keyword:
- keyword: Flying
- match: Flying
- mode: core
- reminder: This creature can’t be blocked except by creatures with flying or reach.
-keyword:
- keyword: First strike
- match: First strike
- mode: core
- reminder: This creature deals combat damage before creatures without first strike.
-keyword:
- keyword: Trample
- match: Trample
- mode: core
- reminder: This creature can deal excess combat damage to defending player or planeswalker while attacking.
-keyword:
- keyword: Banding
- match: Banding
- mode: old
- reminder: Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature’s combat damage, not its controller, among any of the creatures it’s being blocked by or is blocking.
-keyword:
- keyword: Landwalk
- match: prefixwalk
- mode: old
- reminder: This creature can't be blocked as long as defending player controls a {if match(param1.value, match: " land$") or contains(param1.value, match: "Snow") or contains(param1.value, match:"Basic") or contains(param1.value, match:"Legendary") then "{to_lower(param1)}" else "{param1}"}.
-keyword:
- keyword: Protection from
- match: Protection from name
- mode: expert
- reminder: {if has_pt() then "This creature" else "This permanent"} can’t be blocked, targeted, dealt damage, or enchanted by anything {english_singular(param1)}.
-keyword:
- keyword: Regeneration
- match: Regenerate
- mode: action
- reminder: The next time {if has_pt() then "this creature" else "this"} would be destroyed this turn, it isn’t.{if has_pt() then " Instead tap it, remove all damage from it, and remove it from combat." else " Instead tap it."}
-# Legends
-keyword:
- keyword: Bands with other
- match: Bands with other name
- mode: old
- reminder: Any {param1} can attack in a band as long as at least one has “bands with other {param1}.” Bands are blocked as a group. If at least two {param1} you control, one of which has “bands with other {param1},” are blocking or being blocked by the same creature, you divide that creature’s combat damage, not its controller, among any of the creatures it’s being blocked by or is blocking.
-keyword:
- keyword: Rampage
- match: Rampage number
- mode: old
- reminder: Whenever this creature becomes blocked, it gets +{param1}/+{param1} until end of turn for each creature blocking it beyond the first.
-# Ice Age
-keyword:
- keyword: Cumulative upkeep
- match: Cumulative upkeep cost
- mode: old
- reminder: At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.
-# Mirage
-keyword:
- keyword: Phasing
- match: Phasing
- mode: old
- reminder: This phases in or out before you untap during each of your untap steps. While it’s phased out, it’s treated as though it doesn’t exist.
-keyword:
- keyword: Flanking
- match: Flanking
- mode: expert
- reminder: Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.
-# Unglued
-keyword:
- keyword: Denimwalk
- match: Denimwalk
- mode: old
- reminder: If defending player is wearing any clothing made of denim, this creature is unblockable.
-# Tempest
-keyword:
- keyword: Shadow
- match: Shadow
- mode: expert
- reminder: This creature can block or be blocked by only creatures with shadow.
-keyword:
- keyword: Buyback
- match: Buyback cost
- mode: expert
- reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you cast this spell. If you do, put this card into your hand as it resolves.
-# Urza's Saga
-keyword:
- keyword: Echo
- match: Echo cost
- mode: expert
- reminder: At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.
-keyword:
- keyword: Cycling
- match: Cycling cost
- mode: expert
- reminder: {param1}, Discard this card: Draw a card.
-# Sixth Edition
-keyword:
- keyword: Haste
- match: Haste
- mode: core
- reminder: This creature can attack and T as soon as it comes under your control.
-# Portal: Three Kingdoms
-keyword:
- keyword: Horsemanship
- match: Horsemanship
- mode: old
- reminder: This creature can’t be blocked except by creatures with horsemanship.
-# Nemesis
-keyword:
- keyword: Fading
- match: Fading number
- mode: expert
- reminder: This {if has_pt() then "creature" else "permanent"} enters the battlefield with {english_number_a(param1)} fade counter(s) on it. At the beginning of your upkeep, remove a fade counter from it. If you can’t, sacrifice it.
-# Invasion
-keyword:
- keyword: Kicker
- match: Kicker cost
- mode: expert
- reminder: You may {for_mana_costs(add:"pay an additional ", param1)} as you cast this spell.
-# Odyssey
-keyword:
- keyword: Flashback
- match: Flashback cost
- mode: expert
- reminder: You may cast this card from your graveyard for its flashback cost. Then exile it.
-keyword:
- keyword: Threshold
- match: Threshold
- mode: pseudo
- rules: Threshold — [effect] as long as seven or more cards are in your graveyard.
-# Torment
-keyword:
- keyword: Madness
- match: Madness cost
- mode: expert
- reminder: If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.
-# Onslaught
-keyword:
- keyword: Morph
- match: Morph cost
- mode: expert
- reminder: You may cast this card face down as a 2/2 creature for 3. Turn it face up any time for its morph cost.
-keyword:
- keyword: Fear
- match: Fear
- mode: old
- reminder: This creature can’t be blocked except by artifact creatures and/or black creatures.
-# Legions
-keyword:
- keyword: Amplify
- match: Amplify number
- mode: expert
- reminder: As this creature enters the battlefield, put {english_number_a(param1)} +1/+1 counter(s) on it for each {separate_words(spacer: " and/or ", card.sub_type)} card you reveal in your hand.
-keyword:
- keyword: Double strike
- match: Double strike
- mode: core
- reminder: This creature deals both first-strike and regular combat damage.
-keyword:
- keyword: Provoke
- match: Provoke
- mode: expert
- reminder: When this attacks, you may have target creature defending player controls untap and block it if able.
-# Scourge
-keyword:
- keyword: Typecycling
- match: one_wordcycling cost
- mode: action
- reminder: {param2}, Discard this card: Search your library for a {param1} card, reveal it, and put it into your hand. Then shuffle your library.
-keyword:
- keyword: Storm
- match: Storm
- mode: expert
- reminder: When you cast this spell, copy it for each spell cast before it this turn.{ if is_targeted() then " You may choose new targets for the copies." }
-# Mirrodin
-keyword:
- keyword: Affinity for
- match: Affinity for name
- mode: expert
- reminder: This spell costs 1 less to cast for each {english_singular(param1)} you control.
-keyword:
- keyword: Entwine
- match: Entwine cost
- mode: expert
- reminder: Choose both if you pay the entwine cost.
-keyword:
- keyword: Equip
- match: Equip cost
- mode: core
- reminder: {param1}: Attach to target creature you control. Equip only as a sorcery.
-keyword:
- keyword: Imprint
- match: Imprint
- mode: pseudo
- rules: When ~ enters the battlefield, you may exile a [something] from [somewhere].
-# Darksteel
-keyword:
- keyword: Modular
- match: Modular number
- mode: expert
- reminder: This enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it. When it dies, you may put its +1/+1 counters on target artifact creature.
-# Fifth Dawn
-keyword:
- keyword: Scry
- match: Scry number
- mode: action
- reminder:
- To scry {param1}, look at the top {
- if param1.value==1 then "card of your library. You may put that card on the bottom of your library."
- else "{english_number(param1)} cards of your library, then put any number of them on the bottom of your library and the rest on top in any order."
- }
-keyword:
- keyword: Sunburst
- match: Sunburst
- mode: expert
- reminder: This enters the battlefield with a {if has_pt() then "+1/+1" else "charge"} counter on it for each color of mana spent to cast it.
-# Unhinged
-keyword:
- keyword: Art rampage
- match: Art rampage number
- mode: expert
- reminder: Whenever this becomes blocked by a creature, it gets +{param1}/+{param1} for each creature in the blocker’s art beyond the first.
-keyword:
- keyword: Super haste
- match: Super haste
- mode: expert
- reminder: This may attack the turn before you cast it. (You may have this card enter the battlefield from your hand, tapped and attacking, during your declare attackers step. If you do, you lose the game at the end of your next turn unless you pay this card’s mana cost during that turn.)
-keyword:
- keyword: Gotcha
- match: Gotcha
- mode: pseudo
- rules: Gotcha — Whenever an opponent [does something], you may say “Gotcha!”. If you do, return [something] from your graveyard to your hand.
-# Champions of Kamigawa
-keyword:
- keyword: Splice
- match: Splice onto name cost
- mode: expert
- reminder: As you cast a {param1} spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card’s effects to that spell.
-keyword:
- keyword: Bushido
- match: Bushido number
- mode: expert
- reminder: When this blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn.
-keyword:
- keyword: Soulshift
- match: Soulshift number
- mode: expert
- reminder: When this creature dies, you may return target Spirit card with converted mana cost {param1} or less from your graveyard to your hand.
-keyword:
- keyword: Enchant
- match: Enchant name
- mode: core
- reminder: Target a {param1} as you cast this. This card enters the battlefield attached to that {param1}.
-keyword:
- keyword: Vigilance
- match: Vigilance
- mode: core
- reminder: Attacking doesn’t cause this creature to tap.
-keyword:
- keyword: Defender
- match: Defender
- mode: core
- reminder: This creature can’t attack.
-# Betrayers of Kamigawa
-keyword:
- keyword: Offering
- match: prefix offering
- mode: expert
- reminder: You may cast this card any time you could cast an instant by sacrificing a {param1} and paying the difference in mana costs between this and the sacrificed {param1}. Mana cost includes color.
-keyword:
- keyword: Ninjutsu
- match: Ninjutsu cost
- mode: expert
- reminder: {param1}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.
-# Saviors of Kamigawa
-keyword:
- keyword: Epic
- match: Epic
- mode: expert
- reminder: For the rest of the game, you can’t cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.{ if is_targeted() then " You may choose a new target for the copy." }
-keyword:
- keyword: Channel
- match: Channel
- mode: pseudo
- rules: Channel — [cost], Discard ~: [effect].
-keyword:
- keyword: Sweep
- match: Sweep
- mode: pseudo
- rules: Sweep — Return any number of [basic land type] you control to their owner’s hand. [effect based on number of lands returned].
-# Ravnica: City of Guilds
-keyword:
- keyword: Convoke
- match: Convoke
- mode: expert
- reminder: Your creatures can help cast this spell. Each creature you tap while casting this spell pays for 1 or one mana of that creature’s color.
-keyword:
- keyword: Transmute
- match: Transmute cost
- mode: expert
- reminder: {param1}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.
-keyword:
- keyword: Dredge
- match: Dredge number
- mode: expert
- reminder: If you would draw a card, instead you may put exactly {english_number(param1)} card(s) from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.
-keyword:
- keyword: Radiance
- match: Radiance
- mode: pseudo
- rules: Radiance — [effect to target permanent or spell and all cards of same card type that share a color with it]
-# Guildpact
-keyword:
- keyword: Haunt
- match: Haunt
- mode: expert
- reminder: When this { if is_spell() then "spell card is put into a graveyard after resolving," else "creature dies," } exile it haunting target creature.
-keyword:
- keyword: Bloodthirst
- match: Bloodthirst number
- mode: expert
- reminder: If an opponent was dealt damage this turn, this {if has_pt() then "creature" else "permanent"} enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it.
-keyword:
- keyword: Replicate
- match: Replicate cost
- mode: expert
- reminder: When you cast this spell, copy it for each time you paid its replicate cost.{ if is_targeted() then " You may choose new targets for the copies." }
-# Dissension
-keyword:
- keyword: Graft
- match: Graft number
- mode: expert
- reminder: {if has_pt() then "This creature" else "This permanent"} enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever {if has_pt() then "another" else "a"} creature enters the battlefield, you may move a +1/+1 counter from {if has_pt() then "this creature" else "this permanent"} onto it.
-keyword:
- keyword: Forecast
- match: Forecast — action, Reveal name from your hand: action
- mode: expert
- reminder: Activate this ability only during your upkeep and only once each turn.
-keyword:
- keyword: Hellbent
- match: Hellbent
- mode: pseudo
- rules: Hellbent — [effect] if you have no cards in hand.
-# Cold Snap
-keyword:
- keyword: Recover
- match: Recover cost
- mode: expert
- reminder: When a creature is put into your graveyard from the battlefield, you may {for_mana_costs(add:"pay ",param1)}. If you do, return this card from your graveyard to your hand. Otherwise, exile this card.
-keyword:
- keyword: Ripple
- match: Ripple number
- mode: expert
- reminder: When you cast this spell, you may reveal the top {english_number_multiple(param1)} card(s) of your library. You may cast any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library.
-# Time Spiral
-keyword:
- keyword: Flash
- match: Flash
- mode: core
- reminder: You may cast this spell any time you could cast an instant.
-keyword:
- keyword: Split second
- match: Split second
- mode: expert
- reminder: As long as this spell is on the stack, players can’t cast spells or activate abilities that aren’t mana abilities.
-keyword:
- keyword: Suspend
- match: Suspend number—cost
- mode: expert
- reminder: Rather than cast this card from your hand,{if has_cc() then " you may" else ""} {for_mana_costs(add:"pay ", param2)} and exile it with {english_number_a(param1)} time counter(s) on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.{if has_pt() then " It has haste." }
-# Planar Chaos
-keyword:
- keyword: Vanishing
- match: Vanishing number
- mode: expert
- reminder: This permanent enters the battlefield with {english_number_a(param1)} time counter(s) on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.
-# Future Sight
-keyword:
- keyword: Deathtouch
- match: Deathtouch
- mode: core
- reminder: Any amount of damage this deals to a creature is enough to destroy it.
-keyword:
- keyword: Reach
- match: Reach
- mode: core
- reminder: This creature can block creatures with flying.
-keyword:
- keyword: Gravestorm
- match: Gravestorm
- mode: expert
- reminder: When you cast this spell, copy it for each permanent put into a graveyard this turn.{ if is_targeted() then " You may choose new targets for the copies." }
-keyword:
- keyword: Lifelink
- match: Lifelink
- mode: core
- reminder: Damage dealt by this { if has_pt() then "creature" else if is_spell() then "spell" else "permanent" } also causes you to gain that much life.
-keyword:
- keyword: Absorb
- match: Absorb number
- mode: expert
- reminder: If a source would deal damage to this creature, prevent {param1} of that damage.
-keyword:
- keyword: Fateseal
- match: Fateseal number
- mode: action
- reminder:
- To fateseal {param1}, look at the top {
- if param1.value==1 then "card of an opponent’s library, then you may put it on the bottom of that player’s library."
- else "{english_number(param1)} cards of an opponent’s library, then put any number of them on the bottom of that player’s library and the rest on top in any order."
- }
-keyword:
- keyword: Transfigure
- match: Transfigure cost
- mode: expert
- reminder: {param1}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.
-keyword:
- keyword: Aura swap
- match: Aura swap cost
- mode: expert
- reminder: {param1}: Exchange this Aura with an Aura card in your hand.
-keyword:
- keyword: Frenzy
- match: Frenzy number
- mode: expert
- reminder: Whenever this creature attacks and isn’t blocked, it gets +{param1}/+0 until end of turn.
-keyword:
- keyword: Delve
- match: Delve
- mode: expert
- reminder: Each card you exile from your graveyard while casting this spell pays for 1.
-keyword:
- keyword: Poisonous
- match: Poisonous number
- mode: expert
- reminder: Whenever this creature deals combat damage to a player, that player gets {english_number_a(param1)} poison counter(s). A player with ten or more poison counters loses the game.
-keyword:
- keyword: Shroud
- match: Shroud
- mode: core
- reminder: This permanent can’t be the target of spells or abilities.
-keyword:
- keyword: Fortify
- match: Fortify cost
- mode: expert
- reminder: {param1}: Attach to target land you control. Fortify only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the land leaves.
-keyword:
- keyword: Grandeur
- match: Grandeur
- mode: pseudo
- rules: Grandeur — Discard another card named ~: [effect].
-# Lorwyn
-keyword:
- keyword: Evoke
- match: Evoke cost
- mode: expert
- reminder: You may cast this spell for its evoke cost. If you do, it’s sacrificed when it enters the battlefield.
-keyword:
- keyword: Champion
- match: Champion a name
- mode: expert
- reminder: When this enters the battlefield, sacrifice it unless you exile another {param2} you control. When this leaves the battlefield, that card returns to the battlefield.
-keyword:
- keyword: Clash
- match: Clash
- mode: action
- reminder: Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.
-keyword:
- keyword: Changeling
- match: Changeling
- mode: expert
- reminder: This card is every creature type at all times.
-keyword:
- keyword: Hideaway
- match: Hideaway
- mode: expert
- reminder: This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.
-# Morningtide
-keyword:
- keyword: Prowl
- match: Prowl cost
- mode: expert
- reminder: You may cast this for its prowl cost if you dealt combat damage to a player this turn with a {separate_words(spacer: " or ", card.sub_type)}.
-keyword:
- keyword: Reinforce
- match: Reinforce number—cost
- mode: expert
- reminder: {param2}, Discard this card: Put {english_number_a(param1)} +1/+1 counter(s) on target creature.
-keyword:
- keyword: Kinship
- match: Kinship
- mode: pseudo
- rules: Kinship — At the beginning of your upkeep, you may look at the top card of your library. If that card shares a creature type with ~, you may reveal it. If you do, [effect].
-# Shadowmoor
-keyword:
- keyword: Persist
- match: Persist
- mode: expert
- reminder: When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner’s control with a -1/-1 counter on it.
-keyword:
- keyword: Wither
- match: Wither
- mode: expert
- reminder: This deals damage to creatures in the form of -1/-1 counters.
-keyword:
- keyword: Conspire
- match: Conspire
- mode: expert
- reminder: As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it{ if is_targeted() then " and you may choose a new target for the copy" }.
-# Eventide
-keyword:
- keyword: Retrace
- match: Retrace
- mode: expert
- reminder: You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.
-keyword:
- keyword: Chroma
- match: Chroma
- mode: pseudo
- rules: Chroma — [effect] based on the number of [color] mana symbols [in graveyard, under your control, in cards you discard].
-# Shards of Alara
-keyword:
- keyword: Unearth
- match: Unearth cost
- mode: expert
- reminder: {param1}: Return this card from your graveyard to the battlefield. {if has_pt() then "It gains haste. " else "" }Exile it at the beginning of the end step or if it would leave the battlefield. Unearth only as a sorcery.
-keyword:
- keyword: Devour
- match: Devour number
- mode: expert
- reminder: As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with { if param1.value == 1 then "" else if param1.value == 2 then "twice " else english_number(param1) + " times " }that many +1/+1 counters on it.
-keyword:
- keyword: Exalted
- match: Exalted
- mode: expert
- reminder: Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.
-# Conflux
-keyword:
- keyword: Basic landcycling
- match: Basic landcycling cost
- mode: expert
- reminder: {param1}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.
-keyword:
- keyword: Domain
- match: Domain
- mode: pseudo
- rules: Domain — [effect] for each basic land type among lands you control.
-# Alara Reborn
-keyword:
- keyword: Cascade
- match: Cascade
- mode: expert
- reminder: When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.
-# Magic 2010
-keyword:
- keyword: Intimidate
- match: Intimidate
- mode: old
- reminder: This creature can’t be blocked except by artifact creatures and/or creatures that share a color with it.
-# Zendikar
-keyword:
- keyword: Landfall
- match: Landfall
- mode: pseudo
- rules: Landfall — Whenever a land enters the battlefield under your control, [effect].
-# Worldwake
-keyword:
- keyword: Multikicker
- match: Multikicker cost
- mode: expert
- reminder: You may {for_mana_costs(add:"pay an additional ", param1)} any number of times as you cast this spell.
-# Rise of the Eldrazi
-keyword:
- keyword: Annihilator
- match: Annihilator number
- mode: expert
- reminder: Whenever this creature attacks, defending player sacrifices {english_number_a(param1)} permanent(s).
-keyword:
- keyword: Rebound
- match: Rebound
- mode: expert
- reminder: If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.
-keyword:
- keyword: Totem armor
- match: Totem armor
- mode: expert
- reminder: If enchanted {if contains(card.text, match:"Enchant creature") then "creature" else "permanent"} would be destroyed, instead remove all damage from it and destroy this Aura.
-keyword:
- keyword: Level up
- match: Level up cost
- mode: expert
- reminder: {param1}: Put a level counter on this. Level up only as a sorcery.
-# Scars of Mirrodin
-keyword:
- keyword: Infect
- match: Infect
- mode: expert
- reminder: This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.
-keyword:
- keyword: Proliferate
- match: Proliferate
- mode: action
- reminder: You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.
-keyword:
- keyword: Metalcraft
- match: Metalcraft
- mode: pseudo
- rules: Metalcraft — As long as you control three or more artifacts, [effect].
-# Mirrodin Besieged
-keyword:
- keyword: Battle cry
- match: Battle cry
- mode: expert
- reminder: Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.
-keyword:
- keyword: Living weapon
- match: Living weapon
- mode: expert
- reminder: When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.
-# Commander
-keyword:
- keyword: Join forces
- match: Join forces
- mode: pseudo
- rules: Join forces — Starting with you, each player may [effect].
-# Magic 2012
-keyword:
- keyword: Hexproof
- match: Hexproof
- mode: core
- reminder: This creature can't be the target of spells or abilities your opponents control.
-# Innistrad
-keyword:
- keyword: Morbid
- match: Morbid
- mode: pseudo
- rules: Morbid — If a creature died this turn, [effect].
-keyword:
- keyword: Fight
- match: fight
- mode: action
- reminder: Each deals damage equal to its power to the other.
-# Dark Ascension
-keyword:
- keyword: Undying
- match: Undying
- mode: expert
- reminder: When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.
-keyword:
- keyword: Fateful hour
- match: Fateful hour
- mode: pseudo
- rules: Fateful Hour — As long as you have 5 or less life, [effect].
-# Avacyn Restored
-keyword:
- keyword: Miracle
- match: Miracle cost
- mode: expert
- reminder: You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.
-keyword:
- keyword: Soulbond
- match: Soulbond
- mode: expert
- reminder: You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.
-# Return to Ravnica
-keyword:
- keyword: Detain
- match: detainenglish_numbertargetnonlandone_word
- mode: action
- reminder: Until your next turn, {if contains(param1.value, match:"one") or param1.value == " " then "that" else "those"} {param3} can't attack or block and {if contains(param1.value, match:"one") or param1.value == " " then "its" else "their"} activated abilities can't be activated.
-keyword:
- keyword: Overload
- match: Overload cost
- mode: expert
- reminder: You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each".
-keyword:
- keyword: Unleash
- match: Unleash
- mode: expert
- reminder: You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.
-keyword:
- keyword: Scavenge
- match: Scavenge cost
- mode: expert
- reminder: {param1}, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery.
-keyword:
- keyword: Populate
- match: populate
- mode: action
- reminder: Put a token onto the battlefield that's a copy of a creature token you control.
-# Gatecrash
-keyword:
- keyword: Extort
- match: Extort
- mode: expert
- reminder: Whenever you cast a spell, you may pay [W/B]. If you do, each opponent loses 1 life and you gain that much life.
-keyword:
- keyword: Cipher
- match: Cipher
- mode: expert
- reminder: Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.
-keyword:
- keyword: Bloodrush
- match: Bloodrush
- mode: pseudo
- rules: Bloodrush — [cost], Discard ~: Target attacking creature gets [effect].
-keyword:
- keyword: Battalion
- match: Battalion
- mode: pseudo
- rules: Battalion — Whenever ~ and at least two other creatures attack, [effect].
-keyword:
- keyword: Evolve
- match: Evolve
- mode: expert
- reminder: Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.
-# Dragon's Maze
-keyword:
- keyword: Fuse
- match: Fuse
- mode: expert
- reminder: You may cast one or both halves of this card from your hand.
-# Magic 2014
-keyword:
- keyword: Indestructible
- match: Indestructible
- mode: core
- reminder: {if has_pt() then "Damage and effects" else "Effects"} that say "destroy" don't destroy this {if has_pt() then "creature" else if is_artifact(card.super_type) then "artifact" else "permanent"}.
-# Theros
-keyword:
- keyword: Hero's reward
- match: Hero's Reward
- mode: pseudo
- rules: Hero's Reward — When ~ leaves the battlefield, each player [effect].
-keyword:
- keyword: Monstrosity
- match: Monstrosity number
- mode: action
- reminder: If this creature isn’t monstrous, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes monstrous.
-keyword:
- keyword: Heroic
- match: Heroic
- mode: pseudo
- rules: Heroic — Whenever you cast a spell that targets ~, [effect].
-keyword:
- keyword: Bestow
- match: Bestow cost
- mode: expert
- reminder: If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature.
-keyword:
- keyword: Devotion
- match: devotion to action
- mode: action
- reminder: Each {color_to_mana(param1)} in the mana costs of permanents you control counts toward your devotion to {param1}.
-# Commander 2013
-keyword:
- keyword: Tempting offer
- match: Tempting offer
- mode: pseudo
- rules: Tempting offer - [do something]. Each opponent may [do the same]. For each opponent who does, [do something again].
-# Born of the Gods
-keyword:
- keyword: Tribute
- match: Tribute number
- mode: expert
- reminder: As this creature enters the battlefield, an opponent of your choice may put {english_number_a(param1)} +1/+1 counter(s) on it.
-keyword:
- keyword: Inspired
- match: Inspired
- mode: pseudo
- rules: Inspired — Whenever ~ becomes untapped, [effect].
-# Journey into Nyx
-keyword:
- keyword: Constellation
- match: Constellation
- mode: pseudo
- rules: Constellation — Whenever ~ or another enchantment enters the battlefield under your control, [effect].
-keyword:
- keyword: Strive
- match: Strive
- mode: pseudo
- rules: Strive — ~ costs [mana] more to cast for each target beyond the first.
-# Conspiracy
-keyword:
- keyword: Hidden agenda
- match: Hidden agenda
- mode: expert
- reminder: Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.
-keyword:
- keyword: Dethrone
- match: Dethrone
- mode: expert
- reminder: Whenever this creature attacks the player with the most life or tied for most life, put a +1/+1 counter on it.
-keyword:
- keyword: Will of the council
- match: Will of the council
- mode: pseudo
- rules: Will of the council — [some ability that involves voting, maybe between grace and condemnation]
-keyword:
- keyword: Parley
- match: Parley
- mode: pseudo
- rules: Parley — Each player reveals the top card of his or her library. For each nonland card revealed this way, [effect]. Then each player draws a card.
-# Khans of Tarkir
-keyword:
- keyword: Outlast
- match: Outlast cost
- mode: expert
- reminder: {param1}, T: Put a +1/+1 counter on this creature. Outlast only as a sorcery.
-keyword:
- keyword: Prowess
- match: Prowess
- mode: core
- reminder: Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.
-keyword:
- keyword: Raid
- match: Raid
- mode: pseudo
- rules: Raid — When ~ enters the battlefield, if you attacked with a creature this turn, [effect].
-keyword:
- keyword: Ferocious
- match: Ferocious
- mode: pseudo
- rules: Ferocious — [Whenever ~ attacks/When ~ spell resolves], if you control a creature with power 4 or greater, [effect].
-# Commander 2014
-keyword:
- keyword: Lieutenant
- match: Lieutenant
- mode: pseudo
- rules: Lieutenant - As long as you control your commander, [effect].
-# Fate Reforged
-keyword:
- keyword: Bolster
- match: bolster number
- mode: action
- reminder: Choose a creature with the least toughness among creatures you control and put {english_number_a(param1)} +1/+1 counter(s) on it.
-keyword:
- keyword: Dash
- match: Dash cost
- mode: expert
- reminder: You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.
-keyword:
- keyword: Manifest
- match: manifest
- mode: action
- reminder: To manifest a card, put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.
-# Dragons of Tarkir
-keyword:
- keyword: Exploit
- match: Exploit
- mode: expert
- reminder: When this creature enters the battlefield, you may sacrifice a creature.
-keyword:
- keyword: Formidable
- match: Formidable
- mode: pseudo
- rules: Formidable — Stuff happens if creatures you control have total power 8 or greater.
-keyword:
- keyword: Megamorph
- match: Megamorph cost
- mode: expert
- reminder: You may cast this face down as a 2/2 creature for 3. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.
-# Magic Origins
-keyword:
- keyword: Menace
- match: Menace
- mode: core
- reminder: This creature can't be blocked except by two or more creatures.
-keyword:
- keyword: Renown
- match: Renown number
- mode: expert
- reminder: When this creature deals combat damage to a player, if it isn't renowned, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes renowned.
-keyword:
- keyword: Spell mastery
- match: Spell mastery
- mode: pseudo
- rules: Spell mastery -- If there are two or more instant and/or sorcery cards in your graveyard, [effect].
-# Battle for Zendikar
-keyword:
- keyword: Awaken
- match: Awaken number—cost
- mode: expert
- reminder: If you cast this spell {for_mana_costs(add:"for ", param2)}, also put {english_number_a(param1)} +1/+1 counter(s) on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.
-keyword:
- keyword: Devoid
- match: Devoid
- mode: expert
- reminder: This card has no color.
-keyword:
- keyword: Ingest
- match: Ingest
- mode: expert
- reminder: Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.
-keyword:
- keyword: Rally
- match: Rally
- mode: pseudo
- rules: Rally -- Whenever ~ or another Ally enters the battlefield under your control, [effect].
-keyword:
- keyword: Converge
- match: Converge
- mode: pseudo
- rules: Converge -- [effect with X], where X is the number of colors of mana spent to cast ~.
-# Commander 2015
-keyword:
- keyword: Myriad
- match: Myriad
- mode: expert
- reminder: Whenever this creature attacks, for each opponent other than defending player, you may create a token that's a copy of this creature that's tapped and attacking that player or a planeswalker he or she controls. If one or more tokens are created this way, exile the tokens at end of combat.
-# Oath of the Gatewatch
-keyword:
- keyword: Surge
- match: Surge cost
- mode: expert
- reminder: You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.
-keyword:
- keyword: Support
- match: Support number
- mode: action
- reminder: Put a +1/+1 counter on {if param1.value!=1 then "each of "}up to {english_number(param1)}{if has_pt() then " other"} target creature(s).
-# Shadows over Innistrad
-keyword:
- keyword: Investigate
- match: Investigate
- mode: action
- reminder: Create a colorless Clue artifact token with "2, Sacrifice this artifact: Draw a card."
-keyword:
- keyword: Skulk
- match: Skulk
- mode: expert
- reminder: This creature can't be blocked by creatures with greater power.
-keyword:
- keyword: Delirium
- match: Delirium
- mode: pseudo
- rules: Delirium - If there are four or more card types among cards in your graveyard, [effect].
-# Eldritch Moon
-keyword:
- keyword: Emerge
- match: Emerge cost
- mode: expert
- reminder: You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.
-keyword:
- keyword: Escalate
- match: Escalate cost
- mode: expert
- reminder: Pay this cost for each mode chosen beyond the first.
-# Conspiracy: Take the Crown
-keyword:
- keyword: Double agenda
- match: Double agenda
- mode: expert
- reminder: Start the game with this conspiracy face down in the command zone and secretly name two different cards. You may turn this conspiracy face up any time and reveal the chosen names.
-keyword:
- keyword: Goad
- match: goad
- mode: action
- reminder: Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.
-keyword:
- keyword: Melee
- match: Melee
- mode: expert
- reminder: Whenever this creature attacks, it gets +1/+1 until end of turn for each opponent you attacked with a creature this combat.
-keyword:
- keyword: Monarch
- match: become the monarch
- mode: action
- reminder: The monarch draws a card at the beginning of their end step. Whenever the monarch is dealt combat damage by a creature, its controller becomes the monarch.
-keyword:
- keyword: Council's dilemma
- match: Council's dilemma
- mode: pseudo
- rules: [May be something] starting with you, each player votes for [one thing or another].
-# Kaladesh
-keyword:
- keyword: Crew
- match: Crew number
- mode: expert
- reminder: Tap any number of untapped creatures you control with total power {param1} or greater: This permanent becomes an artifact creature until end of turn.
-keyword:
- keyword: Fabricate
- match: Fabricate number
- mode: expert
- reminder: When this permanent enters the battlefield, you may put {english_number_a(param1)} +1/+1 counter(s) on it. If you don't, create {param1} 1/1 colorless Servo artifact creature tokens.
-# Commander 2016
-keyword:
- keyword: Partner
- match: Partner
- mode: expert
- reminder: You can have two commanders if both have partner.
-keyword:
- keyword: Undaunted
- match: Undaunted
- mode: expert
- reminder: This spell costs 1 less to cast for each opponent.
-# Aether Revolt
-keyword:
- keyword: Improvise
- match: Improvise
- mode: expert
- reminder: Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for 1.
-keyword:
- keyword: Revolt
- match: Revolt
- mode: pseudo
- rules: Revolt - [Something], if a permanent you controlled left the battlefield this turn, [effect].
-# Amonkhet
-keyword:
- keyword: Aftermath
- match: Aftermath
- mode: expert
- reminder: Cast this spell only from your graveyard, then exile it.
-keyword:
- keyword: Embalm
- match: Embalm cost
- mode: expert
- reminder: {param1}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie {separate_words(spacer: " ", card.sub_type)} with no mana cost. Embalm only as a sorcery.
-keyword:
- keyword: Exert
- match: exert
- mode: action
- reminder: An exerted creature won't untap during your next untap step.
-#Hour of Devestation
-keyword:
- keyword: Afflict
- match: Afflict number
- mode: expert
- reminder: Whenever this creature becomes blocked, defending player loses {param1} life.
-keyword:
- keyword: Eternalize
- match: Eternalize cost
- mode: expert
- reminder: {param1}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie {separate_words(spacer: " ", card.sub_type)} with no mana cost. Eternalize only as a sorcery.
-#Commander 2017
-keyword:
- keyword: Eminence
- match: Eminence
- mode: pseudo
- rules: Eminence - As long as this creature is on the battlefield or in your command zone, [effect].
-#Ixalan
-keyword:
- keyword: Enrage
- match: Enrage
- mode: pseudo
- rules: Enrage - Whenever this creature is dealt damage, [effect].
-keyword:
- keyword: Explore
- match: explores
- mode: action
- reminder: Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.
\ No newline at end of file
diff --git a/data/magic.mse-game/keywords b/data/magic.mse-game/keywords
index 7b373d50..8d2d7978 100644
--- a/data/magic.mse-game/keywords
+++ b/data/magic.mse-game/keywords
@@ -29,13 +29,13 @@ keyword mode:
keyword parameter type:
name: mana
- match: [HSCTQXYZI0-9WUBRG/|]+
+ match: [HSVCTQXYZI0-9WUBRG/|]+
refer script:
name: normal
description: No changes made
script: \{{input}\}
refer script:
- name: converted mana cost
+ name: mana value
description: Converts mana to number
# "0" left in so users can easily see how to edit script.
script: \{cmc({input})\}
@@ -48,7 +48,7 @@ keyword parameter type:
# By pichoro and bunnierein
keyword parameter type:
name: cost
- match: [ ][HSCTQXYZI0-9WUBRG/|]*|[-—][^(\n]*
+ match: [ ][HSVECTQXYZI0-9WUBRG/|]*|[-—][^(\r\n]*
separator before is: [ —-]
separator after is: [.]
optional: false
@@ -100,10 +100,13 @@ keyword parameter type:
keyword parameter type:
name: one_word
match: [A-Za-z0-9]+
-
+keyword parameter type:
+ name: p
+ match: [p](?!ped)(?!ment)
keyword parameter type:
name: name
- match: [^(.:;\n—]+
+ match: ([^(.:;\n—]+|[ ])
+ #match: [A-Za-z0-9 ',’"“”!?]+
refer script:
name: normal
description: No changes made.
@@ -127,18 +130,38 @@ keyword parameter type:
optional: false
# match: [A-Z][a-z, ]*([A-Z][a-z, ]*\xEB00) # commented out because it stopped prefix param from working, version below allows all "walks", including "Dame Judi Denchwalk", doesn't trigger #in middle of sentences, and doesn't trigger in chains of keywords.
# match: [A-Z][A-Z,a-z’ ]* # commented out due to still not working
- match: [^(.:;\n—]+
+ match: [^(.,”":;\n—]+
example: Forest
keyword parameter type:
name: english_number
- match: [ upto]*[(an? |one |two |three |four |five |six |seven |eight |nine |ten )]*
-
+ match: (up to )?(a|an|one|two|three|four|five|six|seven|eight|nine|ten| )
+ refer script:
+ name: as a numeral
+ description: Changes english number to numeral
+ script: \{digital_number({input}.value)\}
keyword parameter type:
name: a
match: [an?]*
+keyword parameter type:
+ name: *s
+ match: [a-z]s?
keyword parameter type:
name: nonland
match: ( n?o?n?l?a?n?d? ?)
+keyword parameter type:
+ name: mill
+ match: mills?
+keyword parameter type:
+ name: iterate
+ match: [., ](t?w?i?c?e?|t?h?r?e?e?|f?o?u?r?|f?i?v?e?|s?i?x?|s?e?v?e?n?|X?)?( ?t?i?m?e?s?)?
+ refer script:
+ name: as words
+ description: Use the iteration word (twice, three times, etc)
+ script: \{iterate_fix({input})\}
+ refer script:
+ name: as number
+ description: Use the iteration word (twice, three times, etc)
+ script: \{iterate_digits({input})\}
keyword parameter type:
name: energy
match: [^>]([Pp]ays?( an additional| any amount of)?|gets?( that many)?) [E]+
@@ -146,24 +169,24 @@ keyword parameter type:
reminder script: length(input)
############################# All Magic keywords
-# By JrEye and Neko_Asakami, Updated by Pichoro and Buttock1234
+# By JrEye and Neko_Asakami, Updated by Pichoro and Buttock1234, Continued updates by cajun
# Alpha
keyword:
keyword: Flying
match: Flying
mode: core
- reminder: This creature can’t be blocked except by creatures with flying or reach.
+ reminder: {this_or_that("creature", upper:true)} can’t be blocked except by creatures with flying or reach.
keyword:
keyword: First strike
match: First strike
mode: core
- reminder: This creature deals combat damage before creatures without first strike.
+ reminder: {this_or_that("creature", upper:true)} deals combat damage before creatures without first strike.
keyword:
keyword: Trample
match: Trample
mode: core
- reminder: This creature can deal excess combat damage to defending player or planeswalker while attacking.
+ reminder: {this_or_that("creature", upper:true)} can deal excess combat damage to the player or planeswalker it's attacking.
keyword:
keyword: Banding
match: Banding
@@ -173,17 +196,17 @@ keyword:
keyword: Landwalk
match: prefixwalk
mode: old
- reminder: This creature can't be blocked as long as defending player controls a {if match(param1.value, match: " land$") or contains(param1.value, match: "Snow") or contains(param1.value, match:"Basic") or contains(param1.value, match:"Legendary") then "{to_lower(param1)}" else "{param1}"}.
+ reminder: {this_or_that("creature", upper:true)} can't be blocked as long as defending player controls a {if match(param1.value, match: " land$") or contains(param1.value, match: "Snow") or contains(param1.value, match:"Basic") or contains(param1.value, match:"Legendary") then "{to_lower(param1)}" else "{param1}"}.
keyword:
keyword: Protection from
match: Protection from name
mode: expert
- reminder: Nothing {replace(english_singular(param1), match:"and from", replace:"or", in_context:" ")} can block, target, deal damage to, or attach to {if has_pt() then "this creature" else "this permanent"}.
+ reminder: {protection_code(param1.value)}.
keyword:
keyword: Regeneration
match: Regenerate
mode: action
- reminder: The next time {if has_pt() then "this creature" else "this"} would be destroyed this turn, it isn’t.{if has_pt() then " Instead tap it, remove all damage from it, and remove it from combat." else " Instead tap it."}
+ reminder: The next time {this_or_that("permanent")} would be destroyed this turn, it isn’t.{if has_pt() then " Instead tap it, remove all damage from it, and remove it from combat." else " Instead tap it."}
# Legends
keyword:
keyword: Bands with other
@@ -194,13 +217,13 @@ keyword:
keyword: Rampage
match: Rampage number
mode: old
- reminder: Whenever this creature becomes blocked, it gets +{param1}/+{param1} until end of turn for each creature blocking it beyond the first.
+ reminder: Whenever {this_or_that("creature")} becomes blocked, it gets +{param1}/+{param1} until end of turn for each creature blocking it beyond the first.
# Ice Age
keyword:
keyword: Cumulative upkeep
match: Cumulative upkeep cost
mode: old
- reminder: At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.
+ reminder: At the beginning of your upkeep, put an age counter on {this_or_that("permanent")}, then sacrifice it unless you pay its upkeep cost for each age counter on it.
# Mirage
keyword:
keyword: Phasing
@@ -211,24 +234,24 @@ keyword:
keyword: Flanking
match: Flanking
mode: expert
- reminder: Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.
-# Unglued
-keyword:
- keyword: Denimwalk
- match: Denimwalk
- mode: old
- reminder: If defending player is wearing any clothing made of denim, this creature is unblockable.
+ reminder: Whenever a creature without flanking blocks {this_or_that("creature")}, the blocking creature gets -1/-1 until end of turn.
# Tempest
keyword:
keyword: Shadow
match: Shadow
mode: expert
- reminder: This creature can block or be blocked by only creatures with shadow.
+ reminder: {this_or_that("creature", upper:true)} can block or be blocked by only creatures with shadow.
keyword:
keyword: Buyback
match: Buyback cost
mode: expert
reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you cast this spell. If you do, put this card into your hand as it resolves.
+# Unglued
+keyword:
+ keyword: Denimwalk
+ match: Denimwalk
+ mode: old
+ reminder: If defending player is wearing any clothing made of denim, {this_or_that("creature")} is unblockable.
# Urza's Saga
keyword:
keyword: Echo
@@ -245,13 +268,13 @@ keyword:
keyword: Haste
match: Haste
mode: core
- reminder: This creature can attack and T as soon as it comes under your control.
+ reminder: {this_or_that("creature", upper:true)} can attack and T as soon as it comes under your control.
# Portal: Three Kingdoms
keyword:
keyword: Horsemanship
match: Horsemanship
mode: old
- reminder: This creature can’t be blocked except by creatures with horsemanship.
+ reminder: {this_or_that("creature", upper:true)} can’t be blocked except by creatures with horsemanship.
# Nemesis
keyword:
keyword: Fading
@@ -291,18 +314,18 @@ keyword:
keyword: Fear
match: Fear
mode: old
- reminder: This creature can’t be blocked except by artifact creatures and/or black creatures.
+ reminder: {this_or_that("creature", upper:true)} can’t be blocked except by artifact creatures and/or black creatures.
# Legions
keyword:
keyword: Amplify
match: Amplify number
mode: expert
- reminder: As this creature enters the battlefield, put {english_number_a(param1)} +1/+1 counter(s) on it for each {separate_words(spacer: " and/or ", card.sub_type)} card you reveal in your hand.
+ reminder: As {this_or_that("creature")} enters the battlefield, put {english_number_a(param1)} +1/+1 counter(s) on it for each {separate_words(spacer: " and/or ", card.sub_type)} card you reveal in your hand.
keyword:
keyword: Double strike
match: Double strike
mode: core
- reminder: This creature deals both first-strike and regular combat damage.
+ reminder: {this_or_that("creature", upper:true)} deals both first-strike and regular combat damage.
keyword:
keyword: Provoke
match: Provoke
@@ -313,7 +336,7 @@ keyword:
keyword: Typecycling
match: one_wordcycling cost
mode: action
- reminder: {param2}, Discard this card: Search your library for a {param1} card, reveal it, and put it into your hand. Then shuffle your library.
+ reminder: {param2}, Discard this card: Search your library for a {param1} card, reveal it, and put it into your hand, then shuffle.
keyword:
keyword: Storm
match: Storm
@@ -335,6 +358,11 @@ keyword:
match: Equip cost
mode: core
reminder: {param1}: Attach to target creature you control. Equip only as a sorcery.
+keyword:
+ keyword: Equip quality
+ match: Equip namecost
+ mode: core
+ reminder: {param2}: Attach to target {param1} creature you control. Equip only as a sorcery.
keyword:
keyword: Imprint
match: Imprint
@@ -350,10 +378,10 @@ keyword:
keyword:
keyword: Scry
match: Scry number
- mode: action
+ mode: core
reminder:
To scry {param1}, look at the top {
- if param1.value==1 then "card of your library. You may put that card on the bottom of your library."
+ if param1.value=="1" then "card of your library. You may put that card on the bottom of your library."
else "{english_number(param1)} cards of your library, then put any number of them on the bottom of your library and the rest on top in any order."
}
keyword:
@@ -361,6 +389,37 @@ keyword:
match: Sunburst
mode: expert
reminder: This enters the battlefield with a {if has_pt() then "+1/+1" else "charge"} counter on it for each color of mana spent to cast it.
+# Champions of Kamigawa
+keyword:
+ keyword: Splice
+ match: Splice onto name cost
+ mode: expert
+ reminder: As you cast a {param1} spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card’s effects to that spell.
+keyword:
+ keyword: Bushido
+ match: Bushido number
+ mode: expert
+ reminder: Whenever {this_or_that("creature")} blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn.
+keyword:
+ keyword: Soulshift
+ match: Soulshift number
+ mode: expert
+ reminder: When {this_or_that("creature")} dies, you may return target Spirit card with mana value {param1} or less from your graveyard to your hand.
+keyword:
+ keyword: Enchant
+ match: Enchant name
+ mode: core
+ reminder: Target a {param1} as you cast this. This card enters the battlefield attached to that {param1}.
+keyword:
+ keyword: Vigilance
+ match: Vigilance
+ mode: core
+ reminder: Attacking doesn’t cause {this_or_that("creature")} to tap.
+keyword:
+ keyword: Defender
+ match: Defender
+ mode: core
+ reminder: {this_or_that("creature", upper:true)} can’t attack.
# Unhinged
keyword:
keyword: Art rampage
@@ -377,37 +436,6 @@ keyword:
match: Gotcha
mode: pseudo
rules: Gotcha — Whenever an opponent [does something], you may say “Gotcha!”. If you do, return [something] from your graveyard to your hand.
-# Champions of Kamigawa
-keyword:
- keyword: Splice
- match: Splice onto name cost
- mode: expert
- reminder: As you cast a {param1} spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card’s effects to that spell.
-keyword:
- keyword: Bushido
- match: Bushido number
- mode: expert
- reminder: When this blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn.
-keyword:
- keyword: Soulshift
- match: Soulshift number
- mode: expert
- reminder: When this creature dies, you may return target Spirit card with converted mana cost {param1} or less from your graveyard to your hand.
-keyword:
- keyword: Enchant
- match: Enchant name
- mode: core
- reminder: Target a {param1} as you cast this. This card enters the battlefield attached to that {param1}.
-keyword:
- keyword: Vigilance
- match: Vigilance
- mode: core
- reminder: Attacking doesn’t cause this creature to tap.
-keyword:
- keyword: Defender
- match: Defender
- mode: core
- reminder: This creature can’t attack.
# Betrayers of Kamigawa
keyword:
keyword: Offering
@@ -445,12 +473,12 @@ keyword:
keyword: Transmute
match: Transmute cost
mode: expert
- reminder: {param1}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, and put it into your hand. Then shuffle your library. Transmute only as a sorcery.
+ reminder: {param1}, Discard this card: Search your library for a card with the same mana value as this card, reveal it, and put it into your hand, then shuffle. Transmute only as a sorcery.
keyword:
keyword: Dredge
match: Dredge number
mode: expert
- reminder: If you would draw a card, instead you may put exactly {english_number(param1)} card(s) from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.
+ reminder: If you would draw a card, you mill {english_number(param1)} card(s) instead. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.
keyword:
keyword: Radiance
match: Radiance
@@ -477,7 +505,7 @@ keyword:
keyword: Graft
match: Graft number
mode: expert
- reminder: {if has_pt() then "This creature" else "This permanent"} enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever {if has_pt() then "another" else "a"} creature enters the battlefield, you may move a +1/+1 counter from {if has_pt() then "this creature" else "this permanent"} onto it.
+ reminder: {this_or_that("permanent", upper:true)} enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever {if has_pt() then "another" else "a"} creature enters the battlefield, you may move a +1/+1 counter from {this_or_that("permanent")} onto it.
keyword:
keyword: Forecast
match: Forecast — action, Reveal name from your hand: action
@@ -488,7 +516,7 @@ keyword:
match: Hellbent
mode: pseudo
rules: Hellbent — [effect] if you have no cards in hand.
-# Cold Snap
+# Coldsnap
keyword:
keyword: Recover
match: Recover cost
@@ -520,7 +548,7 @@ keyword:
keyword: Vanishing
match: Vanishing number
mode: expert
- reminder: This permanent enters the battlefield with {english_number_a(param1)} time counter(s) on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.
+ reminder: {this_or_that("permanent", upper:true)} enters the battlefield with {english_number_a(param1)} time counter(s) on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.
# Future Sight
keyword:
keyword: Deathtouch
@@ -531,7 +559,7 @@ keyword:
keyword: Reach
match: Reach
mode: core
- reminder: This creature can block creatures with flying.
+ reminder: {this_or_that("creature", upper:true)} can block creatures with flying.
keyword:
keyword: Gravestorm
match: Gravestorm
@@ -546,21 +574,21 @@ keyword:
keyword: Absorb
match: Absorb number
mode: expert
- reminder: If a source would deal damage to this creature, prevent {param1} of that damage.
+ reminder: If a source would deal damage to {this_or_that("creature")}, prevent {param1} of that damage.
keyword:
keyword: Fateseal
match: Fateseal number
mode: action
reminder:
To fateseal {param1}, look at the top {
- if param1.value==1 then "card of an opponent’s library, then you may put it on the bottom of that player’s library."
+ if param1.value=="1" then "card of an opponent’s library, then you may put it on the bottom of that player’s library."
else "{english_number(param1)} cards of an opponent’s library, then put any number of them on the bottom of that player’s library and the rest on top in any order."
}
keyword:
keyword: Transfigure
match: Transfigure cost
mode: expert
- reminder: {param1}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.
+ reminder: {param1}, Sacrifice {this_or_that("permanent")}: Search your library for a creature card with the same mana value as {this_or_that("permanent")} and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery.
keyword:
keyword: Aura swap
match: Aura swap cost
@@ -570,7 +598,7 @@ keyword:
keyword: Frenzy
match: Frenzy number
mode: expert
- reminder: Whenever this creature attacks and isn’t blocked, it gets +{param1}/+0 until end of turn.
+ reminder: Whenever {this_or_that("creature")} attacks and isn’t blocked, it gets +{param1}/+0 until end of turn.
keyword:
keyword: Delve
match: Delve
@@ -580,12 +608,12 @@ keyword:
keyword: Poisonous
match: Poisonous number
mode: expert
- reminder: Whenever this creature deals combat damage to a player, that player gets {english_number_a(param1)} poison counter(s). A player with ten or more poison counters loses the game.
+ reminder: Whenever {this_or_that("creature")} deals combat damage to a player, that player gets {english_number_a(param1)} poison counter(s). A player with ten or more poison counters loses the game.
keyword:
keyword: Shroud
match: Shroud
mode: core
- reminder: This permanent can’t be the target of spells or abilities.
+ reminder: {this_or_that("permanent", upper:true)} can’t be the target of spells or abilities.
keyword:
keyword: Fortify
match: Fortify cost
@@ -611,17 +639,17 @@ keyword:
keyword: Clash
match: Clash
mode: action
- reminder: Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.
+ reminder: Each clashing player reveals the top card of their library, then puts that card on the top or bottom. A player wins if their card had a higher mana value.
keyword:
keyword: Changeling
match: Changeling
mode: expert
- reminder: This card is every creature type at all times.
+ reminder: This card is every creature type.
keyword:
keyword: Hideaway
match: Hideaway
mode: expert
- reminder: This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.
+ reminder: {this_or_that("land", upper:true)} enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.
# Morningtide
keyword:
keyword: Prowl
@@ -643,7 +671,7 @@ keyword:
keyword: Persist
match: Persist
mode: expert
- reminder: When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner’s control with a -1/-1 counter on it.
+ reminder: When {this_or_that("creature")} dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner’s control with a -1/-1 counter on it.
keyword:
keyword: Wither
match: Wither
@@ -675,7 +703,7 @@ keyword:
keyword: Devour
match: Devour number
mode: expert
- reminder: As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with { if param1.value == 1 then "" else if param1.value == 2 then "twice " else english_number(param1) + " times " }that many +1/+1 counters on it.
+ reminder: As this enters the battlefield, you may sacrifice any number of creatures. {this_or_that("creature", upper:true)} enters the battlefield with { if param1.value == "1" then "" else if param1.value == "2" then "twice " else english_number(param1) + " times " }that many +1/+1 counters on it.
keyword:
keyword: Exalted
match: Exalted
@@ -686,7 +714,7 @@ keyword:
keyword: Basic landcycling
match: Basic landcycling cost
mode: expert
- reminder: {param1}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library.
+ reminder: {param1}, Discard this card: Search your library for a basic land card, reveal it, and put it into your hand, then shuffle.
keyword:
keyword: Domain
match: Domain
@@ -703,7 +731,7 @@ keyword:
keyword: Intimidate
match: Intimidate
mode: old
- reminder: This creature can’t be blocked except by artifact creatures and/or creatures that share a color with it.
+ reminder: {this_or_that("creature", upper:true)} can’t be blocked except by artifact creatures and/or creatures that share a color with it.
# Zendikar
keyword:
keyword: Landfall
@@ -721,7 +749,7 @@ keyword:
keyword: Annihilator
match: Annihilator number
mode: expert
- reminder: Whenever this creature attacks, defending player sacrifices {english_number_a(param1)} permanent(s).
+ reminder: Whenever {this_or_that("creature")} attacks, defending player sacrifices {english_number_a(param1)} permanent(s).
keyword:
keyword: Rebound
match: Rebound
@@ -742,12 +770,12 @@ keyword:
keyword: Infect
match: Infect
mode: expert
- reminder: This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.
+ reminder: {this_or_that("creature", upper:true)} deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.
keyword:
keyword: Proliferate
match: Proliferate
mode: action
- reminder: You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.
+ reminder: Choose any number of permanents and/or players with counters on them, then give each another counter of each kind already there.
keyword:
keyword: Metalcraft
match: Metalcraft
@@ -758,12 +786,12 @@ keyword:
keyword: Battle cry
match: Battle cry
mode: expert
- reminder: Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.
+ reminder: Whenever {this_or_that("creature")} attacks, each other attacking creature gets +1/+0 until end of turn.
keyword:
keyword: Living weapon
match: Living weapon
mode: expert
- reminder: When this Equipment enters the battlefield, put a 0/0 black Germ creature token onto the battlefield, then attach this to it.
+ reminder: When this Equipment enters the battlefield, create a 0/0 black Phyrexian Germ creature token, then attach this to it.
# Commander
keyword:
keyword: Join forces
@@ -771,11 +799,16 @@ keyword:
mode: pseudo
rules: Join forces — Starting with you, each player may [effect].
# Magic 2012
+keyword:
+ keyword: Hexproof from
+ match: Hexprooname from name
+ mode: core
+ reminder: This {if has_pt() then "creature" else "permanent"} can't be the target of {param2} spells or abilities your opponents control.
keyword:
keyword: Hexproof
match: Hexproof
mode: core
- reminder: This creature can't be the target of spells or abilities your opponents control.
+ reminder: This { if has_pt() then "creature" else "permanent"} can't be the target of spells or abilities your opponents control.
# Innistrad
keyword:
keyword: Morbid
@@ -792,7 +825,7 @@ keyword:
keyword: Undying
match: Undying
mode: expert
- reminder: When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.
+ reminder: When {this_or_that("creature")} dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.
keyword:
keyword: Fateful hour
match: Fateful hour
@@ -808,7 +841,7 @@ keyword:
keyword: Soulbond
match: Soulbond
mode: expert
- reminder: You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.
+ reminder: You may pair {this_or_that("creature")} with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.
# Return to Ravnica
keyword:
keyword: Detain
@@ -824,7 +857,7 @@ keyword:
keyword: Unleash
match: Unleash
mode: expert
- reminder: You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.
+ reminder: You may have {this_or_that("creature")} enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.
keyword:
keyword: Scavenge
match: Scavenge cost
@@ -834,7 +867,7 @@ keyword:
keyword: Populate
match: populate
mode: action
- reminder: Put a token onto the battlefield that's a copy of a creature token you control.
+ reminder: Create a token that's a copy of a creature token you control.
# Gatecrash
keyword:
keyword: Extort
@@ -860,7 +893,7 @@ keyword:
keyword: Evolve
match: Evolve
mode: expert
- reminder: Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.
+ reminder: Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than {this_or_that("creature")}, put a +1/+1 counter on {this_or_that("creature")}.
# Dragon's Maze
keyword:
keyword: Fuse
@@ -883,7 +916,7 @@ keyword:
keyword: Monstrosity
match: Monstrosity number
mode: action
- reminder: If this creature isn’t monstrous, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes monstrous.
+ reminder: If {this_or_that("creature")} isn’t monstrous, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes monstrous.
keyword:
keyword: Heroic
match: Heroic
@@ -896,7 +929,7 @@ keyword:
reminder: If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature.
keyword:
keyword: Devotion
- match: devotion to action
+ match: devotion to one_word
mode: action
reminder: Each {color_to_mana(param1)} in the mana costs of permanents you control counts toward your devotion to {param1}.
# Commander 2013
@@ -904,13 +937,13 @@ keyword:
keyword: Tempting offer
match: Tempting offer
mode: pseudo
- rules: Tempting offer - [do something]. Each opponent may [do the same]. For each opponent who does, [do something again].
+ rules: Tempting offer - [do something]. Each opponent may [do the same]. For each opponent who does, [do something again].
# Born of the Gods
keyword:
keyword: Tribute
match: Tribute number
mode: expert
- reminder: As this creature enters the battlefield, an opponent of your choice may put {english_number_a(param1)} +1/+1 counter(s) on it.
+ reminder: As {this_or_that("creature")} enters the battlefield, an opponent of your choice may put {english_number_a(param1)} +1/+1 counter(s) on it.
keyword:
keyword: Inspired
match: Inspired
@@ -932,12 +965,12 @@ keyword:
keyword: Hidden agenda
match: Hidden agenda
mode: expert
- reminder: Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.
+ reminder: Start the game with this conspiracy face down in the command zone and secretly choose a card name. You may turn this conspiracy face up any time and reveal the chosen name.
keyword:
keyword: Dethrone
match: Dethrone
mode: expert
- reminder: Whenever this creature attacks the player with the most life or tied for most life, put a +1/+1 counter on it.
+ reminder: Whenever {this_or_that("creature")} attacks the player with the most life or tied for most life, put a +1/+1 counter on it.
keyword:
keyword: Will of the council
match: Will of the council
@@ -947,18 +980,18 @@ keyword:
keyword: Parley
match: Parley
mode: pseudo
- rules: Parley — Each player reveals the top card of his or her library. For each nonland card revealed this way, [effect]. Then each player draws a card.
+ rules: Parley — Each player reveals the top card of their library. For each nonland card revealed this way, [effect]. Then each player draws a card.
# Khans of Tarkir
keyword:
keyword: Outlast
match: Outlast cost
mode: expert
- reminder: {param1}, T: Put a +1/+1 counter on this creature. Outlast only as a sorcery.
+ reminder: {param1}, T: Put a +1/+1 counter on {this_or_that("creature")}. Outlast only as a sorcery.
keyword:
keyword: Prowess
match: Prowess
mode: core
- reminder: Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.
+ reminder: Whenever you cast a noncreature spell, {this_or_that("creature")} gets +1/+1 until end of turn.
keyword:
keyword: Raid
match: Raid
@@ -996,7 +1029,7 @@ keyword:
keyword: Exploit
match: Exploit
mode: expert
- reminder: When this creature enters the battlefield, you may sacrifice a creature.
+ reminder: When {this_or_that("creature")} enters the battlefield, you may sacrifice a creature.
keyword:
keyword: Formidable
match: Formidable
@@ -1012,12 +1045,12 @@ keyword:
keyword: Menace
match: Menace
mode: core
- reminder: This creature can't be blocked except by two or more creatures.
+ reminder: {this_or_that("creature", upper:true)} can't be blocked except by two or more creatures.
keyword:
keyword: Renown
match: Renown number
mode: expert
- reminder: When this creature deals combat damage to a player, if it isn't renowned, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes renowned.
+ reminder: When {this_or_that("creature")} deals combat damage to a player, if it isn't renowned, put {english_number_a(param1)} +1/+1 counter(s) on it and it becomes renowned.
keyword:
keyword: Spell mastery
match: Spell mastery
@@ -1038,7 +1071,7 @@ keyword:
keyword: Ingest
match: Ingest
mode: expert
- reminder: Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.
+ reminder: Whenever {this_or_that("creature")} deals combat damage to a player, that player exiles the top card of their library.
keyword:
keyword: Rally
match: Rally
@@ -1054,7 +1087,7 @@ keyword:
keyword: Myriad
match: Myriad
mode: expert
- reminder: Whenever this creature attacks, for each opponent other than defending player, you may create a token that's a copy of this creature that's tapped and attacking that player or a planeswalker he or she controls. If one or more tokens are created this way, exile the tokens at end of combat.
+ reminder: Whenever {this_or_that("creature")} attacks, for each opponent other than defending player, you may create a token that's a copy of {this_or_that("creature")} that's tapped and attacking that player or a planeswalker they control. If one or more tokens are created this way, exile the tokens at end of combat.
# Oath of the Gatewatch
keyword:
keyword: Surge
@@ -1076,7 +1109,7 @@ keyword:
keyword: Skulk
match: Skulk
mode: expert
- reminder: This creature can't be blocked by creatures with greater power.
+ reminder: {this_or_that("creature", upper:true)} can't be blocked by creatures with greater power.
keyword:
keyword: Delirium
match: Delirium
@@ -1087,7 +1120,7 @@ keyword:
keyword: Emerge
match: Emerge cost
mode: expert
- reminder: You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's converted mana cost.
+ reminder: You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's mana value.
keyword:
keyword: Escalate
match: Escalate cost
@@ -1098,7 +1131,7 @@ keyword:
keyword: Double agenda
match: Double agenda
mode: expert
- reminder: Start the game with this conspiracy face down in the command zone and secretly name two different cards. You may turn this conspiracy face up any time and reveal the chosen names.
+ reminder: Start the game with this conspiracy face down in the command zone and secretly choose two different card names. You may turn this conspiracy face up any time and reveal the chosen names.
keyword:
keyword: Goad
match: goad
@@ -1108,7 +1141,7 @@ keyword:
keyword: Melee
match: Melee
mode: expert
- reminder: Whenever this creature attacks, it gets +1/+1 until end of turn for each opponent you attacked with a creature this combat.
+ reminder: Whenever {this_or_that("creature")} attacks, it gets +1/+1 until end of turn for each opponent you attacked with a creature this combat.
keyword:
keyword: Monarch
match: become the monarch
@@ -1124,13 +1157,18 @@ keyword:
keyword: Crew
match: Crew number
mode: expert
- reminder: Tap any number of untapped creatures you control with total power {param1} or greater: This permanent becomes an artifact creature until end of turn.
+ reminder: Tap any number of creatures you control with total power {param1} or greater: This {separate_words(spacer: " ", card.sub_type)} becomes an artifact creature until end of turn.
keyword:
keyword: Fabricate
match: Fabricate number
mode: expert
- reminder: When this permanent enters the battlefield, you may put {english_number_a(param1)} +1/+1 counter(s) on it. If you don't, create {param1} 1/1 colorless Servo artifact creature tokens.
+ reminder: When {this_or_that("permanent")} enters the battlefield, you may put {english_number_a(param1)} +1/+1 counter(s) on it. If you don't, create {english_number_a(param1)} 1/1 colorless Servo artifact creature token(s).
# Commander 2016
+keyword:
+ keyword: Partner with
+ match: Partnename with name
+ mode: expert
+ reminder: When this {if has_pt() then "creature" else "permanent"} enters the battlefield, target player may put {legend_filter(param2)} into their hand from their library, then shuffle.
keyword:
keyword: Partner
match: Partner
@@ -1168,12 +1206,12 @@ keyword:
match: exert
mode: action
reminder: An exerted {if has_pt() then "creature" else "permanent"} won't untap during your next untap step.
-#Hour of Devestation
+#Hour of Devastation
keyword:
keyword: Afflict
match: Afflict number
mode: expert
- reminder: Whenever this creature becomes blocked, defending player loses {param1} life.
+ reminder: Whenever {this_or_that("creature")} becomes blocked, defending player loses {param1} life.
keyword:
keyword: Eternalize
match: Eternalize cost
@@ -1195,7 +1233,7 @@ keyword:
keyword: Explore
match: explores
mode: action
- reminder: Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.
+ reminder: Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on {this_or_that("creature")}, then put the card back or put it into your graveyard.
#Unstable
keyword:
keyword: Assemble a Contraption
@@ -1218,7 +1256,7 @@ keyword:
keyword: Art menace
match: Art menace
mode: expert
- reminder: This creature can't be blocked except by creatures with two or more visible figures in their art.
+ reminder: {this_or_that("creature", upper:true)} can't be blocked except by creatures with two or more visible figures in their art.
keyword:
keyword: Augment
match: Augment cost
@@ -1228,7 +1266,7 @@ keyword:
keyword: Blurry
match: Blurry
mode: expert
- reminder: This creature can be blocked only if defending player was wearing glasses as it was cast.
+ reminder: {this_or_that("creature", upper:true)} can be blocked only if defending player was wearing glasses as it was cast.
keyword:
keyword: Just a second
match: Just a second
@@ -1239,17 +1277,17 @@ keyword:
keyword: Last strike
match: Last strike
mode: expert
- reminder: This creature deals combat damage after creatures without last strike.
+ reminder: {this_or_that("creature", upper:true)} deals combat damage after creatures without last strike.
keyword:
keyword: Squirrellink
match: Squirrellink
mode: expert
- reminder: Damage dealt by this creature also causes you to create that many 1/1 green Squirrel creature tokens.
+ reminder: Damage dealt by {this_or_that("creature")} also causes you to create that many 1/1 green Squirrel creature tokens.
keyword:
keyword: Triple strike
match: Triple strike
mode: expert
- reminder: This creature deals first-strike, regular, and last-strike combat damage.
+ reminder: {this_or_that("creature", upper:true)} deals first-strike, regular, and last-strike combat damage.
keyword:
keyword: Undeathtouch
match: Undeathtouch
@@ -1267,3 +1305,251 @@ keyword:
match: historic
mode: action
reminder: Artifacts, legendaries, and Sagas are historic.
+#Battlebond
+keyword:
+ keyword: Assist
+ match: Assist
+ mode: expert
+ reminder: Another player can pay up to {if contains(card.casting_cost, match:"X") then "X" else generic_mana(card.casting_cost)} of this spell's cost.{if contains(card.casting_cost, match:"X") then " You choose the value of X."}
+#Commander 2019
+keyword:
+ keyword: Commander ninjutsu
+ match: Commander ninjutsu cost
+ mode: expert
+ reminder: {param1}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand or the command zone tapped and attacking.
+keyword:
+ keyword: Treasure token
+ match: Treasure toke*s
+ mode: core
+ reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "T, Sacrifice this artifact: Add one mana of any color."
+#Guilds of Ravnica
+keyword:
+ keyword: Jump-start
+ match: Jump-start
+ mode: expert
+ reminder: You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.
+keyword:
+ keyword: Mentor
+ match: Mentor
+ mode: expert
+ reminder: Whenever {this_or_that("creature")} attacks, put a +1/+1 counter on target attacking creature with lesser power.
+keyword:
+ keyword: Surveil
+ match: Surveil number
+ mode: action
+ reminder:
+ Look at the top {
+ if param1.value=="1" then "card of your library. You may put that card into your graveyard."
+ else "{english_number(param1)} cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order."
+ }
+keyword:
+ keyword: Undergrowth
+ match: Undergrowth
+ mode: pseudo
+ rules: Undergrowth — [effect], where X is the number of creature cards in your graveyard.
+#Ravnica Allegiance
+keyword:
+ keyword: Adapt
+ match: Adapt number
+ mode: action
+ reminder: If {this_or_that("creature")} has no +1/+1 counters on it, put {english_number_a(param1)} +1/+1 counter(s) on it.
+keyword:
+ keyword: Addendum
+ match: Addendum
+ mode: pseudo
+ rules: Addendum — If you cast this spell during your main phase, [effect].
+keyword:
+ keyword: Afterlife
+ match: Afterlife number
+ mode: expert
+ reminder: Whenever {this_or_that("creature")} dies, create {english_number_a(param1)} 1/1 white and black Spirit creature token(s) with flying.
+keyword:
+ keyword: Riot
+ match: Riot
+ mode: expert
+ reminder: {this_or_that("creature", upper:true)} enters the battlefield with your choice of a +1/+1 counter or haste.
+keyword:
+ keyword: Spectacle
+ match: Spectacle cost
+ mode: expert
+ reminder: You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.
+#War of the Spark
+keyword:
+ keyword: Amass
+ match: Amass number
+ mode: action
+ reminder: Put {english_number_a(param1)} +1/+1 counter(s) on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.
+#Throne of Eldraine
+keyword:
+ keyword: Adamant
+ match: Adamant
+ mode: pseudo
+ rules: Adamant — If at least three [color] mana was spent to cast this spell, [effect].
+keyword:
+ keyword: Food token
+ match: Food toke*s
+ mode: core
+ reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "2, T, Sacrifice this artifact: You gain 3 life."
+#Theros Beyond Death
+keyword:
+ keyword: Escape
+ match: Escape cost
+ mode: expert
+ reminder: You may cast this card from your graveyard for its escape cost.
+keyword:
+ keyword: Gold token
+ match: Gold toke*s
+ mode: core
+ reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "Sacrifice this artifact: Add one mana of any color."
+#Ikoria: Lair of Behemoths
+keyword:
+ keyword: Mutate
+ match: Mutate cost
+ mode: expert
+ reminder: If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.
+keyword:
+ keyword: Companion
+ match: Companion — name
+ mode: expert
+ reminder: If this card is your chosen companion, you may put it into your hand from outside the game for [3] any time you could cast a sorcery.
+#Magic 2021
+keyword:
+ keyword: Mill
+ match: mill one_word
+ mode: core
+ reminder: {if param1.value == "mills" then "They put" else "Put"} the top {if param2.value == "a" then "" else param2 + " "}{if param2.value == "a" then "card" else "cards"} of {if param1.value == "mills" then "their library into their" else "your library into your"} graveyard.
+keyword:
+ keyword: phases out
+ match: phases out
+ mode: expert
+ reminder: Treat it and anything attached to it as though they don't exist until its controller's next turn.
+#Zendikar Rising
+keyword:
+ keyword: Party
+ match: party
+ mode: action
+ reminder: Your party consists of up to one of each of Cleric, Rogue, Warrior, and Wizard.
+#Commander Legends
+keyword:
+ keyword: Encore
+ match: Encore cost
+ mode: action
+ reminder: {param1}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.
+#Kaldheim
+keyword:
+ keyword: Shard token
+ match: Shard toke*s
+ mode: core
+ reminder: {if param1.value == "ns" then "They’re enchantments" else "It’s an enchantment"} with "2, Sacrifice this enchantment: Scry ]1[, then draw a card."
+keyword:
+ keyword: Boast
+ match: Boast
+ mode: expert
+ reminder: Activate this ability only if {this_or_that("creature")} attacked this turn and only once each turn.
+keyword:
+ keyword: Foretell
+ match: Foretell cost
+ mode: expert
+ reminder: During your turn, you may pay [2] and exile this card from your hand face down. Cast it on a later turn for its foretell cost.
+#Strixhaven
+keyword:
+ keyword: Learn
+ match: learn
+ mode: action
+ reminder: You may reveal a Lesson card you own from outside the game and put it into your hand, or discard a card to draw a card.
+keyword:
+ keyword: Ward
+ match: Ward cost
+ mode: expert
+ reminder: Whenever {this_or_that("permanent")} becomes the target of a spell or ability an opponent controls, counter it unless that player {for_mana_costs(add:"pays ", non:"", param1, action:true)}.
+keyword:
+ keyword: Magecraft
+ match: Magecraft
+ mode: pseudo
+ rules: Magecraft — Whenever you cast or copy an instant or sorcery spell, [effect].
+# Modern Horizons 2
+keyword:
+ keyword: Devour type
+ match: Devour one_word number
+ mode: expert
+ reminder: As this enters the battlefield, you may sacrifice any number of {english_plural(param1.value)}. {this_or_that("creature", upper:true)} enters the battlefield with { if param2.value == "1" then "" else if param2.value == "2" then "twice " else english_number(param2) + " times " }that many +1/+1 counters on it.
+keyword:
+ keyword: Trample over
+ match: Trample over name
+ mode: expert
+ reminder: {this_or_that("creature", upper:true)} can deal excess combat damage to the controller of {if param1.value == "planeswalkers" then "the planeswalker it's attacking" else param1.value + " blocking it"}.
+# Adventures in the Forgotten Realms
+keyword:
+ keyword: Venture into
+ match: Venture into name
+ mode: action
+ reminder: Enter the first room or advance to the next room.
+keyword:
+ keyword: Pack tactics
+ match: Pack tactics
+ mode: pseudo
+ rules: Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, [effect].
+# Commander 2021
+keyword:
+ keyword: Demonstrate
+ match: Demonstrate
+ mode: expert
+ reminder: When you cast this spell, you may copy it. If you do, choose an opponent to also copy it.
+# Midnight Hunt
+keyword:
+ keyword: Daybound
+ match: Daybound
+ mode: expert
+ reminder: If a player casts no spells during their own turn, it becomes night next turn.
+keyword:
+ keyword: Nightbound
+ match: Nightbound
+ mode: expert
+ reminder: If a player casts at least two spells during their own turn, it becomes day next turn.
+keyword:
+ keyword: Disturb
+ match: Disturb cost
+ mode: expert
+ reminder: You may cast this card from your graveyard transformed for its disturb cost.
+keyword:
+ keyword: Decayed
+ match: Decayed
+ mode: expert
+ reminder: {if contains(card.type, match:"Token") then "This creature" else "It"} can't block. When it attacks, sacrifice it at end of combat.
+keyword:
+ keyword: Coven
+ match: Coven
+ mode: pseudo
+ rules: Coven — if you control three or more creatures with different powers, [effect].
+# Crimson Vow
+keyword:
+ keyword: Cleave
+ match: Cleave cost
+ mode: expert
+ reminder: You may cast this spell for its cleave cost. If you do, remove the words in square brackets.
+keyword:
+ keyword: Training
+ match: Training
+ mode: expert
+ reminder: Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature.
+keyword:
+ keyword: Blood token
+ match: Blood toke*s
+ mode: expert
+ reminder: {if param1.value == "ns" then "They’re artifacts" else "It’s an artifact"} with "1, T, Discard a card, Sacrifice this artifact: Draw a card."
+# Kamigawa Neon Dynasty
+keyword:
+ keyword: Reconfigure
+ match: Reconfigure cost
+ mode: expert
+ reminder: {param1}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.
+keyword:
+ keyword: modified
+ match: modified
+ mode: action
+ reminder: Equipment, Auras you control, and counters are modifications.
+keyword:
+ keyword: Compleated
+ match: Compleated
+ mode: expert
+ reminder: {phy_reminder(card.casting_cost)} If life was paid, this planeswalker enters with two fewer loyalty counters.
\ No newline at end of file
diff --git a/data/magic.mse-game/keywords_custom b/data/magic.mse-game/keywords_custom
new file mode 100644
index 00000000..5f282702
--- /dev/null
+++ b/data/magic.mse-game/keywords_custom
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/data/magic.mse-game/language b/data/magic.mse-game/language
index 3b25bec7..f9466970 100644
--- a/data/magic.mse-game/language
+++ b/data/magic.mse-game/language
@@ -4,7 +4,7 @@
languages := [
English: [
code : "en",
- spellcheck_code : "en_us",
+ spellcheck_code : "en_US",
pt_separator : "/",
type_separator : " — ",
subtype_separator : " ",
@@ -14,24 +14,137 @@ languages := [
is_land : match@(match: "(?i)Land")
is_enchantment : match@(match: "(?i)Enchantment")
is_spell : match@(match: "(?i)Instant|Sorcery")
- is_planeswalker : match@(match: "(?i)Planeswalker")
+ is_planeswalker : match@(match: "(?i)Planeswalker|Emblem")
+ is_plane : match@(match: "(?i)Plane(?!swalker)")
+ word_list : "word_list"
+ ],
+ Russian: [
+ code : "ru",
+ spellcheck_code : "ru_RU",
+ pt_separator : "/",
+ type_separator : " — ",
+ subtype_separator : " ",
+ is_creature : match@(match: "(?i)Существо")
+ is_tribal : match@(match: "(?i)Племенное")
+ is_artifact : match@(match: "(?i)Артефакт")
+ is_land : match@(match: "(?i)Земля")
+ is_enchantment : match@(match: "(?i)Чары")
+ is_spell : match@(match: "(?i)Мгновенное заклинание|Волшебство")
+ is_planeswalker : match@(match: "(?i)Planeswalker|Emblem")
+ is_plane : match@(match: "(?i)Plane(?!swalker)")
+ word_list : "word_list_ru"
+ ],
+ Italiano: [
+ code : "it",
+ spellcheck_code : "it_IT",
+ pt_separator : "/",
+ type_separator : " — ",
+ subtype_separator : " ",
+ is_creature : match@(match: "(?i)Creatura")
+ is_tribal : match@(match: "(?i)Tribale")
+ is_artifact : match@(match: "(?i)Artefatto")
+ is_land : match@(match: "(?i)Terra")
+ is_enchantment : match@(match: "(?i)Incantesimo")
+ is_spell : match@(match: "(?i)Istantaneo|Stregoneria")
+ is_planeswalker : match@(match: "(?i)Planeswalker|Emblem")
+ is_plane : match@(match: "(?i)Plane(?!swalker)")
+ word_list : "word_list_it"
+ ],
+ "Português do Brasil" : [
+ code : "pt-br",
+ spellcheck_code : "pt_BR",
+ pt_separator : "/",
+ type_separator : " — ",
+ subtype_separator : " ",
+ is_creature : match@(match: "(?i)Criatura")
+ is_tribal : match@(match: "(?i)Tribal")
+ is_artifact : match@(match: "(?i)Artefato")
+ is_land : match@(match: "(?i)Terreno")
+ is_enchantment : match@(match: "(?i)Encantamento")
+ is_spell : match@(match: "(?i)Mágica Instantânea|Feitiço")
+ is_planeswalker : match@(match: "(?i)Planeswalker|Emblem")
+ is_plane : match@(match: "(?i)Plane(?!swalker)")
+ word_list : "word_list_pt"
],
-
Français: [
code : "fr",
- spellcheck_code : "", # TODO: get dictionary
+ spellcheck_code : "fr_FR",
pt_separator : "/",
type_separator : " : "
subtype_separator : " et ",
is_creature : match@(match: "(?i)Creature|Créature")
- is_tribal : match@(match: "(?i)Tribal")
- is_artifact : match@(match: "(?i)Artifact")
- is_land : match@(match: "(?i)Land")
- is_enchantment : match@(match: "(?i)Enchantment")
- is_spell : match@(match: "(?i)Instant|Sorcery")
+ is_tribal : match@(match: "(?i)tribal")
+ is_artifact : match@(match: "(?i)Artefact")
+ is_land : match@(match: "(?i)Terrain")
+ is_enchantment : match@(match: "(?i)Enchantement")
+ is_spell : match@(match: "(?i)Éphémère|Rituel")
is_planeswalker : match@(match: "(?i)Planeswalker")
+ is_plane : match@(match: "(?i)Plane(?!swalker)")
+ word_list : "word_list_fr"
]
]
# The selected language
-language := { languages[set.card_language] or else language.English }
+language := { languages[set.card_language] or else languages.English }
+spanish_number := {
+ input := remove_tags(input)
+ espanol_ones_array := ["cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince"]
+ espanol_tens_array := ["cero", "diec", "viente", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa"]
+ function_map := [
+ small: {espanol_ones_array[input]},
+ large: {
+ ones := input mod 10
+ tens := (input - ones) / 10
+ final_answer := espanol_tens_array[tens] + " y " + espanol_ones_array[ones]
+ final_answer := replace(final_answer, match:" y cero", replace:"") ##remove redundant "and zero"
+ final_answer := replace(final_answer, match:"(diec|vient)e? y ", replace:"\\1i") ##16-29 are one word
+ final_answer
+ },
+ oversized: {input}
+ ]
+ if input == "number" then ""
+ else if input < 16 then function_map["small"]()
+ else if input < 100 then function_map["large"]()
+ else function_map["oversized"]()
+}
+portuguese_number := {
+ input := remove_tags(input)
+ portugues_ones_array := ["zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", "onze", "doze", "treze", "catorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove"]
+ portugues_tens_array := ["zero", "deze", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"]
+ function_map := [
+ small: {portugues_ones_array[input]},
+ large: {
+ ones := input mod 10
+ tens := (input - ones) / 10
+ final_answer := portugues_tens_array[tens] + " e " + portugues_ones_array[ones]
+ final_answer := replace(final_answer, match:" e zero", replace:"") ##remove redundant "and zero"
+ final_answer
+ },
+ oversized: {input}
+ ]
+ if input == "number" then ""
+ else if input < 20 then function_map["small"]()
+ else if input < 100 then function_map["large"]()
+ else function_map["oversized"]()
+}
+french_number := {
+ input := remove_tags(input)
+ francais_ones_array := ["zéro", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "nuef", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize","dix-sept","dix-huit","dix-neuf"]
+ francais_tens_array := ["zéro", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingts", "quatre-vingt-dix"]
+ function_map := [
+ small: {francais_ones_array[input]},
+ large: {
+ ones := input mod 10
+ tens := (input - ones) / 10
+ final_answer := francais_tens_array[tens] + "-" + francais_ones_array[ones]
+ final_answer := replace(final_answer, match:"-zéro", replace:"") ##remove redundant "and zero"
+ final_answer := replace(final_answer, match:"-un", replace:" et un") ##21, 31 et al. use "et un"
+ final_answer
+ },
+ oversized: {input}
+ ]
+ if input == "number" then ""
+ else if input < 20 then function_map["small"]()
+ else if input < 100 then function_map["large"]()
+ else function_map["oversized"]()
+}
diff --git a/data/magic.mse-game/magic-words.en_us.dic b/data/magic.mse-game/magic-words.en_us.dic
index 60ec4797..b2cd050e 100644
--- a/data/magic.mse-game/magic-words.en_us.dic
+++ b/data/magic.mse-game/magic-words.en_us.dic
@@ -172,4 +172,5 @@ earthen
hedron
thrull
arcun
-merfolk
\ No newline at end of file
+merfolk
+ziziziz
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.fr_FR b/data/magic.mse-game/magic-words.fr_FR
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.fr_FR
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.fr_FR.dic b/data/magic.mse-game/magic-words.fr_FR.dic
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.fr_FR.dic
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.it_IT b/data/magic.mse-game/magic-words.it_IT
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.it_IT
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.it_IT.dic b/data/magic.mse-game/magic-words.it_IT.dic
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.it_IT.dic
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.pt_BR b/data/magic.mse-game/magic-words.pt_BR
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.pt_BR
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.pt_BR.dic b/data/magic.mse-game/magic-words.pt_BR.dic
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.pt_BR.dic
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.ru_RU b/data/magic.mse-game/magic-words.ru_RU
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.ru_RU
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/magic-words.ru_RU.dic b/data/magic.mse-game/magic-words.ru_RU.dic
new file mode 100644
index 00000000..60ec4797
--- /dev/null
+++ b/data/magic.mse-game/magic-words.ru_RU.dic
@@ -0,0 +1,175 @@
+148
+mana
+untap/MSDRJZG
+unblockable
+planeswalker
+noncreature
+nonland
+nonenchantment
+nonartifact
+nonwhite
+nonblue
+nonblack
+nonred
+nongreen
+unblock/USDG
+precombat
+postcombat
+scry
+plainswalk
+islandwalk
+swampwalk
+mountainwalk
+forestwalk
+landwalk
+desertwalk
+plainshome
+islandhome
+swamphome
+mountainhome
+foresthome
+landhome
+soulshift
+ninjitsu
+bushido
+lifelink
+gravestorm
+fateseal
+bloodthirst
+djinn
+unattach
+face-down
+face-up
+spell's
+guerrilas
+mages
+exit-the-battlefield
+enter-the-battlefield
+havok
+spectre
+gargadon
+gargadons
+Crovax
+evincar
+and/or
+20/20
+planeswalkers
+Merfolk
+deathtouch
+noncombat
+Urza
+Karn
+Ajani
+Goldmane
+Jace
+Beleren
+Liliana
+Vess
+Chandra
+Nalaar
+Garruk
+Wildspeaker
+Tezzeret
+Elspeth
+Tirel
+Nicol
+Bolas
+Sarkhan
+Vol
+Nissa
+Revane
+Baltrice
+Crucius
+scryers
++1
+etherium
+-1
+Kothophed
+wurm
+Tolaria
+Weatherlight
+Ertai
+Barrin
+Dominaria
+Benalish
+Benalia
+Sisay
+golem
+Keld
+Maraxus
+Volrath
+Mirri
+Multani
+maro-sorcerer
+Squee
+Tahngarth
+Crovax
+Selenia
+Greven
+il-Vec
+Argive
+Samite
+Orim
+Argivian
+Rath
+Starke
+Sidar
+Kondo
+evincar
+multiverse
+Eladamri
+Skyshroud
+guerilla
+Soltari
+Lyna
+Rofellos
+spellcasting
+Korvecdal
+Vuel
+Takara
+self-interest
+Ashnod
+Mishra
+Fallaji
+Gix
+Phyrexia
+Phyrexian
+supremacy
+Tawnos
+Argoth
+Xantcha
+Saproling
+nontoken
+mage
+Ashling
+Jaya
+Maralen
+Mornsong
+non-Sliver
+non-Shapeshifter
+Thopter
+Kraken
+
+
+and/or
+primordial
+non-Dragon
+nonpermanent
+noninstant
+nonplaneswalker
+nonenchantment
+nonsorcery
+nonartifact
+non-Human
+Hellkite
+hexproof
+draughts
+dwarves
+sigil
+dwarven
+axe
+earthen
+hedron
+thrull
+arcun
+merfolk
\ No newline at end of file
diff --git a/data/magic.mse-game/packs b/data/magic.mse-game/packs
index 8817caf2..d95ee5e5 100644
--- a/data/magic.mse-game/packs
+++ b/data/magic.mse-game/packs
@@ -1,4 +1,8 @@
pack type:
+ name: random
+ select: no replace
+ filter: not is_token_card()
+pack type:
name: basic land
select: equal
filter: card.rarity == "basic land" and not is_token_card() and not is_masterpiece() # can be shifted
@@ -164,6 +168,11 @@ pack type:
name: basic land or else common
item:
name: token / rulestip
+pack type:
+ name: opening hand
+ item:
+ name: random
+ amount: 7
pack type:
name: additional land
diff --git a/data/magic.mse-game/packs - backup b/data/magic.mse-game/packs - backup
deleted file mode 100644
index 068f3601..00000000
--- a/data/magic.mse-game/packs - backup
+++ /dev/null
@@ -1,187 +0,0 @@
-
-############################################################## Card pack types
-
-pack type:
- name: basic land
- select: equal
- filter: card.rarity == "basic land" and not is_token_card()
-pack type:
- name: common
- filter: card.rarity == "common" and not is_token_card() and not is_shifted_card()
-pack type:
- name: uncommon
- filter: card.rarity == "uncommon" and not is_token_card() and not is_shifted_card()
-pack type:
- name: rare
- filter: card.rarity == "rare" and not is_token_card() and not is_shifted_card()
-pack type:
- name: mythic rare
- filter: card.rarity == "mythic rare" and not is_token_card() and not is_shifted_card()
-pack type:
- name: special
- filter: card.rarity == "special" and not is_token_card()
-pack type:
- name: shifted common
- filter: card.rarity == "common" and not is_token_card() and is_shifted_card()
-pack type:
- name: shifted uncommon
- filter: card.rarity == "uncommon" and not is_token_card() and is_shifted_card()
-pack type:
- name: shifted rare
- filter:
- ( card.rarity == "rare" or
- card.rarity == "mythic rare" # We've got to put shifted mythic rares somewhere
- ) and not is_token_card() and is_shifted_card()
-
-pack type:
- name: token / rulestip
- filter: is_token_card()
-
-
-############################################################## shifted/special if possible
-
-# shifted common if they exist, otherwise a normal common
-pack type:
- name: shifted common or else common
- selectable: false
- select: first
- item: shifted common
- item: common
-
-# basic land if it exist, otherwise a common
-pack type:
- name: basic land or else common
- selectable: false
- select: first
- item: basic land
- item: common
-
-# special if it exist, otherwise a common
-pack type:
- name: special or else common
- selectable: false
- select: first
- item: special
- item: common
-
-# shifted uncommon/rare if they exist, otherwise a normal uncommon
-pack type:
- name: shifted uncommon or rare or else uncommon
- selectable: false
- select: first
- item: shifted uncommon or rare
- item: uncommon
-
-############################################################## Randomized selections
-
-pack type:
- name: mythic rare or rare
- selectable: false
- # In Shards of Alara there are 15 mythic rares and 53 rares.
- # Each booster has a 1/8 chance of containing a mythic rare.
- # This means that looking at single mythics : rares, the proportion is
- # 1*53 : 7*15 = 53 : 105
- # this is almost exactly 1 : 2,
- # So, a a single mythic is 2 times as rare as a single normal rare.
- #
- # We use this proportional system instead of a fixed 1:7 system,
- # because it copes better with cases where there are few mythics.
- # For example, if a set has 1 mythic and 20 rares, you would actually
- # be MORE likely to find the mythic card with the 1:7 system!
- select: proportional
- item:
- name: mythic rare
- weight: 1
- item:
- name: rare
- weight: 2
-
-pack type:
- name: shifted uncommon or rare
- selectable: false
- select: nonempty
- item:
- name: shifted uncommon
- weight: 3
- item:
- name: shifted rare
- weight: 1
-
-############################################################## Common proportions of cards
-
-# of the common slots, 3/10 will be shifted, 1/10 will be special
-pack type:
- name: common sometimes shifted or special
- selectable: false
- # TODO: Perhaps use some kind of proportional system here as well?
- select: equal
- item:
- name: common
- weight: 6
- item:
- name: shifted common or else common
- weight: 3
- item:
- name: special or else common
- weight: 1
-
-# of the uncommon slots, 1/3 will be shifted, 1/4 of that will be shifted rares instead
-pack type:
- name: uncommon sometimes shifted
- selectable: false
- select: equal
- item: uncommon
- item: uncommon
- item: shifted uncommon or rare or else uncommon
-
-
-############################################################## Card packs
-
-pack type:
- name: tournament pack
- item:
- name: mythic rare or rare
- amount: 3
- item:
- name: uncommon sometimes shifted
- amount: 9
- item:
- name: common sometimes shifted or special
- amount: 33
- item:
- name: basic land
- amount: 30
- item:
- name: token / rulestip
-pack type:
- name: booster pack
- item:
- name: mythic rare or rare
- amount: 1
- item:
- name: uncommon sometimes shifted
- amount: 3
- # a total of 11 common-likes
- item:
- name: common sometimes shifted or special
- amount: 10
- item:
- name: basic land or else common
- item:
- name: token / rulestip
-
-pack type:
- name: additional land
- item: basic land
-pack type:
- name: additional common
- item: common sometimes shifted or special
-pack type:
- name: additional uncommon
- item: uncommon sometimes shifted
-pack type:
- name: additional rare
- item: mythic rare or rare
-pack type:
- name: additional token / rulestip
- item: token / rulestip
diff --git a/data/magic.mse-game/script b/data/magic.mse-game/script
index 3e6506a4..066549bd 100644
--- a/data/magic.mse-game/script
+++ b/data/magic.mse-game/script
@@ -1,37 +1,65 @@
############################################################## Localization
include file: language
+# needed by all style files anyway
+include file: /magic-blends.mse-include/new-blends
+############################################################## version check
+version_date := {"2022-01-30"}
############################################################## Sorting mana symbols
# correctly sort a mana symbol (no guild mana)
-mana_sort := sort_text@(order: "XYZI[0123456789]DHSC(WUBRG)")
+mana_sort := sort_text@(order: "\\?XYZI[0123456789]VLHSCAIE(WUBRG)")
# correctly sort wedge mana
-mana_sort_wedge := sort_text@(order: "XYZI[0123456789]DHSC(WBGUR)")
+mana_sort_wedge := sort_text@(order: "\\?XYZI[0123456789]VLHSCAIE(WBGUR)")
+mana_unsort := sort_text@(order:"[/\\?XYZI0123456789VLHSCAIEWUBRG]")
# correctly sort guild mana
-mana_sort_guild := sort_text@(order: "[XYZI01234567890DHSCWUBRG/|]") +
+mana_sort_guild := sort_text@(order: "[\\?XYZI01234567890VLHSCAIEWUBRG/|]") +
replace@(
# No lookbehind :(
#match: "(?($|[^/])",
- replace: {sort_text(order:"in_place((WUBRG)")}
+ replace: {sort_text(order:"in_place((WUBRG))")}
)
mana_has_guild := match@(match: "[/|]") # Is there guild or half mana in the input?
-mana_is_wedge := { contains(set.mana_cost_sorting, match: "wedge") and ( number_of_items(in: sort_text(order:"", card.casting_cost), filter: "") == 3 ) }
+mana_is_wedge := { chosen(set.mana_cost_sorting, choice: "tarkir wedge sorting") and ( number_of_items(in: sort_text(order:"", input), filter: "") == 3 ) }
+mana_has_wedge := { mana_is_wedge() and (sort_text(order:"", input) == "WUR" or sort_text(order:"", input) == "WBR" or sort_text(order:"", input) == "WBG" or sort_text(order:"", input) == "UBG" or sort_text(order:"", input) == "URG")}
+# convert card.card_color to WUBRG
+card_color_to_letters := {
+ color_string := trim_colors(input)
+ out_string := (if contains(color_string, match:"white") then "W" else "")+(if contains(color_string, match:"blue") then "U" else "")+(if contains(color_string, match:"black") then "B" else "")+(if contains(color_string, match:"red") then "R" else "")+(if contains(color_string, match:"green") then "G" else "")
+ out_string
+}
+card_is_wedge := {
+ color_string := card_color_to_letters(input)
+ if color_string == "WUR" or color_string == "WBR" or color_string == "WBG" or color_string == "UBG" or color_string == "URG" then true else false
+}
+list_colors := {
+ list := trim_colors(input)
+ cc := length(comma_count(list))
+ if cc == 1 then
+ list := replace(list, match:", ", replace:" and ")
+ if cc > 1 then
+ list := replace(list, match:", ", replace:", and ", in_context:"[^ ]+$")
+ list
+}
# A mana cost can contain both normal and guild mana
mana_filter := to_upper + {
- if contains(set.mana_cost_sorting, match: "unsorted") then input
+ if chosen(set.mana_cost_sorting, choice: "unsorted") then mana_unsort()
else if mana_has_guild() then mana_sort_guild()
- else if mana_is_wedge() then mana_sort_wedge()
+ else if mana_has_wedge(input) then mana_sort_wedge(input)
else mana_sort()
}
# Like mana filter, only also allow tap symbols:
+tap_reduction :=
+ replace@(match:"T+", replace:"T")+
+ replace@(match:"Q+", replace:"Q")
tap_filter := sort_text@(order: "")
mana_filter_t := replace@( # Remove [] used for forcing mana symbols
match: "[\\[\\]]",
replace: ""
- ) + { tap_filter() + mana_filter() }
+ ) + { tap_reduction(tap_filter()) + mana_filter() }
############################################################## Determine card color
@@ -45,12 +73,20 @@ color_name := {
else if input == "G" then "green"
else ""
}
+mana_name := {
+ if input == "white" then "W"
+ else if input == "blue" then "U"
+ else if input == "black" then "B"
+ else if input == "red" then "R"
+ else if input == "green" then "G"
+ else "C"
+}
color_names_1 := { color_name(colors.0) }
color_names_2 := { color_name(colors.0) + ", " + color_name(colors.1) }
color_names_3 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) }
color_names_4 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) + ", " + color_name(colors.3) }
color_names_5 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) + ", " + color_name(colors.3) + ", " + color_name(colors.4) }
-# color based on mana cost, input = a mana cost
+# color based on mana cost, input == a mana cost
color_filter := sort_text@(order: "")
color_filterH := sort_text@(order: ">")
mana_to_color := {
@@ -91,7 +127,7 @@ mana_to_color := {
else "multicolor"
}
-# color based on land text box, input = textbox contents
+# color based on land text box, input == textbox contents
color_text_filter :=
# remove activation costs
replace@(
@@ -116,57 +152,65 @@ land_to_color := {
else if watermark == "mana symbol black" then "black, land"
else if watermark == "mana symbol red" then "red, land"
else if watermark == "mana symbol green" then "green, land"
- else land_multicolor(colors:color_text_filter(input: card.rule_text))
-};
+ else land_multicolor(colors:color_text_filter(input: rules))
+}@(rules:card.rule_text)
# Look for a CDA that defines colors
text_to_color := {
# Note: running filter_text is quite slow, do a quick 'contains' check first
- if contains(match: card_name) then (
+ if contains(match: card_name + " is") then (
text := filter_text(match: "is (colorless|all colors|((blue|white|green|red|black)((,|,? and) (blue|white|green|red|black))*))", in_context: regex_escape(card_name)+"([-a-z]+>)* \\.")
if text != "" then (
if contains(text, match: "all colors") then (
- colors := "WUBRG"
- if land == "land" then land_multicolor()
- else mana_to_color(hybrid: "")
+ colors := "WUBRG"
+ if land == "true" then land_multicolor()
+ else mana_to_color(hybrid: "")
) else (
- colors := ""
- if contains(text, match: "white") then colors := colors + "W"
- if contains(text, match: "blue") then colors := colors + "U"
- if contains(text, match: "black") then colors := colors + "B"
- if contains(text, match: "red") then colors := colors + "R"
- if contains(text, match: "green") then colors := colors + "G"
- if land == "land" then land_multicolor()
- else mana_to_color(hybrid: "")
+ colors := ""
+ if contains(text, match: "white") then colors := colors + "W"
+ if contains(text, match: "blue") then colors := colors + "U"
+ if contains(text, match: "black") then colors := colors + "B"
+ if contains(text, match: "red") then colors := colors + "R"
+ if contains(text, match: "green") then colors := colors + "G"
+ if land == "true" then land_multicolor()
+ else mana_to_color(hybrid: "")
)
- ) else (
- colors := ""
)
- ) else (
- colors := ""
+ else ""
)
-};
+ else ""
+}
-# The color of a card
is_creature := match@(match: "(?i)Creature")
+is_creaturish := match@(match: "(?i)(Creature|Vehicle)")
is_tribal := match@(match: "(?i)Tribal")
is_artifact := match@(match: "(?i)Artifact")
is_land := match@(match: "(?i)Land")
is_enchantment := match@(match: "(?i)Enchantment")
+is_aura := match@(match: "(?i)Aura")
is_spell := match@(match: "(?i)Instant|Sorcery")
+is_sorcery := match@(match: "(?i)Sorcery")
+is_instant := match@(match: "(?i)Instant")
+is_planeswalker := match@(match: "(?i)Planeswalker")
+is_legendary := match@(match: "(?i)Legendary")
+match_vehicle := contains@(match:"Vehicle")
+match_snow := contains@(match:"Snow")
+
+# The color of a card
card_color := {
# usually the color of mana
text_color := text_to_color(rules_text, land: is_land(type));
if text_color == "" then (
mana_color := mana_to_color(colors: color_filter(casting_cost), hybrid: color_filterH(casting_cost))
- if mana_color == "colorless" and is_land (type) then land_to_color(watermark)
+ if mana_color == "colorless" and is_land (type) then land_to_color(watermark, rules:rules_text)
else if mana_color == "colorless" and is_artifact(type) then "artifact"
else if mana_color == "colorless" and contains(card.shape, match:"flip") then default
else mana_color
)
else text_color
};
-
+##todo check nil
+has_two_names := {contains(card.shape, match:"split") or contains(card.shape, match:"adventure") or contains(card.shape, match:"flip") or contains(card.shape, match:"double faced") or contains(card.shape, match:"aftermath")}
# Number of colors in a card_color
card_color_color_count := count_chosen@(choices: "white,blue,black,red,green,artifact")
# Clean up color field
@@ -185,12 +229,13 @@ card_color_filter := {
input
}
-# needed by all style files anyway
-include file: /magic-blends.mse-include/new-blends
-
############################################################## Card number
-
+# exportname
+ exporter_name_filter := filter_text@(match:"!exporte?r?name [^\n!]+")
+ exporter_name_grabber := replace@(match:"!exporte?r?name ", replace:"")
+ export_name := { exporter_name_grabber(exporter_name_filter(card.notes))}
+
# Index for sorting, white cards are first, so white->A, blue->B, .. ,
# The code consists of 3 parts:
# color, shifted, split
@@ -202,7 +247,7 @@ sort_index := {
}
# Process the name for sorting rules
sort_name :=
- # Remove "The", "A", and "And" at the beginning
+ # Remove "The", "A", and "An" at the beginning
replace@(match: "^(The|An?) ", replace: "") +
# Remove commas and apostrophes
replace@(match: "(,|'|’)", replace: "") +
@@ -303,7 +348,7 @@ set_filter := {
# TODO: what about rulestips?
if is_unsorted() then
{ is_unsorted() }
- if card.shape == "token" or card.shape == "emblem" then
+ else if card.shape == "token" or card.shape == "emblem" then
{ card.shape == "token" or card.shape == "emblem" }
else if card.shape == "rulestip" then
{ card.shape == "rulestip" }
@@ -312,25 +357,26 @@ set_filter := {
else if card.shape == "checklist" then
{ card.shape == "checklist" }
else if is_masterpiece() and card.shape != "token" and card.shape != "emblem" then
- { is_masterpiece() and card.shape != "token" and card.shape != "emblem" }
- else if set.sort_special_rarity != "separate numbering" then
- { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist"}
- else if card.rarity == "special" then
- { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist" and card.rarity == "special" }
- else
- { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist" and card.rarity != "special" }
+ { is_masterpiece() and card.shape != "token" and card.shape != "emblem" }
+ else if set.sort_special_rarity != "separate numbering" then
+ { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist"}
+ else if card.rarity == "special" then
+ { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist" and card.rarity == "special" }
+ else
+ { not is_unsorted() and card.shape != "token" and not is_masterpiece() and card.shape != "emblem" and card.shape != "rulestip" and card.shape != "counter" and card.shape != "checklist" and card.rarity != "special" }
}
-
+card_number_offset := {pull_comma_array(set.card_number_offsets, cell:0, end:false, default:0)}
+set_number_offset := {pull_comma_array(set.card_number_offsets, cell:1, end:false, default:0)}
card_number := {
position (
of: card
in: set
- order_by: { rarity_sort() + sort_index() + sort_name(card.name) }
+ order_by: { rarity_sort() + sort_index() + sort_name(card.name) + sort_name(export_name())}
filter: set_filter()
- ) + 1
+ ) + 1 + to_number(card_number_offset())
}
card_count := {
- number_of_items(in: set, filter: set_filter())
+ number_of_items(in: set, filter: set_filter()) + to_number(set_number_offset())
}
#Starting with M15, zero digits in card numbers should be shown up to three.
@@ -353,34 +399,78 @@ separate_words := remove_tags + trim + replace@(match:" ", replace: {spacer})
# replaces — correctly
add := "" # default is nothing
-# If the 'input' parameter is a mana costs, then adds 'add'
-for_mana_costs := format_cost := {
- if input.separator_before == "—" and contains(input.param, match: " ") then (
- if comma_count(input.param) == "," then (
- if match(match: "^[DHSCTQXYZIWUBRG0-9/|]+,", input.param) then
- "{add}{combined_cost(input.param)}"
- else "{combined_cost(input.param)}"
- ) else if contains(input.param, match: ",") then (
- if match(match: "^[DHSCTQXYZIWUBRG0-9/|]+,", input.param) then
- "{add}{long_cost(input.param)}"
- else "{long_nomana_cost(input.param)}"
- ) else
- "{alternative_cost(input.param)}"
- ) else
- "{add}{input.param}"
-}
+trim_reminder_x := replace@(match: ". X can’t be 0.", replace: "")
+
+# If the 'input' parameter is a mana costs, then adds 'add'
+for_mana_costs := {
+ if input.separator_before == "—" and contains(input.param, match: " ") then ( ##multi word
+ if comma_count(input.param) == "," then ( ##two part
+ if match(match: "^[VLHSCAIETQ\\?XYZIWUBRG0-9/|]+,", input.param) then ##starts with mana
+ "{add}{alternative_cost(input.param, trim:combined_cost, s:action)}" ##"add" mana
+ else "{alternative_cost(input.param, trim:combined_cost, s:action)}{non}" ## else cost "non"
+ ) else if contains(input.param, match: ",") then ( ##three+ parts
+ if match(match: "^[VLHSCAIETQ\\?XYZIWUBRG0-9/|]+,", input.param) then ##starts with mana
+ "{add}{alternative_cost(input.param, trim:long_cost, s:action)}" ##"add" mana with long formatting
+ else "{alternative_cost(input.param, trim:long_nomana_cost, s:action)}{non}" ## else cost "non" with long formatting
+ ) else
+ "{alternative_cost(input.param, s:action, trim:lower_first)}{non}" ##one, nonmana, part
+ ) else if match(match: "^[VLHSCAIETQ\\?XYZIWUBRG0-9/|]+$", input.param) then ##one word
+ "{add}{input.param}" ##mana
+ else
+ "{alternative_cost(input.param, trim:combined_cost, s:action)}{non}" ##nonmana
+}@(non:" in addition to any other costs", action:false)
-# Convert first character to lower case
-alternative_cost := replace@(match:"^[A-Z]", replace: { to_lower() })
# Convert extra costs
long_cost := replace@(match:", [A-Z]", replace: { to_lower() } )
long_nomana_cost := replace@(match:"[A-Z]", replace: { to_lower() })
-#
+# Convert first character to lower case
+lower_first := replace@(match:"^[A-Z]", replace: { to_lower() })
combined_cost := replace@(match:", [A-Z]", replace: { to_lower() })+
replace@(match:",", replace:" and")+
- replace@(match:"^[DHSCTQXYZIWUBRG0-9/|]+", in_context: "(^|[[:space:]])(?![a-z])", replace: "&")+
+ replace@(match:"^[VLHSCETQ\\?XYZIWUBRG0-9/|]+", in_context: "(^|[[:space:]])(?![a-z])", replace: "&")+
replace@(match:"^[A-Z]", replace: { to_lower() })
-
+alternative_cost := {
+ input := trim(input)
+ if s then
+ input := actionize(input)
+ input
+}@(trim: lower_first, s:false, trim:{input})
+actionize := replace@(match:"(activate|ante|cast|choose|create|destroy|discard|double|draw|exchange|exile|fight|mill|play|put|regenerate|return|reveal|sacrifice|shuffle|tap|untap|transform|vote|exert|pay)(?=($| |,|\\.))", replace:"\\1s")
+ +replace@(match:"(attach)", replace:"\\1es")
+ +replace@(match:"scry", replace:"scries")
+ +replace@(match:"your", replace:"their")
+#
+protection_code := {
+ output := if match(input, match:"(artifacts|creatures|enchantments|instants|lands|planeswalkers|sorceries|tribals|planes|schemes|emblems|conspiracies|^[A-Z]|^[^ ]* named)") then replace(input, match:"and from", replace:"or", in_context:" ")
+ else if match(input, match:"^(converted|mana|power|toughness)") then "anything with " + replace(input, match:"and from", replace:"or", in_context:" ")
+ else if contains(input, match:"the chosen player") then "anything " + replace(input, match:"the chosen", replace:"controlled by that")
+ else if contains(input, match:"the chosen") then "anything with " + replace(input, match:"the chosen", replace:"that")
+ else if contains(input, match:"all colors") then "anything " + replace(input, match:"all colors", replace:"that's white, blue, black, red, or green")
+ else if match(input, match:"^you$") then "anything you control"
+ else if match(input, match:"^its owner$") then "anything its owner controls"
+ else if match(input, match:"^(each of )?your opponents$") then "anything " + replace(input, match:"(each of )?your opponents", replace:"controlled by those players")
+ else if match(input, match:"(the|a) [^\n]* of your choice") then "anything " + replace(input, match:"(the|a) ([^\n]*) of your choice", replace:"of that \\2")
+ else if input == "colorless" then "anything colorless"
+ else "anything " + replace(english_singular(input), match:"and from", replace:"or", in_context:" ")
+ output := " targeted, dealt damage, enchanted, equipped by " + output
+ if match(output, match:"(artifacts|creatures|instants|lands|planeswalkers|sorceries|tribals|planes|schemes|emblems|conspiracies|by [A-Z])") and not match(output, match:"(enchantmentsAura|Curse)") then
+ output := replace(output, match:", enchanted", replace:"")
+ else output := output
+ if match(output, match:"(enchantments|creatures|instants|lands|planeswalkers|sorceries|tribals|planes|schemes|emblems|conspiracies|by [A-Z])") and not match(output, match:"(artifacts|Equipment)") then
+ output := replace(output, match:" equipped", replace:"")
+ else output := output
+ if match(output, match:"equipped by") then output := replace(output, match:"equipped by", replace:"or equipped by")
+ else if match(output, match:"enchanted, by") then output := replace(output, match:"enchanted, by", replace:"or enchanted by")
+ else if match(output, match:"dealt damage, by") then output := replace(output, match:"dealt damage, by", replace:"or dealt damage by")
+ else ""
+ if match(output, match:"^ targeted, or dealt damage by") then output := replace(output, match:"^ targeted, or dealt damage by", replace:" targeted or dealt damage by")
+ if match(output, match:"anything [A-Z]") then output := replace(output, match:"anything ", replace:"")
+ if match(output, match:"or les") then output := replace(output, match:"or les$", replace:"or less")
+ if match(output, match:"(anything )?everything") then output := replace(output, match:"(anything )?everything", replace:"anything")
+ output := (if self_pro_check(card.text) then "You can't be" else if is_spell(card.type) then "It can't be blocked," else if is_creaturish(card.type) then "This creature can't be blocked," else "This permanent can't be") + output
+ output
+}
+self_pro_check := match@(match:"You ha(ve|s) protection")
long_dash := replace@(match:"-", replace:"—")
# Utilities for keywords
@@ -389,7 +479,7 @@ has_cc := { card.casting_cost != "" }
has_pt := { card.power != "" or card.toughness != "" }
-contains_target := match@(match:"(?i)([^a-z]|^)target([^a-z]|$)")
+contains_target := match@(match:"(?i)([^a-z]|^)targets?([^a-z]|$)")
is_spell := { contains(card.type, match:"Instant") or contains(card.type, match:"Sorcery") }
@@ -401,6 +491,115 @@ color_to_mana := replace@(match: "white", replace: "[W]")+
replace@(match: "red", replace: "[R]")+
replace@(match: "green", replace: "[G]")
+iterate_fix := remove_tags
+ +replace@(match: "^\\.", replace:"")
+ +replace@(match: "^,", replace:"")
+ +replace@(match: "^[ ]$", replace:"")
+iterate_trim := replace@(match:" times", replace:"");
+iterate_digits := {
+ if iterate_trim(iterate_fix(input)) == "" then "1"
+ else if iterate_trim(iterate_fix(input)) == " one" then "1"
+ else if iterate_trim(iterate_fix(input)) == " once" then "1"
+ else if iterate_trim(iterate_fix(input)) == " two" then "2"
+ else if iterate_trim(iterate_fix(input)) == " twice" then "2"
+ else if iterate_trim(iterate_fix(input)) == " three" then "3"
+ else if iterate_trim(iterate_fix(input)) == " four" then "4"
+ else if iterate_trim(iterate_fix(input)) == " five" then "5"
+ else if iterate_trim(iterate_fix(input)) == " six" then "6"
+ else if iterate_trim(iterate_fix(input)) == " seven" then "7"
+ else if iterate_trim(iterate_fix(input)) == " eight" then "8"
+ else if iterate_trim(iterate_fix(input)) == " nine" then "9"
+ else if iterate_trim(iterate_fix(input)) == " ten" then "10"
+ else if iterate_trim(iterate_fix(input)) == " eleven" then "11"
+ else if iterate_trim(iterate_fix(input)) == " twelve" then "12"
+ else if iterate_trim(iterate_fix(input)) == " thirteen" then "13"
+ else if iterate_trim(iterate_fix(input)) == " fourteen" then "14"
+ else if iterate_trim(iterate_fix(input)) == " fifteen" then "15"
+ else if iterate_trim(iterate_fix(input)) == " sixteen" then "16"
+ else if iterate_trim(iterate_fix(input)) == " seventeen" then "17"
+ else if iterate_trim(iterate_fix(input)) == " eighteen" then "18"
+ else if iterate_trim(iterate_fix(input)) == " nineteen" then "19"
+ else if iterate_trim(iterate_fix(input)) == " twenty" then "20"
+ else iterate_trim(iterate_fix(input))
+}
+digital_number := {
+ input := replace(input, match:"up to ", replace:"")
+ if input == "zero" then 0
+ else if input == "one" or input == "a" or input == "an" then 1
+ else if input == "two" then 2
+ else if input == "three" then 3
+ else if input == "four" then 4
+ else if input == "five" then 5
+ else if input == "six" then 6
+ else if input == "seven" then 7
+ else if input == "eight" then 8
+ else if input == "nine" then 9
+ else if input == "ten" then 10
+ else if input == "eleven" then 11
+ else if input == "twelve" then 12
+ else if input == "thirteen" then 13
+ else if input == "fourteen" then 14
+ else if input == "fifteen" then 15
+ else if input == "sixteen" then 16
+ else if input == "seventeen" then 17
+ else if input == "eighteen" then 18
+ else if input == "nineteen" then 19
+ else if input == "twenty" then 20
+ else input
+}
+reverse_elements := {for element from 1 to length(input) do input[length(input) - element] + " "}
+######################## Level Margins
+#### these will be determined by the style affecting the margins and otherwise be 0
+margin_left := {0}
+margin_right := {0}
+margin_top := {0}
+remove_margins := replace@(
+ match: "?margin:[0-9]+(:+[0-9]+)?(:+[0-9]+)?>",
+ replace:""
+)
+##remove 0 margins and margins with no text
+cull_margins := replace@(match:"?margin:0(:+0)?(:+0)?>", replace:"")+
+ replace@(match:"", replace:"")
+
+#### this gives a big array so we can grab_margins["lv1"] etc anywhere
+grab_margins := {[ lv1: [margin_left("lv1"), margin_right("lv1"), margin_top("lv1")],
+ lv2: [margin_left("lv2"), margin_right("lv2"), margin_top("lv2")],
+ lv3: [margin_left("lv3"), margin_right("lv3"), margin_top("lv3")],
+ lv4: [margin_left("lv4"), margin_right("lv4"), margin_top("lv4")],
+ lv5: [margin_left("lv5"), margin_right("lv5"), margin_top("lv5")],
+ lv6: [margin_left("lv6"), margin_right("lv6"), margin_top("lv6")],
+ lv7: [margin_left("lv7"), margin_right("lv7"), margin_top("lv7")],
+ lv8: [margin_left("lv8"), margin_right("lv8"), margin_top("lv8")],
+ text: [margin_left("text"), margin_right("text"), margin_top("text")],
+ text2: [margin_left("text2"), margin_right("text2"), margin_top("text2")],
+ text3: [margin_left("text3"), margin_right("text3"), margin_top("text3")],
+ text4: [margin_left("text4"), margin_right("text4"), margin_top("text4")],
+ text5: [margin_left("text5"), margin_right("text5"), margin_top("text5")],
+ text6: [margin_left("text6"), margin_right("text6"), margin_top("text6")],
+ unknown: [0,0,0]
+]}
+#### then with apply_margins(field, name:fieldname), add the margins into the text
+apply_margins := {
+ margin_data := grab_margins()[name] or else [0,0,0]
+ cull_margins("" + remove_margins(input) + "")
+}
+is_modal := contains@(match:"")
+
+bump_text := {
+ blocks := split_text(input, match:"\n");
+ new_text := blocks[0];
+ for x from 1 to length(blocks)-1 do new_text := new_text + "\n" + bumper(blocks[x])
+ new_text
+}
+bumper := {
+ #if this text isn't modal, at a 5 px margin
+ if is_modal(input) then input else
+ cull_margins("" + remove_margins(input) + "")
+
+}
+inserts_values := {
+ split_text(set.inserts+";;;;;;;;;", match:";")
+}
############################################################## The text box
# Filters for the text box
@@ -408,32 +607,31 @@ color_to_mana := replace@(match: "white", replace: "[W]")+
mana_context :=
"(?ix) # case insensitive, ignore whitespace
(^|[[:space:]\"(“']) # start of a word
- ( : # G: something
- | , # G, tap: something
- | or[ ] # Add X, Y, or Z.
- | [ ]to # Add X, Y, or Z to your mana pool.
- | [ ]was[ ]spent # if G was spent to cast
- | [ ]can[ ]be[ ]pay
- | (pays?|additional|costs?|the # pay X. creatures cost 1 less. pay an additional G.
- |adds?|pay(ed)?[ ](with|using)
- )
- ([ ]either)? # pay either X or Y
- ([ ](]*>)?[DHSCTQXYZIEWUBRG0-9/|]+(]*>)?,)* # pay X, Y or Z
- ([ ](]*>)?[DHSCTQXYZIEWUBRG0-9/|]+(]*>)?[ ](and|or|and/or))* # pay X or Y
- [ ]
- ([,.)]|$ # (end of word)
- |[ ][^ .,]*$ # still typing...
- |[ ]( or | and | in | less | more | to ) # or next word is ...
- )
- )
+ (
+ : # G: something
+ | , # G, tap: something
+ | or[ ] # Add X, Y, or Z.
+ | [ ]to[ ]your # Add X, Y, or Z to your mana pool.
+ | [ ]was[ ]spent # if G was spent to cast
+ | [ ]can[ ]be[ ]paid
+ | (pays?|additional|costs?|the|adds?|pay(ed)?[ ](with|using)) # pay X. creatures cost 1 less. pay an additional G.
+ ([ ]either)? # pay either X or Y
+ ([ ](]*>)?[-+=]?[VLHSCETQ\\?XYZIEWUBRG0-9/|]+(]*>)?,)* # pay X, Y or Z
+ ([ ](]*>)?[-+=]?[VLHSCETQ\\?XYZIEWUBRG0-9/|]+(]*>)?[ ](and|or|and/or))* # pay X or Y
+ [ ]
+ ([,.)\"”]|$ # (end of word)
+ |[ ][^ .,]*$ # still typing...
+ |[ ]( or | and | in | less | more | to ) # or next word is ...
+ )
+ )
| # keyword argument that is declared as mana
| [ ]* # keyword argument that is declared as cost
| , # keyword argument that is declared as cost
";
-
+mana_un_context := "(converted mana costs? | life)"
# truncates the name of legends
-legend_filter := replace@(match:"(, | of | the ).*", replace: "" )
+legend_filter := replace@(match:"(, | of | the | \"| “).*", replace: "" )
# these are considered a correct 'word' for spellchecking in the text box:
additional_text_words := match@(match:
@@ -445,6 +643,61 @@ additional_text_words := match@(match:
# the rule text filter
# - adds mana symbols
# - makes text in parentheses italic
+equip_filter :=
+ replace@(match:"This creature", replace:"It")
+ +replace@(match:"this creature", replace:"it")
+this_or_that := {
+ this := "this"
+ that := "that"
+ type := input
+ if is_creaturish(card.type) then type := "creature"
+ if upper then (
+ this := "This"
+ that := "That"
+ )
+ if(type == "land" and not is_land(card.type)) then type := "permanent"
+ this_that := this
+ if ((input == "creature" and not is_creaturish(card.type)) or is_spell(card.type))
+ then this_that := that
+ this_that + " " + type
+}@(upper:false)
+softline_ripper :=
+ replace@(match:"?soft-line>", replace:"")
+auto_correct :=
+ replace@(match:" it’s (controller|owner|power|toughness|converted|other)", replace:" its \\1")
+ +replace@(match:"Then, if" replace:"Then if")
+ +replace@(match:"([Ff]irst|[Dd]ouble) Strike" replace:"\\1 strike")
+ +replace@(match:"Splice (Ont|unt|int)" replace:"Splice ont")
+ +replace@(match:"(ecomes?) the Monarch" replace:"\\1 the monarch")
+ +replace@(match:"does (combat|[X0-9]+) damage" replace:"deals \\1 damage")
+ +replace@(
+ match: "(gains |gain |have |has )" # preceded by this
+ + "()" # inside a kw
+ + "([A-Z])" # match this
+ replace: { _1 + _2 + to_lower(_3)})
+auto_errata :=
+ replace@(match:"converted mana cost", replace:"mana value")
+ +replace@(match:"hen shuffle your library", replace:"hen shuffle")
+ +replace@(match:"this (?:ability )?(?:only )?(?:any ?time you could cast|as) a", in_context: "(Activate|Play) n? (instant|sorcery)", replace:"only as a")
+ex_test := {
+ expand_keywords(
+ input,
+ condition: {
+ correct_case or (mode != "pseudo" and not used_placeholders)
+ }
+ default_expand: {
+ chosen(choice:if correct_case or mode == "action" then mode else "lower case", set.automatic_reminder_text) and chosen(choice:mode, set.automatic_reminder_text)
+ },
+ combine: {
+ keyword := "{keyword}"
+ reminder := process_english_hints(if has_pt() then reminder else equip_filter(reminder))
+ if mode == "pseudo" then "{keyword}"
+ else keyword + if expand then " ({reminder})" else ""
+
+ },
+ margin_code: margin_code
+ )
+}
text_filter :=
# step 1 : remove all automatic tags
remove_tag@(tag: "") +
@@ -452,71 +705,161 @@ text_filter :=
remove_tag@(tag: "") +
remove_tag@(tag: "") +
+ remove_tag@(tag: "") +
+ remove_tag@(tag: "",
+ replace:"BOLDAROUND"
+ )+
+ replace@(
+ match:"",
+ replace:"ITALAROUND"
+ )+
+ replace@(
+ match:"",
+ replace:"SYMAROUND"
+ )+
# step 2 : reminder text for keywords
expand_keywords@(
condition: {
correct_case or (mode != "pseudo" and not used_placeholders)
}
default_expand: {
- chosen(choice:if correct_case then mode else "lower case", set.automatic_reminder_text)
+ chosen(choice:if correct_case or mode == "action" then mode else "lower case", set.automatic_reminder_text) and chosen(choice:mode, set.automatic_reminder_text)
},
combine: {
keyword := "{keyword}"
reminder := process_english_hints(reminder)
if mode == "pseudo" then "{keyword}"
- else keyword + if expand then " ({reminder})"
+ else keyword + if expand then " ({reminder})" else ""
}) +
+ # step 2ba : apply face_code
+ replace@(
+ match: "face_(.*?)_end",
+ replace: {face_code(_1)}
+ )+
# step 2b : move action keywords' reminder text to the end of the line
replace@(
- match: "((?:(?!]*>)(((?!]+> (?:(?!]+>]*>)([^\n]*)", #######removed "| ?]+> (?:(?!]+>]*>)([^\n]*?)(]+> (?:(?!]+>]*>)([^\n]*)",
+ replace: "\\2\\4\\3\\1"
+ ) +
+ # step 2c : allow a sentence after lowercase reminder text for equips etc.
+ #replace@(
+ # match: "(]+>[a-z][^<]+)((?:(?!]*>)([^\n]+)$",
+ # replace: "\\1\\3\\2"
+ # ) +
+ # step 2d : remove duplicate reminder text
replace@(
match: "(]*>[^)]+[)]]*>)([^\n]+)\\1"
replace: "\\2\\1"
) +
+ # step 2e : combine reminder texts
+ replace@(
+ match: "[)](]+>]>]+> )[(]"
+ replace: "\\1"
+ ) +
+ # step 2f : temp fix for formatting buttons
+ replace@(
+ match:"BOLDAROUND",
+ replace:""
+ )+
+ replace@(
+ match:"ITALAROUND",
+ replace:""
+ )+
+ replace@(
+ match:"SYMAROUND",
+ replace:""
+ )+
+ replace@(
+ match:"-\n-"
+ replace:"\n"
+ )+
# step 3a : expand shortcut word CARDNAME
replace@(
- match: "CARDNAME",
- in_context: "(^|[[:space:]]|\\()", # TODO: Allow any punctuation before
+ match: "CARDNAME>?",
+ in_context: "(^|[[:space:]]|\\(|,|\\.|:|“|\"|'|‘|-|—|/|)", # TODO: Allow any punctuation before
replace: ""
) +
# step 3b : expand shortcut word LEGENDNAME
replace@(
- match: "LEGENDNAME",
- in_context: "(^|[[:space:]]|\\()", # TODO: Allow any punctuation before
+ match: "LEGENDNAME>?",
+ in_context: "(^|[[:space:]]|\\(|,|\\.|:|“|\"|'|‘|/|)", # TODO: Allow any punctuation before
replace: ""
) +
# step 3c : fill in atom fields
tag_contents@(
tag: "",
- contents: { "" + (if card_name=="" then "CARDNAME" else card_name) + "" }
+ contents: { "" + (if card_name=="" then "CARDNAME" else strip_card_codes(card_name)) + "" }
) +
tag_contents@(
tag: "",
- contents: { "" + (if card_name=="" then "LEGENDNAME" else legend_filter(card_name)) + "" }
+ contents: { "" + (if card_name=="" then "LEGENDNAME" else legend_filter(strip_card_codes(card_name))) + "" }
) +
+ replace@(
+ match: "INS([1-9])",
+ in_context: "(^|[[:space:]]|\\(|,|\\.|:|“|\"|'|‘|/|)",
+ replace: ""
+ ) +
+ {
+ out := input
+ for x from 1 to 9 do
+ out := tag_contents(out,
+ tag: "",
+ contents: { "" + (if inserts_values()[x-1] == "" then "INS"+x else inserts_values()[x-1]) + "" }
+ )
+ out
+ } +
# step 4 : explict non mana symbols
replace@(
- match: "\\][DHSCTQXYZIWUBRG0-9/|]+\\[",
+ match: "\\][-+=]?[VLHSCETQ\\?XYZIWUBRG0-9/|]+\\[",
replace: {"" + mana_filter_t() + ""} ) +
# step 5 : add mana & tap symbols
replace@(
- match: "\\b[DHSCTQXYZIWUBRG0-9/|]+\\b",
+ match: "([+=-][XYZ0-9/|]+)",
+ in_context: mana_context,
+ replace: {"" + _1 + ""} ) +
+ replace@(
+ match: "\\b[VLHSCETQ\\?XYZIWUBRG0-9/|]+\\b",
in_context: mana_context,
replace: {"" + mana_filter_t() + ""} ) +
+ # step 5b : remove false positive mana & tap symbols
+ replace@(
+ match: "([VLHSCETQ\\?XYZIWUBRG0-9/|]+)",
+ in_context: mana_un_context,
+ replace: "\\1" ) +
# step 5c : add explicit mana symbols
replace@(
- match: "\\[[DHSCTQXYZIWUBRG0-9/|]+\\]",
+ match: "\\[[-+=]?[VLHSCETQE\\?XYZIWUBRG0-9/|]+\\]",
replace: {"" + mana_filter_t() + ""} ) +
# step 6 : curly quotes
- (if set.curly_quotes then curly_quotes) +
+ {if set.curly_quotes then curly_quotes(input) else input} +
# step 7 : italicize text in parenthesis
replace@(
match: "[(]([^)\n]|[(][^)\n]*[)])*[)]?",
in_context: "(^|[[:space:]])|",
replace: "&") +
+ # step 7b : indent bullets
+ replace@(
+ match: "^(• )([^•]+)",
+ replace: {"" + _1 + "" + _2 + ""}
+ )+
+ # step 7c : clean up modals
+ {
+ if is_modal(input)
+ then bump_text(softline_ripper(input))
+ else input
+ }+
# step 8 : automatic capitalization, but not after "("
replace@(
match: "([ ]*: |—| — )" # preceded by this
@@ -524,6 +867,14 @@ text_filter :=
+ "(?![)])", # not followed by this
replace: { _1 + to_upper(_2) }) +
# step 9 : spellcheck
+ {
+ if set.auto_correct then
+ auto_correct(input)
+ else input } +
+ {
+ if set.auto_errata then
+ auto_errata(input)
+ else input } +
{ if set.mark_errors then
check_spelling(
language: language().spellcheck_code,
@@ -533,6 +884,10 @@ text_filter :=
else input
}
+modal_lines := replace@(match:"?soft-line>", replace:"")
+ +replace@(match:"(.+)", replace:"\\1")
+
+modal_text_filter := text_filter + modal_lines
############################################################## Other boxes
@@ -544,7 +899,7 @@ flavor_text_filter :=
# step 2 : surround by tags
{ "" + input + "" } +
# curly quotes
- (if set.curly_quotes then curly_quotes) +
+ {if set.curly_quotes then curly_quotes(input) else input} +
# spellcheck
{ if set.mark_errors
then check_spelling(language:language().spellcheck_code)
@@ -574,8 +929,9 @@ sub_type_filter := {
else if lang.is_enchantment(type) then "enchantment"
else if lang.is_spell(type) then "spell"
else if lang.is_planeswalker(type) then "planeswalker"
- else "";
- if list_type_rest != "" then (
+ else if lang.is_plane(type) then "plane"
+ else nil
+ if list_type_rest != nil then (
if lang.is_creature(type) or lang.is_tribal(type) then (
list_type_first := "race"
) else (
@@ -604,22 +960,25 @@ only_first := replace@(match:" .*", replace:"")
only_next := replace@(match:"^[^ ]* ?", replace:"")
all_sub_types := {
for each card in set do
- if contains(card.super_type) then "," + space_to_comma(to_text(card.sub_type))
+ if contains(card.super_type) then "," + space_to_comma(to_text(card.sub_type)) else ""
}
all_races := {
for each card in set do
if is_creature(card.super_type) or is_tribal(card.super_type) then
"," + only_first(to_text(card.sub_type))
+ else ""
}
all_classes := {
for each card in set do
if contains(card.super_type, match:"Creature") then
"," + space_to_comma(only_next(to_text(card.sub_type)))
+ else ""
}
# Determine a rarity code for M15 styles.
rarity_code := {
- if is_promo() then "P"
+ if not set.rarity_codes then ""
+ else if is_promo() then "P"
else if is_masterpiece() then "S"
else if contains(card.shape, match:"token") then "T"
else if contains(card.shape, match:"emblem") then "E"
@@ -629,8 +988,7 @@ rarity_code := {
else if card.rarity == "mythic rare" then "M"
else if card.rarity == "special" then "S"
else if card.rarity == "basic land" then "L"
- else ""
-};
+ else ""}
# Determine if the card is a promo card.
is_promo := { "false" }
@@ -678,9 +1036,10 @@ has_identity_2 := { ( ( card.card_color_2 != card_color(casting_cost: card.casti
# Converted mana cost
is_half_mana := match@(match: "1/2|[|][WUBRGS]")
+is_half_generic := match@(match: "1/2")
is_colored_mana := match@(match: "[WUBRG]")
only_numbers := filter_text@(match: "^[0123456789]+")
-cmc_split := break_text@(match: "(?ix) 1/2 | [|][WUBRG] | [0-9]+(?!/[WUBRGDHSCTQ2]) | [WUBRGDHS0-9](/[WUBRGDHS])\{0,4} ")
+cmc_split := break_text@(match: "(?ix) 1/2 | [|][WUBRGC] | [0-9](/[WUBRGCVLHSCETQ2]) | [0-9]+(?!/[WUBRGCVLHSCETQ2]) | [WUBRGCVLHS0-9](/[WUBRGCVLHS])\{0,4} ")
cmc := {to_number(
for each sym in cmc_split(to_text()) do (
numbers := only_numbers(sym)
@@ -689,7 +1048,14 @@ cmc := {to_number(
else 1 # all other symbols are 1
))
}
-
+mana_value := cmc
+write_wubrg := {
+ (if match(input, match:"white") then "W" else "")+
+ (if match(input, match:"blue") then "U" else "")+
+ (if match(input, match:"black") then "B" else "")+
+ (if match(input, match:"red") then "R" else "")+
+ (if match(input, match:"green") then "G" else "")
+}
colored_mana := {to_number(
for each sym in cmc_split(to_text()) do (
numbers := only_numbers(sym)
@@ -698,6 +1064,14 @@ colored_mana := {to_number(
else 0
))
}
+generic_mana := {to_number(
+ for each sym in cmc_split(to_text()) do (
+ numbers := only_numbers(sym)
+ if is_half_generic(sym) then 0.5
+ else if numbers != "" then to_int(numbers)
+ else 0 # all other symbols are 1
+ ))
+}
primary_card_color := {
artifact := chosen(choice:"artifact") and not (chosen(choice:"white") or chosen(choice:"blue") or chosen(choice:"black") or chosen(choice:"red") or chosen(choice:"green"))
@@ -709,8 +1083,10 @@ primary_card_color := {
black := chosen(choice:"black")
red := chosen(choice:"red")
green := chosen(choice:"green")
+ multi_color := count_chosen(choices:"white, blue, black, red, green")
if land then "land"
else if multi then "multicolor"
+ else if multi_color == 2 and chosen(choice:"artifact") then "hybrid" ##hybrid artifacts would show as their first color
else if hybrid then "hybrid"
else if artifact then "artifact"
else if white then "white"
@@ -747,6 +1123,16 @@ mainframe_stat_color := {
}
is_mainframe := { false }
is_walker := { contains(card.super_type, match:"Planeswalker") }
+is_legend := { true }
+mainframe_walker := {false}
+mainframe_walker_text_script := {combined_editor(field1: card.level_1_text, separator1: "\n", field2: card.level_2_text, separator2: "\n", field3: card.level_3_text)}
+mainframe_walkerb := {false}
+mainframe_walker_text_scriptb := {combined_editor(field1: card.level_5_text, separator1: "\n", field2: card.level_6_text, separator2: "\n", field3: card.level_7_text)}
+alt_text := {false}
+alt_text_script := {false}
+alt_textb := {false}
+alt_text_scriptb := {false}
+
mainframe_power := { card.power }
mainframe_toughness := { card.toughness }
@@ -761,15 +1147,7 @@ remove_type := replace@(match: "(Artifact|Creature|Enchantment|Instant|Land|Plan
replace@(match: "[ ]+", in_context: "^", replace: "")+
replace@(match: "[ ]+", in_context: "$", replace: "")
node_script := { if card.shape == "double faced" then "transform day" else "none" }
-node_script_2 := {
- if card.mainframe_node == "transform day" then "transform night"
- else if card.mainframe_node == "transform night" then "transform day"
- else if card.mainframe_node == "transform moon" then "transform eldrazi"
- else if card.mainframe_node == "transform eldrazi" then "transform moon"
- else if card.mainframe_node == "transform sparker" then "transform aetherprint"
- else if card.mainframe_node == "transform aetherprint" then "transform sparker"
- else "none"
-}
+
card_new_color := {
if card.card_color == "white" then "w"
else if card.card_color == "blue" then "u"
@@ -789,13 +1167,679 @@ spark_color := {
else if contains(card.card_color, match:"multi") or contains(card.card_color, match:"hybrid") then "m"
else ""
}
-card_spotlight := { "/magic-mainframe-watermarks.mse-include/spotlight/" + card_new_color() + "spotlight.png" }
ancestral_mana := { card.pt != "" and card.pt == "" }
-exporter_check := { "no" }
-custom_watermark_1 := { if set.custom_watermark_1 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_1 else "/magic-watermarks.mse-include/aetherprint3.png" }
-custom_watermark_2 := { if set.custom_watermark_2 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_2 else "/magic-watermarks.mse-include/aetherprint3.png" }
-custom_watermark_3 := { if set.custom_watermark_3 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_3 else "/magic-watermarks.mse-include/aetherprint3.png" }
-custom_watermark_4 := { if set.custom_watermark_4 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_4 else "/magic-watermarks.mse-include/aetherprint3.png" }
-custom_watermark_5 := { if set.custom_watermark_5 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_5 else "/magic-watermarks.mse-include/aetherprint3.png" }
-is_unsorted := {"false"}
\ No newline at end of file
+is_unsorted := {"false"}
+special_text := { "" }
+special_text2 := { "" }
+exporter_name_filter := filter_text@(match:"!exporte?r?name [^\n!]+")
+exporter_name_grabber := replace@(match:"!exporte?r?name ", replace:"")
+card_name := { replace(if exporter_name_grabber(exporter_name_filter(card.notes)) != "" then exporter_name_grabber(exporter_name_filter(card.notes)) else card.name, match:" $", replace:"") }
+exporter_num_filter := filter_text@(match:"!num [^\n!]+")
+exporter_num_grabber := replace@(match:"!num ", replace:"")
+trim_zeroes := replace@(match: "^00?", replace: "")+
+ replace@(match: "a?/[0-9b]+", replace: "")
+corrected_card_number := { if exporter_num_grabber(exporter_num_filter(card.notes)) != "" then exporter_num_grabber(exporter_num_filter(card.notes)) else if card.custom_card_number != "" then trim_zeroes(card.custom_card_number) else card_number() }
+
+comma_count := filter_text@(match:",")
+round_up := {to_int(0.99999999999998+input)}
+round_near := {to_int(0.5+input)}
+to_title := replace@(match:"(^| )([A-z])([^ ]*)", replace:{_1+ to_upper(_2) + to_lower(_3)})
+to_sentence := replace@(match:"(^|\n)([A-z])([^\n]*)", replace:{_1+ to_upper(_2) + to_lower(_3)})
+join := {
+ string := ""
+ if length(input) == 2 then spacer := " "
+ if length(input) == 1 then closing := ""
+ for x from 0 to length(input)-1 do
+ string := string + (if x == length(input)-1 then closing else "") + input[x] + (if x == length(input)-1 then "" else spacer)
+ string
+}@(spacer:", ", closing:"and ")
+includes := { flagged := false
+ for x from 0 to length(array)-1 do
+ if array[x] == input then flagged := true;
+ flagged
+}
+pull_comma_array := {
+ array := split_text(input, match:divider)
+ length := length(comma_count(input))
+ ending := to_number(end)
+ if (cell >= (length + (1-ending)))
+ then default
+ else if array[cell] == "" or array[cell] == nil or array[cell] == "-"
+ then default
+ else array[cell]
+}@(default:0, end: 1, divider:",", cell:0)
+##todo check nil
+#### standard is pull_comma_array("X,Y,Z,", cell: 0)
+#### returns "X"
+#### ending true for coordinates (requires a final divider to ensure element is complete)
+#### ending false for moving (doesn't require divider, moving 1 then 11 is fine)
+#### divider is "," by default, can change
+#### can also add default to return in case of errors
+
+##a workaround for the crop offset function that doesn't appear to work
+##slice_chop(input:image, height:(final height), width:(final width), distance:(length from bottom to top of final image))
+slice_crop := {
+ img := flip_vertical(input)
+ img := crop(img, height:distance, width:width, offset_x:0, offset_y:0)
+ img := flip_vertical(img)
+ img
+ if(height != 0 and height != distance) then
+ img := crop(img, height:height, width:width, offset_x:0, offset_y:0)
+ img
+}@(height:0)
+
+#juryrig fix for level defaults. janky because MSE hates {true}
+transfer_levels := {true}
+transfer_levels_2 := {true}
+a_saga := {false}
+saga_reminder := { "As this Saga enters and after your draw step, add a lore counter. Sacrifice after III." }
+b_saga := {false}
+saga_reminderb := { "As this Saga enters and after your draw step, add a lore counter. Sacrifice after III." }
+############################################################## Watermark Updates
+card_spotlight := { "/magic-mainframe-watermarks.mse-include/spotlight/" + card_new_color() + "spotlight.png" }
+custom_watermark_1 := { if set.custom_watermark_1 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_1 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_2 := { if set.custom_watermark_2 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_2 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_3 := { if set.custom_watermark_3 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_3 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_4 := { if set.custom_watermark_4 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_4 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_5 := { if set.custom_watermark_5 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_5 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_6 := { if set.custom_watermark_6 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_6 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_7 := { if set.custom_watermark_7 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_7 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_8 := { if set.custom_watermark_8 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_8 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_9 := { if set.custom_watermark_9 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_9 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_10 := { if set.custom_watermark_10 != "" then "/magic-watermarks.mse-include/" + set.custom_watermark_10 else "/magic-watermarks.mse-include/planeswalker.png" }
+custom_watermark_a := {"/magic-watermarks.mse-include/planeswalker.png"}
+custom_watermark_b := {"/magic-watermarks.mse-include/planeswalker.png"}
+############################################################## Flavor Bar Equation
+
+
+chop_top := {0}
+chop_bot := {0}
+bar_offset := {0}
+offset_lines := {0}
+chop_top2 := {0}
+chop_bot2 := {0}
+bar_offset2 := {0}
+offset_lines2 := {0}
+
+##### Set chop_top(), chop_bot(), bar_offset(), and offset_lines to 0 to reduce replacements in chopping frames
+##### Full equations to use in chopping templates below
+##### chop_top := {if styling.chop_top == "" then 0 else if comma_count(styling.chop_top) == "," or comma_count(styling.chop_top) == ",," then split_text(match:",", styling.chop_top).0 else styling.chop_top}
+##### chop_bot := {if comma_count(styling.chop_top) == ",," then split_text(match:",", styling.chop_top).1 else if styling.chop_bottom == "" then 0 else styling.chop_bottom}
+##### bar_offset := {if styling.flavor_bar_offset == "-" or styling.flavor_bar_offset == "+" then 0 else to_number(styling.flavor_bar_offset)}
+##### offset_lines := {offset_counter(styling.flavor_bar_offset)}
+
+top_of_textbox := {card_style.text.top }
+bottom_of_textbox := {card_style.text.bottom }
+top_of_textbox2 := {card_style.text_2.top }
+bottom_of_textbox2 := {card_style.text_2.bottom }
+offset_counter := {length(filter_text(input, match:"u")) - length(filter_text(input, match:"d"))}
+paragraph_count := filter_text@(match:"\n")
+hard_paragraph_count :=
+ replace@(match:"\n", replace:"")+ #count hard breaks for their extra space
+ filter_text@(match:"\n")
+soft_break_filter :=
+ filter_text @(match:"<", in_context: "soft-line>") #count soft breaks for quotes
+word_split := split_text@(match:" ") #split words to better calculate line lengths
+small_filter := filter_text@(match:"[\\.,\\?!il’]") #grab the tiny characters
+fb_length := {length(input) - 0.3 * length(small_filter(input))}#reduce the effect of tiny characters
+calc_lines := { sum := 0 #estimate lines by character limit
+ lines := 1 #minimum of 1
+ for e from 0 to length(input)-1 do (
+ sum := sum + fb_length(input[e]);
+ if sum > char then ( #if new word is over the limit
+ lines := lines + 1; #add new line
+ sum := fb_length(input[e])) #reset the sum
+ else
+ sum := sum + 1; #else add it and a space to the sum
+ )
+ lines #return number of lines
+}
+lines_of_text := { #estimate lines in break blocks
+ lines := 0 #further improves the previous eq
+ for x from 0 to length(input)-1 do
+ if input[x] or else "" != "" then #if the break isn't empty, check it
+ lines := lines + calc_lines(word_split(input[x]), char:char)
+ lines
+}
+flavor_text := {split_text(match:"\n", remove_tags(card.flavor_text+"\n"))} #remove tags, add \n so .1 doesn't explode
+hard_flavor_break := { if not contains(card.flavor_text, match:"\n") then 0 else if contains(card.flavor_text, match:"\n") then 0 else if lines_of_rules() >= 3 then -3 else -2}
+font_size := {min(14,round_near(card_style.text.content_height / card_style.text.content_lines) - 8)} #approximate font size
+adj_char_width := {7.35 * min(14, font_size()+0.95) / 14} #average char width, adjusted for font size
+char_per_line := {min(52,round_up(card_style.text.content_width / adj_char_width())+1.5)} #approximate character limit. very rarely over 52 but standard eq can reach 60+
+lines_of_flavor := {lines_of_text(flavor_text(), char:char_per_line())}
+lines_of_rules := { card_style.text.content_lines - lines_of_flavor() } #rules of lines for ratio weirdness
+line_height := {(card_style.text.content_height / card_style.text.content_lines)}
+padding_height := { 0.5*(bottom_of_textbox() - top_of_textbox() - card_style.text.content_height) } #space between top of textbox and text
+linebreak_height := { 2*length(hard_paragraph_count(card.rule_text)) }
+###correction for ratio of rules/flavor causing weirdness
+uneven_correction := { if lines_of_flavor() == 1 then max(4, (card_style.text.content_lines - (2*lines_of_flavor()))) else (card_style.text.content_lines - (2*lines_of_flavor())) }
+###add it all up
+###old_bar_equation is compatibilty for 2.0.0
+old_bar_equation := { top_of_textbox() + padding_height() + card_style.text.content_height - line_height()*(lines_of_flavor() + offset_lines()) + linebreak_height() - uneven_correction() + front_corr() + bar_offset() + hard_flavor_break() +1 }
+bar_equation := {if card_style.text.layout.blocks[1].bottom or else 0 > 0 then card_style.text.top + 0.5*(card_style.text.layout.blocks[0].bottom+card_style.text.layout.blocks[1].top) else old_bar_equation()}
+
+flavor_text2 := {split_text(match:"\n", remove_tags(card.flavor_text_2+"\n"))} #remove tags, add \n so .1 doesn't explode
+hard_flavor_break2 := { if not contains(card.flavor_text_2, match:"\n") then 0 else if contains(card.flavor_text_2, match:"\n") then 0 else if lines_of_rules2() >= 3 then -3 else -2}
+font_size2 := {min(14,round_near(card_style.text_2.content_height / card_style.text_2.content_lines) - 8)} #approximate font size
+adj_char_width2 := {7.35 * min(14, font_size2()+0.95) / 14} #average char width, adjusted for font size
+char_per_line2 := {min(52,round_up(card_style.text_2.content_width / adj_char_width2())+1.5)} #approximate character limit. very rarely over 52 but standard eq can reach 60+
+lines_of_flavor2 := {lines_of_text(flavor_text2(), char:char_per_line2())}
+lines_of_rules2 := { card_style.text_2.content_lines - lines_of_flavor2() } #rules of lines for ratio weirdness
+line_height2 := {(card_style.text_2.content_height / card_style.text_2.content_lines)}
+padding_height2 := { 0.5*(bottom_of_textbox2() - top_of_textbox2() - card_style.text_2.content_height) } #space between top of textbox and text
+linebreak_height2 := { 2*length(hard_paragraph_count(card.rule_text_2)) }
+###correction for ratio of rules/flavor causing weirdness
+uneven_correction2 := { if lines_of_flavor2() == 1 then max(4, (card_style.text_2.content_lines - (2*lines_of_flavor2()))) else (card_style.text_2.content_lines - (2*lines_of_flavor2())) }
+###add it all up
+old_bar_equation2 := { top_of_textbox2() + padding_height2() + card_style.text_2.content_height - line_height2()*(lines_of_flavor2() + offset_lines2()) + linebreak_height2() - uneven_correction2() + back_corr() + bar_offset2() + hard_flavor_break2() +1 }
+bar_equation2 := {if card_style.text_2.layout.blocks[0].bottom or else 0 > 0 then card_style.text_2.top + 0.5*(card_style.text_2.layout.blocks[0].bottom+card_style.text_2.layout.blocks[1].top) else old_bar_equation2()}
+
+##### long correction coefficient based off several sets of data
+front_corr := {correction_coeff(lof:lines_of_flavor(), lor:lines_of_rules(), lbh:linebreak_height())}
+back_corr := {correction_coeff(lof:lines_of_flavor2(), lor:lines_of_rules2(), lbh:linebreak_height2())}
+correction_coeff := {
+ (if lor == 1 then
+ (if lof == 1 then 3
+ else if lof == 2 then 1
+ else if lof == 3 then 1.5
+ else if lof == 4 then 0
+ else 5 - lof)
+ else if lor == 2 and lbh == 2 then
+ (if lof == 1 then 1
+ else if lof == 2 then 1
+ else if lof == 3 then 2
+ else if lof == 4 then 2
+ else 3)
+ else if lor == 2 then
+ (if lof == 1 then 1
+ else if lof == 2 then 0
+ else if lof == 3 then 0
+ else if lof == 4 then 0
+ else -1)
+ else if lor == 3 and lbh == 2 then
+ (if lof == 1 then 0
+ else if lof == 2 then 0
+ else if lof == 3 then 1
+ else if lof == 4 then 1
+ else 2)
+ else if lor == 3 then
+ (if lof == 1 then 0
+ else if lof == 2 then -1
+ else if lof == 3 then -0.5
+ else if lof == 4 then -1
+ else 0)
+ else if lor == 4 and lbh == 2 then
+ (-2 + lof)
+ else if lor == 4 then
+ (if lof == 1 then -1
+ else if lof == 2 then 0
+ else if lof == 3 then -0.5
+ else -1)
+ else if lor == 5 and lbh == 4 then
+ (-5 + lof)
+ else if lor == 5 and lbh == 2 then
+ (-2 + lof)
+ else if lor == 5 then
+ (2 - lof)
+ else if lor == 6 and lbh == 2 then
+ (-1 - lof)
+ else if lor == 6 then
+ (2 - lof)
+ else 0) + (if lbh >= 4 then 0.5*lbh-1)
+}
+######################## Modal DFC hints
+auto_flags := {true}
+front_modal_hint := {
+ if not auto_flags() then ["", "", 10.5]
+ else if remove_tags(card.sub_type_2) != "" then [card.sub_type_2, ""+card.casting_cost_2+"", 10.5]
+ else if card.casting_cost_2 != "" then [main_type(card.super_type_2), ""+card.casting_cost_2+"", 10.5]
+ else [main_type(card.super_type_2), mana_ability(card.rule_text_2), 10.5]
+}
+back_modal_hint := {
+ if not auto_flags() then ["", "", 10.5]
+ else if remove_tags(card.sub_type) != "" then [card.sub_type, ""+card.casting_cost+"", 10.5]
+ else if card.casting_cost != "" then [main_type(card.super_type), ""+card.casting_cost+"", 10.5]
+ else [main_type(card.super_type), mana_ability(card.rule_text), 10.5]
+}
+mana_ability := {
+ abils := break_text(input, match:"(?sym(-auto)?>)?T(?sym(-auto)?>)?: Add (?sym(-auto)?>)?(W|U|B|R|G|C)(?sym(-auto)?>)?(, | or )?(?sym(-auto)?>)?(W|U|B|R|G|C)?(?sym(-auto)?>)?(, or )?(?sym(-auto)?>)?(W|U|B|R|G|C)?(?sym(-auto)?>)?.")
+ abils[0] or else ""
+}
+main_type := {
+ types := main_types(input)
+ if includes("Creature", array:types)
+ then "Creature"
+ else if includes("Land", array:types)
+ then "Land"
+ else types[0]
+}
+main_types := {
+ types := break_text(input, match:"(Land|Instant|Sorcery|Artifact|Enchantment|Creature|Planeswalker)")
+ types or else [""]
+}
+######################## Mainframe mana
+use_v_mana := {contains(set.custom_mana_symbol_name, match:".png")}
+use_large_v_mana := { use_v_mana() and chosen(set.mana_symbol_options, choice:"enable in casting costs")}
+use_small_v_mana := { use_v_mana() and chosen(set.mana_symbol_options, choice:"enable in text boxes")}
+use_color_v_mana := { use_v_mana() and chosen(set.mana_symbol_options, choice:"colored mana symbols") and not use_hybrid_v_mana()}
+use_hybrid_v_mana := { use_v_mana() and chosen(set.mana_symbol_options, choice:"hybrid with colors")}
+v_mana_name := {if not use_v_mana() then "" else replace(set.custom_mana_symbol_name, match:"(.+/|\\.png)", replace:"")}
+v_mana_loc := {if not use_v_mana() then "" else replace(set.custom_mana_symbol_name, match:"{v_mana_name()}\\.png", replace:"")}
+v_mana_num := {max(to_number(set.number_hybrid_variants),0) or else -1}
+
+searchPull := filter_text@(match:"search(name|mana|type|rules|flavor|text|notes)")
+searchSnip := replace@(match:"search(name|mana|type|rules|flavor|text|notes)_", replace:"")
+
+custom_index := {
+ sortIndex := split_text(set.custom_index, match:",")
+ for each field in sortIndex do
+ applyIndex(to_lower(field))
+ or else (
+ searchIndex(to_lower(searchPull(field)), query:searchSnip(field))
+ )
+ or else ""
+}
+applyIndex := {
+ [
+ name: {
+ fill_len(to_string(position (
+ of: card
+ in: set
+ order_by: { sort_name(card.name) + sort_name(export_name())}
+ filter: set_filter()
+ )), lead:"0", fill_to:3)
+ },
+ alias: {
+ fill_len(to_string(position (
+ of: card
+ in: set
+ order_by: { sort_name(card.alias) + sort_name(export_name())}
+ filter: set_filter()
+ )), lead:"0", fill_to:3)
+ }
+ name2: {
+ fill_len(to_string(position (
+ of: card
+ in: set
+ order_by: { sort_name(card.name_2) + sort_name(export_name())}
+ filter: set_filter()
+ )), lead:"0", fill_to:3)
+ },
+ alias2: {
+ fill_len(to_string(position (
+ of: card
+ in: set
+ order_by: { sort_name(card.alias_2) + sort_name(export_name())}
+ filter: set_filter()
+ )), lead:"0", fill_to:3)
+ }
+ color: {fill_len(color_of_card(), lead:"A")},
+ artist: {fill_len(substring(card.illustrator, end:7), follow:" ", fill_to:7)},
+ artist2: {fill_len(substring(card.illustrator_2, end:7), follow:" ", fill_to:7)},
+ design: {fill_len(substring(card.card_code_text, end:7), follow:" ", fill_to:7)},
+ mv: {fill_len(to_string(cmc(card.casting_cost)), lead:"0")},
+ "mana value": {fill_len(to_string(cmc(card.casting_cost)), lead:"0")},
+ cmc: {fill_len(to_string(cmc(card.casting_cost)), lead:"0")},
+ "converted mana cost": {fill_len(to_string(cmc(card.casting_cost)), lead:"0")},
+ rarity: {index_of_rarity()},
+ power: {fill_len(card.power, lead:"0")},
+ toughness: {fill_len(card.toughness, lead:"0")},
+ pt: {fill_len(card.power, lead:"0") + fill_len(card.toughness, lead:"0")},
+ loyalty: {fill_len(card.loyalty, lead:"0")},
+ type: {fill_len(filter_text(match:"[A-Z][A-Z]?[A-Z]?", filter_text(match:"[A-Z]", card.super_type)), follow:"0", fill_to:3)},
+ hasrules: {if remove_tags(card.rule_text) != "" then "A" else "B"},
+ hasflavor: {if remove_tags(card.flavor_text) != "" then "A" else "B"},
+ hasrules2: {if remove_tags(card.rule_text_2) != "" then "A" else "B"},
+ hasflavor2: {if remove_tags(card.flavor_text_2) != "" then "A" else "B"},
+ ][input]()
+}
+searchIndex := {
+ [
+ searchname: { if contains(card.name, match:query) or contains(card.name_2, match:query) then "A" else "B"},
+ searchmana: { if contains(card.casting_cost, match:query) or contains(card.casting_cost_2, match:query) then "A" else "B"},
+ searchtype: { if contains(card.type, match:query) or contains(card.type_2, match:query) then "A" else "B"},
+ searchrules: { if contains(card.rule_text, match:query) or contains(card.rule_text_2, match:query) then "A" else "B"},
+ searchflavor: { if contains(card.flavor_text, match:query) or contains(card.flavor_text_2, match:query) then "A" else "B"},
+ searchartist: { if contains(card.illustrator, match:query) or contains(card.illustrator_2, match:query) then "A" else "B"},
+ searchdesign: { if contains(card.card_code_text, match:query) then "A" else "B"},
+ searchtext: { if contains(card.text, match:query) or contains(card.text_2, match:query) then "A" else "B"},
+ searchnotes: { if contains(card.notes, match:query) then "A" else "B"},
+ unsearchname: { if contains(card.name, match:query) or contains(card.name_2, match:query) then "B" else "A"},
+ unsearchmana: { if contains(card.casting_cost, match:query) or contains(card.casting_cost_2, match:query) then "B" else "A"},
+ unsearchtype: { if contains(card.type, match:query) or contains(card.type_2, match:query) then "B" else "A"},
+ unsearchrules: { if contains(card.rule_text, match:query) or contains(card.rule_text_2, match:query) then "B" else "A"},
+ unsearchflavor: { if contains(card.flavor_text, match:query) or contains(card.flavor_text_2, match:query) then "B" else "A"},
+ unsearchartist: { if contains(card.illustrator, match:query) or contains(card.illustrator_2, match:query) then "B" else "A"},
+ unsearchdesign: { if contains(card.card_code_text, match:query) then "B" else "A"},
+ unsearchtext: { if contains(card.text, match:query) or contains(card.text_2, match:query) then "B" else "A"},
+ unsearchnotes: { if contains(card.notes, match:query) then "B" else "A"}
+ ][input]()
+}
+index_of_rarity := {
+ if card.rarity == "basic land" then "A"
+ else if card.rarity == "common" then "C"
+ else if card.rarity == "uncommon" then "D"
+ else if card.rarity == "rare" then "E"
+ else if card.rarity == "mythic rare" then "F"
+ else if card.rarity == "special" then "G"
+ else "J"
+}
+fill_len := {
+ output := to_string(input)
+ if output == "" then output := "0"
+ fill := max(0,fill_to - length(output))
+ for x from 1 to fill do output := lead + output + follow;
+ output
+}@(fill_to:2, lead:"", follow:"")
+
+skeleton_commons := 19
+skeleton_uncommons := 11
+skeleton_rares := 7
+skeleton_mythics := 2
+skeleton_land_commons := 1
+skeleton_land_uncommons := 5
+skeleton_land_rares := 0
+skeleton_gold_commons := 0
+skeleton_gold_uncommons := 1
+skeleton_gold_rares := 1
+skeleton_shard_commons := 0
+skeleton_shard_uncommons := 0
+skeleton_shard_rares := 0
+skeleton_wedge_commons := 0
+skeleton_wedge_uncommons := 0
+skeleton_wedge_rares := 0
+skeleton_artifact_commons := 5
+skeleton_artifact_uncommons := 5
+skeleton_artifact_rares := 0
+skeleton_blank_commons := 0
+skeleton_blank_uncommons := 5
+skeleton_blank_rares := 8
+skeleton_blank_mythics := 5
+#### generates a set of CC00 Skeleton cards for each color
+#### by insertnamehere and cajun
+skeleton_runner := {
+ cards:=[]
+ for x from 0 to length(letter_list)-1 do
+ (
+ for y from 1 to count do
+ if mana_list == "nope" then
+ (cards := cards + [new_card([name:prefix+letter_list[x]+fill_len(y, lead:"0"), rarity:rarity, card_color:color_list[x], super_type:super_type])];)
+ else
+ (cards := cards + [new_card([name:prefix+letter_list[x]+fill_len(y, lead:"0"), rarity:rarity, super_type:super_type, casting_cost:mana_list[x]])];)
+ )
+ cards
+}@(count:1, rarity:"common", type:"", prefix:"C", super_type:"", color_list:["white", "blue", "black", "red", "green"], letter_list:["W", "U", "B", "R", "G"], mana_list:"nope")
+###outside to make singleton scripts easier
+blank_list_5 := ["","","","",""]
+blank_list_10 := ["","","","","","","","","",""]
+mana_list_ally := ["WU","UB","BR","RG","GW"]
+mana_list_enemy := ["WB","UR","BG","RW","GU"]
+mana_list_shard := ["WUB","UBR","BRG","RGW","GWU"]
+mana_list_wedge := ["WBG","URW","BGU","RWB","GUR"]
+skeleton_script := {
+ cards := [];
+ cards := cards + skeleton_runner(count:skeleton_commons);
+ cards := cards + skeleton_runner(count:skeleton_uncommons, prefix:"U", rarity:"uncommon");
+ cards := cards + skeleton_runner(count:skeleton_rares, prefix:"R", rarity:"rare");
+ cards := cards + skeleton_runner(count:skeleton_mythics, prefix:"M", rarity:"mythic rare");
+ cards := cards + skeleton_runner(count:skeleton_gold_commons, prefix:"CM", rarity:"common", letter_list:blank_list_10, mana_list:mana_list_ally+mana_list_enemy);
+ cards := cards + skeleton_runner(count:skeleton_gold_uncommons, prefix:"UM", rarity:"uncommon", letter_list:blank_list_10, mana_list:mana_list_ally+mana_list_enemy);
+ cards := cards + skeleton_runner(count:skeleton_gold_rares, prefix:"RM", rarity:"rare", letter_list:blank_list_10, mana_list:mana_list_ally+mana_list_enemy);
+ cards := cards + skeleton_runner(count:skeleton_shard_commons, prefix:"CM", rarity:"common", letter_list:blank_list_5, mana_list:mana_list_shard);
+ cards := cards + skeleton_runner(count:skeleton_shard_uncommons, prefix:"UM", rarity:"uncommon", letter_list:blank_list_5, mana_list:mana_list_shard);
+ cards := cards + skeleton_runner(count:skeleton_shard_rares, prefix:"RM", rarity:"rare", letter_list:blank_list_5, mana_list:mana_list_shard);
+ cards := cards + skeleton_runner(count:skeleton_wedge_commons, prefix:"CM", rarity:"common", letter_list:blank_list_5, mana_list:mana_list_wedge);
+ cards := cards + skeleton_runner(count:skeleton_wedge_uncommons, prefix:"UM", rarity:"uncommon", letter_list:blank_list_5, mana_list:mana_list_wedge);
+ cards := cards + skeleton_runner(count:skeleton_wedge_rares, prefix:"RM", rarity:"rare", letter_list:blank_list_5, mana_list:mana_list_wedge);
+ for i from 1 to skeleton_artifact_commons do cards := cards + [new_card([name:"CA"+fill_len(i, lead:"0"), rarity:"common", super_type:"Artifact"])];
+ for i from 1 to skeleton_artifact_uncommons do cards := cards + [new_card([name:"UA"+fill_len(i, lead:"0"), rarity:"uncommon", super_type:"Artifact"])];
+ for i from 1 to skeleton_artifact_rares do cards := cards + [new_card([name:"RA"+fill_len(i, lead:"0"), rarity:"rare", super_type:"Artifact"])];
+ for i from 1 to skeleton_land_commons do cards := cards + [new_card([name:"CL"+fill_len(i, lead:"0"), super_type:"Land", rarity:"common"])];
+ for i from 1 to skeleton_land_uncommons do cards := cards + [new_card([name:"UL"+fill_len(i, lead:"0"), super_type:"Land", rarity:"uncommon"])];
+ for i from 1 to skeleton_land_rares do cards := cards + [new_card([name:"RL"+fill_len(i, lead:"0"), super_type:"Land", rarity:"rare"])];
+ for i from 1 to skeleton_blank_commons do cards := cards + [new_card([name:"CX"+fill_len(i, lead:"0"), rarity:"common"])];
+ for i from 1 to skeleton_blank_uncommons do cards := cards + [new_card([name:"UX"+fill_len(i, lead:"0"), rarity:"uncommon"])];
+ for i from 1 to skeleton_blank_rares do cards := cards + [new_card([name:"RX"+fill_len(i, lead:"0"), rarity:"rare"])];
+ for i from 1 to skeleton_blank_mythics do cards := cards + [new_card([name:"MX"+fill_len(i, lead:"0"), rarity:"mythic rare"])];
+ cards
+}
+skeleton_info := {
+ trace("Set Skeleton Generator Help:"
+ +"\nSet variables here to modify the Skeleton Add Cards script, for example 'skeleton_commons := 10'"
+ +"\nCurrent variables:\n"
+ +"skeleton_commons: " + skeleton_commons + " (of each color)\n"
+ +"skeleton_uncommons: " + skeleton_uncommons + " (of each color)\n"
+ +"skeleton_rares: " + skeleton_rares + " (of each color)\n"
+ +"skeleton_mythics: " + skeleton_mythics + " (of each color)\n"
+ +"skeleton_gold_commons: " + skeleton_gold_commons + " (of each color pair)\n"
+ +"skeleton_gold_uncommons: " + skeleton_gold_uncommons + " (of each color pair)\n"
+ +"skeleton_gold_rares: " + skeleton_gold_rares + " (of each color pair)\n"
+ +"skeleton_artifact_commons: " + skeleton_artifact_commons + "\n"
+ +"skeleton_artifact_uncommons: " + skeleton_artifact_uncommons + "\n"
+ +"skeleton_artifact_rares: " + skeleton_artifact_rares + "\n"
+ +"skeleton_land_commons: " + skeleton_land_commons + "\n"
+ +"skeleton_land_uncommons: " + skeleton_land_uncommons + "\n"
+ +"skeleton_land_rares: " + skeleton_land_rares + "\n"
+ +"skeleton_blank_commons: " + skeleton_blank_commons + "\n"
+ +"skeleton_blank_uncommons: " + skeleton_blank_uncommons + "\n"
+ +"skeleton_blank_rares: " + skeleton_blank_rares + "\n"
+ +"skeleton_blank_mythics: " + skeleton_blank_mythics + "\n"
+ +"skeleton_shard_commons: " + skeleton_shard_commons + "\n"
+ +"skeleton_shard_uncommons: " + skeleton_shard_uncommons + "\n"
+ +"skeleton_shard_rares: " + skeleton_shard_rares + "\n"
+ +"skeleton_wedge_commons: " + skeleton_wedge_commons + "\n"
+ +"skeleton_wedge_uncommons: " + skeleton_wedge_uncommons + "\n"
+ +"skeleton_wedge_rares: " + skeleton_wedge_rares)
+}
+##number of chapter symbols each chapter textbox has
+##example, symbols on abilities 2,2,3 returns [0,2,1]
+saga_lore_count := {
+ one := 0
+ two := 0
+ three := 0
+ four := 0
+ five := 0
+ six := 0
+ seven := 0
+ eight := 0
+ for x from 0 to length(input)-1 do
+ if input[x] == "1" then one := one +1
+ else if input[x] == "2" then two := two +1
+ else if input[x] == "3" then three := three +1
+ else if input[x] == "4" then four := four +1
+ else if input[x] == "5" then five := five +1
+ else if input[x] == "6" then six := six +1
+ else if input[x] == "7" then seven := seven +1
+ else eight := eight +1
+ [one, two, three, four, five, six, seven]
+}
+##index of given chapter number in above array
+##example, 2,2,3, returns 1,2,1
+##i tried to make this shorter but this is the only one that deigned to function
+saga_ch_placement := {
+ box1 := 0
+ box2 := 0
+ box3 := 0
+ box4 := 0
+ one := 0
+ two := 0
+ three := 0
+ four := 0
+ five := 0
+ six := 0
+ seven := 0
+ len := length(input)
+ if len >= 1 then (
+ if input[0] == "1" then (
+ box1 := box1 +1
+ one := box1+0
+ )else if input[0] == "2" then (
+ box2 := box2 +1
+ one := box2+0
+ )else if input[0] == "3" then (
+ box3 := box3 +1
+ one := box3+0
+ )else if input[0] == "4" then (
+ box4 := box4 +1
+ one := box4+0
+ )else (one := one)
+ )else (one := one)
+ if len >= 2 then (
+ if input[1] == "1" then (
+ box1 := box1 +1
+ two := box1+0
+ )else if input[1] == "2" then (
+ box2 := box2 +1
+ two := box2+0
+ )else if input[1] == "3" then (
+ box3 := box3 +1
+ two := box3+0
+ )else if input[1] == "4" then (
+ box4 := box4 +1
+ two := box4+0
+ )else (two := two)
+ )else (two := two)
+ if len >= 3 then (
+ if input[2] == "1" then (
+ box1 := box1 +1
+ three := box1+0
+ )else if input[2] == "2" then (
+ box2 := box2 +1
+ three := box2+0
+ )else if input[2] == "3" then (
+ box3 := box3 +1
+ three := box3+0
+ )else if input[2] == "4" then (
+ box4 := box4 +1
+ three := box4+0
+ )else (three := three)
+ )else (three := three)
+ if len >= 4 then (
+ if input[3] == "1" then (
+ box1 := box1 +1
+ four := box1+0
+ )else if input[3] == "2" then (
+ box2 := box2 +1
+ four := box2+0
+ )else if input[3] == "3" then (
+ box3 := box3 +1
+ four := box3+0
+ )else if input[3] == "4" then (
+ box4 := box4 +1
+ four := box4+0
+ )else (four := four)
+ )else (four := four)
+ if len >= 5 then (
+ if input[4] == "1" then (
+ box1 := box1 +1
+ five := box1+0
+ )else if input[4] == "2" then (
+ box2 := box2 +1
+ five := box2+0
+ )else if input[4] == "3" then (
+ box3 := box3 +1
+ five := box3+0
+ )else if input[4] == "4" then (
+ box4 := box4 +1
+ five := box4+0
+ )else (five := five)
+ )else (five := five)
+ if len >= 6 then (
+ if input[5] == "1" then (
+ box1 := box1 +1
+ six := box1+0
+ )else if input[5] == "2" then (
+ box2 := box2 +1
+ six := box2+0
+ )else if input[5] == "3" then (
+ box3 := box3 +1
+ six := box3+0
+ )else if input[5] == "4" then (
+ box4 := box4 +1
+ six := box4+0
+ )else (six := six)
+ )else (six := six)
+ if len >= 7 then (
+ if input[6] == "1" then (
+ box1 := box1 +1
+ seven := box1+0
+ )else if input[6] == "2" then (
+ box2 := box2 +1
+ seven := box2+0
+ )else if input[6] == "3" then (
+ box3 := box3 +1
+ seven := box3+0
+ )else if input[6] == "4" then (
+ box4 := box4 +1
+ seven := box4+0
+ )else (seven := seven)
+ )else (seven := seven)
+ [one, two, three, four, five, six, seven]
+}
+
+card_face := {
+ trace(margin_code)
+ front := card[input]
+ back := if card[input+"_2"] or else "" != "" then card[input+"_2"] else card[input]
+ if match(margin_code, match:"(text[2456]|lv[5678])") then back else front
+}
+strip_card_codes := replace@(match:"^[CURMSL][WUBRGMZACL][0-9]+ ?[-—]? ?", replace:"")
+name_checker := {if not set.remove_card_codes then input else strip_card_codes(input)}
+
+face_code := {
+ face := ""
+ if margin_code == "text2" or margin_code == "lv5" or margin_code == "lv6" or margin_code == "lv7" or margin_code == "lv8" then face := "_2"
+ output := face_scripts[input](face) or else if_parse(input, face:face) or else input
+ output
+}
+face_scripts := [
+ iscreature: {is_creature(card["type"+face])},
+ iscreaturish: {is_creaturish(card["type"+face])},
+ isenchantment: {is_enchantment(card["type"+face])},
+ isartifact: {is_artifact(card["type"+face])},
+ island: {is_land(card["type"+face])},
+ isspell: {is_spell(card["type"+face])},
+ istarget: {is_targeted(card["text"+face])},
+ subtypes: {separate_words(card["sub_type"+face], spacer: " ")}
+ contains: {
+ contains(card[field+face], match:query)
+ },
+ notcontains: {not contains(card[field+face], match:query)},
+]
+expand_facecodes := [
+ subtype: "sub_type",
+ castingcost: "casting_cost",
+ manacost: "casting_cost"
+]
+if_parse := replace@(
+ match: "if_(.*)_then_(.*)_else_(.*)",
+ replace: {if_scripts(_1, t:_2, f:_3)}
+)
+if_scripts := {
+ contCheck := split_text(input, match:"_")
+ func := contCheck[0]
+ field := ""
+ query := "^$"
+ if length(contCheck) == 3 then (
+ field := contCheck[0]
+ func := contCheck[1]
+ query := contCheck[2]
+ )
+ field := expand_facecodes[field] or else field
+ if face_scripts[func](face, field:field, query:query) or else false then t else f
+}
+
+white_text := {false}
+phy_reminder := {
+ phy_match := filter_text(input, match:"(/[WUBRG])+", in_context:"H")
+ letters := split_text(phy_match, match:"/")
+ reminder_text := ""
+ if length(letters) == 2 then
+ reminder_text := "[H/" + letters[1] + "] can be paid with [" + letters[1] + "] or 2 life."
+ else if length(letters) > 2 then
+ reminder_text := "[H/" + letters[1] + "/" + letters[2] + "] can be paid with [" + letters[1] + "], " + "[" + letters[2] + "], or 2 life."
+ else
+ reminder_text := ""
+ reminder_text
+}
diff --git a/data/magic.mse-game/set_fields b/data/magic.mse-game/set_fields
index 439b402d..b75e3255 100644
--- a/data/magic.mse-game/set_fields
+++ b/data/magic.mse-game/set_fields
@@ -38,6 +38,13 @@ set field:
type: symbol
name: masterpiece symbol
description: The symbol for this sets masterpieces, click to edit
+set field:
+ type: boolean
+ name: shorten types for rarity
+ description: Makes the typeline not run into the rarity symbol. Disable if you don't use rarity symbols.
+set field:
+ type: info
+ name: Watermark links
set field:
type: text
name: custom watermark 1
@@ -58,9 +65,38 @@ set field:
type: text
name: custom watermark 5
description: Set this image in magic-watermarks.mse-include as Custom Watermark 5
+set field:
+ type: text
+ name: custom watermark 6
+ description: Set this image in magic-watermarks.mse-include as Custom Watermark 6
+set field:
+ type: text
+ name: custom watermark 7
+ description: Set this image in magic-watermarks.mse-include as Custom Watermark 7
+set field:
+ type: text
+ name: custom watermark 8
+ description: Set this image in magic-watermarks.mse-include as Custom Watermark 8
+set field:
+ type: text
+ name: custom watermark 9
+ description: Set this image in magic-watermarks.mse-include as Custom Watermark 9
+set field:
+ type: text
+ name: custom watermark 10
+ description: Set this image in magic-watermarks.mse-include as Custom Watermark 10
+set field:
+ type: boolean
+ name: blend with colors
+ initial: no
+ description: Only works for 500x500 px watermarks. For best results, use a solid black watermark. Blend watermarks with card colors instead of a solid color.
set field:
type: info
name: Defaults and Automation
+set field:
+ type: text
+ name: inserts
+ description: List of strings, separated by ;, that replaces INS1, INS2, ... INS9. May need to reload MSE for changes to take effect.
set field:
type: color
name: border color
@@ -73,7 +109,7 @@ set field:
color: rgb(255,255,255)
choice:
name: silver
- color: rgb(128,128,128)
+ color: rgb(200,200,200)
choice:
name: gold
color: rgb(200,180,0)
@@ -87,10 +123,10 @@ set field:
choice: action
choice: custom
choice: lower case
- initial: old, expert, pseudo, action, custom
+ initial: old, expert, pseudo, action, custom, lower case
# Convert from older mse versions
script:
- if value == "yes" then "old, core, expert, custom"
+ if value == "yes" then "old, core, expert, custom, lower case"
else if value == "no" then ""
else value
description: For which kinds of keywords should reminder text be added by default? Note: you can enable/disable reminder text by right clicking the keyword.
@@ -98,10 +134,18 @@ set field:
type: boolean
name: automatic card numbers
description: Should card numbers be shown on the cards?
+set field:
+ type: text
+ name: card number offsets
+ description: Add this number to the card numbers. Formatted as "start,total"
set field:
type: boolean
name: automatic copyright
description: Should the copyright line above be shown on the cards?
+set field:
+ type: boolean
+ name: rarity codes
+ description: Show rarity codes on M15 frames?
set field:
type: boolean
name: trim statistics
@@ -128,29 +172,48 @@ set field:
name: sort hybrid in pairs
description: Should hybrid cards be sorted according to pairs like in Shadowmoor block?
initial: no
-#set field:
-# type: boolean
-# name: wedge mana costs
-# description: Should three color mana costs sort in wedge order like in Khans block?
-# initial: no
set field:
type: choice
name: mana cost sorting
- description: Should mana costs be sorted by shard, by wedge, or unsorted?
- choice: shard sorting
- choice: wedge sorting
+ description: Should mana costs be sorted by Tarkir standard (WBG), Apocalypse standard (BGW), or left unsorted?
+ choice: tarkir wedge sorting
+ choice: apocalypse wedge sorting
choice: unsorted
+ #typo that stood for way too long
+ script:
+ if value == "apocalype wedge sorting" then "apocalypse wedge sorting" else value
set field:
type: choice
name: card language
description: Language for the cards
choice: English
choice: Français
+ choice: Italiano
+ choice: Português do Brasil
+ choice: Russian
initial: English
set field:
type: boolean
name: mark errors
description: Marks errors on cards, for example wording and spelling errors, non unique card names, etc.
+set field:
+ type: boolean
+ name: auto correct
+ description: Applies auto correct for a few common syntax errors.
+set field:
+ type: boolean
+ name: auto errata
+ description: Applies auto errata for a changed rules text.
+ initial: no
+set field:
+ type: boolean
+ name: remove card codes
+ description: Remove card codes from all card names.
+ initial: no
+set field:
+ type: boolean
+ name: alias as cardname
+ description: Replaces CARDNAME with a card's alias instead of card name.
set field:
type: choice
name: use gradient multicolor
@@ -159,7 +222,63 @@ set field:
choice: no
description: Use gradients on multicolor cards by default, you can always change it be clicking on the card border.
initial: only for two color cards
-
+set field:
+ type: boolean
+ name: wedge mana costs
+ description: Depreciated. Should three color mana costs sort in wedge order like in Khans block?
+ initial: no
+set field:
+ type: info
+ name: Mainframe Template Options
+set field:
+ type: text
+ name: mainframe rarity name
+ description: Use rarity symbols from magic-mainframe-extras.mse-include. Input NAME.png here, save the images as NAMEc.png, NAMEu.png, NAMEr.png, NAMEm.png, NAMEs.png, and NAMEmp.png
+set field:
+ type: boolean
+ name: use flavor bar
+ description: Enables the flavor bar on Mainframe templates.
+set field:
+ type: boolean
+ name: auto legends
+ description: Automatically apply the Legendary frame on Mainframe templates.
+set field:
+ type: text
+ name: custom index
+ description: Order of card fields for the custom index sorting
+ script: replace(value, match:"\n", replace:"")
+set field:
+ type: text
+ name: custom mana symbol name
+ description: Use mana symbols from magic-mainframe-extras.mse-include. Input NAME.png here, check help below for file instructions.
+set field:
+ type: multiple choice
+ name: mana symbol options
+ choice: enable in casting costs
+ choice: enable in text boxes
+ choice: colored mana symbols
+ choice: hybrid with colors
+set field:
+ type: text
+ name: number hybrid variants
+ description: Change 1/X 2/X etc to a variant symbol instead of a hybrid symbol
+set field:
+ type: choice
+ name: mana symbol help
+ choice: Click here for mana symbol help!
+ choice: In your mainframe-extras folder, create folders named "large" and/or "small" depending on your usage
+ choice: Large is for only mana costs, small for only text, create both if you use both
+ choice: Additionally, you can create a "future" folder for M15 Future mana costs
+ choice: Save NAME.png to the relevant folders. Remember that large symbols have dropshadows
+ choice: For the name option above, set the address of the image, minus mainframe-extras and large/small/future
+ choice: Ex: magic-mainframe-extras/cajun/large/hazard.png would use cajun/hazard.png
+ choice: Standard size is 160x160 for small, 200x200 for small hybrid and future, 165x178 for large, 205x218 for large hybrid
+ choice: If your symbol mixes with colors (such as Phyrexian mana): Save NAME_w.png, NAME_u.png, etc to those folders too.
+ choice: If your symbol hybrids with colors (like 2/W): [Note, doesn't work on M15 Future mana costs.]
+ choice: Save NAME_h.png to those folders too. See mana_bb.png and similar for how this image should look.
+ choice: Your mana symbol will now be keyed to V (and V/W, V/U, etc. for colored/hybrid symbols).
+ choice: You can change number hybrids (2/V etc) to different mana symbols for even more custom symbols.
+ choice: Put the highest number to change (from 0 to 11) in "number hybrid variants" and save as NAME_0.png etc.
############################# Default style
default set style:
@@ -205,8 +324,19 @@ default set style:
fill type: linear gradient
fill color 1: rgb(224,170,247)
fill color 2: rgb(58,7,80)
- border color 1: rgb(255,255,255)
- border color 2: rgb(255,255,255)
+ border color 1: rgb(255, 255, 255)
+ border color 2: rgb(255, 255, 255)
+##purple
+##fill color 1: rgb(224,170,247)
+##fill color 2: rgb(58,7,80)
+##green
+##fill color 1: rgb(3,146,50)
+##fill color 2: rgb(114,252,158)
+##brown
+##fill color 1: rgb(177,150,131)
+##fill color 2: rgb(83,67,53)
+##border color 1: rgb(0, 0, 0)
+##border color 2: rgb(0, 0, 0)
variation:
name: watermark
border radius: 0.10
@@ -278,3 +408,7 @@ default set style:
choice images:
English: /magic.mse-game/icons/language-en.png
Français: /magic.mse-game/icons/language-fr.png
+ Português_do_Brasil: /magic.mse-game/icons/language-br.png
+ mana symbol options:
+ render style: checklist
+ direction: vertical
diff --git a/data/magic.mse-game/statistics b/data/magic.mse-game/statistics
index d849c29f..fbed7225 100644
--- a/data/magic.mse-game/statistics
+++ b/data/magic.mse-game/statistics
@@ -193,7 +193,7 @@ statistics dimension:
statistics dimension:
name: text length (words)
position hint: 100
- script: if is_mainframe() and is_walker() then word_count(to_text(card.mainframe_rule_text)) else word_count(to_text(card.rule_text))
+ script: if a_saga() or mainframe_walker() then word_count(to_text(card.level_1_text))+word_count(to_text(card.level_2_text))+word_count(to_text(card.level_3_text))+word_count(to_text(card.level_4_text)) else word_count(to_text(card.rule_text))
numeric: true
bin size: 5
icon: stats/text_length.png
@@ -201,7 +201,7 @@ statistics dimension:
statistics dimension:
name: text length (lines)
position hint: 101
- script: if is_mainframe() and is_walker() then line_count(to_text(card.mainframe_rule_text)) else line_count(to_text(card.rule_text))
+ script: if a_saga() or mainframe_walker() then line_count(to_text(card.level_1_text))+line_count(to_text(card.level_2_text))+line_count(to_text(card.level_3_text))+line_count(to_text(card.level_4_text)) else line_count(to_text(card.rule_text))
numeric: true
icon: stats/text_length.png
diff --git a/data/magic.mse-game/word_lists b/data/magic.mse-game/word_lists
index 0d6c45fa..70fdd34f 100644
--- a/data/magic.mse-game/word_lists
+++ b/data/magic.mse-game/word_lists
@@ -1,10 +1,6 @@
############################################################## Magic word lists
-word list:
- name:
- word:
-
word list:
name: type
word:
@@ -14,10 +10,13 @@ word list:
name: Legendary
is prefix: true
word:
- name: Tribal
+ name: Snow
is prefix: true
word:
- name: Snow
+ name: Token
+ is prefix: true
+ word:
+ name: Tribal
is prefix: true
word:
name: World
@@ -28,10 +27,14 @@ word list:
word: Artifact
word: Artifact Creature
word: Enchantment
+ word: Enchantment Creature
word: Instant
word: Sorcery
word: Land
word: Planeswalker
+ word: Emblem
+ word: Phenomenon
+ word: Plane
word list:
name: race
@@ -64,6 +67,7 @@ word list:
word: Atog
word: Aurochs
word: Avatar
+ word: Azra
word:
name: B
word: Badger
@@ -72,6 +76,7 @@ word list:
word: Bear
word: Beast
word: Beeble
+ word: Beholder
word: Bird
word: Blinkmoth
word: Boar
@@ -95,6 +100,7 @@ word list:
word:
name: D
word: Dauthi
+ word: Demigod
word: Demon
word: Devil
word: Dinosaur
@@ -107,6 +113,7 @@ word list:
word: Dwarf
word:
name: E
+ word: Egg
word: Efreet
word: Eldrazi
word: Elemental
@@ -120,6 +127,7 @@ word list:
word: Ferret
word: Fish
word: Fox
+ word: Fractal
word: Frog
word: Fungus
word:
@@ -127,6 +135,7 @@ word list:
word: Gargoyle
word: Germ
word: Giant
+ word: Gnoll
word: Gnome
word: Goat
word: Goblin
@@ -139,6 +148,8 @@ word list:
word:
name: H
word: Hag
+ word: Halfling
+ word: Hamster
word: Harpy
word: Hellion
word: Hippo
@@ -156,6 +167,7 @@ word list:
word: Illusion
word: Imp
word: Incarnation
+ word: Inkling
word: Insect
word:
name: J
@@ -190,6 +202,7 @@ word list:
word: Mongoose
word: Monkey
word: Moonfolk
+ word: Mouse
word: Mutant
word: Myr
word:
@@ -209,11 +222,13 @@ word list:
word: Orb
word: Orc
word: Orgg
+ word: Otter
word: Ouphe
word: Ox
word: Oyster
word:
name: P
+ word: Pangolin
word: Pegasus
word: Pentavite
word: Pest
@@ -240,10 +255,12 @@ word list:
word: Satyr
word: Scarecrow
word: Scorpion
+ word: Sculpture
word: Serpent
word: Servo
word: Shade
word: Shapeshifter
+ word: Shark
word: Sheep
word: Siren
word: Skeleton
@@ -268,10 +285,12 @@ word list:
word: Surrakar
word:
name: T
+ word: Tentacle
word: Tetravite
word: Thalakos
word: Thopter
word: Thrull
+ word: Tiefling
word: Treefolk
word: Trilobite
word: Triskelavite
@@ -329,9 +348,11 @@ word list:
word: Ally
word: Archer
word: Archon
+ word: Army
word: Artificer
word: Assassin
word: Barbarian
+ word: Bard
word: Beast
word: Berserker
word: Bringer
@@ -345,6 +366,7 @@ word list:
word: Dreadnought
word: Drone
word: Druid
+ word: Egg
word: Elder
word: Flagbearer
word: Horror
@@ -361,12 +383,15 @@ word list:
word: Mutant
word: Mystic
word: Ninja
+ word: Noble
word: Nomad
+ word: Peasant
word: Pilot
word: Pirate
word: Processor
word:
name: R-S
+ word: Ranger
word: Rebel
word: Reflection
word: Rigger
@@ -386,6 +411,7 @@ word list:
name: T-Z
word: Thopter
word: Vampire
+ word: Warlock
word: Warrior
word: Werewolf
word: Wizard
@@ -397,8 +423,13 @@ word list:
script: all_sub_types(match: "Artifact")
line below: true
word: Contraption
+ word: Clue
word: Equipment
+ word: Food
word: Fortification
+ word: Gold
+ word: Treasure
+ word: Vehicle
word list:
name: land
@@ -411,6 +442,7 @@ word list:
word: Mountain
word: Forest
word: Desert
+ word: Gate
word: Lair
word: Locus
word: Mine
@@ -435,7 +467,9 @@ word list:
script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery")
line below: true
word: Arcane
+ word: Lesson
word: Trap
+ word: Adventure
word list:
name: planeswalker
@@ -443,89 +477,243 @@ word list:
script: all_sub_types(match: "Planeswalker")
line below: true
word: Ajani
+ word: Aminatou
word: Angrath
word: Arlinn
word: Ashiok
word: Bolas
+ word: Calix
word: Chandra
word: Dack
+ word: Dakkon
word: Daretti
+ word: Davriel
+ word: Dihada
word: Domri
word: Dovin
+ word: Ellywick
word: Elspeth
- word: Freylaise
+ word: Estrid
+ word: Freyalise
word: Garruk
word: Gideon
+ word: Grist
word: Huatli
word: Jace
+ word: Jaya
word: Karn
+ word: Kasmina
+ word: Kaya
word: Kiora
word: Koth
word: Liliana
+ word: Lolth
+ word: Lukka
+ word: Mordenkainen
word: Nahiri
word: Narset
+ word: Niko
word: Nissa
word: Nixilis
+ word: Oko
word: Ral
+ word: Rowan
word: Saheeli
word: Samut
word: Sarkhan
+ word: Serra
word: Sorin
word: Tamiyo
word: Teferi
+ word: Teyo
word: Tezzeret
word: Tibalt
+ word: Tyvar
word: Ugin
word: Venser
+ word: Vivien
word: Vraska
+ word: Will
+ word: Windgrace
+ word: Wrenn
word: Xenagos
+ word: Yanggu
+ word: Yanling
+ word: Zariel
+ word:
+ name: Last Seen on Faerun
+ word: Ellywick
+ word: Lolth
+ word: Mordenkainen
+ word: Zariel
+ word:
+ name: Last Seen on Strixhaven
+ word: Kasmina
+ word: Liliana
+ word: Lukka
+ word: Rowan
+ word: Will
+ word:
+ name: Last Seen on Kaldheim
+ word: Kaya
+ word: Niko
+ word: Tibalt
+ word: Tyvar
+ word:
+ name: Last Seen on Zendikar
+ word: Jace
+ word: Kiora
+ word: Nahiri
+ word: Nissa
+ word: Nixilis
+ word:
+ name: Last Seen on Ikoria
+ word: Narset
+ word: Vivien
+ word:
+ name: Last Seen on Theros
+ word: Ashiok
+ word: Calix
+ word: Elspeth
+ word: Xenagos
+ word:
+ name: Last Seen on Eldraine
+ word: Garruk
+ word: Oko
+ word:
+ name: Last Seen on Ravnica
+ word: Bolas
+ word: Gideon
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Ral
+ word: Teyo
+ word: Vraska
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Dominaria
+ word: Chandra
+ word: Jaya
+ word: Karn
+ word: Teferi
word:
name: Last Seen on Ixalan
word: Angrath
word: Huatli
- word: Jace
- word: Vraska
word:
name: Last Seen on Amonkhet
- word: Bolas
- word: Gideon
word: Liliana
- word: Nissa
word: Samut
word:
name: Last Seen on Kaladesh
word: Ajani
- word: Chandra
- word: Dovin
word: Saheeli
word: Tezzeret
+ word:
+ name: Last Seen on Fiore
+ name: Dack
+ name: Daretti
word:
name: Last Seen on Innistrad
word: Arlinn
- word: Nahiri
word: Sorin
word: Tamiyo
- word: Tibalt
- word:
- name: Last Seen on Zendikar
- word: Kiora
- word: Nixilis
word:
name: Last Seen on Tarkir
- word: Narset
word: Sarkhan
word: Ugin
- word:
- name: Last Seen on Theros
- word: Ashiok
- word: Elspeth
- word: Xenagos
- word:
- name: Last Seen on Ravnica
- word: Domri
- word: Ral
word:
name: Last Seen on New Phyrexia
- word: Karn
word: Koth
- word: Venser
\ No newline at end of file
+ word: Venser
+ word:
+ name: Last Seen on ???
+ word: Aminatou
+ word: Estrid
+ word: Wrenn
+ word: Last Seen Pre-Mending
+ word: Freyalise
+ word: Serra
+ word: Windgrace
+
+word list:
+ name: plane
+ word:
+ script: all_sub_types(match: "Plane")
+ line below: true
+ word: Eldraine
+ word: Dominaria
+ word: Ixalan
+ word: Amonkhet
+ word: Kaladesh
+ word:
+ name: Post-Mending Planes
+ word: Alara
+ word: Amonkhet
+ word: Eldraine
+ word: Fiora
+ word: Innistrad
+ word: Ixalan
+ word: Kaladesh
+ word: Kylem
+ word: Lorwyn
+ word: New Phyrexia
+ word: Shadowmoor
+ word: Tarkir
+ word: Theros
+ word: Zendikar
+ word:
+ name: Pre-Mending Planes
+ word: Kamigawa
+ word: Mercadia
+ word: Mirrodin
+ word: Rath
+ word: Ravnica
+ word: Serra's Realm
+ word:
+ name: Old Planes
+ word: Aranzhur
+ word: Azoria
+ word: Bolas's Meditation Realm
+ word: Cabralin
+ word: Cridhe
+ word: Dominaria
+ word: Equilor
+ word: Ergamon
+ word: Gastal
+ word: Ilcae
+ word: Moag
+ word: Nether Void
+ word: Phyrexia
+ word: Pyrulea
+ word: Rabiah
+ word: Segovia
+ word: Shandalar
+ word: Ulgrotha
+ word: Vatraquaz
+ word: Wildfire
+ word:
+ name: Planechase Planes
+ word: Arkhos
+ word: Azgol
+ word: Belenon
+ word: Diraden
+ word: Fabacin
+ word: Iquatana
+ word: Ir
+ word: Kaldheim
+ word: Karsus
+ word: Kephalai
+ word: Kinshala
+ word: Kolbahan
+ word: Kyneth
+ word: Luvion
+ word: Mongseng
+ word: Muraganda
+ word: Regatha
+ word: Tavelia
+ word: Valla
+ word: Vryn
+ word: Xerex
\ No newline at end of file
diff --git a/data/magic.mse-game/word_lists_it b/data/magic.mse-game/word_lists_it
new file mode 100644
index 00000000..43f1971f
--- /dev/null
+++ b/data/magic.mse-game/word_lists_it
@@ -0,0 +1,687 @@
+
+############################################################## Magic word lists
+
+word list:
+ name: type
+ word:
+ name: Basic
+ is prefix: true
+ word:
+ name: Legendary
+ is prefix: true
+ word:
+ name: Snow
+ is prefix: true
+ word:
+ name: Token
+ is prefix: true
+ word:
+ name: Tribal
+ is prefix: true
+ word:
+ name: World
+ is prefix: true
+ line below: true
+ word: Conspiracy
+ word: Creature
+ word: Artifact
+ word: Artifact Creature
+ word: Enchantment
+ word: Enchantment Creature
+ word: Instant
+ word: Sorcery
+ word: Land
+ word: Planeswalker
+ word: Emblem
+ word: Phenomenon
+ word: Plane
+
+word list:
+ name: race
+ word:
+ script: all_races()
+ line below: true
+ word: Angel
+ word: Beast
+ word: Construct
+ word: Demon
+ word: Dragon
+ word: Elf
+ word: Faerie
+ word: Giant
+ word: Goblin
+ word: Golem
+ word: Human
+ word: Merfolk
+ word: Zombie
+ word:
+ name: All Races
+ word:
+ name: A
+ word: Aetherborn
+ word: Angel
+ word: Antelope
+ word: Ape
+ word: Archon
+ word: Assembly-Worker
+ word: Atog
+ word: Aurochs
+ word: Avatar
+ word: Azra
+ word:
+ name: B
+ word: Badger
+ word: Basilisk
+ word: Bat
+ word: Bear
+ word: Beast
+ word: Beeble
+ word: Bird
+ word: Blinkmoth
+ word: Boar
+ word: Bringer
+ word: Brushwagg
+ word:
+ name: C
+ word: Camarid
+ word: Camel
+ word: Caribou
+ word: Carrier
+ word: Cat
+ word: Centaur
+ word: Cephalid
+ word: Chimera
+ word: Cockatrice
+ word: Construct
+ word: Crab
+ word: Crocodile
+ word: Cyclops
+ word:
+ name: D
+ word: Dauthi
+ word: Demigod
+ word: Demon
+ word: Devil
+ word: Dinosaur
+ word: Djinn
+ word: Dragon
+ word: Drake
+ word: Dreadnought
+ word: Drone
+ word: Dryad
+ word: Dwarf
+ word:
+ name: E
+ word: Egg
+ word: Efreet
+ word: Eldrazi
+ word: Elemental
+ word: Elephant
+ word: Elf
+ word: Elk
+ word: Eye
+ word:
+ name: F
+ word: Faerie
+ word: Ferret
+ word: Fish
+ word: Fox
+ word: Frog
+ word: Fungus
+ word:
+ name: G
+ word: Gargoyle
+ word: Germ
+ word: Giant
+ word: Gnome
+ word: Goat
+ word: Goblin
+ word: God
+ word: Golem
+ word: Gorgon
+ word: Graveborn
+ word: Gremlin
+ word: Griffin
+ word:
+ name: H
+ word: Hag
+ word: Harpy
+ word: Hellion
+ word: Hippo
+ word: Hippogriff
+ word: Homarid
+ word: Homunculus
+ word: Horror
+ word: Horse
+ word: Hound
+ word: Human
+ word: Hydra
+ word: Hyena
+ word:
+ name: I
+ word: Illusion
+ word: Imp
+ word: Incarnation
+ word: Insect
+ word:
+ name: J
+ word: Jackal
+ word: Jellyfish
+ word: Juggernaut
+ word:
+ name: K
+ word: Kavu
+ word: Kirin
+ word: Kithkin
+ word: Kobold
+ word: Kor
+ word: Kraken
+ word:
+ name: L
+ word: Lamia
+ word: Lammasu
+ word: Leech
+ word: Leviathan
+ word: Lhurgoyf
+ word: Licid
+ word: Lizard
+ word:
+ name: M
+ word: Manticore
+ word: Masticore
+ word: Merfolk
+ word: Metathran
+ word: Minotaur
+ word: Mole
+ word: Mongoose
+ word: Monkey
+ word: Moonfolk
+ word: Mouse
+ word: Mutant
+ word: Myr
+ word:
+ name: N
+ word: Naga
+ word: Nautilus
+ word: Nephilim
+ word: Nightmare
+ word: Nightstalker
+ word: Noggle
+ word: Nymph
+ word:
+ name: O
+ word: Octopus
+ word: Ogre
+ word: Ooze
+ word: Orb
+ word: Orc
+ word: Orgg
+ word: Otter
+ word: Ouphe
+ word: Ox
+ word: Oyster
+ word:
+ name: P
+ word: Pangolin
+ word: Pegasus
+ word: Pentavite
+ word: Pest
+ word: Phelddagrif
+ word: Phoenix
+ word: Pincher
+ word: Plant
+ word: Praetor
+ word: Prism
+ word:
+ name: R
+ word: Rabbit
+ word: Rat
+ word: Reflection
+ word: Rhino
+ word:
+ name: S
+ word:
+ name: Sa-Sl
+ word: Sable
+ word: Salamander
+ word: Sand
+ word: Saproling
+ word: Satyr
+ word: Scarecrow
+ word: Scorpion
+ word: Sculpture
+ word: Serpent
+ word: Servo
+ word: Shade
+ word: Shapeshifter
+ word: Shark
+ word: Sheep
+ word: Siren
+ word: Skeleton
+ word: Slith
+ word: Sliver
+ word: Slug
+ word:
+ name: Sn-Sz
+ word: Snake
+ word: Soltari
+ word: Spawn
+ word: Specter
+ word: Sphinx
+ word: Spider
+ word: Spike
+ word: Spirit
+ word: Splinter
+ word: Sponge
+ word: Squid
+ word: Squirrel
+ word: Starfish
+ word: Surrakar
+ word:
+ name: T
+ word: Tentacle
+ word: Tetravite
+ word: Thalakos
+ word: Thopter
+ word: Thrull
+ word: Treefolk
+ word: Trilobite
+ word: Triskelavite
+ word: Troll
+ word: Turtle
+ word:
+ name: U
+ word: Unicorn
+ word:
+ name: V
+ word: Vampire
+ word: Vedalken
+ word: Viashino
+ word: Volver
+ word:
+ name: W
+ word: Wall
+ word: Weird
+ word: Werewolf
+ word: Whale
+ word: Wolf
+ word: Wolverine
+ word: Wombat
+ word: Worm
+ word: Wraith
+ word: Wurm
+ word:
+ name: Y
+ word: Yeti
+ word:
+ name: Z
+ word: Zombie
+ word: Zubera
+
+word list:
+ name: class
+ word:
+ script: all_classes()
+ line below: true
+ word: Beast
+ word: Cleric
+ word: Druid
+ word: Knight
+ word: Rogue
+ word: Shaman
+ word: Soldier
+ word: Warrior
+ word: Wizard
+ word: Zombie
+ word:
+ name: All Classes
+ word:
+ name: A-C
+ word: Advisor
+ word: Ally
+ word: Archer
+ word: Archon
+ word: Army
+ word: Artificer
+ word: Assassin
+ word: Barbarian
+ word: Beast
+ word: Berserker
+ word: Bringer
+ word: Carrier
+ word: Citizen
+ word: Cleric
+ word: Coward
+ word:
+ name: D-I
+ word: Deserter
+ word: Dreadnought
+ word: Drone
+ word: Druid
+ word: Egg
+ word: Elder
+ word: Flagbearer
+ word: Horror
+ word: Incarnation
+ word:
+ name: J-P
+ word: Juggernaut
+ word: Knight
+ word: Leviathan
+ word: Mercenary
+ word: Minion
+ word: Monger
+ word: Monk
+ word: Mutant
+ word: Mystic
+ word: Ninja
+ word: Noble
+ word: Nomad
+ word: Peasant
+ word: Pilot
+ word: Pirate
+ word: Processor
+ word:
+ name: R-S
+ word: Rebel
+ word: Reflection
+ word: Rigger
+ word: Rogue
+ word: Samurai
+ word: Scion
+ word: Scout
+ word: Serf
+ word: Shaman
+ word: Skeleton
+ word: Soldier
+ word: Spawn
+ word: Spellshaper
+ word: Spirit
+ word: Survivor
+ word:
+ name: T-Z
+ word: Thopter
+ word: Vampire
+ word: Warlock
+ word: Warrior
+ word: Werewolf
+ word: Wizard
+ word: Zombie
+
+word list:
+ name: artifact
+ word:
+ script: all_sub_types(match: "Artifact")
+ line below: true
+ word: Contraption
+ word: Clue
+ word: Equipment
+ word: Food
+ word: Fortification
+ word: Gold
+ word: Treasure
+ word: Vehicle
+
+word list:
+ name: land
+ word:
+ script: all_sub_types(match: "Land")
+ line below: true
+ word: Plains
+ word: Island
+ word: Swamp
+ word: Mountain
+ word: Forest
+ word: Desert
+ word: Gate
+ word: Lair
+ word: Locus
+ word: Mine
+ word: Power-Plant
+ word: Tower
+ word: Urza's
+
+word list:
+ name: enchantment
+ word:
+ script: all_sub_types(match: "Enchantment")
+ line below: true
+ word: Aura
+ word: Curse
+ word: Shrine
+ word: Cartouche
+ word: Saga
+
+word list:
+ name: spell
+ word:
+ script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery")
+ line below: true
+ word: Arcane
+ word: Trap
+ word: Adventure
+
+word list:
+ name: planeswalker
+ word:
+ script: all_sub_types(match: "Planeswalker")
+ line below: true
+ word: Ajani
+ word: Aminatou
+ word: Angrath
+ word: Arlinn
+ word: Ashiok
+ word: Bolas
+ word: Calix
+ word: Chandra
+ word: Dack
+ word: Daretti
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Elspeth
+ word: Estrid
+ word: Freyalise
+ word: Garruk
+ word: Gideon
+ word: Huatli
+ word: Jace
+ word: Jaya
+ word: Karn
+ word: Kasmina
+ word: Kaya
+ word: Kiora
+ word: Koth
+ word: Liliana
+ word: Lukka
+ word: Nahiri
+ word: Narset
+ word: Nissa
+ word: Nixilis
+ word: Oko
+ word: Ral
+ word: Rowan
+ word: Saheeli
+ word: Samut
+ word: Sarkhan
+ word: Serra
+ word: Sorin
+ word: Tamiyo
+ word: Teferi
+ word: Teyo
+ word: Tezzeret
+ word: Tibalt
+ word: Ugin
+ word: Venser
+ word: Vivien
+ word: Vraska
+ word: Will
+ word: Windgrace
+ word: Wrenn
+ word: Xenagos
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Ikoria
+ word: Lukka
+ word: Narset
+ word: Vivien
+ word:
+ name: Last Seen on Theros
+ word: Ashiok
+ word: Calix
+ word: Elspeth
+ word: Xenagos
+ word:
+ name: Last Seen on Eldraine
+ word: Garruk
+ word: Oko
+ word: Rowan
+ word: Will
+ word:
+ name: Last Seen on Ravnica
+ word: Bolas
+ word: Gideon
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Kasmina
+ word: Kaya
+ word: Ral
+ word: Teyo
+ word: Vraska
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Dominaria
+ word: Chandra
+ word: Jaya
+ word: Karn
+ word: Teferi
+ word:
+ name: Last Seen on Ixalan
+ word: Angrath
+ word: Huatli
+ word: Jace
+ word:
+ name: Last Seen on Amonkhet
+ word: Liliana
+ word: Nissa
+ word: Samut
+ word:
+ name: Last Seen on Kaladesh
+ word: Ajani
+ word: Saheeli
+ word: Tezzeret
+ word:
+ name: Last Seen on Fiore
+ name: Dack
+ name: Daretti
+ word:
+ name: Last Seen on Innistrad
+ word: Arlinn
+ word: Nahiri
+ word: Sorin
+ word: Tamiyo
+ word: Tibalt
+ word:
+ name: Last Seen on Zendikar
+ word: Kiora
+ word: Nixilis
+ word:
+ name: Last Seen on Tarkir
+ word: Sarkhan
+ word: Ugin
+ word:
+ name: Last Seen on New Phyrexia
+ word: Koth
+ word: Venser
+ word:
+ name: Last Seen on ???
+ word: Aminatou
+ word: Estrid
+ word: Wrenn
+ word: Last Seen Pre-Mending
+ word: Freyalise
+ word: Serra
+ word: Windgrace
+
+word list:
+ name: plane
+ word:
+ script: all_sub_types(match: "Plane")
+ line below: true
+ word: Eldraine
+ word: Dominaria
+ word: Ixalan
+ word: Amonkhet
+ word: Kaladesh
+ word:
+ name: Post-Mending Planes
+ word: Alara
+ word: Amonkhet
+ word: Eldraine
+ word: Fiora
+ word: Innistrad
+ word: Ixalan
+ word: Kaladesh
+ word: Kylem
+ word: Lorwyn
+ word: New Phyrexia
+ word: Shadowmoor
+ word: Tarkir
+ word: Theros
+ word: Zendikar
+ word:
+ name: Pre-Mending Planes
+ word: Kamigawa
+ word: Mercadia
+ word: Mirrodin
+ word: Rath
+ word: Ravnica
+ word: Serra's Realm
+ word:
+ name: Old Planes
+ word: Aranzhur
+ word: Azoria
+ word: Bolas's Meditation Realm
+ word: Cabralin
+ word: Cridhe
+ word: Dominaria
+ word: Equilor
+ word: Ergamon
+ word: Gastal
+ word: Ilcae
+ word: Moag
+ word: Nether Void
+ word: Phyrexia
+ word: Pyrulea
+ word: Rabiah
+ word: Segovia
+ word: Shandalar
+ word: Ulgrotha
+ word: Vatraquaz
+ word: Wildfire
+ word:
+ name: Planechase Planes
+ word: Arkhos
+ word: Azgol
+ word: Belenon
+ word: Diraden
+ word: Fabacin
+ word: Iquatana
+ word: Ir
+ word: Kaldheim
+ word: Karsus
+ word: Kephalai
+ word: Kinshala
+ word: Kolbahan
+ word: Kyneth
+ word: Luvion
+ word: Mongseng
+ word: Muraganda
+ word: Regatha
+ word: Tavelia
+ word: Valla
+ word: Vryn
+ word: Xerex
\ No newline at end of file
diff --git a/data/magic.mse-game/word_lists_it.txt b/data/magic.mse-game/word_lists_it.txt
new file mode 100644
index 00000000..43f1971f
--- /dev/null
+++ b/data/magic.mse-game/word_lists_it.txt
@@ -0,0 +1,687 @@
+
+############################################################## Magic word lists
+
+word list:
+ name: type
+ word:
+ name: Basic
+ is prefix: true
+ word:
+ name: Legendary
+ is prefix: true
+ word:
+ name: Snow
+ is prefix: true
+ word:
+ name: Token
+ is prefix: true
+ word:
+ name: Tribal
+ is prefix: true
+ word:
+ name: World
+ is prefix: true
+ line below: true
+ word: Conspiracy
+ word: Creature
+ word: Artifact
+ word: Artifact Creature
+ word: Enchantment
+ word: Enchantment Creature
+ word: Instant
+ word: Sorcery
+ word: Land
+ word: Planeswalker
+ word: Emblem
+ word: Phenomenon
+ word: Plane
+
+word list:
+ name: race
+ word:
+ script: all_races()
+ line below: true
+ word: Angel
+ word: Beast
+ word: Construct
+ word: Demon
+ word: Dragon
+ word: Elf
+ word: Faerie
+ word: Giant
+ word: Goblin
+ word: Golem
+ word: Human
+ word: Merfolk
+ word: Zombie
+ word:
+ name: All Races
+ word:
+ name: A
+ word: Aetherborn
+ word: Angel
+ word: Antelope
+ word: Ape
+ word: Archon
+ word: Assembly-Worker
+ word: Atog
+ word: Aurochs
+ word: Avatar
+ word: Azra
+ word:
+ name: B
+ word: Badger
+ word: Basilisk
+ word: Bat
+ word: Bear
+ word: Beast
+ word: Beeble
+ word: Bird
+ word: Blinkmoth
+ word: Boar
+ word: Bringer
+ word: Brushwagg
+ word:
+ name: C
+ word: Camarid
+ word: Camel
+ word: Caribou
+ word: Carrier
+ word: Cat
+ word: Centaur
+ word: Cephalid
+ word: Chimera
+ word: Cockatrice
+ word: Construct
+ word: Crab
+ word: Crocodile
+ word: Cyclops
+ word:
+ name: D
+ word: Dauthi
+ word: Demigod
+ word: Demon
+ word: Devil
+ word: Dinosaur
+ word: Djinn
+ word: Dragon
+ word: Drake
+ word: Dreadnought
+ word: Drone
+ word: Dryad
+ word: Dwarf
+ word:
+ name: E
+ word: Egg
+ word: Efreet
+ word: Eldrazi
+ word: Elemental
+ word: Elephant
+ word: Elf
+ word: Elk
+ word: Eye
+ word:
+ name: F
+ word: Faerie
+ word: Ferret
+ word: Fish
+ word: Fox
+ word: Frog
+ word: Fungus
+ word:
+ name: G
+ word: Gargoyle
+ word: Germ
+ word: Giant
+ word: Gnome
+ word: Goat
+ word: Goblin
+ word: God
+ word: Golem
+ word: Gorgon
+ word: Graveborn
+ word: Gremlin
+ word: Griffin
+ word:
+ name: H
+ word: Hag
+ word: Harpy
+ word: Hellion
+ word: Hippo
+ word: Hippogriff
+ word: Homarid
+ word: Homunculus
+ word: Horror
+ word: Horse
+ word: Hound
+ word: Human
+ word: Hydra
+ word: Hyena
+ word:
+ name: I
+ word: Illusion
+ word: Imp
+ word: Incarnation
+ word: Insect
+ word:
+ name: J
+ word: Jackal
+ word: Jellyfish
+ word: Juggernaut
+ word:
+ name: K
+ word: Kavu
+ word: Kirin
+ word: Kithkin
+ word: Kobold
+ word: Kor
+ word: Kraken
+ word:
+ name: L
+ word: Lamia
+ word: Lammasu
+ word: Leech
+ word: Leviathan
+ word: Lhurgoyf
+ word: Licid
+ word: Lizard
+ word:
+ name: M
+ word: Manticore
+ word: Masticore
+ word: Merfolk
+ word: Metathran
+ word: Minotaur
+ word: Mole
+ word: Mongoose
+ word: Monkey
+ word: Moonfolk
+ word: Mouse
+ word: Mutant
+ word: Myr
+ word:
+ name: N
+ word: Naga
+ word: Nautilus
+ word: Nephilim
+ word: Nightmare
+ word: Nightstalker
+ word: Noggle
+ word: Nymph
+ word:
+ name: O
+ word: Octopus
+ word: Ogre
+ word: Ooze
+ word: Orb
+ word: Orc
+ word: Orgg
+ word: Otter
+ word: Ouphe
+ word: Ox
+ word: Oyster
+ word:
+ name: P
+ word: Pangolin
+ word: Pegasus
+ word: Pentavite
+ word: Pest
+ word: Phelddagrif
+ word: Phoenix
+ word: Pincher
+ word: Plant
+ word: Praetor
+ word: Prism
+ word:
+ name: R
+ word: Rabbit
+ word: Rat
+ word: Reflection
+ word: Rhino
+ word:
+ name: S
+ word:
+ name: Sa-Sl
+ word: Sable
+ word: Salamander
+ word: Sand
+ word: Saproling
+ word: Satyr
+ word: Scarecrow
+ word: Scorpion
+ word: Sculpture
+ word: Serpent
+ word: Servo
+ word: Shade
+ word: Shapeshifter
+ word: Shark
+ word: Sheep
+ word: Siren
+ word: Skeleton
+ word: Slith
+ word: Sliver
+ word: Slug
+ word:
+ name: Sn-Sz
+ word: Snake
+ word: Soltari
+ word: Spawn
+ word: Specter
+ word: Sphinx
+ word: Spider
+ word: Spike
+ word: Spirit
+ word: Splinter
+ word: Sponge
+ word: Squid
+ word: Squirrel
+ word: Starfish
+ word: Surrakar
+ word:
+ name: T
+ word: Tentacle
+ word: Tetravite
+ word: Thalakos
+ word: Thopter
+ word: Thrull
+ word: Treefolk
+ word: Trilobite
+ word: Triskelavite
+ word: Troll
+ word: Turtle
+ word:
+ name: U
+ word: Unicorn
+ word:
+ name: V
+ word: Vampire
+ word: Vedalken
+ word: Viashino
+ word: Volver
+ word:
+ name: W
+ word: Wall
+ word: Weird
+ word: Werewolf
+ word: Whale
+ word: Wolf
+ word: Wolverine
+ word: Wombat
+ word: Worm
+ word: Wraith
+ word: Wurm
+ word:
+ name: Y
+ word: Yeti
+ word:
+ name: Z
+ word: Zombie
+ word: Zubera
+
+word list:
+ name: class
+ word:
+ script: all_classes()
+ line below: true
+ word: Beast
+ word: Cleric
+ word: Druid
+ word: Knight
+ word: Rogue
+ word: Shaman
+ word: Soldier
+ word: Warrior
+ word: Wizard
+ word: Zombie
+ word:
+ name: All Classes
+ word:
+ name: A-C
+ word: Advisor
+ word: Ally
+ word: Archer
+ word: Archon
+ word: Army
+ word: Artificer
+ word: Assassin
+ word: Barbarian
+ word: Beast
+ word: Berserker
+ word: Bringer
+ word: Carrier
+ word: Citizen
+ word: Cleric
+ word: Coward
+ word:
+ name: D-I
+ word: Deserter
+ word: Dreadnought
+ word: Drone
+ word: Druid
+ word: Egg
+ word: Elder
+ word: Flagbearer
+ word: Horror
+ word: Incarnation
+ word:
+ name: J-P
+ word: Juggernaut
+ word: Knight
+ word: Leviathan
+ word: Mercenary
+ word: Minion
+ word: Monger
+ word: Monk
+ word: Mutant
+ word: Mystic
+ word: Ninja
+ word: Noble
+ word: Nomad
+ word: Peasant
+ word: Pilot
+ word: Pirate
+ word: Processor
+ word:
+ name: R-S
+ word: Rebel
+ word: Reflection
+ word: Rigger
+ word: Rogue
+ word: Samurai
+ word: Scion
+ word: Scout
+ word: Serf
+ word: Shaman
+ word: Skeleton
+ word: Soldier
+ word: Spawn
+ word: Spellshaper
+ word: Spirit
+ word: Survivor
+ word:
+ name: T-Z
+ word: Thopter
+ word: Vampire
+ word: Warlock
+ word: Warrior
+ word: Werewolf
+ word: Wizard
+ word: Zombie
+
+word list:
+ name: artifact
+ word:
+ script: all_sub_types(match: "Artifact")
+ line below: true
+ word: Contraption
+ word: Clue
+ word: Equipment
+ word: Food
+ word: Fortification
+ word: Gold
+ word: Treasure
+ word: Vehicle
+
+word list:
+ name: land
+ word:
+ script: all_sub_types(match: "Land")
+ line below: true
+ word: Plains
+ word: Island
+ word: Swamp
+ word: Mountain
+ word: Forest
+ word: Desert
+ word: Gate
+ word: Lair
+ word: Locus
+ word: Mine
+ word: Power-Plant
+ word: Tower
+ word: Urza's
+
+word list:
+ name: enchantment
+ word:
+ script: all_sub_types(match: "Enchantment")
+ line below: true
+ word: Aura
+ word: Curse
+ word: Shrine
+ word: Cartouche
+ word: Saga
+
+word list:
+ name: spell
+ word:
+ script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery")
+ line below: true
+ word: Arcane
+ word: Trap
+ word: Adventure
+
+word list:
+ name: planeswalker
+ word:
+ script: all_sub_types(match: "Planeswalker")
+ line below: true
+ word: Ajani
+ word: Aminatou
+ word: Angrath
+ word: Arlinn
+ word: Ashiok
+ word: Bolas
+ word: Calix
+ word: Chandra
+ word: Dack
+ word: Daretti
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Elspeth
+ word: Estrid
+ word: Freyalise
+ word: Garruk
+ word: Gideon
+ word: Huatli
+ word: Jace
+ word: Jaya
+ word: Karn
+ word: Kasmina
+ word: Kaya
+ word: Kiora
+ word: Koth
+ word: Liliana
+ word: Lukka
+ word: Nahiri
+ word: Narset
+ word: Nissa
+ word: Nixilis
+ word: Oko
+ word: Ral
+ word: Rowan
+ word: Saheeli
+ word: Samut
+ word: Sarkhan
+ word: Serra
+ word: Sorin
+ word: Tamiyo
+ word: Teferi
+ word: Teyo
+ word: Tezzeret
+ word: Tibalt
+ word: Ugin
+ word: Venser
+ word: Vivien
+ word: Vraska
+ word: Will
+ word: Windgrace
+ word: Wrenn
+ word: Xenagos
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Ikoria
+ word: Lukka
+ word: Narset
+ word: Vivien
+ word:
+ name: Last Seen on Theros
+ word: Ashiok
+ word: Calix
+ word: Elspeth
+ word: Xenagos
+ word:
+ name: Last Seen on Eldraine
+ word: Garruk
+ word: Oko
+ word: Rowan
+ word: Will
+ word:
+ name: Last Seen on Ravnica
+ word: Bolas
+ word: Gideon
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Kasmina
+ word: Kaya
+ word: Ral
+ word: Teyo
+ word: Vraska
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Dominaria
+ word: Chandra
+ word: Jaya
+ word: Karn
+ word: Teferi
+ word:
+ name: Last Seen on Ixalan
+ word: Angrath
+ word: Huatli
+ word: Jace
+ word:
+ name: Last Seen on Amonkhet
+ word: Liliana
+ word: Nissa
+ word: Samut
+ word:
+ name: Last Seen on Kaladesh
+ word: Ajani
+ word: Saheeli
+ word: Tezzeret
+ word:
+ name: Last Seen on Fiore
+ name: Dack
+ name: Daretti
+ word:
+ name: Last Seen on Innistrad
+ word: Arlinn
+ word: Nahiri
+ word: Sorin
+ word: Tamiyo
+ word: Tibalt
+ word:
+ name: Last Seen on Zendikar
+ word: Kiora
+ word: Nixilis
+ word:
+ name: Last Seen on Tarkir
+ word: Sarkhan
+ word: Ugin
+ word:
+ name: Last Seen on New Phyrexia
+ word: Koth
+ word: Venser
+ word:
+ name: Last Seen on ???
+ word: Aminatou
+ word: Estrid
+ word: Wrenn
+ word: Last Seen Pre-Mending
+ word: Freyalise
+ word: Serra
+ word: Windgrace
+
+word list:
+ name: plane
+ word:
+ script: all_sub_types(match: "Plane")
+ line below: true
+ word: Eldraine
+ word: Dominaria
+ word: Ixalan
+ word: Amonkhet
+ word: Kaladesh
+ word:
+ name: Post-Mending Planes
+ word: Alara
+ word: Amonkhet
+ word: Eldraine
+ word: Fiora
+ word: Innistrad
+ word: Ixalan
+ word: Kaladesh
+ word: Kylem
+ word: Lorwyn
+ word: New Phyrexia
+ word: Shadowmoor
+ word: Tarkir
+ word: Theros
+ word: Zendikar
+ word:
+ name: Pre-Mending Planes
+ word: Kamigawa
+ word: Mercadia
+ word: Mirrodin
+ word: Rath
+ word: Ravnica
+ word: Serra's Realm
+ word:
+ name: Old Planes
+ word: Aranzhur
+ word: Azoria
+ word: Bolas's Meditation Realm
+ word: Cabralin
+ word: Cridhe
+ word: Dominaria
+ word: Equilor
+ word: Ergamon
+ word: Gastal
+ word: Ilcae
+ word: Moag
+ word: Nether Void
+ word: Phyrexia
+ word: Pyrulea
+ word: Rabiah
+ word: Segovia
+ word: Shandalar
+ word: Ulgrotha
+ word: Vatraquaz
+ word: Wildfire
+ word:
+ name: Planechase Planes
+ word: Arkhos
+ word: Azgol
+ word: Belenon
+ word: Diraden
+ word: Fabacin
+ word: Iquatana
+ word: Ir
+ word: Kaldheim
+ word: Karsus
+ word: Kephalai
+ word: Kinshala
+ word: Kolbahan
+ word: Kyneth
+ word: Luvion
+ word: Mongseng
+ word: Muraganda
+ word: Regatha
+ word: Tavelia
+ word: Valla
+ word: Vryn
+ word: Xerex
\ No newline at end of file
diff --git a/data/magic.mse-game/word_lists_pt b/data/magic.mse-game/word_lists_pt
new file mode 100644
index 00000000..ebb32851
--- /dev/null
+++ b/data/magic.mse-game/word_lists_pt
@@ -0,0 +1,719 @@
+
+############################################################## Magic word lists
+
+word list:
+ name: type
+ word:
+ name: Básico
+ is prefix: true
+ word:
+ name: Lendário
+ is prefix: true
+ word:
+ name: da Neve
+ is prefix: true
+ word:
+ name: Token
+ is prefix: true
+ word:
+ name: Tribal
+ is prefix: true
+ word:
+ name: World
+ is prefix: true
+ line below: true
+ word: Conspiracy
+ word: Criatura
+ word: Artefato
+ word: Criatura Artefato
+ word: Encantamento
+ word: Criatura Encantamento
+ word: Mágica Instantânea
+ word: Feitiço
+ word: Terreno
+ word: Planeswalker
+ word: Emblem
+ word: Phenomenon
+ word: Plane
+
+word list:
+ name: race
+ word:
+ script: all_races()
+ line below: true
+ word: Angel
+ word: Beast
+ word: Construct
+ word: Demon
+ word: Dragon
+ word: Elf
+ word: Faerie
+ word: Giant
+ word: Goblin
+ word: Golem
+ word: Human
+ word: Merfolk
+ word: Zombie
+ word:
+ name: All Races
+ word:
+ name: A
+ word: Aetherborn
+ word: Angel
+ word: Antelope
+ word: Ape
+ word: Archon
+ word: Assembly-Worker
+ word: Atog
+ word: Aurochs
+ word: Avatar
+ word: Azra
+ word:
+ name: B
+ word: Badger
+ word: Basilisk
+ word: Bat
+ word: Bear
+ word: Beast
+ word: Beeble
+ word: Beholder
+ word: Bird
+ word: Blinkmoth
+ word: Boar
+ word: Bringer
+ word: Brushwagg
+ word:
+ name: C
+ word: Camarid
+ word: Camel
+ word: Caribou
+ word: Carrier
+ word: Cat
+ word: Centaur
+ word: Cephalid
+ word: Chimera
+ word: Cockatrice
+ word: Construct
+ word: Crab
+ word: Crocodile
+ word: Cyclops
+ word:
+ name: D
+ word: Dauthi
+ word: Demigod
+ word: Demon
+ word: Devil
+ word: Dinosaur
+ word: Djinn
+ word: Dragon
+ word: Drake
+ word: Dreadnought
+ word: Drone
+ word: Dryad
+ word: Dwarf
+ word:
+ name: E
+ word: Egg
+ word: Efreet
+ word: Eldrazi
+ word: Elemental
+ word: Elephant
+ word: Elf
+ word: Elk
+ word: Eye
+ word:
+ name: F
+ word: Faerie
+ word: Ferret
+ word: Fish
+ word: Fox
+ word: Fractal
+ word: Frog
+ word: Fungus
+ word:
+ name: G
+ word: Gargoyle
+ word: Germ
+ word: Giant
+ word: Gnoll
+ word: Gnome
+ word: Goat
+ word: Goblin
+ word: God
+ word: Golem
+ word: Gorgon
+ word: Graveborn
+ word: Gremlin
+ word: Griffin
+ word:
+ name: H
+ word: Hag
+ word: Halfling
+ word: Hamster
+ word: Harpy
+ word: Hellion
+ word: Hippo
+ word: Hippogriff
+ word: Homarid
+ word: Homunculus
+ word: Horror
+ word: Horse
+ word: Hound
+ word: Human
+ word: Hydra
+ word: Hyena
+ word:
+ name: I
+ word: Illusion
+ word: Imp
+ word: Incarnation
+ word: Inkling
+ word: Insect
+ word:
+ name: J
+ word: Jackal
+ word: Jellyfish
+ word: Juggernaut
+ word:
+ name: K
+ word: Kavu
+ word: Kirin
+ word: Kithkin
+ word: Kobold
+ word: Kor
+ word: Kraken
+ word:
+ name: L
+ word: Lamia
+ word: Lammasu
+ word: Leech
+ word: Leviathan
+ word: Lhurgoyf
+ word: Licid
+ word: Lizard
+ word:
+ name: M
+ word: Manticore
+ word: Masticore
+ word: Merfolk
+ word: Metathran
+ word: Minotaur
+ word: Mole
+ word: Mongoose
+ word: Monkey
+ word: Moonfolk
+ word: Mouse
+ word: Mutant
+ word: Myr
+ word:
+ name: N
+ word: Naga
+ word: Nautilus
+ word: Nephilim
+ word: Nightmare
+ word: Nightstalker
+ word: Noggle
+ word: Nymph
+ word:
+ name: O
+ word: Octopus
+ word: Ogre
+ word: Ooze
+ word: Orb
+ word: Orc
+ word: Orgg
+ word: Otter
+ word: Ouphe
+ word: Ox
+ word: Oyster
+ word:
+ name: P
+ word: Pangolin
+ word: Pegasus
+ word: Pentavite
+ word: Pest
+ word: Phelddagrif
+ word: Phoenix
+ word: Pincher
+ word: Plant
+ word: Praetor
+ word: Prism
+ word:
+ name: R
+ word: Rabbit
+ word: Rat
+ word: Reflection
+ word: Rhino
+ word:
+ name: S
+ word:
+ name: Sa-Sl
+ word: Sable
+ word: Salamander
+ word: Sand
+ word: Saproling
+ word: Satyr
+ word: Scarecrow
+ word: Scorpion
+ word: Sculpture
+ word: Serpent
+ word: Servo
+ word: Shade
+ word: Shapeshifter
+ word: Shark
+ word: Sheep
+ word: Siren
+ word: Skeleton
+ word: Slith
+ word: Sliver
+ word: Slug
+ word:
+ name: Sn-Sz
+ word: Snake
+ word: Soltari
+ word: Spawn
+ word: Specter
+ word: Sphinx
+ word: Spider
+ word: Spike
+ word: Spirit
+ word: Splinter
+ word: Sponge
+ word: Squid
+ word: Squirrel
+ word: Starfish
+ word: Surrakar
+ word:
+ name: T
+ word: Tentacle
+ word: Tetravite
+ word: Thalakos
+ word: Thopter
+ word: Thrull
+ word: Tiefling
+ word: Treefolk
+ word: Trilobite
+ word: Triskelavite
+ word: Troll
+ word: Turtle
+ word:
+ name: U
+ word: Unicorn
+ word:
+ name: V
+ word: Vampire
+ word: Vedalken
+ word: Viashino
+ word: Volver
+ word:
+ name: W
+ word: Wall
+ word: Weird
+ word: Werewolf
+ word: Whale
+ word: Wolf
+ word: Wolverine
+ word: Wombat
+ word: Worm
+ word: Wraith
+ word: Wurm
+ word:
+ name: Y
+ word: Yeti
+ word:
+ name: Z
+ word: Zombie
+ word: Zubera
+
+word list:
+ name: class
+ word:
+ script: all_classes()
+ line below: true
+ word: Beast
+ word: Cleric
+ word: Druid
+ word: Knight
+ word: Rogue
+ word: Shaman
+ word: Soldier
+ word: Warrior
+ word: Wizard
+ word: Zombie
+ word:
+ name: All Classes
+ word:
+ name: A-C
+ word: Advisor
+ word: Ally
+ word: Archer
+ word: Archon
+ word: Army
+ word: Artificer
+ word: Assassin
+ word: Barbarian
+ word: Bard
+ word: Beast
+ word: Berserker
+ word: Bringer
+ word: Carrier
+ word: Citizen
+ word: Cleric
+ word: Coward
+ word:
+ name: D-I
+ word: Deserter
+ word: Dreadnought
+ word: Drone
+ word: Druid
+ word: Egg
+ word: Elder
+ word: Flagbearer
+ word: Horror
+ word: Incarnation
+ word:
+ name: J-P
+ word: Juggernaut
+ word: Knight
+ word: Leviathan
+ word: Mercenary
+ word: Minion
+ word: Monger
+ word: Monk
+ word: Mutant
+ word: Mystic
+ word: Ninja
+ word: Noble
+ word: Nomad
+ word: Peasant
+ word: Pilot
+ word: Pirate
+ word: Processor
+ word:
+ name: R-S
+ word: Ranger
+ word: Rebel
+ word: Reflection
+ word: Rigger
+ word: Rogue
+ word: Samurai
+ word: Scion
+ word: Scout
+ word: Serf
+ word: Shaman
+ word: Skeleton
+ word: Soldier
+ word: Spawn
+ word: Spellshaper
+ word: Spirit
+ word: Survivor
+ word:
+ name: T-Z
+ word: Thopter
+ word: Vampire
+ word: Warlock
+ word: Warrior
+ word: Werewolf
+ word: Wizard
+ word: Zombie
+
+word list:
+ name: artifact
+ word:
+ script: all_sub_types(match: "Artifact")
+ line below: true
+ word: Contraption
+ word: Clue
+ word: Equipment
+ word: Food
+ word: Fortification
+ word: Gold
+ word: Treasure
+ word: Vehicle
+
+word list:
+ name: land
+ word:
+ script: all_sub_types(match: "Land")
+ line below: true
+ word: Plains
+ word: Island
+ word: Swamp
+ word: Mountain
+ word: Forest
+ word: Desert
+ word: Gate
+ word: Lair
+ word: Locus
+ word: Mine
+ word: Power-Plant
+ word: Tower
+ word: Urza's
+
+word list:
+ name: enchantment
+ word:
+ script: all_sub_types(match: "Enchantment")
+ line below: true
+ word: Aura
+ word: Curse
+ word: Shrine
+ word: Cartouche
+ word: Saga
+
+word list:
+ name: spell
+ word:
+ script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery")
+ line below: true
+ word: Arcane
+ word: Lesson
+ word: Trap
+ word: Adventure
+
+word list:
+ name: planeswalker
+ word:
+ script: all_sub_types(match: "Planeswalker")
+ line below: true
+ word: Ajani
+ word: Aminatou
+ word: Angrath
+ word: Arlinn
+ word: Ashiok
+ word: Bolas
+ word: Calix
+ word: Chandra
+ word: Dack
+ word: Dakkon
+ word: Daretti
+ word: Davriel
+ word: Dihada
+ word: Domri
+ word: Dovin
+ word: Ellywick
+ word: Elspeth
+ word: Estrid
+ word: Freyalise
+ word: Garruk
+ word: Gideon
+ word: Grist
+ word: Huatli
+ word: Jace
+ word: Jaya
+ word: Karn
+ word: Kasmina
+ word: Kaya
+ word: Kiora
+ word: Koth
+ word: Liliana
+ word: Lolth
+ word: Lukka
+ word: Mordenkainen
+ word: Nahiri
+ word: Narset
+ word: Niko
+ word: Nissa
+ word: Nixilis
+ word: Oko
+ word: Ral
+ word: Rowan
+ word: Saheeli
+ word: Samut
+ word: Sarkhan
+ word: Serra
+ word: Sorin
+ word: Tamiyo
+ word: Teferi
+ word: Teyo
+ word: Tezzeret
+ word: Tibalt
+ word: Tyvar
+ word: Ugin
+ word: Venser
+ word: Vivien
+ word: Vraska
+ word: Will
+ word: Windgrace
+ word: Wrenn
+ word: Xenagos
+ word: Yanggu
+ word: Yanling
+ word: Zariel
+ word:
+ name: Last Seen on Faerun
+ word: Ellywick
+ word: Lolth
+ word: Mordenkainen
+ word: Zariel
+ word:
+ name: Last Seen on Strixhaven
+ word: Kasmina
+ word: Liliana
+ word: Lukka
+ word: Rowan
+ word: Will
+ word:
+ name: Last Seen on Kaldheim
+ word: Kaya
+ word: Niko
+ word: Tibalt
+ word: Tyvar
+ word:
+ name: Last Seen on Zendikar
+ word: Jace
+ word: Kiora
+ word: Nahiri
+ word: Nissa
+ word: Nixilis
+ word:
+ name: Last Seen on Ikoria
+ word: Narset
+ word: Vivien
+ word:
+ name: Last Seen on Theros
+ word: Ashiok
+ word: Calix
+ word: Elspeth
+ word: Xenagos
+ word:
+ name: Last Seen on Eldraine
+ word: Garruk
+ word: Oko
+ word:
+ name: Last Seen on Ravnica
+ word: Bolas
+ word: Gideon
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Ral
+ word: Teyo
+ word: Vraska
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Dominaria
+ word: Chandra
+ word: Jaya
+ word: Karn
+ word: Teferi
+ word:
+ name: Last Seen on Ixalan
+ word: Angrath
+ word: Huatli
+ word:
+ name: Last Seen on Amonkhet
+ word: Liliana
+ word: Samut
+ word:
+ name: Last Seen on Kaladesh
+ word: Ajani
+ word: Saheeli
+ word: Tezzeret
+ word:
+ name: Last Seen on Fiore
+ name: Dack
+ name: Daretti
+ word:
+ name: Last Seen on Innistrad
+ word: Arlinn
+ word: Sorin
+ word: Tamiyo
+ word:
+ name: Last Seen on Tarkir
+ word: Sarkhan
+ word: Ugin
+ word:
+ name: Last Seen on New Phyrexia
+ word: Koth
+ word: Venser
+ word:
+ name: Last Seen on ???
+ word: Aminatou
+ word: Estrid
+ word: Wrenn
+ word: Last Seen Pre-Mending
+ word: Freyalise
+ word: Serra
+ word: Windgrace
+
+word list:
+ name: plane
+ word:
+ script: all_sub_types(match: "Plane")
+ line below: true
+ word: Eldraine
+ word: Dominaria
+ word: Ixalan
+ word: Amonkhet
+ word: Kaladesh
+ word:
+ name: Post-Mending Planes
+ word: Alara
+ word: Amonkhet
+ word: Eldraine
+ word: Fiora
+ word: Innistrad
+ word: Ixalan
+ word: Kaladesh
+ word: Kylem
+ word: Lorwyn
+ word: New Phyrexia
+ word: Shadowmoor
+ word: Tarkir
+ word: Theros
+ word: Zendikar
+ word:
+ name: Pre-Mending Planes
+ word: Kamigawa
+ word: Mercadia
+ word: Mirrodin
+ word: Rath
+ word: Ravnica
+ word: Serra's Realm
+ word:
+ name: Old Planes
+ word: Aranzhur
+ word: Azoria
+ word: Bolas's Meditation Realm
+ word: Cabralin
+ word: Cridhe
+ word: Dominaria
+ word: Equilor
+ word: Ergamon
+ word: Gastal
+ word: Ilcae
+ word: Moag
+ word: Nether Void
+ word: Phyrexia
+ word: Pyrulea
+ word: Rabiah
+ word: Segovia
+ word: Shandalar
+ word: Ulgrotha
+ word: Vatraquaz
+ word: Wildfire
+ word:
+ name: Planechase Planes
+ word: Arkhos
+ word: Azgol
+ word: Belenon
+ word: Diraden
+ word: Fabacin
+ word: Iquatana
+ word: Ir
+ word: Kaldheim
+ word: Karsus
+ word: Kephalai
+ word: Kinshala
+ word: Kolbahan
+ word: Kyneth
+ word: Luvion
+ word: Mongseng
+ word: Muraganda
+ word: Regatha
+ word: Tavelia
+ word: Valla
+ word: Vryn
+ word: Xerex
\ No newline at end of file
diff --git a/data/magic.mse-game/word_lists_ru b/data/magic.mse-game/word_lists_ru
new file mode 100644
index 00000000..43f1971f
--- /dev/null
+++ b/data/magic.mse-game/word_lists_ru
@@ -0,0 +1,687 @@
+
+############################################################## Magic word lists
+
+word list:
+ name: type
+ word:
+ name: Basic
+ is prefix: true
+ word:
+ name: Legendary
+ is prefix: true
+ word:
+ name: Snow
+ is prefix: true
+ word:
+ name: Token
+ is prefix: true
+ word:
+ name: Tribal
+ is prefix: true
+ word:
+ name: World
+ is prefix: true
+ line below: true
+ word: Conspiracy
+ word: Creature
+ word: Artifact
+ word: Artifact Creature
+ word: Enchantment
+ word: Enchantment Creature
+ word: Instant
+ word: Sorcery
+ word: Land
+ word: Planeswalker
+ word: Emblem
+ word: Phenomenon
+ word: Plane
+
+word list:
+ name: race
+ word:
+ script: all_races()
+ line below: true
+ word: Angel
+ word: Beast
+ word: Construct
+ word: Demon
+ word: Dragon
+ word: Elf
+ word: Faerie
+ word: Giant
+ word: Goblin
+ word: Golem
+ word: Human
+ word: Merfolk
+ word: Zombie
+ word:
+ name: All Races
+ word:
+ name: A
+ word: Aetherborn
+ word: Angel
+ word: Antelope
+ word: Ape
+ word: Archon
+ word: Assembly-Worker
+ word: Atog
+ word: Aurochs
+ word: Avatar
+ word: Azra
+ word:
+ name: B
+ word: Badger
+ word: Basilisk
+ word: Bat
+ word: Bear
+ word: Beast
+ word: Beeble
+ word: Bird
+ word: Blinkmoth
+ word: Boar
+ word: Bringer
+ word: Brushwagg
+ word:
+ name: C
+ word: Camarid
+ word: Camel
+ word: Caribou
+ word: Carrier
+ word: Cat
+ word: Centaur
+ word: Cephalid
+ word: Chimera
+ word: Cockatrice
+ word: Construct
+ word: Crab
+ word: Crocodile
+ word: Cyclops
+ word:
+ name: D
+ word: Dauthi
+ word: Demigod
+ word: Demon
+ word: Devil
+ word: Dinosaur
+ word: Djinn
+ word: Dragon
+ word: Drake
+ word: Dreadnought
+ word: Drone
+ word: Dryad
+ word: Dwarf
+ word:
+ name: E
+ word: Egg
+ word: Efreet
+ word: Eldrazi
+ word: Elemental
+ word: Elephant
+ word: Elf
+ word: Elk
+ word: Eye
+ word:
+ name: F
+ word: Faerie
+ word: Ferret
+ word: Fish
+ word: Fox
+ word: Frog
+ word: Fungus
+ word:
+ name: G
+ word: Gargoyle
+ word: Germ
+ word: Giant
+ word: Gnome
+ word: Goat
+ word: Goblin
+ word: God
+ word: Golem
+ word: Gorgon
+ word: Graveborn
+ word: Gremlin
+ word: Griffin
+ word:
+ name: H
+ word: Hag
+ word: Harpy
+ word: Hellion
+ word: Hippo
+ word: Hippogriff
+ word: Homarid
+ word: Homunculus
+ word: Horror
+ word: Horse
+ word: Hound
+ word: Human
+ word: Hydra
+ word: Hyena
+ word:
+ name: I
+ word: Illusion
+ word: Imp
+ word: Incarnation
+ word: Insect
+ word:
+ name: J
+ word: Jackal
+ word: Jellyfish
+ word: Juggernaut
+ word:
+ name: K
+ word: Kavu
+ word: Kirin
+ word: Kithkin
+ word: Kobold
+ word: Kor
+ word: Kraken
+ word:
+ name: L
+ word: Lamia
+ word: Lammasu
+ word: Leech
+ word: Leviathan
+ word: Lhurgoyf
+ word: Licid
+ word: Lizard
+ word:
+ name: M
+ word: Manticore
+ word: Masticore
+ word: Merfolk
+ word: Metathran
+ word: Minotaur
+ word: Mole
+ word: Mongoose
+ word: Monkey
+ word: Moonfolk
+ word: Mouse
+ word: Mutant
+ word: Myr
+ word:
+ name: N
+ word: Naga
+ word: Nautilus
+ word: Nephilim
+ word: Nightmare
+ word: Nightstalker
+ word: Noggle
+ word: Nymph
+ word:
+ name: O
+ word: Octopus
+ word: Ogre
+ word: Ooze
+ word: Orb
+ word: Orc
+ word: Orgg
+ word: Otter
+ word: Ouphe
+ word: Ox
+ word: Oyster
+ word:
+ name: P
+ word: Pangolin
+ word: Pegasus
+ word: Pentavite
+ word: Pest
+ word: Phelddagrif
+ word: Phoenix
+ word: Pincher
+ word: Plant
+ word: Praetor
+ word: Prism
+ word:
+ name: R
+ word: Rabbit
+ word: Rat
+ word: Reflection
+ word: Rhino
+ word:
+ name: S
+ word:
+ name: Sa-Sl
+ word: Sable
+ word: Salamander
+ word: Sand
+ word: Saproling
+ word: Satyr
+ word: Scarecrow
+ word: Scorpion
+ word: Sculpture
+ word: Serpent
+ word: Servo
+ word: Shade
+ word: Shapeshifter
+ word: Shark
+ word: Sheep
+ word: Siren
+ word: Skeleton
+ word: Slith
+ word: Sliver
+ word: Slug
+ word:
+ name: Sn-Sz
+ word: Snake
+ word: Soltari
+ word: Spawn
+ word: Specter
+ word: Sphinx
+ word: Spider
+ word: Spike
+ word: Spirit
+ word: Splinter
+ word: Sponge
+ word: Squid
+ word: Squirrel
+ word: Starfish
+ word: Surrakar
+ word:
+ name: T
+ word: Tentacle
+ word: Tetravite
+ word: Thalakos
+ word: Thopter
+ word: Thrull
+ word: Treefolk
+ word: Trilobite
+ word: Triskelavite
+ word: Troll
+ word: Turtle
+ word:
+ name: U
+ word: Unicorn
+ word:
+ name: V
+ word: Vampire
+ word: Vedalken
+ word: Viashino
+ word: Volver
+ word:
+ name: W
+ word: Wall
+ word: Weird
+ word: Werewolf
+ word: Whale
+ word: Wolf
+ word: Wolverine
+ word: Wombat
+ word: Worm
+ word: Wraith
+ word: Wurm
+ word:
+ name: Y
+ word: Yeti
+ word:
+ name: Z
+ word: Zombie
+ word: Zubera
+
+word list:
+ name: class
+ word:
+ script: all_classes()
+ line below: true
+ word: Beast
+ word: Cleric
+ word: Druid
+ word: Knight
+ word: Rogue
+ word: Shaman
+ word: Soldier
+ word: Warrior
+ word: Wizard
+ word: Zombie
+ word:
+ name: All Classes
+ word:
+ name: A-C
+ word: Advisor
+ word: Ally
+ word: Archer
+ word: Archon
+ word: Army
+ word: Artificer
+ word: Assassin
+ word: Barbarian
+ word: Beast
+ word: Berserker
+ word: Bringer
+ word: Carrier
+ word: Citizen
+ word: Cleric
+ word: Coward
+ word:
+ name: D-I
+ word: Deserter
+ word: Dreadnought
+ word: Drone
+ word: Druid
+ word: Egg
+ word: Elder
+ word: Flagbearer
+ word: Horror
+ word: Incarnation
+ word:
+ name: J-P
+ word: Juggernaut
+ word: Knight
+ word: Leviathan
+ word: Mercenary
+ word: Minion
+ word: Monger
+ word: Monk
+ word: Mutant
+ word: Mystic
+ word: Ninja
+ word: Noble
+ word: Nomad
+ word: Peasant
+ word: Pilot
+ word: Pirate
+ word: Processor
+ word:
+ name: R-S
+ word: Rebel
+ word: Reflection
+ word: Rigger
+ word: Rogue
+ word: Samurai
+ word: Scion
+ word: Scout
+ word: Serf
+ word: Shaman
+ word: Skeleton
+ word: Soldier
+ word: Spawn
+ word: Spellshaper
+ word: Spirit
+ word: Survivor
+ word:
+ name: T-Z
+ word: Thopter
+ word: Vampire
+ word: Warlock
+ word: Warrior
+ word: Werewolf
+ word: Wizard
+ word: Zombie
+
+word list:
+ name: artifact
+ word:
+ script: all_sub_types(match: "Artifact")
+ line below: true
+ word: Contraption
+ word: Clue
+ word: Equipment
+ word: Food
+ word: Fortification
+ word: Gold
+ word: Treasure
+ word: Vehicle
+
+word list:
+ name: land
+ word:
+ script: all_sub_types(match: "Land")
+ line below: true
+ word: Plains
+ word: Island
+ word: Swamp
+ word: Mountain
+ word: Forest
+ word: Desert
+ word: Gate
+ word: Lair
+ word: Locus
+ word: Mine
+ word: Power-Plant
+ word: Tower
+ word: Urza's
+
+word list:
+ name: enchantment
+ word:
+ script: all_sub_types(match: "Enchantment")
+ line below: true
+ word: Aura
+ word: Curse
+ word: Shrine
+ word: Cartouche
+ word: Saga
+
+word list:
+ name: spell
+ word:
+ script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery")
+ line below: true
+ word: Arcane
+ word: Trap
+ word: Adventure
+
+word list:
+ name: planeswalker
+ word:
+ script: all_sub_types(match: "Planeswalker")
+ line below: true
+ word: Ajani
+ word: Aminatou
+ word: Angrath
+ word: Arlinn
+ word: Ashiok
+ word: Bolas
+ word: Calix
+ word: Chandra
+ word: Dack
+ word: Daretti
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Elspeth
+ word: Estrid
+ word: Freyalise
+ word: Garruk
+ word: Gideon
+ word: Huatli
+ word: Jace
+ word: Jaya
+ word: Karn
+ word: Kasmina
+ word: Kaya
+ word: Kiora
+ word: Koth
+ word: Liliana
+ word: Lukka
+ word: Nahiri
+ word: Narset
+ word: Nissa
+ word: Nixilis
+ word: Oko
+ word: Ral
+ word: Rowan
+ word: Saheeli
+ word: Samut
+ word: Sarkhan
+ word: Serra
+ word: Sorin
+ word: Tamiyo
+ word: Teferi
+ word: Teyo
+ word: Tezzeret
+ word: Tibalt
+ word: Ugin
+ word: Venser
+ word: Vivien
+ word: Vraska
+ word: Will
+ word: Windgrace
+ word: Wrenn
+ word: Xenagos
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Ikoria
+ word: Lukka
+ word: Narset
+ word: Vivien
+ word:
+ name: Last Seen on Theros
+ word: Ashiok
+ word: Calix
+ word: Elspeth
+ word: Xenagos
+ word:
+ name: Last Seen on Eldraine
+ word: Garruk
+ word: Oko
+ word: Rowan
+ word: Will
+ word:
+ name: Last Seen on Ravnica
+ word: Bolas
+ word: Gideon
+ word: Davriel
+ word: Domri
+ word: Dovin
+ word: Kasmina
+ word: Kaya
+ word: Ral
+ word: Teyo
+ word: Vraska
+ word: Yanggu
+ word: Yanling
+ word:
+ name: Last Seen on Dominaria
+ word: Chandra
+ word: Jaya
+ word: Karn
+ word: Teferi
+ word:
+ name: Last Seen on Ixalan
+ word: Angrath
+ word: Huatli
+ word: Jace
+ word:
+ name: Last Seen on Amonkhet
+ word: Liliana
+ word: Nissa
+ word: Samut
+ word:
+ name: Last Seen on Kaladesh
+ word: Ajani
+ word: Saheeli
+ word: Tezzeret
+ word:
+ name: Last Seen on Fiore
+ name: Dack
+ name: Daretti
+ word:
+ name: Last Seen on Innistrad
+ word: Arlinn
+ word: Nahiri
+ word: Sorin
+ word: Tamiyo
+ word: Tibalt
+ word:
+ name: Last Seen on Zendikar
+ word: Kiora
+ word: Nixilis
+ word:
+ name: Last Seen on Tarkir
+ word: Sarkhan
+ word: Ugin
+ word:
+ name: Last Seen on New Phyrexia
+ word: Koth
+ word: Venser
+ word:
+ name: Last Seen on ???
+ word: Aminatou
+ word: Estrid
+ word: Wrenn
+ word: Last Seen Pre-Mending
+ word: Freyalise
+ word: Serra
+ word: Windgrace
+
+word list:
+ name: plane
+ word:
+ script: all_sub_types(match: "Plane")
+ line below: true
+ word: Eldraine
+ word: Dominaria
+ word: Ixalan
+ word: Amonkhet
+ word: Kaladesh
+ word:
+ name: Post-Mending Planes
+ word: Alara
+ word: Amonkhet
+ word: Eldraine
+ word: Fiora
+ word: Innistrad
+ word: Ixalan
+ word: Kaladesh
+ word: Kylem
+ word: Lorwyn
+ word: New Phyrexia
+ word: Shadowmoor
+ word: Tarkir
+ word: Theros
+ word: Zendikar
+ word:
+ name: Pre-Mending Planes
+ word: Kamigawa
+ word: Mercadia
+ word: Mirrodin
+ word: Rath
+ word: Ravnica
+ word: Serra's Realm
+ word:
+ name: Old Planes
+ word: Aranzhur
+ word: Azoria
+ word: Bolas's Meditation Realm
+ word: Cabralin
+ word: Cridhe
+ word: Dominaria
+ word: Equilor
+ word: Ergamon
+ word: Gastal
+ word: Ilcae
+ word: Moag
+ word: Nether Void
+ word: Phyrexia
+ word: Pyrulea
+ word: Rabiah
+ word: Segovia
+ word: Shandalar
+ word: Ulgrotha
+ word: Vatraquaz
+ word: Wildfire
+ word:
+ name: Planechase Planes
+ word: Arkhos
+ word: Azgol
+ word: Belenon
+ word: Diraden
+ word: Fabacin
+ word: Iquatana
+ word: Ir
+ word: Kaldheim
+ word: Karsus
+ word: Kephalai
+ word: Kinshala
+ word: Kolbahan
+ word: Kyneth
+ word: Luvion
+ word: Mongseng
+ word: Muraganda
+ word: Regatha
+ word: Tavelia
+ word: Valla
+ word: Vryn
+ word: Xerex
\ No newline at end of file