2020-11-07 11:35:29 +01:00
|
|
|
import WebSocketServer from './WebSocketServer.js'
|
|
|
|
|
|
|
|
|
|
import express from 'express'
|
2020-11-08 14:13:43 +01:00
|
|
|
import { createPuzzle } from './puzzle.js'
|
2020-11-07 12:21:38 +01:00
|
|
|
import config from './config.js'
|
|
|
|
|
|
2020-11-08 14:13:43 +01:00
|
|
|
// desired number of tiles
|
|
|
|
|
// actual calculated number can be higher
|
|
|
|
|
const TARGET_TILES = 1000
|
|
|
|
|
|
|
|
|
|
const IMAGES = [
|
|
|
|
|
'/example-images/ima_86ec3fa.jpeg',
|
|
|
|
|
'/example-images/bleu.png',
|
|
|
|
|
'/example-images/saechsische_schweiz.jpg',
|
|
|
|
|
'/example-images/132-2048x1365.jpg',
|
|
|
|
|
]
|
|
|
|
|
const IMAGE_URL = IMAGES[0]
|
|
|
|
|
|
|
|
|
|
const games = {}
|
|
|
|
|
|
2020-11-07 12:21:38 +01:00
|
|
|
const port = config.http.port
|
|
|
|
|
const hostname = config.http.hostname
|
2020-11-07 11:35:29 +01:00
|
|
|
const app = express()
|
2020-11-07 12:21:38 +01:00
|
|
|
const statics = express.static('./../game/')
|
|
|
|
|
app.use('/', (req, res, next) => {
|
|
|
|
|
if (req.path === '/') {
|
|
|
|
|
res.send(`
|
|
|
|
|
<html><head><style>
|
|
|
|
|
html,body {margin: 0; overflow: hidden;}
|
|
|
|
|
html, body, #main { background: #222 }
|
2020-11-07 17:49:42 +01:00
|
|
|
canvas {cursor: none;}
|
2020-11-07 12:21:38 +01:00
|
|
|
</style></head><body>
|
|
|
|
|
<script>window.WS_ADDRESS = '${config.ws.connectstring}'</script>
|
|
|
|
|
<script src="index.js" type="module"></script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
`)
|
|
|
|
|
} else {
|
|
|
|
|
statics(req, res, next)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
app.listen(port, hostname, () => console.log(`server running on http://${hostname}:${port}`))
|
2020-11-07 11:35:29 +01:00
|
|
|
|
2020-11-07 12:21:38 +01:00
|
|
|
const wss = new WebSocketServer(config.ws);
|
2020-11-07 11:35:29 +01:00
|
|
|
|
|
|
|
|
const notify = (data) => {
|
|
|
|
|
// TODO: throttle
|
|
|
|
|
wss.notifyAll(data)
|
|
|
|
|
console.log('notify', data)
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-08 14:13:43 +01:00
|
|
|
wss.on('message', async ({socket, data}) => {
|
2020-11-07 11:35:29 +01:00
|
|
|
try {
|
|
|
|
|
const proto = socket.protocol.split('|')
|
|
|
|
|
const uid = proto[0]
|
|
|
|
|
const gid = proto[1]
|
|
|
|
|
const parsed = JSON.parse(data)
|
|
|
|
|
switch (parsed.type) {
|
|
|
|
|
case 'init': {
|
|
|
|
|
// a new player (or previous player) joined
|
2020-11-08 14:13:43 +01:00
|
|
|
games[gid] = games[gid] || {puzzle: await createPuzzle(TARGET_TILES, IMAGE_URL), players: {}}
|
2020-11-07 16:33:28 +01:00
|
|
|
|
2020-11-08 01:56:36 +01:00
|
|
|
games[gid].players[uid] = {id: uid, x: 0, y: 0, down: false}
|
2020-11-07 16:33:28 +01:00
|
|
|
|
|
|
|
|
wss.notifyOne({
|
|
|
|
|
type: 'init',
|
2020-11-08 01:56:36 +01:00
|
|
|
game: {
|
|
|
|
|
puzzle: games[gid].puzzle,
|
|
|
|
|
players: games[gid].players,
|
|
|
|
|
},
|
2020-11-07 16:33:28 +01:00
|
|
|
}, socket)
|
2020-11-07 11:35:29 +01:00
|
|
|
} break;
|
|
|
|
|
|
2020-11-07 16:33:28 +01:00
|
|
|
// somebody has changed the state
|
2020-11-07 11:35:29 +01:00
|
|
|
case 'state': {
|
2020-11-07 16:33:28 +01:00
|
|
|
for (let change of parsed.state.changes) {
|
|
|
|
|
switch (change.type) {
|
|
|
|
|
case 'change_player': {
|
|
|
|
|
games[gid].players[uid] = change.player
|
|
|
|
|
} break;
|
|
|
|
|
case 'change_tile': {
|
|
|
|
|
games[gid].puzzle.tiles[change.tile.idx] = change.tile
|
|
|
|
|
} break;
|
|
|
|
|
case 'change_data': {
|
|
|
|
|
games[gid].puzzle.data = change.data
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
notify({type:'state_changed', origin: uid, changes: parsed.state.changes})
|
2020-11-07 11:35:29 +01:00
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error(e)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
wss.listen()
|