# Native European roulette The graphical roulette table stays inside the MASM game window. It uses a generated first-person felt/table view and a matching close-up of the same bowl. The 37-pocket rotor is a separate precision asset, inverse-sampled and projected onto the bowl ellipse by assembly code. Upright screen-space numerals are drawn separately in MASM so the perspective never squashes or rotates their glyphs. Close-up labels use a crisp 3x5 font at 2x scale; the distant betting view uses 1x scale. A settled pocket has a gold outline and its result is also displayed in the wheel centre. Frame timing, counter-rotating ball motion, camera transition, betting, input and payouts are also assembly. Python only packs art and validates offline fixtures; it is not the runtime. ## Betting and rounds Click a number, including the single zero, or an outside bet. The felt's top, middle and bottom rows are 3/2/1. Supported bets are straight numbers, red/black, even/odd, 1-18/19-36, three dozens and three columns. Split, street, corner and six-line bets are not implemented. Gross multipliers are 36, 2 and 3 respectively; zero loses every outside bet. Chip size is $50 to $1,000,000, adjustable with the plus/minus controls or W/S. Clear/Backspace resets a draft without charging it. Spin/Space charges the complete stake once and starts a 4.2-second spin. The winning number is not printed during the spin. The rotor and ball slow down, the ball moves into the selected pocket, and result/payout stay on screen until BETS, Space or Enter returns to a fresh betting layout. Results cannot be charged or settled again by repeated updates. Escape/EXIT leaves a draft/result immediately; during a spin it queues departure until settlement. Missing art blocks a paid spin and never opens a console fallback. ## Assets and checks - Generated sources: `assets/sprites/wheel/{table,closeup}-v1.png`. - Built-in image generation/edit prompts: `assets/sprites/wheel/prompts-v1.json`. - ANM1 packs: `assets/animations/wheel/{table,closeup}-v1.bin` and `rotor-v2.bin`. - Offline packer: `tools/generators/pack_european_wheel.py`. - Native assertions: `tools/tests/wheel_scene_test.inc`, called by the action suite. - Asset/frame/shipping checks: `tools/tests/check_european_wheel.py --parity`. Native assertions exercise all 37 results with all 49 supported bets, one-time settlement, every numbered cell's input mapping, monotonic millisecond easing, queued departure and result persistence. Six framebuffer captures cover draft, launch, fast/slow rotation, landing and result. The shipping loader probe also loads/frees wheel packs from both the project root and TEMP. Additional native captures cover all 37 settled results and isolated distant and rotating labels. The offline checker compares every foreground digit pixel with an independent font mask, verifies the large central result, and checks that labels never overlap at any of the 512 rotation angles. Small labels write physical framebuffer pixels directly; they do not use the coarser UI grid. The dealer background is currently a static pose. This is a native animated wheel/table scene, not a complete animated croupier performance or a physical simulation of a freely rolling ball. ## Exterior scale fixes Two former stationary indoor-guest sprites near the entrance now use outdoor walking frames and independent curb routes. All six walkers use reduced world dimensions; entrance guards are smaller too. Routes are sampled against the actual exterior map and must remain in empty cells. Indoor guest art is forbidden in the city prop registry. Existing hall tables are about eleven percent smaller; cabinet dimensions, station IDs and saved progress are unchanged.