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.
• 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__
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.

View File

@@ -6,7 +6,7 @@ icon: card-sample.png
installer group: magic/m15 style/normal cards
position hint: 001
version: 2024-09-23
version: 2025-10-05
depends on:
package: magic.mse-game
version: 2020-04-25
@@ -119,7 +119,9 @@ init script:
curtains: "curtains/"
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 := [
card: "card.jpg",
@@ -171,7 +173,9 @@ init script:
puma: "puma.png"
puma_shift: "puma.png"
proto_box: "box.png",
proto_cost: "cost.png",
proto_pt: "pt.png"
]
template := {
if type_name(harder_script[type] or else nil) != type_name(nil)
@@ -237,8 +241,11 @@ init script:
chosen(styling.frames, choice:"frameless art")
}
auto_station := {
not is_prototype() and
(
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 := {
chosen(styling.other_options, choice:"de-fullart special frames")
@@ -255,12 +262,19 @@ init script:
is_dka := {
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 := {
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 := {
chosen(styling.frames, choice:"mutate") and not is_map()
chosen(styling.frames, choice:"mutate") and not is_map() and not is_prototype()
}
mutate_image := {
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())
}
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 := {
@@ -629,10 +643,10 @@ init script:
}
top_of_textbox := {
(
if is_map() then 340
else if is_dka() and is_mutate() then 395
else if is_dka() then 359
if is_snap_prototype() then (if is_dka() then 359 else 329) + 8 + prototype_height()
else if is_map() then 340
else if is_mutate() then 395
else if is_dka() then 359
else 327
) - (-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
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_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 "")
@@ -890,11 +915,18 @@ init script:
]
swap_fonts_body_default := [
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"},
vertical: {0},
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 := [
name: {"Beleren Bold"},
size: {if is_map() then 14 else if auto_station() then 13 else 16},
@@ -907,6 +939,19 @@ init script:
vertical: {0},
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 := {
swap_font_size(
src:styling.custom_pt_font,
@@ -958,6 +1003,81 @@ init script:
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}
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 style:
symbol:
@@ -1003,6 +1123,7 @@ styling field:
choice: frameless art
choice: fullart
choice: puma
choice: prototype
choice: mutate
choice: fnm promo
choice: inverted
@@ -1102,6 +1223,11 @@ styling field:
type: text
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,
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/fonts/styling_fields
styling field:
@@ -1302,7 +1428,34 @@ card style:
always symbol: true
z index: 920
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:
left:
@@ -1442,22 +1595,22 @@ card style:
############################# leveler
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}
top: { if is_dka() and is_mutate() then 359 else if is_mutate() then 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}
bottom: { if is_mutate() then 392 else if is_leveler() then (327+lv_1_height()) else bottom_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_snap_prototype() then 290 else if is_mutate() then 342 else if is_map() then 40 else 29}
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:
name: { body_font() }
italic name: { body_font_italic() }
size: { body_font_size() }
name: { body2_font() }
italic name: { body2_font_italic() }
size: { body2_font_size() }
scale down to: 6
color: { body_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)}
color: { body2_font_color() }
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 y: 1
symbol font:
name: { styling.text_box_mana_symbols }
size: {body_font_size()}
size: {body2_font_size()}
scale down to: 6
alignment:
script:
@@ -1672,16 +1825,16 @@ card style:
shadow displacement y: 1
pt 2:
z index: 900
left: {leveler_pt_left()}
top: {(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}
height: {leveler_pt_height()}
left: {if prototype_pt() then 300 else leveler_pt_left()}
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 prototype_pt() then 45 else if is_leveler() and (not lone_pt() or card.pt_2 != "") then leveler_pt_width() else 0}
height: {if prototype_pt() then 21 else leveler_pt_height()}
alignment: center middle shrink-overflow
font:
name: {pt_font()}
italic name: {pt_font_italic()}
size: {pt_font_size()}
color: {pt_font_color()}
name: {pt2_font()}
italic name: {pt2_font_italic()}
size: {pt2_font_size()}
color: {pt2_font_color()}
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 displacement x: -1
@@ -2010,7 +2163,30 @@ extra card field:
script: card.card_color
save value: 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:
pt box:
@@ -2028,7 +2204,7 @@ extra card style:
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}
z index: 840
visible: { card.pt_2 != "" }
visible: { card.pt_2 != "" and not is_prototype() }
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")}
pt box 3:
@@ -2428,3 +2604,39 @@ extra card style:
render style: image
image: { if stamp_shape() == "triangle" then tri_stamp() else round_stamp() }
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/",
ub: "/magic-modules.mse-include/trims/beyond/",
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 := [
card: "card.png"
@@ -81,6 +84,9 @@ init script:
star: "star.png",
beyond: "beyond.png",
identity: "identity.png"
proto_box: "box.png",
proto_cost: "cost.png",
proto_pt: "pt.png"
]
template := {
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)
}
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 == "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)
@@ -224,6 +230,14 @@ init script:
else 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}
inner_level := {
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_adventure := {chosen(styling.other_options, choice:"adventure") and not is_tale()}
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_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_custom_border := {
if chosen(styling.other_options, choice:"custom border")
@@ -275,8 +290,15 @@ init script:
paragraph_count := replace@(match:"\n", replace:"~")+
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 := {
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_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 "")
@@ -319,6 +341,75 @@ init script:
popout_angle := { popout_coord(4, field:styling.popout_image_style or else "", lim:4) }
use_popunder := { chosen(styling.other_options, choice:"popunder art") }
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 style:
symbol:
@@ -383,6 +474,7 @@ styling field:
choice: nyx
choice: snow
choice: vehicle
choice: prototype
choice: custom border
choice: adventure
choice: reversed adventure
@@ -401,6 +493,11 @@ styling field:
type: boolean
name: default image size
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
styling field:
type: boolean
@@ -555,6 +652,7 @@ card style:
always symbol: true
z index: 920
padding top: 0
card symbol:
left: {if card.card_symbol=="none" then 20 else 25}
top: 21
@@ -754,10 +852,10 @@ card style:
size: {12 - shrink_name2() }
color: white
casting cost 2:
right: {if is_tale() then 345 else 165}
top: {if has_four_abilities() then 288 else 323}
right: {if is_prototype() then 345 else if is_tale() then 345 else 165}
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 }
height: {if use_adv() then 23 else 0}
height: {if use_adv() or is_prototype() then 23 else 0}
alignment: middle right
symbol font:
name: { styling.casting_cost_mana_symbols }
@@ -767,18 +865,31 @@ card style:
z index: 920
padding top: 0
type 2:
left: {if is_tale() then 202 else 22}
top: {348+ shrink_type2()-(if has_four_abilities() then 36 else 0)}
width: 151
height: {if use_adv() then 20 else 0}
alignment: top shrink-overflow
z index: 900
right: {if is_prototype() then 344 else if is_tale() then 353 else 173}
bottom: {if is_prototype() then top_of_textbox() + prototype_height() +1 else 368+ shrink_type2()-(if has_four_abilities() then 36 else 0)}
width: { if is_prototype() then max(20, card_style.type_2.content_width) else 151}
height: {if is_prototype() and styling.prototype_secondary == "type" then proto_secondary_height()-1 else if use_adv() then 20 else 0}
alignment: { if is_prototype() then "top right" else "top shrink-overflow" }
z index: 920
padding top: 2
font:
name: Beleren Bold
size: {11-- shrink_type2()}
color: white
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:
left: {if is_tale() then 198 else 20 }
top: {if has_four_abilities() then 332 else 372}
@@ -1088,6 +1199,31 @@ extra card field:
choice: img
save value: 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:
foil layer:
left: 0
@@ -1529,3 +1665,39 @@ extra card style:
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}
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: /magic-blends.mse-include/new-blends
############################################################## 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
############################################################## Common filters
############################################################## Utility
@@ -154,7 +154,7 @@ crop_safe :=
}
#### Crop out the middle section of an image
internal_crop := {
# given input, image to crop
# given img, image to crop
# given height, height of input
# given width, width of input
# given left/top, minimum left/top edge coordinate
@@ -187,7 +187,6 @@ internal_crop:= {
cut_verti := true
)
)
# rollover large distance
internal_space := if cut_horiz then right - left else if cut_verti then bottom - top else 0
excess_crop := 0