# Native Game Actions The existing casino hall and mini-game screens are preserved. Gameplay and animation run in MASM32 in the same 2.5D window, without Python at runtime. ## Dice Choose even/odd with 1/2, adjust the stake with W/S or Up/Down, and throw with Space. Two projected cubes rotate, fly, bounce and settle over 1600 ms. The result is chosen once before the animation; rendering cannot reroll it. Opposite faces add to seven. Space returns from the result to the next bet. ## Russian Roulette The existing revolver table now starts the native scene instead of the old console game. Select 1-3 cartridges with 1/2/3, adjust the stake with W/S or Up/Down, then Space. Loading takes 1800 ms and the table spin 1400 ms. Space on the player turn raises the revolver. Empty chambers alternate turns without randomizing the cylinder again. A dealer hit pays back twice the stake. A player hit transitions through interference, darkness, an eight-frame G-man scene and interference over the casino hall, then returns to walking. Escape pauses a paid roulette round; another Escape resumes it. Escape from the ready/result screen returns to the hall. Other paid games retain their existing Escape behavior. F11 remains the existing fullscreen toggle. Optional voice-over: `assets/audio/gman-wakeup.wav`. The G-man scene currently lasts 4200 ms; adjust `rr3d_durations` to fit a longer recording when adding it. Generated sprite sheets and prompts are in `assets/sprites/roulette/`. The runtime atlas is `assets/animations/roulette/roulette-scenes.bin`. ## Audio Repairs Assignments from the old console source were checked against `backups/poker_before_doom_engine_20260923_040745.asm`. Older graphical backups already contained wrong assignments, so they were not blindly restored. | Event | Recording | | --- | --- | | Card dealing | `playing_cards_deck_flick_through_001_20485.wav` | | Casino roulette wheel | `roulette-wheel-throw-2.wav` | | Revolver loading/spin | `toy-gun-revolver-close-chamber-spin_f1ruc5nd.wav` | | Revolver empty chamber | `revolverdryfirec.wav` | | Revolver shot | `b05e1ac8be34248.wav` | | Slot spin | `hKhoJArfEGAxxMewx0UQiddakTdBjFc.wav` | | Cups moving | `moving-stone.wav` | | Coin throw | Original coin-throw recording | | Slot jackpot / zero payout | Original jackpot recording | | Bank goal reached | `victory-tf2.wav` | | Empty bank | Original bankruptcy recording | | UI, dice, ordinary results, skill checks | Short original PCM effects in `assets/audio/generated/` | Native audio assignments and playback are separated into `audio_data.inc` and `audio_code.inc`. UI ticks yield to ongoing actions. WAV playback uses explicit filename/asynchronous/no-default flags, following the [WinMM documentation](https://learn.microsoft.com/en-us/previous-versions/dd743680(v=vs.85)). Legacy games initialize their original MCI aliases on entry and close them on exit. Original audio files were not modified. Existing console-game procedures, the hall renderer, movement, textures and saves were not replaced. ## Build And Verify `powershell -File tools/tests/build_graphics.ps1` builds `build/graphics/poker.exe`. When the MASM32 import libraries lack newer console APIs, the build uses the installed Windows SDK import libraries first. `powershell -File tools/tests/test_casino_actions.ps1` compiles and runs the actual MASM handlers/renderer without creating a window or saving a profile. It checks audio routing, dice settlement, 2000 roulette rounds, payouts, cylinder conservation and automatic return. Native frame-buffer snapshots are saved in `build/actions/`. `python tools/tests/check_audio_bindings.py` verifies all paths and opens the WAV recordings through Windows MCI without playing them. Offline regeneration only: ``` python tools/generators/pack_roulette_scenes.py python tools/generators/generate_game_sfx.py ``` Manual fullscreen/input playtesting still needs a visible desktop. During this change the game created one responsive graphical window, but Computer Use capture timed out; fullscreen and live controls were not visually verified.