@@ -15,34 +15,45 @@ func (g *Game) Me(playerID string) (Player, error) {
1515 return Player {}, fmt .Errorf ("player not found in game" )
1616}
1717
18- func (g * Game ) GetState (playerID string ) ( State , error ) {
19- // Get player
20- me , err := g . Me ( playerID )
21- if err != nil {
22- return State {}, err
18+ func (g * Game ) GetState (playerID string ) State {
19+ // 1. Get Previous round if there is one
20+ var prevRound Round
21+ if len ( g . Completed ) > 0 {
22+ prevRound = g . Completed [ len ( g . Completed ) - 1 ]
2323 }
2424
25- // 1 . Get max call
25+ // 2 . Get max call
2626 maxCall := Pass
2727 for _ , p := range g .Players {
2828 if p .Call > maxCall {
2929 maxCall = p .Call
3030 }
3131 }
3232
33- // 2. Add dummy if applicable
33+ // 3. Get player
34+ me , err := g .Me (playerID )
35+
36+ // If the player isn't in the game they are a spectator
37+ if err != nil {
38+ return State {
39+ ID : g .ID ,
40+ Revision : g .Revision ,
41+ IamSpectator : true ,
42+ Status : g .Status ,
43+ Round : g .CurrentRound ,
44+ PrevRound : prevRound ,
45+ MaxCall : maxCall ,
46+ Players : g .Players ,
47+ }
48+ }
49+
50+ // 4. Add dummy if applicable
3451 iamGoer := g .CurrentRound .GoerID == playerID
3552 if iamGoer && g .CurrentRound .Status == Called && g .Dummy != nil {
3653 me .Cards = append (me .Cards , g .Dummy ... )
3754 }
3855
39- // 3. Get Previous round if there is one
40- var prevRound Round
41- if len (g .Completed ) > 0 {
42- prevRound = g .Completed [len (g .Completed )- 1 ]
43- }
44-
45- // 4. Return player's game state
56+ // 5. Return player's game state
4657 gameState := State {
4758 ID : g .ID ,
4859 Revision : g .Revision ,
@@ -60,7 +71,7 @@ func (g *Game) GetState(playerID string) (State, error) {
6071 Players : g .Players ,
6172 }
6273
63- return gameState , nil
74+ return gameState
6475}
6576
6677// MinKeep returns the minimum number of cards that must be kept by a player
@@ -280,10 +291,7 @@ func (g *Game) Call(playerID string, call Call) error {
280291 }
281292
282293 // If they are in the bunker (score < -30) they can only pass
283- state , err := g .GetState (playerID )
284- if err != nil {
285- return err
286- }
294+ state := g .GetState (playerID )
287295 if state .Me .Score < - 30 && call != Pass {
288296 return fmt .Errorf ("player in bunker" )
289297 }
@@ -429,10 +437,7 @@ func (g *Game) SelectSuit(playerID string, suit Suit, cards []CardName) error {
429437 }
430438
431439 // Verify the cards are valid (must be either in the player's hand or the dummy's hand and must be unique
432- state , errS := g .GetState (playerID )
433- if errS != nil {
434- return errS
435- }
440+ state := g .GetState (playerID )
436441 if ! containsAllUnique (state .Cards , cards ) {
437442 return fmt .Errorf ("invalid card selected" )
438443 }
@@ -482,10 +487,7 @@ func (g *Game) Buy(playerID string, cards []CardName) error {
482487 }
483488
484489 // Verify the cards are valid (must be either in the player's hand or the dummy's hand and must be unique
485- state , errS := g .GetState (playerID )
486- if errS != nil {
487- return errS
488- }
490+ state := g .GetState (playerID )
489491 if ! containsAllUnique (state .Cards , cards ) {
490492 return fmt .Errorf ("invalid card selected" )
491493 }
@@ -543,10 +545,7 @@ func (g *Game) Play(id string, card CardName) error {
543545 }
544546
545547 // Verify the card is valid
546- state , err := g .GetState (id )
547- if err != nil {
548- return err
549- }
548+ state := g .GetState (id )
550549 if ! contains (state .Cards , card ) {
551550 return fmt .Errorf ("invalid card selected" )
552551 }
@@ -592,7 +591,7 @@ func (g *Game) Play(id string, card CardName) error {
592591 g .CurrentRound .CurrentHand .CurrentPlayerID = np .ID
593592 } else {
594593
595- err = g .completeHand ()
594+ err : = g .completeHand ()
596595 if err != nil {
597596 return err
598597 }
0 commit comments