-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
108 lines (100 loc) · 3.46 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
const express = require("express");
const socket = require("socket.io");
const app = express();
server = app.listen(5000, () => console.log("server is running on port 5000"));
let clients = [];
let rooms = [];
const getRoomName = socket => Object.values(socket.rooms)[0];
const enterRoom = (roomName, name) => {
const index = rooms.findIndex(room => room.roomName === roomName);
if (index === -1) {
rooms.push({ roomName, players: [name] });
} else {
const oldRoomIndex = rooms.findIndex(room => room.roomName === name);
if (oldRoomIndex !== -1) {
rooms[oldRoomIndex].players = [];
}
const players = [rooms[index].players[0], name];
const randomPlayer = Math.round(Math.random());
const firstPlayer = randomPlayer === 0 ? players[0] : players[1];
rooms[index] = {
...rooms[index],
players,
firstPlayer
};
}
};
const getAvailableRooms = () => {
const availableRooms = rooms.filter(room => room.players.length === 1);
return availableRooms;
};
io = socket(server);
io.on("connection", socket => {
socket.emit("SOCKET", socket.id);
socket.on("SET_NAME", name => {
const isNameUsed = !!clients.find(client => client.name === name);
socket.name = name;
if (isNameUsed) socket.emit("NAME_ERROR", "This name is already used!");
else {
clients.push({ name, id: socket.id });
io.emit("TOTAL_PLAYERS", clients.length);
}
});
socket.on("JOIN_ROOM", (roomName, name) => {
if (getRoomName(socket)) socket.leave(getRoomName(socket));
enterRoom(roomName, socket.name);
socket.join(roomName, () => {
socket.to(getRoomName(socket)).emit("OPPONENT_JOINED", name);
io.emit("AVAILABLE_ROOMS", getAvailableRooms());
});
});
socket.on("GET_ROOMS", () => {
io.emit("AVAILABLE_ROOMS", getAvailableRooms());
});
socket.on("READY", (squares, destroyedShips, roomName) => {
const playerRoom = rooms.find(room => room.roomName === roomName);
socket
.to(getRoomName(socket))
.emit("OPPONENT_IS_READY", squares, destroyedShips, playerRoom);
});
socket.on("GUN_FIRED", (opponentSquares, opponentDestroyedShips) => {
socket
.to(getRoomName(socket))
.emit("OPPONENT_SHOT", opponentSquares, opponentDestroyedShips);
});
socket.on("CHANGE_TURN", name => {
socket.to(getRoomName(socket)).emit("TURN_CHANGED", name);
});
socket.on("END_GAME", () => {
io.in(getRoomName(socket)).emit("GAME_OVER");
});
socket.on("BACK_TO_LOBBY", (previousRoomName, newRoomName) => {
if (previousRoomName === newRoomName) {
const index = rooms.findIndex(room => room.roomName === previousRoomName);
rooms = [...rooms.slice(0, index), ...rooms.slice(index + 1)];
} else {
const index2 = rooms.findIndex(room => room.roomName === newRoomName);
rooms = [...rooms.slice(0, index2), ...rooms.slice(index2 + 1)];
}
socket.leave(getRoomName(socket));
});
socket.on("ASK_FOR_RESET", (name, roomName) => {
if (name) {
rooms.forEach((room, idx) => {
if (roomName === room.roomName) {
rooms[idx].firstPlayer = name;
}
});
}
socket.to(getRoomName(socket)).emit("OPPONENT_ASK_FOR_RESET");
});
socket.on("DECLINED_RESET", () => {
socket.to(getRoomName(socket)).emit("OPPONENT_DECLINED_RESET");
});
socket.on("disconnect", () => {
clients.forEach((client, idx) => {
if (client.id === socket.id) clients.splice(idx, 1);
});
io.emit("TOTAL_PLAYERS", clients.length);
});
});