diff --git a/data/magic-m15-adventure.mse-style/style b/data/magic-m15-adventure.mse-style/style
index 5488abea7..ef9dc4a97 100644
--- a/data/magic-m15-adventure.mse-style/style
+++ b/data/magic-m15-adventure.mse-style/style
@@ -413,8 +413,11 @@ init script:
"/magic-mainframe-extras.mse-include/" + src
}
custom_border_blend := { color_background(type:"custom_border", base_hybrid:card_hybrid, folder:"blend_masks/") }
- is_custom := {contains(styling.frames, match:"custom border") and contains(styling.custom_border_source, match:".png")}
-
+ is_custom_border := {
+ if chosen(styling.frames, choice:"custom border")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border()
+ }
# this goes at the very end
harder_script := [
crown: module_crown_template,
@@ -1227,7 +1230,7 @@ extra card style:
render style: image
image: { custom_border_blend() }
z index: 0
- visible: {is_custom()}
+ visible: {is_custom_border()}
mask: {(if is_vehicle() or is_snow() or is_nyx() then "double_") + "frame_border_mask.png"}
nyx overlay:
left: 0
diff --git a/data/magic-m15-altered.mse-style/style b/data/magic-m15-altered.mse-style/style
index 6ceda9330..3787d05ac 100644
--- a/data/magic-m15-altered.mse-style/style
+++ b/data/magic-m15-altered.mse-style/style
@@ -290,9 +290,11 @@ init script:
is_leveler := {
chosen(styling.frames, choice:"leveler")
}
+
is_custom_border := {
- chosen(styling.frames, choice:"custom border")
- and contains(styling.custom_border_source, match:".png")
+ if chosen(styling.frames, choice:"custom border")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border()
}
is_leveler := {chosen(styling.frames, choice:"leveler")}
is_legend := {
diff --git a/data/magic-m15-mainframe-dfc.mse-style/style b/data/magic-m15-mainframe-dfc.mse-style/style
index 9f1fa5eb1..3a657307f 100644
--- a/data/magic-m15-mainframe-dfc.mse-style/style
+++ b/data/magic-m15-mainframe-dfc.mse-style/style
@@ -499,7 +499,9 @@ init script:
)
}
front_custom_border := {
- chosen(styling.other_options, choice:"custom border front") and contains(styling.custom_border_source, match:".png")
+ if chosen(styling.other_options, choice:"custom border front")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border()
}
front_draft := {
chosen(styling.other_options, choice:"draft matters front")
@@ -552,7 +554,9 @@ init script:
)
}
back_custom_border := {
- chosen(styling.other_options, choice:"custom border back")
+ if chosen(styling.other_options, choice:"custom border back")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border_2()
}
back_draft := {
chosen(styling.other_options, choice:"draft matters back")
@@ -1525,6 +1529,12 @@ init script:
transform_symbol_offset_height_2 := {
if mainframe_walkerb() then 1 else 0
}
+ card_symbol_offset_top_1 := {
+ if front_normal() then 0 else -8
+ }
+ card_symbol_offset_top_2 := {
+ if front_normal() then 0 else -8
+ }
card_stamp_offset_top_1 := {
if mainframe_walker() and stamp_shape() == "triangle" then -3 else 0
}
@@ -1983,7 +1993,7 @@ card style:
size: { name_font_size() }
color: { name_font_color() }
name 2:
- left: { if back_map() then 442 else if back_normal() then ( if card.card_symbol_2 == "none" then 435 else 455) else if card.card_symbol_2 == "none" then 456 else 439 }
+ left: { if back_map() then 442 else if back_normal() then ( if card.card_symbol_2 == "none" then 435 else 455) else if card.card_symbol_2 == "none" then 439 else 456 }
top: { (if back_map() then 27 else if back_normal() then 30 else 22) - 0.5*shrink_name2() }
right: { (if back_map() then 719 else 714) - card_style.casting_cost_2.content_width }
height: { 23 - (0.5 * shrink_name2()) }
diff --git a/data/magic-m15-mainframe-planes-mini.mse-style/style b/data/magic-m15-mainframe-planes-mini.mse-style/style
index d547b4d2f..5065c1b73 100644
--- a/data/magic-m15-mainframe-planes-mini.mse-style/style
+++ b/data/magic-m15-mainframe-planes-mini.mse-style/style
@@ -66,7 +66,17 @@ init script:
alt_text_script := {
combined_editor(field1:card.rule_text, separator1:"\n", field2:card.rule_text_2)
}
- card_name_for_face := { "" }
+ card_name_for_face := {
+ if (set.CARDNAME_replacement == "card's type" xor reverse)
+ then (
+ ty := to_lower(cardname_type(card["type"]))
+ if ty == "" then "this"
+ else "this " + ty
+ )
+ else if set.CARDNAME_replacement == "card's alias" and card["alias"] != ""
+ then card["alias"]
+ else card["name"]
+ }@(reverse:false)
is_loaded := { card_style.text.layout.separator[0] or else 0 > 0 }
top_box_height := {
diff --git a/data/magic-m15-mainframe-planes.mse-style/style b/data/magic-m15-mainframe-planes.mse-style/style
index 27133e14b..6584dc85d 100644
--- a/data/magic-m15-mainframe-planes.mse-style/style
+++ b/data/magic-m15-mainframe-planes.mse-style/style
@@ -66,7 +66,17 @@ init script:
alt_text_script := {
combined_editor(field1:card.rule_text, separator1:"\n", field2:card.rule_text_2)
}
- card_name_for_face := { "" }
+ card_name_for_face := {
+ if (set.CARDNAME_replacement == "card's type" xor reverse)
+ then (
+ ty := to_lower(cardname_type(card["type"]))
+ if ty == "" then "this"
+ else "this " + ty
+ )
+ else if set.CARDNAME_replacement == "card's alias" and card["alias"] != ""
+ then card["alias"]
+ else card["name"]
+ }@(reverse:false)
is_loaded := { card_style.text.layout.separator[0] or else 0 > 0 }
top_box_height := {
diff --git a/data/magic-m15-mainframe-planeswalker.mse-style/style b/data/magic-m15-mainframe-planeswalker.mse-style/style
index 2826a05f1..24d52eb16 100644
--- a/data/magic-m15-mainframe-planeswalker.mse-style/style
+++ b/data/magic-m15-mainframe-planeswalker.mse-style/style
@@ -267,8 +267,9 @@ init script:
is_vehicle := {chosen(styling.other_options, choice:"vehicle")}
is_pinned := {chosen(styling.other_options, choice:"pride pinlines")}
is_custom_border := {
- chosen(styling.other_options, choice:"custom border")
- and contains(styling.custom_border_source, match:".png")
+ if chosen(styling.other_options, choice:"custom border")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border()
}
custom_border_blend := { color_background(type:"custom_border", base_hybrid:card_hybrid) }
diff --git a/data/magic-m15-mainframe-tokens.mse-style/style b/data/magic-m15-mainframe-tokens.mse-style/style
index 59c60bfa3..500ddfaaa 100644
--- a/data/magic-m15-mainframe-tokens.mse-style/style
+++ b/data/magic-m15-mainframe-tokens.mse-style/style
@@ -229,8 +229,9 @@ init script:
else "/magic-modules.mse-include/stamps/backs/" + (if sh == "triangle" then "triangle_stamp.png" else "stamp.png")
}
is_custom_border := {
- chosen(styling.frames, choice:"custom border")
- and contains(styling.custom_border_source, match:".png")
+ if chosen(styling.frames, choice:"custom border")
+ then has_png(styling.custom_border_source)
+ else auto_custom_border()
}
custom_border_blend := { color_background(type:"custom_border", base_hybrid:card_hybrid) }
watermark_include := "/magic-modules.mse-include/watermarks"
diff --git a/data/magic.mse-game/keywords b/data/magic.mse-game/keywords
index 854faac50..24d60eaac 100644
--- a/data/magic.mse-game/keywords
+++ b/data/magic.mse-game/keywords
@@ -1387,7 +1387,7 @@ keyword:
keyword: Amass
match: Amass name number
mode: action
- reminder: {handle_action_rt(to:"amass {param1} {param2}", "Create")} {english_number_a(param2)} +1/+1 counter(s) on an Army you control. It's also a {if param1.value == "Zombies" then "Zombie" else english_singular(param1)}. If you don't control an Army, create a 0/0 black {if param1.value == "Zombies" then "Zombie" else english_singular(param1)} Army creature token first.
+ reminder: {handle_action_rt(to:"amass {param1} {param2}", "Put")} {english_number_a(param2)} +1/+1 counter(s) on an Army you control. It's also a {if param1.value == "Zombies" then "Zombie" else english_singular(param1)}. If you don't control an Army, create a 0/0 black {if param1.value == "Zombies" then "Zombie" else english_singular(param1)} Army creature token first.
#Throne of Eldraine
keyword:
keyword: Adamant
diff --git a/data/magic.mse-game/script b/data/magic.mse-game/script
index aa389e28b..c37afb6b1 100644
--- a/data/magic.mse-game/script
+++ b/data/magic.mse-game/script
@@ -1675,6 +1675,12 @@ text_filter :=
in_context: "(^|[[:space:]]|\\(|,|\\.|:|“|\"|'|‘|-|—|/|)", #### TODO: Allow any punctuation before
replace: ""
) +
+ #### step 3a : expand shortcut word THIS
+ replace@(
+ match: "THIS>?", #### >? is here so after replacement, the mouse snaps to the end of
+ in_context: "(^|[[:space:]]|\\(|,|\\.|:|“|\"|'|‘|-|—|/|)", #### TODO: Allow any punctuation before
+ replace: ""
+ ) +
#### step 3b : expand shortcut word LEGENDNAME
replace@(
match: "LEGENDNAME>?",
@@ -1692,18 +1698,22 @@ text_filter :=
tag: "",
contents: { "" + (if card_name=="" then "CARDNAME" else strip_card_codes(card_name, atom:true)) + "" }
) +
+ tag_contents@(
+ tag: "",
+ contents: { "" + reverse_name_for(card_name, margin_code:margin_code) + "" }
+ ) +
#### capitalize This type when appropriate
replace@(
- match:"([•.]) this",
- replace:"\\1 This"
+ match:"([•.:]) this",
+ replace:"\\1 This"
) +
replace@(
- match:"([\"“'])this",
- replace:"\\1This"
+ match:"([\"“'])this",
+ replace:"\\1This"
) +
replace@(
- match:"^this",
- replace:"This"
+ match:"^this",
+ replace:"This"
) +
tag_contents@(
tag: "",
@@ -3020,19 +3030,7 @@ level_filter := { input }
#### Correct the CARDNAME atom for levelers
card_name_for_level := {
tag := name_tag_for_level()
- if set.CARDNAME_replacement == "card's type"
- then (
- ty := to_lower(cardname_type(card["type"+tag]))
- if ty == "" then "This"
- else "This " + ty
- )
- else if set.CARDNAME_replacement == "card's alias" and card["alias"+tag] != ""
- then card["alias"+tag]
- else card["name"+tag]
-}
-card_name_for_face := {
- tag := if input == 1 then "" else "_" + input
- if set.CARDNAME_replacement == "card's type"
+ if (set.CARDNAME_replacement == "card's type" xor reverse)
then (
ty := to_lower(cardname_type(card["type"+tag]))
if ty == "" then "this"
@@ -3041,7 +3039,19 @@ card_name_for_face := {
else if set.CARDNAME_replacement == "card's alias" and card["alias"+tag] != ""
then card["alias"+tag]
else card["name"+tag]
-}
+}@(reverse:false)
+card_name_for_face := {
+ tag := if input == 1 then "" else "_" + input
+ if (set.CARDNAME_replacement == "card's type" xor reverse)
+ then (
+ ty := to_lower(cardname_type(card["type"+tag]))
+ if ty == "" then "this"
+ else "this " + ty
+ )
+ else if set.CARDNAME_replacement == "card's alias" and card["alias"+tag] != ""
+ then card["alias"+tag]
+ else card["name"+tag]
+}@(reverse:false)
cardname_type := {
if is_creature(input)
then lang_setting("creature")
@@ -3057,9 +3067,23 @@ cardname_type := {
then lang_setting("enchantment")
else if is_battle(input)
then lang_setting("battle")
+ else if is_plane(input)
+ then lang_setting("plane")
else ""
}
+reverse_name_for := {
+ lv := "1"
+ face := ""
+ if contains(margin_code, match:"lv") then
+ lv := filter_text(margin_code, match:"[0-9]+")
+ else face := filter_text(margin_code, match:"[0-9]+")
+
+ card_name := if face != "" then card_name_for_face(face, reverse:true)
+ else card_name_for_level(lv, reverse:true)
+
+ if card_name == "" then "CARDNAME" else strip_card_codes(card_name, atom:true)
+}
#### This can be overwritten for more complicated levelers
#### Dungeons for example will overwrite with just {""}
name_tag_for_level := {
@@ -5155,8 +5179,30 @@ split_custom_directory := {
dir := filter_text(input, match:"^([^.]+/)+")
[directory:dir, filename:fn]
}
+auto_custom_available := { set.auto_custom_border != "disabled" and has_png(set.auto_custom_border_source)}
+auto_custom_border := {
+ auto_custom_available() and active_custom_border()
+}
+active_custom_border := {
+ if set.auto_custom_border == "check typeline" then
+ contains(card.type, match:set.auto_custom_border_match)
+ else if set.auto_custom_border == "check rules text" then
+ contains(card.text, match:set.auto_custom_border_match)
+ else false
+}
+auto_custom_border_2 := {
+ auto_custom_available() and active_custom_border_2()
+}
+active_custom_border_2 := {
+ if set.auto_custom_border == "check typeline" then
+ contains(card.type_2, match:set.auto_custom_border_match)
+ else if set.auto_custom_border == "check rules text" then
+ contains(card.text_2, match:set.auto_custom_border_match)
+ else false
+}
custom_border_image := {
src := styling.custom_border_source or else ""
+ if (not has_png(src)) and auto_custom_available() then src := set.auto_custom_border_source
ps := split_text(src, match:"-color-")
if length(ps) > 1 then
"/magic-mainframe-extras.mse-include/" + ps[0] + input + (if land then "l" else "") + ps[1]
diff --git a/data/magic.mse-game/set_fields b/data/magic.mse-game/set_fields
index 948c94b28..ba6d80660 100644
--- a/data/magic.mse-game/set_fields
+++ b/data/magic.mse-game/set_fields
@@ -479,6 +479,20 @@ set field:
type: text
name: alternate nyx
description: Use an alternate nyx source folder from magic-mainframe-extras.mse-include.
+set field:
+ type: choice
+ name: auto custom border
+ choice: disabled
+ choice: check typeline
+ choice: check rules text
+set field:
+ type: text
+ name: auto custom border match
+ description: The string to match to automate a custom border.
+set field:
+ type: text
+ name: auto custom border source
+ description: Use this file from magic-mainframe-extras as a custom vehicle-like frame. if colored, name images like "wborder.png" and put "-color-border.png" here.
set field:
type: text
name: custom index