-
Notifications
You must be signed in to change notification settings - Fork 10
/
player.go
81 lines (66 loc) · 1.57 KB
/
player.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package game
import (
"fmt"
"github.com/domino14/word-golib/tilemapping"
"github.com/rs/zerolog/log"
pb "github.com/domino14/macondo/gen/api/proto/macondo"
)
type playerState struct {
pb.PlayerInfo
rack *tilemapping.Rack
points int
bingos int
turns int
// to minimize allocs:
placeholderRack []tilemapping.MachineLetter
}
func newPlayerState(nickname, userid, realname string) *playerState {
return &playerState{
PlayerInfo: pb.PlayerInfo{
Nickname: nickname,
UserId: userid,
RealName: realname,
},
placeholderRack: make([]tilemapping.MachineLetter, RackTileLimit),
}
}
func (p *playerState) resetScore() {
p.points = 0
p.bingos = 0
p.turns = 0
}
func (p *playerState) throwRackIn(bag *tilemapping.Bag) {
log.Trace().Str("rack", p.rack.String()).Str("player", p.Nickname).
Msg("throwing rack in")
bag.PutBack(p.rack.TilesOn())
p.rack.Set([]tilemapping.MachineLetter{})
}
func (p *playerState) setRackTiles(tiles []tilemapping.MachineLetter, alph *tilemapping.TileMapping) {
p.rack.Set(tiles)
}
func (p *playerState) rackLetters() string {
return p.rack.String()
}
func (p *playerState) stateString(myturn bool) string {
onturn := ""
if myturn {
onturn = "-> "
}
rackLetters := p.rackLetters()
if !myturn {
// Don't show rack letters.
rackLetters = ""
}
return fmt.Sprintf("%4v%20v%9v %4v", onturn, p.Nickname, rackLetters, p.points)
}
type playerStates []*playerState
func (p playerStates) resetRacks() {
for idx := range p {
p[idx].rack.Clear()
}
}
func (p playerStates) resetScore() {
for idx := range p {
p[idx].resetScore()
}
}