KAZIK/tools/generators/pack_upper_v2.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

44 lines
1.8 KiB
Python

"""Offline cutout packing; all scene and lever behaviour lives in MASM."""
from pathlib import Path
import struct
from PIL import Image
from pack_guest_cast import isolate
ROOT = Path(__file__).resolve().parents[2]
def save(name, cells, width, height):
frames = []
for cell in cells:
cell = isolate(cell)
scale = min((width-12)/cell.width, (height-12)/cell.height)
size = round(cell.width*scale),round(cell.height*scale)
sprite = cell.resize(size,Image.Resampling.LANCZOS)
sprite.putalpha(sprite.getchannel("A").point(lambda a: 255 if a >= 128 else 0))
frame = Image.new("RGBA",(width,height))
frame.alpha_composite(sprite,((width-size[0])//2,height-6-size[1]))
frames.append(frame)
raw = b"".join(frame.tobytes("raw","BGRA") for frame in frames)
(ROOT/f"assets/animations/hall/{name}.bin").write_bytes(
struct.pack("<4s4I",b"ANM1",width,height,len(frames),len(raw))+raw)
return frames
def main():
portal = Image.open(ROOT/"assets/sprites/hall/upper-portal-v2.png").convert("RGBA")
cells = [portal.crop((c*512,r*512,(c+1)*512,(r+1)*512))
for r in range(3) for c in range(2)]
save("upper-portal-v2",cells[:4],224,320)
save("upper-levers-v2",cells[4:],128,224)
sheet = Image.open(ROOT/"assets/sprites/hall/upper-furniture-v2.png").convert("RGBA")
tables = [sheet.crop((0,0,768,512)),sheet.crop((768,0,1536,512))]
save("upper-games-v2",tables,320,224)
# The approved sheet places the bartender's head above the lower row line.
bartender = sheet.crop((180,400,650,1024))
stool = sheet.crop((860,540,1160,1024))
save("upper-bar-v2",[bartender,stool],160,256)
print("Packed two distinct game tables, full bartender/stool, portal and two lever states")
if __name__ == "__main__":
main()