-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
159 lines (135 loc) · 5.47 KB
/
index.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
var express = require('express');
var socket = require('socket.io');
// App setup
var app = express();
const port = process.env.PORT || 4000;
var server = app.listen(port, function(){
console.log('listening for requests on port ' + port + ',');
});
// Static files
app.use(express.static('public'));
// Variables
var playerToGame = new Map();
function newGameId () {
let gameId = 0;
do {
gameId = Math.floor(1000 + Math.random() * 9000);
}
while (Array.from(playerToGame.values()).find(code => code == gameId))
return gameId;
}
function newSeed () {
return Math.random().toString(36).substring(7);
}
// Socket setup & pass server
var io = socket(server);
io.on('connection', (socket) => {
console.log('made socket connection', socket.id);
// Removing from playerToGame on disconnect
socket.once('disconnect', function() {
let gameId = playerToGame.get(socket.id);
playerToGame.delete(socket.id);
let otherSocket = Array.from(playerToGame.keys()).find(key => playerToGame.get(key) == gameId);
if (otherSocket) {
playerToGame.delete(otherSocket);
io.sockets.to(otherSocket).emit('opponentDisconnected');
}
});
// Host new game
socket.on('hostGame', function(){
// Player is already in a game/hosting
if (playerToGame.get(socket.id)) {
let players = Array.from(playerToGame.keys()).filter(key => playerToGame.get(key) == playerToGame.get(socket.id));
if (players.length == 1) {
io.sockets.to(socket.id).emit('warning', "Already hosting game");
} else {
io.sockets.to(socket.id).emit('warning', "Can't host while in game");
}
return;
}
let gameId = newGameId();
playerToGame.set(socket.id, gameId);
io.sockets.to(socket.id).emit('hostingStarted', gameId);
});
// Join game
socket.on('joinGame', function(gameId){
let count = 0;
let hostSocketId;
// Player is already in a game/hosting
if (playerToGame.get(socket.id)) {
let players = Array.from(playerToGame.keys()).filter(key => playerToGame.get(key) == playerToGame.get(socket.id));
if (players.length == 2) {
io.sockets.to(socket.id).emit('warning', "Can't join while in game");
return;
}
// Player is hosting a game that hasn't started yet.
// They should be able to cancel that hosting, and join this game instead
// If the count == 1, then playerToGame.set(socket.id, gameId) will update it
// if not, it will still continue hosting.
}
for (let entry of playerToGame.entries()) {
if (entry[1] == gameId) {
count += 1;
hostSocketId = entry[0];
}
}
if (count == 1) {
// Easter egg when trying to join your own game
if (socket.id == hostSocketId) {
io.sockets.to(socket.id).emit('easteregg', hostSocketId);
return;
}
playerToGame.set(socket.id, gameId);
let seed = newSeed();
io.sockets.to(socket.id).emit('gameJoined', data = {socketId : hostSocketId, seed : seed}); // Game successfully joined
io.sockets.to(hostSocketId).emit('playerJoined', data = {socketId : socket.id, seed : seed}); // Telling host that a player has joined
}
else if (count > 1) {
io.sockets.to(socket.id).emit('warning', "Already two players in game"); // Failed to join game; already two players
}
else
{
io.sockets.to(socket.id).emit('warning', "Couldn't find game"); // Failed to join game; not hosted
}
});
// Starting Rematch
socket.on('startRematch', function(otherPlayer){
// Puts player back in a game, don't care about people trying to break the code (for now)
let gameId = newGameId();
playerToGame.set(socket.id, gameId);
// Easter egg check
if (otherPlayer == socket.id) {
io.sockets.to(socket.id).emit('easteregg', socket.id);
return;
}
// Opponent left
if ( Array.from(io.sockets.adapter.rooms.keys()).find(socket => socket == otherPlayer) == undefined) {
io.sockets.to(socket.id).emit('warning', "Opponent is no longer online");
return;
}
let seed = newSeed();
io.sockets.to(socket.id).emit('rematchGame', data = {seed : seed, message: "You started a rematch"});
// Puts second player into the same game
playerToGame.set(otherPlayer, gameId);
io.sockets.to(otherPlayer).emit('rematchGame', data = {seed : seed, message: "Opponent started a rematch"});
});
// Send game state
socket.on('sendGameState', function(gameState){
io.sockets.to(gameState.recipient).emit('receiveGameState', gameState);
});
// Send blocks
socket.on('sendBlocks', function(data){
io.sockets.to(data.recipient).emit('receiveBlocks', data.lines);
});
// Notify other player you got game over
socket.on('lostGame', function(otherGameId){
playerToGame.delete(socket.id);
playerToGame.delete(otherGameId);
// Easter egg time
if (socket.id == otherGameId) {
io.sockets.to(otherGameId).emit('eastereggDraw');
} else {
io.sockets.to(otherGameId).emit('gameWon');
}
});
});