-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
142 lines (125 loc) · 3.62 KB
/
server.js
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
var PORT = process.env.PORT || 3000
var express = require('express')
var path = require('path')
const uuidv4 = require('uuid/v4')
var app = express()
var server = app.listen(PORT)
app.use(express.static('public'))
// app.get('*', (req, res) => {
// res.sendFile(path.join(__dirname, 'public', 'index.html'))
// })
var socket = require('socket.io')
var io = socket(server)
const hive = require('./public/hive')
hive.resetGame()
const board = {}
const players = {}
const games = {}
let whitePlayer
let blackPlayer
function getGame(gameName) {
if (!games[gameName]) {
games[gameName] = {}
}
return games[gameName]
}
function createPlayer(uuid, socket) {
players[socket] = {
uuid,
socket,
isConnected: true,
}
return players[socket]
}
function getPlayer(uuid) {
for (const p in players) {
if (players[p].uuid === uuid) return players[p]
}
return null
}
function disconnectPlayer(socket) {
players[socket].isConnected = false
}
function extractGameName(socket) {
let referer
try {
referer = socket.handshake.headers.referer
} catch (e) {
console.error('Cannot extract game name from referer')
return null
}
return referer.split('/')[3]
}
io.sockets.on('connection', socket => {
socket.emit('handshake0')
socket.on('handshake1', uuid => {
if (!uuid) {
uuid = uuidv4()
socket.emit('uuid', uuid)
}
socket.uuid = uuid
// if (!getPlayer(uuid)) {
// createPlayer(uuid, socket)
// }
// console.log(uuid)
players[socket.id] = socket
if (!whitePlayer) {
if (socket !== blackPlayer) {
console.log('white')
whitePlayer = socket
socket.emit('color', hive.colors.WHITE)
}
} else if (!blackPlayer) {
if (socket !== whitePlayer) {
console.log('black')
blackPlayer = socket
socket.emit('color', hive.colors.BLACK)
}
}
socket.emit('turn', hive.getTurn())
socket.emit('gameState', getGameState())
})
socket.on('move', ({ fromSpaceIndex, toSpaceIndex }) => {
console.log('move', fromSpaceIndex, toSpaceIndex)
const fromSpace = hive.getSpace(fromSpaceIndex)
const toSpace = hive.getSpace(toSpaceIndex)
console.log('isValidMove', hive.isValidMove(fromSpace, toSpace))
if (hive.isValidMove(fromSpace, toSpace)) {
hive.movePiece(fromSpace, toSpace)
socket.broadcast.emit('gameState', getGameState())
io.emit('turn', hive.nextTurn())
}
})
socket.on('reset', () => {
hive.resetGame()
whitePlayer = null
blackPlayer = null
Object.keys(players).forEach((socketId, i) => {
console.log({ socketId })
if (i === 0) {
whitePlayer = players[socketId]
players[socketId].emit('color', hive.colors.WHITE)
} else if (i === 1) {
blackPlayer = players[socketId]
players[socketId].emit('color', hive.colors.BLACK)
}
})
io.emit('gameState', getGameState())
})
socket.on('disconnect', data => {
// disconnectPlayer(socket)
delete players[socket.id]
if (socket === whitePlayer) {
whitePlayer = null
}
if (socket === blackPlayer) {
blackPlayer = null
}
})
})
function getGameState() {
return hive.getSpaces().map(({ index, pieces }) => ({
index,
pieces,
}))
}