-
Notifications
You must be signed in to change notification settings - Fork 1
/
game_room_manager.go
61 lines (53 loc) · 1.36 KB
/
game_room_manager.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
package main
import (
"log"
"sync"
)
type GameRoomsManager struct {
sync.Mutex
lobby map[*GameServerSession]struct{}
rooms map[string]*GameSceneController
}
func NewRoomsManager() *GameRoomsManager {
return &GameRoomsManager{
lobby: make(map[*GameServerSession]struct{}, 2),
rooms: make(map[string]*GameSceneController, 64),
}
}
func (grm *GameRoomsManager) cleanup(sessionIDs []string) {
grm.Lock()
defer grm.Unlock()
for _, id := range sessionIDs {
delete(grm.rooms, id)
}
log.Println("finished game")
}
func (grm *GameRoomsManager) Connect(session *GameServerSession) {
grm.Lock()
defer grm.Unlock()
// TODO lobby can become part of GameSceneController state
// with timeout to disconnect player/create AI bot if no new player connects
// OR create mediator object which will trigger creation of gsc with AI/disconnects
grm.lobby[session] = struct{}{}
if len(grm.lobby) != 2 {
return
}
lobby := grm.lobby
grm.lobby = make(map[*GameServerSession]struct{}, 2)
gsc := NewGameSceneController(lobby, grm.cleanup)
for ps := range lobby {
grm.rooms[ps.Username] = gsc
ps.Subscribe(gsc.communicate)
}
go gsc.countdown()
return
}
func (grm *GameRoomsManager) Disconnect(session *GameServerSession) {
grm.Lock()
defer grm.Unlock()
if gsc := grm.rooms[session.Username]; gsc != nil {
gsc.disconnect(session)
return
}
delete(grm.lobby, session)
}