Files
docker-compose-hatthieves/testing/magicworld/server/server.js
2020-05-28 10:46:51 +00:00

210 líneas
8.7 KiB
JavaScript

'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" })
})
*/