KAZIK/tools/generators/pack_terminals.py
Artvasil09 797ee366dc feat: implement upper lounge, manual stairs, cabaret, and casino terminals
- Native player-controlled stairs, upper lounge bar, and Hell Tower infernal portal
- Cabaret stage with musical acts, audience seating, and interaction
- Dedicated cash/trophy wall terminals with native balance and achievement screens
- Projecting 3D wall lanterns with ray/plane intersection
- Six roaming guests with seated poses and card rank rendering updates
- Synchronized launcher hash and updated binaries
2026-10-18 21:36:12 +03:00

41 lines
1.6 KiB
Python

"""Offline packing of generated kiosk/lantern art for the assembly renderer."""
from pathlib import Path
import re
import struct
from PIL import Image
ROOT = Path(__file__).resolve().parents[2]
SOURCE = ROOT / "assets/sprites/terminals"
OUT = ROOT / "assets/animations/hall"
def pack(path, frames):
w, h = frames[0].size
raw = b"".join(image.tobytes("raw", "BGRA") for image in frames)
path.write_bytes(struct.pack("<4s4I", b"ANM1", w, h, len(frames), len(raw)) + raw)
def title(image, text, y):
font = bytes(int(x, 16) for x in re.findall(r"\b([0-9A-Fa-f]{3})h\b",
(ROOT / "font8x8.inc").read_text(encoding="cp1251")))
x = (image.width - len(text) * 8) // 2
for n, char in enumerate(text):
for row in range(8):
for col in range(8):
if font[char * 8 + row] & (128 >> col):
image.putpixel((x + n * 8 + col, y + row), (48, 30, 16, 255))
def main():
frames = [Image.open(SOURCE / name).convert("RGBA").resize((256, 512), Image.Resampling.LANCZOS)
for name in ("cash-front-v1.png", "trophy-front-v1.png", "lantern-glass-v1.png", "body-side-rear-v2.png")]
title(frames[0], b"\xca\xc0\xd1\xd1\xc0", 27)
title(frames[1], b"\xc4\xce\xd1\xd2\xc8\xc6\xc5\xcd\xc8\xdf", 25)
pack(OUT / "terminals-v2.bin", frames)
screen = Image.open(SOURCE / "display-v1.png").convert("RGBA").resize((640, 480), Image.Resampling.LANCZOS)
pack(OUT / "terminal-screen-v1.bin", [screen])
print("Packed four 256x512 world materials, including a dedicated equipment enclosure, and one 640x480 screen")
if __name__ == "__main__":
main()