KAZIK/docs/native-slots.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

3.4 KiB

Native 777

The 777 cabinet in the hall now opens a playable first-person graphical slot machine, rather than the unavailable panel or a console routine. Runtime rules, input, reel movement, sprite clipping and bank settlement are MASM only.

Rules

There is one paying line: the middle symbol on each of three independent drums. Each drum has 20 stops, with these symbol counts: cherries 5, lemon 4, grapes 3, bell 3, BAR 2, seven 1, diamond 1 and crown 1. Stops are sampled once when the stake is charged; animation and repeated renderer calls cannot reroll them.

Three matches pay gross multipliers: seven 100, cherries 8, lemon 10, bell 15, BAR 25, grapes 12, diamond 60 and crown 150. Exactly two cherries pay 2x; any other exact pair returns 1x. No match pays nothing. Gross payouts include the charged stake. Under uniformly sampled stops the configured return is 7202 / 8000 = 90.025%; this is not a guarantee of individual-session results.

Stake choices are 10, 50, 100, 500, 1000, 5000 and 10000. The native bank cap remains 1000000000. Stakes are saved immediately and outcomes are settled and saved once. An insufficient bankroll never starts a paid spin.

Interaction

Space/Enter and the spin button start one spin; W/S, arrow keys or the minus/plus buttons change the stake between spins. P or the payouts button opens a separate paytable. Escape first closes that overlay without leaving the machine.

During a spin, Escape or the header exit button queues a return to the same hall position after all three drums stop and the payout is saved. It does not pause, refund, forfeit a valid result, or allow another stake to be queued. Closing the application before settlement retains the already deducted stake; resumable pending rounds are not implemented.

Art And Timing

The cabinet and eight symbol sprites were generated with the built-in image_gen tool in the existing detailed retro pixel-art direction. Source assets and exact prompts are in assets/sprites/slots/; the project does not depend on the tool's external image cache. pack_slot_assets.py normalizes them offline to one opaque 640x480 cabinet and eight alpha-tested 64x64 symbols in ANM1 packs.

Reels move through their complete strips with a monotonic quadratic ease-out, stopping at 1800, 2400 and 3000 milliseconds. Icons are clipped to each reel's window; neighboring cabinet artwork cannot be overwritten. The opaque cabinet uses a direct framebuffer copy rather than alpha sampling every background pixel. No pre-rendered spin video, C game implementation or frame-dependent RNG is used.

Verification

test_casino_actions.ps1 -SkipPreview includes 8000 stop combinations, 500 complete spins at four update rates, millisecond-by-millisecond monotonicity, idempotent payout, maximum-bank handling, missing/malformed assets, insufficient stakes, paytable and queued exit checks. Test saves remain disabled in the native test build. check_slot_frames.py checks eight real MASM framebuffer snapshots, sequential stops and symbol clipping. check_slot_build.py compares the shipping and test COFF code for every slot handler. test_street_asset_paths.ps1 also initializes/frees the shipping native slot cabinet from project-root and TEMP working directories, without launching a window.

CloverPit, talisman effects, native achievements and slot-specific profile statistics still need separate integration; the native 777 does not call their legacy console implementations.