mse version: 0.3.2 short name: Vanguard full name: Magic Vanguard icon: card-sample.png position hint: 2 # Author : Wolfwood # Most stuff is copy/pasted from magic.mse-game ############################################################## Functions & filters # General functions init script: #character filter for copyright line copyright_filter := # step 1 : Æ replacement rule replace_rule( match: "AE", replace: "Æ") + # step 2 : longdash for keywords replace_rule( match: "--", replace: "—") + replace_rule( match: " - ", replace: " — ") + # step 3 : trademark symbol replace_rule( match: "TM", replace: "™") + # step 4 : copyright symbol replace_rule( match: "CR", replace: "©") #character filter for title line name_filter := # step 1 : Æ replacement rule replace_rule( match: "AE", replace: "Æ") + # step 2 : longdash for keywords replace_rule( match: "--", replace: "—") + replace_rule( match: " - ", replace: " — ") # correctly sort a mana symbol (no guild mana) mana_sort := sort_rule(order: "XYZ[0123456789]S(WUBRG)") # correctly sort guild mana mana_sort_guild := replace_rule( # swap these: match: "U/W|B/U|R/B|G/B|W/G|B/W|R/U|G/B|W/R|U/G", in_context: "(^|[^/])($|[^/])", replace: {input[2] + "/" + input[0]}) mana_has_guild := sort_rule(order: "") # Is there guild or half mana in the input? # A mana cost can contain both normal and guild mana mana_filter := to_upper + { if mana_has_guild()!="" then mana_sort_guild() else mana_sort() } # Like mana filter, only also allow tap symbols: tap_filter := sort_rule(order: "") mana_filter_t := replace_rule( # Remove [] used for forcing mana symbols match: "[\\[\\]]", replace: "" ) + { tap_filter() + mana_filter() } # replaces — correctly alternative_cost := replace_rule(match:"—|\\.", replace:"") + replace_rule(match:"[A-Z]", in_context:"", replace: { to_lower() }) mana_cost := replace_rule(match:" ", replace: "") add := "" # default is nothing format_cost := { if substring(begin: 0, end: 13)=="—" then alternative_cost() else add + mana_cost() }; format_cost_start := replace_rule(match:"^()?[ ]?-", replace:"\\1—") # Utilities for keywords has_cc := { card.casting_cost != "" } has_pt := { card.pt != "" } # Filters for the text box # context in which mana symbols are found mana_context := "(?ix) # case insensitive, ignore whitespace (^|[[:space:]\"(]) # start of a word ( : # G: something | , # G, tap: something | [ ]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 ([ ]]*>[XYZWUBRG0-9/|]+]*>[ ](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 "; # the rule text filter # - adds mana symbols # - makes text in parentheses italic text_filter := # step 1 : remove all automatic tags tag_remove_rule(tag: "") + tag_remove_rule(tag: "") + # step 2 : reminder text for keywords expand_keywords_rule( default_expand: { contains(match:mode, set.automatic_reminder_text) }, combine: { if mode == "pseudo" then "{keyword}" else "{keyword} ({process_english_hints(reminder)})" } ) + # step 3 : expand shortcut words ~ and CARDNAME replace_rule( match: "~|~THIS~|CARDNAME", in_context: "(^|[[:space:]]|\\()", replace: "" ) + # step 4 : fill in atom fields tag_contents_rule( tag: "", contents: { if card.name=="" then "CARDNAME" else card.name } ) + # step 4.5 : explict non mana symbols replace_rule( match: "\\][STXYZWUBRG0-9/|]+\\[", replace: {"" + mana_filter_t() + ""} ) + # step 5 : add mana & tap symbols replace_rule( match: "[STXYZWUBRG0-9/|]+", in_context: mana_context, replace: {"" + mana_filter_t() + ""} ) + # step 5b : add explict mana symbols replace_rule( match: "\\[[STXYZWUBRG0-9/|]+\\]", replace: {"" + mana_filter_t() + ""} ) + # step 6 : longdash replace_rule( match: "--", replace: "—") + replace_rule( match: " - ", replace: " — ") + # step 6b : Æ replacement replace_rule( match: "AE", replace: "Æ" ) + # step 6c : "s" remover for keywords replace_rule( match: "s" replace: "" ) + # step 6e : p/t detector, needed for suspend tag_contents_rule( tag: "" contents: { if card.pt == "" then "" else contents } ) + # step 6f : casting cost detector, needed for suspend tag_contents_rule(## by somebloke tag: "" contents: { if card.casting_cost == "" then "" else contents } ) + # step 7 : italic reminder text replace_rule( match: "[(][^)\n]*[)]?", in_context: "(^|[[:space:]])|", replace: "&") + # step 8 : post ( capitalization replace_rule( match: "[a-z]", in_context: "[(]()?|[ ]*: |—| — ", replace: { to_upper() }) ############################################################## Set fields set field: type: info name: Set Information set field: type: text name: title set field: type: text name: description multi line: true set field: type: text name: artist set field: type: text name: copyright set field: type: info name: Defaults and Automation set field: type: color name: border color description: The default border color for cards 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) set field: type: multiple choice name: automatic reminder text choice: old choice: core choice: expert choice: pseudo choice: custom initial: old, core, expert, custom # Convert from older mse versions script: if value = "yes" then "old, core, expert, custom" 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. set field: type: boolean name: automatic card numbers initial: no description: Should card numbers be shown on the cards? ############################# Default style default set style: title: padding left: 2 font: size: 16 ############################################################## Card fields ############################# 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 card field: type: choice name: background choice: normal editable: false ############################# Name line card field: type: text name: name identifying: true show statistics: false card list visible: true card list column: 1 card list width: 150 ############################# Image card field: type: image name: image show statistics: false ############################# Card type card field: type: text name: type card list visible: true card list column: 2 ############################# Text box card field: type: text name: rule text script: text_filter(value) show statistics: false multi line: true card field: type: text name: flavor text show statistics: false multi line: true ############################# PT card field: type: text name: handmod card list visible: true card list column: 3 card list width: 50 card list name: hand card field: type: text name: lifemod card list visible: true card list column: 4 card list width: 50 card list name: life ############################# Card sorting / numbering card field: type: text name: card number save value: false script: position( of: card in: set order_by: { card.name } ) + "/" + number_of_items(in: set) card list visible: true card list column: 10 card list width: 50 card list name: # editable: false show statistics: false ############################# Copyright stuff card field: type: text name: illustrator default: set.artist card field: type: text name: copyright default: set.copyright editable: 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) ############################################################## Keywords ############################# Keyword rules has keywords: true #keyword preview: {keyword} ({reminder}) 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 level keywords (Cycling, Vanishing, etc.) keyword mode: name: pseudo description: Pseudo keyword / named ability (Hellbent, Threshold, etc.) keyword mode: is default: true name: custom description: Custom keywords keyword parameter type: name: mana match: [STXYZ0-9WUBRG/|]+ # By pichoro and bunnierein keyword parameter type: name: cost match: [ ][STXYZ0-9WUBRG/|]*|[-—][^(\n]* refer script: name: normal description: standard cost script: \{{input}\} refer script: name: add nothing for mana costs description: When using mana only costs, doesn't include anything extra in the reminder text script: \{format_cost({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: \{format_cost(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: \{format_cost(add:"pay ",{input})\} script: format_cost_start() 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})\} keyword parameter type: name: action match: [^(,\n]+ keyword parameter type: name: name match: [^(.,\n]+ keyword parameter type: name: prefix description: Prefix for things like "walk" optional: false match: [A-Z][a-z, ]* example: Forest ############################# All Magic keywords # By JrEye and Neko_Asakami, Updated by Pichoro and Buttock1234 keyword: keyword: Flying match: Flying mode: core reminder: This creature can’t be blocked except by creatures with flying and/or reach. keyword: keyword: Haste match: Haste mode: core reminder: This creature can attack and tap the turn it comes under your control. keyword: keyword: Fear match: Fear mode: core reminder: This creature can’t be blocked except by artifact creatures and/or black creatures. keyword: keyword: First strike match: First strike mode: core reminder: This creature deals combat damage before creatures without first strike. keyword: keyword: Enchant match: Enchant name mode: core reminder: Target a {param1} as you play this. This card comes into play attached to that {param1}. keyword: keyword: Cycling match: Cyclingcost mode: core reminder: {format_cost(param1)}, Discard this card: Draw a card. keyword: keyword: Trample match: Trample mode: core reminder: If this creature would deal enough combat damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player. keyword: keyword: Banding match: Banding mode: old reminder: When declaring attackers or blockers this creature may group with others creatures with banding and one creature without banding. When damage is dealt, you decide where damage is dealt. keyword: keyword: Bands with other match: Bands with other name mode: old reminder: When declaring attackers or blockers this creature may group with other creatures with banding or bands with {param1}. When damage is dealt, you decide where damage is dealt. 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. 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. keyword: keyword: Cumulative upkeep match: Cumulative upkeepcost mode: old reminder: At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you {format_cost(add:"pay ",param1)} for each age counter on it. keyword: keyword: Horsemanship match: Horsemanship mode: old reminder: This creature can’t be blocked except by creatures with horsemanship. keyword: keyword: Phasing match: Phasing mode: old reminder: At the beginning of your upkeep, put this and any cards attached to it in the phased-out zone. If this is already in the phased-out zone, return it and any card attached to it to play. If there were counters on this card when it phased out, put that many counters on it when it returns to play. This ability does not cause comes-into-play or leaves play abilities to trigger. keyword: keyword: Flanking match: Flanking mode: old reminder: Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn. keyword: keyword: Shadow match: Shadow mode: core reminder: This creature can block or be blocked only by creatures with shadow. keyword: keyword: Buyback match: Buybackcost mode: expert reminder: You may {format_cost(add:"pay ",param1)} in addition to any other costs as you play this spell. If you do, put this card into your hand as it resolves. keyword: keyword: Echo match: Echocost 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: Cardcycling match: prefixcyclingcost mode: expert reminder: {format_cost(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: Fading match: Fading number mode: expert reminder: This comes into play 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. keyword: keyword: Kicker match: Kickercost mode: expert reminder: You may {format_cost(add:"pay an additional ",param1)} as you play this spell. keyword: keyword: Madness match: Madnesscost mode: expert reminder: You may play this card for its madness cost at the time you discard it. keyword: keyword: Flashback match: Flashbackcost mode: expert reminder: You may play this card from your graveyard for its flashback cost. Then remove it from the game. keyword: keyword: Morph match: Morphcost mode: expert reminder: You may play this face down as a 2/2 creature for 3. Turn it face up any time for its morph cost. keyword: keyword: Amplify match: Amplify number mode: expert reminder: As this card comes into play, put {english_number_a(param1)} +1/+1 counter(s) on it for each creature that shares a type with this that you reveal in your hand. keyword: keyword: Double strike match: Double strike mode: expert 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. keyword: keyword: Storm match: Storm mode: expert reminder: When you play this spell, copy it for each spell played before it this turn. You may choose new targets for the copies. keyword: keyword: Affinity for match: Affinity for name mode: expert reminder: This spell costs 1 less to play for each {param1} you control. keyword: keyword: Entwine match: Entwinecost mode: expert reminder: Choose both if you pay the entwine cost. keyword: keyword: Equip match: Equipcost mode: expert reminder: {format_cost(param1)}: Attach to target creature you control. Equip only as a sorcery. keyword: keyword: Imprint match: Imprint—action mode: expert reminder: The removed card is imprinted on this artifact. keyword: keyword: Modular match: Modular number mode: expert reminder: This comes into play with {english_number_a(param1)} +1/+1 counter(s) on it. When it’s put into a graveyard, you may put its +1/+1 counters on target artifact creature. keyword: keyword: Scry match: Scry number mode: expert reminder: Look at the top {english_number_multiple(param1)} card(s) of your library. Put any number of them on the bottom of your library in any order and the rest on top of your library in any order. keyword: keyword: Sunburst match: Sunburst mode: expert reminder: This comes into play with a +1/+1 counter on it for each color of mana used to pay its cost. If it is not a creature, use charge counters instead. #Two versions of splice needed because if there's no separator, the program doesn't know when to switch from param1 to param2. keyword: keyword: Splice (Mana Cost) match: Splice onto name mana mode: expert reminder: As you play 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: Splice (Alternative Cost) match: Splice onto nameaction mode: expert reminder: As you play 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: Offering match: prefix offering mode: expert reminder: You may play this card any time you could play 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: Bushido match: Bushido number mode: expert reminder: When this blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn. keyword: keyword: Ninjutsu match: Ninjutsucost mode: expert reminder: {format_cost(param1)}, Return an unblocked attacker you control to hand: Put this card into play from your hand tapped and attacking. keyword: keyword: Soulshift match: Soulshift number mode: expert reminder: When this is put into a graveyard from play, you may return target Spirit card with converted mana cost {param1} or less from you graveyard to your hand. keyword: keyword: Epic match: Epic mode: expert reminder: For the rest of the game, you can’t play spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. If the spell has any targets, you may choose new targets for the copy. keyword: keyword: Convoke match: Convoke mode: expert reminder: Each creature you tap while playing this spell reduces its cost by 1 or by one mana of that creature’s color. keyword: keyword: Transmute match: Transmutecost mode: expert reminder: {format_cost(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. Play only as a sorcery. keyword: keyword: Haunt match: Haunt mode: expert reminder: When this card is put into a graveyard from play, remove it from the game haunting target creature. keyword: keyword: Bloodthirst match: Bloodthirst number mode: expert reminder: If an opponent was dealt damage this turn, this creature comes into play with {english_number_a(param1)} +1/+1 counter(s) on it. keyword: keyword: Replicate match: Replicatecost mode: expert reminder: When you play this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies. keyword: keyword: Denimwalk match: Denimwalk mode: old reminder: If defending player is wearing any clothing made of denim, this creature is unblockable. keyword: keyword: Landwalk match: prefixwalk mode: core reminder: This creature is unblockable as long as defending player controls a {param1}. keyword: keyword: Protection from match: Protection from name mode: core reminder: This creature can’t be blocked, targeted, dealt damage, or enchanted, or equipped by anything {param1}. keyword: keyword: Dredge match: Dredge number mode: expert reminder: As long as you have at least {english_number(param1)} card(s) in your library, if you would draw a card, you may instead put exactly {english_number(param1)} card(s) from the top of your library into your graveyard and return this card from your graveyard to your hand. keyword: keyword: Graft match: Graft number mode: expert reminder: This creature comes into play with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever another creature comes into play, you may move a +1/+1 counter from this creature onto it. keyword: keyword: Forecast match: Forecastcost, Reveal name from your hand: action mode: expert reminder: Play this ability only during your upkeep and only once each turn. keyword: keyword: Recover match: Recovercost mode: expert reminder: When a creature is put into your graveyard from play, you may {format_cost(add:"pay ",param1)}. If you do, return this card from your graveyard to your hand. Otherwise, remove this card from the game. keyword: keyword: Ripple match: Ripple number mode: expert reminder: When you play this spell, you may reveal the top {english_number_multiple(param1)} card(s) of your library. You may play any revealed cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library. keyword: keyword: Flash match: Flash mode: expert reminder: You may play this spell anytime you could play an instant. keyword: keyword: Split second match: Split second mode: expert reminder: As long as this spell is on the stack, players can't play spells or activated abilities that aren't mana abilities. keyword: keyword: Suspend match: Suspend numbermana mode: expert reminder: Rather than play this card from your hand,{if has_cc() then " you may" else ""} pay {param2} and remove it from the game 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, play it without paying its mana cost.{if has_pt() then " It has haste." else ""} keyword: keyword: Vanishing match: Vanishing number mode: expert reminder: This creature comes into play with {english_number_a(param1)} time counter(s) on it. At the beginning of your upkeep, remove a time counter from it. When you remove the last, sacrifice it. keyword: keyword: Deathtouch match: Deathtouch mode: expert reminder: Whenever this creature deals damage to a creature, destroy that creature. 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 play this spell, copy it for each permanent put into a graveyard from this play this turn. You may choose new targets for the copies. keyword: keyword: Lifelink match: Lifelink mode: core reminder: Whenever this creature deals damage, you 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: expert reminder: Look at the top {english_number_multiple(param1)} card(s) 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: Transfigurecost mode: expert reminder: {format_cost(param1)}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card into play. Then shuffle your library. Play only as a sorcery. keyword: keyword: Aura swap match: Aura swapcost mode: expert reminder: {format_cost(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: You may remove any number of cards in your graveyard from the game as you play this spell. It costs 1 less to play for each card removed this way. 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: expert reminder: This permanent can't be the target of spells or abilities. keyword: keyword: Hellbent match: Hellbent mode: pseudo keyword: keyword: Channel match: Channel mode: pseudo keyword: keyword: Sweep match: Sweep mode: pseudo keyword: keyword: Threshold match: Threshold mode: pseudo keyword: keyword: Radiance match: Radiance mode: pseudo keyword: keyword: Gotcha match: Gotcha mode: pseudo keyword: keyword: Grandeur match: Grandeur mode: pseudo keyword: keyword: Fortify match: Fortifycost mode: expert reminder: {format_cost(param1)}: Attach to target land you control. Fortify only as a sorcery. This card comes into play unattached and stays in play if the land leaves play.