@@ -10,7 +10,9 @@ import (
1010type Game struct {
1111 cg * cg.Game
1212 players map [string ]* Player
13- checkpoints []Position
13+ hovercrafts map [string ]Hovercraft
14+ checkpoints []Vec
15+ finishLine Vec
1416 finishedPlayers int
1517 running bool
1618 startTime time.Time
@@ -20,8 +22,9 @@ const targetFrameTime time.Duration = 1 * time.Second / 30
2022
2123func NewGame (cgGame * cg.Game ) * Game {
2224 game := & Game {
23- cg : cgGame ,
24- players : make (map [string ]* Player ),
25+ cg : cgGame ,
26+ players : make (map [string ]* Player ),
27+ hovercrafts : make (map [string ]Hovercraft ),
2528 }
2629 game .cg .OnPlayerJoined = game .onPlayerJoined
2730 game .cg .OnPlayerLeft = game .onPlayerLeft
@@ -30,6 +33,7 @@ func NewGame(cgGame *cg.Game) *Game {
3033}
3134
3235func (g * Game ) Run () {
36+ deltaTime := targetFrameTime
3337 for g .cg .Running () {
3438 frameStart := time .Now ()
3539 for {
@@ -38,9 +42,10 @@ func (g *Game) Run() {
3842 break
3943 }
4044 g .handleEvent (event .Player , event .Event )
41- g .update ()
4245 }
46+ g .update (deltaTime )
4347 time .Sleep (targetFrameTime - time .Now ().Sub (frameStart ))
48+ deltaTime = time .Now ().Sub (frameStart )
4449 }
4550}
4651
@@ -59,6 +64,8 @@ func (g *Game) onPlayerJoined(cgPlayer *cg.Player) {
5964 username : cgPlayer .Username ,
6065 game : g ,
6166 }
67+
68+ g .hovercrafts [cgPlayer .Id ] = Hovercraft {}
6269}
6370
6471func (g * Game ) onPlayerLeft (player * cg.Player ) {
@@ -67,8 +74,6 @@ func (g *Game) onPlayerLeft(player *cg.Player) {
6774 return
6875 }
6976
70- delete (g .players , player .Id )
71-
7277 if ! g .running {
7378 for _ , p := range g .players {
7479 if ! p .ready {
@@ -92,6 +97,7 @@ func (g *Game) onPlayerSocketConnected(player *cg.Player, socket *cg.Socket) {
9297 p := g .players [player .Id ]
9398 p .cg .Send ("server" , CheckpointsEvent , CheckpointsEventData {
9499 Checkpoints : p .checkpoints ,
100+ FinishLine : g .finishLine ,
95101 })
96102
97103 socket .Send ("server" , StartEvent , StartEventData {})
@@ -106,16 +112,27 @@ func (g *Game) onPlayerSocketConnected(player *cg.Player, socket *cg.Socket) {
106112 }
107113}
108114
109- func (g * Game ) update () {
115+ func (g * Game ) update (delta time. Duration ) {
110116 if ! g .running {
111117 return
112118 }
119+
120+ for _ , player := range g .players {
121+ player .update (delta )
122+ }
123+
124+ g .cg .Send ("server" , HovercraftsEvent , HovercraftsEventData {
125+ Hovercrafts : g .hovercrafts ,
126+ Time : time .Now ().UnixMilli (),
127+ })
113128}
114129
115130func (g * Game ) handleEvent (player * cg.Player , event cg.Event ) {
116131 switch event .Name {
117132 case ReadyEvent :
118133 g .handleReady (player .Id )
134+ case ThrottleEvent :
135+ g .handleThrottle (player .Id , event )
119136 default :
120137 player .Send (player .Id , cg .ErrorEvent , cg.ErrorEventData {
121138 Message : fmt .Sprintf ("unexpected event: %s" , event .Name ),
@@ -154,19 +171,38 @@ func (g *Game) handleReady(playerId string) {
154171 }
155172}
156173
174+ func (g * Game ) handleThrottle (playerId string , event cg.Event ) {
175+ var data ThrottleEventData
176+ event .UnmarshalData (& data )
177+
178+ if data .Level > 1 {
179+ data .Level = 1
180+ } else if data .Level < 0 {
181+ data .Level = 0
182+ }
183+
184+ player := g .players [playerId ]
185+ player .targetThrottle = data .Level
186+ player .targetAngle = data .Angle
187+ }
188+
157189func (g * Game ) start () {
158190 g .finishedPlayers = 0
159191 g .createCheckpoints ()
160192
161193 for _ , player := range g .players {
162- player .checkpoints = g .checkpoints
163- }
194+ player .checkpoints = make ([] Vec , len ( g .checkpoints ))
195+ copy ( player . checkpoints , g . checkpoints )
164196
165- g .running = true
166- g .startTime = time .Now ()
197+ player .pos = Vec {
198+ X : 10 ,
199+ Y : 1 ,
200+ }
201+ }
167202
168203 g .cg .Send ("server" , CheckpointsEvent , CheckpointsEventData {
169204 Checkpoints : g .checkpoints ,
205+ FinishLine : g .finishLine ,
170206 })
171207
172208 for countdown := 5 ; countdown > 0 ; countdown -- {
@@ -176,6 +212,9 @@ func (g *Game) start() {
176212 time .Sleep (1 * time .Second )
177213 }
178214
215+ g .running = true
216+ g .startTime = time .Now ()
217+
179218 g .cg .Send ("server" , StartEvent , StartEventData {})
180219}
181220
@@ -187,5 +226,15 @@ func (g *Game) finish() {
187226}
188227
189228func (g * Game ) createCheckpoints () {
190- g .checkpoints = make ([]Position , 5 )
229+ // TODO: randomly generate checkpoint positions
230+
231+ g .checkpoints = []Vec {
232+ {X : 10 , Y : 5 },
233+ {X : 10 , Y : 12 },
234+ }
235+
236+ g .finishLine = Vec {
237+ X : 10 ,
238+ Y : 20 ,
239+ }
191240}
0 commit comments