Add prototype to M15 Mainframe (#165)

---------

Co-authored-by: cajun <12363371+CajunAvenger@users.noreply.github.com>
This commit is contained in:
cajun
2025-10-05 19:59:19 -05:00
committed by GitHub
parent 69593826a5
commit 1f4641651c
31 changed files with 443 additions and 52 deletions

View File

@@ -16,6 +16,14 @@ __Station Levelers__
• Additionally added support for Circle level container without the Station full-art or PT changes. • Additionally added support for Circle level container without the Station full-art or PT changes.
• As stations have semi-transparent levels, this has extended to Borderless+Fullart levelers as well. • As stations have semi-transparent levels, this has extended to Borderless+Fullart levelers as well.
__Prototype Support__
• M15 Mainframe and Mainframe Planeswalkers have added Prototype to their frame lists!
• This can stack with most frames, though overrides Mutate, Levelers, and Adventures.
• On Mainframe, the prototype level locks to the size from BRO, and can be resized with the level offset style option.
• For planeswalkers, it automatically sizes itself on the first textbox. Be warned that this can break down if that only has one line of text in it.
• Both have a new "Prototype Secondary" option which will let you use a Type bar in place of the PT box.
• special_text() will export as "All text before reminder text <sym>Mana cost</sym> — PT|Type (Reminder text.)"
__MSE 2.5.8__ __MSE 2.5.8__
GenevensiS and TomTkacz have been in the C++ mines making MSE sing like she hasn't in a while. GenevensiS and TomTkacz have been in the C++ mines making MSE sing like she hasn't in a while.
• On Windows, fonts are now automatically loaded from any folder containing "fonts" in its name (and its subfolders) and don't need to be installed manually. Mac and Linux users will still need to install. • On Windows, fonts are now automatically loaded from any folder containing "fonts" in its name (and its subfolders) and don't need to be installed manually. Mac and Linux users will still need to install.

View File

@@ -6,7 +6,7 @@ icon: card-sample.png
installer group: magic/m15 style/normal cards installer group: magic/m15 style/normal cards
position hint: 001 position hint: 001
version: 2024-09-23 version: 2025-10-05
depends on: depends on:
package: magic.mse-game package: magic.mse-game
version: 2020-04-25 version: 2020-04-25
@@ -119,7 +119,9 @@ init script:
curtains: "curtains/" curtains: "curtains/"
season: "season/" season: "season/"
proto_box: "/magic-modules.mse-include/protoboxes/box/",
proto_cost: "/magic-modules.mse-include/protoboxes/cost/",
proto_pt: "/magic-modules.mse-include/protoboxes/pt/"
] ]
template_suffix := [ template_suffix := [
card: "card.jpg", card: "card.jpg",
@@ -171,7 +173,9 @@ init script:
puma: "puma.png" puma: "puma.png"
puma_shift: "puma.png" puma_shift: "puma.png"
proto_box: "box.png",
proto_cost: "cost.png",
proto_pt: "pt.png"
] ]
template := { template := {
if type_name(harder_script[type] or else nil) != type_name(nil) if type_name(harder_script[type] or else nil) != type_name(nil)
@@ -237,8 +241,11 @@ init script:
chosen(styling.frames, choice:"frameless art") chosen(styling.frames, choice:"frameless art")
} }
auto_station := { auto_station := {
chosen(styling.other_options, choice:"auto spacecraft") and (lang_setting("is_spacecraft")(card.sub_type) or lang_setting("is_planet")(card.sub_type)) not is_prototype() and
or (chosen(styling.frames, choice:"leveler") and sta_leveler()) (
chosen(styling.other_options, choice:"auto spacecraft") and (lang_setting("is_spacecraft")(card.sub_type) or lang_setting("is_planet")(card.sub_type))
or (chosen(styling.frames, choice:"leveler") and sta_leveler())
)
} }
mini_arts := { mini_arts := {
chosen(styling.other_options, choice:"de-fullart special frames") chosen(styling.other_options, choice:"de-fullart special frames")
@@ -255,12 +262,19 @@ init script:
is_dka := { is_dka := {
chosen(styling.frames, choice:"fullart") and not is_map() and not uses_clear_frame() chosen(styling.frames, choice:"fullart") and not is_map() and not uses_clear_frame()
} }
#### PUMA and Mutate add things on top #### PUMA, Mutate, Prototype add things on top
is_puma := { is_puma := {
chosen(styling.frames, choice:"puma") and not is_map() and not uses_expanded_art() and not uses_clear_frame() and not is_dka() chosen(styling.frames, choice:"puma") and not is_map() and not uses_expanded_art() and not uses_clear_frame() and not is_dka()
} }
is_prototype := {
chosen(styling.frames, choice:"prototype")
}
## use a separate box for prototype rather than adaptive
is_snap_prototype := { is_prototype() }
## using the pt box and not the typebar
prototype_pt := { styling.prototype_secondary == "pt" and is_prototype() }
is_mutate := { is_mutate := {
chosen(styling.frames, choice:"mutate") and not is_map() chosen(styling.frames, choice:"mutate") and not is_map() and not is_prototype()
} }
mutate_image := { mutate_image := {
is_mutate() and not uses_expanded_art() and not is_dka() and not uses_clear_frame() and not clear_tops() is_mutate() and not uses_expanded_art() and not is_dka() and not uses_clear_frame() and not clear_tops()
@@ -307,7 +321,7 @@ init script:
or (lang_setting("is_enchantment")(card.super_type) and set.auto_nyx and not auto_custom_border()) or (lang_setting("is_enchantment")(card.super_type) and set.auto_nyx and not auto_custom_border())
} }
is_leveler := { is_leveler := {
chosen(styling.frames, choice:"leveler") or auto_station() not is_prototype() and (chosen(styling.frames, choice:"leveler") or auto_station())
} }
is_custom_border := { is_custom_border := {
@@ -629,10 +643,10 @@ init script:
} }
top_of_textbox := { top_of_textbox := {
( (
if is_map() then 340 if is_snap_prototype() then (if is_dka() then 359 else 329) + 8 + prototype_height()
else if is_dka() and is_mutate() then 395 else if is_map() then 340
else if is_dka() then 359
else if is_mutate() then 395 else if is_mutate() then 395
else if is_dka() then 359
else 327 else 327
) - (-chop_top()) + body_font_vertical() ) - (-chop_top()) + body_font_vertical()
} }
@@ -672,7 +686,18 @@ init script:
cw := if cw > 44 then (if set.print_fix != "" then set.print_fix else 22) else if cw < 22 then 22 else cw cw := if cw > 44 then (if set.print_fix != "" then set.print_fix else 22) else if cw < 22 then 22 else cw
if card_style.rarity.width == 0 then 0 else cw if card_style.rarity.width == 0 then 0 else cw
} }
special_text := {if is_leveler() then ((if card.level_0 != "" then "[" + level_label(0) + " " + card.level_0 + "] " else "") + card.level_1_text + (if card.pt != "" and not lone_pt() then " [" + card.pt + "]" else "") + "\n" clean_type := replace@(match: " — $", replace:"")
+replace@(match: " $", replace:"")
prototype_special_text := {
# (card.level_1_text + " " + card.casting_cost_2 + " — " + card.pt_2 + "\n" + card.level_2_text)
inject := "<sym>" + card.casting_cost_2 + "</sym> — " + (if styling.prototype_secondary == "type" then clean_type(remove_tags(card.type_2)) else remove_tags(card.pt_2)) + " "
hold := replace(card.level_1_text, match:"(.*)(<i(?:-auto)?>[(].*)", replace:{_1 + inject + _2})
if hold == card.level_1_text then card.level_1_text + " " + inject else hold
}
special_text := {
if is_prototype()
then prototype_special_text() + "\n" + card.rule_text
else if is_leveler() then ((if card.level_0 != "" then "[" + level_label(0) + " " + card.level_0 + "] " else "") + card.level_1_text + (if card.pt != "" and not lone_pt() then " [" + card.pt + "]" else "") + "\n"
+ (if card.level_1 != "" then "[" + level_label(1) + " " + card.level_1 + "] " else "") + card.level_2_text + (if card.pt_2 != "" then " [" + card.pt_2 + "]" else "") + "\n" + (if card.level_1 != "" then "[" + level_label(1) + " " + card.level_1 + "] " else "") + card.level_2_text + (if card.pt_2 != "" then " [" + card.pt_2 + "]" else "") + "\n"
+ (if card.level_2 != "" then "[" + level_label(2) + " " + card.level_2 + "] " else "") + card.level_3_text + (if card.pt_3 != "" then " [" + card.pt_3 + "]" else "") + (if card.level_4_text != "" then "\n" else "") + (if card.level_2 != "" then "[" + level_label(2) + " " + card.level_2 + "] " else "") + card.level_3_text + (if card.pt_3 != "" then " [" + card.pt_3 + "]" else "") + (if card.level_4_text != "" then "\n" else "")
+ (if card.level_3 != "" then "[" + level_label(3) + " " + card.level_3 + "] " else "") + card.level_4_text + (if card.pt_7 != "" then " [" + card.pt_7 + "]" else "") + (if card.level_3 != "" then "[" + level_label(3) + " " + card.level_3 + "] " else "") + card.level_4_text + (if card.pt_7 != "" then " [" + card.pt_7 + "]" else "")
@@ -890,11 +915,18 @@ init script:
] ]
swap_fonts_body_default := [ swap_fonts_body_default := [
name: {"MPlantin"}, name: {"MPlantin"},
size: {if styling.font_cap != "" then to_number(styling.font_cap) else if is_mutate() then 12 else 14}, size: {if styling.font_cap != "" then to_number(styling.font_cap) else if is_snap_prototype() then 11.5 else if is_mutate() then 12 else 14},
color: {if is_map() then "black" else if is_dka() or is_fnm() or is_inverted() then "white" else "black"}, color: {if is_map() then "black" else if is_dka() or is_fnm() or is_inverted() then "white" else "black"},
vertical: {0}, vertical: {0},
italic: {"MPlantin-Italic"} italic: {"MPlantin-Italic"}
] ]
swap_fonts_body2_default := [
name: {"MPlantin"},
size: {if styling.font_cap != "" then to_number(styling.font_cap) else if is_snap_prototype() then 11.5 else if is_mutate() then 12 else 14},
color: {if is_map() or is_prototype() then "black" else if is_dka() or is_fnm() or is_inverted() then "white" else "black"},
vertical: {0},
italic: {"MPlantin-Italic"}
]
swap_fonts_pt_default := [ swap_fonts_pt_default := [
name: {"Beleren Bold"}, name: {"Beleren Bold"},
size: {if is_map() then 14 else if auto_station() then 13 else 16}, size: {if is_map() then 14 else if auto_station() then 13 else 16},
@@ -907,6 +939,19 @@ init script:
vertical: {0}, vertical: {0},
italic: {""} italic: {""}
] ]
swap_fonts_pt2_default := [
name: {"Beleren Bold"},
size: {if is_prototype() then 15 else if is_map() then 14 else if auto_station() then 13 else 16},
color: {
if is_prototype() then "white"
else if is_map() then "black"
else if is_planeshifted() or is_fnm() or is_inverted() then "white"
else if is_vehicle() or auto_station() then "white"
else "black"
},
vertical: {0},
italic: {""}
]
loyalty_font_size := { loyalty_font_size := {
swap_font_size( swap_font_size(
src:styling.custom_pt_font, src:styling.custom_pt_font,
@@ -958,6 +1003,81 @@ init script:
override_filter := replace@(match:"\\[([^\\]]+)]", replace: "<code><b><color:black>[\\1]</color></b></code>") override_filter := replace@(match:"\\[([^\\]]+)]", replace: "<code><b><color:black>[\\1]</color></b></code>")
text_filter := text_filter + override_clear + d20_filter + {if chosen(styling.other_options, choice:"override-style text") then override_filter(input) else input} text_filter := text_filter + override_clear + d20_filter + {if chosen(styling.other_options, choice:"override-style text") then override_filter(input) else input}
prototype_height := { 53 + to_number(pull_comma_array(styling.level_offset, cell:0, end:0)) }
protobox_template := {
base := template_prefix[type] + input + template_suffix[type]
internal_crop(img:base, height:162, width:324, top:4, bottom:156, distance:prototype_height())
}
protocost_template := {
base := template_prefix[type] + input + template_suffix[type]
## double sized
## 8 [cost min 5] 4; doubled
dist := 2*(max(8, card_style.casting_cost_2.content_width)-3)
internal_crop(img:base, height: 48, width: 130, left:16, right:122, distance:dist)
}
prototype_template := {
base := template_prefix[type] + input + template_suffix[type]
## double sized
## 8 [cost min 5] 4; doubled
dist := 2*(max(20, card_style.type_2.content_width))
internal_crop(img:base, height: 48, width: 130, left:16, right:122, distance:dist)
}
prototype_box_image := {
template := protobox_template
land_template := protobox_template
color_background(
type: "proto_box",
base_hybrid: card_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_cost_image := {
template := protocost_template
land_template := protocost_template
color_background(
type: "proto_cost",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_type_image := {
template := prototype_template
land_template := prototype_template
color_background(
type: "proto_cost",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_pt_image := {
color_background(
type: "proto_pt",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
## once we combined_editor levelers
alt_text_script := {
if is_prototype()
then combined_editor(
field1: card.level_1_text,
separator1: "<line>\n</line>",
field2: card.rule_text,
separator2: "<line>\n</line>",
field3: card.flavor_text
)
else
combined_editor(field1: card.rule_text, separator: "<line>\n</line>", field2: card.flavor_text)
}
############################################################## Set info fields ############################################################## Set info fields
set info style: set info style:
symbol: symbol:
@@ -1003,6 +1123,7 @@ styling field:
choice: frameless art choice: frameless art
choice: fullart choice: fullart
choice: puma choice: puma
choice: prototype
choice: mutate choice: mutate
choice: fnm promo choice: fnm promo
choice: inverted choice: inverted
@@ -1102,6 +1223,11 @@ styling field:
type: text type: text
name: level offset name: level offset
description: Formatted as 1,2,3,. Move the level boxes down X pixels. Use negative to move up. For 4 equal levels, use -14,-25,-38, description: Formatted as 1,2,3,. Move the level boxes down X pixels. Use negative to move up. For 4 equal levels, use -14,-25,-38,
styling field:
type: choice
name: prototype secondary
choice: pt
choice: type
include file: /magic-modules.mse-include/rarities/styling_fields include file: /magic-modules.mse-include/rarities/styling_fields
include file: /magic-modules.mse-include/fonts/styling_fields include file: /magic-modules.mse-include/fonts/styling_fields
styling field: styling field:
@@ -1302,7 +1428,34 @@ card style:
always symbol: true always symbol: true
z index: 920 z index: 920
padding top: 0 padding top: 0
casting cost 2:
right: 343
top: {(if is_dka() then 359 else 329)+3}
width: { max(30, card_style.casting_cost_2.content_width) }
height: { if is_prototype() then 20 else 0 }
alignment: middle right
font:
name: MPlantin
size: 13
symbol font:
name: {styling.casting_cost_mana_symbols}
size: 13
alignment: middle right
always symbol: true
z index: 920
padding top: 0
type 2:
right: 341
bottom: { (if is_dka() then 359 else 329) + 3 + prototype_height() }
height: { if is_prototype() and styling.prototype_secondary == "type" then 24 else 0 }
width: { max(20, card_style.type_2.content_width) }
z index: 920
font:
name: { type_font() }
italic name: { type_font_italic() }
size: { type_font_size() }
color: { "white" }
separator color: red
############################# Image ############################# Image
image: image:
left: left:
@@ -1442,22 +1595,22 @@ card style:
############################# leveler ############################# leveler
level 1 text: level 1 text:
left: { if is_leveler() and card.level_0 != "" then (if loy_leveler() then 57 else if cir_leveler() then 43 else if box_leveler() then 78 else 75) else if is_map() then 40 else 29} left: { if is_leveler() and card.level_0 != "" then (if loy_leveler() then 57 else if cir_leveler() then 43 else if box_leveler() then 78 else 75) else if is_map() then 40 else 29}
top: { if is_dka() and is_mutate() then 359 else if is_mutate() then 329 else top_of_textbox() } top: { if is_mutate() or is_snap_prototype() then (if is_dka() then 359 else 329) else top_of_textbox() }
right: { if is_leveler() then (if lone_pt() or card.pt == "" then 342 else (if cir_leveler() then 291 else 287)) else if is_mutate() then 342 else if is_map() then 40 else 29} right: { if is_leveler() then (if lone_pt() or card.pt == "" then 342 else (if cir_leveler() then 291 else 287)) else if is_snap_prototype() then 290 else if is_mutate() then 342 else if is_map() then 40 else 29}
bottom: { if is_mutate() then 392 else if is_leveler() then (327+lv_1_height()) else bottom_of_textbox() } bottom: { if is_snap_prototype() then (if is_dka() then 359+prototype_height() else 329+prototype_height()) else if is_mutate() then 392 else if is_leveler() then (327+lv_1_height()) else bottom_of_textbox() }
font: font:
font: font:
name: { body_font() } name: { body2_font() }
italic name: { body_font_italic() } italic name: { body2_font_italic() }
size: { body_font_size() } size: { body2_font_size() }
scale down to: 6 scale down to: 6
color: { body_font_color() } color: { body2_font_color() }
shadow color: {if is_map() then rgba(0,0,0,0) else if is_dka() or is_fnm() then "black" else rgba(0,0,0,0)} shadow color: {if is_map() or is_prototype() then rgba(0,0,0,0) else if is_dka() or is_fnm() then "black" else rgba(0,0,0,0)}
shadow displacement x: -1 shadow displacement x: -1
shadow displacement y: 1 shadow displacement y: 1
symbol font: symbol font:
name: { styling.text_box_mana_symbols } name: { styling.text_box_mana_symbols }
size: {body_font_size()} size: {body2_font_size()}
scale down to: 6 scale down to: 6
alignment: alignment:
script: script:
@@ -1672,16 +1825,16 @@ card style:
shadow displacement y: 1 shadow displacement y: 1
pt 2: pt 2:
z index: 900 z index: 900
left: {leveler_pt_left()} left: {if prototype_pt() then 300 else leveler_pt_left()}
top: {(l2_center() - 12 + leveler_pt_top_offset())+(if is_map() then -1 else 0)+(pt_font_vertical())} top: {if prototype_pt() then 307+prototype_height() else (l2_center() - 12 + leveler_pt_top_offset())+(if is_map() then -1 else 0)+(pt_font_vertical())}
width: {if is_leveler() and not lone_pt() or card.pt_2 != "" then leveler_pt_width() else 0} width: {if prototype_pt() then 45 else if is_leveler() and (not lone_pt() or card.pt_2 != "") then leveler_pt_width() else 0}
height: {leveler_pt_height()} height: {if prototype_pt() then 21 else leveler_pt_height()}
alignment: center middle shrink-overflow alignment: center middle shrink-overflow
font: font:
name: {pt_font()} name: {pt2_font()}
italic name: {pt_font_italic()} italic name: {pt2_font_italic()}
size: {pt_font_size()} size: {pt2_font_size()}
color: {pt_font_color()} color: {pt2_font_color()}
separator color: red separator color: red
shadow color: {if is_map() then rgba(0,0,0,0) else if is_planeshifted() or is_fnm() then rgb(0,0,0) else rgba(0,0,0,0)} shadow color: {if is_map() then rgba(0,0,0,0) else if is_planeshifted() or is_fnm() then rgb(0,0,0) else rgba(0,0,0,0)}
shadow displacement x: -1 shadow displacement x: -1
@@ -2010,7 +2163,30 @@ extra card field:
script: card.card_color script: card.card_color
save value: false save value: false
editable: false editable: false
extra card field:
type: choice
name: prototype box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype cost box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype type box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype pt box
script: card.card_color_2
save value: false
editable: false
extra card style: extra card style:
pt box: pt box:
@@ -2023,14 +2199,14 @@ extra card style:
render style: image render style: image
image: { choose_ptbox() } image: { choose_ptbox() }
pt box 2: pt box 2:
left: {leveler_ptbox_left()} left: { leveler_ptbox_left()}
top: { l2_center() - (if is_map() then 26 else 15) + leveler_ptbox_top_offset()} top: { l2_center() - (if is_map() then 26 else 15) + leveler_ptbox_top_offset()}
width: { if (is_leveler() and not lone_pt()) or card.pt_2 != "" then (if is_map() then 90 else leveler_ptbox_width()) else 0} width: { if (is_leveler() and not lone_pt()) or card.pt_2 != "" then (if is_map() then 90 else leveler_ptbox_width()) else 0}
height: { if (is_leveler() and not lone_pt()) or card.pt_2 != "" then (if is_map() then 54 else leveler_ptbox_height()) else 0} height: { if (is_leveler() and not lone_pt()) or card.pt_2 != "" then (if is_map() then 54 else leveler_ptbox_height()) else 0}
z index: 840 z index: 840
visible: { card.pt_2 != "" } visible: { card.pt_2 != "" and not is_prototype() }
render style: image render style: image
image: {if is_map() then mappt_background() else combine_blend(image1: choose_ptbox(), image2: template_prefix["pt"]+"ptbox_multiply_1.png", combine: "multiply")} image: { if is_map() then mappt_background() else combine_blend(image1: choose_ptbox(), image2: template_prefix["pt"]+"ptbox_multiply_1.png", combine: "multiply")}
pt box 3: pt box 3:
left: {leveler_ptbox_left()} left: {leveler_ptbox_left()}
top: { l3_center() - (if is_map() then 26 else 15) + leveler_ptbox_top_offset()} top: { l3_center() - (if is_map() then 26 else 15) + leveler_ptbox_top_offset()}
@@ -2428,3 +2604,39 @@ extra card style:
render style: image render style: image
image: { if stamp_shape() == "triangle" then tri_stamp() else round_stamp() } image: { if stamp_shape() == "triangle" then tri_stamp() else round_stamp() }
z index: 850 z index: 850
prototype box:
left: 25
top: {(if is_dka() then 359 else 329)-3}
height: { prototype_height() + 10 }
width: 324
render style: image
z index: 650
image: { prototype_box_image() }
visible: { is_prototype() }
prototype cost box:
right: 346
top: {(if is_dka() then 359 else 329)}
height: 24
width: {8 + max(8, card_style.casting_cost_2.content_width)-3 + 4}
render style: image
z index: 650
image: { prototype_cost_image() }
visible: { is_prototype() }
prototype type box:
right: 346
bottom: { (if is_dka() then 359 else 329) + 2 + prototype_height() }
height: 24
width: {8 + max(20, card_style.type_2.content_width) + 4}
render style: image
z index: 650
image: { prototype_type_image() }
visible: { is_prototype() and styling.prototype_secondary == "type" and remove_tags(card.type_2) != "" }
prototype pt box:
left: 291
bottom: { 334 + prototype_height() }
height: 32
width: 64
render style: image
z index: 720
image: { prototype_pt_image() }
visible: { is_prototype() and styling.prototype_secondary == "pt" and card.pt_2 != "" }

View File

@@ -59,6 +59,9 @@ init script:
star: "/magic-modules.mse-include/trims/star/", star: "/magic-modules.mse-include/trims/star/",
ub: "/magic-modules.mse-include/trims/beyond/", ub: "/magic-modules.mse-include/trims/beyond/",
identity: "/magic-modules.mse-include/indicators/" identity: "/magic-modules.mse-include/indicators/"
proto_box: "/magic-modules.mse-include/protoboxes/box/",
proto_cost: "/magic-modules.mse-include/protoboxes/cost/",
proto_pt: "/magic-modules.mse-include/protoboxes/pt/"
] ]
template_suffix := [ template_suffix := [
card: "card.png" card: "card.png"
@@ -81,6 +84,9 @@ init script:
star: "star.png", star: "star.png",
beyond: "beyond.png", beyond: "beyond.png",
identity: "identity.png" identity: "identity.png"
proto_box: "box.png",
proto_cost: "cost.png",
proto_pt: "pt.png"
] ]
template := { template := {
if type_name(harder_script[type] or else nil) != type_name(nil) if type_name(harder_script[type] or else nil) != type_name(nil)
@@ -215,7 +221,7 @@ init script:
combined_editor(field1: card.level_1_text, separator1: "<line>\n</line>", field2: card.level_2_text, separator2: "<line>\n</line>", field3: card.level_3_text) combined_editor(field1: card.level_1_text, separator1: "<line>\n</line>", field2: card.level_2_text, separator2: "<line>\n</line>", field3: card.level_3_text)
} }
margin_left := { margin_left := {
if input == "lv1" then (if card.loyalty_cost_1 == "" and unindent() then 0 else 130) if input == "lv1" then (if is_prototype() then 0 else if card.loyalty_cost_1 == "" and unindent() then 0 else 130)
else if input == "lv2" then (if card.loyalty_cost_2 == "" and unindent() then 0 else 130) else if input == "lv2" then (if card.loyalty_cost_2 == "" and unindent() then 0 else 130)
else if input == "lv3" then (if card.loyalty_cost_3 == "" and unindent() then 0 else 130) else if input == "lv3" then (if card.loyalty_cost_3 == "" and unindent() then 0 else 130)
else if input == "lv4" then (if card.loyalty_cost_4 == "" and unindent() then 0 else 130) else if input == "lv4" then (if card.loyalty_cost_4 == "" and unindent() then 0 else 130)
@@ -224,6 +230,14 @@ init script:
else 0 else 0
} }
margin_top := {to_int(pull_comma_array(styling.combined_chop, cell:2, end:0, default:0))} margin_top := {to_int(pull_comma_array(styling.combined_chop, cell:2, end:0, default:0))}
margin_right := {
if input == "lv1" and is_prototype() then (
w := card_style.type_2.content_width or else 0
if w < 52 then w := 52
10*w
)
else 0
}
add_spacers := { if input == "" and inner_level(name) then "" else input} add_spacers := { if input == "" and inner_level(name) then "" else input}
inner_level := { inner_level := {
if input == "lv5" and max_level() > 5 then true if input == "lv5" and max_level() > 5 then true
@@ -262,9 +276,10 @@ init script:
is_nyx := {chosen(styling.other_options, choice:"nyx") or (set.auto_nyx and lang_setting("is_enchantment")(card.type))} is_nyx := {chosen(styling.other_options, choice:"nyx") or (set.auto_nyx and lang_setting("is_enchantment")(card.type))}
is_adventure := {chosen(styling.other_options, choice:"adventure") and not is_tale()} is_adventure := {chosen(styling.other_options, choice:"adventure") and not is_tale()}
is_tale := {chosen(styling.other_options, choice:"reversed adventure")} is_tale := {chosen(styling.other_options, choice:"reversed adventure")}
use_adv := {is_tale() or is_adventure()} use_adv := {(is_tale() or is_adventure()) and not is_prototype()}
is_snow := {chosen(styling.other_options, choice:"snow")} is_snow := {chosen(styling.other_options, choice:"snow")}
is_vehicle := {chosen(styling.other_options, choice:"vehicle")} is_vehicle := {chosen(styling.other_options, choice:"vehicle")}
is_prototype := {chosen(styling.other_options, choice:"prototype")}
is_pinned := {chosen(styling.other_options, choice:"pride pinlines")} is_pinned := {chosen(styling.other_options, choice:"pride pinlines")}
is_custom_border := { is_custom_border := {
if chosen(styling.other_options, choice:"custom border") if chosen(styling.other_options, choice:"custom border")
@@ -275,8 +290,15 @@ init script:
paragraph_count := replace@(match:"\n", replace:"~")+ paragraph_count := replace@(match:"\n", replace:"~")+
filter_text@(match:"~") filter_text@(match:"~")
clean_type := replace@(match: " — $", replace:"")
+replace@(match: " $", replace:"")
prototype_special_text := {
inject := "<sym>" + card.casting_cost_2 + "</sym> — " + (if styling.prototype_secondary == "type" then clean_type(remove_tags(card.type_2)) else remove_tags(card.pt_2)) + " "
hold := replace(card.level_1_text, match:"(.*)(<i(?:-auto)?>[(].*)", replace:{_1 + inject + _2})
if hold == card.level_1_text then card.level_1_text + " " + inject else hold
}
special_text := { special_text := {
out := (if card.loyalty_cost_1 != "" then "[" + card.loyalty_cost_1 + "]: " else "") + (if card.level_1_text != "" and card.level_1_text != card.rule_text then card.level_1_text+"\n" else split_text(match:"\n", card.rule_text).0+"\n") out := (if is_prototype() then prototype_special_text() else if card.loyalty_cost_1 != "" then "[" + card.loyalty_cost_1 + "]: " else "") + (if card.level_1_text != "" and card.level_1_text != card.rule_text then card.level_1_text+"\n" else split_text(match:"\n", card.rule_text).0+"\n")
+ (if card.loyalty_cost_2 != "" then "[" + card.loyalty_cost_2 + "]" + ": " else "") + (if card.level_2_text != "" then card.level_2_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~") then split_text(match:"\n", card.rule_text).1+"\n" else "") + (if card.loyalty_cost_2 != "" then "[" + card.loyalty_cost_2 + "]" + ": " else "") + (if card.level_2_text != "" then card.level_2_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~") then split_text(match:"\n", card.rule_text).1+"\n" else "")
+ (if card.loyalty_cost_3 != "" then "[" + card.loyalty_cost_3 + "]" + ": " else "") + (if card.level_3_text != "" then card.level_3_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~~") then split_text(match:"\n", card.rule_text).2+"\n" else "") + (if card.loyalty_cost_3 != "" then "[" + card.loyalty_cost_3 + "]" + ": " else "") + (if card.level_3_text != "" then card.level_3_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~~") then split_text(match:"\n", card.rule_text).2+"\n" else "")
+ (if card.loyalty_cost_4 != "" then "[" + card.loyalty_cost_4 + "]" + ": " else "") + (if card.level_4_text != "" then card.level_4_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~~~") then split_text(match:"\n", card.rule_text).3+"\n" else "") + (if card.loyalty_cost_4 != "" then "[" + card.loyalty_cost_4 + "]" + ": " else "") + (if card.level_4_text != "" then card.level_4_text+"\n" else if contains(paragraph_count(card.rule_text), match:"~~~") then split_text(match:"\n", card.rule_text).3+"\n" else "")
@@ -319,6 +341,75 @@ init script:
popout_angle := { popout_coord(4, field:styling.popout_image_style or else "", lim:4) } popout_angle := { popout_coord(4, field:styling.popout_image_style or else "", lim:4) }
use_popunder := { chosen(styling.other_options, choice:"popunder art") } use_popunder := { chosen(styling.other_options, choice:"popunder art") }
watermark_include := "/magic-modules.mse-include/watermarks" watermark_include := "/magic-modules.mse-include/watermarks"
prototype_height := { card_style.text.layout.blocks[0].bottom or else 0 }
proto_primary_height := {
min(21, round_up(prototype_height()/2)+1)
}
proto_secondary_height := {
remain := round_up(prototype_height()) - proto_primary_height() + if styling.prototype_secondary == "pt" then 6 else 1
min((if styling.prototype_secondary == "type" then 21 else 28), remain)
}
protobox_template := {
base := template_prefix[type] + input + template_suffix[type]
internal_crop(img:base, height:162, width:324, top:4, bottom:156, distance:prototype_height())
}
protocost_template := {
base := template_prefix[type] + input + template_suffix[type]
## double sized
## 8 [cost min 5] 4; doubled
dist := 2*(max(8, card_style.casting_cost_2.content_width)-3)
internal_crop(img:base, height: 48, width: 130, left:16, right:122, distance:dist)
}
prototype_template := {
base := template_prefix[type] + input + template_suffix[type]
## double sized
## 8 [cost min 5] 4; doubled
dist := 2*(max(20, card_style.type_2.content_width))
internal_crop(img:base, height: 48, width: 130, left:16, right:122, distance:dist)
}
prototype_box_image := {
template := protobox_template
land_template := protobox_template
color_background(
type: "proto_box",
base_hybrid: card_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_cost_image := {
template := protocost_template
land_template := protocost_template
color_background(
type: "proto_cost",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_type_image := {
template := prototype_template
land_template := prototype_template
color_background(
type: "proto_cost",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
prototype_pt_image := {
color_background(
type: "proto_pt",
base_hybrid: pt_hybrid,
artifact_blend: "white",
hybrid_blend: "white",
multicolor_blend: "black"
)
}
############################################################## Set info fields ############################################################## Set info fields
set info style: set info style:
symbol: symbol:
@@ -383,6 +474,7 @@ styling field:
choice: nyx choice: nyx
choice: snow choice: snow
choice: vehicle choice: vehicle
choice: prototype
choice: custom border choice: custom border
choice: adventure choice: adventure
choice: reversed adventure choice: reversed adventure
@@ -401,6 +493,11 @@ styling field:
type: boolean type: boolean
name: default image size name: default image size
description: Use the default Planeswalker template image size, disable for easier popout art options. description: Use the default Planeswalker template image size, disable for easier popout art options.
styling field:
type: choice
name: prototype secondary
choice: pt
choice: type
include file: /magic-modules.mse-include/rarities/styling_fields include file: /magic-modules.mse-include/rarities/styling_fields
styling field: styling field:
type: boolean type: boolean
@@ -555,6 +652,7 @@ card style:
always symbol: true always symbol: true
z index: 920 z index: 920
padding top: 0 padding top: 0
card symbol: card symbol:
left: {if card.card_symbol=="none" then 20 else 25} left: {if card.card_symbol=="none" then 20 else 25}
top: 21 top: 21
@@ -754,10 +852,10 @@ card style:
size: {12 - shrink_name2() } size: {12 - shrink_name2() }
color: white color: white
casting cost 2: casting cost 2:
right: {if is_tale() then 345 else 165} right: {if is_prototype() then 345 else if is_tale() then 345 else 165}
top: {if has_four_abilities() then 288 else 323} top: {if is_prototype() then top_of_textbox()-1 else if has_four_abilities() then 288 else 323}
width: { max(30, card_style.casting_cost_2.content_width) + 5 } width: { max(30, card_style.casting_cost_2.content_width) + 5 }
height: {if use_adv() then 23 else 0} height: {if use_adv() or is_prototype() then 23 else 0}
alignment: middle right alignment: middle right
symbol font: symbol font:
name: { styling.casting_cost_mana_symbols } name: { styling.casting_cost_mana_symbols }
@@ -767,18 +865,31 @@ card style:
z index: 920 z index: 920
padding top: 0 padding top: 0
type 2: type 2:
left: {if is_tale() then 202 else 22} right: {if is_prototype() then 344 else if is_tale() then 353 else 173}
top: {348+ shrink_type2()-(if has_four_abilities() then 36 else 0)} bottom: {if is_prototype() then top_of_textbox() + prototype_height() +1 else 368+ shrink_type2()-(if has_four_abilities() then 36 else 0)}
width: 151 width: { if is_prototype() then max(20, card_style.type_2.content_width) else 151}
height: {if use_adv() then 20 else 0} height: {if is_prototype() and styling.prototype_secondary == "type" then proto_secondary_height()-1 else if use_adv() then 20 else 0}
alignment: top shrink-overflow alignment: { if is_prototype() then "top right" else "top shrink-overflow" }
z index: 900 z index: 920
padding top: 2 padding top: 2
font: font:
name: Beleren Bold name: Beleren Bold
size: {11-- shrink_type2()} size: {11-- shrink_type2()}
color: white color: white
separator color: red separator color: red
pt 2:
right: 350
bottom: { top_of_textbox() + (card_style.text.layout.blocks[0].bottom or else 0) - 1 }
height: { if is_prototype() and styling.prototype_secondary == "pt" then proto_secondary_height()-12 else 0 }
width: { if is_prototype() and styling.prototype_secondary == "pt" then (2 * proto_secondary_height())-14 else 0 }
alignment: center middle shrink-overflow
z index: 920
padding top: 2
font:
name: Beleren Bold
size: 13
color: white
separator color: red
text 2: text 2:
left: {if is_tale() then 198 else 20 } left: {if is_tale() then 198 else 20 }
top: {if has_four_abilities() then 332 else 372} top: {if has_four_abilities() then 332 else 372}
@@ -1088,6 +1199,31 @@ extra card field:
choice: img choice: img
save value: false save value: false
editable: false editable: false
extra card field:
type: choice
name: prototype box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype cost box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype type box
script: card.card_color_2
save value: false
editable: false
extra card field:
type: choice
name: prototype pt box
script: card.card_color_2
save value: false
editable: false
extra card style: extra card style:
foil layer: foil layer:
left: 0 left: 0
@@ -1528,4 +1664,40 @@ extra card style:
z index: 790 z index: 790
mask: {if not use_full_art() or not is_stamped() then "black.png" else if stamp_shape() == "round" then "cut_round.png" else "cut_triangle.png"} mask: {if not use_full_art() or not is_stamped() then "black.png" else if stamp_shape() == "round" then "cut_round.png" else "cut_triangle.png"}
image: {card.image} image: {card.image}
render style: image render style: image
prototype box:
left: 42
bottom: { top_of_textbox() + (card_style.text.layout.blocks[0].bottom or else 0) + 7 }
height: { prototype_height() + 10 }
width: 310
render style: image
z index: 650
image: { prototype_box_image() }
visible: { is_prototype() }
prototype cost box:
right: 348
top: { top_of_textbox() }
height: { proto_primary_height() }
width: {8 + max(8, card_style.casting_cost_2.content_width)-3 + 4}
render style: image
z index: 650
image: { prototype_cost_image() }
visible: { is_prototype() }
prototype type box:
right: 348
bottom: { top_of_textbox() + (card_style.text.layout.blocks[0].bottom or else 0) + 3 }
height: { proto_secondary_height() }
width: {8 + max(20, card_style.type_2.content_width) + 4}
render style: image
z index: 650
image: { prototype_type_image() }
visible: { is_prototype() and styling.prototype_secondary == "type" and remove_tags(card.type_2) != "" }
prototype pt box:
right: 357
bottom: { top_of_textbox() + (card_style.text.layout.blocks[0].bottom or else 0) + 6 }
height: { proto_secondary_height() }
width: { 2 * proto_secondary_height() }
render style: image
z index: 720
image: { prototype_pt_image() }
visible: { is_prototype() and styling.prototype_secondary == "pt" and card.pt_2 != "" }

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -33,7 +33,7 @@ include file: language
include file: statistics_script include file: statistics_script
include file: /magic-blends.mse-include/new-blends include file: /magic-blends.mse-include/new-blends
############################################################## Versioning ############################################################## Versioning
version_date := {"2025-02-01 Template Pack 3.1.d: Mainframe Battles - Stations"} version_date := {"2025-02-01 Template Pack 3.1.e: Mainframe Battles - Prototype"}
version := version_date version := version_date
############################################################## Common filters ############################################################## Common filters
############################################################## Utility ############################################################## Utility
@@ -153,8 +153,8 @@ crop_safe :=
else crop(input, offset_x: offset_x, offset_y: offset_y, width: width, height: height) else crop(input, offset_x: offset_x, offset_y: offset_y, width: width, height: height)
} }
#### Crop out the middle section of an image #### Crop out the middle section of an image
internal_crop:= { internal_crop := {
# given input, image to crop # given img, image to crop
# given height, height of input # given height, height of input
# given width, width of input # given width, width of input
# given left/top, minimum left/top edge coordinate # given left/top, minimum left/top edge coordinate
@@ -187,7 +187,6 @@ internal_crop:= {
cut_verti := true cut_verti := true
) )
) )
# rollover large distance # rollover large distance
internal_space := if cut_horiz then right - left else if cut_verti then bottom - top else 0 internal_space := if cut_horiz then right - left else if cut_verti then bottom - top else 0
excess_crop := 0 excess_crop := 0