From cacf0ae2443bfc84fe29cab57ac381062b31f23b Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Sat, 30 Dec 2023 11:50:29 -0800 Subject: [PATCH] Forefeit match when player leaves early --- pkg/server/game.go | 28 +++++++++++++++++++--------- pkg/server/server.go | 9 +++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/pkg/server/game.go b/pkg/server/game.go index d628f59..3d5aebd 100644 --- a/pkg/server/game.go +++ b/pkg/server/game.go @@ -8,11 +8,6 @@ import ( "code.rocket9labs.com/tslocum/bgammon" ) -type replayEvent struct { - Player int - Event []byte -} - type serverGame struct { id int created int64 @@ -24,6 +19,9 @@ type serverGame struct { spectators []*serverClient allowed1 []byte allowed2 []byte + account1 int + account2 int + forefeit int rematch int rejoin1 bool rejoin2 bool @@ -59,14 +57,16 @@ func (g *serverGame) roll(player int) bool { g.Roll2 = RandInt(6) + 1 } - if g.Started.IsZero() { - g.Started = time.Now() - } - // Only allow the same players to rejoin the game. if g.allowed1 == nil { g.allowed1, g.allowed2 = g.client1.name, g.client2.name } + + // Store account IDs. + if g.Started.IsZero() && g.Roll1 != 0 && g.Roll2 != 0 { + g.Started = time.Now() + g.account1, g.account2 = g.client1.account, g.client2.account + } return true } else if player != g.Turn || g.Roll1 != 0 || g.Roll2 != 0 { return false @@ -242,6 +242,10 @@ func (g *serverGame) addClient(client *serverClient) (spectator bool) { } else { g.rejoin2 = true } + + if g.forefeit == playerNumber { + g.forefeit = 0 + } }() switch { case g.client1 != nil: @@ -305,6 +309,12 @@ func (g *serverGame) removeClient(client *serverClient) { } } + if playerNumber == 1 && g.client2 != nil { + g.forefeit = 1 + } else if playerNumber == 2 && g.client1 != nil { + g.forefeit = 2 + } + client.playerNumber = 0 }() switch { diff --git a/pkg/server/server.go b/pkg/server/server.go index 46f63ab..2fafe46 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -462,6 +462,15 @@ func (s *server) handleTerminatedGames() { if !g.terminated() { s.games[i] = g i++ + } else if g.forefeit != 0 && g.Winner == 0 { + g.Winner = 1 + if g.forefeit == 1 { + g.Winner = 2 + } + err := recordMatchResult(g.Game, matchTypeCasual, g.account1, g.account2) + if err != nil { + log.Fatalf("failed to record match result: %s", err) + } } } for j := i; j < len(s.games); j++ {