32 lines
1.4 KiB
Python
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()
|