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{} } }