From 61ae57a85020b64d25c7d085ebeadb3425ef9d9f Mon Sep 17 00:00:00 2001 From: Asraelite Date: Mon, 28 Mar 2016 13:16:38 +0100 Subject: [PATCH] improve chat --- package.json | 1 + public/static/css/styles.css | 9 + public/static/js/wingbase/gui/chat.js | 22 ++- public/static/js/wingbase/gui/gui.js | 9 + public/static/js/wingbase/render/render.js | 2 +- public/static/js/wingbase/world/physics.js | 2 +- server/game/index.js | 2 +- server/game/names.json | 204 ++++++++++++++++++++ server/game/net/connection.js | 16 +- server/game/player.js | 25 ++- server/game/room/index.js | 22 ++- server/game/room/world/body/turret/mount.js | 8 +- server/game/room/world/physics.js | 2 +- server/game/room/world/traits/ships.json | 15 +- 14 files changed, 306 insertions(+), 33 deletions(-) create mode 100644 server/game/names.json diff --git a/package.json b/package.json index d52a25e..2e37308 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "box2d-html5": "^0.1.230", "colors": "^1.1.2", + "escape-html": "^1.0.3", "express": "^4.13.4", "jade": "^1.11.0", "poly-decomp": "git://github.com/schteppe/poly-decomp.js.git", diff --git a/public/static/css/styles.css b/public/static/css/styles.css index ed68b28..85343ca 100644 --- a/public/static/css/styles.css +++ b/public/static/css/styles.css @@ -35,6 +35,15 @@ body { margin-top: 5px; } +#gui #chat b { + font-weight: 100; + color: #8af; +} + +#gui #chat span.server { + color: #68c; +} + #gui #chat input { font-family: inherit; font-size: 16px; diff --git a/public/static/js/wingbase/gui/chat.js b/public/static/js/wingbase/gui/chat.js index 503a967..971d5c2 100644 --- a/public/static/js/wingbase/gui/chat.js +++ b/public/static/js/wingbase/gui/chat.js @@ -15,20 +15,28 @@ GUI.prototype.Chat = class { addMessage(messageData) { let message = { type: messageData.type, - player: messageData.player, + source: messageData.source || '?', text: messageData.message, createTime: Date.now() }; - let span = this.gui.createElement(this.messageElement, 'span', { - html: message.text - }); + let span; + + if (message.type == 'server') { + span = this.gui.createElement(this.messageElement, 'span', { + html: `${message.text}` + }); + span.classList.add('server'); + } else { + span = this.gui.createElement(this.messageElement, 'span', { + html: `<${message.source.bold()}> ${message.text}` + }); + } + - this.messages.push(message); setTimeout(_ => { - this.messageElement.removeChild(span); - this.messages.shift(); + //this.messageElement.removeChild(span); }, 15000); } diff --git a/public/static/js/wingbase/gui/gui.js b/public/static/js/wingbase/gui/gui.js index a571e65..3c031c4 100644 --- a/public/static/js/wingbase/gui/gui.js +++ b/public/static/js/wingbase/gui/gui.js @@ -19,6 +19,15 @@ class GUI { return result.length == 1 ? result[0] : result; } + format() { + let args = Array.from(arguments); + let text = args.shift(); + let element = args.shift(); + let string = `<${element} class="${args.join(' ')}">`; + string += `${text}`; + return string; + } + tick() { this.chat.tick(); } diff --git a/public/static/js/wingbase/render/render.js b/public/static/js/wingbase/render/render.js index 68bbf8f..802590c 100644 --- a/public/static/js/wingbase/render/render.js +++ b/public/static/js/wingbase/render/render.js @@ -13,7 +13,7 @@ class Renderer { this.effects = new Set(); pallet.fillScreen(); - window.addEventListener('resize', pallet.fillScreen); + window.addEventListener('resize', _ => pallet.fillScreen(1000, 600)); } render(state) { diff --git a/public/static/js/wingbase/world/physics.js b/public/static/js/wingbase/world/physics.js index b6e98b8..01928d2 100644 --- a/public/static/js/wingbase/world/physics.js +++ b/public/static/js/wingbase/world/physics.js @@ -28,7 +28,7 @@ class Physics { bodyDef.angularVelocity = 0; bodyDef.bullet = body.type == 'missile'; bodyDef.linearDamping = body.bodyType == 'asteroid' ? 0.003 : 0.01; - bodyDef.angularDamping = body.bodyType == 'asteroid' ? 0.003 : 0.04; + bodyDef.angularDamping = body.bodyType == 'asteroid' ? 0.003 : 0.06; bodyDef.type = body.bodyType == 'structure' ? b2Body.b2_staticBody : b2Body.b2_dynamicBody; bodyDef.allowSleep = false; diff --git a/server/game/index.js b/server/game/index.js index 6af2b38..994ee51 100644 --- a/server/game/index.js +++ b/server/game/index.js @@ -16,7 +16,7 @@ class GameServer { })[0]; if (!room || room.full) { - room = new Room(); + room = new Room(this); this.rooms.set(room.name, room); } diff --git a/server/game/names.json b/server/game/names.json new file mode 100644 index 0000000..c7b1b0c --- /dev/null +++ b/server/game/names.json @@ -0,0 +1,204 @@ +{ + "fruit": [ + "Apple", + "Apricot", + "Avocado", + "Banana", + "Bilberry", + "Blackberry", + "Blackcurrant", + "Blueberry", + "Boysenberry", + "Cantaloupe", + "Currant", + "Cherry", + "Cherimoya", + "Cloudberry", + "Coconut", + "Cranberry", + "Damson", + "Date", + "Dragonfruit", + "Durian", + "Elderberry", + "Feijoa", + "Fig", + "Goji Berry", + "Gooseberry", + "Grape", + "Raisin", + "Grapefruit", + "Guava", + "Huckleberry", + "Jabuticaba", + "Jackfruit", + "Jambul", + "Jujube", + "Juniper berry", + "Kiwifruit", + "Kumquat", + "Lemon", + "Lime", + "Loquat", + "Lychee", + "Mango", + "Marionberry", + "Melon", + "Honeydew", + "Watermelon", + "Miracle Fruit", + "Mulberry", + "Nectarine", + "Nance", + "Olive", + "Orange", + "Blood Orange", + "Clementine", + "Mandarine", + "Tangerine", + "Papaya", + "Passionfruit", + "Peach", + "Pear", + "Persimmon", + "Physalis", + "Plantain", + "Plum", + "Prune", + "Pineapple", + "Pomegranate", + "Pomelo", + "Quince", + "Raspberry", + "Salmonberry", + "Rambutan", + "Redcurrant", + "Salal Berry", + "Salak", + "Satsuma", + "Star Fruit", + "Strawberry", + "Tamarillo", + "Tamarind", + "Ugli Fruit" + ], + "adjectives": { + "a": [ + "Awesome", + "Amazing", + "Awkward" + ], + "b": [ + "Bubbly", + "Brilliant", + "Bizzare", + "Bouncy", + "Blue" + ], + "c": [ + "Crazy", + "Cool" + ], + "d": [ + "Dizzy", + "Dangerous" + ], + "e": [ + "Energetic", + "Easy" + ], + "f": [ + "Funny", + "Fancy" + ], + "g": [ + "Giggly", + "Great", + "Golden" + ], + "h": [ + "Hipster", + "Hot", + "Holy" + ], + "i": [ + "Interesting", + "Insipid", + "Introverted" + ], + "j": [ + "Jolly" + ], + "k": [ + "Crazy", + "Cool" + ], + "l": [ + "Little", + "Lazy" + ], + "m": [ + "Magnificent", + "Minty", + "Magical" + ], + "n": [ + "Nosy", + "Noisy" + ], + "o": [ + "Oblivious", + "Omnipotent", + "Omnipresent", + "Okay" + ], + "p": [ + "Pretty", + "Puny", + "Precious", + "Perfect", + "Pitiful", + "Paranoid", + "Pink" + ], + "q": [ + "Quivering", + "Queer" + ], + "r": [ + "Radical", + "Racist" + ], + "s": [ + "Stupid", + "Silly", + "Smart" + ], + "t": [ + "Terrific", + "Terrible", + "Tiny" + ], + "u": [ + "Unbelievable", + "Ugly" + ], + "v": [ + "Voluptuous", + "Vague" + ], + "w": [ + "Wiggly", + "Weird" + ], + "x": [ + "Xenophobic" + ], + "y": [ + "Yellow" + ], + "z": [ + "Zany" + ] + } +} diff --git a/server/game/net/connection.js b/server/game/net/connection.js index d65e844..f36d04d 100644 --- a/server/game/net/connection.js +++ b/server/game/net/connection.js @@ -15,7 +15,7 @@ class Connection { this.chatCooldown = 0; socket.on('chat', data => { - this.chat(data); + this.player.chat(data); }); socket.on('setName', data => { @@ -33,20 +33,6 @@ class Connection { this.server.assignRoom(this.player); } - chat(data) { - //if(this.chatCooldown > 5 || !this.room) return; - if(!data.msg) return; - - wingbase.log(`${this.room}/${this.player.name}: ${data.msg}`); - - this.chatCooldown++; - this.io.to(this.room).emit('chat', { - type: 'player', - source: this.player.name, - message: data.msg.slice(0, 100) - }); - } - disconnect() { this.socket.disconnect(); this.player.disconnect(); diff --git a/server/game/player.js b/server/game/player.js index f1954e0..e9e54dc 100644 --- a/server/game/player.js +++ b/server/game/player.js @@ -1,6 +1,6 @@ 'use strict'; -const fruit = ['Apple', 'Banana', 'Pear', 'Plum', 'Pineapple', 'Peach', 'Apricot', 'Orange', 'Triangle', 'Kiwi', 'Mango', 'Strawberry', 'Lemon', 'Blueberry', 'Raspberry', 'Grape', 'Dragonfruit', 'Watermelon', 'Honeymelon', 'Pomegranate', 'Cherry', 'Avocado']; +const names = require('./names'); class Player { constructor(connection) { @@ -10,8 +10,10 @@ class Player { this.kickCount = 0; this.lastAction = Date.now(); this.connection = connection; - this.name = `Stupid ${fruit[Math.random() * fruit.length | 0]}`; + this.name = this.randomName(); this.delta = {}; + + this.chatCooldown = 0; } disconnect() { @@ -23,6 +25,21 @@ class Player { this.lastAction = Date.now(); } + randomName() { + let fruit = names.fruit[Math.random() * names.fruit.length | 0]; + let adjectives = names.adjectives[fruit[0].toLowerCase()]; + adjectives = adjectives || ['Weird']; + let adjective = adjectives[Math.random() * adjectives.length | 0]; + return adjective + ' ' + fruit; + } + + chat(data) { + if(!this.room) return; + if(!data.msg) return; + + this.room.chat(this, data.msg.slice(0, 100)); + } + send(msg, data) { this.connection.send(msg, data); } @@ -36,6 +53,10 @@ class Player { this.connection.send('update', this.delta); this.delta = {}; } + + tick() { + if(this.chatCooldown > 0) this.chatCooldown -= 0.1; + } } module.exports = Player; diff --git a/server/game/room/index.js b/server/game/room/index.js index b75c279..811fe5d 100644 --- a/server/game/room/index.js +++ b/server/game/room/index.js @@ -1,17 +1,22 @@ 'use strict'; +const escapeHtml = require('escape-html'); + const World = require('./world'); const messages = require('./messages.json'); class Room { - constructor() { + constructor(gameServer) { this.players = new Set(); this.teamA = new Set(); this.teamB = new Set(); this.world = new World(this); this.name = (Math.random() * 100000 | 0).toString(36); + this.gameServer = gameServer; + this.io = this.gameServer.net.io; + this.start(); } @@ -37,6 +42,8 @@ class Room { this.stop(); wingbase.gameServer.deleteRoom(this.name); } + + this.message('roomLeave', player.name); } setTeam(player, team) { @@ -66,6 +73,17 @@ class Room { this.players.forEach(player => player.send(msg, data)); } + chat(player, message) { + wingbase.log(`${this.name}/${player.name}: ${message}`); + + this.chatCooldown++; + this.io.to(this.name).emit('chat', { + type: 'player', + source: player.name, + message: escapeHtml(message.slice(0, 100)) + }); + } + message(type, values) { if (!(values instanceof Array)) values = [values]; @@ -74,7 +92,7 @@ class Room { // TODO: format name to class. - message = message.replace('@', values[0]); + message = message.replace('@', `${values[0]}`); this.broadcast('chat', { type: 'server', diff --git a/server/game/room/world/body/turret/mount.js b/server/game/room/world/body/turret/mount.js index f56a7ca..a35b29b 100644 --- a/server/game/room/world/body/turret/mount.js +++ b/server/game/room/world/body/turret/mount.js @@ -7,7 +7,11 @@ class Mount { this.ship = ship; this.type = data.type || 'turret'; - this.fixture = false; // TODO: Create fixture. + this.fixture = false; + this.position = { + x: data.pos[0], + y: data.pos[1] + } this.traversal = data.traversal ? { cw: data.bounds[0], @@ -22,7 +26,7 @@ class Mount { packFull() { return { - + } } } diff --git a/server/game/room/world/physics.js b/server/game/room/world/physics.js index b2e2113..ac31727 100644 --- a/server/game/room/world/physics.js +++ b/server/game/room/world/physics.js @@ -52,7 +52,7 @@ class Physics { bodyDef.angularVelocity = body.rvel || 0; bodyDef.bullet = body.type == 'missile'; bodyDef.linearDamping = body.type == 'asteroid' ? 0.003 : 0.01; - bodyDef.angularDamping = body.type == 'asteroid' ? 0.003 : 0.04; + bodyDef.angularDamping = body.type == 'asteroid' ? 0.003 : 0.06; bodyDef.type = body.type == 'structure' ? Box2D.b2BodyType.b2_staticBody : Box2D.b2BodyType.b2_dynamicBody; if (body.player || true) bodyDef.allowSleep = false; diff --git a/server/game/room/world/traits/ships.json b/server/game/room/world/traits/ships.json index 6a25ea4..3c9c093 100644 --- a/server/game/room/world/traits/ships.json +++ b/server/game/room/world/traits/ships.json @@ -5,7 +5,7 @@ "power": { "forward": 0.015, "back": 0, - "rotation": 0.003 + "rotation": 0.004 }, "frame": [ [ @@ -21,6 +21,19 @@ { "pos": [18, 4], "type": "fixed", + "size": 0, + "traversal": false + }, + { + "pos": [18, 28], + "type": "fixed", + "size": 0, + "traversal": false + }, + { + "pos": [1, 16], + "type": "fixed", + "size": 1, "traversal": false } ]