commit a571e856ae5e038dd65a850d3067600bc1df9cd9
parent c7dca481f4198ac915b4b0e89724478ff8ccf43b
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Sat, 9 Dec 2023 01:33:06 -0500
dealer token
Diffstat:
2 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/pkg/web/handlers/poker/events.go b/pkg/web/handlers/poker/events.go
@@ -11,6 +11,7 @@ type PokerEvent struct {
}
type GameStartedEvent struct {
+ DealerIdx int
}
type GameIsDoneEvent struct {
diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go
@@ -139,7 +139,7 @@ type PokerGame struct {
Players []*PokerStandingPlayer
PlayersMtx sync.RWMutex
Ongoing *Ongoing
- DealerIdx atomic.Int32
+ DealerIdx atomic.Int32 // Dealer seat idx
smallBlindIdx int
bigBlindIdx int
underTheGunIdx int
@@ -238,6 +238,15 @@ func (g *Ongoing) GetNextPlayer() *PokerPlayer {
return nil
}
+func (g *Ongoing) GetPlayerBySeatIdx(seatIdx int) *PokerPlayer {
+ for _, p := range g.Players {
+ if p.SeatIdx == seatIdx {
+ return p
+ }
+ }
+ return nil
+}
+
func (g *Ongoing) GetPlayer(player string) *PokerPlayer {
for _, p := range g.Players {
if p.Username == player {
@@ -273,7 +282,12 @@ func isRoundSettled(players []*PokerPlayer) bool {
func (g *PokerGame) incrDealerIdx() {
nbPlayers := len(g.Ongoing.Players)
dealerIdx := g.DealerIdx.Load()
- dealerIdx = incrDealerIdx(dealerIdx, nbPlayers)
+ for {
+ dealerIdx = (dealerIdx + 1) % NbPlayers
+ if p := g.Ongoing.GetPlayerBySeatIdx(int(dealerIdx)); p != nil {
+ break
+ }
+ }
g.DealerIdx.Store(dealerIdx)
g.smallBlindIdx = (int(dealerIdx) + 1) % nbPlayers
g.bigBlindIdx = (int(dealerIdx) + 2) % nbPlayers
@@ -396,7 +410,8 @@ func waitPlayersActionFn(g *PokerGame, roomID string, skip, minBet int) bool {
roomLogsTopic := "room_" + roomID + "_logs"
playerAlive := 0
dealerIdx := int(g.DealerIdx.Load())
- playerToPlayIdx := (dealerIdx + skip) % len(g.Ongoing.Players)
+ dealerPlayer := g.Ongoing.GetPlayerBySeatIdx(dealerIdx)
+ playerToPlayIdx := (dealerPlayer.SeatIdx + skip) % len(g.Ongoing.Players)
lastRaisePlayerIdx := -1
newlyAllInPlayers := make([]*PokerPlayer, 0)
@@ -624,6 +639,15 @@ type Seat struct {
Left2 int
}
+var dealerTokenPos = [][]int{
+ {125, 714},
+ {246, 732},
+ {369, 607},
+ {388, 379},
+ {388, 190},
+ {363, 123},
+}
+
func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) {
roomTopic := "room_" + roomID
roomLogsTopic := "room_" + roomID + "_logs"
@@ -676,7 +700,7 @@ func dealerThread(db *database.DkfDB, g *PokerGame, roomID string) {
dealCardIdx++
}
- PokerPubSub.Pub(roomTopic, GameStartedEvent{})
+ PokerPubSub.Pub(roomTopic, GameStartedEvent{DealerIdx: int(g.DealerIdx.Load())})
newLogEvent(g, roomLogsTopic, fmt.Sprintf("-- New game --"))
p := g.Ongoing.Players[g.smallBlindIdx]
@@ -1151,6 +1175,15 @@ func colorForCard1(name string) string {
return color
}
+func buildDealerTokenHtml(g *PokerGame) (html string) {
+ html += `<div id="dealerToken"><div class="inner"></div></div>`
+ if g.Ongoing != nil {
+ pos := dealerTokenPos[g.DealerIdx.Load()]
+ html += `<style>#dealerToken { top: ` + itoa(pos[0]) + `px; left: ` + itoa(pos[1]) + `px; }</style>`
+ }
+ return
+}
+
func buildYourCardsHtml(authUser *database.User, g *PokerGame) string {
html := `
<div style="position: absolute; top: 550px; left: 300px;">
@@ -1294,7 +1327,8 @@ func drawYourCardEvent(evt YourCardEvent) string {
}
func drawGameStartedEvent(evt GameStartedEvent) string {
- return ``
+ pos := dealerTokenPos[evt.DealerIdx]
+ return `<style>#dealerToken { top: ` + itoa(pos[0]) + `px; left: ` + itoa(pos[1]) + `px; }</style>`
}
func drawGameIsDoneHtml(g *PokerGame, evt GameIsDoneEvent) (html string) {
@@ -1592,6 +1626,9 @@ body {
#yourCard2 { font-size: 22px; display: inline-block; }
#errorMsg { position: absolute; top: 600px; left: 250px; color: darkred; }
#eventLogs { position: absolute; bottom: 5px; right: 5px; width: 300px; height: 200px; border: 1px solid black; background-color: #ccc; padding: 3px; }
+#dealerToken { top: 125px; left: 714px; width: 20px; height: 20px; background-color: #ccc; border: 1px solid #333; border-radius: 11px; position: absolute; }
+#dealerToken .inner { padding: 2px 4px; }
+#dealerToken .inner:before { content: "D"; }
#table {
position: absolute; top: 20px; left: 20px; width: 750px; height: 400px; border-radius: 300px;
background: radial-gradient(#449144, #008a00);
@@ -1729,6 +1766,7 @@ func PokerHandler(c echo.Context) error {
send(buildSeatsHtml(g, roomID))
send(buildActionsDiv(roomID))
send(buildYourCardsHtml(authUser, g))
+ send(buildDealerTokenHtml(g))
send(`<iframe src="/poker/` + roomID + `/logs" id="eventLogs"></iframe>`)
send(`<div id="errorMsg"></div>`)
send(buildMainPotHtml(g))