aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/betting.go
blob: 3ffee88ee79826c19d0b4313450d6dc54001bb17 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package casino

// countdown tracks tick-based deadlines for table phases (betting windows,
// insurance offers, and player action timeouts).
type countdown struct {
	clock    int
	deadline int
}

func (c *countdown) start(ticks int) { c.clock, c.deadline = 0, ticks }
func (c *countdown) stop()           { c.clock, c.deadline = 0, 0 }
func (c *countdown) tick()           { c.clock++ }
func (c *countdown) expired() bool   { return c.deadline > 0 && c.clock >= c.deadline }

// allBet reports whether at least one connected participant exists and every
// connected participant has placed a bet. Disconnected participants never
// hold a round open.
func allBet(seats []*Participant) bool {
	connected := false
	for _, p := range seats {
		if !p.Connected {
			continue
		}
		connected = true
		if !p.HasBet {
			return false
		}
	}
	return connected
}

// anyBet reports whether any participant, connected or not, has a wager
// committed to the current round.
func anyBet(seats []*Participant) bool {
	for _, p := range seats {
		if p.HasBet {
			return true
		}
	}
	return false
}

// sitOutNames lists participants without a bet, in seat order.
func sitOutNames(seats []*Participant) []string {
	var names []string
	for _, p := range seats {
		if !p.HasBet {
			names = append(names, p.Name)
		}
	}
	return names
}

// clearBets resets per-round betting state on every participant.
func clearBets(seats []*Participant) {
	for _, p := range seats {
		p.HasBet = false
		p.Wager = Wager{}
	}
}