'use strict' const express = require('express'), app = express(), fs = require('fs'), http = require('http'), // https = require('https'), map = require('./lib/maper'), // secure = require('express-force-ssl'), Url = require('url'), io = require('ws'), serveStatic = require('serve-static'), log = require('./lib/colorized').log, //colorized = require('./lib/colorized').colorized, logo = require('./lib/logo').logo, options = { key: fs.readFileSync(__dirname + '/ssl/key.pem'), cert: fs.readFileSync(__dirname + '/ssl/cert.pem') }, channels = {}, styles = { disconnect: ["FgRed", "Bright"], connect: ["FgGreen", "Bright"] }; logo(); app //.use(secure) .use(serveStatic(__dirname + '/public')); const server = http.createServer(app), ws = new io.Server({ server: server }); server.listen(80) ws.on('connection', (socket, req) => { let params = Url.parse(req.url, true).query; socket.channel = params.channelName; socket.username = params.username; if (!channels[socket.channel]) { channels[socket.channel] = map.create(socket.channel); } socket.send(socket.username + " create " + JSON.stringify(channels[socket.channel])); channels[socket.channel].players[socket.username] = { "position": map.getRandomPosition(channels[socket.channel].limits), "direction": "down", "state": "stop", "username": socket.username, "lives": channels[socket.channel].player.lives, "scale": channels[socket.channel].player.scale, "score": 0, "width": 0, "height": 0 }; let msg = socket.username + " " + JSON.stringify(channels[socket.channel].players[socket.username]); socket.send(msg); // Cuando recive un mensaje socket.on('message', msg => { var username = msg.split(" ")[0]; var type = msg.split(" ")[1]; if (type != "chat" && channels[socket.channel].players[socket.username].position) { var data = JSON.parse(msg.replace(username + " ", "")), v = channels[socket.channel].player.velocity_divisor ? ((channels[socket.channel].players[socket.username].position.y) + (channels[socket.channel].size.y / 2)) / channels[socket.channel].player.velocity_divisor : channels[socket.channel].player.velocity, mx = -data.vx / channels[socket.channel].player.dvx * v, my = -data.vy / channels[socket.channel].player.dvy * v; if (map.moveX(mx, channels[socket.channel].players[socket.username], channels[socket.channel])) { channels[socket.channel].players[socket.username].position.x += mx; } if (map.moveY(my, channels[socket.channel].players[socket.username], channels[socket.channel])) { channels[socket.channel].players[socket.username].position.y += my; } channels[socket.channel].players[socket.username].state = data.state; channels[socket.channel].players[socket.username].direction = data.direction; channels[socket.channel].players[socket.username].width = data.width; channels[socket.channel].players[socket.username].height = data.height; if(channels[socket.channel].player.scale_ratio_divisor){ channels[socket.channel].players[socket.username].scale = (((channels[socket.channel].players[socket.username].position.y * -1) / channels[socket.channel].player.scale_ratio_divisor) - channels[socket.channel].player.scale) * -1; }else{ channels[socket.channel].players[socket.username].scale = channels[socket.channel].player.scale; } if (channels[socket.channel].players[socket.username].state == "attack") { var collider; var punch = 80; switch (channels[socket.channel].players[socket.username].direction) { case "up": collider = { position: { x: channels[socket.channel].players[socket.username].position.x, y: parseInt(channels[socket.channel].players[socket.username].position.y) - 40 }, width: channels[socket.channel].players[socket.username].width, height: 40, punch: -punch, direction: "y" }; break; case "down": collider = { position: { x: channels[socket.channel].players[socket.username].position.x, y: parseInt(channels[socket.channel].players[socket.username].position.y) + parseInt(channels[socket.channel].players[socket.username].height) }, width: channels[socket.channel].players[socket.username].height, height: 40, punch: punch, direction: "y" }; break; case "left": collider = { position: { x: parseInt(channels[socket.channel].players[socket.username].position.x) - 40, y: channels[socket.channel].players[socket.username].position.y }, width: 40, height: channels[socket.channel].players[socket.username].height, punch: -punch, direction: "x" }; break; case "right": collider = { position: { x: parseInt(channels[socket.channel].players[socket.username].position.x) + parseInt(channels[socket.channel].players[socket.username].width), y: channels[socket.channel].players[socket.username].position.y }, width: 40, height: channels[socket.channel].players[socket.username].height, punch: punch, direction: "x" }; break; } var msg2 = ""; Object.values(channels[socket.channel].players).map(x => { if(map.collision(collider, x)){ x.lives -= parseInt(x.lives) > 0 ? 1 : 0; if(parseInt(x.lives) == 0){ channels[socket.channel].players[socket.username].lives += parseInt(channels[socket.channel].players[socket.username].lives) < 16 ? 1 : 0; channels[socket.channel].players[socket.username].score += parseInt(x.score) != 0 ? Math.round(x.score/2) : 0; x.score = 0; x.position = map.getRandomPosition(channels[socket.channel].limits); if(channels[socket.channel].player.scale_ratio_divisor){ x.scale = (((x.position.y * -1) / channels[socket.channel].player.scale_ratio_divisor) - channels[socket.channel].player.scale) * -1; } x.lives = channels[socket.channel].player.lives; }else{ if(collider.direction == "x"){ if(map.moveX(collider.punch, x, channels[socket.channel])){ x.position[collider.direction] += collider.punch; } }else{ if(map.moveY(collider.punch, x, channels[socket.channel])){ x.position[collider.direction] += collider.punch; } } channels[socket.channel].players[socket.username].score += 10; if(channels[socket.channel].player.scale_ratio_divisor){ x.scale = (((x.position.y * -1) / channels[socket.channel].player.scale_ratio_divisor) - channels[socket.channel].player.scale) * -1; } } channels[socket.channel].players[x.username] = x; msg2 = x.username + " " + JSON.stringify(x); } }); } msg = socket.username + " " + JSON.stringify(channels[socket.channel].players[socket.username]); } ws.clients.forEach(function each(client) { if (client.channel == socket.channel && client.readyState === io.OPEN) { if (msg2) client.send(msg2); client.send(msg); } }); }) // Cierra la conexión y envía a los demás el mensaje .on('close', () => { log(socket.username + " | Disconect on " + socket.channel + ".", styles.disconnect); ws.clients.forEach(function each(client) { if (client !== socket && client.channel == socket.channel && client.readyState === io.OPEN) { client.send(socket.username + " left"); } }); delete channels[socket.channel].players[socket.username]; socket.removeAllListeners(); //socket.disconnect(); }); log(socket.username + " | Connect on " + socket.channel + ".", styles.connect); }); /* .on('register', data => { log("register"); socket.emit('users', { users: "testing" }) socket.broadcast.emit('adduser', { user: "elgustavo" }) }) */