# Plinko model guide [Read as Markdown](/raw/game-model-plinko.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. ## Station and footprint Use `plinko:0` through `plinko:4`, asset `plinko`, floor elevation Y = 0–64 and scale `[1,1,1]`. The native root is `plinko`. This is a tall, wide board with a front-side player approach and low controls. Measure the whole cabinet before placing it, not only the triangular peg field. A perimeter location facing the room is a useful starting point. Keep the player's viewing area clear far enough back to see the board on a phone. Rotate all side decorations and walkway pieces with the station; there is no automatic parent relationship between world entities. ## Functional regions and anchors | Region | Keep available | |---|---| | Drop button | The native primary action and its standing approach | | Settings button | Risk and supported bet configuration | | `ball_spawnpoint` | Empty space at the start of the animated path | | `peg__` | All twelve peg rows and the spaces between them | | `bucket_0` … `bucket_12` | All thirteen ending pockets, especially the outermost pair | | Multiplier strip | Dynamic values for the current risk configuration | The current client builds ball trajectories from these native anchors. The ball visually bounces and rotates along the supplied path. This is platform presentation of an accepted result; creators do not upload a rigid-body simulation or make their own pegs determine payouts. Native physical controls are measured in `games.plinko.controls`. Ball, peg and pocket mounts are in `runtimeMounts`. The live multiplier strip occupies a 6.87 × 0.44 plane at `[0,0.20,0.345]` in source-scaled station coordinates: multiply these values by the reference scale when reasoning in world units. The strip is a generated overlay, so a bare GLB viewer will not show all current values. ## Buildable visual changes Add separate outer columns, a side emblem, a base trim piece outside the pocket mouth or a sign beyond the top edge. Keep the original board, pegs, ball and buttons. Do not install an ornamental crossbar over the field: even if it misses every peg, a ball can pass through the space between them. Do not add a second transparent front pane and assume it is non-interactive. Uploaded props have box collision, and the extra geometry can obscure hit targets or create overlapping transparent layers. Use the existing board face and place artwork beyond it. Do not bake multipliers into a texture or engrave fixed payouts into custom pocket labels. Risk changes the native display. Keep the bottom strip fully visible from standing height; a decorative pedestal lip often hides it when viewed from above. ## Animation and layout review Inspect paths to both extreme pockets and the middle, with room in front of the board for the ball's full visible shape. Multiple drops can be visible at once; a single center-path screenshot is insufficient. Check the spawn area, each row, bottom pockets and live multiplier strip in an authorized preview. Look from the normal approach in portrait and landscape. Ensure a neighboring board's columns or props do not cross the view. Keep the Drop and Settings controls readable even when looking down toward the lowest pockets. The nearby primary prompt uses the current key binding and touch equivalent; do not hardcode keyboard instructions on the artwork. ## AI brief ```text Get game_skin_contract for plinko 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. ``` Read [the export workflow](/model-authoring-workflow/) before uploading. ## Reference skin sockets (v1 and v2) Read `game_skin_contract({"game":"plinko"})` before saving. The current fingerprint is `6f0f7d703a2ac31d`. The [live catalog](/game-skin-catalog.json) is authoritative if a copied example differs. The replacement body is fitted to station-local world bounds `[-7.2694868, -0.0392095, -1.0900309]` through `[7.2694868, 9.8181204, 1.9761711]`. Width, height and depth are `[14.5389735, 9.8573299, 3.066202]`. 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.quick` | `quick` | None | DROP | `[-7.0263863, 1.6624376, 0.6983368]` → `[-6.0539847, 2.0125853, 1.6639901]` | | `control.settings` | `settings` | None | SETTINGS | `[6.0539847, 1.6624376, 0.6983368]` → `[7.0263863, 2.0125853, 1.6639901]` | 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: "plinko"`, its current fingerprint, a converted `body` hash and the chosen `bindings`. Apply it only to existing `plinko:` 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":"plinko"})`. 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. Its result-motion channels are `plinko_drop`. Use the per-result progress and zero endpoint offsets described in the contract. Reference dimensions above describe the neutral layout before v2 placement. See the [exact fields, transforms and limits](/game-skin-contract/).