Changed the image assembly into 2D instead of vertical.
parent
a1d5c81a06
commit
a5f586f1be
29
deploy.py
29
deploy.py
|
@ -9,6 +9,7 @@ import sys
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
import certifi
|
import certifi
|
||||||
|
import math
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from mutagen.oggvorbis import OggVorbis
|
from mutagen.oggvorbis import OggVorbis
|
||||||
from distutils.dir_util import copy_tree
|
from distutils.dir_util import copy_tree
|
||||||
|
@ -143,23 +144,24 @@ def fetch_and_cut_song(tape, ffmpeg_version):
|
||||||
def assemble_png_image(tapes, icons=False):
|
def assemble_png_image(tapes, icons=False):
|
||||||
if icons:
|
if icons:
|
||||||
img_names = [f"./source/images/{tape['identifier']}_icon.png" for tape in tapes]
|
img_names = [f"./source/images/{tape['identifier']}_icon.png" for tape in tapes]
|
||||||
images = [Image.open("./source/images/boombox_icon.png")]
|
|
||||||
else:
|
else:
|
||||||
img_names = [f"./source/images/{tape['identifier']}.png" for tape in tapes]
|
img_names = [f"./source/images/{tape['identifier']}.png" for tape in tapes]
|
||||||
images = []
|
|
||||||
|
|
||||||
images += [Image.open(x) for x in img_names]
|
images = [Image.open(x) for x in img_names]
|
||||||
widths, heights = zip(*(i.size for i in images))
|
widths, heights = zip(*(i.size for i in images))
|
||||||
|
|
||||||
total_width = max(widths)
|
columns = int((len(images))**0.5)
|
||||||
max_height = sum(heights)
|
rows = int(math.ceil(len(images) / columns))
|
||||||
|
|
||||||
|
total_width = max(widths) * columns
|
||||||
|
max_height = max(heights) * rows
|
||||||
|
|
||||||
new_im = Image.new('RGBA', (total_width, max_height))
|
new_im = Image.new('RGBA', (total_width, max_height))
|
||||||
|
|
||||||
y_offset = 0
|
for i, im in enumerate(images):
|
||||||
for im in images:
|
x_offset = max(widths) * (i % columns)
|
||||||
new_im.paste(im, (0, y_offset))
|
y_offset = max(heights) * math.floor(i / columns)
|
||||||
y_offset += im.size[1]
|
new_im.paste(im, (x_offset, y_offset))
|
||||||
|
|
||||||
if icons:
|
if icons:
|
||||||
new_im.save("./build/icons.png")
|
new_im.save("./build/icons.png")
|
||||||
|
@ -199,6 +201,7 @@ def prepare_images(data, config):
|
||||||
|
|
||||||
logging.info(f"copying other images")
|
logging.info(f"copying other images")
|
||||||
shutil.copy("./source/images/boombox.png", "./build/boombox.png")
|
shutil.copy("./source/images/boombox.png", "./build/boombox.png")
|
||||||
|
shutil.copy("./source/images/boombox_icon.png", "./build/boombox_icon.png")
|
||||||
shutil.copy("./source/images/PreviewImage.png", "./build/PreviewImage.png")
|
shutil.copy("./source/images/PreviewImage.png", "./build/PreviewImage.png")
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,6 +216,9 @@ def build_xml_code(data, config):
|
||||||
condition_delta = [f"{1 / use_length:0.5f}" for use_length in use_lengths]
|
condition_delta = [f"{1 / use_length:0.5f}" for use_length in use_lengths]
|
||||||
affliction_delta = [100 / song_length for song_length in song_lengths]
|
affliction_delta = [100 / song_length for song_length in song_lengths]
|
||||||
|
|
||||||
|
columns = int((len(data))**0.5)
|
||||||
|
positions = [{"column": i % columns, "row": math.floor(i / columns)} for i in range(len(data))]
|
||||||
|
|
||||||
logging.info(f"creating jinja environment")
|
logging.info(f"creating jinja environment")
|
||||||
# create jinja2 environment
|
# create jinja2 environment
|
||||||
j2env = j2.Environment(loader=j2.FileSystemLoader(Path(".")))
|
j2env = j2.Environment(loader=j2.FileSystemLoader(Path(".")))
|
||||||
|
@ -237,11 +243,12 @@ def build_xml_code(data, config):
|
||||||
output_file.write(template1.render(tapes=data, config=config,
|
output_file.write(template1.render(tapes=data, config=config,
|
||||||
condition_delta=condition_delta,
|
condition_delta=condition_delta,
|
||||||
affliction_delta=affliction_delta,
|
affliction_delta=affliction_delta,
|
||||||
song_lengths=song_lengths))
|
song_lengths=song_lengths,
|
||||||
|
positions=positions))
|
||||||
|
|
||||||
with open(f"./build/{config['slug']}_style.xml", "w+", encoding="utf8") as output_file:
|
with open(f"./build/{config['slug']}_style.xml", "w+", encoding="utf8") as output_file:
|
||||||
# render the template
|
# render the template
|
||||||
output_file.write(template2.render(tapes=data, config=config))
|
output_file.write(template2.render(tapes=data, config=config, positions=positions))
|
||||||
|
|
||||||
|
|
||||||
def deploy(config):
|
def deploy(config):
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
<UIStyle file="Mods/{{ config['name'] }}/{{ config['slug'] }}_style.xml" />
|
<UIStyle file="Mods/{{ config['name'] }}/{{ config['slug'] }}_style.xml" />
|
||||||
<None file="Mods/{{ config['name'] }}/icons.png" />
|
<None file="Mods/{{ config['name'] }}/icons.png" />
|
||||||
<None file="Mods/{{ config['name'] }}/covers.png" />
|
<None file="Mods/{{ config['name'] }}/covers.png" />
|
||||||
<None file="Mods/{{ config['name'] }}/boombox.png" />{% for tape in tapes %}
|
<None file="Mods/{{ config['name'] }}/boombox.png" />
|
||||||
|
<None file="Mods/{{ config['name'] }}/boombox_icon.png" />{% for tape in tapes %}
|
||||||
<None file="Mods/{{ config['name'] }}/music/{{ tape["identifier"] }}.ogg" />
|
<None file="Mods/{{ config['name'] }}/music/{{ tape["identifier"] }}.ogg" />
|
||||||
<None file="Mods/{{ config['name'] }}/music/{{ tape["identifier"] }}-walkman.ogg" />{% endfor %}
|
<None file="Mods/{{ config['name'] }}/music/{{ tape["identifier"] }}-walkman.ogg" />{% endfor %}
|
||||||
<None file="Mods/{{ config['name'] }}/sound_effects/boombox_insert_cassette.ogg" />
|
<None file="Mods/{{ config['name'] }}/sound_effects/boombox_insert_cassette.ogg" />
|
||||||
|
|
|
@ -198,7 +198,7 @@
|
||||||
</TitleText>
|
</TitleText>
|
||||||
{% for tape in tapes %}
|
{% for tape in tapes %}
|
||||||
<{{ config['slug'] }}_cover_{{ tape.identifier }} color="255,255,255,255" textcolor="0,0,0,255">
|
<{{ config['slug'] }}_cover_{{ tape.identifier }} color="255,255,255,255" textcolor="0,0,0,255">
|
||||||
<Sprite name="{{ config['slug'] }}_cover_{{ tape.identifier }}" texture="Mods/{{ config['name'] }}/covers.png" size="0.0, 0.0" sourcerect="0,{{ loop.index0*328 }},512,328" origin="0.5,0.5" compress="false" tile="false"/>
|
<Sprite name="{{ config['slug'] }}_cover_{{ tape.identifier }}" texture="Mods/{{ config['name'] }}/covers.png" size="0.0, 0.0" sourcerect="{{ 512 * positions[loop.index0]['column'] }},{{ 328 * positions[loop.index0]['row'] }},512,328" origin="0.5,0.5" compress="false" tile="false"/>
|
||||||
</{{ config['slug'] }}_cover_{{ tape.identifier }}>{% endfor %}
|
</{{ config['slug'] }}_cover_{{ tape.identifier }}>{% endfor %}
|
||||||
|
|
||||||
<ita_document1 color="255,255,255,255" textcolor="0,0,0,255">
|
<ita_document1 color="255,255,255,255" textcolor="0,0,0,255">
|
||||||
|
|
|
@ -200,7 +200,7 @@
|
||||||
</TitleText>
|
</TitleText>
|
||||||
{% for tape in tapes %}
|
{% for tape in tapes %}
|
||||||
<{{ config['slug'] }}_cover_{{ tape.identifier }} color="255,255,255,255" textcolor="0,0,0,255">
|
<{{ config['slug'] }}_cover_{{ tape.identifier }} color="255,255,255,255" textcolor="0,0,0,255">
|
||||||
<Sprite name="{{ config['slug'] }}_cover_{{ tape.identifier }}" texture="Mods/{{ config['name'] }}/covers.png" size="0.0, 0.0" sourcerect="0,{{ loop.index0*328 }},512,328" origin="0.5,0.5" compress="false" tile="false"/>
|
<Sprite name="{{ config['slug'] }}_cover_{{ tape.identifier }}" texture="Mods/{{ config['name'] }}/covers.png" size="0.0, 0.0" sourcerect="{{ 512 * positions[loop.index0]['column'] }},{{ 328 * positions[loop.index0]['row'] }},512,328" origin="0.5,0.5" compress="false" tile="false"/>
|
||||||
</{{ config['slug'] }}_cover_{{ tape.identifier }}>{% endfor %}
|
</{{ config['slug'] }}_cover_{{ tape.identifier }}>{% endfor %}
|
||||||
<InnerGlow color="255,255,255,204" hovercolor="255,255,255,204" selectedcolor="255,255,255,204">
|
<InnerGlow color="255,255,255,204" hovercolor="255,255,255,204" selectedcolor="255,255,255,204">
|
||||||
<Sprite texture="Content/UI/InnerGlow.png" sourcerect="0,0,512,384" slice="128,128,384,256" />
|
<Sprite texture="Content/UI/InnerGlow.png" sourcerect="0,0,512,384" slice="128,128,384,256" />
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<RequiredItem identifier="fpgacircuit" />
|
<RequiredItem identifier="fpgacircuit" />
|
||||||
</Fabricate>
|
</Fabricate>
|
||||||
<Upgrade gameversion="0.9.2.0" scale="0.5" />
|
<Upgrade gameversion="0.9.2.0" scale="0.5" />
|
||||||
<InventoryIcon texture="Mods/{{ config['name'] }}/icons.png" sourcerect="0,0,64,64" origin="0.5,0.5" />
|
<InventoryIcon texture="Mods/{{ config['name'] }}/boombox_icon.png" sourcerect="0,0,64,64" origin="0.5,0.5" />
|
||||||
<Sprite texture="Mods/{{ config['name'] }}/boombox.png" sourcerect="0,0,100,60" depth="0.55" origin="0.5,0.5" />
|
<Sprite texture="Mods/{{ config['name'] }}/boombox.png" sourcerect="0,0,100,60" depth="0.55" origin="0.5,0.5" />
|
||||||
<Body width="100" height="60" />
|
<Body width="100" height="60" />
|
||||||
<LightComponent LightColor="0.0,0.85,0.0,0.7" range="4" powerconsumption="0" blinkfrequency="0" IsOn="false" canbeselected="false">
|
<LightComponent LightColor="0.0,0.85,0.0,0.7" range="4" powerconsumption="0" blinkfrequency="0" IsOn="false" canbeselected="false">
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
<RequiredItem identifier="fpgacircuit" />
|
<RequiredItem identifier="fpgacircuit" />
|
||||||
</Fabricate>
|
</Fabricate>
|
||||||
<Upgrade gameversion="0.9.2.0" scale="0.5" />
|
<Upgrade gameversion="0.9.2.0" scale="0.5" />
|
||||||
<InventoryIcon texture="Mods/{{ config['name'] }}/icons.png" sourcerect="0,0,64,64" origin="0.5,0.5" />
|
<InventoryIcon texture="Mods/{{ config['name'] }}/boombox_icon.png" sourcerect="0,0,64,64" origin="0.5,0.5" />
|
||||||
<Sprite texture="Mods/{{ config['name'] }}/boombox.png" sourcerect="0,0,100,60" depth="0.55" origin="0.5,0.5" />
|
<Sprite texture="Mods/{{ config['name'] }}/boombox.png" sourcerect="0,0,100,60" depth="0.55" origin="0.5,0.5" />
|
||||||
<Body width="100" height="60" />
|
<Body width="100" height="60" />
|
||||||
<LightComponent LightColor="0.0,0.85,0.0,0.7" range="4" powerconsumption="0" blinkfrequency="0" IsOn="false" canbeselected="false">
|
<LightComponent LightColor="0.0,0.85,0.0,0.7" range="4" powerconsumption="0" blinkfrequency="0" IsOn="false" canbeselected="false">
|
||||||
|
@ -129,8 +129,8 @@
|
||||||
<RequiredItem identifier="{% if config['slug'] != "sunken_tapes" %}{{ config["slug"] }}-{% endif %}cassette-blank" />
|
<RequiredItem identifier="{% if config['slug'] != "sunken_tapes" %}{{ config["slug"] }}-{% endif %}cassette-blank" />
|
||||||
<RequiredItem identifier="fpgacircuit" />
|
<RequiredItem identifier="fpgacircuit" />
|
||||||
</Fabricate>
|
</Fabricate>
|
||||||
<InventoryIcon texture="Mods/{{ config['name'] }}/icons.png" sourcerect="0,{{ loop.index0*41 + 64 }},64,41" origin="0.5,0.5" />
|
<InventoryIcon texture="Mods/{{ config['name'] }}/icons.png" sourcerect="{{ 64 * positions[loop.index0]['column'] }},{{ 41 * positions[loop.index0]['row'] }},64,41" origin="0.5,0.5" />
|
||||||
<Sprite texture="Mods/{{ config['name'] }}/icons.png" sourcerect="0,{{ loop.index0*41 + 64 }},64,41" depth="0.6" origin="0.5,0.5" />
|
<Sprite texture="Mods/{{ config['name'] }}/icons.png" sourcerect="{{ 64 * positions[loop.index0]['column'] }},{{ 41 * positions[loop.index0]['row'] }},64,41" depth="0.6" origin="0.5,0.5" />
|
||||||
<Body width="48" height="48" />
|
<Body width="48" height="48" />
|
||||||
<Throwable slots="Any,RightHand,LeftHand" holdpos="5,-65" holdangle="0" handle1="0,1" throwforce="4.0" aimpos="35,-10" msg="ItemMsgPickUpSelect">
|
<Throwable slots="Any,RightHand,LeftHand" holdpos="5,-65" holdangle="0" handle1="0,1" throwforce="4.0" aimpos="35,-10" msg="ItemMsgPickUpSelect">
|
||||||
<StatusEffect type="OnImpact" target="This" Condition="-5.0" disabledeltatime="true">
|
<StatusEffect type="OnImpact" target="This" Condition="-5.0" disabledeltatime="true">
|
||||||
|
|
Loading…
Reference in New Issue