"""Inspect native party table captures and compare tested/shipping MASM.""" import argparse import hashlib from pathlib import Path from PIL import Image, ImageChops, ImageDraw, ImageStat from check_card_exit_build import Coff ROOT = Path(__file__).resolve().parents[2] def frames(): names = ["1", "2", "3", "flight", "result", "exit"] sheet = Image.new("RGB", (1280, 3 * 504), (20, 25, 29)) draw = ImageDraw.Draw(sheet) signatures = [] captured = {} for i, name in enumerate(names): path = ROOT / "build/actions" / f"blackjack-party-{name}.bmp" image = Image.open(path).convert("RGB") captured[name] = image assert image.size == (640, 480) assert len(image.getcolors(640 * 480)) > 1000, name assert sum(ImageStat.Stat(image.crop((0, 444, 640, 476))).stddev) > 10, name signatures.append(hashlib.sha256(image.tobytes()).digest()) image.save(path.with_suffix(".png")) x, y = (i % 2) * 640, (i // 2) * 504 sheet.paste(image, (x, y + 24)) draw.text((x + 8, y + 6), f"Native blackjack: {name}", fill="white") assert len(set(signatures)) == len(names) for number, box in (("2", (248, 132, 392, 240)), ("3", (472, 132, 616, 240))): difference = ImageChops.difference(captured[number].crop(box), captured["1"].crop(box)) assert sum(ImageStat.Stat(difference).mean) > 15, f"Guest {number} did not render" sheet.save(ROOT / "build/actions/blackjack-party-contact.png") print("PASS: six distinct native party-table captures, visible portraits, cards, controls and exit modal") def parity(): tested = Coff(ROOT / "build/actions/actions-test.obj") shipping = Coff(ROOT / "build/graphics/poker.obj") for name, size in (("InitBJParty3D", 0), ("FreeBJParty3D", 0), ("DealBJParty3D", 0), ("FinishBJPlayer3D", 4), ("BeginBJDealer3D", 0), ("BJBotDecision3D", 4), ("UpdateBJParty3D", 0), ("ResolveBJParty3D", 0), ("BJPartyInput3D", 0), ("SetBJPartyCount3D", 4), ("RenderBJParty3D", 0), ("DrawBJPartySelector3D", 0), ("DrawBJMiniCard3D", 16), ("DrawBJMiniFlight3D", 16), ("NativeBJSettle3D", 4), ("StartNativeBlackjack3D", 0), ("HandleNativeBlackjack3D", 0), ("RenderNativeBlackjack3D", 0)): symbol = f"_{name}@{size}" assert tested.signature(symbol) == shipping.signature(symbol), name print("PASS: shipping party dealing, AI, settlement, animation and input match native-tested MASM") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--parity", action="store_true") args = parser.parse_args() frames() if args.parity: parity()