From 3a39a020e4449bc4d6f728ef837cffb9f7bd0c56 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Sat, 3 Oct 2026 19:46:54 -0400 Subject: feat: new casino game: plinko --- building_guide/rooms.md | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'building_guide/rooms.md') diff --git a/building_guide/rooms.md b/building_guide/rooms.md index 9cb93b1..f1e1712 100644 --- a/building_guide/rooms.md +++ b/building_guide/rooms.md @@ -246,7 +246,7 @@ Multiplayer table fields (`casino_tables`): | Field | Type | Default | Notes | |---|---|---|---| | `id` | string | — | Required. Nonempty, no surrounding whitespace, unique among the room's tables and machines. | -| `game` | string | — | Required. `blackjack`, `baccarat`, `roulette`, `craps`, `paigow`, or `video_poker`. | +| `game` | string | — | Required. `blackjack`, `baccarat`, `roulette`, `craps`, `paigow`, `video_poker`, or `plinko`. | | `max_players` | int | 8 | 0–64. Video poker is forced to 1; Pai Gow caps at 6. | | `betting_ticks` | int | 20 | 0–3600. | | `min_bet` | int | 1 | Must not exceed `max_bet`. | @@ -255,6 +255,27 @@ Multiplayer table fields (`casino_tables`): Game rules are nested in a block named after the game. `id` and `game` are the only required keys; omitted numeric fields keep their defaults. +#### Plinko + +Plinko is a single-seat fixture under `casino_tables`, addressed with `play plinko`: + +```yaml +casino_tables: + - id: plinko + game: plinko + min_bet: 1 + max_bet: 10000 + plinko: + rtp: 98 +``` + +| Field | Type | Default | Notes | +|---|---|---|---| +| `rtp` | int | 98 | Target return-to-player percentage, 31–100. | + +`max_players` may only be omitted, `0`, or `1`. Bet limits are per ball, and +`max_bet` cannot exceed 10000000. + #### Blackjack ```yaml @@ -402,7 +423,7 @@ casino_machines: |---|---|---|---| | `id` | string | — | Required; same rules as table IDs. | | `game` | string | — | Required; only `slots`. | -| `variant` | string | `huff_and_even_more_puff` | Registered in Go (`slotVariants` in `internal/casino/registry.go`); an unregistered name is rejected. | +| `variant` | string | `huff_and_even_more_puff` | Must be a registered slot variant; an unregistered name is rejected. | | `min_bet` | int | 1 | | | `max_bet` | int | 1000000 | Must be at least `min_bet`. | | `spin_ticks` | int | 2 | 0–3600. | @@ -422,8 +443,7 @@ invalid room casino configurations. Unknown fields are rejected. seat counts, split counts, decks, and payouts are rejected. - Payouts and shuffle fractions must be finite (no NaN or infinity). - Editing a room hot-reconfigures an **idle** table or machine on the next - lookup; an occupied game keeps its live rules until it becomes idle, so a - committed wager is never discarded. + lookup. ### Objects — interactive fixtures @@ -532,9 +552,9 @@ on_enter: #### Timed sequences -`wait: N` on a step is the number of ticks to pause **before** that step fires (replaces the -old `delay`). Messages are plain strings; effects on a step fire together when the wait -elapses. A step with no `wait` fires on the next tick. +`wait: N` on a step is the number of ticks to pause **before** that step fires. Messages +are plain strings; effects on a step fire together when the wait elapses. A step with no +`wait` fires on the next tick. #### Step actions @@ -558,12 +578,11 @@ on_enter: despawn_on_leave: true ``` -#### First-match-wins and migration +#### First-match-wins -Entries in `on_enter` are walked top-to-bottom; the first whose `condition` passes fires -and its steps run. The old on_enter ran **every** matching step, so migration wraps the old -step list into a single Trigger entry to preserve behavior. For new content where steps -are mutually exclusive, use multiple entries with distinct conditions. +Entries in `on_enter` are walked top-to-bottom; the first whose `condition` passes +fires and its steps run. For new content where steps are mutually exclusive, use +multiple entries with distinct conditions. Notes: - `wait: 0` (or omitted) fires on the next tick. @@ -592,8 +611,7 @@ on_exit: Use on_exit for parting messages, closing out a spawn when a player departs, or recording that the player has passed through an area. It obeys the same first-match-wins rule and the -same Step vocabulary as on_enter. (New event block — did not exist before the Trigger -unification.) +same Step vocabulary as on_enter. --- -- cgit v1.2.3