KAZIK/tools/generators/make_backrooms_assets.py

32 lines
1.4 KiB
Python

"""Offline-only texture packing; runtime generation/rendering stays MASM."""
from pathlib import Path
import struct
from PIL import Image, ImageDraw, ImageFont
ROOT = Path(__file__).resolve().parents[2]
def main():
source = ROOT / 'assets/sprites/backrooms'
frames = []
for name in ('wall', 'floor', 'ceiling', 'ceiling_lamp'):
image = Image.open(source / f'Backrooms_{name}.jpg').convert('RGBA')
image = image.resize((128, 128), Image.Resampling.LANCZOS)
frames.append(image.tobytes('raw', 'BGRA'))
# Exit is an offline-generated material, not a second game implementation.
image = Image.new('RGBA', (128, 128), (36, 60, 38, 255))
draw = ImageDraw.Draw(image)
draw.rectangle((9, 4, 119, 127), fill=(61, 84, 55), outline=(143, 160, 98), width=5)
# Eye-level sign stays visible even when standing in the exit cell.
draw.rectangle((18, 45, 110, 73), fill=(32, 170, 77))
font = ImageFont.truetype('arialbd.ttf', 23)
draw.text((64, 59), 'EXIT', fill='white', font=font, anchor='mm')
draw.rectangle((94, 76, 99, 82), fill=(240, 211, 101))
frames.append(image.tobytes('raw', 'BGRA'))
out = source / 'materials.bin'
out.write_bytes(struct.pack('<5I', 0x314D4E41, 128, 128, len(frames), len(frames)*65536) + b''.join(frames))
print(f'Packed {len(frames)} Backrooms materials: {out.relative_to(ROOT)}')
if __name__ == '__main__':
main()