diff options
Diffstat (limited to 'backend/game')
| -rw-r--r-- | backend/game/hub.go | 120 | ||||
| -rw-r--r-- | backend/game/message.go | 14 | ||||
| -rw-r--r-- | backend/game/models.go | 12 |
3 files changed, 38 insertions, 108 deletions
diff --git a/backend/game/hub.go b/backend/game/hub.go index b454bb5..97303ec 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -17,20 +17,12 @@ import ( "github.com/nsfisis/iosdc-japan-2024-albatross/backend/taskqueue" ) -type playerClientState int - -const ( - playerClientStateWaitingEntries playerClientState = iota - playerClientStateEntried - playerClientStateReady -) - type gameHub struct { ctx context.Context game *game q *db.Queries taskQueue *taskqueue.Queue - players map[*playerClient]playerClientState + players map[*playerClient]bool registerPlayer chan *playerClient unregisterPlayer chan *playerClient playerC2SMessages chan *playerMessageC2SWithClient @@ -46,7 +38,7 @@ func newGameHub(ctx context.Context, game *game, q *db.Queries, taskQueue *taskq game: game, q: q, taskQueue: taskQueue, - players: make(map[*playerClient]playerClientState), + players: make(map[*playerClient]bool), registerPlayer: make(chan *playerClient), unregisterPlayer: make(chan *playerClient), playerC2SMessages: make(chan *playerMessageC2SWithClient), @@ -66,7 +58,7 @@ func (hub *gameHub) run() { for { select { case player := <-hub.registerPlayer: - hub.players[player] = playerClientStateWaitingEntries + hub.players[player] = true case player := <-hub.unregisterPlayer: if _, ok := hub.players[player]; ok { hub.closePlayerClient(player) @@ -79,73 +71,6 @@ func (hub *gameHub) run() { } case message := <-hub.playerC2SMessages: switch msg := message.message.(type) { - case *playerMessageC2SEntry: - log.Printf("entry: %v", message.message) - // TODO: assert state is waiting_entries - hub.players[message.client] = playerClientStateEntried - entriedPlayerCount := 0 - for _, state := range hub.players { - if playerClientStateEntried <= state { - entriedPlayerCount++ - } - } - if entriedPlayerCount == hub.game.playerCount { - err := hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ - GameID: int32(hub.game.gameID), - State: string(gameStateWaitingStart), - }) - if err != nil { - log.Fatalf("failed to set game state: %v", err) - } - hub.game.state = gameStateWaitingStart - } - case *playerMessageC2SReady: - log.Printf("ready: %v", message.message) - // TODO: assert state is prepare - hub.players[message.client] = playerClientStateReady - readyPlayerCount := 0 - for _, state := range hub.players { - if playerClientStateReady <= state { - readyPlayerCount++ - } - } - if readyPlayerCount == hub.game.playerCount { - startAt := time.Now().Add(11 * time.Second).UTC() - for player := range hub.players { - player.s2cMessages <- &playerMessageS2CStart{ - Type: playerMessageTypeS2CStart, - Data: playerMessageS2CStartPayload{ - StartAt: int(startAt.Unix()), - }, - } - } - hub.broadcastToWatchers(&watcherMessageS2CStart{ - Type: watcherMessageTypeS2CStart, - Data: watcherMessageS2CStartPayload{ - StartAt: int(startAt.Unix()), - }, - }) - err := hub.q.UpdateGameStartedAt(hub.ctx, db.UpdateGameStartedAtParams{ - GameID: int32(hub.game.gameID), - StartedAt: pgtype.Timestamp{ - Time: startAt, - InfinityModifier: pgtype.Finite, - Valid: true, - }, - }) - if err != nil { - log.Fatalf("failed to set game state: %v", err) - } - hub.game.startedAt = &startAt - err = hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ - GameID: int32(hub.game.gameID), - State: string(gameStateStarting), - }) - if err != nil { - log.Fatalf("failed to set game state: %v", err) - } - hub.game.state = gameStateStarting - } case *playerMessageC2SCode: // TODO: assert game state is gaming log.Printf("code: %v", message.message) @@ -608,26 +533,47 @@ func (hub *gameHub) processTaskResultRunTestcase( } func (hub *gameHub) startGame() error { + startAt := time.Now().Add(11 * time.Second).UTC() for player := range hub.players { - player.s2cMessages <- &playerMessageS2CPrepare{ - Type: playerMessageTypeS2CPrepare, + player.s2cMessages <- &playerMessageS2CStart{ + Type: playerMessageTypeS2CStart, + Data: playerMessageS2CStartPayload{ + StartAt: int(startAt.Unix()), + }, } } - - err := hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ + hub.broadcastToWatchers(&watcherMessageS2CStart{ + Type: watcherMessageTypeS2CStart, + Data: watcherMessageS2CStartPayload{ + StartAt: int(startAt.Unix()), + }, + }) + err := hub.q.UpdateGameStartedAt(hub.ctx, db.UpdateGameStartedAtParams{ GameID: int32(hub.game.gameID), - State: string(gameStatePrepare), + StartedAt: pgtype.Timestamp{ + Time: startAt, + InfinityModifier: pgtype.Finite, + Valid: true, + }, }) if err != nil { - return err + log.Fatalf("failed to set game state: %v", err) } - hub.game.state = gameStatePrepare + hub.game.startedAt = &startAt + err = hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ + GameID: int32(hub.game.gameID), + State: string(gameStateStarting), + }) + if err != nil { + log.Fatalf("failed to set game state: %v", err) + } + hub.game.state = gameStateStarting return nil } func (hub *gameHub) close() { - for client := range hub.players { - hub.closePlayerClient(client) + for player := range hub.players { + hub.closePlayerClient(player) } close(hub.registerPlayer) close(hub.unregisterPlayer) diff --git a/backend/game/message.go b/backend/game/message.go index 2895119..4877ac4 100644 --- a/backend/game/message.go +++ b/backend/game/message.go @@ -8,11 +8,8 @@ import ( ) const ( - playerMessageTypeS2CPrepare = "player:s2c:prepare" playerMessageTypeS2CStart = "player:s2c:start" playerMessageTypeS2CExecResult = "player:s2c:execresult" - playerMessageTypeC2SEntry = "player:c2s:entry" - playerMessageTypeC2SReady = "player:c2s:ready" playerMessageTypeC2SCode = "player:c2s:code" playerMessageTypeC2SSubmit = "player:c2s:submit" ) @@ -23,15 +20,12 @@ type playerMessageC2SWithClient struct { } type playerMessageS2C = interface{} -type playerMessageS2CPrepare = api.GamePlayerMessageS2CPrepare type playerMessageS2CStart = api.GamePlayerMessageS2CStart type playerMessageS2CStartPayload = api.GamePlayerMessageS2CStartPayload type playerMessageS2CExecResult = api.GamePlayerMessageS2CExecResult type playerMessageS2CExecResultPayload = api.GamePlayerMessageS2CExecResultPayload type playerMessageC2S = interface{} -type playerMessageC2SEntry = api.GamePlayerMessageC2SEntry -type playerMessageC2SReady = api.GamePlayerMessageC2SReady type playerMessageC2SCode = api.GamePlayerMessageC2SCode type playerMessageC2SCodePayload = api.GamePlayerMessageC2SCodePayload type playerMessageC2SSubmit = api.GamePlayerMessageC2SSubmit @@ -44,14 +38,6 @@ func asPlayerMessageC2S(raw map[string]json.RawMessage) (playerMessageC2S, error } switch typ { - case playerMessageTypeC2SEntry: - return &playerMessageC2SEntry{ - Type: playerMessageTypeC2SEntry, - }, nil - case playerMessageTypeC2SReady: - return &playerMessageC2SReady{ - Type: playerMessageTypeC2SReady, - }, nil case playerMessageTypeC2SCode: var payload playerMessageC2SCodePayload if err := json.Unmarshal(raw["data"], &payload); err != nil { diff --git a/backend/game/models.go b/backend/game/models.go index 4080482..f232fa5 100644 --- a/backend/game/models.go +++ b/backend/game/models.go @@ -13,13 +13,11 @@ const ( gameType1v1 = api.N1V1 gameTypeMultiplayer = api.Multiplayer - gameStateClosed gameState = api.Closed - gameStateWaitingEntries gameState = api.WaitingEntries - gameStateWaitingStart gameState = api.WaitingStart - gameStatePrepare gameState = api.Prepare - gameStateStarting gameState = api.Starting - gameStateGaming gameState = api.Gaming - gameStateFinished gameState = api.Finished + gameStateClosed gameState = api.Closed + gameStateWaiting gameState = api.Waiting + gameStateStarting gameState = api.Starting + gameStateGaming gameState = api.Gaming + gameStateFinished gameState = api.Finished ) type game struct { |
