var express = require("express"); var app = express(); var serv = require("http").Server(app); app.get('/', function(req,res) { res.sendFile(__dirname + '/client/index.html'); }); app.use('/client', express.static(__dirname + '/client')); serv.listen(2000); console.log("Server started."); var DEBUG = true; var SOCKET_LIST = {}; var Entity = function(){ var self = { x:250, y:250, speedX:0, speedY:0, id:"", } self.update = function(){ self.updatePosition(); } self.updatePosition = function(){ self.x += self.speedX; self.y += self.speedY; } self.getDistance = function(pt){ return Math.sqrt(Math.pow(self.x-pt.x,2)) + Math.pow(self.y-pt.y,2); } return self; } var Player = function(id){ var self = Entity(); self.id = id; self.number = "" + Math.floor(10 * Math.random()); self.pressingRight = false; self.pressingLeft = false; self.pressingUp = false; self.pressingDown = false; self.pressingAttack = false; self.mouseAngle = 0; self.maxSpeed = 10; var super_update = self.update; self.update = function(){ self.updateSpeed(); super_update(); if(self.pressingAttack){ self.shootBullet(self.mouseAngle); } } self.shootBullet = function(angle){ var b = Bullet(self.id, angle); b.x = self.x b.y = self.y } self.updateSpeed = function(){ if(self.pressingRight) self.speedX = self.maxSpeed; else if(self.pressingLeft) self.speedX = -self.maxSpeed; else self.speedX = 0; if(self.pressingUp) self.speedY = -self.maxSpeed; else if(self.pressingDown) self.speedY = self.maxSpeed; else self.speedY = 0; } Player.list[id] = self; return self; } Player.list = {}; Player.onConnect = function(socket){ var player = Player(socket.id); socket.on('keyPress', function(data){ if (data.inputId === 'left') player.pressingLeft = data.state; else if (data.inputId === 'right') player.pressingRight = data.state; else if (data.inputId === 'up') player.pressingUp = data.state; else if (data.inputId === 'down') player.pressingDown = data.state; else if (data.inputId === 'attack') player.pressingAttack = data.state; else if (data.inputId === 'mouseAngle') player.mouseAngle = data.state; }); } Player.onDisconnect = function(socket){ delete Player.list[socket.id]; } Player.update = function(){ var pack = []; for(var i in Player.list){ var player = Player.list[i]; player.update(); pack.push({ x:player.x, y:player.y, number:player.number }); } return pack; } var Bullet = function(parent, angle) { var self = Entity(); self.id = Math.random(); self.speedX = Math.cos(angle/180*Math.PI) *10; self.speedY = Math.sin(angle/180*Math.PI) *10; self.parent = parent; self.timer = 0; self.toRemove = false; var super_update = self.update; self.update = function(){ if (self.timer++ > 100) self.toRemove = true; super_update(); for (var i in Player.list){ var p = Player.list[i]; if(self.getDistance(p) < 32 && self.parent !== p.id){ //hp -- self.toRemove = true; } } } Bullet.list[self.id] = self; return self; } Bullet.list= {}; Bullet.update = function(){ var pack = []; for(var i in Bullet.list){ var bullet = Bullet.list[i]; bullet.update(); if(bullet.toRemove) delete Bullet.list[i]; else pack.push({ x:bullet.x, y:bullet.y, }); } return pack; } var USERS = { "bob":"bub", "asd": "fgh" } var isValidPassword = function(data, cb){ setTimeout(function(){ cb(USERS[data.username] === data.password); },10); } var isUsernameTaken = function(data, cb){ setTimeout(function(){ cb(USERS[data.username]); },10); } var addUser = function(data, cb){ setTimeout(function(){ USERS[data.username] = data.password; cb(); },10); } var io = require('socket.io')(serv, {}); io.sockets.on('connection', function(socket){ socket.id = Math.random(); SOCKET_LIST[socket.id] = socket; socket.on('signIn', function(data){ isValidPassword(data, function(res){ if (res){ Player.onConnect(socket); socket.emit('signInResponse', {success:true}); } else { socket.emit('signInResponse', {success:false}); } }); }); socket.on('signUp', function(data){ isUsernameTaken(data, function(res){ if (res){ socket.emit('signUpResponse', {success:false}); } else { addUser(data, function(){ socket.emit('signUpResponse', {success:true}); }); } }); }); socket.on('disconnect', function(){ delete SOCKET_LIST[socket.id]; Player.onDisconnect(socket); }); socket.on('sendMsgToServer', function(data){ var playerName = ("" + socket.id).slice(2,7); for (var i in SOCKET_LIST){ SOCKET_LIST[i].emit('addToChat', playerName + ': ' + data); } }); socket.on('evalServer', function(data){ if(DEBUG){ socket.emit('evalAnswer', eval(data)); } }); }); setInterval(function(){ var pack = { player:Player.update(), bullet:Bullet.update() } for(var i in SOCKET_LIST){ var socket = SOCKET_LIST[i]; socket.emit('newPositions', pack); } },1000/25);