aboutsummaryrefslogtreecommitdiff
path: root/building_guide/roulette.md
diff options
context:
space:
mode:
Diffstat (limited to 'building_guide/roulette.md')
-rw-r--r--building_guide/roulette.md21
1 files changed, 20 insertions, 1 deletions
diff --git a/building_guide/roulette.md b/building_guide/roulette.md
index 2d3fc53..e257b31 100644
--- a/building_guide/roulette.md
+++ b/building_guide/roulette.md
@@ -34,7 +34,9 @@ ANSI). Three views share one renderer:
- **Betting board**: numbered grid with zeros in the left lane, red/black
pockets, and outside bets. The whole five-row zero lane (three numbered rows
plus the two separators between them) carries the green background, and its
- outer corners are rounded in Unicode mode.
+ outer corners are rounded in Unicode mode. A racetrack table draws
+ `renderRouletteRacetrack` above the board: a rounded panel listing each call
+ bet's chips and wheel-order number series, plus the Neighbors syntax.
- **Spinning**: a stylised 17x9 wheel (wider than tall so it reads as a circle
in a terminal cell grid). Only the rim is colored, as solid red and black
pockets alternating around the circumference; pockets are two cells wide
@@ -65,6 +67,23 @@ because the geometry of the covered set identifies the bet. Non-adjacent or
wrong-shaped sets are rejected rather than silently accepted. Multiple
simultaneous wagers remain future work: `Participant.Wager` still holds a
single stake.
+
+Single-zero tables may set `roulette.racetrack: true`. That adds the four
+French call bets (Voisins du Zéro, Tiers du Cylindre, Orphelins, Zero Spiel)
+and the Neighbors bet (a chosen number plus four on each side in wheel order).
+The racetrack is a single-zero layout only: the validator rejects
+`racetrack: true` together with `double_zero: true`. A call bet is **one
+wager** whose amount is the total stake spread evenly over the bet's chips
+(Voisins 9, Tiers 6, Orphelins 5, Zero Spiel 4, Neighbors 9). Because the
+components are ordinary inside bets, each returns `36/covered` when its
+number hits, so a winning pocket can pay a different multiple of the stake
+than another (for example 0 on Voisins pays 24/9, while 4 pays 18/9). The
+engine therefore resolves a wager to exact per-pocket `num/den` shares
+(`roulette_racetrack.go`) instead of a single multiplier; `bet` validates
+every possible return before committing and `settle` floors
+`stake*num/den`. The rack panel is drawn by `renderRouletteRacetrack` above
+the board and lists each bet's wheel-order series.
+
All returns are checked before debiting a wager. Both winning and losing stakes
settle through `PayCredits(return, stakeID)`, including a zero return for losses.
Failures leave the stake pending and do not claim that payment succeeded.