Commit e524dc86 authored by twanvl's avatar twanvl

The magic game file was getting way too long, so I split it into several files.

As a bonus the keywords and perhaps other reusable parts can now be used by vanguard with "include file: /magic.mse-game/keywords".
parent 8e590ab3

############################################################## 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: comes into play
auto replace:
match: AAA
replace: as an additional cost to play
auto replace:
match: @
replace: LEGENDNAME

############################################################## 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: shifted
choice: rulestip
script: 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") 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)
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(value)
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
############################# 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
editable: false
script: super_type_filter(value)
card field:
type: text
name: sub type
icon: stats/creature_type.png
position hint: 31
script: sub_type_filter(value, type:card.super_type)
editable: false
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: " — ",
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: "<line>\n</line>", 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
############################# 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: "/",
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
############################# 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)
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: 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: 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
editable: false
show statistics: false
script: super_type_filter(value)
card field:
type: text
name: sub type 2
icon: stats/creature_type.png
editable: false
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: " — ",
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: 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: 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: "<line>\n</line>", 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: 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: "/",
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: 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
...@@ -5,1207 +5,25 @@ installer group: magic/game files ...@@ -5,1207 +5,25 @@ installer group: magic/game files
icon: card-back.png icon: card-back.png
position hint: 01 position hint: 01
version: 2008-08-05 version: 2008-08-06
depends on: depends on: magic-blends.mse-include 2007-09-23
package: magic-blends.mse-include depends on: magic-watermarks.mse-include 2007-09-23
version: 2007-09-23
depends on:
package: magic-watermarks.mse-include
version: 2007-09-23
############################################################## Functions & filters ############################################################## The script
# General functions init script: include file: script
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: "(^|[^/])<match>($|[^/])",
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: "<TQ>")
mana_filter_t := replace@( # Remove [] used for forcing mana symbols
match: "[\\[\\]]",
replace: ""
) + { tap_filter() + mana_filter() }
############################################################## Determine card color
# Names of colors
color_name := {
if input = "W" then "white"
else if input = "U" then "blue"
else if input = "B" then "black"
else if input = "R" then "red"
else if input = "G" then "green"
else ""
}
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_filter := sort_text@(order: "<WUBRG>")
color_filterH := sort_text@(order: "</>")
mana_to_color := {
count := number_of_items(in: colors)
if hybrid == "" then
# not a hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if set.set_info.use_gradient_multicolor == "no" then "multicolor" # stop here
else if count == 2 then color_names_2() + ", multicolor"
else if set.set_info.use_gradient_multicolor != "yes" then "multicolor" # stop here
else if count == 3 then color_names_3() + ", multicolor"
else if count == 4 then color_names_4() + ", multicolor"
else if count == 5 then color_names_5() + ", multicolor"
else "multicolor"
else
# hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if count == 2 then color_names_2() + ", hybrid"
else if count == 3 then color_names_3() + ", hybrid"
else "multicolor"
}
# color based on land text box, input = textbox contents
color_text_filter :=
# remove activation costs
replace@(
match: "<sym[^>]*>[^<]+</sym[^>]*>"
in_context: "(?ix) (\\n|^)[^:]*<match>(,|:) | (pays?|additional|costs?)[ ]<match>",
replace: ""
) +
# keep only mana
filter_text@(match: "<sym[^>]*>([^<]+)") + color_filter;
# get the land frame for a "WUBRG"-style input.
land_multicolor := {
count := number_of_items(in: colors)
if count == 0 then "land"
else if count == 1 then color_names_1() + ", land"
else if count == 2 then color_names_2() + ", land"
else if count == 3 then color_names_3() + ", land"
else "land, multicolor"
}
land_to_color := {
# Based on watermark
if watermark = "mana symbol white" then "white, land"
else if watermark = "mana symbol blue" then "blue, land"
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))
};
# 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 (
text := filter_text(match: regex_escape(card_name)+"(</[-a-z]+>)? is (colorless|all colors|((blue|white|green|red|black)((,|,? and) (blue|white|green|red|black))*))\\.")
if text != "" then (
if contains(text, match: "all colors") then (
colors := "WUBRG"
if land = "land" 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: "")
)
)
)
}
# The color of a card
is_creature := match@(match: "(?i)Creature")
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")
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)
else if mana_color == "colorless" and is_artifact(type) then "artifact"
else mana_color
)
else text_color
};
# Number of colors in a card_color
card_color_color_count := count_chosen@(choices: "white,blue,black,red,green,artifact")
# Clean up color field
card_color_filter := {
colors := card_color_color_count()
if colors > 2 then
input := remove_choice(choice: "overlay")
if colors > 1 then (
input := require_choice(choices: "multicolor, hybrid, land, artifact")
input := exclusive_choice(choices: "multicolor, hybrid")
input := require_exclusive_choice(choices: "horizontal, vertical, radial, overlay")
) else
input := remove_choice(choices: "radial, horizontal, vertical, overlay, hybrid, reversed")
if chosen(choice:"overlay") then
input := remove_choice(choice: "reversed")
input
}
# needed by all style files anyway
include file: /magic-blends.mse-include/new-blends
############################################################## Card number
# Index for sorting, white cards are first, so white->A, blue->B, .. ,
# The code consists of 4 parts:
# normal/token, color, shifted, split
sort_index := {
(if contains(card.shape, match:"token") then "T" else " ") + # Tokens come last
color_of_card() +
(if contains(card.shape, match:"shifted") then "S" else " ") + # planeshifted cards come after normal ones
(if contains(card.shape, match:"split") then "S" else " ") + # split cards come after normal ones
":"
}
# Process the name for sorting rules (specifically, remove "The", "A", and "And" at the beginning, and make lowercase)
sort_name :=
replace@(match: "^(The|An?) ", replace: "") +
to_lower
is_multicolor := { chosen(choice: "multicolor") and input != "artifact, multicolor" }
is_null_cost := { input == "" or input == "0" }
is_hybrid_cost := { contains(card.casting_cost, match: "W/") or contains(card.casting_cost, match: "U/") or contains(card.casting_cost, match: "B/") or contains(card.casting_cost, match: "R/") or contains(card.casting_cost, match: "G/") }
basic_land_sort := {
if contains(card.name, match:"Plains") then "LB" # Plains
else if contains(card.name, match:"Island") then "LC" # Islands
else if contains(card.name, match:"Swamp") then "LD" # Swamps
else if contains(card.name, match:"Mountain") then "LE" # Mountains
else if contains(card.name, match:"Forest") then "LF" # Forests
else "LA" # other basic lands
}
hybrid_cost_sort := {
colors := sort_text(casting_cost, order: "<WUBRG>")
if colors = "WU" then "GA"
else if colors = "WB" then "GB"
else if colors = "UB" then "GC"
else if colors = "UR" then "GD"
else if colors = "BR" then "GE"
else if colors = "BG" then "GF"
else if colors = "RG" then "GG"
else if colors = "WR" then "GH"
else if colors = "WG" then "GI"
else if colors = "UG" then "GJ"
else "GK"
}
color_of_card := {
card_color := card.card_color
casting_cost := card.casting_cost
if card.shape == "split" and
card_color != card.card_color_2 then "H" # Diff Color Splits
else if chosen(choice: "land", card_color) then (
if card.rarity != "basic land" then "K" # Nonbasic Land
else basic_land_sort()
) else if is_null_cost(casting_cost) then (
if chosen(choice: "hybrid", card_color) then "GK" # Hybrids
else if is_multicolor(card_color) then "F" # Multicolor
else if chosen(choice:"white", card_color) then "A" # White
else if chosen(choice:"blue", card_color) then "B" # Blue
else if chosen(choice:"black", card_color) then "C" # Black
else if chosen(choice:"red", card_color) then "D" # Red
else if chosen(choice:"green", card_color) then "E" # Green
else "I" # Colorless / Artifact
) else (
# use the casting cost
colors := sort_text(casting_cost, order: "<WUBRG>")
if colors == "" then "I" # Colorless / Artifact
else if colors == "W" then "A" # White
else if colors == "U" then "B" # Blue
else if colors == "B" then "C" # Black
else if colors == "R" then "D" # Red
else if colors == "G" then "E" # Green
else if is_hybrid_cost() then hybrid_cost_sort() #Hybrid
else if contains(casting_cost, match:"/") and contains(card_color, match:"artifact") then "I" # Colorless/Artifact
else "F" # Multicolor
)
}
rarity_sort := {
if set.sort_special_rarity == "with the rest" or card.rarity != "special" then " " else "S"
}
set_filter := {
if set.sort_special_rarity != "separate numbering" then nil
else if card.rarity == "special" then { card.rarity == "special" }
else { card.rarity != "special" }
}
card_number := {
position (
of: card
in: set
order_by: { rarity_sort() + sort_index() + sort_name(card.name) }
filter: set_filter()
) + 1
}
card_count := {
number_of_items(in: set, filter: set_filter())
}
############################################################## Utilities for keywords
# replaces — correctly
add := "" # default is nothing
separate_words := remove_tags + trim + replace@(match:" ", replace: {spacer})
for_mana_costs := format_cost := {
if input.separator_before == "—" and contains(input.param, match: " ") then (
if contains(input.param, match:",") then (
if match(match: "^[STQXYZIWUBRG0-9/|]+,", input.param) then
"{add}<param-cost>{combined_cost(input.param)}</param-cost>"
else "<param-cost>{combined_cost(input.param)}</param-cost>"
) else
"<param-cost>{alternative_cost(input.param)}</param-cost>"
) else
"{add}<param-mana>{input.param}</param-mana>"
}
alternative_cost := replace@(match:"^[A-Z]", replace: { to_lower() })
combined_cost := replace@(match:", [A-Z]", replace: { to_lower() })+
replace@(match:",", replace:" and")+
replace@(match:"^[STQXYZIWUBRG0-9/|]", in_context: "(^|[[:space:]])<match>", replace: "<sym-auto>&</sym-auto>")+
replace@(match:"^[A-Z]", replace: { to_lower() })
long_dash := replace@(match:"-", replace:"—")
# Utilities for keywords
has_cc := { card.casting_cost != "" }
has_pt := { card.pt != "" }
contains_target := match@(match:"(?i)([^a-z]|^)target([^a-z]|$)")
is_targeted := { contains_target(card.rule_text) }
############################################################## 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
( <match>: # G: something
| <match>, # G, tap: something
| <match>[ ]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
([ ]<sym[^>]*>[STQXYZIWUBRG0-9/|]+</sym[^>]*>,)* # pay X, Y or Z
([ ]<sym[^>]*>[STQXYZIWUBRG0-9/|]+</sym[^>]*>[ ](and|or|and/or))* # pay X or Y
[ ]<match>
([,.)]|$ # (end of word)
|[ ][^ .,]*$ # still typing...
|[ ]( or | and | in | less | more | to ) # or next word is ...
)
)
| <param-mana><match></param-mana> # keyword argument that is declared as mana
| <param-cost>[ ]*<match></param-cost> # keyword argument that is declared as cost
| <param-cost><match>, # keyword argument that is declared as cost
";
# truncates the name of legends
legend_filter := replace@(match:", [A-Z,a-z,Æ,0-9,' ]*", replace: "" )+
replace@(match:" of [A-Z,a-z,Æ,0-9,' ]*", replace: "" )+
replace@(match:" the [A-Z,a-z,Æ,0-9,' ]*", replace: "" )
# the rule text filter
# - adds mana symbols
# - makes text in parentheses italic
text_filter :=
# step 1 : remove all automatic tags
remove_tag@(tag: "<sym-auto>") +
remove_tag@(tag: "<i-auto>") +
# step 2 : reminder text for keywords
expand_keywords@(
default_expand: { chosen(choice:mode, set.automatic_reminder_text) },
combine: {
if mode == "pseudo" then "<i-auto>{keyword}</i-auto>"
else "{keyword}<atom-reminder-{mode}> ({process_english_hints(reminder)})</atom-reminder-{mode}>" }
) +
# step 2b : move action keywords' reminder text to the end of the line
replace@(
match: "(<atom-reminder-action>(?:(?!<kw-).)*</atom-reminder-action></kw[^>]*>)(((?!<atom-reminder| ?<kw-)[^\n(])+)",
replace: "\\2\\1"
) +
# step 2c : remove duplicate reminder text
replace@(
match: "(<atom-reminder-[^>]*>[^)]+[)]</atom-reminder-[^>]*>)([^\n]+)\\1"
replace: "\\2\\1"
) +
# step 3a : expand shortcut words ~ and CARDNAME
replace@(
match: "~|~THIS~|CARDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-cardname></atom-cardname>"
) +
# step 3b : expand shortcut words ` and shortened LEGENDNAME
replace@(
match: "LEGENDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-legname></atom-legname>"
) +
# step 3c : fill in atom fields
tag_contents@(
tag: "<atom-cardname>",
contents: { if card_name=="" then "CARDNAME" else card_name }
) +
tag_contents@(
tag: "<atom-legname>",
contents: { if card_name=="" then "LEGENDNAME" else legend_filter(card_name) }
) +
# step 4 : explict non mana symbols
replace@(
match: "\\][STQXYZIWUBRG0-9/|]+\\[",
replace: {"<nosym>" + mana_filter_t() + "</nosym>"} ) +
# step 5 : add mana & tap symbols
replace@(
match: "[STQXYZIWUBRG0-9/|]+",
in_context: mana_context,
replace: {"<sym-auto>" + mana_filter_t() + "</sym-auto>"} ) +
# step 5b : add explict mana symbols
replace@(
match: "\\[[STQXYZIWUBRG0-9/|]+\\]",
replace: {"<sym>" + mana_filter_t() + "</sym>"} ) +
# step 7 : italic reminder text
replace@(
match: "[(]([^)\n]|[(][^)\n]*[)])*[)]?",
in_context: "(^|[[:space:]])<match>|<atom-keyword><match></",
replace: "<i-auto>&</i-auto>") +
# step 8 : automatic capitalization
replace@(
match: "[a-z]",
in_context: "[(](<param-[a-z]*>)?<match>[^)]|[ ]*: <param-cost><match>|—<match>| — <match>",
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: "<i-flavor>") +
# step 2 : surround by <i> tags
{ "<i-flavor>" + input + "</i-flavor>" } +
# curly quotes
curly_quotes
# Move the cursor past the separator in the p/t and type boxes
type_over_pt := replace@(match:"/$", replace:"")
type_over_type := replace@(match:" ?-$", replace:"")
super_type_filter :=
remove_tag@(tag: "<word-list-") +
type_over_type +
{ "<word-list-type>{input}</word-list-type>" }
space_to_wltags := replace@(match:"( +|<soft> </soft>)",
replace:{"</word-list-{list_type}>{_1}<word-list-{list_type}>"})
sub_type_filter :=
remove_tag@(tag: "<word-list-") +
replace@(match: " </soft>$", replace: "") + # remove trailing soft space
remove_tag@(tag: "<soft") +
{ list_type := if is_creature(type) then "class"
else if is_land(type) then "land"
else if is_artifact(type) then "artifact"
else if is_enchantment(type) then "enchantment"
else if is_spell(type) then "spell"
if is_creature(type) or is_tribal(type) then (
first := "<word-list-race>{ only_first(input) }</word-list-race>"
next := only_next(input)
if input == "" then list_type := "" # only edit the race
else if next == "" then first := first + "<soft> </soft>"
else first := first + " "
input := next
) else (
first := ""
)
if list_type != "" then (
if input != "" then input := input + "<soft> </soft>" # Add a new box at the end
first + "<word-list-{list_type}>{ space_to_wltags(input) }</word-list-{list_type}>"
) else first + input
}
# all sub types, for word list
space_to_comma := replace@(match:" ", replace:",")
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))
}
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))
}
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)))
}
# Shape of cards, can be changed in style files
card_shape := { "normal" }
typesymbol_for :=
to_text +
replace@(match: "(Legendary|Basic|Snow|World| )", replace: "") +
{ if input == "Creature" then "creature"
else if input == "Sorcery" then "sorcery"
else if input == "Instant" then "instant"
else if input == "Artifact" then "artifact"
else if input == "Enchantment" then "enchantment"
else if input == "Land" then "land"
else if input == "Planeswalker" then "planeswalker"
else "multitype"
}
typesymbol_type := { typesymbol_for(card.super_type) }
#Script to make magic-mana-future compatible w/ other templates
colorless_color := { "c" }
############################################################## Statistics utilities
# 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]+(?!/[WUBRGSTQ2]) | [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( ############################################################## Lots of lists
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
))
}
primary_card_color := {
artifact := chosen(choice:"artifact")
land := chosen(choice:"land")
multi := chosen(choice:"multicolor")
hybrid := chosen(choice:"hybrid")
if land then "land"
else if multi and input != "artifact, multicolor" then "multicolor"
else if hybrid then "hybrid"
else if artifact then "artifact"
else input
}
word_count := break_text@(match:"[^[:space:]]+") + length
# TODO : somewhere else?
#card to conversion:
# name: MTGnews.com forums
# script:
# "[b]" + card.name + "[/b]\n" +
# card.sub_type + " - " + card.super_type + "\n" +
# card.rules_text + "\n"
# card.pt + "\n"
# "[i]" + card.flavor_text + "[/i]"
############################################################## Set fields
set field:
type: info
name: Set Information
set field:
type: text
name: title
identifying: true
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: action
choice: custom
initial: old, core, expert, pseudo, action, 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
description: Should card numbers be shown on the cards?
set field:
type: choice
name: sort special rarity
description: Determines how cards with special rarity are sorted.
choice: with the rest
choice: after other cards
choice: separate numbering
initial: after other cards
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: choice
name: use gradient multicolor
choice: yes
choice: only for two color cards
choice: no
description: Use gradients on multicolor cards by default, you can always change it be clicking on the card border.
initial: no
############################# 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(255, 160, 40)
fill color 2: rgb(202, 49, 35)
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
sort special rarity:
render style: both
choice images:
with the rest: /magic.mse-game/icons/number_cards_mixed.png
after other cards: /magic.mse-game/icons/number_cards_after.png
separate numbering: /magic.mse-game/icons/number_cards_separate.png
use gradient multicolor:
render style: both
choice images:
yes: script: built_in_image("bool_yes")
no: script: built_in_image("bool_no")
############################################################## 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: shifted
choice: rulestip
script: 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") 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)
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(value)
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
############################# 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
editable: false
script: super_type_filter(value)
card field:
type: text
name: sub type
icon: stats/creature_type.png
position hint: 31
script: sub_type_filter(value, type:card.super_type)
editable: false
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: " — ",
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: "<line>\n</line>", 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
############################# 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: "/",
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 include file: card_fields
card field: include file: set_fields
type: text include file: statistics
name: card number include file: packs
save value: false include file: keywords
script: card_number() + "/" + card_count() include file: word_lists
sort script: rarity_sort() + card.card_number include file: auto_replace
card list visible: true
card list column: 10
card list width: 50
card list name: #
card list alignment: right
editable: false
show statistics: false
############################# Copyright stuff ############################################################## Other 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)
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: 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: 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
editable: false
show statistics: false
script: super_type_filter(value)
card field:
type: text
name: sub type 2
icon: stats/creature_type.png
editable: false
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: " — ",
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: 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: 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: "<line>\n</line>", 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: 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: "/",
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: 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 list
card list color script: card list color script:
input := card.card_color input := card.card_color
...@@ -1225,1308 +43,3 @@ card list color script: ...@@ -1225,1308 +43,3 @@ card list color script:
else if artifact then rgb(72,90,100) # artifact else if artifact then rgb(72,90,100) # artifact
else rgb(119,83,83) # colorless else rgb(119,83,83) # colorless
) )
############################################################## Statistics categories
statistics dimension:
name: card color
position hint: 0
script: primary_card_color(card.card_color)
icon: stats/card_color.png
colors:
white : rgb(255,237,202)
blue : rgb(42,141,255)
black : rgb(33,33,33)
red : rgb(255,52,0)
green : rgb(118,230,0)
colorless : rgb(120,90,90)
artifact : rgb(185,192,199)
multicolor : rgb(255,188,14)
land : rgb(109,62,39)
hybrid : rgb(201,12,230)
group: white
group: blue
group: black
group: red
group: green
group: colorless
group: artifact
group: multicolor
group: land
group: hybrid
statistics dimension:
position hint: 2
name: converted mana cost
script: cmc(card.casting_cost)
numeric: true
icon: stats/casting_cost.png
statistics dimension:
position hint: 3
name: colored mana cost
script: colored_mana(card.casting_cost)
numeric: true
icon: stats/colored_casting_cost.png
statistics dimension:
position hint: 50
name: power
script: card.power
numeric: true
icon: stats/power.png
statistics dimension:
position hint: 51
name: toughness
script: card.toughness
numeric: true
icon: stats/toughness.png
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
statistics dimension:
name: race
position hint: 32
icon: stats/creature_type.png
description: Race of creatures and tribal cards
script:
if is_creature(card.super_type) or is_tribal(card.super_type) then
only_first(card.sub_type)
show empty: false
statistics dimension:
name: creature class
position hint: 33
icon: stats/creature_type.png
description: Class of creature cards
script:
if is_creature(card.super_type) then
space_to_comma(trim(remove_tags(only_next(card.sub_type))))
show empty: false
split list: true
statistics category:
name: color / rarity
position hint: 101
type: stack
icon: stats/color_rarity.png
dimension: card color
dimension: rarity
statistics category:
name: power / toughness
position hint: 52
type: scatter pie
icon: stats/pt.png
dimension: power
dimension: toughness
dimension: rarity
#statistics category:
# name: color / cost
# type: scatter
# dimension: card color
# dimension: converted mana cost
statistics category:
name: color / cost
position hint: 4
type: scatter pie
icon: stats/color_cost.png
dimension: card color
dimension: converted mana cost
dimension: rarity
statistics category:
name: color / colored cost
position hint: 5
icon: stats/color_colored_cost.png
type: scatter
dimension: card color
dimension: colored mana cost
statistics category:
name: cost / colored cost
position hint: 6
icon: stats/cost_colored_cost.png
type: scatter pie
dimension: converted mana cost
dimension: colored mana cost
dimension: card color
statistics category:
name: creature race / class
position hint: 34
icon: stats/creature_type.png
type: scatter pie
dimension: race
dimension: creature class
dimension: card color
############################################################## Word lists
word list:
name: type
word:
name: Basic
is prefix: true
word:
name: Legendary
is prefix: true
word:
name: Tribal
is prefix: true
word:
name: Snow
is prefix: true
word:
name: World
is prefix: true
line below: true
word: Creature
word: Artifact
word: Artifact Creature
word: Enchantment
word: Instant
word: Sorcery
word: Land
word: Planeswalker
## TODO: Make the alphabetical sublists actually work.
word list:
name: race
word:
script: all_races()
line below: true
word: Angel
word: Beast
word: Bird
word: Construct
word: Demon
word: Dragon
word: Drake
word: Elemental
word: Elf
word: Faerie
word: Giant
word: Goblin
word: Golem
word: Human
word: Illusion
word: Merfolk
word: Treefolk
word: Zombie
word:
name: All Races
word:
name: A
word: Angel
word: Anteater
word: Antelope
word: Ape
word: Archon
word: Assembly-Worker
word: Atog
word: Aurochs
word: Avatar
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: Cat
word: Centaur
word: Cephalid
word: Chimera
word: Cockatrice
word: Construct
word: Crab
word: Crocodile
word: Cyclops
word:
name: D
word: Dauthi
word: Demon
word: Devil
word: Djinn
word: Dragon
word: Drake
word: Dreadnought
word: Dryad
word: Dwarf
word:
name: E
word: Efreet
word: Egg
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: Giant
word: Gnome
word: Goat
word: Goblin
word: Golem
word: Gorgon
word: Graveborn
word: Griffin
word:
name: H
word: Hag
word: Harpy
word: Hellion
word: Hippo
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: Jellyfish
word: Juggernaut
word:
name: K
word: Kavu
word: Kirin
word: Kithkin
word: Kobold
word: Kor
word: Kraken
word:
name: L
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: Mongoose
word: Moonfolk
word: Mutant
word: Myr
word:
name: N
word: Nautilus
word: Nephilim
word: Nightmare
word: Nightstalker
word: Noggle
word:
name: O
word: Octopus
word: Ogre
word: Ooze
word: Orb
word: Orc
word: Orgg
word: Ouphe
word: Ox
word: Oyster
word:
name: P
word: Pegasus
word: Pentavite
word: Pest
word: Phelddagrif
word: Phoenix
word: Pincher
word: Plant
word: Prism
word:
name: R
word: Rabbit
word: Rat
word: Reflection
word: Rhino
word:
name: S
word:
name: Sa-Sl
word: Salamander
word: Sand
word: Saproling
word: Satyr
word: Scarecrow
word: Scorpion
word: Serpent
word: Shade
word: Shapeshifter
word: Sheep
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:
name: T
word: Tetravite
word: Thalakos
word: Thopter
word: Thrull
word: Treefolk
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: 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: Advisor
word: Archer
word: Artificer
word: Assassin
word: Beast
word: Cleric
word: Druid
word: Knight
word: Mutant
word: Rogue
word: Scout
word: Shaman
word: Soldier
word: Warrior
word: Wizard
word: Zombie
word:
name: All Classes
word:
name: A-C
word: Advisor
word: Archer
word: Archon
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: Elder
word: Flagbearer
word: Hag
word: Hellion
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: Nomad
word: Pirate
word:
name: R-S
word: Rebel
word: Reflection
word: Rigger
word: Rogue
word: Samurai
word: Scout
word: Serf
word: Shaman
word: Soldier
word: Spellshaper
word: Survivor
word:
name: T-Z
word: Thopter
word: Vampire
word: Warrior
word: Wizard
word: Zombie
word list:
name: artifact
word:
name:
line below: true
word: Equipment
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 list:
name: enchantment
word:
name:
line below: true
word: Aura
word: Shrine
word list:
name: spell
word:
name:
line below: true
word: Arcane
############################################################## 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: comes into play
auto replace:
match: AAA
replace: as an additional cost to play
auto replace:
match: @
replace: LEGENDNAME
############################################################## Add multiple cards
#set template:
# name: Base set (??? cards)
#set template:
# name: Expansion set (134 cards)
#set template:
# name: 5 color cycle
# field: rarity
#set template:
# name: 3 rarities cycle
############################################################## Card packs
pack item:
name: common
filter: card.rarity == "common"
pack item:
name: uncommon
filter: card.rarity == "uncommon"
pack item:
name: rare
filter: card.rarity == "rare"
pack item:
name: special
filter: card.rarity == "special"
pack item:
name: basic land
filter: card.type == "Plains"
filter: card.type == "Island"
filter: card.type == "Swamp"
filter: card.type == "Mountain"
filter: card.type == "Forest"
# TODO: support something like this:
#type: cyclic
pack type:
name: tournament pack
item:
name: rare
amount: 3
item:
name: uncommon
amount: 9
item:
name: common
amount: 33
item:
name: basic land
amount: 30
pack type:
name: booster pack
item:
name: rare
amount: 1
item:
name: uncommon
amount: 3
item:
name: common
amount: 11
pack type:
name: additional common
item:
name: common
pack type:
name: additional uncommon
item:
name: uncommon
pack type:
name: additional rare
item:
name: rare
pack type:
name: additional special
item:
name: special
############################################################## Keywords
############################# Keyword rules
has keywords: true
#keyword match script: name_filter(value)
#keyword preview: {keyword} <i>({reminder})</i>
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 type:
name: mana
match: [STQXYZI0-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: [ ][STQXYZI0-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 <cost>"
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 <cost>"
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: 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 "<something>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’ ]*
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: 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: 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: Any number of attacking creatures with banding, and up to one without, can form a band. Blocking a creature in the band blocks all of them. You assign combat damage for any creature blocking or blocked by this creature.
keyword:
keyword: Landwalk
match: <atom-param>prefix</atom-param>walk
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 <atom-param>name</atom-param>
mode: core
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."}
keyword:
keyword: Bands with other
match: Bands with other <atom-param>name</atom-param>
mode: old
reminder: Any number of attacking creatures with banding or bands with other {param1} can form a band. Blocking a creature in the band blocks all of them. You assign combat damage for any creature blocking or blocked by this creature and another creature with bands with other {param1}.
keyword:
keyword: Rampage
match: Rampage <atom-param>number</atom-param>
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: Cumulative upkeep
match: Cumulative upkeep <atom-param>cost</atom-param>
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.
keyword:
keyword: Phasing
match: Phasing
mode: old
reminder: At the beginning of your untap step, put this and any cards and/or counters attached to it in the phased-out zone. If this is already in the phased-out zone, return it and any cards and/or counters attached to it 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: expert
reminder: This creature 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, this creature is unblockable.
keyword:
keyword: Buyback
match: Buyback <atom-param>cost</atom-param>
mode: expert
reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you play this spell. If you do, put this card into your hand as it resolves.
keyword:
keyword: Echo
match: Echo <atom-param>cost</atom-param>
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 <atom-param>cost</atom-param>
mode: expert
reminder: {param1}, Discard this card: Draw a card.
keyword:
keyword: Haste
match: Haste
mode: core
reminder: This creature can attack and <sym>T</sym> as soon as it comes under your control.
keyword:
keyword: Horsemanship
match: Horsemanship
mode: old
reminder: This creature can’t be blocked except by creatures with horsemanship.
keyword:
keyword: Fading
match: Fading <atom-param>number</atom-param>
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: Kicker <atom-param>mana</atom-param> and/or <atom-param>mana</atom-param>
mode: expert
reminder: You may pay an additional {param1} and/or {param2} as you play this spell.
keyword:
keyword: Kicker
match: Kicker <atom-param>cost</atom-param>
mode: expert
reminder: You may {for_mana_costs(add:"pay an additional ", param1)} as you play this spell.
keyword:
keyword: Flashback
match: Flashback <atom-param>cost</atom-param>
mode: expert
reminder: You may play this card from your graveyard for its flashback cost. Then remove it from the game.
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 <atom-param>cost</atom-param>
mode: expert
reminder: If you discard this card, you may play it for its madness cost instead of putting it into your graveyard.
keyword:
keyword: Morph
match: Morph <atom-param>cost</atom-param>
mode: expert
reminder: You may play this face down as a 2/2 creature for <sym>3</sym>. Turn it face up any time for its morph cost.
keyword:
keyword: Fear
match: Fear
mode: core
reminder: This creature can’t be blocked except by artifact creatures and/or black creatures.
keyword:
keyword: Amplify
match: Amplify <atom-param>number</atom-param>
mode: expert
reminder: As this card comes into play, 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.
keyword:
keyword: Typecycling
match: <atom-param>prefix</atom-param>cycling <atom-param>cost</atom-param>
mode: expert
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 play this spell, copy it for each spell played before it this turn.{ if is_targeted() then " You may choose new targets for the copies." }
keyword:
keyword: Affinity for
match: Affinity for <atom-param>name</atom-param>
mode: expert
reminder: This spell costs <sym>1</sym> less to play for each {english_singular(param1)} you control.
keyword:
keyword: Entwine
match: Entwine <atom-param>cost</atom-param>
mode: expert
reminder: Choose both if you pay the entwine cost.
keyword:
keyword: Equip
match: Equip <atom-param>cost</atom-param>
mode: core
reminder: {param1}: Attach to target creature you control. Equip only as a sorcery.
keyword:
keyword: Imprint
match: Imprint — <atom-param>action</atom-param>
mode: expert
reminder: The removed card is imprinted on this artifact.
keyword:
keyword: Modular
match: Modular <atom-param>number</atom-param>
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 <atom-param>number</atom-param>
mode: action
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: This comes into play with a {if has_pt() then "+1/+1" else "charge"} counter on it for each color of mana used to pay its cost.
keyword:
keyword: Art rampage
match: Art rampage <atom-param>number</atom-param>
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 play it. (You may put this card into play 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.
keyword:
keyword: Splice
match: Splice onto <atom-param>name</atom-param> <atom-param>cost</atom-param>
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: Bushido
match: Bushido <atom-param>number</atom-param>
mode: expert
reminder: When this blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn.
keyword:
keyword: Soulshift
match: Soulshift <atom-param>number</atom-param>
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: Enchant
match: Enchant <atom-param>name</atom-param>
mode: core
reminder: Target a {param1} as you play this. This card comes into play 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.
keyword:
keyword: Offering
match: <atom-param>prefix</atom-param> 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: Ninjutsu
match: Ninjutsu <atom-param>cost</atom-param>
mode: expert
reminder: {param1}, Return an unblocked attacker you control to hand: Put this card into play from your hand tapped and attacking.
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 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].
keyword:
keyword: Convoke
match: Convoke
mode: expert
reminder: Each creature you tap while playing this spell reduces its cost by <sym>1</sym> or by one mana of that creature’s color.
keyword:
keyword: Transmute
match: Transmute <atom-param>cost</atom-param>
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. Play only as a sorcery.
keyword:
keyword: Dredge
match: Dredge <atom-param>number</atom-param>
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]
keyword:
keyword: Haunt
match: Haunt
mode: expert
reminder: When this { if contains(card.type,match:"Instant") or contains(card.type,match:"Sorcery") then "spell card is put into a graveyard after resolving," else "card is put into a graveyard from play," } remove it from the game haunting target creature.
keyword:
keyword: Bloodthirst
match: Bloodthirst <atom-param>number</atom-param>
mode: expert
reminder: If an opponent was dealt damage this turn, this {if has_pt() then "creature" else "permanent"} comes into play with {english_number_a(param1)} +1/+1 counter(s) on it.
keyword:
keyword: Replicate
match: Replicate <atom-param>cost</atom-param>
mode: expert
reminder: When you play this spell, copy it for each time you paid its replicate cost.{ if is_targeted() then " You may choose new targets for the copies." }
keyword:
keyword: Graft
match: Graft <atom-param>number</atom-param>
mode: expert
reminder: {if has_pt() then "This creature" else "This permanent"} comes into play with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever {if has_pt() then "another" else "a"} creature comes into play, you may move a +1/+1 counter from {if has_pt() then "this creature" else "this permanent"} onto it.
keyword:
keyword: Forecast
match: Forecast — <atom-param>action</atom-param>, Reveal <atom-param>name</atom-param> from your hand: <atom-param>action</atom-param>
mode: expert
reminder: Play 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.
keyword:
keyword: Recover
match: Recover <atom-param>cost</atom-param>
mode: expert
reminder: When a creature is put into your graveyard from play, you may {for_mana_costs(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 <atom-param>number</atom-param>
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: core
reminder: You may play this spell any time 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 <atom-param>number</atom-param>—<atom-param>cost</atom-param>
mode: expert
reminder: Rather than play this card from your hand,{if has_cc() then " you may" else ""} {for_mana_costs(add:"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." }
keyword:
keyword: Vanishing
match: Vanishing <atom-param>number</atom-param>
mode: expert
reminder: This permanent 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 the last is removed, sacrifice it.
keyword:
keyword: Deathtouch
match: Deathtouch
mode: core
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 this turn.{ if is_targeted() then " 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 <atom-param>number</atom-param>
mode: expert
reminder: If a source would deal damage to this creature, prevent {param1} of that damage.
keyword:
keyword: Fateseal
match: Fateseal <atom-param>number</atom-param>
mode: action
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 <atom-param>cost</atom-param>
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 into play. Then shuffle your library. Play only as a sorcery.
keyword:
keyword: Aura swap
match: Aura swap <atom-param>cost</atom-param>
mode: expert
reminder: {param1}: Exchange this Aura with an Aura card in your hand.
keyword:
keyword: Frenzy
match: Frenzy <atom-param>number</atom-param>
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 <sym>1</sym> less to play for each card removed this way.
keyword:
keyword: Poisonous
match: Poisonous <atom-param>number</atom-param>
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 <atom-param>cost</atom-param>
mode: expert
reminder: {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.
keyword:
keyword: Grandeur
match: Grandeur
mode: pseudo
rules: Grandeur — Discard another card named ~: [effect].
keyword:
keyword: Evoke
match: Evoke <atom-param>cost</atom-param>
mode: expert
reminder: You may play this spell for its evoke cost. If you do, it's sacrificed when it comes into play.
keyword:
keyword: Champion
match: Champion<atom-param>a</atom-param><atom-param>name</atom-param>
mode: expert
reminder: When this comes into play, sacrifice it unless you remove another{param2} you control from the game. When this leaves play, that card returns to play.
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 comes into play tapped. When it does, look at the top four cards of your library, remove one from the game face down, then put the rest on the bottom of your library.
keyword:
keyword: Prowl
match: Prowl <atom-param>cost</atom-param>
mode: expert
reminder: You may play 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 <atom-param>number</atom-param>—<atom-param>cost</atom-param>
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].
keyword:
keyword: Persist
match: Persist
mode: expert
reminder: When this creature is put into a graveyard from play, if it had no -1/-1 counters on it, return it to play 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 play 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" }.
keyword:
keyword: Retrace
match: Retrace
mode: expert
reminder: You may play 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].

############################################################## 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: [STQXYZI0-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: [ ][STQXYZI0-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 <cost>"
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 <cost>"
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: 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 "<something>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’ ]*
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: 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: 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: Any number of attacking creatures with banding, and up to one without, can form a band. Blocking a creature in the band blocks all of them. You assign combat damage for any creature blocking or blocked by this creature.
keyword:
keyword: Landwalk
match: <atom-param>prefix</atom-param>walk
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 <atom-param>name</atom-param>
mode: core
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."}
keyword:
keyword: Bands with other
match: Bands with other <atom-param>name</atom-param>
mode: old
reminder: Any number of attacking creatures with banding or bands with other {param1} can form a band. Blocking a creature in the band blocks all of them. You assign combat damage for any creature blocking or blocked by this creature and another creature with bands with other {param1}.
keyword:
keyword: Rampage
match: Rampage <atom-param>number</atom-param>
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: Cumulative upkeep
match: Cumulative upkeep <atom-param>cost</atom-param>
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.
keyword:
keyword: Phasing
match: Phasing
mode: old
reminder: At the beginning of your untap step, put this and any cards and/or counters attached to it in the phased-out zone. If this is already in the phased-out zone, return it and any cards and/or counters attached to it 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: expert
reminder: This creature 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, this creature is unblockable.
keyword:
keyword: Buyback
match: Buyback <atom-param>cost</atom-param>
mode: expert
reminder: You may {for_mana_costs(add:"pay an additional ",param1)} as you play this spell. If you do, put this card into your hand as it resolves.
keyword:
keyword: Echo
match: Echo <atom-param>cost</atom-param>
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 <atom-param>cost</atom-param>
mode: expert
reminder: {param1}, Discard this card: Draw a card.
keyword:
keyword: Haste
match: Haste
mode: core
reminder: This creature can attack and <sym>T</sym> as soon as it comes under your control.
keyword:
keyword: Horsemanship
match: Horsemanship
mode: old
reminder: This creature can’t be blocked except by creatures with horsemanship.
keyword:
keyword: Fading
match: Fading <atom-param>number</atom-param>
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: Kicker <atom-param>mana</atom-param> and/or <atom-param>mana</atom-param>
mode: expert
reminder: You may pay an additional {param1} and/or {param2} as you play this spell.
keyword:
keyword: Kicker
match: Kicker <atom-param>cost</atom-param>
mode: expert
reminder: You may {for_mana_costs(add:"pay an additional ", param1)} as you play this spell.
keyword:
keyword: Flashback
match: Flashback <atom-param>cost</atom-param>
mode: expert
reminder: You may play this card from your graveyard for its flashback cost. Then remove it from the game.
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 <atom-param>cost</atom-param>
mode: expert
reminder: If you discard this card, you may play it for its madness cost instead of putting it into your graveyard.
keyword:
keyword: Morph
match: Morph <atom-param>cost</atom-param>
mode: expert
reminder: You may play this face down as a 2/2 creature for <sym>3</sym>. Turn it face up any time for its morph cost.
keyword:
keyword: Fear
match: Fear
mode: core
reminder: This creature can’t be blocked except by artifact creatures and/or black creatures.
keyword:
keyword: Amplify
match: Amplify <atom-param>number</atom-param>
mode: expert
reminder: As this card comes into play, 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.
keyword:
keyword: Typecycling
match: <atom-param>prefix</atom-param>cycling <atom-param>cost</atom-param>
mode: expert
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 play this spell, copy it for each spell played before it this turn.{ if is_targeted() then " You may choose new targets for the copies." }
keyword:
keyword: Affinity for
match: Affinity for <atom-param>name</atom-param>
mode: expert
reminder: This spell costs <sym>1</sym> less to play for each {english_singular(param1)} you control.
keyword:
keyword: Entwine
match: Entwine <atom-param>cost</atom-param>
mode: expert
reminder: Choose both if you pay the entwine cost.
keyword:
keyword: Equip
match: Equip <atom-param>cost</atom-param>
mode: core
reminder: {param1}: Attach to target creature you control. Equip only as a sorcery.
keyword:
keyword: Imprint
match: Imprint — <atom-param>action</atom-param>
mode: expert
reminder: The removed card is imprinted on this artifact.
keyword:
keyword: Modular
match: Modular <atom-param>number</atom-param>
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 <atom-param>number</atom-param>
mode: action
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: This comes into play with a {if has_pt() then "+1/+1" else "charge"} counter on it for each color of mana used to pay its cost.
keyword:
keyword: Art rampage
match: Art rampage <atom-param>number</atom-param>
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 play it. (You may put this card into play 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.
keyword:
keyword: Splice
match: Splice onto <atom-param>name</atom-param> <atom-param>cost</atom-param>
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: Bushido
match: Bushido <atom-param>number</atom-param>
mode: expert
reminder: When this blocks or becomes blocked, it gets +{param1}/+{param1} until end of turn.
keyword:
keyword: Soulshift
match: Soulshift <atom-param>number</atom-param>
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: Enchant
match: Enchant <atom-param>name</atom-param>
mode: core
reminder: Target a {param1} as you play this. This card comes into play 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.
keyword:
keyword: Offering
match: <atom-param>prefix</atom-param> 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: Ninjutsu
match: Ninjutsu <atom-param>cost</atom-param>
mode: expert
reminder: {param1}, Return an unblocked attacker you control to hand: Put this card into play from your hand tapped and attacking.
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 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].
keyword:
keyword: Convoke
match: Convoke
mode: expert
reminder: Each creature you tap while playing this spell reduces its cost by <sym>1</sym> or by one mana of that creature’s color.
keyword:
keyword: Transmute
match: Transmute <atom-param>cost</atom-param>
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. Play only as a sorcery.
keyword:
keyword: Dredge
match: Dredge <atom-param>number</atom-param>
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]
keyword:
keyword: Haunt
match: Haunt
mode: expert
reminder: When this { if contains(card.type,match:"Instant") or contains(card.type,match:"Sorcery") then "spell card is put into a graveyard after resolving," else "card is put into a graveyard from play," } remove it from the game haunting target creature.
keyword:
keyword: Bloodthirst
match: Bloodthirst <atom-param>number</atom-param>
mode: expert
reminder: If an opponent was dealt damage this turn, this {if has_pt() then "creature" else "permanent"} comes into play with {english_number_a(param1)} +1/+1 counter(s) on it.
keyword:
keyword: Replicate
match: Replicate <atom-param>cost</atom-param>
mode: expert
reminder: When you play this spell, copy it for each time you paid its replicate cost.{ if is_targeted() then " You may choose new targets for the copies." }
keyword:
keyword: Graft
match: Graft <atom-param>number</atom-param>
mode: expert
reminder: {if has_pt() then "This creature" else "This permanent"} comes into play with {english_number_a(param1)} +1/+1 counter(s) on it. Whenever {if has_pt() then "another" else "a"} creature comes into play, you may move a +1/+1 counter from {if has_pt() then "this creature" else "this permanent"} onto it.
keyword:
keyword: Forecast
match: Forecast — <atom-param>action</atom-param>, Reveal <atom-param>name</atom-param> from your hand: <atom-param>action</atom-param>
mode: expert
reminder: Play 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.
keyword:
keyword: Recover
match: Recover <atom-param>cost</atom-param>
mode: expert
reminder: When a creature is put into your graveyard from play, you may {for_mana_costs(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 <atom-param>number</atom-param>
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: core
reminder: You may play this spell any time 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 <atom-param>number</atom-param>—<atom-param>cost</atom-param>
mode: expert
reminder: Rather than play this card from your hand,{if has_cc() then " you may" else ""} {for_mana_costs(add:"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." }
keyword:
keyword: Vanishing
match: Vanishing <atom-param>number</atom-param>
mode: expert
reminder: This permanent 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 the last is removed, sacrifice it.
keyword:
keyword: Deathtouch
match: Deathtouch
mode: core
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 this turn.{ if is_targeted() then " 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 <atom-param>number</atom-param>
mode: expert
reminder: If a source would deal damage to this creature, prevent {param1} of that damage.
keyword:
keyword: Fateseal
match: Fateseal <atom-param>number</atom-param>
mode: action
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 <atom-param>cost</atom-param>
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 into play. Then shuffle your library. Play only as a sorcery.
keyword:
keyword: Aura swap
match: Aura swap <atom-param>cost</atom-param>
mode: expert
reminder: {param1}: Exchange this Aura with an Aura card in your hand.
keyword:
keyword: Frenzy
match: Frenzy <atom-param>number</atom-param>
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 <sym>1</sym> less to play for each card removed this way.
keyword:
keyword: Poisonous
match: Poisonous <atom-param>number</atom-param>
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 <atom-param>cost</atom-param>
mode: expert
reminder: {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.
keyword:
keyword: Grandeur
match: Grandeur
mode: pseudo
rules: Grandeur — Discard another card named ~: [effect].
keyword:
keyword: Evoke
match: Evoke <atom-param>cost</atom-param>
mode: expert
reminder: You may play this spell for its evoke cost. If you do, it's sacrificed when it comes into play.
keyword:
keyword: Champion
match: Champion<atom-param>a</atom-param><atom-param>name</atom-param>
mode: expert
reminder: When this comes into play, sacrifice it unless you remove another{param2} you control from the game. When this leaves play, that card returns to play.
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 comes into play tapped. When it does, look at the top four cards of your library, remove one from the game face down, then put the rest on the bottom of your library.
keyword:
keyword: Prowl
match: Prowl <atom-param>cost</atom-param>
mode: expert
reminder: You may play 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 <atom-param>number</atom-param>—<atom-param>cost</atom-param>
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].
keyword:
keyword: Persist
match: Persist
mode: expert
reminder: When this creature is put into a graveyard from play, if it had no -1/-1 counters on it, return it to play 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 play 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" }.
keyword:
keyword: Retrace
match: Retrace
mode: expert
reminder: You may play 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].

############################################################## Card pack items
pack item:
name: common
filter: card.rarity == "common"
pack item:
name: uncommon
filter: card.rarity == "uncommon"
pack item:
name: rare
filter: card.rarity == "rare"
pack item:
name: special
filter: card.rarity == "special"
pack item:
name: basic land
filter: card.type == "Plains"
filter: card.type == "Island"
filter: card.type == "Swamp"
filter: card.type == "Mountain"
filter: card.type == "Forest"
# TODO: support something like this:
#type: cyclic
############################################################## Card packs
pack type:
name: tournament pack
item:
name: rare
amount: 3
item:
name: uncommon
amount: 9
item:
name: common
amount: 33
item:
name: basic land
amount: 30
pack type:
name: booster pack
item:
name: rare
amount: 1
item:
name: uncommon
amount: 3
item:
name: common
amount: 11
pack type:
name: additional common
item:
name: common
pack type:
name: additional uncommon
item:
name: uncommon
pack type:
name: additional rare
item:
name: rare
pack type:
name: additional special
item:
name: special

############################################################## 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: "(^|[^/])<match>($|[^/])",
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: "<TQ>")
mana_filter_t := replace@( # Remove [] used for forcing mana symbols
match: "[\\[\\]]",
replace: ""
) + { tap_filter() + mana_filter() }
############################################################## Determine card color
# Names of colors
color_name := {
if input = "W" then "white"
else if input = "U" then "blue"
else if input = "B" then "black"
else if input = "R" then "red"
else if input = "G" then "green"
else ""
}
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_filter := sort_text@(order: "<WUBRG>")
color_filterH := sort_text@(order: "</>")
mana_to_color := {
count := number_of_items(in: colors)
if hybrid == "" then
# not a hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if set.set_info.use_gradient_multicolor == "no" then "multicolor" # stop here
else if count == 2 then color_names_2() + ", multicolor"
else if set.set_info.use_gradient_multicolor != "yes" then "multicolor" # stop here
else if count == 3 then color_names_3() + ", multicolor"
else if count == 4 then color_names_4() + ", multicolor"
else if count == 5 then color_names_5() + ", multicolor"
else "multicolor"
else
# hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if count == 2 then color_names_2() + ", hybrid"
else if count == 3 then color_names_3() + ", hybrid"
else "multicolor"
}
# color based on land text box, input = textbox contents
color_text_filter :=
# remove activation costs
replace@(
match: "<sym[^>]*>[^<]+</sym[^>]*>"
in_context: "(?ix) (\\n|^)[^:]*<match>(,|:) | (pays?|additional|costs?)[ ]<match>",
replace: ""
) +
# keep only mana
filter_text@(match: "<sym[^>]*>([^<]+)") + color_filter;
# get the land frame for a "WUBRG"-style input.
land_multicolor := {
count := number_of_items(in: colors)
if count == 0 then "land"
else if count == 1 then color_names_1() + ", land"
else if count == 2 then color_names_2() + ", land"
else if count == 3 then color_names_3() + ", land"
else "land, multicolor"
}
land_to_color := {
# Based on watermark
if watermark = "mana symbol white" then "white, land"
else if watermark = "mana symbol blue" then "blue, land"
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))
};
# 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 (
text := filter_text(match: regex_escape(card_name)+"(</[-a-z]+>)? is (colorless|all colors|((blue|white|green|red|black)((,|,? and) (blue|white|green|red|black))*))\\.")
if text != "" then (
if contains(text, match: "all colors") then (
colors := "WUBRG"
if land = "land" 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: "")
)
)
)
}
# The color of a card
is_creature := match@(match: "(?i)Creature")
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")
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)
else if mana_color == "colorless" and is_artifact(type) then "artifact"
else mana_color
)
else text_color
};
# Number of colors in a card_color
card_color_color_count := count_chosen@(choices: "white,blue,black,red,green,artifact")
# Clean up color field
card_color_filter := {
colors := card_color_color_count()
if colors > 2 then
input := remove_choice(choice: "overlay")
if colors > 1 then (
input := require_choice(choices: "multicolor, hybrid, land, artifact")
input := exclusive_choice(choices: "multicolor, hybrid")
input := require_exclusive_choice(choices: "horizontal, vertical, radial, overlay")
) else
input := remove_choice(choices: "radial, horizontal, vertical, overlay, hybrid, reversed")
if chosen(choice:"overlay") then
input := remove_choice(choice: "reversed")
input
}
# needed by all style files anyway
include file: /magic-blends.mse-include/new-blends
############################################################## Card number
# Index for sorting, white cards are first, so white->A, blue->B, .. ,
# The code consists of 4 parts:
# normal/token, color, shifted, split
sort_index := {
(if contains(card.shape, match:"token") then "T" else " ") + # Tokens come last
color_of_card() +
(if contains(card.shape, match:"shifted") then "S" else " ") + # planeshifted cards come after normal ones
(if contains(card.shape, match:"split") then "S" else " ") + # split cards come after normal ones
":"
}
# Process the name for sorting rules (specifically, remove "The", "A", and "And" at the beginning, and make lowercase)
sort_name :=
replace@(match: "^(The|An?) ", replace: "") +
to_lower
is_multicolor := { chosen(choice: "multicolor") and input != "artifact, multicolor" }
is_null_cost := { input == "" or input == "0" }
is_hybrid_cost := { contains(card.casting_cost, match: "W/") or contains(card.casting_cost, match: "U/") or contains(card.casting_cost, match: "B/") or contains(card.casting_cost, match: "R/") or contains(card.casting_cost, match: "G/") }
basic_land_sort := {
if contains(card.name, match:"Plains") then "LB" # Plains
else if contains(card.name, match:"Island") then "LC" # Islands
else if contains(card.name, match:"Swamp") then "LD" # Swamps
else if contains(card.name, match:"Mountain") then "LE" # Mountains
else if contains(card.name, match:"Forest") then "LF" # Forests
else "LA" # other basic lands
}
hybrid_cost_sort := {
colors := sort_text(casting_cost, order: "<WUBRG>")
if colors = "WU" then "GA"
else if colors = "WB" then "GB"
else if colors = "UB" then "GC"
else if colors = "UR" then "GD"
else if colors = "BR" then "GE"
else if colors = "BG" then "GF"
else if colors = "RG" then "GG"
else if colors = "WR" then "GH"
else if colors = "WG" then "GI"
else if colors = "UG" then "GJ"
else "GK"
}
color_of_card := {
card_color := card.card_color
casting_cost := card.casting_cost
if card.shape == "split" and
card_color != card.card_color_2 then "H" # Diff Color Splits
else if chosen(choice: "land", card_color) then (
if card.rarity != "basic land" then "K" # Nonbasic Land
else basic_land_sort()
) else if is_null_cost(casting_cost) then (
if chosen(choice: "hybrid", card_color) then "GK" # Hybrids
else if is_multicolor(card_color) then "F" # Multicolor
else if chosen(choice:"white", card_color) then "A" # White
else if chosen(choice:"blue", card_color) then "B" # Blue
else if chosen(choice:"black", card_color) then "C" # Black
else if chosen(choice:"red", card_color) then "D" # Red
else if chosen(choice:"green", card_color) then "E" # Green
else "I" # Colorless / Artifact
) else (
# use the casting cost
colors := sort_text(casting_cost, order: "<WUBRG>")
if colors == "" then "I" # Colorless / Artifact
else if colors == "W" then "A" # White
else if colors == "U" then "B" # Blue
else if colors == "B" then "C" # Black
else if colors == "R" then "D" # Red
else if colors == "G" then "E" # Green
else if is_hybrid_cost() then hybrid_cost_sort() #Hybrid
else if contains(casting_cost, match:"/") and contains(card_color, match:"artifact") then "I" # Colorless/Artifact
else "F" # Multicolor
)
}
rarity_sort := {
if set.sort_special_rarity == "with the rest" or card.rarity != "special" then " " else "S"
}
set_filter := {
if set.sort_special_rarity != "separate numbering" then nil
else if card.rarity == "special" then { card.rarity == "special" }
else { card.rarity != "special" }
}
card_number := {
position (
of: card
in: set
order_by: { rarity_sort() + sort_index() + sort_name(card.name) }
filter: set_filter()
) + 1
}
card_count := {
number_of_items(in: set, filter: set_filter())
}
############################################################## Utilities for keywords
# replaces — correctly
add := "" # default is nothing
separate_words := remove_tags + trim + replace@(match:" ", replace: {spacer})
for_mana_costs := format_cost := {
if input.separator_before == "—" and contains(input.param, match: " ") then (
if contains(input.param, match:",") then (
if match(match: "^[STQXYZIWUBRG0-9/|]+,", input.param) then
"{add}<param-cost>{combined_cost(input.param)}</param-cost>"
else "<param-cost>{combined_cost(input.param)}</param-cost>"
) else
"<param-cost>{alternative_cost(input.param)}</param-cost>"
) else
"{add}<param-mana>{input.param}</param-mana>"
}
alternative_cost := replace@(match:"^[A-Z]", replace: { to_lower() })
combined_cost := replace@(match:", [A-Z]", replace: { to_lower() })+
replace@(match:",", replace:" and")+
replace@(match:"^[STQXYZIWUBRG0-9/|]", in_context: "(^|[[:space:]])<match>", replace: "<sym-auto>&</sym-auto>")+
replace@(match:"^[A-Z]", replace: { to_lower() })
long_dash := replace@(match:"-", replace:"—")
# Utilities for keywords
has_cc := { card.casting_cost != "" }
has_pt := { card.pt != "" }
contains_target := match@(match:"(?i)([^a-z]|^)target([^a-z]|$)")
is_targeted := { contains_target(card.rule_text) }
############################################################## 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
( <match>: # G: something
| <match>, # G, tap: something
| <match>[ ]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
([ ]<sym[^>]*>[STQXYZIWUBRG0-9/|]+</sym[^>]*>,)* # pay X, Y or Z
([ ]<sym[^>]*>[STQXYZIWUBRG0-9/|]+</sym[^>]*>[ ](and|or|and/or))* # pay X or Y
[ ]<match>
([,.)]|$ # (end of word)
|[ ][^ .,]*$ # still typing...
|[ ]( or | and | in | less | more | to ) # or next word is ...
)
)
| <param-mana><match></param-mana> # keyword argument that is declared as mana
| <param-cost>[ ]*<match></param-cost> # keyword argument that is declared as cost
| <param-cost><match>, # keyword argument that is declared as cost
";
# truncates the name of legends
legend_filter := replace@(match:", [A-Z,a-z,Æ,0-9,' ]*", replace: "" )+
replace@(match:" of [A-Z,a-z,Æ,0-9,' ]*", replace: "" )+
replace@(match:" the [A-Z,a-z,Æ,0-9,' ]*", replace: "" )
# the rule text filter
# - adds mana symbols
# - makes text in parentheses italic
text_filter :=
# step 1 : remove all automatic tags
remove_tag@(tag: "<sym-auto>") +
remove_tag@(tag: "<i-auto>") +
# step 2 : reminder text for keywords
expand_keywords@(
default_expand: { chosen(choice:mode, set.automatic_reminder_text) },
combine: {
if mode == "pseudo" then "<i-auto>{keyword}</i-auto>"
else "{keyword}<atom-reminder-{mode}> ({process_english_hints(reminder)})</atom-reminder-{mode}>" }
) +
# step 2b : move action keywords' reminder text to the end of the line
replace@(
match: "(<atom-reminder-action>(?:(?!<kw-).)*</atom-reminder-action></kw[^>]*>)(((?!<atom-reminder| ?<kw-)[^\n(])+)",
replace: "\\2\\1"
) +
# step 2c : remove duplicate reminder text
replace@(
match: "(<atom-reminder-[^>]*>[^)]+[)]</atom-reminder-[^>]*>)([^\n]+)\\1"
replace: "\\2\\1"
) +
# step 3a : expand shortcut words ~ and CARDNAME
replace@(
match: "~|~THIS~|CARDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-cardname></atom-cardname>"
) +
# step 3b : expand shortcut words ` and shortened LEGENDNAME
replace@(
match: "LEGENDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-legname></atom-legname>"
) +
# step 3c : fill in atom fields
tag_contents@(
tag: "<atom-cardname>",
contents: { if card_name=="" then "CARDNAME" else card_name }
) +
tag_contents@(
tag: "<atom-legname>",
contents: { if card_name=="" then "LEGENDNAME" else legend_filter(card_name) }
) +
# step 4 : explict non mana symbols
replace@(
match: "\\][STQXYZIWUBRG0-9/|]+\\[",
replace: {"<nosym>" + mana_filter_t() + "</nosym>"} ) +
# step 5 : add mana & tap symbols
replace@(
match: "[STQXYZIWUBRG0-9/|]+",
in_context: mana_context,
replace: {"<sym-auto>" + mana_filter_t() + "</sym-auto>"} ) +
# step 5b : add explict mana symbols
replace@(
match: "\\[[STQXYZIWUBRG0-9/|]+\\]",
replace: {"<sym>" + mana_filter_t() + "</sym>"} ) +
# step 7 : italic reminder text
replace@(
match: "[(]([^)\n]|[(][^)\n]*[)])*[)]?",
in_context: "(^|[[:space:]])<match>|<atom-keyword><match></",
replace: "<i-auto>&</i-auto>") +
# step 8 : automatic capitalization
replace@(
match: "[a-z]",
in_context: "[(](<param-[a-z]*>)?<match>[^)]|[ ]*: <param-cost><match>|—<match>| — <match>",
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: "<i-flavor>") +
# step 2 : surround by <i> tags
{ "<i-flavor>" + input + "</i-flavor>" } +
# curly quotes
curly_quotes
# Move the cursor past the separator in the p/t and type boxes
type_over_pt := replace@(match:"/$", replace:"")
type_over_type := replace@(match:" ?-$", replace:"")
super_type_filter :=
remove_tag@(tag: "<word-list-") +
type_over_type +
{ "<word-list-type>{input}</word-list-type>" }
space_to_wltags := replace@(match:"( +|<soft> </soft>)",
replace:{"</word-list-{list_type}>{_1}<word-list-{list_type}>"})
sub_type_filter :=
remove_tag@(tag: "<word-list-") +
replace@(match: " </soft>$", replace: "") + # remove trailing soft space
remove_tag@(tag: "<soft") +
{ list_type := if is_creature(type) then "class"
else if is_land(type) then "land"
else if is_artifact(type) then "artifact"
else if is_enchantment(type) then "enchantment"
else if is_spell(type) then "spell"
if is_creature(type) or is_tribal(type) then (
first := "<word-list-race>{ only_first(input) }</word-list-race>"
next := only_next(input)
if input == "" then list_type := "" # only edit the race
else if next == "" then first := first + "<soft> </soft>"
else first := first + " "
input := next
) else (
first := ""
)
if list_type != "" then (
if input != "" then input := input + "<soft> </soft>" # Add a new box at the end
first + "<word-list-{list_type}>{ space_to_wltags(input) }</word-list-{list_type}>"
) else first + input
}
# all sub types, for word list
space_to_comma := replace@(match:" ", replace:",")
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))
}
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))
}
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)))
}
# Shape of cards, can be changed in style files
card_shape := { "normal" }
typesymbol_for :=
to_text +
replace@(match: "(Legendary|Basic|Snow|World| )", replace: "") +
{ if input == "Creature" then "creature"
else if input == "Sorcery" then "sorcery"
else if input == "Instant" then "instant"
else if input == "Artifact" then "artifact"
else if input == "Enchantment" then "enchantment"
else if input == "Land" then "land"
else if input == "Planeswalker" then "planeswalker"
else "multitype"
}
typesymbol_type := { typesymbol_for(card.super_type) }
#Script to make magic-mana-future compatible w/ other templates
colorless_color := { "c" }
############################################################## Statistics utilities
# 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]+(?!/[WUBRGSTQ2]) | [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
))
}
primary_card_color := {
artifact := chosen(choice:"artifact")
land := chosen(choice:"land")
multi := chosen(choice:"multicolor")
hybrid := chosen(choice:"hybrid")
if land then "land"
else if multi and input != "artifact, multicolor" then "multicolor"
else if hybrid then "hybrid"
else if artifact then "artifact"
else input
}
word_count := break_text@(match:"[^[:space:]]+") + length

############################################################## Set fields
set field:
type: info
name: Set Information
set field:
type: text
name: title
identifying: true
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: action
choice: custom
initial: old, core, expert, pseudo, action, 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
description: Should card numbers be shown on the cards?
set field:
type: choice
name: sort special rarity
description: Determines how cards with special rarity are sorted.
choice: with the rest
choice: after other cards
choice: separate numbering
initial: after other cards
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: choice
name: use gradient multicolor
choice: yes
choice: only for two color cards
choice: no
description: Use gradients on multicolor cards by default, you can always change it be clicking on the card border.
initial: no
############################# 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(255, 160, 40)
fill color 2: rgb(202, 49, 35)
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
sort special rarity:
render style: both
choice images:
with the rest: /magic.mse-game/icons/number_cards_mixed.png
after other cards: /magic.mse-game/icons/number_cards_after.png
separate numbering: /magic.mse-game/icons/number_cards_separate.png
use gradient multicolor:
render style: both
choice images:
yes: script: built_in_image("bool_yes")
no: script: built_in_image("bool_no")

############################################################## Statistics dimensions
statistics dimension:
name: card color
position hint: 0
script: primary_card_color(card.card_color)
icon: stats/card_color.png
colors:
white : rgb(255,237,202)
blue : rgb(42,141,255)
black : rgb(33,33,33)
red : rgb(255,52,0)
green : rgb(118,230,0)
colorless : rgb(120,90,90)
artifact : rgb(185,192,199)
multicolor : rgb(255,188,14)
land : rgb(109,62,39)
hybrid : rgb(201,12,230)
group: white
group: blue
group: black
group: red
group: green
group: colorless
group: artifact
group: multicolor
group: land
group: hybrid
statistics dimension:
position hint: 2
name: converted mana cost
script: cmc(card.casting_cost)
numeric: true
icon: stats/casting_cost.png
statistics dimension:
position hint: 3
name: colored mana cost
script: colored_mana(card.casting_cost)
numeric: true
icon: stats/colored_casting_cost.png
statistics dimension:
position hint: 50
name: power
script: card.power
numeric: true
icon: stats/power.png
statistics dimension:
position hint: 51
name: toughness
script: card.toughness
numeric: true
icon: stats/toughness.png
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
statistics dimension:
name: race
position hint: 32
icon: stats/creature_type.png
description: Race of creatures and tribal cards
script:
if is_creature(card.super_type) or is_tribal(card.super_type) then
only_first(card.sub_type)
show empty: false
statistics dimension:
name: creature class
position hint: 33
icon: stats/creature_type.png
description: Class of creature cards
script:
if is_creature(card.super_type) then
space_to_comma(trim(remove_tags(only_next(card.sub_type))))
show empty: false
split list: true
############################################################## Statistics categories (OLD)
statistics category:
name: color / rarity
position hint: 101
type: stack
icon: stats/color_rarity.png
dimension: card color
dimension: rarity
statistics category:
name: power / toughness
position hint: 52
type: scatter pie
icon: stats/pt.png
dimension: power
dimension: toughness
dimension: rarity
#statistics category:
# name: color / cost
# type: scatter
# dimension: card color
# dimension: converted mana cost
statistics category:
name: color / cost
position hint: 4
type: scatter pie
icon: stats/color_cost.png
dimension: card color
dimension: converted mana cost
dimension: rarity
statistics category:
name: color / colored cost
position hint: 5
icon: stats/color_colored_cost.png
type: scatter
dimension: card color
dimension: colored mana cost
statistics category:
name: cost / colored cost
position hint: 6
icon: stats/cost_colored_cost.png
type: scatter pie
dimension: converted mana cost
dimension: colored mana cost
dimension: card color
statistics category:
name: creature race / class
position hint: 34
icon: stats/creature_type.png
type: scatter pie
dimension: race
dimension: creature class
dimension: card color

############################################################## Magic word lists
word list:
name: type
word:
name: Basic
is prefix: true
word:
name: Legendary
is prefix: true
word:
name: Tribal
is prefix: true
word:
name: Snow
is prefix: true
word:
name: World
is prefix: true
line below: true
word: Creature
word: Artifact
word: Artifact Creature
word: Enchantment
word: Instant
word: Sorcery
word: Land
word: Planeswalker
## TODO: Make the alphabetical sublists actually work.
word list:
name: race
word:
script: all_races()
line below: true
word: Angel
word: Beast
word: Bird
word: Construct
word: Demon
word: Dragon
word: Drake
word: Elemental
word: Elf
word: Faerie
word: Giant
word: Goblin
word: Golem
word: Human
word: Illusion
word: Merfolk
word: Treefolk
word: Zombie
word:
name: All Races
word:
name: A
word: Angel
word: Anteater
word: Antelope
word: Ape
word: Archon
word: Assembly-Worker
word: Atog
word: Aurochs
word: Avatar
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: Cat
word: Centaur
word: Cephalid
word: Chimera
word: Cockatrice
word: Construct
word: Crab
word: Crocodile
word: Cyclops
word:
name: D
word: Dauthi
word: Demon
word: Devil
word: Djinn
word: Dragon
word: Drake
word: Dreadnought
word: Dryad
word: Dwarf
word:
name: E
word: Efreet
word: Egg
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: Giant
word: Gnome
word: Goat
word: Goblin
word: Golem
word: Gorgon
word: Graveborn
word: Griffin
word:
name: H
word: Hag
word: Harpy
word: Hellion
word: Hippo
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: Jellyfish
word: Juggernaut
word:
name: K
word: Kavu
word: Kirin
word: Kithkin
word: Kobold
word: Kor
word: Kraken
word:
name: L
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: Mongoose
word: Moonfolk
word: Mutant
word: Myr
word:
name: N
word: Nautilus
word: Nephilim
word: Nightmare
word: Nightstalker
word: Noggle
word:
name: O
word: Octopus
word: Ogre
word: Ooze
word: Orb
word: Orc
word: Orgg
word: Ouphe
word: Ox
word: Oyster
word:
name: P
word: Pegasus
word: Pentavite
word: Pest
word: Phelddagrif
word: Phoenix
word: Pincher
word: Plant
word: Prism
word:
name: R
word: Rabbit
word: Rat
word: Reflection
word: Rhino
word:
name: S
word:
name: Sa-Sl
word: Salamander
word: Sand
word: Saproling
word: Satyr
word: Scarecrow
word: Scorpion
word: Serpent
word: Shade
word: Shapeshifter
word: Sheep
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:
name: T
word: Tetravite
word: Thalakos
word: Thopter
word: Thrull
word: Treefolk
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: 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: Advisor
word: Archer
word: Artificer
word: Assassin
word: Beast
word: Cleric
word: Druid
word: Knight
word: Mutant
word: Rogue
word: Scout
word: Shaman
word: Soldier
word: Warrior
word: Wizard
word: Zombie
word:
name: All Classes
word:
name: A-C
word: Advisor
word: Archer
word: Archon
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: Elder
word: Flagbearer
word: Hag
word: Hellion
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: Nomad
word: Pirate
word:
name: R-S
word: Rebel
word: Reflection
word: Rigger
word: Rogue
word: Samurai
word: Scout
word: Serf
word: Shaman
word: Soldier
word: Spellshaper
word: Survivor
word:
name: T-Z
word: Thopter
word: Vampire
word: Warrior
word: Wizard
word: Zombie
word list:
name: artifact
word:
name:
line below: true
word: Equipment
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 list:
name: enchantment
word:
name:
line below: true
word: Aura
word: Shrine
word list:
name: spell
word:
name:
line below: true
word: Arcane
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment