-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
113 lines (99 loc) · 3.09 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
import express from 'express'
import http from 'http'
import { Server as SocketIOServer } from 'socket.io'
import webpack from 'webpack'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpackHotMiddleware from 'webpack-hot-middleware'
import webpackConfig from './webpack.config.js'
import GameState from './src/game-state.js'
import { GAME_TIMEOUT_MS, PAUSE_AFTER_ROUND_MS } from './src/game-rules.js'
const app = express()
const server = http.Server(app)
const io = new SocketIOServer(server)
const PORT = process.env.PORT || 3002
app.use(webpackDevMiddleware(webpack(webpackConfig), {
publicPath: webpackConfig.output.publicPath
}))
app.use(webpackHotMiddleware(webpack(webpackConfig)))
// Serve static files from the "public" directory
app.use(express.static('public/dist'))
// Send the Phaser client when a user visits the root URL
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html')
});
const games = []
// start with just a single game instance:
games[0] = new GameState(0)
let gameTimeoutHandler
function resetGame () {
games[0] = new GameState(0)
console.log('game reset')
}
function createTimeoutHandler () {
// remove the previous
if (gameTimeoutHandler) {
clearTimeout(gameTimeoutHandler)
}
gameTimeoutHandler = setTimeout(resetGame, GAME_TIMEOUT_MS)
}
app.get('/reset', (_, res) => {
resetGame()
res.send('game state reset')
})
// Handle WebSocket connections
io.on('connection', (socket) => {
createTimeoutHandler()
let player = { id: 'unknown' }
// playerInfo may be empty depending on if this is a rejoin or not:
socket.on('request-join', playerInfo => {
if (games[0].validRejoin(playerInfo)) {
player = games[0].getPlayerState(parseInt(playerInfo.playerId))
socket.emit('player', player)
} else {
if (!games[0].canAddPlayer()) {
socket.emit('game-full')
} else {
player = games[0].addPlayer()
socket.emit('player', player)
socket.broadcast.emit('update', games[0].getState())
}
}
console.log(`Player ${player.id} connected`)
})
socket.on('play-card', card => {
// reset the timeout because we've received a move:
createTimeoutHandler()
const playSuccessful = games[0].playCard(player.id, card)
if (!playSuccessful) {
// skip next steps in game logic if playCard failed
return
}
if (games[0].roundOver()) {
setTimeout(() => {
const results = games[0].roundResults()
console.log('results', results)
games[0].nextRound(results.winner)
io.emit('update', games[0].getState())
}, PAUSE_AFTER_ROUND_MS)
}
else {
games[0].nextTurn()
}
io.emit('update', games[0].getState())
if (games[0].gameOver()) {
games[0].handleGameOver()
const winner = games[0].getWinner()
console.log('game over')
io.emit('game-over', {
winner,
})
}
})
// Handle disconnection
socket.on('disconnect', () => {
console.log(`Player ${player.id} disconnected`)
});
});
server.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`)
});