From 8c617b593637818e693a29be587e1bb704ea76de Mon Sep 17 00:00:00 2001 From: GenevensiS <66968533+G-e-n-e-v-e-n-s-i-S@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:21:14 +0100 Subject: [PATCH] Statistics Update (#12) * Adding GenevensiS's stats page overhaul * Update card_fields: automated stats are now disabled * Update set_fields: added customization fields for stats * Stats have new icons * Updated position hint and card shape for several frames * Added preliminary localization updates * Added detect_custom_subtypes_statistic --------- Co-authored-by: cajun --- data/magic-m15-adventure.mse-style/style | 2 +- data/magic-m15-aftermath.mse-style/style | 4 +- data/magic-m15-augment.mse-style/style | 2 +- data/magic-m15-clear.mse-style/style | 4 +- data/magic-m15-devoid.mse-style/style | 2 +- .../style | 4 +- data/magic-m15-flip.mse-style/style | 2 +- data/magic-m15-mainframe-dfc.mse-style/style | 2 +- data/magic-m15-meld-3in1.mse-style/style | 4 +- data/magic-m15-meld-colored.mse-style/style | 4 +- data/magic-m15-meld.mse-style/style | 4 +- data/magic-m15-miracle.mse-style/style | 4 +- data/magic-m15-nyx.mse-style/style | 4 +- data/magic-m15-saga.mse-style/style | 2 +- data/magic-m15-split-fusable.mse-style/style | 2 +- data/magic-m15-token-clear.mse-style/style | 4 +- .../magic-m15-token-legendary.mse-style/style | 4 +- data/magic-m15-vanguard.mse-style/style | 3 +- data/magic-new-doublefaced.mse-style/style | 1 + .../style | 2 +- .../style | 3 +- .../style | 1 + data/magic-small-plain-flip.mse-style/style | 4 +- data/magic.mse-game/card_fields | 43 +- data/magic.mse-game/icons/language-en-ca.png | Bin 0 -> 5956 bytes data/magic.mse-game/icons/language-en-gb.png | Bin 0 -> 6915 bytes data/magic.mse-game/icons/language-it.png | Bin 0 -> 581 bytes data/magic.mse-game/language | 681 ++++++- data/magic.mse-game/script | 32 +- data/magic.mse-game/set_fields | 58 +- data/magic.mse-game/statistics | 1543 ++++++++++++--- data/magic.mse-game/statistics_script | 1719 +++++++++++++++++ data/magic.mse-game/stats/card_symbol.png | Bin 654 -> 0 bytes data/magic.mse-game/stats/casting_cost.png | Bin 877 -> 13584 bytes .../stats/{card_color.png => color.png} | Bin .../stats/color_colored_cost.png | Bin 1262 -> 0 bytes data/magic.mse-game/stats/color_cost.png | Bin 1158 -> 0 bytes data/magic.mse-game/stats/color_pie.png | Bin 0 -> 10407 bytes data/magic.mse-game/stats/color_pips.png | Bin 0 -> 16251 bytes data/magic.mse-game/stats/color_rarity.png | Bin 1055 -> 0 bytes .../stats/colored_casting_cost.png | Bin 1014 -> 0 bytes .../stats/cost_colored_cost.png | Bin 1210 -> 0 bytes data/magic.mse-game/stats/creature_class.png | Bin 672 -> 0 bytes data/magic.mse-game/stats/creature_race.png | Bin 706 -> 0 bytes ...creature_type.png => creature_subtype.png} | Bin data/magic.mse-game/stats/defense.png | Bin 0 -> 1365 bytes data/magic.mse-game/stats/filter.png | Bin 0 -> 802 bytes data/magic.mse-game/stats/hand.png | Bin 0 -> 905 bytes data/magic.mse-game/stats/illustrator.png | Bin 394 -> 931 bytes data/magic.mse-game/stats/keywords.png | Bin 674 -> 812 bytes data/magic.mse-game/stats/land_drops.png | Bin 0 -> 13723 bytes data/magic.mse-game/stats/land_production.png | Bin 0 -> 14765 bytes data/magic.mse-game/stats/loyalty.png | Bin 0 -> 1270 bytes data/magic.mse-game/stats/mana_value.png | Bin 0 -> 12673 bytes .../stats/noncreature_subtype.png | Bin 0 -> 14475 bytes data/magic.mse-game/stats/power.png | Bin 576 -> 958 bytes data/magic.mse-game/stats/pt.png | Bin 1000 -> 0 bytes data/magic.mse-game/stats/rarity.png | Bin 860 -> 8704 bytes data/magic.mse-game/stats/stamp.png | Bin 0 -> 1347 bytes data/magic.mse-game/stats/stylesheet.png | Bin 590 -> 5399 bytes data/magic.mse-game/stats/symbol.png | Bin 0 -> 1532 bytes data/magic.mse-game/stats/toughness.png | Bin 702 -> 1535 bytes .../stats/{card_type.png => type.png} | Bin data/magic.mse-game/stats/watermark.png | Bin 1016 -> 1399 bytes data/magic.mse-game/word_lists | 637 +----- 65 files changed, 3928 insertions(+), 853 deletions(-) create mode 100644 data/magic.mse-game/icons/language-en-ca.png create mode 100644 data/magic.mse-game/icons/language-en-gb.png create mode 100644 data/magic.mse-game/icons/language-it.png create mode 100644 data/magic.mse-game/statistics_script delete mode 100644 data/magic.mse-game/stats/card_symbol.png rename data/magic.mse-game/stats/{card_color.png => color.png} (100%) delete mode 100644 data/magic.mse-game/stats/color_colored_cost.png delete mode 100644 data/magic.mse-game/stats/color_cost.png create mode 100644 data/magic.mse-game/stats/color_pie.png create mode 100644 data/magic.mse-game/stats/color_pips.png delete mode 100644 data/magic.mse-game/stats/color_rarity.png delete mode 100644 data/magic.mse-game/stats/colored_casting_cost.png delete mode 100644 data/magic.mse-game/stats/cost_colored_cost.png delete mode 100644 data/magic.mse-game/stats/creature_class.png delete mode 100644 data/magic.mse-game/stats/creature_race.png rename data/magic.mse-game/stats/{creature_type.png => creature_subtype.png} (100%) create mode 100644 data/magic.mse-game/stats/defense.png create mode 100644 data/magic.mse-game/stats/filter.png create mode 100644 data/magic.mse-game/stats/hand.png create mode 100644 data/magic.mse-game/stats/land_drops.png create mode 100644 data/magic.mse-game/stats/land_production.png create mode 100644 data/magic.mse-game/stats/loyalty.png create mode 100644 data/magic.mse-game/stats/mana_value.png create mode 100644 data/magic.mse-game/stats/noncreature_subtype.png delete mode 100644 data/magic.mse-game/stats/pt.png create mode 100644 data/magic.mse-game/stats/stamp.png create mode 100644 data/magic.mse-game/stats/symbol.png rename data/magic.mse-game/stats/{card_type.png => type.png} (100%) diff --git a/data/magic-m15-adventure.mse-style/style b/data/magic-m15-adventure.mse-style/style index d04ac9615..75dfffa6d 100644 --- a/data/magic-m15-adventure.mse-style/style +++ b/data/magic-m15-adventure.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Adventures full name: After M15 Adventures icon: card-sample.png installer group: magic/m15 style/split cards -position hint: 043 +position hint: 011 version: 2023-02-13 depends on: diff --git a/data/magic-m15-aftermath.mse-style/style b/data/magic-m15-aftermath.mse-style/style index 8074fa302..2966bcae2 100644 --- a/data/magic-m15-aftermath.mse-style/style +++ b/data/magic-m15-aftermath.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Aftermath full name: After M15 Aftermath icon: card-sample.png installer group: magic/m15 style/split cards/fuse -position hint: 042 +position hint: 011 version: 2018-06-01 depends on: @@ -676,4 +676,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-augment.mse-style/style b/data/magic-m15-augment.mse-style/style index 38bd60fac..0a90589ad 100644 --- a/data/magic-m15-augment.mse-style/style +++ b/data/magic-m15-augment.mse-style/style @@ -61,7 +61,7 @@ init script: is_promo := { styling.promo } # Declare the card shape. - card_shape := { "augment" } + card_shape := { "leveler" } # Replacing the text_filter() from game file because all three rule text fields should call card.name card_name_replace := diff --git a/data/magic-m15-clear.mse-style/style b/data/magic-m15-clear.mse-style/style index 1ea14f715..a76714130 100644 --- a/data/magic-m15-clear.mse-style/style +++ b/data/magic-m15-clear.mse-style/style @@ -3,7 +3,7 @@ game: magic short name: M15 Clear full name: After M15 Clear icon: card-sample.png -position hint: 006 +position hint: 014 installer group: magic/m15 style/normal cards/Clear version: 2023-02-13 @@ -436,4 +436,4 @@ extra card style: z index: 6 render style: image image: crown.png - visible: {contains(card.super_type, match:"Legendary") } \ No newline at end of file + visible: {contains(card.super_type, match:"Legendary") } diff --git a/data/magic-m15-devoid.mse-style/style b/data/magic-m15-devoid.mse-style/style index f01b1d8c8..45669555e 100644 --- a/data/magic-m15-devoid.mse-style/style +++ b/data/magic-m15-devoid.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Devoid full name: Devoid Cards icon: card-sample.png installer group: magic/m15 style/devoid cards -position hint: 012 +position hint: 014 version: 2018-02-10 depends on: diff --git a/data/magic-m15-doublefaced-leveler.mse-style/style b/data/magic-m15-doublefaced-leveler.mse-style/style index 78dde597b..116d8a26e 100644 --- a/data/magic-m15-doublefaced-leveler.mse-style/style +++ b/data/magic-m15-doublefaced-leveler.mse-style/style @@ -70,7 +70,7 @@ init script: has_pt_2 := { card.power_2 != "" or card.toughness_2 != "" } # Declare the card shape. - card_shape := { "leveler" } + card_shape := { "double faced leveler" } has_identity := { styling.color_indicator_dot } has_identity_2 := {styling.color_indicator_dot_2 } is_unsorted := {styling.remove_from_autocount} @@ -1429,4 +1429,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-flip.mse-style/style b/data/magic-m15-flip.mse-style/style index 52789e63a..70a5bbbe5 100644 --- a/data/magic-m15-flip.mse-style/style +++ b/data/magic-m15-flip.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Flip full name: M15 Style Flip Cards icon: card-sample.png installer group: magic/m15 style/flip cards -position hint: 044 +position hint: 012 version: 2018-02-09 depends on: diff --git a/data/magic-m15-mainframe-dfc.mse-style/style b/data/magic-m15-mainframe-dfc.mse-style/style index d99861108..7ec9cf244 100644 --- a/data/magic-m15-mainframe-dfc.mse-style/style +++ b/data/magic-m15-mainframe-dfc.mse-style/style @@ -155,7 +155,7 @@ init script: } ####### Shape things - card_shape := {"double faced"} + card_shape := {if contains(styling.dfc_type, match: "modal") then "modal double faced" else "transform double faced"} a_saga := {is_saga() or is_class()} b_saga := {back_saga() or back_class()} saga_reminder := { if styling.alternate_saga_reminder != "" then styling.alternate_saga_reminder else if is_class() then "Gain the next level as a sorcery to add its ability." else "As this Saga enters and after your draw step, add a lore counter. Sacrifice after III." } diff --git a/data/magic-m15-meld-3in1.mse-style/style b/data/magic-m15-meld-3in1.mse-style/style index 342e1d89f..5f617f32b 100644 --- a/data/magic-m15-meld-3in1.mse-style/style +++ b/data/magic-m15-meld-3in1.mse-style/style @@ -69,7 +69,7 @@ init script: # Is the second card face a creature? has_pt_2 := { card.power_2 != "" or card.toughness_2 != "" } - card_shape := { "two-sided" } + card_shape := { "double faced" } has_identity := { styling.color_indicator_dot } has_identity_2 := {styling.color_indicator_dot_2 } is_unsorted := {styling.remove_from_autocount} @@ -1190,4 +1190,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-meld-colored.mse-style/style b/data/magic-m15-meld-colored.mse-style/style index d7d3c1e24..8a1f4a6a8 100644 --- a/data/magic-m15-meld-colored.mse-style/style +++ b/data/magic-m15-meld-colored.mse-style/style @@ -69,7 +69,7 @@ init script: # Is the second card face a creature? has_pt_2 := { card.power_2 != "" or card.toughness_2 != "" } - card_shape := { "two-sided" } + card_shape := { "double faced" } has_identity := { styling.color_indicator_dot } has_identity_2 := {styling.color_indicator_dot_2 } is_unsorted := {styling.remove_from_autocount} @@ -851,4 +851,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-meld.mse-style/style b/data/magic-m15-meld.mse-style/style index 21b395524..7703b474e 100644 --- a/data/magic-m15-meld.mse-style/style +++ b/data/magic-m15-meld.mse-style/style @@ -69,7 +69,7 @@ init script: # Is the second card face a creature? has_pt_2 := { card.power_2 != "" or card.toughness_2 != "" } - card_shape := { "two-sided" } + card_shape := { "double faced" } has_identity := { styling.color_indicator_dot } is_unsorted := {styling.remove_from_autocount} ############################################################## Set info fields @@ -836,4 +836,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-miracle.mse-style/style b/data/magic-m15-miracle.mse-style/style index 63088a716..69617c30f 100644 --- a/data/magic-m15-miracle.mse-style/style +++ b/data/magic-m15-miracle.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Miracles full name: M15 Miracle frame icon: card-sample.png installer group: magic/m15 style/miracle cards -position hint: 011 +position hint: 012 version: 2018-02-09 depends on: @@ -471,4 +471,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-nyx.mse-style/style b/data/magic-m15-nyx.mse-style/style index 286cbec2c..34fccd27b 100644 --- a/data/magic-m15-nyx.mse-style/style +++ b/data/magic-m15-nyx.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Gods full name: Gods After M15 icon: card-sample.png installer group: magic/m15 style/god cards -position hint: 011 +position hint: 012 version: 2018-02-09 depends on: @@ -494,4 +494,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-saga.mse-style/style b/data/magic-m15-saga.mse-style/style index 477a294a1..4dfee9f42 100644 --- a/data/magic-m15-saga.mse-style/style +++ b/data/magic-m15-saga.mse-style/style @@ -78,7 +78,7 @@ init script: else "loyalty naught" } - card_shape := {"saga"} + card_shape := { if contains(styling.other_options, match: "class") then "class" else "saga" } # Is the card a promo card? is_promo := { styling.promo } diff --git a/data/magic-m15-split-fusable.mse-style/style b/data/magic-m15-split-fusable.mse-style/style index d7c568251..0afc8f902 100644 --- a/data/magic-m15-split-fusable.mse-style/style +++ b/data/magic-m15-split-fusable.mse-style/style @@ -4,7 +4,7 @@ short name: Mainframe Splits full name: Fusable Split Cards icon: card-sample.png installer group: magic/m15 style/split cards/fuse -position hint: 040 +position hint: 011 version: 2018-06-01 depends on: diff --git a/data/magic-m15-token-clear.mse-style/style b/data/magic-m15-token-clear.mse-style/style index 0e99308f7..f1708e3e6 100644 --- a/data/magic-m15-token-clear.mse-style/style +++ b/data/magic-m15-token-clear.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Clear Tokens full name: After M15 Clear Tokens icon: card-sample.png installer group: magic/m15 style/tokens/Clear -position hint: 005 +position hint: 014 version: 2018-02-09 depends on: @@ -402,4 +402,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-token-legendary.mse-style/style b/data/magic-m15-token-legendary.mse-style/style index 5bd470fcd..7aa8f991e 100644 --- a/data/magic-m15-token-legendary.mse-style/style +++ b/data/magic-m15-token-legendary.mse-style/style @@ -4,7 +4,7 @@ short name: M15 Tokens full name: Legendary icon: card-sample.png installer group: magic/m15 style/tokens -position hint: 003 +position hint: 014 version: 2018-04-28 depends on: @@ -395,4 +395,4 @@ extra card style: name: Matrix size: 7 color: white - weight: bold \ No newline at end of file + weight: bold diff --git a/data/magic-m15-vanguard.mse-style/style b/data/magic-m15-vanguard.mse-style/style index b651a3750..1e16c7959 100644 --- a/data/magic-m15-vanguard.mse-style/style +++ b/data/magic-m15-vanguard.mse-style/style @@ -53,7 +53,8 @@ init script: comma_count := filter_text@(match:",") is_token := { styling.token == "text" or styling.token == "textless" } is_blank_token := { styling.token == "textless" } - has_identity := {styling.color_indicator_dot } + has_identity := { false } + has_identity_2 := { false } ancestral_mana := { styling.ancestral_mana_symbols } bar_offset := {if styling_offset() == "-" then 0 else if styling_offset() != "" then -styling_offset() else 0} diff --git a/data/magic-new-doublefaced.mse-style/style b/data/magic-new-doublefaced.mse-style/style index d03a6f148..177d2ef78 100644 --- a/data/magic-new-doublefaced.mse-style/style +++ b/data/magic-new-doublefaced.mse-style/style @@ -70,6 +70,7 @@ init script: # This will create two seperate card faces card_background2 := { color_background(type:"card2", base_hybrid:card_hybrid) } card_ptbox2 := { color_background(type:"pt2", base_hybrid:pt_hybrid) } + card_shape := { "double faced" } ############################################################## Set info fields set info style: diff --git a/data/magic-new-omega-doublefaced.mse-style/style b/data/magic-new-omega-doublefaced.mse-style/style index caa0af211..1212ae7b9 100644 --- a/data/magic-new-omega-doublefaced.mse-style/style +++ b/data/magic-new-omega-doublefaced.mse-style/style @@ -67,7 +67,7 @@ init script: # This will create two seperate card faces card_background2 := { color_background(type:"card2", base_hybrid:card_hybrid) } card_ptbox2 := { color_background(type:"pt2", base_hybrid:pt_hybrid) } - + card_shape := { "double faced" } ############################################################## Set info fields set info style: diff --git a/data/magic-new-planeswalker-artbg.mse-style/style b/data/magic-new-planeswalker-artbg.mse-style/style index b3b88c58e..96b35e93b 100644 --- a/data/magic-new-planeswalker-artbg.mse-style/style +++ b/data/magic-new-planeswalker-artbg.mse-style/style @@ -65,7 +65,8 @@ init script: if styling.display_border then paintbrush_color() else styling.copyright_color } - + card_shape := { "planeswalker" } + ############################################################## Set info fields set info style: symbol: diff --git a/data/magic-new-planeswalker-basic.mse-style/style b/data/magic-new-planeswalker-basic.mse-style/style index 45fd1bcc1..085aa665b 100644 --- a/data/magic-new-planeswalker-basic.mse-style/style +++ b/data/magic-new-planeswalker-basic.mse-style/style @@ -121,6 +121,7 @@ init script: # Loyalty colon scripts colon := { if input != "" then ":" else ""} loyalty_colon := {colon(card.loyalty_cost_1)+"\n"+colon(card.loyalty_cost_2)+"\n"+colon(card.loyalty_cost_3)} + card_shape := { "planeswalker" } ############################################################## Set info fields set info style: symbol: diff --git a/data/magic-small-plain-flip.mse-style/style b/data/magic-small-plain-flip.mse-style/style index 1085cb126..9a4919e47 100644 --- a/data/magic-small-plain-flip.mse-style/style +++ b/data/magic-small-plain-flip.mse-style/style @@ -32,7 +32,7 @@ init script: # is text box empty? has_text := {(card.rule_text!="") or (card.flavor_text!="")} - + card_shape := { "flip" } ############################################################## Extra style options styling field: @@ -319,4 +319,4 @@ extra card style: right: 142 right width: 0 z index: 2 - radius: 3 \ No newline at end of file + radius: 3 diff --git a/data/magic.mse-game/card_fields b/data/magic.mse-game/card_fields index ba14ff692..e9f92d788 100644 --- a/data/magic.mse-game/card_fields +++ b/data/magic.mse-game/card_fields @@ -25,7 +25,7 @@ card field: choice: checklist choice: emblem choice: masterpiece - choice: nightbreak + choice: nightbreak choice: plane card choice: saga script: @@ -129,16 +129,18 @@ card field: card list alignment: right card list width: 50 card list name: CC + show statistics: false description: The casting cost of the card card field: type: choice name: card symbol position hint: 10 - icon: stats/card_symbol.png + icon: stats/symbol.png choice: none choice: tombstone choice: alchemy choice: alchemy old + show statistics: false description: Symbol for this card card field: type: choice @@ -219,15 +221,16 @@ card field: card field: type: text name: super type - icon: stats/card_type.png + icon: stats/type.png position hint: 30 script: super_type_filter(value) show statistics: false card field: type: text name: sub type - icon: stats/creature_type.png + icon: stats/type.png position hint: 31 + show statistics: false script: sub_type_filter(value, type:card.super_type) card field: type: text @@ -308,6 +311,7 @@ card field: icon: stats/watermark.png position hint: 200 include file: /magic-watermarks.mse-include/watermark-names + show statistics: false description: A watermark for below the textbox, this can be a big mana symbol used on basic lands, or a guild symbol ###############################Leveler textboxes card field: @@ -410,8 +414,9 @@ card field: card field: type: text name: loyalty - icon: stats/toughness.png + icon: stats/loyalty.png position hint: 59 + show statistics: false description: The initial loyalty of a planeswalker card field: type: text @@ -551,6 +556,7 @@ card field: choice: alchemy old choice: custom default: set.default_stamp + show statistics: false description: The stamp style for this card. ############################################################## Duplicate fields (split/flip cards) # Based on flip templates by Wolfwood @@ -560,7 +566,7 @@ card field: card field: type: multiple choice name: card color 2 - icon: stats/card_color.png + icon: stats/color.png empty choice: colorless choice: white choice: blue @@ -642,7 +648,7 @@ card field: card field: type: choice name: card symbol 2 - icon: stats/card_symbol.png + icon: stats/symbol.png choice: none choice: tombstone choice: alchemy @@ -707,13 +713,13 @@ card field: card field: type: text name: super type 2 - icon: stats/creature_type.png + icon: stats/type.png show statistics: false script: super_type_filter(value) card field: type: text name: sub type 2 - icon: stats/creature_type.png + icon: stats/type.png show statistics: false script: sub_type_filter(value, type:card.super_type_2) card field: @@ -733,13 +739,13 @@ card field: card field: type: text name: super type 3 - icon: stats/creature_type.png + icon: stats/type.png show statistics: false script: super_type_filter(value) card field: type: text name: sub type 3 - icon: stats/creature_type.png + icon: stats/type.png show statistics: false script: sub_type_filter(value, type:card.super_type_3) card field: @@ -901,7 +907,7 @@ card field: card field: type: text name: loyalty 2 - icon: stats/toughness.png + icon: stats/loyalty.png show statistics: false description: The initial loyalty of a planeswalker card field: @@ -1358,3 +1364,16 @@ card field: script: text_filter(input: value, card_name: if set.alias_as_cardname and card.alias_2 != "" then card.alias_2 else card.name_2, margin_code:"unknown") default: if not b_saga() then "" else "(" + saga_reminderb() + ")" description: The saga reminder text +card field: + type: choice + name: card stamp 2 + choice: standard + choice: none + choice: acorn + choice: universes beyond + choice: alchemy + choice: alchemy old + choice: custom + default: set.default_stamp + show statistics: false + description: The stamp style for this card. diff --git a/data/magic.mse-game/icons/language-en-ca.png b/data/magic.mse-game/icons/language-en-ca.png new file mode 100644 index 0000000000000000000000000000000000000000..13b059c6c88e494822baab401cceef09e5007080 GIT binary patch literal 5956 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 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/icons/language-en-gb.png b/data/magic.mse-game/icons/language-en-gb.png new file mode 100644 index 0000000000000000000000000000000000000000..8f61db363f0bf2c84000cc4bb41af45ce627f180 GIT binary patch literal 6915 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 T1`o0b00000NkvXXu0mjf=dtef literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/language b/data/magic.mse-game/language index 0135477b0..6cd1f12ab 100644 --- a/data/magic.mse-game/language +++ b/data/magic.mse-game/language @@ -1,26 +1,645 @@ - - -# Language specific strings +############# Localization Hub +############# Strings and Word Lists specific to supported languages languages := [ English: [ code : "en", spellcheck_code : "en_US", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", + is_battle : match@(match: "(?i)Battle") is_creature : match@(match: "(?i)Creature") - is_tribal : match@(match: "(?i)Tribal") + is_dungeon : match@(match: "(?i)Dungeon") + is_tribal : match@(match: "(?i)Tribal|Kindred") + is_kindred : match@(match: "(?i)Tribal|Kindred") is_artifact : match@(match: "(?i)Artifact") is_land : match@(match: "(?i)Land") is_enchantment : match@(match: "(?i)Enchantment") is_spell : match@(match: "(?i)Instant|Sorcery") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_instant : match@(match: "(?i)Instant") + is_sorcery : match@(match: "(?i)Sorcery") + is_planeswalker : match@(match: "(?i)Planeswalker") is_plane : match@(match: "(?i)Plane(?!swalker)") - word_list : "word_list" + is_nonstandard : match@(match: "(?i)(Token|Emblem|Dungeon|Hero|Conspiracy|Vanguard|Scheme|Phenomenon|Plane\\b)") + is_token : match@(match: "(?i)Token") + is_basic : match@(match: "(?i)Basic") + is_conspiracy : match@(match: "(?i)Conspiracy") + is_emblem : match@(match: "(?i)Emblem") + is_hero : match@(match: "(?i)Hero") + is_phenomenon : match@(match: "(?i)Phenomenon") + is_scheme : match@(match: "(?i)Scheme") + is_vanguard : match@(match: "(?i)Vanguard") + is_legendary : match@(match: "(?i)Legendary") + is_snow : match@(match: "(?i)Snow") + is_vehicle : match@(match: "(?i)Vehicle") + is_elite : match@(match: "(?i)Elite") + is_host : match@(match: "(?i)Host") + is_ongoing : match@(match: "(?i)Ongoing") + is_world : match@(match: "(?i)World") + is_plains : match@(match: "(?i)Plains") + is_island : match@(match: "(?i)Island") + is_swamp : match@(match: "(?i)Swamp") + is_mountain : match@(match: "(?i)Mountain") + is_forest : match@(match: "(?i)Forest") + is_wastes : match@(match: "(?i)Wastes") + get_supertypes : filter_text@(match: "(?i)(Legendary|Basic|Snow|Token|World|Ongoing|Elite|Host)\\b ?") + remove_supertypes : replace_text@(match: "(?i)(Legendary|Basic|Snow|Token|World|Ongoing|Elite|Host)\\b ?", replace:"") + base_supertypes : "Legendary|Basic|Snow|Token|World|Ongoing|Elite|Host" + mana_symbol_production : filter_text@(match:"]*>[^<]+<\\/sym[^>]*>", in_context:"\\b[Aa]dd [^(\n|^).]*") + gold_mana_production : filter_text@(match:"(any( one)?|different|combination of) color", in_context:"\\b[Aa]dd [^(\n|^).]*") + chosen_mana_production : filter_text@(match:"that color|chosen color", in_context:"\\b[Aa]dd [^(\n|^).]*") + + word_list : "word_list", + word_list_artifact: + "Attraction," + + "Blood," + + "Clue," + + "Contraption," + + "Equipment," + + "Food," + + "Fortification," + + "Gold," + + "Incubator," + + "Junk," + + "Map," + + "Powerstone," + + "Treasure," + + "Vehicle" + word_list_battle: "Siege" + word_list_dungeon: "Undercity" + word_list_land: + "Cave," + + "Desert," + + "Gate," + + "Lair," + + "Locus," + + "Mine," + + "Power-Plant," + + "Sphere," + + "Tower," + + "Urza's" + word_list_enchantment: + "Aura," + + "Background," + + "Cartouche," + + "Class," + + "Curse," + + "Role," + + "Rune," + + "Saga," + + "Shard," + + "Shrine" + word_list_spell: + "Adventure," + + "Arcane," + + "Lesson," + + "Trap" + word_list_planeswalker: + "Ajani," + + "Aminatou," + + "Angrath," + + "Arlinn," + + "Ashiok," + + "Bahamut," + + "Basri," + + "Bolas," + + "Calix," + + "Chandra," + + "Comet," + + "Dack," + + "Dakkon," + + "Daretti," + + "Davriel," + + "Dihada," + + "Domri," + + "Dovin," + + "Ellywick," + + "Elminister," + + "Elspeth," + + "Estrid," + + "Freyalise," + + "Garruk," + + "Gideon," + + "Grist," + + "Guff," + + "Huatli," + + "Jace," + + "Jared," + + "Jaya," + + "Jeska," + + "Kaito," + + "Karn," + + "Kasmina," + + "Kaya," + + "Kiora," + + "Koth," + + "Liliana," + + "Lolth," + + "Lukka," + + "Minsc," + + "Mordenkainen," + + "Nahiri," + + "Narset," + + "Niko," + + "Nissa," + + "Nixilis," + + "Oko," + + "Quintorius," + + "Ral," + + "Rowan," + + "Saheeli," + + "Samut," + + "Sarkhan," + + "Serra," + + "Sivitri," + + "Sorin," + + "Szat," + + "Tamiyo," + + "Tasha," + + "Teferi," + + "Teyo," + + "Tezzeret," + + "Tibalt," + + "Tyvar," + + "Ugin," + + "Urza," + + "Venser," + + "Vivien," + + "Vraska," + + "Vronos," + + "Will," + + "Windgrace," + + "Wrenn," + + "Xenagos," + + "Yanggu," + + "Yanling," + + "Zariel" + +############# Very Long Word Lists +############# Split into array of strings for submenus +############# Used directly by the localized word_lists +############# Combined for the upgraded stats page + + word_lists_basic: ["Plains", "Island", "Swamp", "Mountain", "Forest"] + word_lists_race: [ + "Aetherborn," + + "Alien," + + "Angel," + + "Antelope," + + "Ape," + + "Archon," + + "Assembly-Worker," + + "Astartes," + + "Atog," + + "Aurochs," + + "Avatar," + + "Azra", + + "Badger," + + "Balloon," + + "Basilisk," + + "Bat," + + "Bear," + + "Beast," + + "Beeble," + + "Beholder," + + "Bird," + + "Blinkmoth," + + "Boar," + + "Bringer," + + "Brushwagg", + + "C'tan," + + "Camarid," + + "Camel," + + "Capybara," + + "Caribou," + + "Carrier," + + "Cat," + + "Centaur," + + "Cephalid," + + "Chimera," + + "Cockatrice," + + "Construct," + + "Crab," + + "Crocodile," + + "Custodes," + + "Cyberman," + + "Cyclops", + + "Dalek," + + "Dauthi," + + "Demigod," + + "Demon," + + "Devil," + + "Dinosaur," + + "Djinn," + + "Dog," + + "Dragon," + + "Drake," + + "Dreadnought," + + "Drone," + + "Dryad," + + "Dwarf", + + "Efreet," + + "Egg," + + "Eldrazi," + + "Elemental," + + "Elephant," + + "Elf," + + "Elk," + + "Eye", + + "Faerie," + + "Ferret," + + "Fish," + + "Fox," + + "Fractal," + + "Frog," + + "Fungus", + + "Gargoyle," + + "Germ," + + "Giant," + + "Gith," + + "Gnoll," + + "Gnome," + + "Goat," + + "Goblin," + + "God," + + "Golem," + + "Gorgon," + + "Graveborn," + + "Gremlin," + + "Griffin", + + "Hag," + + "Halfling," + + "Hamster," + + "Harpy," + + "Hellion," + + "Hippo," + + "Hippogriff," + + "Homarid," + + "Homunculus," + + "Horror," + + "Horse," + + "Hound," + + "Human," + + "Hydra," + + "Hyena", + + "Illusion," + + "Imp," + + "Incarnation," + + "Inkling," + + "Insect", + + "Jackal," + + "Jellyfish," + + "Juggernaut", + + "Kavu," + + "Kirin," + + "Kithkin," + + "Kobold," + + "Kor," + + "Kraken", + + "Lamia," + + "Lammasu," + + "Leech," + + "Leviathan," + + "Lhurgoyf," + + "Licid," + + "Lizard," + + "Llama", + + "Manticore," + + "Masticore," + + "Merfolk," + + "Metathran," + + "Minotaur," + + "Mite," + + "Mole," + + "Mongoose," + + "Monkey," + + "Moonfolk," + + "Mouse," + + "Mutant," + + "Myr", + + "Nautilus," + + "Necron," + + "Nephilim," + + "Nightmare," + + "Nightstalker," + + "Noggle," + + "Nymph", + + "Octopus," + + "Ogre," + + "Ooze," + + "Orb," + + "Orc," + + "Orgg," + + "Otter," + + "Ouphe," + + "Ox," + + "Oyster", + + "Pangolin," + + "Pegasus," + + "Pentavite," + + "Pest," + + "Phelddagrif," + + "Phoenix," + + "Phyrexian," + + "Pincher," + + "Plant," + + "Prism", + + "Rabbit," + + "Raccoon," + + "Rat," + + "Reflection," + + "Rhino," + + "Robot", + + "Sable," + + "Salamander," + + "Sand," + + "Saproling," + + "Satyr," + + "Scarecrow," + + "Scorpion," + + "Sculpture," + + "Serpent," + + "Servo," + + "Shade," + + "Shapeshifter," + + "Shark," + + "Sheep," + + "Siren," + + "Skeleton," + + "Slith," + + "Sliver," + + "Slug", + + "Snail," + + "Snake," + + "Soltari," + + "Spawn," + + "Specter," + + "Sphinx," + + "Spider," + + "Spike," + + "Spirit," + + "Splinter," + + "Sponge," + + "Squid," + + "Squirrel," + + "Starfish," + + "Surrakar", + + "Tentacle," + + "Tetravite," + + "Thalakos," + + "Thopter," + + "Thrull," + + "Tiefling," + + "Time Lord," + + "Treefolk," + + "Trilobite," + + "Triskelavite," + + "Troll," + + "Turtle," + + "Tyranid", + + "Unicorn", + + "Vampire," + + "Vedalken," + + "Viashino," + + "Volver", + + "Wall," + + "Walrus," + + "Weird," + + "Werewolf," + + "Whale," + + "Wolf," + + "Wolverine," + + "Wombat," + + "Worm," + + "Wraith," + + "Wurm", + + "Yeti", + + "Zombie," + + "Zubera" + ] + + word_lists_class: [ + "Advisor," + + "Ally," + + "Archer," + + "Archon," + + "Army," + + "Artificer," + + "Assassin," + + "Barbarian," + + "Bard," + + "Beast," + + "Berserker," + + "Carrier," + + "Child," + + "Citizen," + + "Cleric," + + "Clown," + + "Coward", + + "Deserter," + + "Detective," + + "Doctor," + + "Dreadnought," + + "Drone," + + "Druid," + + "Egg," + + "Elder," + + "Employee," + + "Flagbearer," + + "Gamer," + + "Guest," + + "Horror," + + "Incarnation," + + "Inquisitor," + + "Juggernaut," + + "Knight", + + "Leviathan," + + "Mercenary," + + "Minion," + + "Monger," + + "Monk," + + "Mutant," + + "Mystic," + + "Ninja," + + "Noble," + + "Nomad," + + "Peasant," + + "Performer," + + "Pilot," + + "Pirate," + + "Praetor," + + "Primarch," + + "Processor", + + "Ranger," + + "Rebel," + + "Reflection," + + "Rigger," + + "Rogue," + + "Samurai," + + "Scientist," + + "Scion," + + "Scout," + + "Serf," + + "Shaman," + + "Skeleton," + + "Soldier," + + "Spawn," + + "Spellshaper," + + "Spirit," + + "Survivor", + + "Thopter," + + "Vampire," + + "Warlock," + + "Warrior," + + "Werewolf," + + "Wizard," + + "Zombie" + ] + + word_lists_plane: [ + "Alara," + + "Amonkhet," + + "Arcavios," + + "Bloomburrow," + + "Capenna," + + "Dominaria," + + "Duskmourn," + + "Eldraine," + + "Ikoria," + + "Innistrad," + + "Ixalan," + + "Kaladesh," + + "Kaldheim," + + "Kamigawa," + + "Lorwyn," + + "Mercadia," + + "Mirrodin," + + "New Phyrexia," + + "Rath," + + "Ravnica," + + "Shadowmoor," + + "Tarkir," + + "Theros," + + "Thunder Junction," + + "Ulgrotha," + + "Zendikar", + + "The Abyss," + + "Antausia," + + "Arkhos," + + "Azgol," + + "Belenon," + + "Bolas's Meditation Realm," + + "Cridhe," + + "Echoir," + + "Equilor," + + "Ergamon," + + "Fabacin," + + "Fiora," + + "Gargantikar," + + "Gobakhan," + + "Iquatana," + + "Ir," + + "Karsus," + + "Kephalai," + + "Kinshala," + + "Kolbahan," + + "Kylem," + + "Kyneth," + + "Luvion," + + "Moag," + + "Mongseng," + + "Muraganda," + + "Phyrexia," + + "Pyrulea," + + "Rabiah," + + "Regatha," + + "Segovia," + + "Serra's Realm," + + "Shandalar," + + "Shenmeng," + + "Valla," + + "Vryn," + + "Wildfire," + + "Xerex," + + "Zhalfir", + + "Alkabah," + + "Aranzhur," + + "Diraden," + + "Kodisha," + + "Metal Island," + + "Skalla," + + "Tavelia," + + "Tolvada", + + "Azoria," + + "Cabralin," + + "Celesta," + + "Gastal," + + "Ilcae," + + "Mirrankkar," + + "Nether Void," + + "Obsidias," + + "Torwynn," + + "Vatraquaz", + + "Alfava Metraxis," + + "Androzani Minor," + + "Apalapucia," + + "The Dalek Asylum," + + "Darillium," + + "Earth," + + "Gallifrey," + + "Horsehead Nebula," + + "Kandoka," + + "The Library," + + "Mars," + + "Moon," + + "Necros," + + "New Earth," + + "Outside Mutter's Spiral," + + "Skaro," + + "Spacecraft," + + "Time," + + "Trenzalore," + + "Unknown Planet" + ] + ], "English (British)": [ code : "en", spellcheck_code : "en_GB", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", @@ -30,13 +649,14 @@ languages := [ is_land : match@(match: "(?i)Land") is_enchantment : match@(match: "(?i)Enchantment") is_spell : match@(match: "(?i)Instant|Sorcery") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_planeswalkish : match@(match: "(?i)Planeswalker|Emblem") is_plane : match@(match: "(?i)Plane(?!swalker)") word_list : "word_list" ], "English (Canadian)": [ code : "en", spellcheck_code : "en_CA", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", @@ -46,13 +666,14 @@ languages := [ is_land : match@(match: "(?i)Land") is_enchantment : match@(match: "(?i)Enchantment") is_spell : match@(match: "(?i)Instant|Sorcery") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_planeswalkish : match@(match: "(?i)Planeswalker|Emblem") is_plane : match@(match: "(?i)Plane(?!swalker)") word_list : "word_list" ], Russian: [ code : "ru", spellcheck_code : "ru_RU", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", @@ -62,13 +683,14 @@ languages := [ is_land : match@(match: "(?i)Земля") is_enchantment : match@(match: "(?i)Чары") is_spell : match@(match: "(?i)Мгновенное заклинание|Волшебство") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_planeswalkish : match@(match: "(?i)Planeswalker|Emblem") is_plane : match@(match: "(?i)Plane(?!swalker)") word_list : "word_list_ru" ], Italiano: [ code : "it", spellcheck_code : "it_IT", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", @@ -78,13 +700,14 @@ languages := [ is_land : match@(match: "(?i)Terra") is_enchantment : match@(match: "(?i)Incantesimo") is_spell : match@(match: "(?i)Istantaneo|Stregoneria") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_planeswalkish : match@(match: "(?i)Planeswalker|Emblem") is_plane : match@(match: "(?i)Plane(?!swalker)") word_list : "word_list_it" ], "Português do Brasil" : [ code : "pt-br", spellcheck_code : "pt_BR", + fallback : "English", pt_separator : "/", type_separator : " — ", subtype_separator : " ", @@ -94,13 +717,14 @@ languages := [ is_land : match@(match: "(?i)Terreno") is_enchantment : match@(match: "(?i)Encantamento") is_spell : match@(match: "(?i)Mágica Instantânea|Feitiço") - is_planeswalker : match@(match: "(?i)Planeswalker|Emblem") + is_planeswalkish : match@(match: "(?i)Planeswalker|Emblem") is_plane : match@(match: "(?i)Plane(?!swalker)") word_list : "word_list_pt" ], Français: [ code : "fr", spellcheck_code : "fr_FR", + fallback : "English", pt_separator : "/", type_separator : " : " subtype_separator : " et ", @@ -110,19 +734,50 @@ languages := [ is_land : match@(match: "(?i)Terrain") is_enchantment : match@(match: "(?i)Enchantement") is_spell : match@(match: "(?i)Éphémère|Rituel") - is_planeswalker : match@(match: "(?i)Planeswalker") + is_planeswalkish : match@(match: "(?i)Planeswalker") is_plane : match@(match: "(?i)Plane(?!swalker)") - word_list : "word_list_fr" + word_list : "word_list", + word_lists_basic: ["Plaine", "Île", "Marais", "Montagne", "Forêt"] + word_list_artifact: + "Attraction," + + "Sang," + + "Indice," + + "Appareil," + + "Équipement," + + "Nourriture," + + "Fortification," + + "Or," + + "Incubateur," + + "Lithoforce," + + "Trésor," + + "Véhicule" + word_list_land: + "Grotte," + + "Désert," + + "Porte," + + "Repaire," + + "Site," + + "Mine," + + "Centrale énergétique," + + "Sphère," + + "Tour," + + "D'urza" ] ] # The selected language language := { languages[set.card_language] or else languages.English } +# The language's name lang_name := { if languages[set.card_language].code or else false != false then set.card_language else "English" } +# Get a setting from a language, or use a fallback +lang_setting := { + language()[input] or else languages[language().fallback][input] or else languages.English[input] or else "" +} +# language scripts spanish_number := { input := remove_tags(input) espanol_ones_array := ["cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez", "once", "doce", "trece", "catorce", "quince"] diff --git a/data/magic.mse-game/script b/data/magic.mse-game/script index 9072dd82d..c2a1022ec 100644 --- a/data/magic.mse-game/script +++ b/data/magic.mse-game/script @@ -4,6 +4,7 @@ include file: language # needed by all style files anyway include file: /magic-blends.mse-include/new-blends +include file: statistics_script ############################################################## version check version_date := {"2023-02-21"} @@ -953,16 +954,18 @@ sub_type_filter := { input := remove_tag(tag: "= length(input) then "" else if i == length(input)-1 then input[i] - else input[i]+sep+join2(input, i: i+1, sep: sep) -}@(i: 0) + else input[i]+sep+join(input, i: i+1, sep: sep) +}@(i: 0, sep:"") + +# workaround cause position() is broken for text arrays +contains_element := { + if input == [] then false else length(filter_list(input, filter:{input == element})) > 0 +} ar_position := { pos := -1 dummy := for x from 0 to length(in)-1 do ( diff --git a/data/magic.mse-game/set_fields b/data/magic.mse-game/set_fields index 04050333e..3459a0aae 100644 --- a/data/magic.mse-game/set_fields +++ b/data/magic.mse-game/set_fields @@ -1,4 +1,4 @@ - + ############################################################## Set fields set field: @@ -155,10 +155,6 @@ set field: type: boolean name: rarity codes description: Show rarity codes on M15 frames? -set field: - type: boolean - name: trim statistics - description: Removes tokens, special rarity, and masterpiece rarity from most statistics. set field: type: boolean name: curly quotes @@ -238,6 +234,53 @@ set field: name: wedge mana costs description: Depreciated. Should three color mana costs sort in wedge order like in Khans block? initial: no +set field: + type: info + name: Statistics +set field: + type: boolean + name: trim statistics + description: Removes special and masterpiece rarity cards from the statistics, as well as tokens, emblems, dungeons, heroes, conspiracies, vanguards, schemes, planes and phenomenons. Type statistics_info() in the console for detailed help. + initial: no +set field: + type: text + name: filter statistics + description: Filter cards from the statistics. Syntax is: field_name_1=="value_1", field_name_2=="value_2", etc. Use == for strict equality, != for not equal, =: for contains, !: for not contains, <= and >= for numeric comparisons. Example: color=="RG", mana_value<="4", rule_text=:"deathtouch", sub_type!:"goblin" +set field: + type: multiple choice + name: count secondary faces + description: Count the back side or secondary faces of the cards in the statistics? Type statistics_info() in the console for detailed help. + choice: MDFC + choice: TDFC + choice: Adventure + choice: Split + choice: Aftermath + choice: Flip + initial: MDFC, Adventure, Split +set field: + type: text + name: custom super types + description: Custom supertypes for the stats page, separated by commas. Do not write custom types or subtypes. Type statistics_info() in the console for detailed help. +set field: + type: text + name: custom creature races + description: Custom races for the stats page, separated by commas, or type "detect" for MSE to grab them. Type statistics_info() in the console for detailed help. + default: "detect" + script: + if value == "detect" then detect_custom_creature_subtypes_statistic() else value +set field: + type: text + name: custom creature classes + description: Custom classes for the stats page, separated by commas. Type statistics_info() in the console for detailed help. +set field: + type: text + name: card notes clauses split + description: Regex used to split the card notes in the Card Notes Clauses statistics category. Default is " *(\.|\n|;|,|(?=!)) *" which splits at each semicolon, each dot, each exclamation mark and each comma. + default: " *(\\.|\\n|;|,|(?=!)) *" +set field: + type: text + name: global_variable_average_opening_hand + script: global_variable_average_opening_hand_statistic() set field: type: info name: Mainframe Template Options @@ -316,6 +359,8 @@ set field: ############################# Default style default set style: + global_variable_average_opening_hand: + visible: false title: padding left: 2 font: @@ -432,6 +477,9 @@ default set style: automatic reminder text: render style: checklist direction: vertical + count secondary faces: + render style: checklist + direction: vertical sort special rarity: render style: both choice images: diff --git a/data/magic.mse-game/statistics b/data/magic.mse-game/statistics index fbed72254..66d8e06cf 100644 --- a/data/magic.mse-game/statistics +++ b/data/magic.mse-game/statistics @@ -1,291 +1,1352 @@ - -############################################################## Statistics dimensions + +############################################################## Statistics dimensions 30-03-2023 +############################################################## Blame GenevensiS for this statistics dimension: - name: card color - position hint: 0 - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else 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) + name: color category + position hint: 0000 + icon: stats/color.png + description: How many cards of each frame color are in the set. Only looking at the front face colors. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else primary_card_color(card.card_color) + group: land + group: colorless + group: artifact group: white group: blue group: black group: red group: green - group: colorless - group: artifact group: multicolor - group: land group: hybrid -statistics dimension: - name: promo colors - position hint: 800 - script: if card.rarity == "special" or card.rarity == "masterpiece" then primary_card_color(card.card_color) else "" - icon: stats/card_color.png colors: - white : rgb(255,237,202) - blue : rgb(42,141,255) + white : rgb(255,231,185) + blue : rgb(15,80,166) 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 + red : rgb(156,15,15) + green : rgb(68,144,15) + colorless : rgb(101,104,94) + artifact : rgb(109,132,158) + multicolor : rgb(244,177,10) + land : rgb(103,64,35) + hybrid : rgb(112,38,128) + statistics dimension: - name: omniverse card color - position hint: 9999 - script: primary_card_color(card.card_color) - icon: stats/card_color.png + name: exact color + position hint: 0010 + icon: stats/color.png + description: The color as defined by the comprehensive rules. Does not take into account the back side or secondary face (like on adventures for example), except for split cards and aftermath cards. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else prefixed_color_statistic() 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) - pink : rgb(255,175,200) - purple : rgb(150,100,160) - 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: pink - group: purple - group: colorless - group: artifact - group: multicolor - group: land - group: hybrid + ​C : rgb(101,104,94) # There is a zero width space before the "C" so that it always appears first. + ​​W : rgb(255,231,185) # There are two zero width spaces before the "W" so that it always appear after the "C". + ​​​U : rgb(15,80,166) # There are three zero width spaces before the "U", etc... + ​​​​B : rgb(22,22,22) + ​​​​​R : rgb(156,15,15) + ​​​​​​G : rgb(68,144,15) + ​​​​​​​WU : rgb(254,192,80) + ​​​​​​​​WB : rgb(254,192,80) + ​​​​​​​​​WR : rgb(254,192,80) + ​​​​​​​​​​WG : rgb(254,192,80) + ​​​​​​​​​​​UB : rgb(254,192,80) + ​​​​​​​​​​​​UR : rgb(254,192,80) + ​​​​​​​​​​​​​UG : rgb(254,192,80) + ​​​​​​​​​​​​​​BR : rgb(254,192,80) + ​​​​​​​​​​​​​​​BG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​RG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​​WUB : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​WUR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​WUG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​WBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​WBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​WRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​UBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​UBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​URG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​BRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBR : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WURG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​UBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBRG : rgb(224,133,8) + statistics dimension: - position hint: 2 - name: converted mana cost - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else cmc(card.casting_cost) - numeric: true + name: color identity + position hint: 0020 + icon: stats/color.png + description: The commander color identity as defined by the comprehensive rules. Takes into account all sides and faces of the card. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else prefixed_color_identity_statistic() + colors: + ​C : rgb(101,104,94) # There is a zero width space before the "C" so that it always appears first. + ​​W : rgb(255,231,185) # There are two zero width spaces before the "W" so that it always appear after the "C". + ​​​U : rgb(15,80,166) # There are three zero width spaces before the "U", etc... + ​​​​B : rgb(22,22,22) + ​​​​​R : rgb(156,15,15) + ​​​​​​G : rgb(68,144,15) + ​​​​​​​WU : rgb(254,192,80) + ​​​​​​​​WB : rgb(254,192,80) + ​​​​​​​​​WR : rgb(254,192,80) + ​​​​​​​​​​WG : rgb(254,192,80) + ​​​​​​​​​​​UB : rgb(254,192,80) + ​​​​​​​​​​​​UR : rgb(254,192,80) + ​​​​​​​​​​​​​UG : rgb(254,192,80) + ​​​​​​​​​​​​​​BR : rgb(254,192,80) + ​​​​​​​​​​​​​​​BG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​RG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​​WUB : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​WUR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​WUG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​WBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​WBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​WRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​UBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​UBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​URG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​BRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBR : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WURG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​UBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBRG : rgb(224,133,8) + +statistics dimension: + name: casting cost + position hint: 0100 icon: stats/casting_cost.png + description: The casting cost. Counts each side/face separately if the option is checked in the Set info tab. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else casting_cost_statistic() statistics dimension: - position hint: 3 - name: colored mana cost - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else colored_mana(card.casting_cost) + name: mana value + position hint: 0110 + icon: stats/mana_value.png + description: The mana value. Counts each side/face separately if the option is checked in the Set info tab, except for split cards and aftermath cards, for which it counts the sum of all faces. numeric: true - icon: stats/colored_casting_cost.png + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else mana_value_statistic() + +statistics dimension: + name: permanent/non + position hint: 0200 + icon: stats/type.png + description: Counts the number of creatures, noncreature permanents, and nonpermanents. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else permanent_statistic() + colors: + ​Creature : rgb(15,80,166) + ​​Permanent : rgb(18,105,166) + ​​​Non Permanent : rgb(156,15,15) + ​​​​Command Zone : rgb(244,227,21) + ​​​​​Unknown : rgb(33,33,33) statistics dimension: name: supertype - position hint: 27 - icon: stats/card_type.png - description: The card's supertype, not including types - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else remove_type(to_text(card.super_type)) - + position hint: 0210 + icon: stats/type.png + description: The card's supertype, not including types. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else supertype_statistic() + #group: Basic + #group: Snow + #group: World + #group: Legendary + #group: Token + #group: Ongoing + #group: Elite + #group: Host + colors: + ​Basic : rgb(103,64,35) # There is a zero width space before the "Basic" so that it always appears after custom types. + ​​Snow : rgb(109,132,158) # There are two zero width spaces before the "Snow" so that it always appears after basics. + ​​​World : rgb(120,100,180) # There are three zero width spaces before the "World", etc... + ​​​​Legendary : rgb(70,49,125) + ​​​​​Token : rgb(15,80,166) + ​​​​​​Ongoing : rgb(56,169,138) + ​​​​​​​Elite : rgb(195,221,62) + ​​​​​​​​Host : rgb(157,168,115) + statistics dimension: - name: type - position hint: 28 - icon: stats/card_type.png - description: The card's type, not including supertypes - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else remove_supertype(to_text(card.super_type)) + name: card type + position hint: 0220 + icon: stats/type.png + description: The card's type, not including supertypes. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else type_extended_statistic() + colors: + ​Land : rgb(103,64,35) # There is a zero width space before the "Land" so that it always appears after custom types. + ​​Creature : rgb(15,80,166) # There are two zero width spaces before the "Creature" so that it always appears after lands. + ​​​Kindred : rgb(65,107,162) # There are three zero width spaces before the "Kindred", etc... + ​​​​Artifact : rgb(109,132,158) + ​​​​​Enchantment : rgb(120,100,180) + ​​​​​​Emblem : rgb(85,75,152) + ​​​​​​​Planeswalker : rgb(70,49,125) + ​​​​​​​​Battle : rgb(136,14,108) + ​​​​​​​​​Sorcery : rgb(156,15,15) + ​​​​​​​​​​Instant : rgb(216,72,98) + ​​​​​​​​​​​Conspiracy : rgb(236,134,32) + ​​​​​​​​​​​​Dungeon : rgb(244,227,21) + ​​​​​​​​​​​​​Hero : rgb(195,221,62) + ​​​​​​​​​​​​​​Phenomenon : rgb(145,215,102) + ​​​​​​​​​​​​​​​Plane : rgb(123,198,55) + ​​​​​​​​​​​​​​​​Scheme : rgb(56,169,138) + ​​​​​​​​​​​​​​​​​Vanguard : rgb(72,165,172) + ​​​​​​​​​​​​​​​​​​No Type : rgb(33,33,33) statistics dimension: name: combined type - position hint: 29 - icon: stats/card_type.png - description: The traditional supertype statistic, with no filtering - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else card.super_type - -statistics dimension: - name: perm/non-perm - position hint: 30 - icon: stats/card_type.png - description: Is the card a creature, non-creature permanent, or nonpermanent? - script: - if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else - if is_creature(card.super_type) then "creature" - else if is_spell(card.super_type) then "nonpermanent" - else if is_artifact(card.super_type) or is_enchantment(card.super_type) or is_land(card.super_type) or contains(card.super_type, match:"Planeswalker") then "permanent" - else "unknown" - -statistics dimension: - name: race - position hint: 32 - icon: stats/creature_race.png - description: Race of creatures and tribal cards - script: - if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else - if is_creature(card.super_type) or is_tribal(card.super_type) then - only_first(card.sub_type) + position hint: 0230 + icon: stats/type.png + description: The card's supertypes and types concatenated. Counts each side/face separately. + split list: true show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else combined_type_statistic() + +#statistics dimension: +# name: type +# position hint: 0230 +# icon: stats/type.png +# description: The card's type, not including supertypes. Only showing the 8 most common types. +# split list: true +# show empty: false +# script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else type_statistic() +# group: Land +# group: Creature +# group: Artifact +# group: Enchantment +# group: Planeswalker +# group: Battle +# group: Sorcery +# group: Instant +# colors: +# Land : rgb(103,64,35) +# Creature : rgb(15,80,166) +# Artifact : rgb(109,132,158) +# Enchantment : rgb(120,100,180) +# Planeswalker : rgb(70,49,125) +# Battle : rgb(136,14,108) +# Sorcery : rgb(156,15,15) +# Instant : rgb(216,72,98) + + +statistics dimension: + name: combined subtype + position hint: 0250 + icon: stats/type.png + description: The card's subtypes concatenated. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else combined_subtype_statistic() + +statistics dimension: + name: noncreature subtype + position hint: 0260 + icon: stats/noncreature_subtype.png + description: Subtypes of all types except creature/tribal/kindred. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else noncreature_subtype_statistic() + colors: + #Land + ​Desert : rgb(103,64,35) # There is a zero width space before land types so that they always appear after custom types. + ​Forest : rgb(103,64,35) + ​Gate : rgb(103,64,35) + ​Island : rgb(103,64,35) + ​Lair : rgb(103,64,35) + ​Locus : rgb(103,64,35) + ​Mine : rgb(103,64,35) + ​Mountain : rgb(103,64,35) + ​Plains : rgb(103,64,35) + ​Power-Plant : rgb(103,64,35) + ​Swamp : rgb(103,64,35) + ​Tower : rgb(103,64,35) + ​Urza’s : rgb(103,64,35) + #Artifact + ​​Attraction : rgb(109,132,158) # There are two zero width spaces before artifact types so that they always appear after land types, etc... + ​​Blood : rgb(109,132,158) + ​​Clue : rgb(109,132,158) + ​​Contraption : rgb(109,132,158) + ​​Equipment : rgb(109,132,158) + ​​Food : rgb(109,132,158) + ​​Fortification : rgb(109,132,158) + ​​Gold : rgb(109,132,158) + ​​Incubator : rgb(109,132,158) + ​​Powerstone : rgb(109,132,158) + ​​Treasure : rgb(109,132,158) + ​​Vehicle : rgb(109,132,158) + #Enchantment + ​​​Aura : rgb(120,100,180) + ​​​Background : rgb(120,100,180) + ​​​Cartouche : rgb(120,100,180) + ​​​Class : rgb(120,100,180) + ​​​Curse : rgb(120,100,180) + ​​​Role : rgb(120,100,180) + ​​​Rune : rgb(120,100,180) + ​​​Saga : rgb(120,100,180) + ​​​Shard : rgb(120,100,180) + ​​​Shrine : rgb(120,100,180) + #Planeswalker + ​​​​Ajani : rgb(70,49,125) + ​​​​Aminatou : rgb(70,49,125) + ​​​​Angrath : rgb(70,49,125) + ​​​​Arlinn : rgb(70,49,125) + ​​​​Ashiok : rgb(70,49,125) + ​​​​Bahamut : rgb(70,49,125) + ​​​​Basri : rgb(70,49,125) + ​​​​Bolas : rgb(70,49,125) + ​​​​Calix : rgb(70,49,125) + ​​​​Chandra : rgb(70,49,125) + ​​​​Comet : rgb(70,49,125) + ​​​​Dack : rgb(70,49,125) + ​​​​Dakkon : rgb(70,49,125) + ​​​​Daretti : rgb(70,49,125) + ​​​​Davriel : rgb(70,49,125) + ​​​​Dihada : rgb(70,49,125) + ​​​​Domri : rgb(70,49,125) + ​​​​Dovin : rgb(70,49,125) + ​​​​Ellywick : rgb(70,49,125) + ​​​​Elminster : rgb(70,49,125) + ​​​​Elspeth : rgb(70,49,125) + ​​​​Estrid : rgb(70,49,125) + ​​​​Freyalise : rgb(70,49,125) + ​​​​Garruk : rgb(70,49,125) + ​​​​Gideon : rgb(70,49,125) + ​​​​Grist : rgb(70,49,125) + ​​​​Guff : rgb(70,49,125) + ​​​​Huatli : rgb(70,49,125) + ​​​​Jace : rgb(70,49,125) + ​​​​Jared : rgb(70,49,125) + ​​​​Jaya : rgb(70,49,125) + ​​​​Jeska : rgb(70,49,125) + ​​​​Kaito : rgb(70,49,125) + ​​​​Karn : rgb(70,49,125) + ​​​​Kasmina : rgb(70,49,125) + ​​​​Kaya : rgb(70,49,125) + ​​​​Kiora : rgb(70,49,125) + ​​​​Koth : rgb(70,49,125) + ​​​​Liliana : rgb(70,49,125) + ​​​​Lolth : rgb(70,49,125) + ​​​​Lukka : rgb(70,49,125) + ​​​​Minsc : rgb(70,49,125) + ​​​​Mordenkainen : rgb(70,49,125) + ​​​​Nahiri : rgb(70,49,125) + ​​​​Narset : rgb(70,49,125) + ​​​​Niko : rgb(70,49,125) + ​​​​Nissa : rgb(70,49,125) + ​​​​Nixilis : rgb(70,49,125) + ​​​​Oko : rgb(70,49,125) + ​​​​Ral : rgb(70,49,125) + ​​​​Rowan : rgb(70,49,125) + ​​​​Saheeli : rgb(70,49,125) + ​​​​Samut : rgb(70,49,125) + ​​​​Sarkhan : rgb(70,49,125) + ​​​​Serra : rgb(70,49,125) + ​​​​Sivitri : rgb(70,49,125) + ​​​​Sorin : rgb(70,49,125) + ​​​​Szat : rgb(70,49,125) + ​​​​Tamiyo : rgb(70,49,125) + ​​​​Tasha : rgb(70,49,125) + ​​​​Teferi : rgb(70,49,125) + ​​​​Teyo : rgb(70,49,125) + ​​​​Tezzeret : rgb(70,49,125) + ​​​​Tibalt : rgb(70,49,125) + ​​​​Tyvar : rgb(70,49,125) + ​​​​Ugin : rgb(70,49,125) + ​​​​Urza : rgb(70,49,125) + ​​​​Venser : rgb(70,49,125) + ​​​​Vivien : rgb(70,49,125) + ​​​​Vraska : rgb(70,49,125) + ​​​​Vronos : rgb(70,49,125) + ​​​​Will : rgb(70,49,125) + ​​​​Windgrace : rgb(70,49,125) + ​​​​Wrenn : rgb(70,49,125) + ​​​​Xenagos : rgb(70,49,125) + ​​​​Yanggu : rgb(70,49,125) + ​​​​Yanling : rgb(70,49,125) + ​​​​Zariel : rgb(70,49,125) + #Battle + ​​​​​Siege : rgb(136,14,108) + #Spell + ​​​​​​Adventure : rgb(156,15,15) + ​​​​​​Arcane : rgb(156,15,15) + ​​​​​​Lesson : rgb(156,15,15) + ​​​​​​Trap : rgb(156,15,15) + #Dungeon + ​​​​​​​Undercity : rgb(244,227,21) + #Plane + ​​​​​​​​Alara : rgb(123,198,55) + ​​​​​​​​Alfava Metraxis : rgb(123,198,55) + ​​​​​​​​Amonkhet : rgb(123,198,55) + ​​​​​​​​Androzani Minor : rgb(123,198,55) + ​​​​​​​​Antausia : rgb(123,198,55) + ​​​​​​​​Apalapucia : rgb(123,198,55) + ​​​​​​​​Arcavios : rgb(123,198,55) + ​​​​​​​​Arkhos : rgb(123,198,55) + ​​​​​​​​Azgol : rgb(123,198,55) + ​​​​​​​​Belenon : rgb(123,198,55) + ​​​​​​​​Bolas’s Meditation Realm : rgb(123,198,55) + ​​​​​​​​Capenna : rgb(123,198,55) + ​​​​​​​​Cridhe : rgb(123,198,55) + ​​​​​​​​Darillium : rgb(123,198,55) + ​​​​​​​​Dominaria : rgb(123,198,55) + ​​​​​​​​Earth : rgb(123,198,55) + ​​​​​​​​Echoir : rgb(123,198,55) + ​​​​​​​​Eldraine : rgb(123,198,55) + ​​​​​​​​Equilor : rgb(123,198,55) + ​​​​​​​​Ergamon : rgb(123,198,55) + ​​​​​​​​Fabacin : rgb(123,198,55) + ​​​​​​​​Fiora : rgb(123,198,55) + ​​​​​​​​Gallifrey : rgb(123,198,55) + ​​​​​​​​Gargantikar : rgb(123,198,55) + ​​​​​​​​Gobakhan : rgb(123,198,55) + ​​​​​​​​Horsehead Nebula : rgb(123,198,55) + ​​​​​​​​Ikoria : rgb(123,198,55) + ​​​​​​​​Innistrad : rgb(123,198,55) + ​​​​​​​​Iquatana : rgb(123,198,55) + ​​​​​​​​Ir : rgb(123,198,55) + ​​​​​​​​Ixalan : rgb(123,198,55) + ​​​​​​​​Kaladesh : rgb(123,198,55) + ​​​​​​​​Kaldheim : rgb(123,198,55) + ​​​​​​​​Kamigawa : rgb(123,198,55) + ​​​​​​​​Kandoka : rgb(123,198,55) + ​​​​​​​​Karsus : rgb(123,198,55) + ​​​​​​​​Kephalai : rgb(123,198,55) + ​​​​​​​​Kinshala : rgb(123,198,55) + ​​​​​​​​Kolbahan : rgb(123,198,55) + ​​​​​​​​Kylem : rgb(123,198,55) + ​​​​​​​​Kyneth : rgb(123,198,55) + ​​​​​​​​Lorwyn : rgb(123,198,55) + ​​​​​​​​Luvion : rgb(123,198,55) + ​​​​​​​​Mars : rgb(123,198,55) + ​​​​​​​​Mercadia : rgb(123,198,55) + ​​​​​​​​Mirrodin : rgb(123,198,55) + ​​​​​​​​Moag : rgb(123,198,55) + ​​​​​​​​Mongseng : rgb(123,198,55) + ​​​​​​​​Moon : rgb(123,198,55) + ​​​​​​​​Muraganda : rgb(123,198,55) + ​​​​​​​​Necros : rgb(123,198,55) + ​​​​​​​​New Earth : rgb(123,198,55) + ​​​​​​​​New Phyrexia : rgb(123,198,55) + ​​​​​​​​Outside Mutter’s Spiral : rgb(123,198,55) + ​​​​​​​​Phyrexia : rgb(123,198,55) + ​​​​​​​​Pyrulea : rgb(123,198,55) + ​​​​​​​​Rabiah : rgb(123,198,55) + ​​​​​​​​Rath : rgb(123,198,55) + ​​​​​​​​Ravnica : rgb(123,198,55) + ​​​​​​​​Regatha : rgb(123,198,55) + ​​​​​​​​Segovia : rgb(123,198,55) + ​​​​​​​​Serra’s Realm : rgb(123,198,55) + ​​​​​​​​Shadowmoor : rgb(123,198,55) + ​​​​​​​​Shandalar : rgb(123,198,55) + ​​​​​​​​Shenmeng : rgb(123,198,55) + ​​​​​​​​Skaro : rgb(123,198,55) + ​​​​​​​​Spacecraft : rgb(123,198,55) + ​​​​​​​​Tarkir : rgb(123,198,55) + ​​​​​​​​The Abyss : rgb(123,198,55) + ​​​​​​​​The Dalek Asylum : rgb(123,198,55) + ​​​​​​​​The Library : rgb(123,198,55) + ​​​​​​​​Theros : rgb(123,198,55) + ​​​​​​​​Time : rgb(123,198,55) + ​​​​​​​​Trenzalore : rgb(123,198,55) + ​​​​​​​​Ulgrotha : rgb(123,198,55) + ​​​​​​​​Unknown Planet : rgb(123,198,55) + ​​​​​​​​Valla : rgb(123,198,55) + ​​​​​​​​Vryn : rgb(123,198,55) + ​​​​​​​​Wildfire : rgb(123,198,55) + ​​​​​​​​Xerex : rgb(123,198,55) + ​​​​​​​​Zhalfir : rgb(123,198,55) + ​​​​​​​​Zendikar : rgb(123,198,55) + +#statistics dimension: +# name: creature subtype +# position hint: 0270 +# icon: stats/creature_subtype.png +# description: Subtypes of the creature/tribal/kindred type. +# split list: true +# show empty: false +# script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else creature_subtype_statistic() + +statistics dimension: + name: creature race + position hint: 0271 + icon: stats/creature_subtype.png + description: Subtypes of the creature/tribal/kindred type, that are races. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else creature_race_statistic() statistics dimension: name: creature class - position hint: 33 - icon: stats/creature_class.png - description: Class of creature cards - script: - if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else - if is_creature(card.super_type) then - space_to_comma(trim(remove_tags(only_next(card.sub_type)))) - show empty: false + position hint: 0272 + icon: stats/creature_subtype.png + description: Subtypes of the creature/tribal/kindred type, that are classes. split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else creature_class_statistic() statistics dimension: - position hint: 50 name: power - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else card.power - numeric: true + position hint: 0300 icon: stats/power.png - -statistics dimension: - position hint: 51 - name: toughness - script: if (card.shape == "token" or card.rarity == "special" or card.rarity == "masterpiece") and set.trim_statistics then "" else card.toughness - numeric: true - icon: stats/toughness.png - -statistics dimension: - position hint: 99 - name: rarity - script: if card.shape == "token" or card.shape == "emblem" then "token" else card.rarity + description: The power of the card. Counts each side/face separately. Does not count levels on leveler cards. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else power_statistic() + group : 0 + group : 1 + group : 2 + group : 3 + group : 4 + group : 5 + group : 6 + group : 7 + group : 8 + group : 9 + group : 10 + group : 11+ + group : X + group : * + group : negative colors: - token: rgb(33,33,33) - 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) - masterpiece: rgb(202,49,35) - group: token - group: basic land + 0 : rgb(255,159,149) + 1 : rgb(255,117,102) + 2 : rgb(255,71,52) + 3 : rgb(255,39,15) + 4 : rgb(235,23,0) + 5 : rgb(201,20,0) + 6 : rgb(163,16,0) + 7 : rgb(125,12,0) + 8 : rgb(82,8,0) + 9 : rgb(61,6,0) + 10 : rgb(42,4,0) + 11+ : rgb(0,0,0) + X : rgb(128,128,128) + * : rgb(128,128,128) + negative : rgb(128,128,128) + +statistics dimension: + name: toughness + position hint: 0310 + icon: stats/toughness.png + description: The toughness of the card. Counts each side/face separately. Does not count levels on leveler cards. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else toughness_statistic() + group : 0 + group : 1 + group : 2 + group : 3 + group : 4 + group : 5 + group : 6 + group : 7 + group : 8 + group : 9 + group : 10 + group : 11+ + group : X + group : * + group : negative + colors: + 0 : rgb(186,205,230) + 1 : rgb(147,176,214) + 2 : rgb(103,144,198) + 3 : rgb(64,116,184) + 4 : rgb(37,97,175) + 5 : rgb(15,80,166) + 6 : rgb(13,71,146) + 7 : rgb(11,56,116) + 8 : rgb(8,41,87) + 9 : rgb(5,27,56) + 10 : rgb(1,4,26) + 11+ : rgb(0,0,0) + X : rgb(128,128,128) + * : rgb(128,128,128) + negative : rgb(128,128,128) + +statistics dimension: + name: loyalty + position hint: 0320 + icon: stats/loyalty.png + description: The loyalty of a planeswalker card. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else loyalty_statistic() + group : 0 + group : 1 + group : 2 + group : 3 + group : 4 + group : 5 + group : 6 + group : 7 + group : 8 + group : 9 + group : 10 + group : 11+ + group : X + group : * + group : negative + colors: + 0 : rgb(200,200,242) + 1 : rgb(170,170,225) + 2 : rgb(138,133,205) + 3 : rgb(117,103,188) + 4 : rgb(105,80,175) + 5 : rgb(95,60,160) + 6 : rgb(85,53,143) + 7 : rgb(74,45,123) + 8 : rgb(62,39,109) + 9 : rgb(51,30,88) + 10 : rgb(38,22,67) + 11+ : rgb(0,0,0) + X : rgb(128,128,128) + * : rgb(128,128,128) + negative : rgb(128,128,128) + +statistics dimension: + name: defense + position hint: 0330 + icon: stats/defense.png + description: The defense of a battle card. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else defense_statistic() + group : 0 + group : 1 + group : 2 + group : 3 + group : 4 + group : 5 + group : 6 + group : 7 + group : 8 + group : 9 + group : 10 + group : 11+ + group : X + group : * + group : negative + colors: + 0 : rgb(185,114,169) + 1 : rgb(174,90,154) + 2 : rgb(166,75,145) + 3 : rgb(155,52,132) + 4 : rgb(144,31,118) + 5 : rgb(136,14,108) + 6 : rgb(123,12,97) + 7 : rgb(108,10,86) + 8 : rgb(90,8,71) + 9 : rgb(77,7,61) + 10 : rgb(63,6,50) + 11+ : rgb(0,0,0) + X : rgb(128,128,128) + * : rgb(128,128,128) + negative : rgb(128,128,128) + +statistics dimension: + name: rarity + position hint: 0400 + icon: stats/rarity.png + description: The rarity of the card. Counts each side/face separately. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else rarity_statistic() + group: basic land group: common group: uncommon group: rare - group: mythic rare - group: special + group: mythic rare group: masterpiece - icon: stats/rarity.png - -statistics dimension: - name: text length (words) - position hint: 100 - script: if a_saga() or mainframe_walker() then word_count(to_text(card.level_1_text))+word_count(to_text(card.level_2_text))+word_count(to_text(card.level_3_text))+word_count(to_text(card.level_4_text)) else word_count(to_text(card.rule_text)) - numeric: true - bin size: 5 - icon: stats/text_length.png - -statistics dimension: - name: text length (lines) - position hint: 101 - script: if a_saga() or mainframe_walker() then line_count(to_text(card.level_1_text))+line_count(to_text(card.level_2_text))+line_count(to_text(card.level_3_text))+line_count(to_text(card.level_4_text)) else line_count(to_text(card.rule_text)) - numeric: true - icon: stats/text_length.png + group: special + group: token + colors: + basic land : rgb(103,64,35) + common : rgb(33,33,33) + uncommon : rgb(187,187,187) + rare : rgb(209,191,91) + mythic rare : rgb(210,96,34) + masterpiece : rgb(176,11,15) + special : rgb(112,38,128) + token : rgb(15,80,166) statistics dimension: name: keywords - position hint: 1000 - script: keyword_usage(unique:true) - show empty: false - split list: true + position hint: 0410 icon: stats/keywords.png + description: The keywords of the card. Counts all sides/faces. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else keyword_usage(unique: true) statistics dimension: - name: style - position hint: 1001 - script: stylesheet.short_name - icon: stats/stylesheet.png + name: filter (see set info) + position hint: 490 + icon: stats/filter.png + description: Shows which cards have been filtered by the conditions written in the "filter statistics" field in the Set info tab. + show empty: false + script: filter_from_statistic() + colors: + Kept : rgb(15,80,166) + Filtered : rgb(156,15,15) -############################################################## 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 statistics dimension: - position hint: 210 - name: illustrator - script: if card.illustrator == "" then " No artist" else card.illustrator - icon: stats/illustrator.png + name: all mana production + position hint: 0500 + icon: stats/land_production.png + description: Counts how many cards can produce white mana. Repeat for all other colors. Then counts how many cards can produce mana of any color, and mana of a chosen color. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else mana_production_list_statistic(check_type: "all") + group: C + group: W + group: U + group: B + group: R + group: G + group: Any + group: Chosen + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + Any : rgb(112,38,128) + Chosen : rgb(112,38,128) + +statistics dimension: + name: land mana prod. + position hint: 0510 + icon: stats/land_production.png + description: Counts how many lands can produce white mana. Repeat for all other colors. Then counts how many lands can produce mana of any color, and mana of a chosen color. If either side/face is a land, the card will be counted here. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else mana_production_list_statistic(check_type: "land") + group: C + group: W + group: U + group: B + group: R + group: G + group: Any + group: Chosen + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + Any : rgb(112,38,128) + Chosen : rgb(112,38,128) + +statistics dimension: + name: nonland mana prod. + position hint: 0520 + icon: stats/land_production.png + description: Counts how many non-land cards can produce white mana. Repeat for all other colors. Then counts how many non-land cards can produce mana of any color, and mana of a chosen color. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else mana_production_list_statistic(check_type: "nonland") + group: C + group: W + group: U + group: B + group: R + group: G + group: Any + group: Chosen + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + Any : rgb(112,38,128) + Chosen : rgb(112,38,128) + +statistics dimension: + name: pip count (Casting) + position hint: 0600 + icon: stats/color_pips.png + description: Counts the number of casting costs that contain one colored pip. Repeat for all other amounts. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else cc_colored_pips_count_statistic() + group: 0 + group: 1 + group: 2 + group: 3 + group: 4 + group: 5 + group: 6 + group: 7 + group: 8+ + colors: + 0 : rgb(101,104,94) + 1 : rgb(113,94,109) + 2 : rgb(125,84,124) + 3 : rgb(137,74,139) + 4 : rgb(149,64,154) + 5 : rgb(161,54,169) + 6 : rgb(173,44,184) + 7 : rgb(185,34,199) + 8+ : rgb(197,24,214) + +statistics dimension: + name: pip colors (Casting) + position hint: 0630 + icon: stats/color_pips.png + description: Counts how many cards have a single white pip in their casting cost. Repeat for two white pips. Then three, then four+, then for all other colors. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else cc_colored_pips_statistic() + colors: + ​C : rgb(207,207,207) # There is a zero width space before the "C" so that they always appear first. + ​CC : rgb(175,175,175) + ​CCC : rgb(141,141,141) + ​CCCC+ : rgb(135,135,135) + ​​W : rgb(255,241,195) # There are two zero width spaces before the "W" so that they always appear after the "C". + ​​WW : rgb(236,215,166) + ​​WWW : rgb(211,183,127) + ​​WWWW+ : rgb(186,157,101) + ​​​U : rgb(67,111,202) # There are three zero width spaces before the "U", etc... + ​​​UU : rgb(28,82,169) + ​​​UUU : rgb(0,63,148) + ​​​UUUU+ : rgb(0,51,134) + ​​​​B : rgb(46,46,46) + ​​​​BB : rgb(30,30,30) + ​​​​BBB : rgb(15,15,15) + ​​​​BBBB+ : rgb(0,0,0) + ​​​​​R : rgb(190,54,39) + ​​​​​RR : rgb(165,31,20) + ​​​​​RRR : rgb(137,0,0) + ​​​​​RRRR+ : rgb(116,0,0) + ​​​​​​G : rgb(95,170,48) + ​​​​​​GG : rgb(63,139,10) + ​​​​​​GGG : rgb(46,123,0) + ​​​​​​GGGG+ : rgb(18,102,0) + +statistics dimension: + name: total pips (Casting) + position hint: 0660 + icon: stats/color_pips.png + description: Counts the total number of white pips in all the casting costs. Repeat for all other colors. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else cc_colored_pips_totals_statistic() + group: C + group: W + group: U + group: B + group: R + group: G + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + +statistics dimension: + name: pip count (Ability) + position hint: 0610 + icon: stats/color_pips.png + description: Counts the number of activated/triggered/keyworded ability costs that contain one colored pip. Repeat for all other amounts. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else ability_colored_pips_count_statistic() + group: 0 + group: 1 + group: 2 + group: 3 + group: 4 + group: 5 + group: 6 + group: 7 + group: 8+ + colors: + 0 : rgb(101,104,94) + 1 : rgb(113,94,109) + 2 : rgb(125,84,124) + 3 : rgb(137,74,139) + 4 : rgb(149,64,154) + 5 : rgb(161,54,169) + 6 : rgb(173,44,184) + 7 : rgb(185,34,199) + 8+ : rgb(197,24,214) + +statistics dimension: + name: pip colors (Ability) + position hint: 0640 + icon: stats/color_pips.png + description: Counts how many activated/triggered/keyworded abilities have a single white pip in their cost. Repeat for two white pips. Then three, then four+, then for all other colors. Counts each ability on each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else ability_colored_pips_statistic() + colors: + ​C : rgb(207,207,207) # There is a zero width space before the "C" so that they always appear first. + ​CC : rgb(175,175,175) + ​CCC : rgb(141,141,141) + ​CCCC+ : rgb(135,135,135) + ​​W : rgb(255,241,195) # There are two zero width spaces before the "W" so that they always appear after the "C". + ​​WW : rgb(236,215,166) + ​​WWW : rgb(211,183,127) + ​​WWWW+ : rgb(186,157,101) + ​​​U : rgb(67,111,202) # There are three zero width spaces before the "U", etc... + ​​​UU : rgb(28,82,169) + ​​​UUU : rgb(0,63,148) + ​​​UUUU+ : rgb(0,51,134) + ​​​​B : rgb(46,46,46) + ​​​​BB : rgb(30,30,30) + ​​​​BBB : rgb(15,15,15) + ​​​​BBBB+ : rgb(0,0,0) + ​​​​​R : rgb(190,54,39) + ​​​​​RR : rgb(165,31,20) + ​​​​​RRR : rgb(137,0,0) + ​​​​​RRRR+ : rgb(116,0,0) + ​​​​​​G : rgb(95,170,48) + ​​​​​​GG : rgb(63,139,10) + ​​​​​​GGG : rgb(46,123,0) + ​​​​​​GGGG+ : rgb(18,102,0) + +statistics dimension: + name: total pips (Ability) + position hint: 0670 + icon: stats/color_pips.png + description: Counts the total number of white pips in all the activated/triggered/keyworded ability costs. Repeat for all other colors. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else ability_colored_pips_totals_statistic() + group: C + group: W + group: U + group: B + group: R + group: G + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + +statistics dimension: + name: pip count (Combined) + position hint: 0620 + icon: stats/color_pips.png + description: Counts the number of costs that contain one colored pip. Repeat for all other amounts. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else colored_pips_count_totals_statistic() + group: 0 + group: 1 + group: 2 + group: 3 + group: 4 + group: 5 + group: 6 + group: 7 + group: 8+ + colors: + 0 : rgb(101,104,94) + 1 : rgb(113,94,109) + 2 : rgb(125,84,124) + 3 : rgb(137,74,139) + 4 : rgb(149,64,154) + 5 : rgb(161,54,169) + 6 : rgb(173,44,184) + 7 : rgb(185,34,199) + 8+ : rgb(197,24,214) + +statistics dimension: + name: pip color (Combined) + position hint: 0650 + icon: stats/color_pips.png + description: Counts how many costs contain a single white pip. Repeat for two white pips. Then three, then four+, then for all other colors. Counts each cost on each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else colored_pips_statistic() + colors: + ​C : rgb(207,207,207) # There is a zero width space before the "C" so that they always appear first. + ​CC : rgb(175,175,175) + ​CCC : rgb(141,141,141) + ​CCCC+ : rgb(135,135,135) + ​​W : rgb(255,241,195) # There are two zero width spaces before the "W" so that they always appear after the "C". + ​​WW : rgb(236,215,166) + ​​WWW : rgb(211,183,127) + ​​WWWW+ : rgb(186,157,101) + ​​​U : rgb(67,111,202) # There are three zero width spaces before the "U", etc... + ​​​UU : rgb(28,82,169) + ​​​UUU : rgb(0,63,148) + ​​​UUUU+ : rgb(0,51,134) + ​​​​B : rgb(46,46,46) + ​​​​BB : rgb(30,30,30) + ​​​​BBB : rgb(15,15,15) + ​​​​BBBB+ : rgb(0,0,0) + ​​​​​R : rgb(190,54,39) + ​​​​​RR : rgb(165,31,20) + ​​​​​RRR : rgb(137,0,0) + ​​​​​RRRR+ : rgb(116,0,0) + ​​​​​​G : rgb(95,170,48) + ​​​​​​GG : rgb(63,139,10) + ​​​​​​GGG : rgb(46,123,0) + ​​​​​​GGGG+ : rgb(18,102,0) + +statistics dimension: + name: total pips (Combined) + position hint: 0680 + icon: stats/color_pips.png + description: Counts the total number of white pips in all the costs. Repeat for all other colors. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else colored_pips_totals_statistic() + group: C + group: W + group: U + group: B + group: R + group: G + colors: + C : rgb(101,104,94) + W : rgb(255,231,185) + U : rgb(15,80,166) + B : rgb(33,33,33) + R : rgb(156,15,15) + G : rgb(68,144,15) + +statistics dimension: + name: word count + position hint: 0700 + icon: stats/text_length.png + description: How many words are in the card's various rule texts. + numeric: true + bin size: 5 + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else total_word_count_statistic() + #statistics dimension: -# position hint: 2 -# name: purple converted mana cost -# script: 0 + (if card.mana_label_1 != "" then card.mana_label_1 else 0) + (if card.mana_label_2 != "" then card.mana_label_2 else 0) + (if card.mana_label_3 != "" then card.mana_label_3 else 0) + (if card.mana_label_4 != "" then card.mana_label_4 else 0) + (if card.mana_label_5 != "" then card.mana_label_5 else 0) + (if card.mana_label_6 != "" then card.mana_label_6 else 0) + (if card.mana_label_7 != "" then card.mana_label_7 else 0) + (if card.mana_label_8 != "" then card.mana_label_8 else 0) +# name: line count +# position hint: 1110 +# icon: stats/text_length.png +# description: How many lines are in the card's various rule texts. # numeric: true -# icon: stats/casting_cost.png \ No newline at end of file +# show empty: false +# script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else total_line_count_statistic() # Not reliable atm. + +statistics dimension: + name: paragraph count + position hint: 0710 + icon: stats/text_length.png + description: How many paragraphs are in the card's various rule texts. + numeric: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else total_paragraph_count_statistic() + +statistics dimension: + name: card notes words + position hint: 0720 + icon: stats/text_length.png + description: Counts all the words that appear in the card notes. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else split_notes_words_statistic(card.notes) + +statistics dimension: + name: card notes clauses + position hint: 0730 + icon: stats/text_length.png + description: Cuts the card notes using the regex specified in the set info tab. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else split_notes_clauses_statistic() + +statistics dimension: + name: watermark + position hint: 0800 + icon: stats/watermark.png + description: The watermark of the card. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else watermark_statistic() + +statistics dimension: + name: stamp + position hint: 0810 + icon: stats/stamp.png + description: The security stamp of the card. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else stamp_statistic() + +statistics dimension: + name: symbol + position hint: 0820 + icon: stats/symbol.png + description: The symbol of the card (Tombstone, Alchemy). Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else symbol_statistic() + + +statistics dimension: + name: illustrator + position hint: 0830 + icon: stats/illustrator.png + description: The artists of the card. Counts each side/face separately. + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else illustrator_statistic() + +statistics dimension: + name: template + position hint: 0840 + icon: stats/stylesheet.png + description: The stylesheet used by the card. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else stylesheet.short_name + +statistics dimension: + name: average opening hand + position hint: 1000 + icon: stats/hand.png + description: How many cards of each type on average will be in an opening hand. + split list: true + show empty: false + script: if trim_from_draw_statistic() then "" else average_opening_hand_statistic() + +statistics dimension: + name: land drop hit % (Play) + position hint: 1100 + icon: stats/land_drops.png + description: If the set is a deck, probability of hitting every single land drop up to the given turn, when on the play. Always excludes cards with the word 'commander' in their card notes, as well as tokens, emblems, dungeons, conspiracies, heroes, vanguards, schemes, planes and phenomenons. + split list: true + show empty: false + script: land_drop_hit_percentage_statistic(start: 6) + +statistics dimension: + name: land drop hit % (Draw) + position hint: 1110 + icon: stats/land_drops.png + description: If the set is a deck, probability of hitting every single land drop up to the given turn, when on the draw. Always excludes cards with the word 'commander' in their card notes, as well as tokens, emblems, dungeons, conspiracies, heroes, vanguards, schemes, planes and phenomenons. + split list: true + show empty: false + script: land_drop_hit_percentage_statistic(start: 7) + +statistics dimension: + name: color count + position hint: 1500 + icon: stats/color.png + description: How many cards have one color, how many have two, three, etc... + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else color_count_statistic() + group: 0 + group: 1 + group: 2 + group: 3 + group: 4 + group: 5 + colors: + 0 : rgb(101,104,94) + 1 : rgb(113,94,109) + 2 : rgb(125,84,124) + 3 : rgb(137,74,139) + 4 : rgb(149,64,154) + 5 : rgb(161,54,169) + +statistics dimension: + name: color identity count + position hint: 1510 + icon: stats/color.png + description: How many cards have one color in their color identity, how many have two, three, etc... + split list: true + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else color_identity_count_statistic() + group: 0 + group: 1 + group: 2 + group: 3 + group: 4 + group: 5 + colors: + 0 : rgb(101,104,94) + 1 : rgb(113,94,109) + 2 : rgb(125,84,124) + 3 : rgb(137,74,139) + 4 : rgb(149,64,154) + 5 : rgb(161,54,169) + +statistics dimension: + name: color (Secondary Face) + position hint: 1520 + icon: stats/color.png + description: Color of the back side or secondary face (like on adventures for example). + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else prefixed_back_face_color_statistic() + colors: + ​C : rgb(101,104,94) # There is a zero width space before the "C" so that it always appears first. + ​​W : rgb(255,231,185) # There are two zero width spaces before the "W" so that it always appear after the "C". + ​​​U : rgb(15,80,166) # There are three zero width spaces before the "U", etc... + ​​​​B : rgb(22,22,22) + ​​​​​R : rgb(156,15,15) + ​​​​​​G : rgb(68,144,15) + ​​​​​​​WU : rgb(254,192,80) + ​​​​​​​​WB : rgb(254,192,80) + ​​​​​​​​​WR : rgb(254,192,80) + ​​​​​​​​​​WG : rgb(254,192,80) + ​​​​​​​​​​​UB : rgb(254,192,80) + ​​​​​​​​​​​​UR : rgb(254,192,80) + ​​​​​​​​​​​​​UG : rgb(254,192,80) + ​​​​​​​​​​​​​​BR : rgb(254,192,80) + ​​​​​​​​​​​​​​​BG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​RG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​​WUB : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​WUR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​WUG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​WBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​WBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​WRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​UBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​UBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​URG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​BRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBR : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WURG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​UBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBRG : rgb(224,133,8) + +statistics dimension: + name: color (All Faces) + position hint: 1530 + icon: stats/color.png + description: Combined color of all the sides/faces. + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else prefixed_all_faces_color_statistic() + colors: + ​C : rgb(101,104,94) # There is a zero width space before the "C" so that it always appears first. + ​​W : rgb(255,231,185) # There are two zero width spaces before the "W" so that it always appear after the "C". + ​​​U : rgb(15,80,166) # There are three zero width spaces before the "U", etc... + ​​​​B : rgb(22,22,22) + ​​​​​R : rgb(156,15,15) + ​​​​​​G : rgb(68,144,15) + ​​​​​​​WU : rgb(254,192,80) + ​​​​​​​​WB : rgb(254,192,80) + ​​​​​​​​​WR : rgb(254,192,80) + ​​​​​​​​​​WG : rgb(254,192,80) + ​​​​​​​​​​​UB : rgb(254,192,80) + ​​​​​​​​​​​​UR : rgb(254,192,80) + ​​​​​​​​​​​​​UG : rgb(254,192,80) + ​​​​​​​​​​​​​​BR : rgb(254,192,80) + ​​​​​​​​​​​​​​​BG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​RG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​​WUB : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​WUR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​WUG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​WBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​WBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​WRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​UBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​UBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​URG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​BRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBR : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WURG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​UBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBRG : rgb(224,133,8) + +statistics dimension: + name: color (Promos) + position hint: 1540 + icon: stats/color.png + description: How many promo cards of each color combination are in the set. + show empty: false + script: if card.rarity == "special" or card.rarity == "masterpiece" then prefixed_color_statistic() else "" + colors: + ​C : rgb(101,104,94) # There is a zero width space before the "C" so that it always appears first. + ​​W : rgb(255,231,185) # There are two zero width spaces before the "W" so that it always appear after the "C". + ​​​U : rgb(15,80,166) # There are three zero width spaces before the "U", etc... + ​​​​B : rgb(22,22,22) + ​​​​​R : rgb(156,15,15) + ​​​​​​G : rgb(68,144,15) + ​​​​​​​WU : rgb(254,192,80) + ​​​​​​​​WB : rgb(254,192,80) + ​​​​​​​​​WR : rgb(254,192,80) + ​​​​​​​​​​WG : rgb(254,192,80) + ​​​​​​​​​​​UB : rgb(254,192,80) + ​​​​​​​​​​​​UR : rgb(254,192,80) + ​​​​​​​​​​​​​UG : rgb(254,192,80) + ​​​​​​​​​​​​​​BR : rgb(254,192,80) + ​​​​​​​​​​​​​​​BG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​RG : rgb(254,192,80) + ​​​​​​​​​​​​​​​​​WUB : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​WUR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​WUG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​WBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​WBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​WRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​UBR : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​UBG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​URG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​BRG : rgb(244,177,10) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBR : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WURG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​UBRG : rgb(232,154,9) + ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​WUBRG : rgb(224,133,8) + +statistics dimension: + name: omniverse color + position hint: 1550 + icon: stats/color.png + description: The color category of the card, taking into account omniverse colors (Purple, Pink, Yellow, Orange and Brown). + show empty: false + script: if filter_from_statistic() == "Filtered" or trim_from_statistic() then "" else omniverse_color_statistic(card.card_color) + group: land + group: colorless + group: artifact + group: white + group: blue + group: black + group: red + group: green + group: purple + group: pink + group: yellow + group: orange + group: brown + group: multicolor + group: hybrid + colors: + white : rgb(255,231,185) + blue : rgb(15,80,166) + black : rgb(33,33,33) + red : rgb(156,15,15) + green : rgb(68,144,15) + purple : rgb(150,100,160) + pink : rgb(255,175,200) + yellow : rgb(242,247,94) + orange : rgb(255,181,121) + brown : rgb(191,171,144) + colorless : rgb(101,104,94) + artifact : rgb(109,132,158) + multicolor : rgb(244,177,10) + land : rgb(103,64,35) + hybrid : rgb(112,38,128) diff --git a/data/magic.mse-game/statistics_script b/data/magic.mse-game/statistics_script new file mode 100644 index 000000000..ec0db76c2 --- /dev/null +++ b/data/magic.mse-game/statistics_script @@ -0,0 +1,1719 @@ + +############################################################## Statistics scripts 30-03-2023 +############################################################## Blame GenevensiS for this + +## Clean up text for processing +remove_flavor_statistic := replace@(match: ".*?", replace: "") +remove_reminder_statistic := replace@(match: "(|).*?(|)", replace: "") +remove_zero_width_spaces_statistic := replace@(match: "​", replace: "") +replace_en_spaces_statistic := replace@(match: " ", replace: " ") +filter_numbers_statistic := filter_text@(match:"[0-9]") + +keep_only_symbols_statistic := filter_text@(match: "]*>.+?]*>") +keep_only_symbols_list_statistic := +{ + count := length(input) - 1 + if count < 0 then [] else for x from 0 to count do [to_text(keep_only_symbols_statistic(input[x]))] +} +# Add a number of zero width spaces to impose ordering. C has 1, W has 2, U has 3, etc... +space_prefix := +[ + C : "​" + W : "​​" + U : "​​​" + B : "​​​​" + R : "​​​​​" + G : "​​​​​​" + WU : "​​​​​​​" + WB : "​​​​​​​​" + WR : "​​​​​​​​​" + WG : "​​​​​​​​​​" + UB : "​​​​​​​​​​​" + UR : "​​​​​​​​​​​​" + UG : "​​​​​​​​​​​​​" + BR : "​​​​​​​​​​​​​​" + BG : "​​​​​​​​​​​​​​​" + RG : "​​​​​​​​​​​​​​​​" + WUB : "​​​​​​​​​​​​​​​​​" + WUR : "​​​​​​​​​​​​​​​​​​" + WUG : "​​​​​​​​​​​​​​​​​​​" + WBR : "​​​​​​​​​​​​​​​​​​​​" + WBG : "​​​​​​​​​​​​​​​​​​​​​" + WRG : "​​​​​​​​​​​​​​​​​​​​​​" + UBR : "​​​​​​​​​​​​​​​​​​​​​​​" + UBG : "​​​​​​​​​​​​​​​​​​​​​​​​" + URG : "​​​​​​​​​​​​​​​​​​​​​​​​​" + BRG : "​​​​​​​​​​​​​​​​​​​​​​​​​​" + WUBR : "​​​​​​​​​​​​​​​​​​​​​​​​​​​" + WUBG : "​​​​​​​​​​​​​​​​​​​​​​​​​​​​" + WURG : "​​​​​​​​​​​​​​​​​​​​​​​​​​​​​" + WBRG : "​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​" + UBRG : "​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​" + WUBRG : "​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​" +] + +# The casting cost +casting_cost_statistic := +{ + cc_1 := trim(to_text(card.casting_cost)) + cc_2 := if check_2_statistic() then trim(to_text(card.casting_cost_2)) else "" + cc_1 + (if cc_1 != "" and cc_2 != "" then "," else "") + cc_2 +} + +# The converted mana cost +mana_value_statistic := +{ + if contains(card.shape, match: "split") or contains(card.shape, match: "aftermath") then cmc(card.casting_cost + " " + card.casting_cost_2) else cmc(card.casting_cost) +} + +# The color combinations of the cards in the set. +prefixed_color_statistic := +{ + color := color_statistic() + space_prefix[color] + color +} +prefixed_back_face_color_statistic := +{ + color := back_face_color_statistic() + space_prefix[color] + color +} +prefixed_all_faces_color_statistic := +{ + color := all_faces_color_statistic() + space_prefix[color] + color +} +prefixed_color_identity_statistic := +{ + color := color_identity_statistic() + space_prefix[color] + color +} +color_statistic := +{ + colors := if contains(card.shape, match: "split") or contains(card.shape, match: "aftermath") then distil_colors_statistic(face_color_statistic(face: 1) + face_color_statistic(face: 2)) + else face_color_statistic(face: 1) # shape == "adventure", "prototype", "leveler", "saga", "class", "flip", "double faced", "meld" or "normal" + if colors == "" then "C" else colors +} +back_face_color_statistic := +{ + colors := if contains(card.shape, match: "split") or contains(card.shape, match: "aftermath") then "C" + else face_color_statistic(face: 2) # shape == "adventure", "prototype", "leveler", "saga", "class", "flip", "double faced", "meld" or "normal" + if colors == "" then "C" else colors +} +all_faces_color_statistic := +{ + colors := distil_colors_statistic(face_color_statistic(face: 1) + face_color_statistic(face: 2) + face_color_statistic(face: 3)) + if colors == "" then "C" else colors +} +face_color_statistic := +{ + suffix := if face == 1 then "" else if face == 2 then "_2" else if face == 3 then "_3" else "" + identity := if face == 1 then has_identity() else if face == 2 then has_identity_2() else if face == 3 then false else false + + colors := "" + + # Colors defined by a color indicator dot. I believe it takes precedence over everything. + if identity then colors := distil_color_words_statistic(card["indicator" + suffix]) + if colors != "" then colors else ( + + # Colors defined by english text on the card. Takes precedence over casting cost. + colors := cda_to_color_statistic(remove_reminder_statistic(card["rule_text" + suffix]), suffix: suffix) + + cda_to_color_statistic(remove_reminder_statistic(card["level_" + (1+4*(face-1)) + "_text"]), suffix: suffix) + if face <= 2 then colors := colors + cda_to_color_statistic(remove_reminder_statistic(card["chapter_text" + suffix]), suffix: suffix) + colors := distil_colors_statistic(colors) + if colors != "" then colors else ( + + # Colors defined by casting cost symbols. + distil_colors_statistic(card["casting_cost" + suffix]))) +} + +# The commander color identities of the cards in the set. +color_identity_statistic := +{ + texts := text_to_check_statistic() + front_count := length(texts) - 1 + texts := texts + text_to_check_2_statistic() + count := length(texts) - 1 + total_colors := for x from 0 to count do + ( + # Colors defined by english text on the card. + cda_to_color_statistic(remove_reminder_statistic(card[texts[x]]), suffix: (if x <= front_count then "" else "_2")) + + + # Colors defined by rule text symbols. + keep_only_symbols_statistic(remove_reminder_statistic(card[texts[x]])) + ) + total_colors := total_colors + + + # Colors defined by a color indicator dot. + (if has_identity() then distil_color_words_statistic(card.indicator) else "") + + (if has_identity_2() then distil_color_words_statistic(card.indicator_2) else "") + + + # Colors defined by casting cost symbols. + card.casting_cost + " " + + card.casting_cost_2 + + total_colors := distil_colors_statistic(total_colors) + if total_colors == "" then "C" else total_colors +} + +# TODO localize +cda_to_color_statistic := +{ + if input == "" then "" else ( + + text := to_text(input) + + if contains(text, match: "This card has no color.") then "C" else ( + if devoid_match_statistic(text) then "C" else ( + + card_name := card["name" + suffix] + trigger := color_cda_filter_statistic(text, in_context: "(" + regex_escape(card_name) + "|" + regex_escape(legend_filter(card_name)) + ") \\.") + if trigger == "" then "" else ( + + if contains(trigger, match: "all colors") then "WUBRG" else ( + + distil_color_words_statistic(trigger)))))) +} +devoid_match_statistic := match@(match: "(\n|^|,| )[Dd]evoid(\n|$|,| |\\()") +color_cda_filter_statistic := filter_text@(match: "is (colorless|all colors|((blue|white|green|red|black)((,|,? and) (blue|white|green|red|black))*))") +distil_color_words_statistic := +{ + colors := "" + if contains(match: "colorless") then colors := colors + "C" + if contains(match: "white") then colors := colors + "W" + if contains(match: "blue") then colors := colors + "U" + if contains(match: "black") then colors := colors + "B" + if contains(match: "red") then colors := colors + "R" + if contains(match: "green") then colors := colors + "G" + + if length(colors) > 1 and colors.0 == "C" then substring(colors, begin: 1) else colors +} +distil_colors_statistic := +{ + colors := "" + if contains(match: "C") then colors := colors + "C" + if contains(match: "W") then colors := colors + "W" + if contains(match: "U") then colors := colors + "U" + if contains(match: "B") then colors := colors + "B" + if contains(match: "R") then colors := colors + "R" + if contains(match: "G") then colors := colors + "G" + + if length(colors) > 1 and colors.0 == "C" then substring(colors, begin: 1) else colors +} +color_count_statistic := +{ + colors := color_statistic() + if colors == "C" then 0 else length(colors) +} +color_identity_count_statistic := +{ + colors := color_identity_statistic() + if colors == "C" then 0 else length(colors) +} + +# Omniverse colors +omniverse_color_statistic := +{ + if chosen(choice: "land") then "land" + else if chosen(choice: "multicolor") then "multicolor" + else if count_chosen(choices: "white, blue, black, red, green, pink, purple, yellow, orange, brown") == 2 + and chosen(choice: "artifact") then "hybrid" ##hybrid artifacts would show as their first color + else if chosen(choice: "hybrid") then "hybrid" + else if (chosen(choice: "artifact") + and not ( chosen(choice: "white") + or chosen(choice: "blue") + or chosen(choice: "black") + or chosen(choice: "red") + or chosen(choice: "green") + or chosen(choice: "pink") + or chosen(choice: "purple") + or chosen(choice: "yellow") + or chosen(choice: "orange") + or chosen(choice: "brown"))) then "artifact" + else if chosen(choice: "white") then "white" + else if chosen(choice: "blue") then "blue" + else if chosen(choice: "black") then "black" + else if chosen(choice: "red") then "red" + else if chosen(choice: "green") then "green" + else if chosen(choice: "pink") then "pink" + else if chosen(choice: "purple") then "purple" + else if chosen(choice: "yellow") then "yellow" + else if chosen(choice: "orange") then "orange" + else if chosen(choice: "brown") then "brown" + else input +} + +# Count how many cards have one white devotion in the set. Repeat for two white devotion. Repeat for three, then four+, then again for other colors. +cc_colored_pips_statistic := +{ + cc := card.casting_cost + cc2 := if check_2_statistic() then card.casting_cost_2 else "" + + result := symbol_aggregate_statistic(cc, symbol: "W") + + symbol_aggregate_statistic(cc, symbol: "U") + + symbol_aggregate_statistic(cc, symbol: "B") + + symbol_aggregate_statistic(cc, symbol: "R") + + symbol_aggregate_statistic(cc, symbol: "G") + + symbol_aggregate_statistic(cc, symbol: "C") + + symbol_aggregate_statistic(cc2, symbol: "W") + + symbol_aggregate_statistic(cc2, symbol: "U") + + symbol_aggregate_statistic(cc2, symbol: "B") + + symbol_aggregate_statistic(cc2, symbol: "R") + + symbol_aggregate_statistic(cc2, symbol: "G") + + symbol_aggregate_statistic(cc2, symbol: "C") + substring(result, begin: 1) +} + +# Count the total devotion of all cards in the set. +cc_colored_pips_totals_statistic := +{ + cc := card.casting_cost + (if check_2_statistic() then " " + card.casting_cost_2 else "") + + join(wubrgc_break_statistic(cc), sep:",") +} + +# Count how many cards have one white pip in their ability costs. Repeat for two white pips. Repeat for three, then four+, then again for other colors. +ability_colored_pips_statistic := +{ + costs := gather_ability_symbols_statistic() + if costs == [] then "" else ( + count := length(costs) - 1 + result := for x from 0 to count do + ( + symbol_aggregate_statistic(costs[x], symbol: "W") + + symbol_aggregate_statistic(costs[x], symbol: "U") + + symbol_aggregate_statistic(costs[x], symbol: "B") + + symbol_aggregate_statistic(costs[x], symbol: "R") + + symbol_aggregate_statistic(costs[x], symbol: "G") + + symbol_aggregate_statistic(costs[x], symbol: "C") + ) + substring(result, begin: 1)) +} + +# Count the total pips of all the abilities of all the cards in the set. +ability_colored_pips_totals_statistic := +{ + costs := gather_ability_symbols_statistic() + if costs == [] then "" else ( + count := length(costs) - 1 + result := for x from 0 to count do + ( + "," + join(wubrgc_break_statistic(costs[x]), sep:",") + ) + substring(result, begin: 1)) +} + +colored_pips_statistic := +{ + cc := cc_colored_pips_statistic() + ability := ability_colored_pips_statistic() + cc + (if cc != "" and ability != "" then "," else "") + ability +} + +colored_pips_totals_statistic := +{ + cc := cc_colored_pips_totals_statistic() + ability := ability_colored_pips_totals_statistic() + cc + (if cc != "" and ability != "" then "," else "") + ability +} + +gather_ability_symbols_statistic := +{ + texts := text_to_check_statistic() + if check_2_statistic() then text_to_check_2_statistic() else [] + count := length(texts) - 1 + for x from 0 to count do + ( + text := remove_reminder_statistic(card[texts[x]]) + keep_only_symbols_list_statistic(activated_cost_filter_statistic(text)) + + keep_only_symbols_list_statistic(triggered_cost_filter_statistic(text)) + + keep_only_symbols_list_statistic(keyword_cost_filter_statistic(text)) + ) +} + +activated_cost_filter_statistic := + replace@(match: "<[^>]*:[^>]*>", replace: "") + #Remove tags with : inside them + break_text@(match: "(\n|^)[^(\n|^)]+?:") #Keep only activated ability costs +triggered_cost_filter_statistic := + replace@(match: "<[^>]*\\.[^>]*>", replace: "") + #Remove tags with . inside them + break_text@(match:" pay .+?(\\.|,| )", in_context: "(When|At).+?may ?(If|if|to) ") #Keep only triggered ability costs # TODO localize +keyword_cost_filter_statistic := + break_text@(match: "]*>.+?]*>") #Keep only keyword parameters + +devotion_filters_statistic := [ + W: filter_text@(match:"W") + U: filter_text@(match:"U") + B: filter_text@(match:"B") + R: filter_text@(match:"R") + G: filter_text@(match:"G") + C: filter_text@(match:"C") +] +color_pip_break_statistic := break_text@(match:"([A-Z0-9]/|[|])*[WUBRG]") +wubrgc_break_statistic := break_text@(match:"[WUBRGC]") +symbol_aggregate_statistic := +{ + devotion := devotion_filters_statistic[symbol](input) + len := length(devotion) + if len == 0 then "" + else "," + space_prefix[symbol] + (if len > 3 then substring(devotion, end:4) + "+" else devotion) +} + +symbol_count_list_statistic := +{ + result := for each sym in input do (if contains(sym, match: symbol) then ("," + symbol) else "") + if result == nil then "" else result +} + +# How many colored pips does each casting cost have. +cc_colored_pips_count_statistic := +{ + check_1 := card.casting_cost != "" + check_2 := check_2_statistic() and card.casting_cost_2 != "" + (if check_1 then colored_pips_count_statistic(card.casting_cost) else "") + + (if check_2 then (if check_1 then "," else "") + colored_pips_count_statistic(card.casting_cost_2) else "") +} + +# How many colored pips does each ability cost have. +ability_colored_pips_count_statistic := +{ + costs := gather_ability_symbols_statistic() + if costs == [] then "" else ( + count := length(costs) - 1 + for x from 0 to count do + ( + colored_pips_count_statistic(costs[x]) + (if x < count then "," else "") + )) +} + +# How many colored pips does each cost have. +colored_pips_count_totals_statistic := +{ + cc_count := cc_colored_pips_count_statistic() + ability_count := ability_colored_pips_count_statistic() + cc_count + if ability_count == nil then "" else "," + ability_count +} + +colored_pips_count_statistic := +{ + pips := length(color_pip_break_statistic(input)) + if pips >= 8 then "8+" else pips +} + +# Count how many cards can produce white mana in the set. Repeat for other colors. +mana_production_list_statistic := +{ + land1 := lang_setting("is_land")(card.super_type) + land2 := lang_setting("is_land")(card.super_type_2) + result_1 := if check_type == "land" and not land1 then "" + else if check_type == "nonland" and land1 then "" + else face_mana_production_list_statistic(texts: text_to_check_statistic(card: card), card: card, sub: card.sub_type, name:card.name) + result_2 := if not check_2_statistic(card: card) then "" + else if check_type == "land" and not land2 then "" + else if check_type == "nonland" and land2 then "" + else face_mana_production_list_statistic(texts: text_to_check_2_statistic(card: card), card: card, sub: card.sub_type_2, name:card.name_2) + substring(result_1 + result_2, begin: 1) +} +face_mana_production_list_statistic := +{ + # the combined text fields + combined_text := for x from 0 to length(texts)-1 do (remove_reminder_statistic(card[texts[x]]) + "\n") + + # the text-based mana we can produce + # we don't care about specifics just if they're non-empty + can_Any := lang_setting("gold_mana_production")(combined_text) != "" + can_Chosen := lang_setting("chosen_mana_production")(combined_text) != "" + + # the mana symbols we can produce + produced_symbols := wubrgc_break_statistic(lang_setting("mana_symbol_production")(combined_text)) + + (if lang_setting("is_plains")(sub) or contains_element(produced_symbols, element:"W") then ",W" else "") + + (if lang_setting("is_island")(sub) or contains_element(produced_symbols, element:"U") then ",U" else "") + + (if lang_setting("is_swamp")(sub) or contains_element(produced_symbols, element:"B") then ",B" else "") + + (if lang_setting("is_mountain")(sub) or contains_element(produced_symbols, element:"R") then ",R" else "") + + (if lang_setting("is_forest")(sub) or contains_element(produced_symbols, element:"G") then ",G" else "") + + (if lang_setting("is_wastes")(name) or contains_element(produced_symbols, element:"C") then ",C" else "") + + (if can_Any then ",Any" else "") + + (if can_Chosen then ",Chosen" else "") +} + +# Word counting +total_word_count_statistic := +{ + texts := text_to_check_statistic() + if check_2_statistic() then text_to_check_2_statistic() else [] + count := length(texts) - 1 + for x from 0 to count do + ( + text := trim(to_text(card[texts[x]])) + if text == "" or text == "​" then 0 else word_count(text) # There is a zero width space in the second "" + ) +} +## card_style only checks the active card when looping, making this not function currently +#total_line_count_statistic := +#{ +# texts := text_to_check_statistic() + if check_2_statistic() then text_to_check_2_statistic() else [] +# count := length(texts) - 1 +# for x from 0 to count do +# ( +# if card[texts[x]] != "" then card_style[texts[x]].content_lines else 0 +# ) +#} +total_paragraph_count_statistic := +{ + texts := text_to_check_statistic() + if check_2_statistic() then text_to_check_2_statistic() else [] + count := length(texts) - 1 + for x from 0 to count do + ( + text := trim(card[texts[x]]) + if text == "" or text == "​" then 0 else 1 + line_count_statistic(text) - soft_line_count_statistic(text) # There is a zero width space in the second "" + ) +} +line_count_statistic := break_text@(match: "\\n") + length +soft_line_count_statistic := break_text@(match: "") + length + +# Artists +illustrator_statistic := +{ + artist_1 := trim(replace_full_width_commas_statistic(card.illustrator)) + artist_2 := trim(replace_full_width_commas_statistic(card.illustrator_2)) + result := artist_1 + (if check_2_statistic() and artist_2 != "" and artist_2 != artist_1 then "," + artist_2 else "") + if result == "" then " No Artist" else if result.0 == "," then substring(result, begin: 1) else result +} + +# Card notes +split_notes_words_statistic := replace@(match: " *(,|\\.|;|(?=!)|\\n)? *", replace: ",") +split_notes_clauses_statistic := +{ + regex := if set.card_notes_clauses_split == "" then " *(\\.|\\n|;|,|(?=!)) *" else set.card_notes_clauses_split + regex := replace_full_width_commas_statistic(regex) + notes := replace_full_width_commas_statistic(card.notes) + result := replace(notes, match: regex, replace: ",") + result := clean_commas_statistic(result) + result +} +clean_commas_statistic := replace@(match: ",,", replace: ",") + replace@(match: "^,", replace: "") + replace@(match: ",$", replace: "") +replace_full_width_commas_statistic := replace@(match:",", replace: ",") + +# Hypergeometric probability of hitting every single land drop. +land_drop_hit_percentage_statistic := +{ + if card != set.cards.0 then "" else ( + set_count := length(set.cards)-1 + cards := for x from 0 to set_count do (if trim_from_draw_statistic(card: set.cards[x]) then [] else [set.cards[x]]) + card_count := length(cards) + if card_count <= start then "Not enough non-commander non-promo cards to draw an opening hand. Add normal cards." else ( + + land_count := for each c in cards do + ( + if lang_setting("is_land")(c.super_type) or (check_2_statistic(card: c) and lang_setting("is_land")(c.super_type_2)) then 1 + else 0 + ) + if land_count == 0 then "No lands found. 0% chance to hit land drops." else ( + + max_turns := min(10, card_count-start) + probability_per_turn := for t from 1 to max_turns do [100*hypergeometric_sum_statistic(population: card_count, successes_in_population: land_count, sample: start+t, turn: t)] + probability_string_per_turn := for t from 1 to max_turns do + ( + split := split_text(match: "\\.", to_string(probability_per_turn[t-1])) + number := split[0] + digit := if (split[1] or else "") == "" then "0" else split[1].0 + ["Turn " + t + " — " + number + "." + digit + "%"] + ) + result := for t from 1 to max_turns do + ( + count := to_int(probability_per_turn[t-1]) + if count == 0 then count := 1 + for x from 1 to count do ("," + probability_string_per_turn[t-1]) + ) + substring(result, begin: 1)))) +} +hypergeometric_sum_statistic := +{ + max_succes := min(successes_in_population, sample) + for x from turn to max_succes do hypergeometric_formula_statistic(population: population, successes_in_population: successes_in_population, sample: sample, successes_in_sample: x) +} +hypergeometric_formula_statistic := +{ + n_choose_k_statistic(n: successes_in_population, k: successes_in_sample) * n_choose_k_statistic(n: population - successes_in_population, k: sample - successes_in_sample) / n_choose_k_statistic(n: population, k: sample) +} +n_choose_k_statistic := +{ + accumulator := 1.0; + for x from 0 to k-1 do (accumulator := accumulator * to_real(n-x) / to_real(k-x)) + accumulator +} + +# Average number of cards in an opening hand +average_opening_hand_statistic := +{ + averages := split_text(set.global_variable_average_opening_hand, match: ";") + if length(averages) != 9 then set.global_variable_average_opening_hand else ( + types := [has_type_statistic("land")] + + (if has_type_statistic("artifact") then (if mana_production_list_statistic(check_type: "nonland") == "" then [false, true] else [true, false]) else [false, false]) + + [has_type_statistic("enchantment")] + + [has_type_statistic("planeswalker")] + + [has_type_statistic("battle")] + + [has_type_statistic("creature")] + + [has_type_statistic("sorcery")] + + [has_type_statistic("instant")] + result := for x from 0 to 8 do (if types[x] then averages[x] else "") + substring(result, begin: 1)) +} +global_variable_average_opening_hand_statistic := +{ + set_count := length(set.cards)-1 + if set_count < 0 then "" else ( + cards := for x from 0 to set_count do (if trim_from_draw_statistic(card: set.cards[x]) then [] else [set.cards[x]]) + card_count := length(cards)-1 + card_count_real := to_number(card_count+1) + if card_count < 6 then "Not enough non-commander non-promo cards to draw an opening hand. Add normal cards." else ( + + lands := 0 + manaartifacts := 0 + nonmanaartifacts := 0 + enchantments := 0 + planeswalkers := 0 + battles := 0 + creatures := 0 + sorceries := 0 + instants := 0 + + for x from 0 to card_count do + ( + c := cards[x] + if has_type_statistic(card:c, "land") then lands := lands + 1 + if has_type_statistic(card:c, "artifact") then (if mana_production_list_statistic(card: c, check_type: "nonland") == "" then (nonmanaartifacts := nonmanaartifacts + 1) else (manaartifacts := manaartifacts + 1)) + if has_type_statistic(card:c, "enchantment") then enchantments := enchantments + 1 + if has_type_statistic(card:c, "planeswalker") then planeswalkers := planeswalkers + 1 + if has_type_statistic(card:c, "battle") then battles := battles + 1 + if has_type_statistic(card:c, "creature") then creatures := creatures + 1 + if has_type_statistic(card:c, "sorcery") then sorceries := sorceries + 1 + if has_type_statistic(card:c, "instant") then instants := instants + 1 + ) + + lands_average := format_average_statistic(7.0 * to_number(lands) / card_count_real) + manaartifacts_average := format_average_statistic(7.0 * to_number(manaartifacts) / card_count_real) + nonmanaartifacts_average := format_average_statistic(7.0 * to_number(nonmanaartifacts) / card_count_real) + enchantments_average := format_average_statistic(7.0 * to_number(enchantments) / card_count_real) + planeswalkers_average := format_average_statistic(7.0 * to_number(planeswalkers) / card_count_real) + battles_average := format_average_statistic(7.0 * to_number(battles) / card_count_real) + creatures_average := format_average_statistic(7.0 * to_number(creatures) / card_count_real) + sorceries_average := format_average_statistic(7.0 * to_number(sorceries) / card_count_real) + instants_average := format_average_statistic(7.0 * to_number(instants) / card_count_real) + + ",​Lands — " + lands_average + + ";,​​Mana Artifacts — " + manaartifacts_average + + ";,​​​Non-Mana Artifacts — " + nonmanaartifacts_average + + ";,​​​​Enchantments — " + enchantments_average + + ";,​​​​​Planeswalkers — " + planeswalkers_average + + ";,​​​​​Battles — " + battles_average + + ";,​​​​​​Creatures — " + creatures_average + + ";,​​​​​​​Sorceries — " + sorceries_average + + ";,​​​​​​​​Instants — " + instants_average)) +} +format_average_statistic := +{ + split := split_text(match: "\\.", to_string(input)) + number := split[0] + digits := if (split[1] or else "") == "" then "00" else split[1] + if length(digits) == 1 then digits := digits + "0" + else if length(digits) > 2 then digits := substring(digits, end:2) + number + "." + digits +} + +# Rarities. +rarity_statistic := +{ + if card.shape == "Token" or card.shape == "token" or lang_setting("is_token")(card.super_type) then "token" + else if lang_setting("is_land")(card.super_type) and lang_setting("is_basic")(card.super_type) then "basic land" #There is an EN space in this string + else if card.rarity == "basic land" then "basic land" #There is an EN space in this string + else if card.rarity == "mythic rare" then "mythic rare" #There is an EN space in this string + else card.rarity +} + +# Watermarks +watermark_statistic := +{ + watermark_1 := trim(to_text(card.watermark)) + watermark_2 := if check_2_statistic() then trim(to_text(card.watermark_2)) else "" + watermark_1 + (if watermark_1 != "" and watermark_2 != "" then "," else "") + watermark_2 +} +stamp_statistic := +{ + stamp_1 := trim(to_text(card.card_stamp)) + stamp_2 := if check_2_statistic() then trim(to_text(card.card_stamp_2)) else "" + stamp_1 + (if stamp_1 != "" and stamp_2 != "" then "," else "") + stamp_2 +} +symbol_statistic := +{ + symbol_1 := trim(to_text(card.card_symbol)) + symbol_2 := if check_2_statistic() then trim(to_text(card.card_symbol_2)) else "" + symbol_1 + (if symbol_1 != "" and symbol_2 != "" then "," else "") + symbol_2 +} + +# Count how many creatures, non-creature permanents, and non-permanents are in the set. +permanent_statistic := +{ + result := face_permanent_statistic(to_text(card.super_type)) + (if check_2_statistic() then face_permanent_statistic(to_text(card.super_type_2)) else "") + substring(result, begin: 1) +} +face_permanent_statistic := +{ + if input == "" then "" + else if lang_setting("is_creature")(input) then ",​Creature" + else if lang_setting("is_artifact")(input) + or lang_setting("is_enchantment")(input) + or lang_setting("is_land")(input) + or lang_setting("is_hero")(input) + or lang_setting("is_planeswalker")(input) + or lang_setting("is_battle")(input) then ",​​Permanent" + else if lang_setting("is_spell")(input) then ",​​​Non Permanent" + else if lang_setting("is_nonstandard")(input) then ",​​​​Command Zone" + else ",​​​​​Unknown" +} + +# Types. +supertype_statistic := +{ + result := face_supertype_statistic(card.super_type) + (if check_2_statistic() then face_supertype_statistic(card.super_type_2) else "") + substring(result, begin: 1) +} +face_supertype_statistic := +{ + supertypes := split_space_statistic(to_text(input)) + count := length(supertypes) - 1 + custom_supertypes := custom_supertype_statistic() + for x from 0 to count do + ( + type := supertypes[x] + if lang_setting("is_basic")(type) then ",​Basic" # There is a zero width space after the comma in ",Basic" so that it always appears first. + else if lang_setting("is_snow")(type) then ",​​Snow" # There are two zero width spaces after the comma in ",Snow" so that it always appears second. + else if lang_setting("is_world")(type) then ",​​​World" # Etc... + else if lang_setting("is_legendary")(type) then ",​​​​Legendary" + else if lang_setting("is_token")(type) then ",​​​​​Token" + else if lang_setting("is_ongoing")(type) then ",​​​​​​Ongoing" + else if lang_setting("is_elite")(type) then ",​​​​​​​Elite" + else if lang_setting("is_host")(type) then ",​​​​​​​​Host" + else if contains_element(custom_supertypes, element: type) then ("," + type) + else "" + ) +} + +combined_type_statistic := +{ + type_1 := trim(to_text(card.super_type)) + type_2 := if check_2_statistic() then trim(to_text(card.super_type_2)) else "" + type_1 + (if type_1 != "" and type_2 != "" then "," else "") + type_2 +} + +type_extended_statistic := +{ + result := face_type_extended_statistic(card.super_type) + (if check_2_statistic() then face_type_extended_statistic(card.super_type_2) else "") + substring(result, begin: 1) +} +face_type_extended_statistic := +{ + old_types := split_space_statistic(to_text(input)) + count := length(old_types)-1 + custom_supertypes := custom_supertype_statistic() + new_types := for x from 0 to count do + ( + type := old_types[x] + if type == "" then "" + else if contains_element(custom_supertypes, element: type) then "" + else if lang_setting("get_supertypes")(type) != "" then "" + else if lang_setting("is_land")(type) then ",​Land" # There is a zero width space after the comma in ",Land" so that it always appears after custom types. + else if lang_setting("is_creature")(type) then ",​​Creature" # There are two zero width spaces after the comma in ",Creature" so that it always appears after lands. + else if lang_setting("is_kindred")(type) then ",​​​Kindred" # There are three zero width spaces after the comma in ",Kindred", etc... + else if lang_setting("is_artifact")(type) then ",​​​​Artifact" + else if lang_setting("is_enchantment")(type) then ",​​​​​Enchantment" + else if lang_setting("is_emblem")(type) then ",​​​​​​Emblem" + else if lang_setting("is_planeswalker")(type) then ",​​​​​​​Planeswalker" + else if lang_setting("is_battle")(type) then ",​​​​​​​​Battle" + else if lang_setting("is_sorcery")(type) then ",​​​​​​​​​Sorcery" + else if lang_setting("is_instant")(type) then ",​​​​​​​​​​Instant" + else if lang_setting("is_conspiracy")(type) then ",​​​​​​​​​​​Conspiracy" + else if lang_setting("is_dungeon")(type) then ",​​​​​​​​​​​​Dungeon" + else if lang_setting("is_hero")(type) then ",​​​​​​​​​​​​​Hero" + else if lang_setting("is_phenomenon")(type) then ",​​​​​​​​​​​​​​Phenomenon" + else if lang_setting("is_plane")(type) then ",​​​​​​​​​​​​​​​Plane" + else if lang_setting("is_scheme")(type) then ",​​​​​​​​​​​​​​​​Scheme" + else if lang_setting("is_vanguard")(type) then ",​​​​​​​​​​​​​​​​​Vanguard" + else ("," + type) + ) + if new_types == nil then "" else new_types +} + +custom_supertype_statistic := split_text@(input: set.custom_super_types, match: " ?, ?", include_empty: false) + +has_type_statistic := +{ + type := card.type + (if check_2_statistic(card:card) then " " + card.type_2 else "") + lang_setting("is_"+input)(type) +} + +combined_subtype_statistic := +{ + type_1 := trim(to_text(card.sub_type)) + type_2 := if check_2_statistic() then trim(to_text(card.sub_type_2)) else "" + type_1 + (if type_1 != "" and type_2 != "" then "," else "") + type_2 +} + +# Scans all cards for unknown subtypes and tries to determine if they're creature types +detect_custom_creature_subtypes_statistic := +{ + creature_hard := [] # on mono-creature cards + noncreature_hard := [] # on non-creature cards + creature_soft := [] # on multitype creature cards + + for each c in set do ( + for a from 0 to 1 do ( + subtypes := if a == 1 then face_detect_custom_subtypes_statistic(c.sub_type_2) else face_detect_custom_subtypes_statistic(c.sub_type) + super := if a == 1 then c.super_type_2 else c.super_type + is_creature := lang_setting("is_creature")(super) or lang_setting("is_kindred")(super) + is_artifact := lang_setting("is_artifact")(super) + is_enchantment := lang_setting("is_enchantment")(super) + is_land := lang_setting("is_land")(super) + is_just_creature := is_creature and not is_artifact and not is_enchantment and not is_land + for each s in subtypes do ( + # is this a canon type? + has_creature := if is_creature then contains(creature_subtypes_statistic(), match:s+";") else false + if not has_creature then ( + if is_just_creature then creature_hard := creature_hard + [s] + else if not is_creature then noncreature_hard := noncreature_hard + [s] + else creature_soft := creature_soft + [s] + ) + "" ## dummy return, otherwise it tries to concat scripts and explodes + ) + "" + ) + "" + ) + + ## Remove duplicates + noncreature_hard := sort_list(noncreature_hard, remove_duplicates:true) + creature_soft := sort_list(creature_soft, remove_duplicates:true) + + ## each potentially creature subtype that's not definitely noncreature is assumed creature + ## this isn't perfect, things like Reconfigure and Parcel Myr can muck with it + ## but those sets have noncreature Equipment and a Clue token card, so they would still work here + for each s in creature_soft do ( + if not contains_element(noncreature_hard, element:s) then creature_hard := creature_hard + [s] + "" + ) + + creature_hard := sort_list(creature_hard, remove_duplicates:true) + + ## we're just using this as set option so output as string + final := "" + for each s in creature_hard do final := final + s + ", " + final +} +# Scans all cards for unknown subtypes and tries to determine what their associated card type is +detect_custom_subtypes_statistic := +{ + creature_hard := [] # on mono-creature cards + artifact_hard := [] # on mono-artifact cards + enchantment_hard := [] # on mono-enchantment cards + land_hard := [] # on mono-land cards + spell_hard := [] # on mono-instant/sorcery cards + walker_soft := [] # on planeswalker cards + battle_soft := [] # on battle cards + noncreature_hard := [] # on multitype noncreature cards + unknown_sub_types := [] # on multitype creature cards + + for each c in set do ( + for a from 0 to 1 do ( + subtypes := if a == 1 then face_detect_custom_subtypes_statistic(c.sub_type_2) else face_detect_custom_subtypes_statistic(c.sub_type) + super := if a == 1 then c.super_type_2 else c.super_type + is_creature := lang_setting("is_creature")(super) or lang_setting("is_kindred")(super) + is_artifact := lang_setting("is_artifact")(super) + is_enchantment := lang_setting("is_enchantment")(super) + is_land := lang_setting("is_land")(super) + is_spell := lang_setting("is_spell")(super) + is_walker := lang_setting("is_planeswalker")(super) or lang_setting("is_emblem")(super) + is_battle := lang_setting("is_battle")(super) + is_just_creature := is_creature and not is_artifact and not is_enchantment and not is_land + is_just_artifact := is_artifact and not is_creature and not is_enchantment and not is_land + is_just_enchantment := is_enchantment and not is_creature and not is_artifact and not is_land + is_just_land := is_land and not is_creature and not is_artifact and not is_enchantment + for each s in subtypes do ( + # is this a canon type? + has_creature := if is_creature then contains(creature_subtypes_statistic(), match:s+";") else false + has_artifact := if is_artifact then contains(artifact_subtypes_statistic(), match:s+";") else false + has_enchantment := if is_enchantment then contains(enchantment_subtypes_statistic(), match:s+";") else false + has_land := if is_land then contains(land_subtypes_statistic(), match:s+";") else false + has_spell := if is_spell then contains(spell_subtypes_statistic(), match:s+";") else false + has_walker := if is_walker then contains(planeswalker_subtypes_statistic(), match:s+";") else false + has_battle := if is_battle then contains(battle_subtypes_statistic(), match:s+";") else false + if not has_creature and not has_artifact and not has_enchantment and not has_land and not has_walker and not has_battle and not has_spell then ( + if is_just_creature then creature_hard := creature_hard + [s] + else if is_just_artifact then artifact_hard := artifact_hard + [s] + else if is_just_enchantment then enchantment_hard := enchantment_hard + [s] + else if is_just_land then land_hard := land_hard + [s] + else if is_walker then walker_soft := walker_soft + [s] + else if is_battle then battle_soft := battle_soft + [s] + else if is_spell then spell_hard := spell_hard + [s] + else if not is_creature then noncreature_hard := noncreature_hard + [s] + else unknown_sub_types := unknown_sub_types + [s] + ) + "" ## dummy return, otherwise it tries to concat scripts and explodes + ) + "" + ) + "" + ) + + ## Remove duplicates + unknown_sub_types := sort_list(unknown_sub_types, remove_duplicates:true) + artifact_hard := sort_list(artifact_hard, remove_duplicates:true) + enchantment_hard := sort_list(enchantment_hard, remove_duplicates:true) + land_hard := sort_list(land_hard, remove_duplicates:true) + noncreature_hard := sort_list(noncreature_hard, remove_duplicates:true) + spell_hard := sort_list(spell_hard, remove_duplicates:true) + walker_soft := sort_list(walker_soft, remove_duplicates:true) + battle_soft := sort_list(battle_soft, remove_duplicates:true) + + ## Generally for multityping the main problem child is creatures + ## so planeswalkers, battles, and spells aren't checked here as they don't multitype + + undetermined_types := [] + + for each s in unknown_sub_types do ( + if not contains_element(artifact_hard, element:s) + and not contains_element(enchantment_hard, element:s) + and not contains_element(land_hard, element:s) + and not contains_element(noncreature_hard, element:s) then creature_hard := creature_hard + [s] + else undetermined_types := undetermined_types + [s] + "" + ) + + for each s in noncreature_hard do ( + if not contains_element(artifact_hard, element:s) + and not contains_element(enchantment_hard, element:s) + and not contains_element(land_hard, element:s) then undetermined_types := undetermined_types + [s] + "" + ) + + creature_hard := sort_list(creature_hard, remove_duplicates:true) + + final := "\n" + if length(creature_hard) > 0 then final := final + "Custom Creature Types:\n" + join(creature_hard, sep:"\n") + "\n\n"; + if length(artifact_hard) > 0 then final := final + "Custom Artifact Types:\n" + join(artifact_hard, sep:"\n") + "\n\n"; + if length(enchantment_hard) > 0 then final := final + "Custom Enchantment Types:\n" + join(enchantment_hard, sep:"\n") + "\n\n"; + if length(land_hard) > 0 then final := final + "Custom Land Types:\n" + join(land_hard, sep:"\n") + "\n\n"; + if length(spell_hard) > 0 then final := final + "Custom Spell Types:\n" + join(spell_hard, sep:"\n") + "\n\n"; + if length(walker_soft) > 0 then final := final + "Custom Planeswalker Types:\n" + join(walker_soft, sep:"\n") + "\n\n"; + if length(battle_soft) > 0 then final := final + "Custom Battle Types:\n" + join(battle_soft, sep:"\n") + "\n\n"; + if length(undetermined_types) > 0 then final := final + "Custom Unknown Types:\n" + join(undetermined_types, sep:"\n") + "\n\n"; + + trace(final) + "" +} +# Clean up subtypes +face_detect_custom_subtypes_statistic := +{ + split_space_statistic(trim(to_text(clean_subtypes_statistic(input)))) +} + +remove_custom_supertypes_statistic := +{ + custom_supertypes := custom_supertype_statistic() + count := length(custom_supertypes)-1 + for x from 0 to count do input := replace(input, match: custom_supertypes[x], replace: "") + input +} +remove_supertypes_statistic := to_text + + lang_setting("remove_supertypes") + + remove_custom_supertypes_statistic + + trim +keep_only_supertypes_statistic := +{ + supertypes := split_space_statistic(to_text(input)) + count := length(supertypes) - 1 + custom_supertypes := custom_supertype_statistic() + result := for x from 0 to count do + ( + type := supertypes[x] + if lang_setting("is_basic")(type) then "Basic " + else if lang_setting("is_snow")(type) then "Snow " + else if lang_setting("is_world")(type) then "World " + else if lang_setting("is_legendary")(type) then "Legendary " + else if lang_setting("is_token")(type) then "Token " + else if lang_setting("is_ongoing")(type) then "Ongoing " + else if lang_setting("is_elite")(type) then "Elite " + else if lang_setting("is_host")(type) then "Host " + else if contains_element(custom_supertypes, element: type) then (type + " ") + else "" + ) + trim(result) +} + +creature_subtype_statistic := +{ + canon := creature_subtypes_statistic() + custom := replace_commas_statistic(set.custom_creature_races) + ";" + replace_commas_statistic(set.custom_creature_classes) + ";" + excluded := "" + result := (face_creature_subtype_statistic(sub: card.sub_type, super: card.super_type, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded)) + + (if check_2_statistic() then face_creature_subtype_statistic(sub: card.sub_type_2, super: card.super_type_2, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded) else "") + substring(result, begin: 1) +} +creature_race_statistic := +{ + canon := creature_races_statistic() + custom := replace_commas_statistic(set.custom_creature_races) + ";" + excluded := replace_commas_statistic(set.custom_creature_classes) + ";" + result := (face_creature_subtype_statistic(sub: card.sub_type, super: card.super_type, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded)) + + (if check_2_statistic() then face_creature_subtype_statistic(sub: card.sub_type_2, super: card.super_type_2, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded) else "") + substring(result, begin: 1) +} +creature_class_statistic := +{ + canon := creature_classes_statistic() + custom := replace_commas_statistic(set.custom_creature_classes) + ";" + excluded := replace_commas_statistic(set.custom_creature_races) + ";" + result := (face_creature_subtype_statistic(sub: card.sub_type, super: card.super_type, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded)) + + (if check_2_statistic() then face_creature_subtype_statistic(sub: card.sub_type_2, super: card.super_type_2, canon_subtypes: canon, custom_subtypes: custom, excluded_subtypes: excluded) else "") + substring(result, begin: 1) +} + +face_creature_subtype_statistic := +{ + old_subtypes := to_text(clean_subtypes_statistic(sub)) + if old_subtypes == "" then "" else ( + + split := split_space_statistic(old_subtypes) + count := length(split)-1 + new_subtypes := for x from 0 to count do + ( + subtype := split[x] + subtypesc := subtype + ";" + if subtype == "" + or contains(excluded_subtypes, match: subtypesc) then "" + else if contains(canon_subtypes, match: subtypesc) + or contains(custom_subtypes, match: subtypesc) then ("," + subtype) + else "" + ) + if new_subtypes == nil then "" else new_subtypes) +} + +noncreature_subtype_statistic := +{ + result := face_noncreature_subtype_statistic(sub: card.sub_type, super: card.super_type) + (if check_2_statistic() then face_noncreature_subtype_statistic(sub: card.sub_type_2, super: card.super_type_2) else "") + substring(result, begin: 1) +} +face_noncreature_subtype_statistic := +{ + old_subtypes := to_text(clean_subtypes_statistic(sub)) + if old_subtypes == "" then "" else ( + + split := split_space_statistic(old_subtypes) + count := length(split)-1 + custom_creature_subtypes := replace_commas_statistic(set.custom_creature_races) + ";" + replace_commas_statistic(set.custom_creature_classes) + ";" + new_subtypes := for x from 0 to count do + ( + subtype := split[x] + subtypesc := subtype + ";" + if subtype == "" then "" + else if contains(custom_creature_subtypes, match: subtypesc) then "" + else if contains(creature_subtypes_statistic(), match: subtypesc) then "" + else if contains(land_subtypes_statistic(), match: subtypesc) then (",​" + subtype) # There is a zero width space after the comma so that land subtypes always appear after custom subtypes. + else if contains(artifact_subtypes_statistic(), match: subtypesc) then (",​​" + subtype) # There are two zero width spaces after the comma so that artifact subtypes always appear after land subtypes, etc... + else if contains(enchantment_subtypes_statistic(), match: subtypesc) then (",​​​" + subtype) + else if contains(planeswalker_subtypes_statistic(), match: subtypesc) then (",​​​​" + subtype) + else if contains(battle_subtypes_statistic(), match: subtypesc) then (",​​​​​" + subtype) + else if contains(spell_subtypes_statistic(), match: subtypesc) then (",​​​​​​" + subtype) + else if contains(dungeon_subtypes_statistic(), match: subtypesc) then (",​​​​​​​" + subtype) + else if contains(plane_subtypes_statistic(), match: subtypesc) then (",​​​​​​​​" + subtype) + else if lang_setting("is_planeswalker")(super) or lang_setting("is_emblem")(super) then (",​​​​" + subtype) + else if lang_setting("is_artifact")(super) then (",​​" + subtype) + else if lang_setting("is_enchantment")(super) then (",​​​" + subtype) + else if lang_setting("is_land")(super) then (",​" + subtype) + else if lang_setting("is_spell")(super) then (",​​​​​​" + subtype) + else if lang_setting("is_battle")(super) then (",​​​​​" + subtype) + else if lang_setting("is_dungeon")(super) then (",​​​​​​​" + subtype) + else if lang_setting("is_plane")(super) then (",​​​​​​​​" + subtype) + else ("," + subtype) + ) + if new_subtypes == nil then "" else new_subtypes) +} +replace_commas_statistic := replace@(match: " ?, ?", replace: ";") +split_space_statistic := split_text@(match: " ", include_empty:false) +replace_space_statistic := replace@(match: " ", replace: "_") +replace_squote_statistic := replace@(match: "'", replace: "’") +# replace normal space with EN space to workaround stat space bug +en_space_statistic := replace@(match: " ", replace: " ", in_context:"[^>][^<]") +clean_subtypes_statistic := replace_squote_statistic + + en_space_statistic + +# semicolor separated lists of all localized canon subtypes +land_subtypes_statistic := { + basics := lang_setting("word_lists_basic") + list := lang_setting("word_list_land") + "," + + basics.0 + "," + + basics.1 + "," + + basics.2 + "," + + basics.3 + "," + + basics.4 + "," + replace_commas_statistic(clean_subtypes_statistic(list)) +} +artifact_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_artifact"))) + ";" +} +enchantment_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_enchantment"))) + ";" +} +planeswalker_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_planeswalker"))) + ";" +} +battle_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_battle"))) + ";" +} +spell_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_spell"))) + ";" +} +dungeon_subtypes_statistic := { + replace_commas_statistic(clean_subtypes_statistic(lang_setting("word_list_dungeon"))) + ";" +} +plane_subtypes_statistic := { + list := for each submenu in lang_setting("word_lists_plane") do submenu + ","; + replace_commas_statistic(clean_subtypes_statistic(list)) +} +creature_races_statistic := { + list := for each submenu in lang_setting("word_lists_race") do submenu + ","; + replace_commas_statistic(clean_subtypes_statistic(list)) +} +creature_classes_statistic := { + list := for each submenu in lang_setting("word_lists_class") do submenu + ","; + replace_commas_statistic(clean_subtypes_statistic(list)) +} +creature_subtypes_statistic := { + creature_races_statistic() + creature_classes_statistic() +} + +format_number_statistic := +{ + if input == "x" or input == "y" or input == "X" or input == "Y" then input := "X" + else if (to_number(input) or else 0) > 10 then input := "11+" + else if (to_number(input) or else 0) < 0 then input := "negative" + if input == "" then "" else "," + input +} +power_statistic := +{ + fields := ["power"] + if not check_2_statistic() then [] + else if contains(card.shape, match: "flip") + or contains(card.shape, match: "split") + or contains(card.shape, match: "aftermath") then ["power_2"] + else if contains(card.shape, match: "double faced") then (if contains((card.styling or else styling).front_style or else "", match: "leveler") then ["power_4"] else ["power_2"]) + else [] + count := length(fields) - 1 + result := for x from 0 to count do format_number_statistic(card[fields[x]]) + substring(result, begin: 1) +} +toughness_statistic := +{ + fields := ["toughness"] + if not check_2_statistic() then [] + else if contains(card.shape, match: "flip") + or contains(card.shape, match: "split") + or contains(card.shape, match: "aftermath") then ["toughness_2"] + else if contains(card.shape, match: "double faced") then (if contains((card.styling or else styling).front_style or else "", match: "leveler") then ["toughness_4"] else ["toughness_2"]) + else [] + count := length(fields) - 1 + result := for x from 0 to count do format_number_statistic(card[fields[x]]) + substring(result, begin: 1) +} +loyalty_statistic := +{ + result_1 := if lang_setting("is_planeswalker")(card.super_type) or contains(card.shape, match: "planeswalker") then trim(to_text(card.loyalty)) else "" + result_1 := format_number_statistic(result_1) + result_2 := if check_2_statistic() and lang_setting("is_planeswalker")(card.super_type_2) then trim(to_text(card.loyalty_2)) else "" + result_2 := format_number_statistic(result_2) + substring(result_1+result_2, begin: 1) +} +defense_statistic := +{ + result_1 := if lang_setting("is_battle")(card.super_type) then trim(to_text(card.loyalty)) else "" + result_1 := format_number_statistic(result_1) + result_2 := if check_2_statistic() and lang_setting("is_battle")(card.super_type_2) then trim(to_text(card.loyalty_2)) else "" + result_2 := format_number_statistic(result_2) + substring(result_1+result_2, begin: 1) +} + +# Should we check the secondary face of the card, like the card.casting_cost_2 or card.type_2 fields? +check_2_statistic := +{ + (chosen(set.count_secondary_faces, choice: "MDFC") and contains(card.shape, match: "modal")) or + (chosen(set.count_secondary_faces, choice: "TDFC") and contains(card.shape, match: "transform")) or + (chosen(set.count_secondary_faces, choice: "TDFC") and contains(card.shape, match: "double faced") and not contains(card.shape, match: "modal") and not contains(card.shape, match: "transform")) or + (chosen(set.count_secondary_faces, choice: "Aftermath") and contains(card.shape, match: "aftermath")) or + (chosen(set.count_secondary_faces, choice: "Adventure") and contains(card.shape, match: "adventure")) or + (chosen(set.count_secondary_faces, choice: "Flip") and contains(card.shape, match: "flip")) or + (chosen(set.count_secondary_faces, choice: "Split") and contains(card.shape, match: "split")) +} + +# Should we check the card.rule_text_X fields, or the card.level_X_text fields? +# TODO this is gonna need tweaked once we have Urza, Planeswalker support +text_to_check_statistic := +{ + if contains(card.shape, match: "double faced") then + ( + front := (card.styling or else styling).front_style or else "" + if contains(front, match: "planeswalker") or contains(front, match: "leveler") or contains(card.shape, match: "planeswalker") or contains(card.shape, match: "leveler") then + [ + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "rule_text_3" + ] + else if contains(front, match: "saga") then + [ + "chapter_text", + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "rule_text_3" + ] + else if contains(front, match: "class") then + [ + "chapter_text", + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "level_9_text", + "level_10_text", + "level_11_text", + "rule_text_3" + ] + else + [ + "rule_text", + "rule_text_3" + ] + ) + else if contains(card.shape, match: "planeswalker") then + [ + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "level_5_text", + "level_6_text", + "rule_text_3" + ] + else if contains(card.shape, match: "leveler") then + [ + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "level_5_text", + "rule_text_3" + ] + else if contains(card.shape, match: "saga") then + [ + "chapter_text", + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "level_5_text", + "level_6_text", + "level_7_text", + "rule_text_3" + ] + else if contains(card.shape, match: "class") then + [ + "chapter_text", + "level_1_text", + "level_2_text", + "level_3_text", + "level_4_text", + "level_5_text", + "level_6_text", + "level_7_text", + "level_9_text", + "level_10_text", + "level_11_text", + "level_12_text", + "level_13_text", + "level_14_text", + "rule_text_3" + ] + else if contains(card.shape, match: "split") then + [ + "rule_text", + "rule_text_3" + ] + else if has_mutate_text_statistic(card: card) then + [ + "rule_text", + "level_1_text" + ] + else # if contains(card.shape, match: "normal") or contains(card.shape, match: "adventure") or contains(card.shape, match: "flip") or contains(card.shape, match: "aftermath") then + [ + "rule_text" + ] +} +text_to_check_2_statistic := +{ + if contains(card.shape, match: "double faced") then + ( + back := (card.styling or else styling).back_style or else "" + if contains(back, match: "planeswalker") or contains(back, match: "leveler") then + [ + "level_5_text", + "level_6_text", + "level_7_text", + "level_8_text" + ] + else if contains(back, match: "saga") then + [ + "chapter_text_2", + "level_5_text", + "level_6_text", + "level_7_text", + "level_8_text" + ] + else if contains(back, match: "class") then + [ + "chapter_text_2", + "level_5_text", + "level_6_text", + "level_7_text", + "level_8_text", + "level_12_text", + "level_13_text", + "level_14_text" + ] + else + [ + "rule_text_2" + ] + ) + else if contains(card.shape, match: "adventure") or contains(card.shape, match: "flip") or contains(card.shape, match: "aftermath") or contains(card.shape, match: "split") then + [ + "rule_text_2" + ] + else # if contains(card.shape, match: "normal") or contains(card.shape, match: "planeswalker") or contains(card.shape, match: "leveler") or contains(card.shape, match: "saga") or contains(card.shape, match: "class") + [ + ] +} +# TODO don't love this implementation +has_mutate_text_statistic := +{ + contains(card.shape, match: "normal") and + contains((card.styling or else styling).frames or else "", match: "mutate") and + card.level_1_text != "" and + card.level_1_text != card.rule_text +} + +#Is the given text field visible on the card? This would be much better than the above methods to know which fields to check, but card_style does not initialize properly, so it's not usable atm. +#is_field_visible_statistic := +#{ +# style := card_style[input] +# style.visible and +# min(stylesheet.card_width, style.right) - max(0, style.left) > stylesheet.card_width/70 and #Field needs to take up a certain percentage of the total card to be considered visible. +# min(stylesheet.card_height, style.bottom) - max(0, style.top) > stylesheet.card_width/80 +#} + +# Should the card be excluded from the statistics? +# real value of input keys +filter_field_map_statistic := +[ + artist: {card.illustrator}, + artist_2: {card.illustrator_2}, + template: {stylesheet.short_name}, + color_category: {primary_card_color(card.card_color)}, + color: {color_statistic()}, + color_identity: {color_identity_statistic()}, + color_count: {color_count_statistic()}, + color_identity_count: {color_identity_count_statistic()}, + mana_production: {mana_production_list_statistic(check_type: "all")}, + "permanent/non": {replace_en_spaces_statistic(remove_zero_width_spaces_statistic(permanent_statistic()))}, + mana_value: {cmc(card.casting_cost)}, + mana_value_2: {cmc(card.casting_cost_2)}, + supertype: {keep_only_supertypes_statistic(card.super_type)}, + supertype_2: {keep_only_supertypes_statistic(card.super_type_2)}, + type: {remove_supertypes_statistic(card.super_type)}, + type_2: {remove_supertypes_statistic(card.super_type_2)}, + subtype: {card.sub_type}, + subtype_2: {card.sub_type_2}, + defense: {card.loyalty} + defense_2: {card.loyalty_2} + word_count: {total_word_count_statistic()}, + paragraph_count: {total_paragraph_count_statistic()}, + card_notes: {card.notes} +] +# alternate names for input keys +filter_field_alias_statistic := +[ + artist2: "artist_2", + colors: "color", + exact_color: "color", + exact_colors: "color", + all_mana_production: "mana_production", + cmc: "mana_value", + converted_mana_cost: "mana_value", + "mv": "mana_value", + cmc_2: "mana_value_2", + converted_mana_cost_2: "mana_value_2", + mv_2: "mana_value_2", + converted_mana_cost2: "mana_value_2", + mv2: "mana_value_2", + super_type: "supertype" + super_type_2: "supertype_2", + supertype2: "supertype_2", + type2: "type_2", + subtype2: "subtype_2", + sorted_notes: "card_notes", + power2: "power_2", + toughness2: "toughness_2", + loyalty2: "loyalty_2", + defense2: "defense_2" +] +filter_number_variable_statistic := +[ + power: true, + power_2: true, + toughness: true, + toughness_2: true, + loyalty: true, + loyalty_2: true + defense: true, + defense_2: true +] +# turn user input key into its real value or else nil +filter_key_to_field_statistic := +{ + filter_field_map_statistic[input]() or else card[input] or else nil +} +filter_from_statistic := +{ + if filter_string == "" then "Kept" else ( + initial := escape_quotes_filter_statistics(replace_squote_statistic(filter_string)) + # We always AND all the filters together, but we can do OR as well with the following identity: x OR y = NOT ( (NOT x) AND (NOT y) ) + prefix := substring(initial, begin:0, end:4) + negate := if prefix == "[OR]" or prefix == "[Or]" or prefix == "[or]" then (initial := substring(initial, begin:4); true) else false + initial_filters := get_filter_values_statistic(initial) + initial_keys := get_filter_keys_statistic(initial) + initial_modes := get_filter_modes_statistic(initial) + count := length(initial_filters)-1 + if count != length(initial_keys)-1 or count != length(initial_modes)-1 then "!! Failed to parse filters !!" else ( + fields := [] + filters := [] + keys := [] + modes := [] + for x from 0 to count do + ( + key := replace_space_statistic(trim(initial_keys[x])) + key := filter_field_alias_statistic[key] or else key + mode := initial_modes[x] + field := filter_key_to_field_statistic(key) + filter := if key == "color" then + ( + colors := distil_color_filter_statistic(initial_filters[x]) + sort_order := if mode == "==" or mode == "!=" then "in_place(" + colors + ")" else colors + field := sort_text(field, order:sort_order) + colors + ) + else remove_quotes_statistic(initial_filters[x]); + fields := fields + [field] + filters := filters + [filter] + keys := keys + [key] + modes := modes + [mode] + ) + message := "Kept" + for x from 0 to count do + ( + if message == "Kept" or message == "Filtered" then + ( + if fields[x] == nil then + ( + if keys[x] == "[or]_type" then message := "!! [OR] applies to all filters and must be at the start !!" + else message := "!! Could not find card field named [ " + keys[x] + " ] !!" + ) + else + ( + field := trim(escape_quotes_field_statistics(replace_squote_statistic(remove_tags(fields[x])))) + filter := filters[x] + key := keys[x] + mode := if negate then negate_mode(modes[x]) else modes[x] + if (mode == "==" and field != filter) + or (mode == "!=" and field == filter) + or (mode == "=:" and not contains(to_lower(field), match: to_lower(filter))) + or (mode == "!:" and contains(to_lower(field), match: to_lower(filter))) + then message := "Filtered" + else if mode == "\<=" + or mode == ">=" + or mode == "\<" + or mode == ">" + then + ( + field_number := to_number(field) or else nil + filter_number := to_number(filter) or else nil + if field_number == nil and filter_number_variable_statistic[key] or else false + then field_number := to_number(filter_numbers_statistic(field)) + if field == "" + then (if not negate then message := "Filtered") + else if field_number == nil + then message := "!! Could not convert the value of card field [ " + key + " ] to a number !!" + else if filter_number == nil + then message := "!! Could not convert the value of filter [ " + key + mode + "\"" + unescape_quotes_filter_statistics(filter) + "\" ] to a number !!" + else if (mode == "\<=" and field_number > filter_number) + or (mode == ">=" and field_number < filter_number) + or (mode == "\<" and field_number >= filter_number) + or (mode == ">" and field_number <= filter_number) + then message := "Filtered" + ) + ) + ) + ) + if message == "Filtered" and negate then "Kept" + else if message == "Kept" and negate then "Filtered" + else message)) +}@(filter_string: set.filter_statistics) +unescape_quotes_filter_statistics := replace@(match: "\\[\\[quoteescape\\]\\]", replace: "\\\\\"") +escape_quotes_filter_statistics := replace@(match: "(\\\\\")|“|”", replace: "[[quoteescape]]") +escape_quotes_field_statistics := replace@(match: "(\\\")|“|”", replace: "[[quoteescape]]") +get_filter_values_statistic := trim + break_text@(match: "\"[^\"]*\"") +get_filter_keys_statistic := trim + replace@(match: "\"[^\"]*\"", replace: "") + replace@(match: "=:|!:|==|!=|\<=|>=", replace: "") + to_lower + split_text@(match: ", ?") +get_filter_modes_statistic := trim + replace@(match: "\"[^\"]*\"", replace: "") + break_text@(match: "=:|!:|==|!=|\<=|>=") +distil_color_filter_statistic := +{ + filter := distil_color_words_statistic(to_lower(input)) + if filter == "" then distil_colors_statistic(to_upper(input)) else filter +} +remove_quotes_statistic := replace@(match: "\"", replace: "") +negate_mode := +{ + if input == "==" then "!=" + else if input == "!=" then "==" + else if input == "=:" then "!:" + else if input == "!:" then "=:" + else if input == "\<=" then ">" + else if input == ">=" then "\<" + else if input == "\<" then ">=" + else "\<=" +} + +trim_from_statistic := +{ + if set.trim_statistics then + ( + card.shape == "token" + or card.shape == "emblem" + or card.rarity == "special" + or card.rarity == "masterpiece" + or lang_setting("is_nonstandard")(card.type) + ) + else false +} + +trim_from_draw_statistic := +{ + contains(card.notes, match: "commander") + or contains(card.notes, match: "Commander") + or (set.trim_statistics and (card.rarity == "special" or card.rarity == "masterpiece")) + or card.shape == "token" + or card.shape == "emblem" + or lang_setting("is_nonstandard")(card.type) + or filter_from_statistic(card: card) == "Filtered" +} + +statistics_info := +{ + trace(" + + [[[STATISTICS HELP]]] + + If some cards are improperly counted, reloading the data via the File menu may correct it. + If the program seems to count things that are not present on a card, it may be picking up on remnants from when the card used another template. + Temporarily switch to a DFC template or a leveler template and delete any info that is not necessary on the current version of the card. + + + [[[SET INFO TAB]]] + + [Trim statistics] + This option will exclude the following cards from being counted in the statistics: + - cards with special rarity + - cards with masterpiece rarity + - tokens + - emblems + - dungeons + - conspiracies + - heroes + - vanguards + - schemes + - planes + - phenomenons + + [Filter statistics] + This lets you more precisely exclude cards from being counted. + The syntax is as follows: + + field_name==\"value\" + + So for example if you write: + + notes==\"Removal\" + + the stats page will only count cards for which the notes are precisely 'Removal' and nothing else. + You can use != for strict inequality, so for example if you write: + + notes!=\"Removal\" + + the stats page will only count cards for which the notes are NOT precisely 'Removal' and nothing else. + Use =: to check if the field contains the value, so for example if you write: + + sub_type=:\"goblin\" + + the stats page will only count cards that have 'goblin' among their subtypes. + Use !: to exclude, so write: + + sub_type!:\"goblin\" + + and the stats page will only count cards that do not have 'goblin' among their subtypes. + Use >= and <= for quantities that are numeric, so stuff like: + + mana_value>=\"6\" + + toughness<=\"3\" + + This will also filter cards that have no toughness. + You can write multiple criteria by separating them with a comma, so: + + rule_text=:\"deathtouch\", sub_type=:\"snake\" + + will only count cards that contain 'deathtouch' in their rule text AND that are snakes. + If you want cards that contain 'deathtouch' OR that are snakes, write [OR] at the start of the filter: + + [OR] rule_text=:\"deathtouch\", sub_type=:\"snake\" + + If you search for \" quotes, you must escape them with \\. For example: + + rule_text=:\"Creatures you control gain \\\"T: Add G.\\\" until end of turn.\" + + [Count secondary faces] + This option allows the stats page to count the back faces of DFC cards, the adventure on adventure cards, both halves of a split card, etc... + Some things like color never take into account the secondary faces, regardless of what is chosen here. + Some things like color identity always take into account the secondary faces. + + [Custom super types] + If your set uses custom super types, write them all in this field, separated by commas. Otherwise, they will be counted as types. + + [Custom creature races/classes] + If your set uses custom creature sub types, write them all in these fields, separated by commas. Otherwise, they will be counted as non-creature sub types. + Setting this equal to "detect" will have MSE check all your cards and write out any custom creature types it detects. + This might find false positives, for example, it will detect a custom artifact type that's only on artifact creatures as a creature type. + Some ambiguous canon sub types like Zombie are counted as both a race and a class. If you want them to only count in one category, add them to the corresponding field. + + + [[[STATISTICS TAB]]] + + [Color Category, Exact Color] + The color as defined by the comprehensive rules. Never takes into account the back side or secondary face (like on adventures for example), + except for split cards and aftermath cards. Exact Color splits multicolor and hybrid cards into bars for each color combination. + + [Color Identity] + The commander color identity as defined by the comprehensive rules. Always takes into account all sides and faces of the card. + + [Casting Cost, Mana Value] + Self explanatory. Counts each side/face separately, if the option is checked in the Set info tab. + + [Permanent/Non] + Counts the number of creatures, noncreature permanents, and nonpermanents. Counts each side/face separately. + + [All Mana Production] + Counts how many cards can produce white mana. Repeat for all other colors. Then counts how many cards can produce mana of any color, and mana of a chosen color. + + [Land Mana Production] + Same as above but only checking land cards. + + [Nonland Mana Production] + Same as above but only checking nonland cards. + + [Pip Count (Casting Costs)] + Counts the number of casting costs that contain one colored pip. Repeat for all other amounts. + + [Pip Colors (Casting Costs)] + Counts how many cards have a single white pip in their casting cost. Repeat for two white pips. Then three, then four+, then for all other colors. + Counts each side/face separately if the option is checked. + + [Total Pips (Casting Costs)] + Counts the total number of white pips in all the casting costs. Repeat for all other colors. + + [Pip Count (Ability Costs)] + Counts the number of activated/triggered/keyworded ability costs that contain one colored pip. Repeat for all other amounts. + + [Pip Colors (Ability Costs)] + Counts how many activated/triggered/keyworded abilities have a single white pip in their cost. Repeat for two white pips. Then three, then four+, then for all other colors. + Counts each ability on each side/face separately. + + [Total Pips (Ability Costs)] + Counts the total number of white pips in all the activated/triggered/keyworded ability costs. Repeat for all other colors. + + [Pip Count (Combined Costs)] + Counts the number of costs that contain one colored pip. Repeat for all other amounts. + + [Pip Color (Combined Costs)] + Counts how many costs contain a single white pip. Repeat for two white pips. Then three, then four+, then for all other colors. Counts each cost on each side/face separately. + + [Total Pips (Combined Costs)] + Counts the total number of white pips in all the costs. Repeat for all other colors. + + [Card Notes Words] + Counts each word that appears in the card notes field. + + [Card Notes Clauses] + Cuts the card notes using the regex specified in the set info tab. By default, it will cut at each dot, each new line, each semicolon, each comma and before each exclamation mark. + So for example, if you write 'Removal, Board Wipe; Draw' the card will count in the 'Removal' category, the 'Board Wipe' category and the 'Draw' category. + You can make whatever categories you like. + + [Average Opening Hand] + If the set is a deck, how many cards of each type will an opening hand contain on average. + !! This statistic only properly updates when the program is reloaded, or when a card is added or removed from the set !! + + [Land Drop Hit % (Play)] + If the set is a deck, probability of hitting every single land drop up to the given turn, when on the play. Always excludes cards with the word 'commander' in their card notes, + as well as tokens, emblems, dungeons, conspiracies, heroes, vanguards, schemes, planes and phenomenons. + + [Land Drop Hit % (Draw)] + Same as above, but when on the draw. + + [Color Count] + How many cards have one color, how many have two, three, etc... + + [Color Identity Count] + How many cards have one color in their color identity, how many have two, three, etc... + + [Color (Secondary Face)] + Color of the back side or secondary face (like on adventures for example). + + [Color (All Faces)] + Combined color of all the sides/faces. + + [Color (Promos)] + Color of cards with 'special' or 'masterpiece' rarity. + + [Omniverse Color] + Same as color category, but counts extended colors (Purple, Pink, Yellow, Orange, Brown) + + [Filter] + Shows which cards have been filtered by the criteria in the 'Filter statistics' field of the Set info tab, or displays error messages if the criteria could not be parsed. + + (Click me or scroll up to see the beginning) + ") + "" +} +statistics_help := +{ + statistics_info() +} +stats_info := +{ + statistics_info() +} +stats_help := +{ + statistics_info() +} diff --git a/data/magic.mse-game/stats/card_symbol.png b/data/magic.mse-game/stats/card_symbol.png deleted file mode 100644 index 0963785c5784855bd5f720646bd9967a823c0ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 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 B&z=AP delta 855 zcmV-d1E~CvYV8J)BYyx1a7bBm000id000id0mpBsWB>pF33NqRbVF}#ZDnqB004<9 zjRpV!0}4q*K~#90t(03xltC27*EQWBQPk2bFvLusvU=ztSFOYpv3rO}C1t3gq$z8u z8E6!Wrg*>R4N*}<#R#JWEnU~kdf9c;3ZkGV33~Ga=D%~sU4Pl+)9fM>f(YtI63Wsg@pwo!ox7o*UQpH;@D==ApOLMh=}W` z8<9d97aNUPomNCOL+whR6L^rSf?;wLdR|KEMh%}hO4DGL@_+U`4|%}e-X7`qRfxP6Ar>@> z%vq6=CQ-wZ>6A@OkE_wy-U3HQ2PmwqDYxz7^fw3vGKr#o(cOWKQjT`8{}udwm9Vn1 zLQr4;v?G#{N=g^nTN>$*2G<9f76`j?33b)wBA0w{vC&b#i;1r&3Td~u8k@A z{2g=aCVw&?relUqn)4kJd`4WSyzIxKZEfrTdV4y*OG!1nH5T!fc>+h~=j(%6dObXO zlG@b+ud#oh3v6v|(NJ3@t`*-HRZ@aRN*be3C>C0q>e1KRgA3T5)PDR1I=R+SZ_ zredvbZmh-KJ8`Qt*GEdqNClM%q2Z-;RO5pAt4UySRUjIQl!GdBoQVEwN}?z{m>ml_(&bw<|O+yNNWyKr9pU hL<4dBZ)E>eegYbXMy7CL=s5rY002ovPDHLkV1llYlw<$^ diff --git a/data/magic.mse-game/stats/card_color.png b/data/magic.mse-game/stats/color.png similarity index 100% rename from data/magic.mse-game/stats/card_color.png rename to data/magic.mse-game/stats/color.png diff --git a/data/magic.mse-game/stats/color_colored_cost.png b/data/magic.mse-game/stats/color_colored_cost.png deleted file mode 100644 index 24b7ff331cb91eb096a93690817e521617c3a17a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1262 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 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/color_pips.png b/data/magic.mse-game/stats/color_pips.png new file mode 100644 index 0000000000000000000000000000000000000000..bb11f8138ed3e92b489933216b169ee7250b9ef9 GIT binary patch literal 16251 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 T{fM>rlZ<2~l_aXgjD!9k literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/color_rarity.png b/data/magic.mse-game/stats/color_rarity.png deleted file mode 100644 index ebec2520fffe63d1b6cfcaf9c05736319c360c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmV+)1mOFLP)pF33NqRbVF}#ZDnqB004<9jRpV!1H4H@K~#90V_+Zz1nP>6e`1vh zgtP9Q4E_)2tUQ^xZQH8q!*NUZen(M1O-d4^%IMTK@Bdf!`~PPk9n@?!*}Heelvyk# zo2-D`a6z))me#`C{owHDk+p{Vi)KRk+W{(sRkVlI%Y z1H}I=O~mFbpJq$YO`jEHxpMBG3i*HQXz<^pNX2Wo6dnT+i4jWgfRq{#vj=<2odePw zglxbLu3Xqy{r~mqe_!A1+6ooo1L7XI0`n$e#SNDt{$zLC%57WH{Jo*XQbT|Knaj*< z?AK9DN-i%@!6f;|J@yx zw=$psHy{?B&}8!Y{;ANvC%1b4<6vX7#}-NtK*YiIUjJwJnEyGt$^E~Sl(+-BqFNy4 z6X55vj1N^@3=&X~mx;766g!R0MAE>=SNm0ezg>It*OMLpzCPad{`n#Ie6Kx+6Jc3+a4dGWtV zV(tkb_c;&?;PvjdEe$~-g?gV%lLY=dXYrm-nqaStuEw>ZK9gNaWh0PzK}AVqwT`Al zEnY)m;G&d)+bd7^(%Zh?#jy+w5-@Q!K{;1eCYH%S=4Np*-q>j!X8-GpjJ|MiaH!)o zuvSqqd8V}F|9!I3|86^5{D1D}b0Rf06_k!WfOvtNw7~6*1k3#`Wk&DL?ehJ1ZkNx$ z+G2|rB{}x{EApKV)|a^-4hu9sfMIa8wVBlv8{7MntSxtXa|wW43d)N&8vnO4k?J61pcoK;24XXqfB-*ljIa>U!WW`S^C@7l4 Z1OPXVVA;c{XPW>3002ovPDHLkV1m1{1JnQj diff --git a/data/magic.mse-game/stats/colored_casting_cost.png b/data/magic.mse-game/stats/colored_casting_cost.png deleted file mode 100644 index 28c71867812336795e13ae9fe2e9a121eaacb3e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVpF33NqRbVF}#ZDnqB004<9jRpV!1CvQaK~#90rPNzYn{^n+@dtM@ z%ALktsL6=YD@BKg8<$;~c;ST?#9I@ii7_$JEZN2MVligAVWitKqz8C=paX&O_Ar3~ zLk?!6wH#aoM#8CY+tK!&KWq$N2b8h?2pmsX;altt(X2EOJNxos}bfy?qm{@_;^cT8L)o(z*Ouu8+f&CzwA zm$V55<_cR$jz}a&CAy-vy*zh!d^Up+3Q(oeIYdv6L^r8L$xusRo7}Ss(XSJuG(7L3 zo=7V>VlATQIHm7SJA&ycn7S7)`+VV8UYA;=Y!y6ONcEEvwQlD)QWxaBcnvtb_)UOs`^kej4pd zaqw+wlNyx#?iNs)b>nR46y!SsHK8YBLjR&3i%uOPtqlm-b(rjTK>pE+o`FF~3mecY zIT!;u#`6`?0M)}#i+FEwDxcpjULXEZe0{5=Lb%mws*a)$+-ZZ|A96`Yvc*(`^8 zKREIj;+9Jqs8yI!ykF7laP=>!sLx?Xzo!e&zxScH9QyI&JnilJcd&8h%LgDQrd>2% zfYWAt2<_tU+?`fbS64TdL#xHZdiUT#sGog=_0uOy;BOE%G{S8&Xo#bLcUcWETsVi? zmtM^Cxo?(3#j5A$R&gc) zAK$kRf!Y@|bgSheqIMHTotM!kUq)|F8+6~EMorBT@iPi=HI=~PdXzH@So9X-(xF3W zJNy)mzfz0WUaiBk&peF-2lk8O3*6Cv0!t@;pPS-R#S0YTzaa{9I_~hl1xweH+!x#& kx6P@Xm3!mAVE=3V2}RE}G@+Xk{_!NAHotq% z@7wb`zwasVKLoRI(cIjuNzyPS4A}h)qz6S&N@5s>l9({dGM5=nQ9a|DwilF?c$Xw9 z3;KB1i=rsL%_$USiC!7>%b-*$G41ilDUw2=a2bup>WIW08tkc-i6uOSqzViLakCmtJNaIYQ=qdxmaIZ zgs3Q{neNb6kB*MPZm&nbPx;CThv?Xo$$p$rX;*t+79INm0ve45&+pg{9f=*QJ&Bgq zHl(Gc!B$X!Xf%odZCO`TYS_GaBbKkc2d%sw0+i7Fq@rN;O zVx7%~ai}YH2K(dadidD#YrW})8Dx`Vuh;v`538MV8r@OnSN0fVdeQX@3 zzo>`BVu9I|jt#|+;NF}Zoc#PVJYG_YfIo;SzX*{889EIsO0iQ>C=x{7Zujv9dy{uy zU=WQzU!WhE#-wX%?#NyrQjE!1ZPX*fY=%~&hWctNQ~{pEL=u)AE!}P@3VVA;XW5ta zXCK>FzMD+12Tc>m?9i!{u=u*gcR)z;y_uANXtBM3zzxBYqegF(#FDBn1L=8u09 zjmIc){Kk=rvdq+ExC22Pxj!3PNuXqE961D{IA5s%p6BuA`yWc=^RE{ZjYY3FP*Qom zNtwMOgR-bgQ2`3N4UXezNw6%8DMp++eFlGZ_k2%VTH#x zAq`zd5{;#7OR`db{~&5k)M037c!bi6iJ`?r<#GL$D3BK$$yPh4G9`Jn)@nhJEHyzB zCr@1@5|uCKS)vn52sa@Rmx<8)CB}&o*NJMvyc97x*354%C(?-5i5_Bxa1nLHLyHOg Y1A9Bp+xhuPc>n+a07*qoM6N<$f|80VP5=M^ diff --git a/data/magic.mse-game/stats/creature_class.png b/data/magic.mse-game/stats/creature_class.png deleted file mode 100644 index c8a6da57046459fb7d0dcf53850b8421bd844e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmV;R0$=@!P)zpl;Q zxt2_af9Eok2xPqsdJshXLk~fvup&VSM3j(%pn6Hc9(zfBl6pyeQ9%%bkf;!XqOhoe zC<*y6Tv3=0LZPPK&e=V;{kXf^OzObr-t#->{Lb%p@9%dGkP;`-q@@7c=~fb**hy63 z1P|8jB4YB65Mfp-h%dzIXb~ch3UI_W@xG*#SP*@QA9X}G@y5DG1`}o2F^yh+w0jXh z(83z=nz)!LpjFnqF5^ZSpSA|F@tx>f#Gl_B3!(qhQQWtiFwe@>LQM7h@jmBfYn@om z8I(a>xdOU~$3$VKfB_hL4lA|?#F!fNo%l)Q$#{-fv}Q^Wd!nC|tk+Cu+zk)Ehs43> z+b8-JcD(f9@KOlN@gR=#cvhSb<=w=_u@XF=DaWvN>1PsDbvYjuH~r8DeWX?l5i1l0em3Vh)$#qP?cgLiY&!a zPkcnGP$!9i;y*;3Bc2jJh-nz@#8w($TqjP%SE^m{ajW4^{w4lVWVyKJ)?>=fMigHg z@lEWzM2~fHyc8v?)wq#3h9`;YWM4}D=+8>Raf!XH*fxkuW|9uTFJdV>d>&F~|t966{d#j=^_cw0^$X59(Rh?TfS1mZ$Ks^RA@gCUqdm8 z)m-c;hr8@QC|8dG5)yexN;rXtxu02*3nT%G-)yL&OsE1L21rP#fjHZtlJlXoBUI5| zAfABkk3CRDvJ8;)3t}r{^YBXsNTPOuDpJFy2pJ>+aXKMIR0hB-E_%q{N&HYi9}v$J zI_RrHx*@Z*IfU1_hly_UxgfsR{|zuH#4sQt5E%#qaR?A&&n#T|I#zs@MmGf-&Hf8^ zS^ftmnHB8Q%tVlsFaxn45bp-!uRy$p0TRfVfW<-5mcv{AEmw&0f9@EyZ=A^*fk@Jz zqNWdse=|U0XF3pLPq+}LF$gosa$jUo6Zp@nFZ`d?Ol%^OYyc3yf*SM}h|{o`AO^%G zK)e%(LFEzyD4?G)Ff;yV3}82g(qj(#{#1TiKwR zJ|P+OAF2VC^*{!d0r3w8Na^c_X$&R+#pofZVK;$T4l3>s#P^`$pfX;D7{idg1j?0; oNMg&OhJjq?M2caA00*fW0Q>!tcrVBnga7~l07*qoM6N<$g6)SUeEEX>4Tx04R}tkv&MmP!xqv(@I4u4i*$~$WV2$AS&W0RV;#q(pG5I!Q`cX(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=R~IKm7b)?+q|hS93y=44-aUu+?gNBIg{fv>0#G%} zNX27fHn%DUUlD*G1Mp!?Vy2!*FJ|CbU-#5UbrouaY+z;1h}Gm~L3a8^kl4 zmd<&fILu0tLVQjPFL_LKB_ zTZy{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>I?0601I?S%dS000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0009lNklpy84;tq+9VQRc| z)q{f_Z5v2?=xwpknN*3a$4EU@+&u~ddkjeR;NRX_Mv~gaQz&uL%NG7DBo(IJsT9}z z?SeK>IQQ<(&&%B0O&J-DilV9lyaLvM z%~UESYinzgN~HwYwB}zaswyL+QJI^&DR<}RMRhp$fUv#C?cVsO*sdA-rBMHk*z0^>sR}x2wR0 zVjX2{G#bs_xqX}M?QKMaKp=q4W&@zvY?9067#|PH*WCD z>gqUiv7by?Fq?smJ4rfI}tF^*C!7DLlC-uXRl z;PQVxR~$~)zOL(H7=~oC*$+B?Hk%d0FhtjNaX4N3z?ClWEMQ(uU6V?sBE@3ygMi&u zEEc6wsmRsTH33YEcRZ1HHS6*Ab#l497=|I~boxkOI-M57FeI1Di^tp70cH^7d_3v_JiL>()Rp7{ujr(Q37*)$5c>CCX2qGBh;A;NT#gPKSm2_t|*< zoc;ZMd_Euj{r%YOcKm)nOG`^$K(_;@RfjX$Fijpl)cN(|el3;H;vmeZ#{ed~@LfC%!m=>TpIot+%HSt^8JH|LDqp-uhcU*&p>U Xl>yQk^6wdr00000NkvXXu0mjfd?A09 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/filter.png b/data/magic.mse-game/stats/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..dce61663bd2de7ce6ead32abb7f00494d2b34159 GIT binary patch literal 802 zcmV+-1Ks?IP)EX>4Tx04R}tkv&MmKpe$iQ%gmv4t5Z6$WX<>f~bh2RIvyaN?V~-2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCVt}afBE>hzEl0u6Z503ls?%w0>9UwF+Of|bE09CV$ zR6HhTbE{(T6@CODpbujbGxbDzF$2%>bq^n3@1i`*``n+SSIL_U@QK88OgAjz4dR(i zOXs{#9A+g+AwDM_H|T=Ik6f2se&bwpSm2pqBa@mZ4ik&T4wgHZl?;`5nmD4U8s!UF zmle)ioYhK=weHDZ7|LraX|B^8MjT5>APEsNYAB-u3sG7%QcR?1Kjz^da{Nhh$>b`7 zkz)Z>sE`~#_#gc4)+|g-x=EoJ5O}fej}aia3pDGt{e5iP%@e@?3|wh#f3*S3ev)2q zYmpeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008<)L_t(I%k9!JYQr!X1>mPFaS(2%bV%*p#wREU($1l~ z2T#S2H0?Qj3r}7;`UZ(dpTLkK6tvq*UzSwRA&{hh>Cy*Ug!JjbF9m?!c#Kma0fHDQ zg?<=Lo|||cNTMGGC;)_T6ad6={4ND{U6u50?f&#%3!*WG;n2!O^IT5DNV z)zz5Rnn4geyLp6RSif#IwARuX^OL6E2Yox6b!Ay{x7~?=4%S+Kv~9~g&qY87CrQ#b zO(O<6ILk5?MIi<{c)eONiXt)4!4HdtD2TW9%Vc^p-Cqi-a~ofBXM|tKKl*p50`MvR g`qOfGf9|J00017oN@w<$4gdfE07*qoM6N<$f*i0=G5`Po literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/hand.png b/data/magic.mse-game/stats/hand.png new file mode 100644 index 0000000000000000000000000000000000000000..db14befb0b65017a41f45fabf151d29428d8b905 GIT binary patch literal 905 zcmV;419tq0P)EX>4Tx04R}tkv&MmKpe$iQ>CJn4t5Z6$WWauh!$~_Di*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RReSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00Ci1L_t(I%ca!6N?bt{$MMfzFd?o4JF&YR_jnCp7ru`DHHlRg>H5cwPSsr3EfVihq$aVJzB44 z0Kelbh2Hy7iWa6atNhs6q|gr~(N*~QG84L6bvRo3Ob@#JSgP_D9#&O)j-%wP5ufGP z%%^l)1?~7U68oW;`YaY>m_6TTx0ntupTyJ`@F=;T#GB|UZGWN{bO6UV>CEX>4Tx04R}tkv&MmP!xqvQ%glEf_4z; zkfAzR5EXHhDi*;)X)CnqVDi#GXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiW)`#Xtgn0O zrn-yqEbqQQt6wRY4DgA>b4)iZ;tk@NO-tvzPaI}tNg+Nb9yjQM#E)E;U4G+Sa#-M* zVI!NKCk_*fr7o7cn3WBcc$zq>s2b%9IhPgATb$Kuowe`DUl=NAD;ciSiXed{B$0v$ z8Ff@pg@qXH8h69!2b+fX&ry93Cww3ZSuNiH2Zz8|iL%!{-hbWOJ-2^*+VlGXF|%@w@(C~{ z00006VoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru=K&H8 z78{-7567xa|FC5PABKO?(NI{Fbq$%%71IO+uNpT-bYdNNlJOOsxkR)vI+{X(H|HyVu^^?Lm)04T=TXYGmfdc7}% z5Cs6rFpPx|LUy~|587aV!Z delta 368 zcmV-$0gwKp2Z{rbBYyx1a7bBm001r{001r{0eGc9b^rhX33NqRbVF}#ZDnqB004<9 zjRpV!0VhdBK~#90V_+BsqhOc;etv!q4Gj%>M@L5|FE6isOO`D8)zQ)MKQlA)yS26T zV;&x!8^XfE=dfz#<>lp*m6cV}(b2KAu&@ZTw6v_$*Vmt`qJN@ty}rKwYg$^`e=aVr z|9pIW|AETkSW;5*XFxze8w1dEVIw1>Xe%qL4j{coK|$dx(9oAaMgNdBfH24qIXSt{ zdU|?K6crVJGBGjz2fFNsjg8HPS+izUzkdB%{r`WU(#FQdnQUxq|CyPY|BHx-`~4Wt5+SLKYy8Bn%Zz}Eq=A~akQI=FDbhS@=%}G|G86z3r=f%%;^n6R O0000*d*7QsSkE41oh^3p$O(vYOMI0~)>2Y(i;4ld5RI=Bjg;17ta zi<6>@lz3lKXc6Ou$NM<%p2K_h0YbCNRI_ISP&La)C*oo*zkezQU*W?bLI@xtF;h=w z7PIiIuY2mIx{L8F@4i2)Un!Uj@QK88OgAjz4dR(iOXs{#9A;%nAwDM_H|T=Ik6f2s ze&bwnSm2pqBb%Nl4ik%|E|$BPl?|16nmDSc8s!T)mle)ioYiWbweQJa7%FHh8Lrcc zAb}+$k%9;rb$?V)g@qXH8Yw2ybRPHck2wAmxny!xz{s(H8dOM*AN&t~&(3_t0T zAvuztmQXAL?`QN)d0^-k=v#B=);`DS1CXUzE#CkKhkw9WiL%!{-rd_hw|{%u^ZNlY zvvQ5{2{0u9000JJOGiWiSO8c6SoS}ey8r+H32;bRa{vGf6951U69E94oEQKA00(qQ zO+^Ri0TL1pAlwl^G?)S6QA2!CGC{mZxJ6kspjFjTDJ?u?Shiv?`K z9p+Mg&Y|BT_Pv3M|1kW+T7- z(cgU>6>`I)xI`|>9zc5>){qK4Mm0)*4EI>1C`m`CM^E&!BMw*#$4TnKRXnh{DEksq bsTRO5PX9s!9qId{00000NkvXXu0mjfwEbUc delta 658 zcmV;D0&V@Q2BHO!9Df1c5S0J`000SaNLh0L01m?d01m?e$8V@)00009bVXQnLvL+u zWo~o;0EsG%1^@s8KS@MERCt`VR83D4Q4}Tqnl^Qz!-tFtiAAF>H2wjXE?l{DgNl?? zOB+m0q#^N>xFR%$kQfam5)7CEQd5J|2Ekej8e5&|bUHIF9e+8#_nKDAv=b__xRZJJ zojG&gx#zwX04e{7Fx0oCRl3XWT2FLRl7lwP=qcB*X`yn zc7}D*P$QspHAz}hPB>jo(h8LLc`SN4arREf5=$n7&gBI!C++@6e+Q+k{L~U`6h46# zQ}{lORM3g_5r3|}M5)PB*b;+KKb}J_avUYejgY5(Wv6U8Im$y@Bd76kVpEFk8Qe$- zDu2KdNI}KSBl5b9#JKZ8T_6P&z6}wn?y-h$8zREP{7eJjAk$UfbRiq*gmBGX>i`N$ z&tD}j;0f>&qy-MKeuvqH#q>DYbU;sf@p7PbE$%)D(|=*Mq!7e;8}u)3JooYU8_J_+ z=AeIlj4A)oyZa;fp8Ne@Nh^aueNLmE9d=DxB_ktEolyKSS|Ow@L1L7zI-(g;(EEqE zg*m35S*#>aLs|7fT|bLog;}in51ISkfbamVG(C5PkllnF?IKfq5nAFhl-LDG%WZ6W zg+4o`Zhy7KElJBpmq|4tXdAuAzPCYLIRfqT08(S!Fq9`mjxoes4$S!4-&tx}Cd-n0 zWCHnk55%wy`Pd2K+CeP&xSx}r&ZkXxpXrx>16k-H$25W3B1d3}+dUiin(!b8>ig~PXWNx{*VVK~l8=Z+Ru1LIQA&er z+Rj@?;GGYKaXfw1sQ=uCWOpa!!Uo`G@y&3>n34@)I}rWGCui0 zVgDdUz}Jf7a@4Trk<`di=iQk{(cK2#_bbucbKd?-k5ylBi3E{@h}*D^TalO3&If6& zn~(?F*Ue>BhRw0=OUq=!E>I(bhTuEWP}XzA3Zm#OOHuW1U0~-VbVF&@aU3+e=y-LT zZSNF5j#$AXYReH{V6kEC_~pS%^>dcaL>iAnCqWc3XK}bR`(q!Tk+q&(;k3TyUhYQw z`6%A^diHvfD6>G%VPxh&-_iIR#}}gzo|2rl=%_Z)g>TNCH#aA-$J7I+T1nFk(Oofa z*a^SzaC%gc%hBOWRanN)bI^zx)Uui$QVsx~7jPK4Hn^K)GR7sNyKpUrZeme6u>I49L;y)zvd-AI*m$|>F?T3xD*uG^Mt49JFUztowKRv613IOx2q{X^R)W?~IS)We zGMzu6_Pvk}FD^`Y%2r=DVN+UDoNiNA-!PYfKp9g3HBP*;sc;+lD&({=nI&*4evQo- zV<}G$n;MtTNg9pf9TpvWS3BHsjf;1!?~$zg%+R}4m2IzSa-?;)Wqv}2GWgYL@F7*y{4eCfv;8PvD&6&4bq`+V+kuR`C94rumpibt@9_K*%q~1+ zefZ0cG{!V$OYE%MUWaS^qKQw&-FC3=<<;GRWLae0-3DV?jyeGQYva4npoJUPOtSn{ zNhe72qfQU*P2h{64mA`E^+bC@D1-Tr^O8>SzM;&b@N*aGto5s)_3Wcqyzd$kBO?kw zydNC^t`cJkD1C3vJ}taYlPCum#-Tyercr6i_8T}BdAC-Y@#MVg6A8pWFAos6#v?*!HAa@`O;Uy4oblz z&zd>@ZsfZ4osNrWUcrDZDRYOfd2&)ORvk_Da_hld38)F%+w?2Mb5-BSki;59ox|%8 zfGs>_ac)mLrw9eIPCXq{65%+gezoTAJ=tXEXv4v5Y`pS8;aOt}cc)1f22@470qrsW zR9gAYr+o+4G{b|<;68l?~#H78j2;Ady#{8V6-Bn^Q0VC=+dEY99+*}O3uLKRZQEVMeeAW}25SnWE$ zR?J?s-}Q;i8^M-C%#LhT`hA!n%gzz_QsG?Dx3@*;-sYqJNZ@qI_`xS@IMb4sfY{#i z6oloIDBWO`DFkNR-5hqo&35yn+-?PxW6$Ibc~RbX`xER;!WHq9()Ru7Xznj&sVik< zzEytHUh|+)S9xuY&Ol@}>yFG5AD`8Y6+|UDgr8@gJ9#uq9?it>YztU@g7UZreP=)S zR4h6#}XB|vnS?S>}?3LGs9BE@6Rq$c@{(WSk=c#4sBb>?%g=$ zYYa&82jy|>46 zfM-#jfx`B#zVt2nM0RYNch60W@5$8D>DDCk824DpKniFCDJezD#`Jd$R>OwAQqlIv z5Ul_ulG&Q>giaBU(aM-X);2#vP}N3Ix#srg6LrCd_TH=^wHD z5@kH^8(sg!`slk!IZd@-1>0CA>37yQ3-O$RGir@7>P?_I0W3MD{PNeIlSF!U7igFf zE_5sIkEDi(cm}tQK5~%lE6diwHz?4AWBE@Pc$VYP&YSIC)UotsHT%OhX)3p(>Ja@| zVrBAdZ~a>h5@~2Bi3ToLOY&kep`Ndzv3Q3V<1`srv@BV9=ZU}F?BtP)z9XbpugV63 zPPsplf_2&nZp*ynuN>tI3wY7%Mrz00%ryJsH=I?_-@A564b)Pm?B{Ybpu92UdW%7R z9pB%atK?53K=0K|BS@4jmb>I2m6188om!Y^AXpSEZONut>iU#cL0E@@XObb!ChS8B zrtC-><0lS>GqswD@5vPTU0g$a(q8I;o+W7ph;xSRO%ds@Q^GM3{BxC^+8Th8l=sv> zYgmA9bX1K#FRO|2NKA)tfe4Ogy%8%hG(+?YRKB? zwg^4?MFmuMXXFV={0`YFkq7R)LOqEjZ}=*_~zKC8KRu~Lo8Y5U#O9)01YQ>hF>THJ`VS-Up|H?fKx7ua9$ zUXn;|<(uYBvz4M4^+aS6_hWmZ3s8$cIL?=kc3!@bHA4;5Ks%3;`lxB3Q$0XeFyx}9 zVx_QrsXrc#ee{4d*H3Y&X=Zdgz06!U}|R1*s=2mf`-%10r-eS1ExKeraIaq<$VJiz^47KNeZl)2 z;}s}>*vn)f`8fSSn7wI?Oe2|kD|!3c5Wi`ynEGV3t0YUg)}E0sKmFD_{!=2vwPwjO z%Be8&X_pB8mj**LL7Cb|UDJ=(9Kc`Fg~K#g-9Kjcmh39GK3*qU3%v@$7bz{kHOV*) zmAq1DAt8R;0FuL+*YIvP7hy8S!Uz{&V{^_EO}G}n$OO%_4U2GhvJh~dP0qieV6tUZ zaEpZTYjKzsKSdM7&WJ{$`ty$fYP)$~ zV`R=Yzi%(oA=I0d$suBu`F5~CnaIshKCYfCk5@M`obE@#SW-i&?qIE%ZdAxl=ckNR z&w))-6YPv`^c{H|b;xofKa_h(jQV%%YL|rI6*(qZ!>?*&pQZH0-<%5!k~#RJih!be zl|KLnO_9iMqtY=a1PTUuVG41>m<0;DM>K@crAogABMcJqT>t{N$rR=hEeltaBd@Ik@7bsN-CWg6s2{|LDNu!-%%ckrEEI5{G zpO(=)$6cy5u?dcR7<9R6c*Zmpr{H`Q25Ju=lAX+!$-?{YV= z1PVpK6Ettn=mF|5aWO3ybAm2{!gJ|z^N4bB!;{KF!8TEWbCL+4_ym!;(RJ7$Q!Zs( zL0tv;G?l z#i1vQvVM2(fNdLovfum&Aje}&-F@eAev)1HAQrb=3!^moe9<@?g&3AQDLylp{so%y zg%r7_ZkR$41)(%@)jIZVhu@^ouJWvl44Uzaqo34%!$p1mmxl{9v}rmQh2$yiPPNON z=qf4Bna3Y7$V(5%x6}{W(`1j%z|}20R2F`L-6*w!^DRUhyh_KI?2c~A=)A5OxDe$e z(mLeMn;-_X14bczqnHGY@TIRM%AIz+;zV+0GW-O)U(g=;W#&Uk#DX^(Uz0R|voKW| zAJCs#7~mZ`jNR3aDW4kNGuJ$7QlF^R1KiYk$|fEqKuWWog8bzI7VNb*$w^fq>;*Op$iYgXPrxU9G``4tr<(QLiCO~`te!Z9!hs9nG5#7 zBZswWY|(&ntWH>*1{;&rGHjzRjZmTSr?^f+ZpbJB$T&U;kOT@c4|k+V7zDhY$Y6!n zv?~WwMC^#qBEFIkq(0aKvsx)vm_Q*d#sd}1w2r2^N3-#oJ=t#)`6gwZ&gY&$S1n4~ zQi}B)aCa5POHjCh%w`XQ-jy0X3=IbOVp~NSG(XU@d955RW~@^fNnPU@p&Jq#x-QLN zl_p^wrxxupZH8Q-i#{Zjaf3fkG+?qNop@I8sJhl=m|J&8P1}*O>@X~)#QyNhP)7VX zRA>G3b3R!d82ht0K-^mf&-e1g^i^$j`pw|N53(=F$3Lw%{vr=!g5HQ z`e9B($D@=)>|?VQ8J)ZAFXYx!w9q%zG-wqCWhB%*5%lX6o3xQ)@Nw4lA)YB3d(fHc8%dkYyvGmM#*>jw6B@m`)%gPD%DNg-i8VR;*`#8tl7v= zdhNLMZwI=r=ugUG(L>+kw9OiF1h&1z&L(2Ob)xd?OQ) zoO>Zp)q_E@hv{cX`~x_+B}$*hm#%VQssnQ3O3^$s-L;nzOu zPgCMo^5w)^UhG5!J#}#EFF&bdTo^CXV=ydV<898&Kh?1&k;wK`)v7ufo`#GQi%^Q! zsdtY{V$jj}*$-nJ=Ip4Z#1x(^BN2q3>WghI<3DEtzC7jz^u3=jGBVgbDeZ#1+?WvJ zR4U0!^d|*Jyn>8D4BoeS&8bb=00E-LRD|6RdgP1R$ho(|-=23bm~Q0n)YYTnh$u-6 z+HcF9#`2Vw0pFbPs5@!RBi0boinAUc`mD)D3NE*3(1M4?zmza!z8+bSi_`9-fkq~< zpqxsO*fff5U`83p2w3M4n1l@^J4rRF(%q#BEbn#wEF_hpi|`4H$(K)~r3A*YF?lJW zCoyup&hsy>Lac$GROqFapNfsZa3u!ukA~wN76p9q#)NXI_;{aig-H{o`=R0+q*^b~ zP85WlHi2p+{+U>y)&NQ5{u z*3XAyBG3qBVYUBd{S%uo_rn&|Aye_hujRx`J720CcNE8$UWT9u0aZ~D?-=q^OEgKp zErOf@UEv91bsQHR+6%{9z>+sctw)RudCpN8>D6Cl;nL5m@s$~mYKsCJO zJ)8(iwGtrYE!+(2#l#r?mh3h-rUFj)gE`snP3`gWHZQf&&NEe+>Z_=kcP2H|xXN~A z)19N~65jQXze$e&LR<3ceKz|fFFx-Qo!Q@r&#vM7NZfK`Q)2h9*85UI(!dA+qrb|- zkc>#+Q&pf#4?zlFpDc4{k=OgV7b}%q7A~L5DWch%nfW4$HDAbu%2k|xI0D|a^j(Fd z>!Pi!wR!(~cTQ2?@xGyv|&kjxDHte^OH8{`Ehes58*^giIMNL2R`8tx;5gJHsI9Kd(|q1J$D03)gW zWux;e_V%2i8A8nnf)XIN{80C|%qFb(Hdhr5y#?}AEz*jcHg^%8M7NO;0lwobb)r{t znSs+)(`GOFt?@46(aOEgwx_P^>+`yF3@#))g10_PlknlGxuWBz7S4%Kn{k8bKBK6! zuva)TY?u?8D$cr-o_vW(-ec(56gla|TZ`}w`PH}5_GaCk!#-VQT4jYka~8-ooQF}T zDuvdm6wd`n9yNUxLlHY@c!;4{z0~F@z9Q8VJe7M@q9^9Kp=9yVF=e}21Zh#B)M|pC z@S?RyvEi+pFa)o&5xqK@4d7Z&Rk`q$Q~XVm2JNQWUCp@OnFsY%`ym(GlX1%CuwuJ_ zD|e8d8AW9WJ>}zqQ=e9Y!csvVK-s2FGyoOhI@eGv_%ic8gqU9k=wl{d@Du1_byq5f%e$+ zA)cO1yC@PJPYgt+lH)?-|9m$8!69v%)%>KCKH~caI4ErA+bDUewbW@EqOjUIeNe5N zNeu;mne`%IRzR|K<85u~&$AGU!>5_ZMnAj6+{c=dsqrGf+;y85Wqt`Q7d}RnM*Kc! zccr%nh3_xU>LIe-J}{|i01w&4HnptHxuP8XSniGzJK5TJTWwKeROKQOuZ=|#h2)wX z>k!R=WFhJC%U9(6^7SP%G;B&gMQ1LQXnGRrhh^~O{39rbCRMEXJ%0IxVOo#)Pq&|i zt<{EE^x>Wsd`-2q+$J^woR9cj(8}=yx*0#AhoAmo~@R%q#cQWs-Nk| zLvWM8U2#UG?c6Cn`8Fm6aj+rOD?@fN#@!7+9<>5Sx)5-bF+V-wg8P#=r5zbNXZW># zzKkIal6kq^i_HBoCJa@~egGaQt4oOP*s{_Wmm{CgM zwQ1A5YOV7y3)dmm9ViQbJKaMvH(7@3d8Mdck@p;27#;rHE!E-DYlF0Ny;w=+6LY!r z8sh?-BtT$k*_s#wi|?fuXNuFpD(cbcn+6#TveV=62BTMH}T=K zB1ExZrDenO>f;$k?JAhU8h)Mlgp-=lV7FQi3!2j)gXR&K)i-)VI;^~<-3hm$V##dX zL+|eW$xvRVrh1yEq++&1t&!sTY^%PWm!7x8%9X`Wgd}tp`lRgQVKsq^H_+%|t-BNl zcE^;AW+aAzrz}QpkEC4gkSUJ3ravJ;FErJwqO8cyfcINB%&py%!n!pL^zh z9C~(V6YNDU>R&#MD=I!S{pQ2JS9tt!y`k^eh`$E~IQBMIX>JT9w$DGu4e^O*p>?A0 zib+$BMVA=*e1A@ji9^+5w$%(~D`pWIuGX5`MZ*+(RzNa#HlpmwEgxFuQh6gJ7*e{J z<)=%NS;veA2`uEd8Bd{h!^W%jM#-uQml$N?;J17vlD}rV$3}Y4xoC44@<3_651unu z^Qd!OP8|`No)Kma!Ve(chO$Q~w3&#szbXA}=GNL!X>PEub(A$TW+~&Tccn(h?~^o2 zNHJ_Ax#rZU7O!Z4`m=DcY|oyd7RH~96)yeROD0QGpjw{m;nTgf+=NodG{-^QE$T1N zNU!HeR;${;UJbN4`<0yg?=!GF7!;B1To%!&x7w=r`lSA+*0RY*pV3w|bnxyE?_Cm&y@lly#v($j`q9mvK`;&ni8do z&4rYd{aq{&6*Li>tiD4aVW&t9^r<6ym?swD#fq!!$(C^iqb_?|@p()ikggNH`^LG~ zlJH7HF)li_|8*j}Q)^hxg>v~<89dHRdQ#ixOI|DAT=QEF@OM3)8h)@xa8G#FYH?nt z?7VA=5`;QzVgA^h$Wz;^qG6q|c8fx(ta!Ym9A&=DM4`bDg2u>m)TN7poHKYW&#Uy4 z7wW$4GZe~AfKNB)ZS#~P=gmt$&Igd-72?|GG}$Dvd}e0=Jvm(4f*7Cj*$W38;NDA_ z{#TlI>LUB#w&3GljegDGT@qqr!(B~fs^bJk2$}0KdtULu>UR;*HzyGzFHVw2o-&R) zP`)~{VgFodHzHU$1F1lNc4eu0H2G?cD%TlN=90fNg|ky>45uizM`)7a|Bxy{$b`(` z?!VQZ>WUI}a#UQD*<}^B8}D;$8kX2R<72-isvP^mtU{vf+j?6kUp=c_^M=4%D~_T( z{Cmt?T+!%gBTM>QiIo9lO_%4m89 zNqE#!<~q-o>bwqT%eOv)w`ksfXejPDu=0PXeY0^|&kmwWdj6wm=d`0o(!0}9XQEgR zM&dIuCnj1}&Y}cko`mxuwYeB=Y{HqUarKwBj}4?HseR7qH(abzB$Z2Ey-c0$u&Suy z2Vv5{b4JtZzjb{bOdbElMv~6@SaEs+=S6_NiT)Qlf|80b%?HlWI3kPNORhv9HXAzw zJd4HP#znt2_}mmB_4Ow%H}Sx_vii%yPi{v*N?6falB4!vRCdX(ARD&TYHFog+03aV>OHC^t?~0s>&(yi3jR$Ii3O!%1H~S4?}s*1 zEv_dvbU|lynyvcH(su119>5i>J)K9{aNhsyi;4`<6?ht%l=o@Am+glj^qIdAs5<9! z8<)0$XdVs@H+}zXDL0nq9@n(|w2R$7xtZIq=*Y6i4BSVDrD2A!kGEg&F1fFt7(cz+ zz`4WGeP*PJklQKV}Jb!uOtYCwk+S$>#vb+TiceE$HH#s)G#wAHOBY7gI4d2JWBL>_S- zbV!t&u%+T3hW9$F2yp%&_>rdibfZn3)(WQdSe%7kU^AdM)+oi;XT``#e>u&JF(aFW z@Ihn|*PGVVWP)V(biuc!)N6P`DdZ!DnbWVb>JL7dJY=`#psJjV0QxgC#Rp(hx#(yF z2S41SW_vP$q(4856}%;Dwsg|%8mRH3)=`XkbWP+lI>V`^+M<*vNbFv-7pngO{hO z9;TZVn}*ICGvfVQXmLf)K}!Iv&@TP(_p@T(7U#tpeZA&Ru23MgPSKZhmp|?g6S>0g z4-M(7st8*k?6}M<5#}&1cRPpsLq!09sD!(NnS~7u2{ebjgxiZT9JF>a0O6Km49}pd zU{wbhm^EC{(+Q^SsitG$X=5Q|$si$)E9x$M4`2sFngQMIZ0((e-NhLG;0oVA{}yvI z0RN~UZNwP#RW*Pz2qzejkBg5B43cw)yYeuI;{rvUEUkpKWaa+>ao-YSutp*sgt@uh z+}ya_c)1WxFS#K?LPFeN9&R2U(7gu8*~1=b<_@xVX8aBD7ltg%*}@6#fP^FLfxj`$ z%n>d~F$RYFe&9dnXXl`*`Y(8U=YOzp&j+`=nFBY33(Re2$NhH;XQZ6#J;*;M^nbK) z*111>#jOQ%Mz}axz~o$E_DIIRLs(k;%ih7o$@Y&smKNMFTbSLws`LG*kbfIeK}l8P zUlzY9cnP<2_+xcX_P=Q&;a2}c*1yf|ch4Vp{yvd=^MB#~oAy6_|D$}brK&0{i?DF{ zJv}8^F^1pc3tJ*A;FiLF9tF%G0+tY7OOS;*#0tcB9}FNNa|je905KEdHM8IaTbV=u z2Bl>0j5M>ifc=KL2j_y{;|N*um_vEZt$y2pL3}&{f*^Aq-g^j3K^}-Dl;48ig7Q3cLLS>8jL@$g$&3BjyDLS|qXhz}|t1QLSrfA>w^+DNnCd_wpI_`p!GAXpG0ASej_%ke*mdN3#F`&j&q3ITKR^87LXy)eS}?%Y#r z_B&GV0shGEy%Cmif|(%^PC5vLtr){^2;gtae|4+gCzPcb(oEJ23A+ac^Y99TA;J(r z9SBqy%rDF*$Z_8U|4kop|38Pv|4sXM`T#}$T69IY^Zoc9e?))fls3%quhw5pTlk-3 z0s{Y}g|L~$UoJSCxxy^}%<~@WuPzH~Gy9jY`}*;Zfc>W&{(lGt2w2bpY|bYHf`EA~ zKz#fbV2~LE3<1G}toR@nyaGG|P}sktJ0q-+Ze~s}sh9UW-g9*ypntdmvi@VK*#2GL z%^LQ59quUu-Q)g^G6wE{ILrOJV*JxvQSSeZ579pge=9Nfc7Mt4OV@oRMANcq3f^<^M+4|1-L9|7SA= zv%miZ9FTrt8eC`YY;63<#p#ah|AKnYGkV>j@ zSQ{v$gqUE@i)eZP0L@WJR!T>3C^^wrCCP=h-(=JotDmk!F)rrQm~8heHWmZMeo+?p z`Usx^Bb|cvYc!iLrC;^RKNbsR;PTt9N^|gQ;R*M1Iik4cB8D zR>KX*{kU1^o;$Id|2$5=6xn)h$M}uG?xr&LgnSXFIHxN7?c0E}#UHP#QFV`pO^=ee zC6zBxq1|y~XnZIHMNeHr06`)`Gk&1T71UCN*ZZFq2PJT^UX)pE9)oEbD_#Z;OJ7d# zIi1vUql_kTeTByc%!uf4Xkd_`$-_LUz0J*ImE6R}&h2jA1ai-s8(B)8g{-H3@mdGz zA@qM@nUVm+9ZLgn75o;{tv4G@QXe+^_nq+px|IZ2%FluIua7zvTz(jU@U(^x!T{{F znFO>{Z6Cke>ERczDoRcCAR9VOWY*^t1_qw1D6Q%7CzBtpmdlY0KMS1)u=jd~zC!sn zMk+pwozvbN=)fvzGW(U4u*KdXeg+{^3CJb0*Kb3;pm0 z)vIKaE&FRh+~e^`{Q4pIcn^e6x|KFA)CFKujq+ko!km& z_{xjUgm=HZ6}GNLTjDDgaJwFm8x9yH`>U}eSgSC34LezOF0fzr_cQz`3qKMXTR`QQ z>;{<0HP;iLtx)|$1q<_qEIIS$XE}IG7o(MAxLh(##)R@qWHW>@(3b>q(AjBfc-C`sAcqIT&D=RGIUOf&L573s1vSKVDte?q5?Anw0HFBuc9hewilXY|| z{5ouwZab4G=t@?lTQJcN8ifYz3JxAmM=F6gNnC^%1U_!1U<%#tf3nEWpJyI=&yF2n zs-^o=Yb|BNiJq0S$L=mNXI_2W_ekXZ$s=Zj4bITa>WZWAh38WCN&CxmRmpA@2`WLX zDOBTl7I9uHl!}JgrP_C1yU+KH8&GB5r}>g&R1JNS96jfI_Ka?lBhUCfXL&D8J}b4~ otluMhF&-TtpbkZEpWzlQCsf@^+TT+8J|6)}a%!@b(xw6b3$YYEjQ{`u literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/land_production.png b/data/magic.mse-game/stats/land_production.png new file mode 100644 index 0000000000000000000000000000000000000000..b08c2b5a30b4809b7a755ef098a83759f3ef53c3 GIT binary patch literal 14765 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%0A1i3{WOXl#%3&r}5Q&*A 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

cRQ+W8_5 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 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/loyalty.png b/data/magic.mse-game/stats/loyalty.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a40dfd568a178c223e83dd2a15b7719dec8b58 GIT binary patch literal 1270 zcmVEX>4Tx04R}tkv&MmP!xqvQ%glEf_4z;kfAzR5EXHhDi*;)X)CnqVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOimr&?r8EJaJd5vKk1SoIg+22P%HxPXY@^ZVCWX;TXW~uKF8?;kfm8I-v9@P zz*vd0*FE0d+da2`d)o8+0Wq_3jq(XFB>(^b24YJ`L;zR-SO8e|KbgA#000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j>A24ly$)z5 zLP2(Rb|fB;*Wj=0cmN!BdOrfc4G$0ZC6h^Fu^1kY2Y~kWc3N6mzRcxvU(d|Ud=ZI6 zaJgJ~JRXLIh6sg1Twh=Jl*{D=@CopzYG`OE1_FUVB9R~z3gL7*0l2%nF~(N2%4q=P%4$sb)BW9 zB`TE)eSLj2H8pW_bHnoTGK-6goS&c5(b0j|>&4-4(An9ErfKZ$?fne!d3SfWn5HS2 zOhzUqCTewhZ;X$RKe;|RIVqV;MoiNbzuzyKrhQh+>S%j=TMiBmo(z0$WV2b>+S(Ez z2cX%|{bI35YildfXtbX8BN~n3@pveeN&tU6g#J}7mjUSS@2?9wFfahX>FFugu~@_516B`u%=HgpG|2fFgj?Zl7w+)ZE-$7u4-`qm%+bME-r4zQqevsZ@B# zsX^bq1nPF*|2gsyT6MWx0Qh`9Mn^|K3N|)2hR^3iL}+Ym{J+8BaEM_TlF#QQpU=zM z+L{D|!6*AN7!1n#`ue@sFbq*j$x{b^54;J7!;(&?#j-3pIy#b6D)k;Pl}d?enqpa& zq|<2$hrQL$!4>XOeSl$-nV^qD*_aIdU|Aje!f=YqEaft3*`d7 g1OB$>hUWtQ0|4z(v2r;pn*aa+07*qoM6N<$g8Dc?1^@s6 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/mana_value.png b/data/magic.mse-game/stats/mana_value.png new file mode 100644 index 0000000000000000000000000000000000000000..3d02f5ac105a73cf12a420f3c667f413acbc13de GIT binary patch literal 12673 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 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/noncreature_subtype.png b/data/magic.mse-game/stats/noncreature_subtype.png new file mode 100644 index 0000000000000000000000000000000000000000..a526723ca8f26ab27b14f294b1d5623ae6d7dd21 GIT binary patch literal 14475 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 literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/power.png b/data/magic.mse-game/stats/power.png index 085e438175d5f378ad4a5cda8ce68e6bb1f9671e..fc4109226b49633bae5e1d8d85625499cbf1a0bb 100644 GIT binary patch delta 937 zcmV;a16KUN1ilB5BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ%glEf_4z; zkfAzR5EXHhDi*;)X)CnqVDi#GXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiW)`#Xtgn0O zrn-yqEbqQQt6wRY4DgA>b4)iZ;tk@NO-tvzPaI}tNg+Nb9yjQM#E)E;U4G+Sa#-M* zVI!NKCk_*fr7o7cn3WBcc$zq>s2b%9IhPgATb$Kuowe`DUl=NAD;ciSiXed{B$0v$ z8Ff@pg@qXH8h69!2b+fX&ry93Cww3ZSuNiH2Zz8|iL%!{-hbWOJ-2^*+VlGXF|%@w@(C~{ z00006VoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru=K&H8 z3NuXtE%5*V0lG;(S(2zQK|;?(wiUzu>>Kfpq@(A z*lyaKdVj1p3pPRMxw?iV%}x{q6^|a2T*R-Smtc~*E20RYP}28Q3f z_vSGg{>2J#6*%pacht00L+X|i;KP`A@Q7(C)36-^oRycOO*}Vw&`>_JbStU zkkH(Nhs?TFF&xL)4}JlXx);!P9NPcD=RneBhJWLxr5aK!J(2ukK>z_v4?XOIYsHcn z`9*&~r5f_MSds;Qz(5~dE6ReA_X7-?n{~@QcsP7=W~os49Xb)s4hOqZsmi0(Rk@$b zjSLKsX#eek+?<@0VOQY{y}1>pQh-bvQP8H}zgPH97qEXftgW74VcY6m{+^I zdjPzAp?(18fgQK6G6tl2y=?&AynY4n-XaS)j8DMN!MY5b@e2M0srk2;0wpY}00000 LNkvXXu0mjf{R*pB delta 552 zcmV+@0@wY%2fzf7BYyx1a7bBm000XT000XT0n*)m`~Uy|33NqRbVF}#ZDnqB004<9 zjRpV!0o_SNK~#90t&}}TLQxdQCHh<YFB}rXgnWVyqBvwrG&t4iTnPyyKi}|Q&VT#g-@WI&|GgXl;IOTU zhI+lu4~0T~zuyl&pAX{kc(2>-?kxl@7K!vVcsZy=3E1I=dha3N^9T)uERokOU> zVEF2EI^4OSWML|mQkzVsyi_U$kH<5RP$&eK%aur{(<&Up{?t&0VUCqb<-5&hgJ3WS zu~-bk;V?uZ5r2qAqYwxLz-qOEN~L;hG#dPgP;7BSE|q@^ZEQWnm1AFdcB@$wOT;aG?>k18f#0a ztxP6!L%h{$_3U3L8g~nY0#&J0u71^4wOTEMZ31otIDcb$ptvKowQwe@BI diff --git a/data/magic.mse-game/stats/pt.png b/data/magic.mse-game/stats/pt.png deleted file mode 100644 index 59e991efa00dbb37b1894613d446b3985f32b7a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1000 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 diff --git a/data/magic.mse-game/stats/stamp.png b/data/magic.mse-game/stats/stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..8294450d434afa1dfff14631ea72155d53323cd4 GIT binary patch literal 1347 zcmV-J1-$x+P)EX>4Tx04R}tkv&MmKpe$iQ%gmv4t5Z6$WX<>f~bh2RIvyaN?V~-2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCVt}afBE>hzEl0u6Z503ls?%w0>9UwF+Of|bE09CV$ zR6HhTbE{(T6@CODpbujbGxbDzF$2%>bq^n3@1i`*``n+SSIL_U@QK88OgAjz4dR(i zOXs{#9A+g+AwDM_H|T=Ik6f2se&bwpSm2pqBa@mZ4ik&T4wgHZl?;`5nmD4U8s!UF zmle)ioYhK=weHDZ7|LraX|B^8MjT5>APEsNYAB-u3sG7%QcR?1Kjz^da{Nhh$>b`7 zkz)Z>sE`~#_#gc4)+|g-x=EoJ5O}fej}aia3pDGt{e5iP%@e@?3|wh#f3*S3ev)2q zYmpeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00SFIL_t(I%cYc0NLzUj$G^W{o{@*5JT)mqiJRv6r;cL_`Z$0b=dT0;ZvKrz-5rfs;8j*;_ zlo%ftUagY!*OQ^zR3GiYTz)h2nPGl21LzP%QGV;_==jU!avjOC{3a5K5d4bF%*;@? z+Z{0&3``WonAhvQk6)F(zP{@m$1y?(Yj1CVs3(TY^*BF2Z(LYdaGac+G{$1Fo=heK z09adF>u+ss7K`QIKp^m+BuSYIGxYcOmrIiL*x_&_PphMpGD651rIa$B=b6Ld zi2MEiM?*tHqpYN{SZa+E?xJ)Uf%x1G4_4M@II|B>^0#~h8>xIDpF0_}Gm9c?= zf$D5eH#Ro7R4N5ZDMV5HluoB#mzI{kHJi7HF^r6i=$d6g5KvcFcXM%ZF#-Ve)NpWcz%4H?L(?<>Ksue)y&$TpVsCFRJM&qn zEXyAOV0U*H0KoISZYX06e!u_ocThnP{uf12i$FEJswYp z<2W`wJEr*^t1ROVRG#U{Ohr#nayk766RT_;(m`tX}7dpwZ z{LEl5u<`M6Haa?bX_d{*&7t!Qdj3I@q=ANphIdm_Qz$MjMrUVd&g6s;)YjI%Yinz} zqpR^_V`G;3`udlGAh6!vUY6@F*zNY0!^6XtoC$vf4hDlXnN0SrtgQT@s;VcENPy>g zSgqE-T`t#Cv)TM~Vq)UUPhbD0rl#LbCew-2>3pEa|0`82OEGAJNooK9002ovPDHLk FV1g7tW_JJp literal 0 HcmV?d00001 diff --git a/data/magic.mse-game/stats/stylesheet.png b/data/magic.mse-game/stats/stylesheet.png index 141c5f3020f4f04dbf2e494278d847602dd1a87a..e18f3218fb2a1e5bd6eba3097e4e52755f88bc07 100644 GIT binary patch literal 5399 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 delta 566 zcmV-60?GZCD$WFuBYy%FNklV8~Xy8S0H4m|$Z+9~M`Nhafk)c2X<;69U zFG#3)i2VDqh2h-xt$%-hXZ9i6P^f|DB-FixSQ!s8JiK_80e@&693J zWTv3%?Sm!nKEK%a|Hq5E|CiP|{9jisH6NQ=CL&#^A*P;mT0+B1kd@&8!`;)z819_C zb^P0BmNabY8FA&P&FdC0GyMO{D)_EmSzImRsFbD;Kg<994393KWw>(S{3D=&2GJ8A zz9%Z30u5tiV1M|>12ixlNGJdO$1EcxCC>vg@YTH=AOpVx4Rpa}Acjl(mab%yX8R_> z#q?)B&^~7dhQDk~KOZu%KAXp=Vrw zR2Xy>*ciTjR%JN2>(l*tyz!Kzy#MJ7<8nq8t{^rMafZ)dnHawO6=3+r#KUmq{>2Ys zZ2t=5ClF^KilJ}ceGmNh{S(9YA5R#5{P@f83+QZCcE0Tbtl#I%>BzrDN+v;xsLe|% zSQ!5QHZNoN|HqBt-|rbf`WrB^{`)4*{YHq)$ diff --git a/data/magic.mse-game/stats/symbol.png b/data/magic.mse-game/stats/symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..c33d68ed10cd44412800993dadd7dd2aa40d8b06 GIT binary patch literal 1532 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 UTK6>sE&u=k07*qoM6N<$g4hzxIRF3v delta 679 zcmV;Y0$Bb33%&)ABYyx1a7bBm000XT000XT0n*)m`~Uy|33NqRbVF}#ZDnqB004<9 zjRpV!0$WK$K~#90os{28nqd^jEttV}H@pbOoPUCBu$wkUbRAs`8H`=*YF>*dDrHm} zC`4U2q}-LDR^SiFUmyyCf+dkL)^tWWL#)Zbrl5%KyYswkV}A~(Pdo61m*+X>^FHT1 z&p9FhqEV{X>#w8HXpFw^^Y{;1d`y}mJ?nHjZ;p%FA? zCqFeBdVYSMQmfU_>2x3%j7B30g#wuQ{eEb*TCjb+UN87?K@*9@p}}Cl)zuYRt(E|z z)Zy`Xgf(W3Mt=jBmzU6JG~coV8l5;IWmJl^z%L;NZYRC+MA>ox$yP57hSd zHmjMgEq*5tNOic7ar>CcJe0&VE*_5+DEo N002ovPDHLkV1fonNFx9M diff --git a/data/magic.mse-game/stats/card_type.png b/data/magic.mse-game/stats/type.png similarity index 100% rename from data/magic.mse-game/stats/card_type.png rename to data/magic.mse-game/stats/type.png diff --git a/data/magic.mse-game/stats/watermark.png b/data/magic.mse-game/stats/watermark.png index c6d437ca65eb8c123208690857d7c7db92950017..4fb0b4730d76e714cf5da2a33a7bc5201bd74296 100644 GIT binary patch delta 1381 zcmV-r1)BQ!2lon)BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ%glEf_4z; zkfAzR5EXHhDi*;)X)CnqVDi#GXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiW)`#Xtgn0O zrn-yqEbqQQt6wRY4DgA>b4)iZ;tk@NO-tvzPaI}tNg+Nb9yjQM#E)E;U4G+Sa#-M* zVI!NKCk_*fr7o7cn3WBcc$zq>s2b%9IhPgATb$Kuowe`DUl=NAD;ciSiXed{B$0v$ z8Ff@pg@qXH8h69!2b+fX&ry93Cww3ZSuNiH2Zz8|iL%!{-hbWOJ-2^*+VlGXF|%@w@(C~{ z00006VoOIv09XK609f`vnY#c0010qNS#tmY3ljhU3ljkVnw%H_000McNliru=K&HD z2o<_RF2eu-19M44K~y-)t&~kjV^SpwNYd?z$+Y(1o}tf{I}1SX0PCYhGTGd0)4SNo=$_ ziWT~wYSItZ+G_9;!%?g1G9A;g1@ z|G7v2xgLAYw(S_W1KdreQW97IZg90|N*7{-oeSsqZ} zLc-5M2=O43$$ToML08T z?R(p{??@?8Rh1};SXx>llgY5Xy$!(4n>Q(yN~BULhKGk)U0o%ePJbhW!1KJHf*^Pc zXmtzqcNm6u>-GAYq9_=Kfu?DkoSblce1DARdHBA6_C3q8$mO0kilQjg>-DuD2(XpC0XR4~pxtg`Sr(N_1t}$pq9BBzudi>;_x(A~^R|HxHQ;C9CC~F_e1G46 z*VoS;?Ch5u*JW>Sk01!}Jntd!Lsv+>(58V{$1r|bHwVHi@WRG6Ng z#x%_{LKH=m%VlJl9Iy7TVg{qSE00000NkvXXu0mjfL&B4q delta 995 zcmV<9104MK3it<*BYyx1a7bBm000XT000XT0n*)m`~Uy|33NqRbVF}#ZDnqB004<9 zjRpV!1C>ccK~#90WBC97KLbAe{p&Y|pI^T-{Qrkv9Wur%dF0SxhO~kl*TQ8Jr)90` zU%cYNf%bp@{)v%n={iLG3;Y-_gnm45$Vkmbz!%*Rgz$G9HoX;>6I-Ieb zT6pIDw=b4>4NXf+V`K<7KE+Vs2GLmIfodQ+E^;{2uxs&}KY#yn<1{olIGBSW%JdXN zwHJQF;Mn5~bAPGpnchQdmtZyY^7)GlcJ3~I%(*}pR$?~*PFEpWTH<`hb#~>EFF(H< zq8R$}`3nY1H%D*rBEJ(T8p?qN0K-(SHsZ8Gb@(ZUN{=&Ir4a`?QXP+>r~^h|=K3jn zPz*h=doKf{nZgu?T5lAWsn^DwRI7|Q#a8KkhNsFOD1YXDCSykHPRR_@WU%AS_ucJ`KSnh#hC`Xm=X};=!)5zWzs0}*9Sm||!xeVD**E5=(DW_k& zdWkUf$iYJlf)<+HAjL2Pcq;u)J2hvWQY#5N%~0kJH-M$w>x^Z6%4vhz_%jSOK=n01 z-<7+c5r1n6KXd2pbA+K=)^B8BaMfJTQ0oKH4D=ck&;qg6h%>=`Sw0}5C6GOsf- zwgx>61~PLP@}1AHRr|tyAXFQCM#sap!qdlFa(`lPA473LAp^IDY>tqDYTlgLvl)Qd z7-A@hQBzsPz@;u-%HychCvU7BKY#Wdh6!Cg3~cIBo$yF0bvY9>t8UA^8@Eui_Klki zH?Lk}`1|)SX5zmC%=gzXU150g@DW_h&dEWJA=L(wHi2ofZu7iJ|Ns6YuapAW{^|V( zhJUo8ykMp*2S|nhrpMNO%NLSdN`3zPnW46!o-eREYr4(E{1Z~GQAjz= zi&t*BaVqcPvwLBnpd)DL(x4O4?mVN;Ds4$e+4Y+5oc<}UU@ z*3S0wC1s^duU@?(t>g#cCyyU9TnEPNf_d{9?%%t|a1>Y@Tm$Anva1tvF#t&=*3kwW R-7NqB002ovPDHLkV1k#@*zW)U diff --git a/data/magic.mse-game/word_lists b/data/magic.mse-game/word_lists index e514bd648..8302226e5 100644 --- a/data/magic.mse-game/word_lists +++ b/data/magic.mse-game/word_lists @@ -59,290 +59,106 @@ word list: name: All Races word: name: A - word: Aetherborn - word: Alien - word: Angel - word: Antelope - word: Ape - word: Archon - word: Assembly-Worker - word: Astartes - word: Atog - word: Aurochs - word: Avatar - word: Azra + word: + script: lang_setting("word_lists_race").0 word: name: B - word: Badger - word: Balloon - word: Basilisk - word: Bat - word: Bear - word: Beast - word: Beeble - word: Beholder - word: Bird - word: Blinkmoth - word: Boar - word: Bringer - word: Brushwagg + word: + script: lang_setting("word_lists_race").1 word: name: C - word: C'tan - word: Camarid - word: Camel - word: Capybara - word: Caribou - word: Carrier - word: Cat - word: Centaur - word: Cephalid - word: Chimera - word: Cockatrice - word: Construct - word: Crab - word: Crocodile - word: Custodes - word: Cyberman - word: Cyclops + word: + script: lang_setting("word_lists_race").2 word: name: D - word: Dalek - word: Dauthi - word: Demigod - word: Demon - word: Devil - word: Dinosaur - word: Djinn - word: Dog - word: Dragon - word: Drake - word: Dreadnought - word: Drone - word: Dryad - word: Dwarf + word: + script: lang_setting("word_lists_race").3 word: name: E - word: Efreet - word: Egg - word: Eldrazi - word: Elemental - word: Elephant - word: Elf - word: Elk - word: Eye + word: + script: lang_setting("word_lists_race").4 word: name: F - word: Faerie - word: Ferret - word: Fish - word: Fox - word: Fractal - word: Frog - word: Fungus + word: + script: lang_setting("word_lists_race").5 word: name: G - word: Gargoyle - word: Germ - word: Giant - word: Gith - word: Gnoll - word: Gnome - word: Goat - word: Goblin - word: God - word: Golem - word: Gorgon - word: Graveborn - word: Gremlin - word: Griffin + word: + script: lang_setting("word_lists_race").6 word: name: H - word: Hag - word: Halfling - word: Hamster - word: Harpy - word: Hellion - word: Hippo - word: Hippogriff - word: Homarid - word: Homunculus - word: Horror - word: Horse - word: Hound - word: Human - word: Hydra - word: Hyena + word: + script: lang_setting("word_lists_race").7 word: name: I - word: Illusion - word: Imp - word: Incarnation - word: Inkling - word: Insect + word: + script: lang_setting("word_lists_race").8 word: name: J - word: Jackal - word: Jellyfish - word: Juggernaut + word: + script: lang_setting("word_lists_race").9 word: name: K - word: Kavu - word: Kirin - word: Kithkin - word: Kobold - word: Kor - word: Kraken + word: + script: lang_setting("word_lists_race").10 word: name: L - word: Lamia - word: Lammasu - word: Leech - word: Leviathan - word: Lhurgoyf - word: Licid - word: Lizard - word: Llama + word: + script: lang_setting("word_lists_race").11 word: name: M - word: Manticore - word: Masticore - word: Merfolk - word: Metathran - word: Minotaur - word: Mite - word: Mole - word: Mongoose - word: Monkey - word: Moonfolk - word: Mouse - word: Mutant - word: Myr + word: + script: lang_setting("word_lists_race").12 word: name: N - word: Nautilus - word: Necron - word: Nephilim - word: Nightmare - word: Nightstalker - word: Noggle - word: Nymph + word: + script: lang_setting("word_lists_race").13 word: name: O - word: Octopus - word: Ogre - word: Ooze - word: Orb - word: Orc - word: Orgg - word: Otter - word: Ouphe - word: Ox - word: Oyster + word: + script: lang_setting("word_lists_race").14 word: name: P - word: Pangolin - word: Pegasus - word: Pentavite - word: Pest - word: Phelddagrif - word: Phoenix - word: Phyrexian - word: Pincher - word: Plant - word: Prism + word: + script: lang_setting("word_lists_race").15 word: name: R - word: Rabbit - word: Raccoon - word: Rat - word: Reflection - word: Rhino - word: Robot + word: + script: lang_setting("word_lists_race").16 word: name: S word: name: Sa-Sl - word: Sable - word: Salamander - word: Sand - word: Saproling - word: Satyr - word: Scarecrow - word: Scorpion - word: Sculpture - word: Serpent - word: Servo - word: Shade - word: Shapeshifter - word: Shark - word: Sheep - word: Siren - word: Skeleton - word: Slith - word: Sliver - word: Slug + word: + script: lang_setting("word_lists_race").17 word: name: Sn-Sz - word: Snail - word: Snake - word: Soltari - word: Spawn - word: Specter - word: Sphinx - word: Spider - word: Spike - word: Spirit - word: Splinter - word: Sponge - word: Squid - word: Squirrel - word: Starfish - word: Surrakar + word: + script: lang_setting("word_lists_race").18 word: name: T - word: Tentacle - word: Tetravite - word: Thalakos - word: Thopter - word: Thrull - word: Tiefling - word: Time Lord - word: Treefolk - word: Trilobite - word: Triskelavite - word: Troll - word: Turtle - word: Tyranid + word: + script: lang_setting("word_lists_race").19 word: name: U - word: Unicorn + word: + script: lang_setting("word_lists_race").20 word: name: V - word: Vampire - word: Vedalken - word: Viashino - word: Volver + word: + script: lang_setting("word_lists_race").21 word: name: W - word: Wall - word: Walrus - word: Weird - word: Werewolf - word: Whale - word: Wolf - word: Wolverine - word: Wombat - word: Worm - word: Wraith - word: Wurm + word: + script: lang_setting("word_lists_race").22 word: name: Y - word: Yeti + word: + script: lang_setting("word_lists_race").23 word: name: Z - word: Zombie - word: Zubera + word: + script: lang_setting("word_lists_race").24 word list: name: class @@ -363,241 +179,74 @@ word list: name: All Classes word: name: A-C - word: Advisor - word: Ally - word: Archer - word: Archon - word: Army - word: Artificer - word: Assassin - word: Barbarian - word: Bard - word: Beast - word: Berserker - word: Carrier - word: Child - word: Citizen - word: Cleric - word: Clown - word: Coward + word: + script: lang_setting("word_lists_class").0 word: - name: D-I - word: Deserter - word: Detective - word: Doctor - word: Dreadnought - word: Drone - word: Druid - word: Egg - word: Elder - word: Employee - word: Flagbearer - word: Gamer - word: Guest - word: Horror - word: Incarnation - word: Inquisitor + name: D-K + word: + script: lang_setting("word_lists_class").1 word: - name: J-P - word: Juggernaut - word: Knight - word: Leviathan - word: Mercenary - word: Minion - word: Monger - word: Monk - word: Mutant - word: Mystic - word: Ninja - word: Noble - word: Nomad - word: Peasant - word: Performer - word: Pilot - word: Pirate - word: Praetor - word: Primarch - word: Processor + name: L-P + word: + script: lang_setting("word_lists_class").2 word: name: R-S - word: Ranger - word: Rebel - word: Reflection - word: Rigger - word: Rogue - word: Samurai - word: Scientist - word: Scion - word: Scout - word: Serf - word: Shaman - word: Skeleton - word: Soldier - word: Spawn - word: Spellshaper - word: Spirit - word: Survivor + word: + script: lang_setting("word_lists_class").3 word: name: T-Z - word: Thopter - word: Vampire - word: Warlock - word: Warrior - word: Werewolf - word: Wizard - word: Zombie + word: + script: lang_setting("word_lists_class").4 word list: name: artifact word: script: all_sub_types(match: "Artifact") line below: true - word: Attraction - word: Blood - word: Clue - word: Contraption - word: Equipment - word: Food - word: Fortification - word: Gold - word: Incubator - word: Junk - word: Map - word: Powerstone - word: Treasure - word: Vehicle + word: + script: lang_setting("word_list_artifact") 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: Cave - word: Desert - word: Gate - word: Lair - word: Locus - word: Mine - word: Power-Plant - word: Sphere - word: Tower - word: Urza's + word: + script: lang_setting("word_lists_basics").0 + word: + script: lang_setting("word_lists_basics").1 + word: + script: lang_setting("word_lists_basics").2 + word: + script: lang_setting("word_lists_basics").3 + word: + script: lang_setting("word_lists_basics").4 + word: + script: lang_setting("word_list_land") word list: name: enchantment word: script: all_sub_types(match: "Enchantment") line below: true - word: Aura - word: Background - word: Cartouche - word: Class - word: Curse - word: Role - word: Rune - word: Saga - word: Shard - word: Shrine + word: + script: lang_setting("word_list_enchantment") word list: name: spell word: script: all_sub_types(match: "Instant") + "," + all_sub_types(match: "Sorcery") line below: true - word: Adventure - word: Arcane - word: Lesson - word: Trap + word: + script: lang_setting("word_list_spell") word list: name: planeswalker word: script: all_sub_types(match: "Planeswalker") line below: true - word: Ajani - word: Aminatou - word: Angrath - word: Arlinn - word: Ashiok - word: Bahamut - word: Basri - word: Bolas - word: Calix - word: Chandra - word: Comet - word: Dack - word: Dakkon - word: Daretti - word: Davriel - word: Dihada - word: Domri - word: Dovin - word: Ellywick - word: Elminister - word: Elspeth - word: Estrid - word: Freyalise - word: Garruk - word: Gideon - word: Grist - word: Guff - word: Huatli - word: Jace - word: Jared - word: Jaya - word: Jeska - word: Kaito - word: Karn - word: Kasmina - word: Kaya - word: Kiora - word: Koth - word: Liliana - word: Lolth - word: Lukka - word: Minsc - word: Mordenkainen - word: Nahiri - word: Narset - word: Niko - word: Nissa - word: Nixilis - word: Oko - word: Quintorius - word: Ral - word: Rowan - word: Saheeli - word: Samut - word: Sarkhan - word: Serra - word: Sivitri - word: Sorin - word: Szat - word: Tamiyo - word: Tasha - word: Teferi - word: Teyo - word: Tezzeret - word: Tibalt - word: Tyvar - word: Ugin - word: Urza - word: Venser - word: Vivien - word: Vraska - word: Vronos - word: Will - word: Windgrace - word: Wrenn - word: Xenagos - word: Yanggu - word: Yanling - word: Zariel + word: + script: lang_setting("word_list_planeswalker") word: name: Last Seen on Ixalan word: Huatli @@ -713,7 +362,13 @@ word list: word list: name: battle - word: Siege + word: + script: lang_setting("word_list_battle") + +word list: + name: dungeon + word: + script: lang_setting("word_list_dungeon") word list: name: plane @@ -722,115 +377,21 @@ word list: line below: true word: name: Standard Planes - word: Alara - word: Amonkhet - word: Arcavios - word: Bloomburrow - word: Capenna - word: Dominaria - word: Duskmourn - word: Eldraine - word: Ikoria - word: Innistrad - word: Ixalan - word: Kaladesh - word: Kaldheim - word: Kamigawa - word: Lorwyn - word: Mercadia - word: Mirrodin - word: New Phyrexia - word: Rath - word: Ravnica - word: Shadowmoor - word: Tarkir - word: Theros - word: Thunder Junction - word: Ulgrotha - word: Zendikar + word: + script: lang_setting("word_lists_plane").0 word: name: Planechase Planes - word: The Abyss - word: Antausia - word: Arkhos - word: Azgol - word: Belenon - word: Bolas's Meditation Realm - word: Cridhe - word: Echoir - word: Equilor - word: Ergamon - word: Fabacin - word: Fiora - word: Gargantikar - word: Gobakhan - word: Iquatana - word: Ir - word: Karsus - word: Kephalai - word: Kinshala - word: Kolbahan - word: Kylem - word: Kyneth - word: Luvion - word: Moag - word: Mongseng - word: Muraganda - word: Phyrexia - word: Pyrulea - word: Rabiah - word: Regatha - word: Segovia - word: Serra's Realm - word: Shandalar - word: Shenmeng - word: Tavelia - word: Valla - word: Vryn - word: Wildfire - word: Xerex - word: Zhalfir + word: + script: lang_setting("word_lists_plane").1 word: name: Other Modern Planes - word: Alkabah - word: Aranzhur - word: Diraden - word: Kodisha - word: Metal Island - word: Skalla - word: Tavelia - word: Tolvada + word: + script: lang_setting("word_lists_plane").2 word: name: Very Old Planes - word: Azoria - word: Cabralin - word: Celesta - word: Gastal - word: Ilcae - word: Mirrankkar - word: Nether Void - word: Obsidias - word: Torwynn - word: Vatraquaz + word: + script: lang_setting("word_lists_plane").3 word: name: Dr Who Planes - word: Alfava Metraxis - word: Androzani Minor - word: Apalapucia - word: The Dalek Asylum - word: Darillium - word: Earth - word: Gallifrey - word: Horsehead Nebula - word: Kandoka - word: The Library - word: Mars - word: Moon - word: Necros - word: New Earth - word: Outside Mutter's Spiral - word: Skaro - word: Spacecraft - word: Time - word: Trenzalore - word: Unknown Planet + word: + script: lang_setting("word_lists_plane").4