aboutsummaryrefslogtreecommitdiff
path: root/internal/casino
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-09-29 14:35:57 -0400
committerhistoria <[not public]>2026-09-29 14:35:57 -0400
commit61fb8e950e0b30ef0ee65aa5882545e5292d9112 (patch)
tree06319b38231d1b86236b8d3944a1accf9824eb08 /internal/casino
parent004dcd3826856870b267a55dacf84aa7742b7e3f (diff)
downloadthehouseoficarus-61fb8e950e0b30ef0ee65aa5882545e5292d9112.tar.gz
fix: roulette table box drawing characters
Diffstat (limited to 'internal/casino')
-rw-r--r--internal/casino/roulette.go39
-rw-r--r--internal/casino/roulette_test.go14
-rw-r--r--internal/casino/table_ux.go2
3 files changed, 45 insertions, 10 deletions
diff --git a/internal/casino/roulette.go b/internal/casino/roulette.go
index ed649e9..5784ac9 100644
--- a/internal/casino/roulette.go
+++ b/internal/casino/roulette.go
@@ -34,9 +34,31 @@ func rouletteRed(n int) bool {
return false
}
+// normalizeRouletteSpot maps legacy bet names onto the labels shown on the
+// board. The old dozen/column spellings stay accepted so existing habits and
+// older help text keep working.
+func normalizeRouletteSpot(spot string) string {
+ switch spot {
+ case "dozen1":
+ return "1to12"
+ case "dozen2":
+ return "13to24"
+ case "dozen3":
+ return "25to36"
+ case "column1":
+ return "row1"
+ case "column2":
+ return "row2"
+ case "column3":
+ return "row3"
+ }
+ return spot
+}
+
// Returns the covered pockets and total-return multiplier (stake included).
// Zero never belongs to an outside bet.
func rouletteBet(spot string, double bool) ([]string, int) {
+ spot = normalizeRouletteSpot(spot)
if spot == "00" {
if double {
return []string{spot}, 36
@@ -62,18 +84,18 @@ func rouletteBet(spot string, double bool) ([]string, int) {
hit = n <= 18
case "high":
hit = n >= 19
- case "dozen1":
+ case "1to12":
hit = n <= 12
- case "dozen2":
+ case "13to24":
hit = n >= 13 && n <= 24
- case "dozen3":
+ case "25to36":
hit = n >= 25
- case "column1":
- hit = n%3 == 1
- case "column2":
- hit = n%3 == 2
- case "column3":
+ case "row1":
hit = n%3 == 0
+ case "row2":
+ hit = n%3 == 2
+ case "row3":
+ hit = n%3 == 1
}
if hit {
pockets = append(pockets, strconv.Itoa(n))
@@ -162,6 +184,7 @@ func (t *rouletteTable) bet(name, spot string, amount int, w Wallet) []Event {
if spot == "" {
spot = p.lastSpot
}
+ spot = normalizeRouletteSpot(spot)
_, mult := rouletteBet(spot, t.Config.Roulette.DoubleZero)
if mult == 0 {
return []Event{t.private(name, "Unknown roulette target. Use table to see all available bets.")}
diff --git a/internal/casino/roulette_test.go b/internal/casino/roulette_test.go
index 3ef3814..a20b17c 100644
--- a/internal/casino/roulette_test.go
+++ b/internal/casino/roulette_test.go
@@ -32,7 +32,7 @@ func TestRouletteRulesAndWheels(t *testing.T) {
if seen["00"] != double {
t.Fatal("wrong double zero")
}
- for _, spot := range strings.Fields("red black even odd low high dozen1 dozen2 dozen3 column1 column2 column3") {
+ for _, spot := range strings.Fields("red black even odd low high dozen1 dozen2 dozen3 column1 column2 column3 1to12 13to24 25to36 row1 row2 row3") {
pockets, mult := rouletteBet(spot, double)
if len(pockets)*mult != 36 {
t.Fatalf("%s coverage/payout %d/%d", spot, len(pockets), mult)
@@ -54,6 +54,18 @@ func TestRouletteRulesAndWheels(t *testing.T) {
}
}
}
+func TestRouletteRowBetMapping(t *testing.T) {
+ // row1 is the top numbered line (3,6,...36) and row3 the bottom (1,4,...34).
+ row1, mult := rouletteBet("row1", false)
+ if mult != 3 || len(row1) != 12 || row1[0] != "3" || row1[len(row1)-1] != "36" {
+ t.Fatalf("row1 = %v (x%d), want 3..36", row1, mult)
+ }
+ row3, mult := rouletteBet("row3", false)
+ if mult != 3 || len(row3) != 12 || row3[0] != "1" || row3[len(row3)-1] != "34" {
+ t.Fatalf("row3 = %v (x%d), want 1..34", row3, mult)
+ }
+}
+
func rouletteFixture() *rouletteTable {
return newRouletteTable(1, TableConfig{ID: "r", Game: GameRoulette, BettingTicks: 2, Roulette: RouletteConfig{SpinTicks: 2}}, rand.New(rand.NewSource(7)))
}
diff --git a/internal/casino/table_ux.go b/internal/casino/table_ux.go
index cec766d..db700d6 100644
--- a/internal/casino/table_ux.go
+++ b/internal/casino/table_ux.go
@@ -13,7 +13,7 @@ func (c TableConfig) RulesText() string {
case GameBaccarat:
return c.BaccaratRulesText()
case GameRoulette:
- return c.Label() + "\nStraight numbers pay 35:1; dozens/columns 2:1; other outside bets 1:1.\nZero pockets lose all outside bets. One wager per spin. Use help roulette."
+ return c.Label() + "\nStraight numbers pay 35:1; 1to12/13to24/25to36 and rows 2:1; other outside bets 1:1.\nZero pockets lose all outside bets. One wager per spin. Use help roulette."
default:
return c.Label()
}