KAZIK/docs/native-european-roulette.md
Artvasil09 4f8ae0893b Implement native slots, coin toss, European roulette and hall furniture
Add native assembly scenes and assets for Slots (777), Coin flip, and European Roulette; add 3D hall furniture packs and prompts; improve Russian UI strings in CP1251; update launcher hash and rebuild shipping binaries.
2026-10-10 14:43:30 +03:00

57 lines
3.3 KiB
Markdown

# 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.
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.