@@ -14,7 +14,7 @@ type Game struct {
1414 hovercrafts map [string ]Hovercraft
1515 checkpoints []Vec
1616 finishLine Vec
17- finishedPlayers int
17+ finishedPlayers [] FinishedPlayer
1818 running bool
1919 startTime time.Time
2020}
@@ -23,9 +23,11 @@ const targetFrameTime time.Duration = 1 * time.Second / 30
2323
2424func NewGame (cgGame * cg.Game ) * Game {
2525 game := & Game {
26- cg : cgGame ,
27- players : make (map [string ]* Player ),
28- hovercrafts : make (map [string ]Hovercraft ),
26+ cg : cgGame ,
27+ players : make (map [string ]* Player ),
28+ hovercrafts : make (map [string ]Hovercraft ),
29+ finishedPlayers : make ([]FinishedPlayer , 0 ),
30+ checkpoints : make ([]Vec , 0 , 10 ),
2931 }
3032 game .cg .OnPlayerJoined = game .onPlayerJoined
3133 game .cg .OnPlayerLeft = game .onPlayerLeft
@@ -76,6 +78,18 @@ func (g *Game) onPlayerJoined(cgPlayer *cg.Player) {
7678 g .hovercrafts [cgPlayer .Id ] = Hovercraft {}
7779
7880 g .positionHovercrafts ()
81+
82+ readyPlayers := make ([]string , 0 , len (g .players ))
83+ for _ , p := range g .players {
84+ if p .ready {
85+ readyPlayers = append (readyPlayers , p .id )
86+ }
87+ }
88+ if len (readyPlayers ) > 0 {
89+ cgPlayer .Send ("server" , ReadyPlayersEvent , ReadyPlayersEventData {
90+ Players : readyPlayers ,
91+ })
92+ }
7993}
8094
8195func (g * Game ) onPlayerLeft (player * cg.Player ) {
@@ -93,7 +107,7 @@ func (g *Game) onPlayerLeft(player *cg.Player) {
93107 }
94108 g .start ()
95109 } else {
96- if g .finishedPlayers == len (g .players ) {
110+ if len ( g .finishedPlayers ) == len (g .players ) {
97111 g .finish ()
98112 }
99113 }
@@ -102,37 +116,46 @@ func (g *Game) onPlayerLeft(player *cg.Player) {
102116
103117func (g * Game ) onPlayerSocketConnected (player * cg.Player , socket * cg.Socket ) {
104118 if len (g .checkpoints ) > 0 {
105- g . cg .Send ("server" , HovercraftsEvent , HovercraftsEventData {
119+ socket .Send ("server" , HovercraftsEvent , HovercraftsEventData {
106120 Hovercrafts : g .hovercrafts ,
107121 Time : time .Now ().UnixMilli (),
108122 })
109123
110124 p := g .players [player .Id ]
111- p . cg .Send ("server" , CheckpointsEvent , CheckpointsEventData {
125+ socket .Send ("server" , CheckpointsEvent , CheckpointsEventData {
112126 Checkpoints : p .checkpoints ,
113127 FinishLine : g .finishLine ,
114128 })
115129 }
116130
131+ readyPlayers := make ([]string , 0 , len (g .players ))
132+ for _ , p := range g .players {
133+ if p .ready {
134+ readyPlayers = append (readyPlayers , p .id )
135+ }
136+ }
137+ if len (readyPlayers ) > 0 {
138+ socket .Send ("server" , ReadyPlayersEvent , ReadyPlayersEventData {
139+ Players : readyPlayers ,
140+ })
141+ }
142+
117143 if ! g .running {
118144 return
119145 }
120146
121- socket .Send ("server" , StartEvent , StartEventData {})
147+ socket .Send ("server" , InProgressEvent , InProgressEventData {})
122148
123- for _ , player := range g .players {
124- if player .finished {
125- socket .Send (player .id , FinishedEvent , FinishedEventData {
126- Place : player .place ,
127- Duration : player .duration ,
128- })
129- }
149+ if len (g .finishedPlayers ) > 0 {
150+ socket .Send ("server" , FinishedPlayersEvent , FinishedPlayersEventData {
151+ Players : g .finishedPlayers ,
152+ })
130153 }
131154}
132155
133156func (g * Game ) onSpectatorConnected (socket * cg.Socket ) {
134157 if len (g .checkpoints ) > 0 {
135- g . cg .Send ("server" , HovercraftsEvent , HovercraftsEventData {
158+ socket .Send ("server" , HovercraftsEvent , HovercraftsEventData {
136159 Hovercrafts : g .hovercrafts ,
137160 Time : time .Now ().UnixMilli (),
138161 })
@@ -143,19 +166,28 @@ func (g *Game) onSpectatorConnected(socket *cg.Socket) {
143166 })
144167 }
145168
169+ readyPlayers := make ([]string , 0 , len (g .players ))
170+ for _ , p := range g .players {
171+ if p .ready {
172+ readyPlayers = append (readyPlayers , p .id )
173+ }
174+ }
175+ if len (readyPlayers ) > 0 {
176+ socket .Send ("server" , ReadyPlayersEvent , ReadyPlayersEventData {
177+ Players : readyPlayers ,
178+ })
179+ }
180+
146181 if ! g .running {
147182 return
148183 }
149184
150- socket .Send ("server" , StartEvent , StartEventData {})
185+ socket .Send ("server" , InProgressEvent , InProgressEventData {})
151186
152- for _ , player := range g .players {
153- if player .finished {
154- socket .Send (player .id , FinishedEvent , FinishedEventData {
155- Place : player .place ,
156- Duration : player .duration ,
157- })
158- }
187+ if len (g .finishedPlayers ) > 0 {
188+ socket .Send ("server" , FinishedPlayersEvent , FinishedPlayersEventData {
189+ Players : g .finishedPlayers ,
190+ })
159191 }
160192}
161193
@@ -201,7 +233,7 @@ func (g *Game) handleReady(playerId string) {
201233 }
202234 }
203235
204- g .cg .Send ("server" , ReadyPlayersEvent , ReadyPlayersEventData {
236+ g .cg .Send (playerId , ReadyPlayersEvent , ReadyPlayersEventData {
205237 Players : readyPlayers ,
206238 })
207239
@@ -232,7 +264,7 @@ func (g *Game) handleThrottle(playerId string, event cg.Event) {
232264}
233265
234266func (g * Game ) start () {
235- g .finishedPlayers = 0
267+ g .finishedPlayers = g . finishedPlayers [: 0 ]
236268 g .createCheckpoints ()
237269
238270 for _ , player := range g .players {
@@ -289,11 +321,11 @@ func (g *Game) positionHovercrafts() {
289321
290322func (g * Game ) finish () {
291323 g .running = false
324+ g .checkpoints = g .checkpoints [:0 ]
292325}
293326
294327func (g * Game ) createCheckpoints () {
295- g .checkpoints = make ([]Vec , 10 )
296-
328+ g .checkpoints = g .checkpoints [:cap (g .checkpoints )]
297329 for i := range g .checkpoints {
298330 g .checkpoints [i ] = Vec {
299331 X : rand .Float64 ()* 50 * 2 - 50 ,
0 commit comments