From 61fb8e950e0b30ef0ee65aa5882545e5292d9112 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Tue, 29 Sep 2026 14:35:57 -0400 Subject: fix: roulette table box drawing characters --- internal/casino/roulette.go | 39 +++++++++++++++++++++++++++++++-------- internal/casino/roulette_test.go | 14 +++++++++++++- internal/casino/table_ux.go | 2 +- 3 files changed, 45 insertions(+), 10 deletions(-) (limited to 'internal/casino') 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() } -- cgit v1.2.3