From ff9002b96e35ad0808945e7c35791460c9ca8776 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Tue, 29 Sep 2026 17:50:33 -0400 Subject: feat: roulette racetrack betting, rename casino to domita fortuna --- building_guide/roulette.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'building_guide') 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. -- cgit v1.2.3