Add prototype to M15 Mainframe (#165)
--------- Co-authored-by: cajun <12363371+CajunAvenger@users.noreply.github.com>
@@ -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.
|
||||
|
||||
@@ -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 := {
|
||||
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())
|
||||
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:
|
||||
@@ -2023,14 +2199,14 @@ extra card style:
|
||||
render style: image
|
||||
image: { choose_ptbox() }
|
||||
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()}
|
||||
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")}
|
||||
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:
|
||||
left: {leveler_ptbox_left()}
|
||||
top: { l3_center() - (if is_map() then 26 else 15) + leveler_ptbox_top_offset()}
|
||||
@@ -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 != "" }
|
||||
@@ -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
|
||||
@@ -1528,4 +1664,40 @@ extra card style:
|
||||
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"}
|
||||
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 != "" }
|
||||
BIN
data/magic-modules.mse-include/protoboxes/box/abox.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/bbox.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/cbox.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/gbox.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/ibox.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/mbox.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/rbox.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/ubox.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
data/magic-modules.mse-include/protoboxes/box/wbox.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/acost.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/bcost.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/ccost.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/gcost.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/icost.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/mcost.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/rcost.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/ucost.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/magic-modules.mse-include/protoboxes/cost/wcost.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/apt.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/bpt.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/cpt.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/gpt.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/ipt.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/mpt.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/rpt.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/upt.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
data/magic-modules.mse-include/protoboxes/pt/wpt.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
@@ -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
|
||||
@@ -153,8 +153,8 @@ crop_safe :=
|
||||
else crop(input, offset_x: offset_x, offset_y: offset_y, width: width, height: height)
|
||||
}
|
||||
#### Crop out the middle section of an image
|
||||
internal_crop:= {
|
||||
# given input, image to crop
|
||||
internal_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
|
||||
|
||||