# Video Poker model guide [Read as Markdown](/raw/game-model-videopoker.md) · [All game guides](/betting-models/) · [Measured native reference](/game-model-reference.json) ## Replacement skin support This game supports the [v2 skin contract](/game-skin-contract/). Replace the visible body and the exact named physical meshes listed at the end of this page. Use the surround and trim suggestions below to add matching scenery. Preserve the functional regions and state-dependent clearances described here. ## Cabinet identity Use `videopoker:0` through `videopoker:4`, asset `videopoker`, floor elevation Y = 0–64 and scale `[1,1,1]`. The native root is `videopoker` in the game library. Use its current `controls` array for the physical button bounds; the cabinet already has an authored control deck. Do not confuse source GLB units with generated UI units. The native body uses the game source scale; the live poker screen below is specified directly in station-local world units. The bridge handles the body scale. Applying that scale again to the screen measurements misaligns the design. ## Controls to preserve | Native region | Behavior | |---|---| | Deal / Draw | Deals the first five cards, then draws replacements according to the hand state | | Five physical Hold buttons | Correspond to card indices 0–4 from left to right | | Five clickable card regions | Also toggle the corresponding Hold selection | | Stake − / + | Configure a future stake when allowed | | Settings | Opens the native bet controls | | Paytable | Opens the supported settings/paytable interface | | Screen | Shows the paytable, five cards, held state, instructions and result | Hold is a per-card selection, not a new wager. Preserve the alignment between each button and its card. After settlement, Hold controls should no longer imply an editable hand; the client controls availability and highlighting. Do not add a sixth card slot or separate fake Draw button. ## Exact live screen reference The main screen center is `[0,2.80,0.51]`, width 3.82 and height 2.865, in **station-local world coordinates, Y up**. Its source canvas is 960 × 720, a 4:3 aspect ratio. Keep the whole rectangle visible, including the upper paytable and lower status text. For each `i` in 0…4, the transparent card interaction target has: ```text Get game_skin_contract for videopoker and download my current world draft. Build an original [theme] replacement body in Blender using the reference socket measurements and the preserved gameplay regions described in this guide. Upload static body/button assets; bind only the listed control/part sockets. Keep native labels, game values and collision. Use supported v2 placements, clips and result-motion channels for presentation changes. Save with game_skin_save and the current revision. Inspect the fitted model and report budgets and reviewed states. Do not upload code or publish via MCP. ``` Use [betting-interfaces.json](/betting-interfaces.json) for the same values as structured data. Its historical generated `deck` describes a fallback deck that is hidden when the authored native buttons exist. For the **current physical controls**, use [game-model-reference.json](/game-model-reference.json), not that fallback deck. ## Build the surround Model separate side panels, base accents or a small marquee beyond the existing bezel. Keep the native cabinet visible. Avoid an all-in-one arch: its box collider can fill the player's access space. A thick new bezel can overlap the first/last card or the upper paytable even if the central cards look fine. Use restrained texture detail near the cards. Do not bake sample cards, a winning hand, held indicators or a payout table into the decorative texture. Betworld renders the current cards and authoritative display content. A local Blender animation is not exported as a replacement card-flip animation. ## Review states and common failures Inspect idle card backs, the dealt hand, a mixture of held and unheld cards, drawing and a completed result in an authorized preview. The live card flip stays on the native screen, while physical Hold buttons highlight independently. Both interaction routes must remain visible and reachable. Check the entire 4:3 screen on a narrow phone, with room for the nearby controls prompt. Typical failures are a marquee covering the paytable, side trim covering card 0 or 4, a deep front panel hiding the Hold bank, or double scaling the cabinet. Moving custom artwork fixes these; moving native buttons is not supported. ## AI brief ```text Get game_skin_contract for videopoker and download my current world draft. Build an original [theme] replacement body in Blender using the reference socket measurements and the preserved gameplay regions described in this guide. Upload static body/button assets; bind only the listed control/part sockets. Keep native labels, game values and collision. Use supported v2 placements, clips and result-motion channels for presentation changes. Save with game_skin_save and the current revision. Inspect the fitted model and report budgets and reviewed states. Do not upload code or publish via MCP. ``` ## Reference skin sockets (v1 and v2) Read `game_skin_contract({"game":"videopoker"})` before saving. The current fingerprint is `9068759bd813612a`. The [live catalog](/game-skin-catalog.json) is authoritative if a copied example differs. The replacement body is fitted to station-local world bounds `[-2.3212169, 0, -1.2939215]` through `[2.3212169, 5.6932551, 1.984013]`. Width, height and depth are `[4.6424338, 5.6932551, 3.2779346]`. These values already include source scale. Entity scale remains `[1,1,1]`. | Accepted binding slot | Fixed native action | Fixed index / seat | Native label | World-space bounds, minimum → maximum | |---|---|---|---|---| | `control.stake_up` | `stake_up` | None | + | `[-0.6665657, 1.3088213, 1.3096055]` → `[-0.4313072, 1.4107667, 1.7958063]` | | `control.quick` | `quick` | None | DEAL / DRAW | `[-0.2431004, 1.3088213, 1.3096055]` → `[0.9331919, 1.4107667, 1.7958063]` | | `control.hold_1` | `hold` | index 1 | HOLD | `[-0.998211, 1.3088213, 0.4940428]` → `[-0.386539, 1.4107667, 0.8861402]` | | `control.hold_2` | `hold` | index 2 | HOLD | `[-0.2978777, 1.3088213, 0.4940428]` → `[0.3137943, 1.4107667, 0.8861402]` | | `control.hold_3` | `hold` | index 3 | HOLD | `[0.4024557, 1.3088213, 0.4940428]` → `[1.0141277, 1.4107667, 0.8861402]` | | `control.hold_4` | `hold` | index 4 | HOLD | `[1.102789, 1.3088213, 0.4940428]` → `[1.714461, 1.4107667, 0.8861402]` | | `control.hold_0` | `hold` | index 0 | HOLD | `[-1.6985444, 1.3088213, 0.4940428]` → `[-1.0868724, 1.4107667, 0.8861402]` | | `control.settings` | `settings` | None | PAYTABLE | `[-2.0467486, 1.3088213, 1.3096055]` → `[-1.2782376, 1.4107667, 1.7958063]` | | `control.settings_2` | `settings` | None | SETTINGS | `[1.3723411, 1.3088213, 1.3096055]` → `[2.1408521, 1.4107667, 1.7958063]` | | `control.stake_down` | `stake_down` | None | − | `[-1.0272953, 1.3088213, 1.3096055]` → `[-0.7920368, 1.4107667, 1.7958063]` | Only `slot` and the converted model `asset` hash go in each binding. Action, index and seat columns explain platform behavior; **do not copy them into uploaded JSON**. All listed sockets are optional visual overrides. Omitted sockets retain native meshes. Repeated Settings actions are distinct physical sockets and must use the exact listed ID. The catalog provides exact mesh-local `localBounds` for fitting and the full `matrixSource` for native orientation. Save a skin with `game: "videopoker"`, its current fingerprint, a converted `body` hash and the chosen `bindings`. Apply it only to existing `videopoker:` entities. Declare each binding in the skin manifest. Follow [the exact manifest and fitting rules](/game-skin-contract/) and [the export workflow](/model-authoring-workflow/). ## V2 layout and animation Fetch `game_skin_contract({"game":"videopoker"})`. Use `presentation.targets` to position the body, complete display and each listed physical control. Control labels and clickable proxies follow their target; action/index/seat identity stays the same. Numeric `idle` and `result` clips are supported. Use a `result` clip on `display` to animate the live presentation; this game has no separate card/coin/ball motion channel. Reference dimensions above describe the neutral layout before v2 placement. See the [exact fields, transforms and limits](/game-skin-contract/).