Initial commit

This commit is contained in:
CajunAvenger
2021-07-09 02:07:58 -05:00
parent 44a72dbc6f
commit eda330eee8
22968 changed files with 376881 additions and 0 deletions

View File

@@ -0,0 +1,189 @@
############################################################## Auto replace
auto replace:
match: (C)
replace: ©
auto replace:
match: AE
replace: Æ
whole word: false
auto replace:
match: TM
replace: ™
whole word: false
auto replace:
match: --
replace: —
auto replace:
# note the spaces
match:
-
replace:
auto replace:
match: CIP
replace: comes into play
auto replace:
match: AAA
replace: as an additional cost to play
auto replace:
match: @
replace: LEGENDNAME
auto replace:
match: ~
replace: CARDNAME
auto replace:
match: '
replace:
auto replace:
match: Land
replace: Resource
auto replace:
match: land
replace: resource
auto replace:
match: Artifact
replace: Device
auto replace:
match: artifact
replace: device
auto replace:
match: Plains
replace: Lux
auto replace:
match: Island
replace: Gelidine
auto replace:
match: Swamp
replace: Necroleum
auto replace:
match: Mountain
replace: Carbos
auto replace:
match: Forest
replace: Biolute
auto replace:
match: attack
replace: assault
auto replace:
match: combat
replace: assault
auto replace:
match: deal
replace: inflict
whole word: false
auto replace:
match: Creature
replace: Unit
auto replace:
match: creature
replace: unit
auto replace:
match: Instant
replace: Tactic
auto replace:
match: instant
replace: tactic
auto replace:
match: Sorcery
replace: strategy
auto replace:
match: sorcery
replace: strategy
auto replace:
match: Counter
replace: Disrupt
auto replace:
match: counter
replace: disrupt
auto replace:
match: spell
replace: action
auto replace:
match: library
replace: archive
auto replace:
match: Graveyard
replace: Void
auto replace:
match: graveyard
replace: void
auto replace:
match: Control
replace: Command
auto replace:
match: life
replace: control
auto replace:
match: mana
replace: psi
auto replace:
match: destroyed
replace: annihilated
auto replace:
match: destroy
replace: annihilate
auto replace:
match: Enchantment
replace: Augment
auto replace:
match: enchantment
replace: augment
auto replace:
match: enchanted
replace: modified
auto replace:
match: enchanting
replace: modifying
auto replace:
match: Aura
replace: Graft
auto replace:
match: blocker
replace: interceptor
auto replace:
match: block
replace: intercept
whole word: false
auto replace:
match: sacrificed
replace: forfeited
auto replace:
match: Sacrifice
replace: Forfeit
auto replace:
match: sacrifice
replace: forfeit
auto replace:
match: white
replace: crystal
auto replace:
match: blue
replace: cryo
auto replace:
match: black
replace: shadow
auto replace:
match: red
replace: pyre
auto replace:
match: green
replace: xeno
auto replace:
match: regenerated
replace: shielded
auto replace:
match: pool
replace: cache
auto replace:
match: Planeswalker
replace: Warlord
auto replace:
match: planeswalker
replace: warlord
auto replace:
match: colored
replace: aligned
whole word: false
auto replace:
match: color
replace: alignment

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,249 @@
############################################################## Card fields
############################# Automatic fields
card field:
type: text
name: full name
save value: false
show statistics: false
editable: false
card list visible: true
card list name: Name
card list column: 1
card list width: 150
description: The name of the card
script: card.name
############################# Background stuff
card field:
type: color
name: border color
default: set.border_color
choice:
name: black
color: rgb(0,0,0)
choice:
name: white
color: rgb(255,255,255)
choice:
name: silver
color: rgb(128,128,128)
choice:
name: gold
color: rgb(200,180,0)
show statistics: false
description: The border of the card; can be any solid color.
card field:
type: multiple choice
name: card color
empty choice: colorless
choice: crystal
choice: cryo
choice: shadow
choice: pyre
choice:
name: xeno
line below: true
choice: device
choice: resource
choice: multicolor
choice:
name: hybrid
enabled: { card_color_color_count(card.card_color) >= 2 }
line below: true
choice:
name: horizontal
enabled: { card_color_color_count(card.card_color) >= 2 }
type: radio
choice:
name: vertical
enabled: { card_color_color_count(card.card_color) >= 2 }
type: radio
choice:
name: radial
enabled: { card_color_color_count(card.card_color) >= 2 }
type: radio
choice:
name: overlay
enabled: { card_color_color_count(card.card_color) == 2 and chosen(choice:"hybrid",card.card_color) }
type: radio
choice:
name: reversed
enabled: { card_color_color_count(card.card_color) >= 2 and not chosen(choice:"overlay",card.card_color) }
script: card_color_filter(value)
default: card_color(casting_cost: card.casting_cost, rules_text: card.rule_text, type: card.super_type, watermark: card.watermark, card_name: card.name)
show statistics: false
description: The frame of the card, used to indicate card color.
############################# Name line
card field:
type: text
name: name
card list visible: false
identifying: true
show statistics: false
description: The name of the card
card field:
type: text
name: casting cost
icon: stats/casting_cost.png
position hint: 1
script: psi_filter(value)
card list visible: true
card list column: 2
card list alignment: right
card list width: 50
card list name: CC
description: The casting cost of the card
############################# Image
card field:
type: image
name: image
show statistics: false
description: The image of the card
############################# Card type
card field:
type: text
name: super type
icon: stats/card_type.png
position hint: 30
editable: false
script: super_type_filter(value)
card field:
type: text
name: sub type
icon: stats/creature_type.png
position hint: 31
script: sub_type_filter(value, type:card.super_type)
editable: false
card field:
type: text
name: type
show statistics: false
save value: false
script:
# Either just supertype, or subtype - supertype
combined_editor(
field1: card.super_type,
separator: " — ",
field2: card.sub_type,
soft_before_empty: true,
hide_when_empty: true
)
card list visible: true
card list column:4
description: The type of this card, type - to go the sub type
card field:
type: choice
name: rarity
icon: stats/rarity.png
position hint: 100
choice: basic resource
choice: common
choice: uncommon
choice: rare
choice: mythic rare
choice: special
initial: common
card list visible: true
card list column: 6
description: The rarity of the card, to edit the symbol switch to the 'set info' tab
choice colors:
basic resource: rgb(109,62,39)
common: rgb(33,33,33)
uncommon: rgb(224,224,224)
mythic rare: rgb(202, 49, 35)
rare: rgb(255,207,52)
special: rgb(190,0,255)
############################# Text box
card field:
type: text
name: rule text
script: text_filter(input: value, card_name: card.name)
show statistics: false
multi line: true
description: The rules text for the card
card field:
type: text
name: flavor text
script: flavor_text_filter(value)
show statistics: false
multi line: true
description: The flavor text for the card
card field:
type: text
name: text
multi line: true
save value: false
show statistics: false
script:
combined_editor(field1: card.rule_text, separator: "<line>\n</line>", field2: card.flavor_text)
description: The rules and flavor text for the card; use up and down arrows to switch
############################# Loyalty
############################# PT
card field:
type: text
name: power
icon: stats/power.png
show statistics: false
script: type_over_pt(value)
description: The power of a unit
card field:
type: text
name: toughness
show statistics: false
icon: stats/toughness.png
description: The toughness of a unit
card field:
type: text
name: pt
save value: false
script:
combined_editor(
field1: card.power,
separator: "/",
field2: card.toughness,
soft_before_empty: true,
hide_when_empty: true
)
card list visible: true
card list column: 5
card list width: 50
card list name: P/T
description: Power/toughness of a unit
show statistics: false
############################# Card sorting / numbering
card field:
type: text
name: card number
save value: false
script: card_number() + "/" + card_count()
sort script: rarity_sort() + card.card_number
card list visible: true
card list column: 10
card list width: 50
card list name: #
card list alignment: right
editable: false
show statistics: false
############################# Copyright stuff
card field:
type: text
name: illustrator
icon: stats/illustrator.png
position hint: 210
default: set.artist
description: Illustrator of this card, the default value can be changed on the 'set info' tab
card field:
type: text
name: copyright
default: set.copyright
show statistics: false
card field:
type: text
name: copyright line
save value: false
show statistics: false
script:
if set.automatic_card_numbers then
combined_editor(field1: card.copyright, separator: " ", field2: card.card_number)
else
forward_editor(field: card.copyright)
description: Copyright of this card and cardnumber, the default value can be changed on the 'set info' tab

47
data/space.mse-game/game Normal file
View File

@@ -0,0 +1,47 @@
mse version: 2.0.0
short name: Space
full name: Space the Convergence
installer group: Space/Game Files
icon: card-back.png
position hint: 11
version: 2014-01-25
depends on:
package: space-blends.mse-include
version: 2007-12-19
#By: Pichoro
############################################################## The script
init script: include file: script
############################################################## Lots of lists
include file: card_fields
include file: set_fields
include file: statistics
include file: packs
include file: keywords
include file: word_lists
include file: auto_replace
############################################################## Other stuff
card list color script:
input := card.card_color
if input == "crystal" then rgb(156,130,90)
else if input == "cryo" then rgb(0,64,168)
else if input == "shadow" then rgb(0,0,0)
else if input == "pyre" then rgb(168,0,0)
else if input == "xeno" then rgb(0,168,0)
else (
device := chosen(choice:"device")
resource := chosen(choice:"resource")
multi := chosen(choice:"multicolor")
hybrid := chosen(choice:"hybrid")
if resource then rgb(109,62,39) # resource
else if multi and input != "device, multicolor" then rgb(130,110,0) # multicolor
else if hybrid then rgb(115,0,160) # hybrid
else if device then rgb(72,90,100) # device
else rgb(119,83,83) # colorless
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

1263
data/space.mse-game/keywords Normal file

File diff suppressed because it is too large Load Diff

59
data/space.mse-game/packs Normal file
View File

@@ -0,0 +1,59 @@
############################################################## Card pack items
pack type:
name: common
filter: card.rarity == "common"
pack type:
name: uncommon
filter: card.rarity == "uncommon"
pack type:
name: rare
filter: card.rarity == "rare"
pack type:
name: special
filter: card.rarity == "special"
pack type:
name: basic land
filter: card.rarity == "basic land"
select: equal
############################################################## Card packs
pack type:
name: tournament pack
item:
name: rare
amount: 3
item:
name: uncommon
amount: 9
item:
name: common
amount: 33
item:
name: basic land
amount: 30
pack type:
name: booster pack
item:
name: rare
amount: 1
item:
name: uncommon
amount: 3
item:
name: common
amount: 11
pack type:
name: additional common
item:
name: common
pack type:
name: additional uncommon
item:
name: uncommon
pack type:
name: additional rare
item:
name: rare
pack type:
name: additional special
item:
name: special

472
data/space.mse-game/script Normal file
View File

@@ -0,0 +1,472 @@
############################################################## Sorting mana symbols
# correctly sort a psi symbol (no guild psi)
psi_sort := sort_text@(order: "XYZ[0123456789](WUBRG)")
# correctly sort guild psi
psi_sort_guild := sort_text@(order: "[XYZ01234567890WUBRG/]") +
replace@(
# No lookbehind :(
#match: "(?<!/)(./.|././.|./././.|.[|])(?!/)",
match: "./.|././.|./././.|.[|]",
in_context: "(^|[^/])<match>($|[^/])",
replace: {sort_text(order:"in_place((WUBRG)")}
)
psi_has_guild := match@(match: "[/]") # Is there guild psi in the input?
# A psi cost can contain both regular and hybrid psi
psi_filter := to_upper + {
if psi_has_guild() then psi_sort_guild()
else psi_sort()
}
# Like psi filter, only also allow tap symbols:
tap_filter := sort_text@(order: "<TQ>")
psi_filter_t := replace@( # Remove [] used for forcing psi symbols
match: "[\\[\\]]",
replace: ""
) + { tap_filter() + psi_filter() }
############################################################## Determine card color
# Names of colors
color_name := {
if input = "W" then "crystal"
else if input = "U" then "cryo"
else if input = "B" then "shadow"
else if input = "R" then "pyre"
else if input = "G" then "xeno"
else ""
}
color_names_1 := { color_name(colors.0) }
color_names_2 := { color_name(colors.0) + ", " + color_name(colors.1) }
color_names_3 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) }
color_names_4 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) + ", " + color_name(colors.3) }
color_names_5 := { color_name(colors.0) + ", " + color_name(colors.1) + ", " + color_name(colors.2) + ", " + color_name(colors.3) + ", " + color_name(colors.4) }
# color based on mana cost, input = a psi cost
color_filter := sort_text@(order: "<WUBRG>")
color_filterH := sort_text@(order: "</>")
psi_to_color := {
count := number_of_items(in: colors)
if hybrid == "" then
# not a hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if set.set_info.use_gradient_multicolor == "no" then "multicolor" # stop here
else if count == 2 then color_names_2() + ", multicolor"
else if set.set_info.use_gradient_multicolor != "yes" then "multicolor" # stop here
else if count == 3 then color_names_3() + ", multicolor"
else if count == 4 then color_names_4() + ", multicolor"
else if count == 5 then color_names_5() + ", multicolor"
else "multicolor"
else
# hybrid
if count == 0 then "colorless"
else if count == 1 then color_names_1()
else if count == 2 then color_names_2() + ", hybrid"
else if count == 3 then color_names_3() + ", hybrid"
else "multicolor"
}
# color based on resource text box, input = textbox contents
color_text_filter :=
# remove activation costs
replace@(
match: "<sym[^>]*>[^<]+</sym[^>]*>"
in_context: "(?ix) (\\n|^)[^:]*<match>(,|:) | (pays?|additional|costs?)[ ]<match>",
replace: ""
) +
# keep only psi
filter_text@(match: "<sym[^>]*>([^<]+)") + color_filter;
# get the resource frame for a "WUBRG"-style input.
resource_multicolor := {
count := number_of_items(in: colors)
if count == 0 then "resource"
else if count == 1 then color_names_1() + ", resource"
else if count == 2 then color_names_2() + ", resource"
else if count == 3 then color_names_3() + ", resource"
else "resource, multicolor"
}
# Look for a CDA that defines colors
text_to_color := {
# Note: running filter_text is quite slow, do a quick 'contains' check first
if contains(match: card_name) then (
text := filter_text(match: regex_escape(card_name)+"(</[-a-z]+>)? is (colorless|all colors|((cryo|crystal|xeno|pyre|shadow)((,|,? and) (cryo|crystal|xeno|pyre|shadow))*))\\.")
if text != "" then (
if contains(text, match: "all colors") then (
colors := "WUBRG"
if resource = "resource" then resource_multicolor()
else psi_to_color(hybrid: "")
) else (
colors := ""
if contains(text, match: "crystal") then colors := colors + "W"
if contains(text, match: "cryo") then colors := colors + "U"
if contains(text, match: "shadow") then colors := colors + "B"
if contains(text, match: "pyre") then colors := colors + "R"
if contains(text, match: "xeno") then colors := colors + "G"
if resource = "resource" then resource_multicolor()
else psi_to_color(hybrid: "")
)
)
)
}
# The color of a card
is_unit := match@(match: "(?i)Unit")
is_tribal := match@(match: "(?i)Tribal")
is_device := match@(match: "(?i)Device")
is_resource := match@(match: "(?i)Resource")
is_augment := match@(match: "(?i)Augment")
is_action := match@(match: "(?i)Tactic|Strategy")
card_color := {
# usually the color of psi
text_color := text_to_color(rules_text, resource: is_resource(type));
if text_color == "" then (
psi_color := psi_to_color(colors: color_filter(casting_cost), hybrid: color_filterH(casting_cost))
if psi_color == "colorless" and is_resource (type) then resource_multicolor(colors:color_text_filter(input: card.rule_text))
else if psi_color == "colorless" and is_device(type) then "device"
else psi_color
)
else text_color
};
# Number of colors in a card_color
card_color_color_count := count_chosen@(choices: "crystal,cryo,shadow,pyre,xeno,device")
# Clean up color field
card_color_filter := {
colors := card_color_color_count()
if colors > 2 then
input := remove_choice(choice: "overlay")
if colors > 1 then (
input := require_choice(choices: "multicolor, hybrid, resource, device")
input := exclusive_choice(choices: "multicolor, hybrid")
input := require_exclusive_choice(choices: "horizontal, vertical, radial, overlay")
) else
input := remove_choice(choices: "radial, horizontal, vertical, overlay, hybrid, reversed")
if chosen(choice:"overlay") then
input := remove_choice(choice: "reversed")
input
}
# needed by all style files anyway
include file: /space-blends.mse-include/new-blends
############################################################## Card number
# Index for sorting, white cards are first, so white->A, blue->B, .. ,
# The code consists of 4 parts:
# Process the name for sorting rules
sort_name :=
# Remove "The", "A", and "And" at the beginning
replace@(match: "^(The|An?) ", replace: "") +
# Remove commas and apostrophes
replace@(match: "(,|'|)", replace: "") +
# Remove bold and italic tags
replace@(match: "(<b>|<i>|</b>|</i>)", replace: "") +
# Make lowercase
to_lower
is_multicolor := { chosen(choice: "multicolor") and input != "device, multicolor" }
is_null_cost := { input == "" or input == "0" }
is_hybrid_cost := { contains(card.casting_cost, match: "W/") or contains(card.casting_cost, match: "U/") or contains(card.casting_cost, match: "B/") or contains(card.casting_cost, match: "R/") or contains(card.casting_cost, match: "G/") }
basic_resource_sort := {
if contains(card.name, match:"Lux") then "LB" # Plains
else if contains(card.name, match:"Gelidine") then "LC" # Islands
else if contains(card.name, match:"Necroleum") then "LD" # Swamps
else if contains(card.name, match:"Carbos") then "LE" # Mountains
else if contains(card.name, match:"Biolute") then "LF" # Forests
else "LA" # other basic lands
}
color_of_card := {
card_color := card.card_color
casting_cost := card.casting_cost
if chosen(choice: "resource", card_color) then (
if card.rarity != "basic resource" then "K" # Nonbasic Land
else basic_resource_sort()
) else if is_null_cost(casting_cost) then (
if chosen(choice: "hybrid", card_color) then "G" # Hybrids
else if is_multicolor(card_color) then "F" # Multicolor
else if chosen(choice:"crystal", card_color) then "A" # White
else if chosen(choice:"cryo", card_color) then "B" # Blue
else if chosen(choice:"shadow", card_color) then "C" # Black
else if chosen(choice:"pyre", card_color) then "D" # Red
else if chosen(choice:"xeno", card_color) then "E" # Green
else "I" # Colorless / Artifact
) else (
# use the casting cost
colors := sort_text(casting_cost, order: "<WUBRG>")
if colors == "" then "I" # Colorless / Artifact
else if colors == "W" then "A" # White
else if colors == "U" then "B" # Blue
else if colors == "B" then "C" # Black
else if colors == "R" then "D" # Red
else if colors == "G" then "E" # Green
else if is_hybrid_cost() then "G" #Hybrid
else if contains(casting_cost, match:"/") and contains(card_color, match:"device") then "I" # Colorless/Artifact
else "F" # Multicolor
)
}
rarity_sort := {
if set.sort_special_rarity == "with the rest" or card.rarity != "special" then " "
else "S"
}
set_filter := {
# TODO: what about rulestips?
if set.sort_special_rarity != "separate numbering" then
nil
else if card.rarity == "special" then
{ card.rarity == "special" }
else
{ card.rarity != "special" }
}
card_number := {
position (
of: card
in: set
order_by: { rarity_sort() + color_of_card() + sort_name(card.name) }
filter: set_filter()
) + 1
}
card_count := {
number_of_items(in: set, filter: set_filter())
}
############################################################## Utilities for keywords
# replaces — correctly
add := "" # default is nothing
separate_words := remove_tags + trim + replace@(match:" ", replace: {spacer})
for_psi_costs := format_cost := {
if input.separator_before == "—" and contains(input.param, match: " ") then (
if contains(input.param, match:",") then (
if match(match: "^[TQXYZWUBRG0-9/|]+,", input.param) then
"{add}<param-cost>{combined_cost(input.param)}</param-cost>"
else "<param-cost>{combined_cost(input.param)}</param-cost>"
) else
"<param-cost>{alternative_cost(input.param)}</param-cost>"
) else
"{add}<param-psi>{input.param}</param-psi>"
}
alternative_cost := replace@(match:"^[A-Z]", replace: { to_lower() })
combined_cost := replace@(match:", [A-Z]", replace: { to_lower() })+
replace@(match:",", replace:" and")+
replace@(match:"^[TQXYZWUBRG0-9/|]", in_context: "(^|[[:space:]])<match>", replace: "<sym-auto>&</sym-auto>")+
replace@(match:"^[A-Z]", replace: { to_lower() })
long_dash := replace@(match:"-", replace:"—")
# Utilities for keywords
has_cc := { card.casting_cost != "" }
has_pt := { card.pt != "" }
contains_target := match@(match:"(?i)([^a-z]|^)target([^a-z]|$)")
is_targeted := { contains_target(card.rule_text) }
############################################################## The text box
# Filters for the text box
# context in which mana symbols are found
psi_context :=
"(?ix) # case insensitive, ignore whitespace
(^|[[:space:]\"(“']) # start of a word
( <match>: # G: something
| <match>, # G, tap: something
| <match>[ ]can[ ]be[ ]pay
| (pays?|additional|costs?|the # pay X. creatures cost 1 less. pay an additional G.
|adds?|pay(ed)?[ ](with|using)
)
([ ]either)? # pay either X or Y
([ ]<sym[^>]*>[TQXYZWUBRG0-9/|]+</sym[^>]*>,)* # pay X, Y or Z
([ ]<sym[^>]*>[STQXYZWUBRG0-9/|]+</sym[^>]*>[ ](and|or|and/or))* # pay X or Y
[ ]<match>
([,.)]|$ # (end of word)
|[ ][^ .,]*$ # still typing...
|[ ]( or | and | in | less | more | to ) # or next word is ...
)
)
| <param-psi><match></param-psi> # keyword argument that is declared as mana
| <param-cost>[ ]*<match></param-cost> # keyword argument that is declared as cost
| <param-cost><match>, # keyword argument that is declared as cost
";
# truncates the name of legends
legend_filter := replace@(match:"(, | of | the ).*", replace: "" )
# the rule text filter
# - adds psi symbols
# - makes text in parentheses italic
text_filter :=
# step 1 : remove all automatic tags
remove_tag@(tag: "<sym-auto>") +
remove_tag@(tag: "<i-auto>") +
remove_tag@(tag: "<nospellcheck") +
# step 2 : reminder text for keywords
expand_keywords@(
condition: {
correct_case or (mode != "pseudo" and not used_placeholders)
}
default_expand: {
chosen(choice:if correct_case then mode else "lower case", set.automatic_reminder_text)
},
combine: {
keyword := "<nospellcheck>{keyword}</nospellcheck>"
reminder := process_english_hints(reminder)
if mode == "pseudo" then "<i-auto>{keyword}</i-auto>"
else keyword + if expand then "<atom-reminder-{mode}> ({reminder})</atom-reminder-{mode}>"
}) +
# step 2b : move action keywords' reminder text to the end of the line
replace@(
match: "(<atom-reminder-action>(?:(?!<kw-).)*</atom-reminder-action></kw[^>]*>)(((?!<atom-reminder| ?<kw-)[^\n(])+)",
replace: "\\2\\1"
) +
# step 2c : remove duplicate reminder text
replace@(
match: "(<atom-reminder-[^>]*>[^)]+[)]</atom-reminder-[^>]*>)([^\n]+)\\1"
replace: "\\2\\1"
) +
# step 3a : expand shortcut words ~ and CARDNAME
replace@(
match: "CARDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-cardname></atom-cardname>"
) +
# step 3b : expand shortcut words ` and shortened LEGENDNAME
replace@(
match: "LEGENDNAME",
in_context: "(^|[[:space:]]|\\()<match>", # TODO: Allow any punctuation before
replace: "<atom-legname></atom-legname>"
) +
# step 3c : fill in atom fields
tag_contents@(
tag: "<atom-cardname>",
contents: { if card_name=="" then "CARDNAME" else card_name }
) +
tag_contents@(
tag: "<atom-legname>",
contents: { if card_name=="" then "LEGENDNAME" else legend_filter(card_name) }
) +
# step 4 : explict non psi symbols
replace@(
match: "\\][TQXYZWUBRG0-9/|]+\\[",
replace: {"<nosym>" + psi_filter_t() + "</nosym>"} ) +
# step 5 : add psia & tap symbols
replace@(
match: "[TQXYZWUBRG0-9/|]+",
in_context: psi_context,
replace: {"<sym-auto>" + psi_filter_t() + "</sym-auto>"} ) +
# step 5b : add explict psi symbols
replace@(
match: "\\[[TQXYZWUBRG0-9/|]+\\]",
replace: {"<sym>" + psi_filter_t() + "</sym>"} ) +
# step 7 : italic reminder text
replace@(
match: "[(]([^)\n]|[(][^)\n]*[)])*[)]?",
in_context: "(^|[[:space:]])<match>|<atom-keyword><match></",
replace: "<i-auto>&</i-auto>") +
# step 8 : automatic capitalization
replace@(
match: "[a-z]",
in_context: "[ ]*: <match>|—<match>| — <match>",
replace: to_upper) +
curly_quotes
############################################################## Other boxes
# the flavor text filter
# - makes all text italic
flavor_text_filter :=
# step 1 : remove italic tags
remove_tag@(tag: "<i-flavor>") +
# step 2 : surround by <i> tags
{ "<i-flavor>" + input + "</i-flavor>" } +
# curly quotes
curly_quotes
# Move the cursor past the separator in the p/t and type boxes
type_over_pt := replace@(match:"/$", replace:"")
type_over_type := replace@(match:" ?-$", replace:"")
super_type_filter :=
remove_tag@(tag: "<word-list-") +
type_over_type +
{ "<word-list-type>{input}</word-list-type>" }
space_to_wltags := replace@(match:"( +|<soft> </soft>)",
replace:{"</word-list-{list_type}>{_1}<word-list-{list_type}>"})
sub_type_filter :=
remove_tag@(tag: "<word-list-") +
replace@(match: " </soft>$", replace: "") + # remove trailing soft space
remove_tag@(tag: "<soft") +
{ list_type := if is_unit(type) then "class"
else if is_resource(type) then "resource"
else if is_device(type) then "device"
else if is_augment(type) then "augment"
else if is_action(type) then "action"
if is_unit(type) or is_tribal(type) then (
first := "<word-list-race>{ only_first(input) }</word-list-race>"
next := only_next(input)
if input == "" then list_type := "" # only edit the race
else if next == "" then first := first + "<soft> </soft>"
else first := first + " "
input := next
) else (
first := ""
)
if list_type != "" then (
if input != "" then input := input + "<soft> </soft>" # Add a new box at the end
first + "<word-list-{list_type}>{ space_to_wltags(input) }</word-list-{list_type}>"
) else first + input
}
# all sub types, for word list
space_to_comma := replace@(match:" ", replace:",")
only_first := replace@(match:" .*", replace:"")
only_next := replace@(match:"^[^ ]* ?", replace:"")
all_sub_types := {
for each card in set do
if contains(card.super_type) then "," + space_to_comma(to_text(card.sub_type))
}
all_races := {
for each card in set do
if is_unit(card.super_type) or is_tribal(card.super_type) then
"," + only_first(to_text(card.sub_type))
}
all_classes := {
for each card in set do
if contains(card.super_type, match:"Unit") then
"," + space_to_comma(only_next(to_text(card.sub_type)))
}
colorless_color := {
if card.card_color=="crystal" then "w"
else if card.card_color=="cryo" then "u"
else if card.card_color=="shadow" then "b"
else if card.card_color=="pyre" then "r"
else if card.card_color=="xeno" then "g"
else "c"
}
############################################################## Statistics utilities
# Converted psi cost
is_half_psi := match@(match: "1/2|[|][WUBRG]")
is_colored_psi := match@(match: "[WUBRG]")
only_numbers := filter_text@(match: "^[0123456789]+")
cmc_split := break_text@(match: "(?ix) 1/2 | [|][WUBRG] | [0-9]+(?!/[WUBRGTQ2]) | [WUBRG0-9](/[WUBRG])\{0,4} ")
cmc := {to_number(
for each sym in cmc_split() do (
numbers := only_numbers(sym)
if is_half_psi(sym) then 0.5
else if numbers != "" then max(1, to_int(numbers))
else 1 # all other symbols are 1
))
}
colored_psi := {to_number(
for each sym in cmc_split() do (
numbers := only_numbers(sym)
if is_colored_psi(sym) then
if is_half_psi(sym) then 0.5 else 1
else 0
))
}
primary_card_color := {
device := chosen(choice:"device")
resource := chosen(choice:"resource")
multi := chosen(choice:"multicolor")
hybrid := chosen(choice:"hybrid")
if resource then "resource"
else if multi and input != "device, multicolor" then "multicolor"
else if hybrid then "hybrid"
else if device then "device"
else input
}
word_count := break_text@(match:"[^[:space:]]+") + length

View File

@@ -0,0 +1,142 @@
############################################################## Set fields
set field:
type: info
name: Set Information
set field:
type: text
name: title
identifying: true
set field:
type: text
name: description
multi line: true
set field:
type: text
name: artist
set field:
type: text
name: copyright
set field:
type: symbol
name: symbol
description: The symbol for this set, double click to edit
set field:
type: info
name: Defaults and Automation
set field:
type: color
name: border color
description: The default border color for cards
choice:
name: black
color: rgb(0,0,0)
choice:
name: white
color: rgb(255,255,255)
choice:
name: silver
color: rgb(128,128,128)
choice:
name: gold
color: rgb(200,180,0)
set field:
type: multiple choice
name: automatic reminder text
choice: old
choice: core
choice: expert
choice: pseudo
choice: action
choice: custom
choice: lower case
initial: old, core, expert, pseudo, action, custom
# Convert from older mse versions
script:
if value = "yes" then "old, core, expert, custom"
else if value = "no" then ""
else value
description: For which kinds of keywords should reminder text be added by default? Note: you can enable/disable reminder text by right clicking the keyword.
set field:
type: boolean
name: automatic card numbers
description: Should card numbers be shown on the cards?
set field:
type: choice
name: sort special rarity
description: Determines how cards with special rarity are sorted.
choice: with the rest
choice: after other cards
choice: separate numbering
initial: after other cards
set field:
type: boolean
name: mark errors
description: Marks errors on cards, for example wording and spelling errors, non unique card names, etc.
set field:
type: choice
name: use gradient multicolor
choice: yes
choice: only for two color cards
choice: no
description: Use gradients on multicolor cards by default, you can always change it be clicking on the card border.
initial: no
############################# Default style
default set style:
title:
padding left: 2
font:
size: 16
symbol:
max aspect ratio: 2.5
variation:
name: common
border radius: 0.10
fill type: solid
fill color: rgb(0,0,0)
border color: rgb(255,255,255)
variation:
name: uncommon
border radius: 0.07
fill type: linear gradient
fill color 1: rgb(224,224,224)
fill color 2: rgb(84, 84, 84)
border color 1: rgb(0, 0, 0)
border color 2: rgb(0, 0, 0)
variation:
name: rare
border radius: 0.07
fill type: linear gradient
fill color 1: rgb(214,196,94)
fill color 2: rgb(95, 84, 40)
border color 1: rgb(0, 0, 0)
border color 2: rgb(0, 0, 0)
variation:
name: mythic rare
border radius: 0.07
fill type: linear gradient
fill color 1: rgb(255, 160, 40)
fill color 2: rgb(202, 49, 35)
border color 1: rgb(0, 0, 0)
border color 2: rgb(0, 0, 0)
variation:
name: special
border radius: 0.10
fill type: linear gradient
fill color 1: rgb(224,170,247)
fill color 2: rgb(58,7,80)
border color 1: rgb(255,255,255)
border color 2: rgb(255,255,255)
automatic reminder text:
render style: checklist
direction: vertical
sort special rarity:
render style: both
choice images:
with the rest: /space.mse-game/icons/number_cards_mixed.png
after other cards: /space.mse-game/icons/number_cards_after.png
separate numbering: /space.mse-game/icons/number_cards_separate.png
use gradient multicolor:
render style: both
choice images:
yes: script: built_in_image("bool_yes")
no: script: built_in_image("bool_no")

View File

@@ -0,0 +1,84 @@
############################################################## Statistics dimensions
statistics dimension:
name: card color
position hint: 0
script: primary_card_color(card.card_color)
icon: stats/card_color.png
colors:
crystal : rgb(255,237,202)
cryo : rgb(42,141,255)
shadow : rgb(33,33,33)
pyre : rgb(255,52,0)
xeno : rgb(138,230,0)
colorless : rgb(122,85,85)
device : rgb(188,192,195)
multicolor : rgb(255,188,14)
resource : rgb(109,62,39)
hybrid : rgb(243,26,136)
group: crystal
group: cryo
group: shadow
group: pyre
group: xeno
group: colorless
group: device
group: multicolor
group: resource
group: hybrid
statistics dimension:
position hint: 2
name: converted psi cost
script: cmc(card.casting_cost)
numeric: true
icon: stats/casting_cost.png
statistics dimension:
position hint: 3
name: colored psi cost
script: colored_psi(card.casting_cost)
numeric: true
icon: stats/colored_casting_cost.png
statistics dimension:
position hint: 50
name: power
script: card.power
numeric: true
icon: stats/power.png
statistics dimension:
position hint: 51
name: toughness
script: card.toughness
numeric: true
icon: stats/toughness.png
statistics dimension:
name: keywords
position hint: 1000
script: keyword_usage(unique:true)
show empty: false
split list: true
icon: stats/keywords.png
statistics dimension:
name: text length (words)
position hint: 100
script: word_count(to_text(card.rule_text))
numeric: true
bin size: 5
icon: stats/text_length.png
statistics dimension:
name: race
position hint: 32
icon: stats/creature_race.png
description: Race of unit and tribal cards
script:
if is_unit(card.super_type) or is_tribal(card.super_type) then
only_first(card.sub_type)
show empty: false
statistics dimension:
name: class
position hint: 33
icon: stats/creature_class.png
description: Class of unit cards
script:
if is_unit(card.super_type) then
space_to_comma(trim(remove_tags(only_next(card.sub_type))))
show empty: false
split list: true

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1000 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

View File

@@ -0,0 +1,102 @@
############################################################## Space word lists
word list:
name: type
word:
name: Raw
is prefix: true
word:
name: Unique
is prefix: true
word:
name: Tribal
is prefix: true
word: Unit
word: Device
word: Device Unit
word: Augment
word: Tactic
word: Strategy
word: Resource
word: Warlord
word list:
name: race
word:
script: all_races()
line below: true
word: Alien
word: Animal
word: Anthroform
word: Bug
word: Capital-ship
word: Cruiser
word: Cyborg
word: Drone
word: Herbiform
word: Human
word: Mutant
word: Nanite
word: Robot
word: Starship
word: Swarm
word: Transcended
word: Vehicle
word: Weapon
word list:
name: class
word:
script: all_classes()
line below: true
word: Agent
word: Artillery
word: Boat
word: Bomb
word: Carrier
word: Colonist
word: Councillor
word: Engineer
word: Fighter
word: Helo
word: Hunter
word: Infantry
word: Laser
word: Marksman
word: Mercenary
word: Merchant
word: Mystic
word: Scout
word: Sentry
word: Submarine
word: Tactician
word: Tank
word: Warrior
word list:
name: device
word:
name:
line below: true
word: Outfitting
word list:
name: resource
word:
script: all_sub_types(match: "Resource")
line below: true
word: Lux
word: Gelidine
word: Necroleum
word: Carbos
word: Biolute
word: Quareen
word: Dome
word list:
name: augment
word:
name:
line below: true
word: Graft
word list:
name: action
word:
name:
line below: true
word: Drug
word: Trap