"""Inspect actual ASM framebuffers, not an independently simulated renderer.""" from pathlib import Path import hashlib from PIL import Image ROOT = Path(__file__).resolve().parents[2] OUT = ROOT / "build/actions" def main(): names = ("ready", "deal", "attack", "defense", "flight", "taking", "result", "long-hand", "exit") frames = {} hashes = set() for name in names: frame = Image.open(OUT / f"durak-{name}.bmp").convert("RGB") assert frame.size == (640, 480), name assert len(frame.getcolors(640 * 480)) > 1000, name header = (10, 14, 16) if name == "exit" else (21, 29, 32) assert frame.getpixel((0, 0)) == header, name digest = hashlib.sha256(frame.tobytes()).digest() assert digest not in hashes, f"Duplicate scene: {name}" hashes.add(digest) frames[name] = frame frame.save(OUT / f"durak-{name}.png") # The modal freezes a paid hand, and is inside the same 640x480 framebuffer. assert frames["exit"].getpixel((44, 136)) == (21, 29, 32) assert frames["exit"].getpixel((68, 306)) == (45, 73, 61) assert frames["exit"].getpixel((336, 306)) == (73, 49, 48) # Long hand shows only the last four cards, not a card fan escaping the screen. for x in (20, 55, 90, 125): region = frames["long-hand"].crop((x * 2, 336, (x + 34) * 2, 430)) assert len(region.getcolors(34 * 2 * 94)) >= 3 assert frames["long-hand"].getpixel((x * 2 + 16, 380)) == (238, 237, 226) # Both pagers have the same frame/fill coordinates as their actual hitboxes. assert frames["long-hand"].getpixel((5, 365)) == (213, 199, 158) assert frames["long-hand"].getpixel((609, 365)) == (213, 199, 158) print("PASS: nine distinct native Durak phases, modal/button bounds, paged 36-card hand") if __name__ == "__main__": main()