# Limbo model guide [Read as Markdown](/raw/game-model-limbo.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. ## Native station Use asset `limbo`, IDs `limbo:0` through `limbo:4`, floor elevation Y = 0–64 and scale `[1,1,1]`. The native root is `limbo` in the game library. It is a compact machine with a low control deck and a wide result display. Keep its supplied proportions; do not enlarge it into a wall screen by scaling the game entity. Read `games.limbo.controls` for the actual buttons and `runtimeMounts.nodes.screen` for the display. The live display follows the screen's sloped bounds. A front-facing rectangle guessed from a screenshot will not necessarily align with it. ## Controls and live content | Region | Function | |---|---| | Bet | Starts the configured round | | Stake − / + | Adjusts the next stake when allowed | | Target | Opens native settings for the target configuration | | Settings | Opens the supported bet controls | | Main multiplier display | Presents the game result | | Target and stake readouts | Show the current configuration alongside the result | Target is not an uploaded-model field, and a custom mesh named `target` does not become an input. The native client owns result animation, state colors and text. Limbo is not Crash: do not add a Cashout control or a live-flight graph implying that the player can stop a round during its reveal. ## Modeling approach Add separate side caps, a modest pedestal accent or a title sign outside the display's bounds. Keep the native cabinet, screen and control deck. Use the scene's actual body-height reference to assess readability. Raising the whole cabinet off the floor or stretching it vertically changes the relationship to the player's camera and is not supported for games. Keep the display opening wide enough for the central multiplier **and** the target and stake areas to either side. A sign or border that frames only the center number removes useful information. Avoid glossy surfaces directly around the readout if they compete with it visually; roughness and color belong in the static material. Use separate solid props and keep their bounding boxes away from the standing approach. Do not merge a hollow arch into one collider or place another machine immediately in front. Align the rug and decorative pieces with the game's yaw when arranging a row. ## State review Inspect the idle configuration, changing result presentation, completed return/loss state and a long multiplier string in an authorized preview. Check that all numbers fit inside the original screen opening, including edge readouts. The artwork must not contain a fixed multiplier or a decorative green “win” state that conflicts with the actual result. Review from standing eye height, obliquely, and in a portrait viewport. Static Blender renders do not include the live canvas automatically, so use a temporary protected rectangle for layout and confirm the final native display in the client. ## AI brief ```text Get game_skin_contract for limbo 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. ``` See [the complete authoring workflow](/model-authoring-workflow/) for transfer and publication. ## Reference skin sockets (v1 and v2) Read `game_skin_contract({"game":"limbo"})` before saving. The current fingerprint is `e67cd6018aa91874`. 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.8623114, 0, -1.7095449]` through `[2.8623114, 3.0583601, 1.7887485]`. Width, height and depth are `[5.7246228, 3.0583601, 3.4982934]`. 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.7371432, 1.6224991, 1.0508211]` → `[-0.5175686, 1.7244444, 1.5527059]` | | `control.quick` | `quick` | None | BET | `[-0.2352585, 1.6224991, 1.0508211]` → `[0.8626144, 1.7244444, 1.5527059]` | | `control.settings` | `settings` | None | SETTINGS | `[-2.4310042, 1.6224991, 1.0508211]` → `[-1.4899703, 1.7244444, 1.5527059]` | | `control.settings_2` | `settings` | None | TARGET | `[1.3409732, 1.6224991, 1.0508211]` → `[2.3604265, 1.7244444, 1.5527059]` | | `control.stake_down` | `stake_down` | None | − | `[-1.082189, 1.6224991, 1.0508211]` → `[-0.8626144, 1.7244444, 1.5527059]` | 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. Optional static surface: `part.playing_surface`, native reference `top`, world bounds `[-2.6348947, 1.4429186, -1.5213381]` through `[2.6348947, 1.4711496, 1.3958669]`. Its replacement does not move cards, the animation rig or the interaction proxy. Save a skin with `game: "limbo"`, its current fingerprint, a converted `body` hash and the chosen `bindings`. Apply it only to existing `limbo:` 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":"limbo"})`. 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/).