diff --git a/server/public/index.html b/server/public/index.html
new file mode 100755
index 0000000..e8d4e27
--- /dev/null
+++ b/server/public/index.html
@@ -0,0 +1,269 @@
+
+
+
+
+
+ WebSocket MUD
+
+
+
+
+
Connecting...
+
+
+
+
+
+
+
+
+
+
diff --git a/server/server.js b/server/server.js
index 6d84d40..ba57195 100755
--- a/server/server.js
+++ b/server/server.js
@@ -3,7 +3,17 @@ const http = require('http');
const path = require('path');
const fs = require('fs');
+/**
+ * Player
+ *
+ * @property WebSocket websocket
+ */
class Player {
+ /**
+ *
+ * @param {String} name
+ * @param {WebSocket} websocket
+ */
constructor(name, websocket) {
this.name = name;
this.websocket = websocket;
@@ -13,6 +23,11 @@ class Player {
this.level = 1;
}
+ /***
+ * Send a message back to the client via the websocket.
+ *
+ * @param {string} message
+ */
sendMessage(message) {
if (this.websocket.readyState === WebSocket.OPEN) {
this.websocket.send(JSON.stringify({
@@ -28,6 +43,13 @@ class Player {
}
class Room {
+ /**
+ *
+ * @param {string} id
+ * @param {string} name
+ * @param {string} description
+ * @param {string[]} exits
+ */
constructor(id, name, description, exits = {}) {
this.id = id;
this.name = name;
@@ -38,22 +60,45 @@ class Room {
this.npcs = [];
}
+ /**
+ * Add a player to the list of active players.
+ *
+ * (an active player is a player that currently has an active web socketA)
+ *
+ * @param {Player} player
+ */
addPlayer(player) {
this.players.add(player);
this.broadcastToRoom(`${player.name} enters the room.`, player);
}
+ /**
+ * Remove a player from the list of active players.
+ *
+ * (an active player is a player that currently has an active web socketA)
+ *
+ * @param {Player} player
+ */
removePlayer(player) {
this.players.delete(player);
this.broadcastToRoom(`${player.name} leaves the room.`, player);
}
+ /**
+ * Send a message to all other players in this room.
+ *
+ * @param {string} message
+ * @param {Player} excludePlayer A single player to exclude from the broadcast
+ */
broadcastToRoom(message, excludePlayer = null) {
- for (const player of this.players) {
- if (player !== excludePlayer) {
- player.sendMessage(message);
- }
- }
+ // for (const player of this.players) {
+ // if (player !== excludePlayer) {
+ // player.sendMessage(message);
+ // }
+ // }
+ this.getPlayersExcept(excludePlayer).forEach((player) => {
+ player.sendMessage(message);
+ })
}
getPlayersExcept(excludePlayer) {
@@ -104,9 +149,13 @@ class MudServer {
this.rooms.set('deep_forest', deepForest);
}
+ /**
+ *
+ * @param {WebSocket} ws
+ */
handleConnection(ws) {
console.log('New connection established');
-
+
ws.send(JSON.stringify({
type: 'message',
content: 'Welcome to the WebSocket MUD!\nWhat is your character name?'
@@ -126,6 +175,12 @@ class MudServer {
});
}
+ /**
+ *
+ * @param {WebSocket} ws
+ * @param {strings} message
+ * @returns
+ */
handleMessage(ws, message) {
const player = this.players.get(ws);
@@ -147,6 +202,11 @@ class MudServer {
this.processCommand(player, message.content.trim());
}
+ /**
+ *
+ * @param {WebSocket} ws
+ * @param {string} name
+ */
createPlayer(ws, name) {
const player = new Player(name, ws);
this.players.set(ws, player);
@@ -159,6 +219,11 @@ class MudServer {
this.showRoom(player);
}
+ /**
+ *
+ * @param {Player} player
+ * @param {string} input
+ */
processCommand(player, input) {
const args = input.toLowerCase().split(' ');
const command = args[0];
@@ -232,6 +297,12 @@ class MudServer {
player.sendPrompt();
}
+ /**
+ *
+ * @param {Player} player
+ * @param {*} direction
+ * @returns
+ */
movePlayer(player, direction) {
const currentRoom = this.rooms.get(player.currentRoom);
const newRoomId = currentRoom.exits[direction];
@@ -278,7 +349,7 @@ class MudServer {
sayToRoom(player, message) {
const room = this.rooms.get(player.currentRoom);
const fullMessage = `${player.name} says: "${message}"`;
-
+
room.broadcastToRoom(fullMessage, player);
player.sendMessage(`You say: "${message}"`);
}
@@ -314,7 +385,7 @@ Available Commands:
const player = this.players.get(ws);
if (player) {
console.log(`Player ${player.name} disconnected`);
-
+
// Remove from room
const room = this.rooms.get(player.currentRoom);
if (room) {
@@ -332,7 +403,7 @@ Available Commands:
const server = http.createServer((req, res) => {
let filePath = path.join(__dirname, 'public', req.url === '/' ? 'index.html' : req.url);
const ext = path.extname(filePath);
-
+
let contentType = 'text/html';
if (ext === '.js') contentType = 'application/javascript';
if (ext === '.css') contentType = 'text/css';