diff --git a/data/planechase-standard.mse-style/card-sample.png b/data/planechase-standard.mse-style/card-sample.png new file mode 100644 index 00000000..1dd8b9fd Binary files /dev/null and b/data/planechase-standard.mse-style/card-sample.png differ diff --git a/data/planechase-standard.mse-style/card.png b/data/planechase-standard.mse-style/card.png new file mode 100644 index 00000000..fe23ad2c Binary files /dev/null and b/data/planechase-standard.mse-style/card.png differ diff --git a/data/planechase-standard.mse-style/image_mask.png b/data/planechase-standard.mse-style/image_mask.png new file mode 100644 index 00000000..cfccca95 Binary files /dev/null and b/data/planechase-standard.mse-style/image_mask.png differ diff --git a/data/planechase-standard.mse-style/style b/data/planechase-standard.mse-style/style new file mode 100644 index 00000000..147829f4 --- /dev/null +++ b/data/planechase-standard.mse-style/style @@ -0,0 +1,228 @@ +mse version: 0.3.8 +game: planechase +short name: Standard +installer group: Magic Planechase/normal style +icon: card-sample.png +position hint: 01 + +version: 2009-08-11 +depends on: + package: planechase.mse-game + version: 2009-08-11 +depends on: + package: magic-mana-small.mse-symbol-font + version: 2007-09-23 +depends on: + package: magic-future-common.mse-include + version: 2007-09-23 + +card width: 523 +card height: 375 +card dpi: 111.7142857 +#By Pichoro +#Images by Art_Freak +############################################################## Extra scripts +init script: + # Use the normal tap symbol + mana_t := { + if styling.tap_symbol == "old" then "old" + else if styling.tap_symbol == "diagonal T" then "older" + else "new" + } + # Use guild mana symbols? + guild_mana := { styling.use_guild_mana_symbols } + +############################################################## Extra style options +styling field: + type: boolean + name: use guild mana symbols + description: Use the Ravnica guild symbols instead of the official half/half circles for hybrid mana. + initial: no +styling field: + type: package choice + name: text box mana symbols + match: magic-mana-*.mse-symbol-font + initial: magic-mana-small.mse-symbol-font +styling field: + type: choice + name: tap symbol + description: What tap and untap symbols should be used on cards? + initial: old + choice: modern + choice: old + choice: diagonal T +styling field: + type: boolean + name: inverted common symbol + description: Should the common rarity symbol be inverted, like in Coldsnap? + initial: no +styling style: + use guild mana symbols: + choice images: + yes: /magic-mana-small.mse-symbol-font/mana_guild_rg.png + no: /magic-mana-small.mse-symbol-font/mana_rg.png + tap symbol: + render style: both + choice images: + modern: /magic-mana-small.mse-symbol-font/mana_t.png + old: /magic-mana-small.mse-symbol-font/mana_t_old.png + diagonal T: /magic-mana-small.mse-symbol-font/mana_t_older.png + inverted common symbol: + choice images: + no: { symbol_variation(symbol: set.symbol, variation: "common") } + yes: { symbol_variation(symbol: set.symbol, variation: "invertedcommon") } +############################################################## Card fields +card style: + ############################# Name line + name: + left: 84 + top : 20 + width: 354 + height: 23 + alignment: bottom center shrink-overflow + padding bottom: 0 + z index: 2 + font: + name: Matrix + size: 17 + weight: bold + color: rgb(0,0,0) + ############################# Image + image: + left: 16 + top: 15 + width: 492 + height: 343 + z index: 1 + mask: image_mask.png + ############################# Card type + type: + left: 114 + top : 243 + width: 294 + height: 23 + alignment: bottom center shrink-overflow + padding bottom: 0 + z index: 2 + font: + name: Matrix + size: 13.5 + color: black + rarity: + right: 408 + top : 253 + width: 28 + height: 14 + z index: 2 + render style: image + alignment: middle right + choice images: + # Images based on the set symbol + common: + script: + if styling.inverted_common_symbol then symbol_variation(symbol: set.symbol, variation: "invertedcommon") + else symbol_variation(symbol: set.symbol, variation: "common") + uncommon: script: symbol_variation(symbol: set.symbol, variation: "uncommon") + rare: script: symbol_variation(symbol: set.symbol, variation: "rare") + mythic rare: script: symbol_variation(symbol: set.symbol, variation: "mythic rare") + special: script: symbol_variation(symbol: set.symbol, variation: "special") + ############################# Text box + ############################# Card sorting / numbering + ############################# Copyright stuff + illustrator: + left: 168 + top : 351 + width: 214 + height: 13 + z index: 2 + alignment: middle center + font: + name: Matrix + size: 8 + weight: bold + color: white + copyright line: + left: 154 + top : 361 + width: 214 + height: 13 + z index: 2 + alignment: middle center + font: + name: MPlantin + size: 6 + color: white +############################################################## Extra card fields +extra card field: + type: choice + name: background + editable: false + save value: false + choice: frame +extra card field: + type: choice + name: chaos symbol + editable: false + save value: false + choice: chaos +extra card field: + type: choice + name: paintbrush + save value: false + choice: white + editable: false +extra card field: + type: text + name: text + multi line: true + save value: 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 +extra card style: + background: + left: 0 + top: 0 + width: 523 + height: 375 + z index: 0 + render style: image + choice images: + frame: card.png + chaos symbol: + left: 62 + top: 318 + width: 25 + height: 22 + z index: 2 + render style: image + choice images: + chaos: /magic-mana-small.mse-symbol-font/mana_chaos.png + paintbrush: + left: { 245 - card_style.illustrator.content_width * 0.5 } + top : 352 + width: 30 + height: 12 + z index: 6 + render style: image + choice images: + white: /magic-future-common.mse-include/paintbrush_white.png + text: + left: 61 + width: 402 + top: 270 + height: 78 + paragraph height: 39 + font: + name: MPlantin + italic name: MPlantin-Italic + size: 10.5 + scale down to: 0.5 + color: black + symbol font: + name: { styling.text_box_mana_symbols } + size: 10.5 + alignment: middle left + z index: 2 + line height hard: 1.1 + mask: textbox_mask.png diff --git a/data/planechase-standard.mse-style/textbox_mask.png b/data/planechase-standard.mse-style/textbox_mask.png new file mode 100644 index 00000000..170894f4 Binary files /dev/null and b/data/planechase-standard.mse-style/textbox_mask.png differ diff --git a/data/planechase.mse-game/card-sample.png b/data/planechase.mse-game/card-sample.png new file mode 100644 index 00000000..94a8b3f9 Binary files /dev/null and b/data/planechase.mse-game/card-sample.png differ diff --git a/data/planechase.mse-game/game b/data/planechase.mse-game/game new file mode 100644 index 00000000..02d1427b --- /dev/null +++ b/data/planechase.mse-game/game @@ -0,0 +1,1204 @@ +mse version: 0.3.8 +short name: Planes +full name: Magic Plane Cards +installer group: Magic Planes/game files +icon: card-sample.png +position hint: 02 + +version: 2009-08-11 + +#By Pichoro +############################################################## Functions & filters +# General functions +init script: + ############################################################## Sorting mana symbols + + # correctly sort a mana symbol (no guild mana) + mana_sort := sort_text@(order: "XYZI[0123456789]S(WUBRG)") + # correctly sort guild mana + mana_sort_guild := sort_text@(order: "[XYZI01234567890SWUBRG/|]") + + replace@( + match: "./.|././.|./././.|.[|]", + in_context: "(^|[^/])($|[^/])", + replace: {sort_text(order:"in_place((WUBRG)")} + ) + mana_has_guild := match@(match: "[/|]") # 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_text@(order: "") + mana_filter_t := replace@( # Remove [] used for forcing mana symbols + match: "[\\[\\]]", + replace: "" + ) + { tap_filter() + mana_filter() } + + ############################################################## Utilities for keywords + + # replaces — correctly + add := "" # default is nothing + for_mana_costs := format_cost := { + if input.separator_before == "—" and contains(input.param, " ") then ( + if contains(input.param, match:",") then ( + if match(match: "^[SCTQXYZIWUBRG0-9/|]+,", input.param) then + "{add}{combined_cost(input.param)}" + else "{combined_cost(input.param)}" + ) else + "{alternative_cost(input.param)}" + ) else + "{add}{input.param}" + } + alternative_cost := replace@(match:"^[A-Z]", replace: { to_lower() }) + combined_cost := replace@(match:", [A-Z]", replace: { to_lower() })+ + replace@(match:",", replace:" and")+ + replace@(match:"^[SCTQXYZIWUBRG0-9/|]", in_context: "(^|[[:space:]])", replace: "&")+ + replace@(match:"^[A-Z]", replace: { to_lower() }) + long_dash := replace@(match:"-", replace:"—") + + # Converted mana cost + is_half_mana := match@(match: "1/2|[|][WUBRGS]") + is_colored_mana := match@(match: "[WUBRG]") + only_numbers := filter_text@(match: "^[0123456789]+") + cmc_split := break_text@(match: "(?ix) 1/2 | [|][WUBRG] | [0-9]+(?!/[WUBRGSCTQ2]) | [WUBRGS0-9](/[WUBRGS])\{0,4} ") + cmc := {to_number( + for each sym in cmc_split() do ( + numbers := only_numbers(sym) + if is_half_mana(sym) then 0.5 + else if numbers != "" then max(1, to_int(numbers)) + else 1 # all other symbols are 1 + )) + } + + colored_mana := {to_number( + for each sym in cmc_split() do ( + numbers := only_numbers(sym) + if is_colored_mana(sym) then + if is_half_mana(sym) then 0.5 else 1 + else 0 + )) + } + + ############################################################## The text box + + # 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 + ([ ]]*>[CTQSXYZIWUBRG0-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 + remove_tag@(tag: "") + + remove_tag@(tag: "") + + remove_tag@(tag: "{keyword}" + else keyword + if expand then " ({reminder})" } + ) + + # step 2b : move inline keywords' reminder text to the end of the line + replace@( + match: "(.*]*>)([^\n(]+)", + replace: "\\2\\1" + ) + + replace@( + match: "(.*]*>)([^\n(]+)", + replace: "\\2\\1" + ) + + replace@( + match: "(.*]*>)([^\n(]+)", + replace: "\\2\\1" + ) + + # step 3 : expand shortcut words ~ and CARDNAME + replace@( + match: "CARDNAME", + in_context: "(^|[[:space:]]|\\()", + replace: "" + ) + + # step 4 : fill in atom fields + tag_contents@( + tag: "", + contents: { if card.name=="" then "CARDNAME" else card.name } + ) + + # step 4.5 : explict non mana symbols + replace@( + match: "\\][SCTQXYZIWUBRG0-9/|]+\\[", + replace: {"" + mana_filter_t() + ""} ) + + # step 5 : add mana & tap symbols + replace@( + match: "[SCTQXYZIWUBRG0-9/|]+", + in_context: mana_context, + replace: {"" + mana_filter_t() + ""} ) + + # step 5b : add explict mana symbols + replace@( + match: "\\[[SCTQXYZIWUBRG0-9/|]+\\]", + replace: {"" + mana_filter_t() + ""} ) + + # step 7 : italic reminder text + replace@( + match: "[(][^)\n]*[)]?", + in_context: "(^|[[:space:]])|", + replace: "&") + + # step 8 : automatic capitalization, but not after "(" + replace@( + match: "[a-z]", + in_context: "[ ]*: |—| — ", + replace: { to_upper() }) + curly_quotes + + ############################################################## Other boxes + # the flavor text filter + # - makes all text italic + flavor_text_filter := + # step 1 : remove italic tags + remove_tag@(tag: "") + + # step 2 : surround by tags + { "" + input + "" } + + # curly quotes + curly_quotes + + # Process the name for sorting rules + sort_name := + # Remove "The", "A", and "And" at the beginning + replace@(match: "^(The|An?) ", replace: "") + + # Remove commas and apostrophes + replace@(match: "(,|'|’)", replace: "") + + # Remove bold and italic tags + replace@(match: "(|||)", replace: "") + + # Make lowercase + to_lower + + #Necessary to make magic-mana-future play nicely + colorless_color := { "c" } + + word_count := break_text@(match:"[^[:space:]]+") + length + + space_to_comma := replace@(match:"^[A-Z]", replace:",&") + remove_first_comma := replace@(match:"^[,]", replace:"") + all_planes := { + remove_first_comma( + for each card in set do + space_to_comma(to_text(card.subtype)) + ) + } + type_over_type := replace_rule(match:" ?-", replace:"") + plane_type_filter := + tag_remove_rule(tag: "{input}" } + +############################################################## 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: symbol + name: symbol + description: The symbol for this set, double click to edit +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, pseudo, 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: yes + description: Should card numbers be shown on the cards? +############################# Default style +default set style: + title: + padding left: 2 + font: + size: 16 + symbol: + max aspect ratio: 2.5 + variation: + name: common + border radius: 0.10 + fill type: solid + fill color: rgb(0,0,0) + border color: rgb(255,255,255) + variation: + name: uncommon + border radius: 0.07 + fill type: linear gradient + fill color 1: rgb(224,224,224) + fill color 2: rgb(84, 84, 84) + border color 1: rgb(0, 0, 0) + border color 2: rgb(0, 0, 0) + variation: + name: rare + border radius: 0.07 + fill type: linear gradient + fill color 1: rgb(214,196,94) + fill color 2: rgb(95, 84, 40) + border color 1: rgb(0, 0, 0) + border color 2: rgb(0, 0, 0) + variation: + name: mythic rare + border radius: 0.07 + fill type: linear gradient + fill color 1: rgb(245,148,31) + fill color 2: rgb(186,45,38) + border color 1: rgb(0, 0, 0) + border color 2: rgb(0, 0, 0) + variation: + name: special + border radius: 0.10 + 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) + automatic reminder text: + render style: checklist + direction: vertical +############################################################## 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 + description: The border of the card; can be any solid color +############################# 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 + description: The name of the card +############################# Image +card field: + type: image + name: image + show statistics: false + description: The image of the card +############################# Card type +card field: + type: text + name: supertype + description: The supertype of the card + default: "Plane" + script: type_over_type(value) +card field: + type: text + name: subtype + description: The subtype of the card + script: plane_type_filter(value) +card field: + type: text + name: type + show statistics: false + save value: false + script: + # Either just supertype, or subtype - supertype + combined_editor( + field1: card.supertype, + separator: " — ", + field2: card.subtype, + soft_before_empty: true, + hide_when_empty: true + ) + card list visible: true + card list column:2 + description: The type of this card, type - to go the subtype +card field: + type: choice + name: rarity + position hint: 100 + 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: + 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(value) + show statistics: false + multi line: true + description: The rules text of the card +card field: + type: text + name: flavor text + script: flavor_text_filter(value) + show statistics: false + multi line: true + description: The flavor text of the card +############################# PT +############################# Card sorting / numbering +card field: + type: text + name: card number + save value: false + script: + position( + of: card + in: set + order_by: { sort_name(card.name) } + ) + 1 + + "/" + + 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 + description: The illustrator of the image + icon: stats/illustrator.png +card field: + type: text + name: copyright + default: set.copyright + show statistics: false + 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) + description: The copyright and card number of the card +############################################################### Extra Statistics +statistics dimension: + name: keywords + position hint: 1000 + script: keyword_usage(unique:true) + show empty: false + split list: true + icon: stats/keywords.png +statistics dimension: + name: style + position hint: 1001 + script: stylesheet.short_name + icon: stats/stylesheet.png +statistics dimension: + name: text length (words) + position hint: 100 + script: word_count(to_text(card.rule_text)) + numeric: true + bin size: 5 + icon: stats/text_length.png +############################################################## Auto replace +# Do we need categories? +#auto replace category: text box +#auto replace category: copyright +#auto replace category: everywhere +auto replace: + match: (C) + replace: © +auto replace: + match: AE + replace: Æ + whole word: false +auto replace: + match: TM + replace: ™ + whole word: false +auto replace: + match: -- + replace: — +auto replace: + # note the spaces + match: + - + replace: + — +auto replace: + match: CIP + replace: enters the battlefield +auto replace: + match: AAA + replace: as an additional cost to cast +auto replace: + match: ~ + replace: CARDNAME +auto replace: + match: ' + replace: ’ +############################################################## Card pack items +pack type: + name: card + filter: card.name != "" +############################################################## Card packs +pack type: + name: booster pack + item: + name: card + amount: 1 +############################################################## Word lists +word list: + name: plane + word: + script: all_planes() + line below: true + word: + name: Main Planes + word: Alara + word: Dominaria + word: Kamigawa + word: Lorwyn + word: Meditation Plane + word: Mercadia + word: Mirrodin + word: Phyrexia + word: Rabiah + word: Rath + word: Ravnica + word: Serra's Realm + word: Shadowmoor + word: Shandalar + word: Ulgrotha + word: Wildfire + word: Zendikar + word: + name: Novel Planes + word: Aranzhur + word: Diraden + word: Kephalai + word: Regatha + word: Tavelia + word: + name: Pre-Revisionist + word: Azoria + word: Cabralin + word: Cridhe + word: Equilor + word: Ergamon + word: Gastal + word: Ilcae + word: Moag + word: Nether Void + word: Pyrulea + word: Segovia + word: Vatraquaz +############################################################## 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, Regenerate, etc.) +keyword mode: + name: expert + description: Expert level keywords (Scry, 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: [SCTQXYZI0-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}) + 0\} + 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}) + 0\} +# By pichoro and bunnierein +keyword parameter type: + name: cost + match: [ ][SCTQXYZI0-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})\} +keyword parameter type: + name: action + match: [^(:\n]+ + separator after is: [.] + reminder script: alternative_cost() +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})\} +keyword parameter type: + name: prefix + description: Prefix for things like "walk" + optional: false + match: [A-Z][A-Z,a-z’ ]* + example: Forest +keyword parameter type: + name: a + match: [ ]*|[ an?]* +############################# All Magic keywords +# By JrEye and Neko_Asakami, Updated by Pichoro and Buttock1234 +keyword: + keyword: Flying + match: flying + mode: core + reminder: It can’t be blocked except by creatures with flying or reach. +keyword: + keyword: First strike + match: first strike + mode: core + reminder: It deals combat damage before creatures without first strike. +keyword: + keyword: Trample + match: trample + mode: core + reminder: If it would deal enough combat damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker. +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: core + reminder: This creature is unblockable 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: core + reminder: It can’t be blocked, targeted, dealt damage, enchanted, or equipped by anything {english_singular(param1)}. +keyword: + keyword: Regeneration + match: Regenerate + mode: core + reminder: The next time it would be destroyed this turn, it isn’t. If it is a creature, instead tap it, remove all damage from it, and remove it from combat. +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 it becomes blocked, it gets +{param1}/+{param1} until end of turn for each creature blocking it beyond the first. +keyword: + keyword: Cumulative upkeep + match: cumulative upkeep cost + mode: old + reminder: At the beginning of your upkeep, put an age counter on it, then sacrifice it unless you pay its upkeep cost for each age counter on it. +keyword: + keyword: Phasing + match: phasing + mode: old + reminder: It 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 the creature, the blocking creature gets -1/-1 until end of turn. +keyword: + keyword: Shadow + match: shadow + mode: expert + reminder: It can block or be blocked by only creatures with shadow. +keyword: + keyword: Denimwalk + match: denimwalk + mode: old + reminder: If defending player is wearing any clothing made of denim, the creature is unblockable. +keyword: + keyword: Buyback + match: buyback cost + mode: expert + reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you cast it. If you do, put it into your hand as it resolves. +keyword: + keyword: Echo + match: echo cost + mode: expert + reminder: At the beginning of your upkeep, if the permanent 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 it: Draw a card. +keyword: + keyword: Haste + match: haste + mode: core + reminder: It can attack and T as soon as it comes under your control. +keyword: + keyword: Horsemanship + match: horsemanship + mode: old + reminder: It can’t be blocked except by creatures with horsemanship. +keyword: + keyword: Fading + match: fading number + mode: expert + reminder: It 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. +keyword: + keyword: Kicker + match: kicker cost + mode: expert + reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you cast the card. +keyword: + keyword: Flashback + match: flashback cost + mode: expert + reminder: You may cast it 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. +keyword: + keyword: Madness + match: madness cost + mode: expert + reminder: If you discard it, you may cast it for its madness cost instead of putting it into your graveyard. +keyword: + keyword: Morph + match: morph cost + mode: expert + reminder: You may cast it 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: It can’t be blocked except by artifact creatures and/or black creatures. +keyword: + keyword: Amplify + match: amplify number + mode: expert + reminder: As it enters the battlefield, put {english_number_a(param1)} +1/+1 counter(s) on it for each creature that shares a type with it that you reveal in your hand. +keyword: + keyword: Double strike + match: double strike + mode: core + reminder: It deals both first-strike and regular combat damage. +keyword: + keyword: Provoke + match: provoke + mode: expert + reminder: When it attacks, you may have target creature defending player controls untap and block it if able. +keyword: + keyword: Typecycling + match: prefixcycling cost + mode: expert + reminder: {param2}, Discard it: 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 it, copy it for each spell cast before it this turn. You may choose new targets for the copies. +keyword: + keyword: Affinity for + match: affinity for name + mode: expert + reminder: It 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: Imprint — When it enters the battlefield, you may exile a [something] from [somewhere]. +keyword: + keyword: Modular + match: modular number + mode: expert + reminder: It enters the battlefield 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: + To scry {param1}, look at the top { + if param1.value==1 then "card of your library, then you may put that card on the bottom of your library." + else "{english_number(param1)} cards of your library. Put any number of them on the bottom of your library in any order and the rest on top in any order." + } +keyword: + keyword: Sunburst + match: sunburst + mode: expert + reminder: It enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. If it isn’t a creature, use charge counters instead. +keyword: + keyword: Art rampage + match: art rampage number + mode: expert + reminder: Whenever it 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: It may attack the turn before you cast it. (You may have it 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 its 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. +keyword: + keyword: Splice + match: splice onto name cost + mode: expert + reminder: As you cast a {param1} spell, you may reveal the card from your hand and pay its splice cost. If you do, add its effects to that spell. +keyword: + keyword: Bushido + match: bushido number + mode: expert + reminder: When it blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn. +keyword: + keyword: Soulshift + match: soulshift number + mode: expert + reminder: When it is put into a graveyard from the battlefield, 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 the card. The card enters the battlefield attached to that {param1}. +keyword: + keyword: Vigilance + match: vigilance + mode: core + reminder: Attacking doesn’t cause it to tap. +keyword: + keyword: Defender + match: defender + mode: core + reminder: It can’t attack. +keyword: + keyword: Offering + match: prefix offering + mode: expert + reminder: You may cast it any time you could cast an instant by sacrificing a {param1} and paying the difference in mana costs between it 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: That card enters the battlefield from your hand tapped and attacking. +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 the card except for its epic ability. If it has any targets, you may choose new targets for the copy. +keyword: + keyword: Channel + match: Channel + mode: pseudo + rules: Channel — [cost], Discard a card: [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]. +keyword: + keyword: Convoke + match: convoke + mode: expert + reminder: Each creature you tap while casting the card reduces its cost by 1 or by one mana of that creature’s color. +keyword: + keyword: Transmute + match: transmute cost + mode: expert + reminder: {param1}, Discard it: Search your library for a card with the same converted mana cost as the discarded card, reveal it, and put it into your hand. Then shuffle your library. Activate 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 the 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]. +keyword: + keyword: Haunt + match: haunt + mode: expert + reminder: When it is put into a graveyard from the battlefield, or when it resolves if it is not a permanent, exile it haunting target creature. +keyword: + keyword: Bloodthirst + match: bloodthirst number + mode: expert + reminder: If an opponent was dealt damage this turn, the 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 it, copy it for each time you paid its replicate cost. You may choose new targets for the copies. +keyword: + keyword: Graft + match: graft number + mode: expert + reminder: It enters the battlefield with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever a creature enters the battlefield, you may move a +1/+1 counter from the permanent onto it. +keyword: + keyword: Forecast + match: forecast — action, Reveal name from your hand: action + mode: expert + reminder: Activate the 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. +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 the card from your graveyard to your hand. Otherwise, exile this card. +keyword: + keyword: Ripple + match: ripple number + mode: expert + reminder: When you cast it, 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 the card without paying their mana costs. Put the rest on the bottom of your library. +keyword: + keyword: Flash + match: flash + mode: core + reminder: You may cast it any time you could cast an instant. +keyword: + keyword: Split second + match: split second + mode: expert + reminder: As long as it is on the stack, players can’t cast spells or activate abilities that aren’t mana abilities. +keyword: + keyword: Suspend + match: suspend numbercost + mode: expert + reminder: Rather than cast it from your hand, you may 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 it is a creature, it has haste. +keyword: + keyword: Vanishing + match: vanishing number + mode: expert + reminder: It 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. +keyword: + keyword: Deathtouch + match: deathtouch + mode: expert + reminder: Creatures dealt damage by it are destroyed. You can divide its combat damage among any of the creatures blocking or blocked by it. +keyword: + keyword: Reach + match: reach + mode: core + reminder: It can block creatures with flying. +keyword: + keyword: Gravestorm + match: gravestorm + mode: expert + reminder: When you cast it, copy it for each permanent put into a graveyard this turn. You may choose new targets for the copies. +keyword: + keyword: Lifelink + match: lifelink + mode: core + reminder: Damage dealt by it also causes you to gain that much life. +keyword: + keyword: Absorb + match: absorb number + mode: expert + reminder: If a source would deal damage to it, prevent {param1} of that damage. +keyword: + keyword: Fateseal + match: fateseal number + mode: expert + reminder: + 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 it: Search your library for a creature card with the same converted mana cost as the sacrificed card and have that card enter the battlefield. Then shuffle your library. Activate only as a sorcery. +keyword: + keyword: Aura swap + match: aura swap cost + mode: expert + reminder: {param1}: Exchange it with an Aura card in your hand. +keyword: + keyword: Frenzy + match: frenzy number + mode: expert + reminder: Whenever it attacks and isn’t blocked, it gets +{param1}/+0 until end of turn. +keyword: + keyword: Delve + match: delve + mode: expert + reminder: You may exile any number of cards in your graveyard as you cast it. It costs 1 less to cast for each card exiled this way. +keyword: + keyword: Poisonous + match: poisonous number + mode: expert + reminder: Whenever it 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: It 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. It enters the battlefield unattached and stays in the battlefield if the land exits the battlefield. +keyword: + keyword: Grandeur + match: Grandeur + mode: pseudo + rules: Grandeur — Discard another card named [something]: [effect]. +keyword: + keyword: Evoke + match: evoke cost + mode: expert + reminder: You may cast it for its evoke cost. If you do, it’s sacrificed when it enters the battlefield. +keyword: + keyword: Champion + match: championaname + mode: expert + reminder: When it enters the battlefield, sacrifice it unless you exile another {param2} you control. When it exits the battlefield, return that card to the battlefield. +keyword: + keyword: Clash + match: clash + mode: expert + 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: It is every creature type at all times. +keyword: + keyword: Hideaway + match: hideaway + mode: expert + reminder: The 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. +keyword: + keyword: Prowl + match: prowl cost + mode: expert + reminder: You may cast it for its prowl cost if you dealt combat damage to a player this turn with a creature that shares a type with it. +keyword: + keyword: Reinforce + match: reinforce numbercost + mode: expert + reminder: {param2}, Discard it: 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 it, you may reveal it. If you do, [effect]. +keyword: + keyword: Persist + match: persist + mode: expert + reminder: When it is put into a graveyard from the battlefield, 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: It deals damage to creatures in the form of -1/-1 counters. +keyword: + keyword: Conspire + match: conspire + mode: expert + reminder: As you cast it, you may tap two untapped creatures you control that share a color with it. When you do, copy it and you may choose a new target for the copy. +keyword: + keyword: Retrace + match: retrace + mode: expert + reminder: You may cast it 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]. +keyword: + keyword: Unearth + match: unearth cost + mode: expert + reminder: {param1}: Return it from your graveyard to the battlefield. If it is a creature, it gains haste. Exile it at the beginning of the end step or if it would exit the battlefield. Unearth only as a sorcery. +keyword: + keyword: Devour + match: devour number + mode: expert + reminder: As it enters the battlefield, you may sacrifice any number of creatures. It 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. +keyword: + keyword: Domain + match: Domain + mode: pseudo + rules: Domain — [effect] for each basic land type among lands you control. +keyword: + keyword: Cascade + match: cascade + mode: expert + reminder: When you cast it, exile the top card of your library until you remove a nonland card that costs less. You may cast that card without paying its mana cost. Put the exiled cards on the bottom of your library at random. +keyword: + keyword: Intimidate + match: intimidate + mode: core + reminder: It can’t be blocked except by artifact creatures and/or creatures that share a color with it. diff --git a/data/planechase.mse-game/stats/illustrator.png b/data/planechase.mse-game/stats/illustrator.png new file mode 100644 index 00000000..be298035 Binary files /dev/null and b/data/planechase.mse-game/stats/illustrator.png differ diff --git a/data/planechase.mse-game/stats/keywords.png b/data/planechase.mse-game/stats/keywords.png new file mode 100644 index 00000000..12ec4d97 Binary files /dev/null and b/data/planechase.mse-game/stats/keywords.png differ diff --git a/data/planechase.mse-game/stats/stylesheet.png b/data/planechase.mse-game/stats/stylesheet.png new file mode 100644 index 00000000..141c5f30 Binary files /dev/null and b/data/planechase.mse-game/stats/stylesheet.png differ diff --git a/data/planechase.mse-game/stats/text_length.png b/data/planechase.mse-game/stats/text_length.png new file mode 100644 index 00000000..1fe873ca Binary files /dev/null and b/data/planechase.mse-game/stats/text_length.png differ