aboutsummaryrefslogtreecommitdiff
path: root/dev_guide/video_poker.md
blob: 46d900e9a3ead745d175a15e00af4c817327b9c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Video poker internals

Builder-facing cabinet configuration, payout tiers and player controls
live in [../building_guide/video_poker.md](../building_guide/video_poker.md).
This page covers presentation and money-safety internals.

## Presentation

Pay tables use yellow Unicode borders and dotted hand-name leaders. Blue
`#000269`, red `#fe0000` (selected coin column), and yellow `#f7e70e` are mapped
to nearest xterm colors. HELD and wins are bold yellow; no-win text is bold
white. Results are below cards. Bonus indicators and multipliers sit beside
cards. Multi-hand art shrinks; hundred-play uses compact Unicode ranks/suits.

Payouts are total coins including stake, not profit. Multiply by denomination
for credits. Natural royals pay 250 per coin below five coins, 4000 at five.
Other categories scale linearly. Only the highest-paying category pays.
All games use fresh 52-card decks except Joker Poker's 53-card deck. Each line
shares the deal/holds but draws from its own shuffled remaining deck, excluding
**all five** original cards, including discards.

## Shared banks and money safety

Ultimate X multipliers belong to the **machine**, not the player. Another
occupant inherits them. Files live at
`data/casino/video_poker_banks/<room>_<cabinet>.yaml`. Within each file banks
are keyed by game/tier/denomination/hand-count, preventing denomination or
edition switching from amplifying an award. Fully consumed banks are removed.
Missing files are new machines; corrupt/unreadable files block deals.

`casino.PokerWallet` loads banks and atomically settles character credits,
pending stake removal, and the cabinet file in a multi-file undo-journal
transaction. There is no package-global persistence callback. The game owner
serializes writes. The stake is durable before revealing cards; frozen final
hands and awards survive payment retries without redraws or rerolls. Failed
transactions leave the old live bank intact. Commit-point failures are recovered
and reconciled before any retry; unrecoverable storage faults fail closed.
Startup journal recovery precedes pending-wager recovery. A process crash before
commit restores both old records, then refunds the unresolved stake. Committed
payouts cannot replay an old bank. Shutdown/eviction refunds unresolved stakes
without consuming previously saved multipliers or retaining uncommitted awards.

Old experimental player-owned `video_poker_multipliers` fields are no longer
read. They are not merged into shared cabinets (multiple player banks cannot
unambiguously become one physical bank).