Created
September 17, 2016 17:03
-
-
Save HoeenCoder/2d2917e656fca33a52686b93e2a78cc0 to your computer and use it in GitHub Desktop.
Modified app.js 1 (Testing more than 1 tent)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var express = require('express'); | |
var SAT = require('sat'); | |
var app = express(); | |
var http = require('http').Server(app); | |
var io = require('socket.io')(http); | |
var c = require('./config.json'); | |
c.numTents = 2; //for testing this would normally be in config.json | |
var util = require('./util.js'); | |
var sockets = {}; | |
var users = []; | |
var resources = []; | |
var workers = []; | |
var soldiers = []; | |
var leaderboard = []; | |
var leaderboardUpdated = false; | |
var V = SAT.Vector; | |
var C = SAT.Circle; | |
io.on('connection', function(socket) { | |
console.log('A user connected.'); | |
var radius = c.baseRadius; | |
var position = c.newPlayerInitPosition == 'random' ? {x: Math.round(Math.random() * c.gameWidth), y: Math.round(Math.random() * c.gameHeight)} : c.newPlayerInitPosition; | |
var hp = c.defaulthp, maxhp = c.defaulthp; | |
var tents = []; | |
for(let i = 0; i < c.numTents; i++) { | |
tents.push({ | |
radius: c.baseRadius, | |
x: position.x, | |
y: position.y, | |
speed: c.baseSpeed, | |
hp: hp, | |
maxhp: maxhp, | |
move: true | |
}); | |
} | |
var level = c.defaultLvl > 0 && c.defaultLvl < 46 ? c.defaultLvl : 1; | |
var points = 0; //change this to an equation that issues the correct number if points based on level. | |
var currentPlayer = { | |
id: socket.id, | |
x: position.x, | |
y: position.y, | |
velo: {x: 0, y: 0}, | |
speed: c.baseSpeed, | |
tents: tents, | |
points: points, | |
level: level, | |
maxhp: maxhp, | |
hp: hp, | |
stationary: false, | |
hue: Math.round(Math.random() * 360), | |
target: {x: 0, y: 0} | |
}; | |
socket.on('gotit', function(player) { | |
console.log('[INFO] ' + player.name + ' connecting.'); | |
if(searchUsers(player.id) > -1) { | |
console.log('[INFO] Player ID is already connected, kicking.'); | |
socket.disconnect(); | |
} else if(!validNick(player.name)) { | |
socket.emit('kick', 'Invalid username.'); | |
socket.disconnect(); | |
} else { | |
sockets[player.id] = socket; | |
var radius = c.baseRadius; | |
var position = c.newPlayerInitPosition == 'random' ? {x: Math.round(Math.random() * c.gameWidth), y: Math.round(Math.random() * c.gameHeight)} : c.newPlayerInitPosition; | |
var hp = c.defaulthp, maxhp = c.defaulthp; | |
player.x = position.x; | |
player.y = position.y; | |
player.target.x = 0; | |
player.target.y = 0; | |
player.velo.x = 0; | |
player.velo.y = 0; | |
player.speed = c.baseSpeed; | |
var tents = []; | |
for(let i = 0; i < c.numTents; i++) { | |
tents.push({ | |
radius: c.baseRadius, | |
x: position.x, | |
y: position.y, | |
speed: c.baseSpeed, | |
hp: hp, | |
maxhp: maxhp, | |
move: true | |
}); | |
} | |
player.points = 0; | |
player.level = c.defaultLvl > 0 ? c.defaultLvl : 1; | |
player.stationary = false; | |
player.hue = Math.round(Math.random() * 360); | |
currentPlayer = player; | |
users.push(currentPlayer); | |
socket.emit('gameSetup', { | |
gameWidth: c.gameWidth, | |
gameHeight: c.gameHeight | |
}); | |
console.log('Total players: ' + users.length); | |
} | |
}); | |
socket.on('windowResized', function (data) { | |
currentPlayer.screenWidth = data.screenWidth; | |
currentPlayer.screenHeight = data.screenHeight; | |
}); | |
socket.on('respawn', function() { | |
if(searchUsers(currentPlayer.id) > -1) { | |
users.splice(searchUsers(currentPlayer.id), 1); | |
} | |
socket.emit('welcome', currentPlayer); | |
console.log('[INFO] User ' + (currentPlayer.name == undefined ? '[Not yet named]' : currentPlayer.name) + ' respawned.'); | |
}); | |
socket.on('disconnect', function() { | |
if(searchUsers(currentPlayer.id) > -1) { | |
users.splice(searchUsers(currentPlayer.id), 1); | |
} | |
console.log('[INFO] User ' + currentPlayer.name + ' disconnected.'); | |
}); | |
socket.on('0', function(target, velo) { | |
if(target.x !== currentPlayer.x || target.y !== currentPlayer.y) { | |
currentPlayer.target = target; | |
} | |
if(velo.x !== currentPlayer.velo.x || velo.y !== currentPlayer.velo.y) { | |
currentPlayer.velo = velo; | |
} | |
}); | |
}); | |
function movePlayer(player) { | |
var x =0,y =0; | |
for(var i=0; i<player.tents.length; i++) { | |
if(player.stationary) return; | |
var target = { | |
x: player.x - player.tents[i].x + player.target.x, | |
y: player.y - player.tents[i].y + player.target.y | |
}; | |
var dist = Math.sqrt(Math.pow(target.y, 2) + Math.pow(target.x, 2)); | |
var deg = Math.atan2(target.y, target.x); | |
var slowDown = 1; | |
/*if(player.tents[i].speed <= 6.25) { | |
slowDown = util.log(player.tents[i].mass, c.slowBase) - initMassLog + 1; | |
}*/ | |
var deltaY = player.speed * Math.sin(deg) / slowDown; | |
var deltaX = player.speed * Math.cos(deg) / slowDown; | |
if(player.speed > c.maxSpeed) { | |
player.speed -= 0.5; | |
} | |
if (dist < (50 + player.tents[i].radius)) { | |
deltaY *= dist / (50 + player.tents[i].radius); | |
deltaX *= dist / (50 + player.tents[i].radius); | |
} | |
if (!isNaN(deltaY)) { | |
player.tents[i].y += deltaY; | |
} | |
if (!isNaN(deltaX)) { | |
player.tents[i].x += deltaX; | |
} | |
// Find best solution. | |
for(var j=0; j<player.tents.length; j++) { | |
if(j != i && player.tents[i] !== undefined) { | |
var distance = Math.sqrt(Math.pow(player.tents[j].y-player.tents[i].y,2) + Math.pow(player.tents[j].x-player.tents[i].x,2)); | |
var radiusTotal = (player.tents[i].radius + player.tents[j].radius); | |
if(distance < radiusTotal) { | |
//if(player.lastSplit > new Date().getTime() - 1000 * c.mergeTimer) { //Not merging. | |
if(player.tents[i].x < player.tents[j].x) { | |
player.tents[i].x--; | |
} else if(player.tents[i].x > player.tents[j].x) { | |
player.tents[i].x++; | |
} | |
if(player.tents[i].y < player.tents[j].y) { | |
player.tents[i].y--; | |
} else if((player.tents[i].y > player.tents[j].y)) { | |
player.tents[i].y++; | |
} | |
//} | |
/*else if(distance < radiusTotal / 1.75) { //Merge into one. | |
player.tents[i].mass += player.tents[j].mass; | |
player.tents[i].radius = util.massToRadius(player.tents[i].mass); | |
player.tents.splice(j, 1); | |
}*/ | |
} | |
} | |
} | |
if(player.tents.length > i) { | |
var borderCalc = player.tents[i].radius / 3; | |
if (player.tents[i].x > c.gameWidth - borderCalc) { | |
player.tents[i].x = c.gameWidth - borderCalc; | |
} | |
if (player.tents[i].y > c.gameHeight - borderCalc) { | |
player.tents[i].y = c.gameHeight - borderCalc; | |
} | |
if (player.tents[i].x < borderCalc) { | |
player.tents[i].x = borderCalc; | |
} | |
if (player.tents[i].y < borderCalc) { | |
player.tents[i].y = borderCalc; | |
} | |
x += player.tents[i].x; | |
y += player.tents[i].y; | |
} | |
} | |
player.x = x/player.tents.length; | |
player.y = y/player.tents.length; | |
} | |
function searchUsers(id) { | |
for(let i = 0; i < users.length; i++) { | |
if(users[i].id === id) return i; | |
} | |
return -1; | |
} | |
function tickPlayer(currentPlayer) { | |
movePlayer(currentPlayer); | |
//more to add soon! | |
} | |
function moveloop() { | |
for(var i = 0; i < users.length; i++) { | |
tickPlayer(users[i]); | |
} | |
} | |
function gameloop() { | |
if(users.length > 0) { | |
users.sort(function(a, b) { return b.points - a.points; }); | |
var topUsers = []; | |
for(var i = 0; i < Math.min(10, users.length); i++) { | |
topUsers.push({ | |
id: users[i].id, | |
name: users[i].name | |
}); | |
} | |
if(isNaN(leaderboard) || leaderboard.length !== topUsers.length) { | |
leaderboard = topUsers; | |
leaderboardUpdated = true; | |
} else { | |
for(i = 0; i < leaderboard.length; i++) { | |
if(leaderboard[i].id !== topUsers[i].id) { | |
leaderboard = topUsers; | |
leaderboardUpdated = true; | |
break; | |
} | |
} | |
} | |
} | |
} | |
function validNick(nickname) { | |
var regex = /^\w*$/; | |
return regex.exec(nickname) !== null; | |
}; | |
function sendUpdates() { | |
users.forEach(function(u) { | |
//center view if x/y is undefined (for player who died) | |
u.x = u.x || c.gameWidth / 2; | |
u.y = u.y || c.gameWidth / 2; | |
//find visible things | |
var visibleResources = resources.map(function(f) { | |
if(f.x > u.x - u.screenWidth/2 - f.radius && | |
f.x < u.x + u.screenWidth/2 + f.radius && | |
f.y > u.y - u.screenHeight/2 - f.radius && | |
f.y < u.y + u.screenHeight/2 + f.radius) { | |
return f; | |
} | |
}).filter(function(f) { return f; }); | |
var visibleWorkers = workers.map(function(f) { | |
if(f.x > u.x - u.screenWidth/2 - f.radius - 20 && | |
f.x < u.x + u.screenWidth/2 + f.radius + 20 && | |
f.y > u.y - u.screenHeight/2 - f.radius - 20 && | |
f.y < u.y + u.screenHeight/2 + f.radius + 20) { | |
return f; | |
} | |
}).filter(function(f) { return f; }); | |
var visibleSoldiers = soldiers.map(function(f) { | |
if(f.x > u.x - u.screenWidth/2 - f.radius - 20 && | |
f.x < u.x + u.screenWidth/2 + f.radius + 20 && | |
f.y > u.y - u.screenHeight/2 - f.radius - 20 && | |
f.y < u.y + u.screenHeight/2 + f.radius + 20) { | |
return f; | |
} | |
}).filter(function(f) { return f; }); | |
var visibleTents = users.map(function(f) { | |
for(var z = 0; z < f.tents.length; z++) { | |
if(f.tents[z].x + f.tents[z].radius > u.x - u.screenWidth/2 - 20 && | |
f.tents[z].x - f.tents[z].radius < u.x + u.screenWidth/2 + 20 && | |
f.tents[z].y + f.tents[z].radius > u.y - u.screenHeight/2 - 20 && | |
f.tents[z].y - f.tents[z].radius < u.y + u.screenHeight/2 + 20) { | |
z = f.tents.length; | |
if(f.id !== u.id) { | |
return {id: f.id, x: f.x, y: f.y, tents: f.tents, hue: f.hue, name: f.name, hp: f.hp, maxhp: f.maxhp, stationary: f.stationary}; | |
} else { | |
return {x: f.x, y: f.y, tents: f.tents, hue: f.hue, hp: f.hp, maxhp: f.maxhp, stationary: f.stationary}; | |
} | |
} | |
} | |
}).filter(function(f) { return f; }); | |
sockets[u.id].emit('serverSayMove', visibleResources, visibleWorkers, visibleSoldiers, visibleTents); | |
if(leaderboardUpdated) { | |
sockets[u.id].emit('leaderboard', { | |
players: users.length, | |
leaderboard: leaderboard | |
}); | |
} | |
}); | |
leaderboardUpdated = false; | |
} | |
setInterval(moveloop, 1000 / 60); | |
setInterval(gameloop, 1000); | |
setInterval(sendUpdates, 1000 / c.networkUpdateFactor); | |
app.use(express.static(__dirname + '/client')); | |
var ipaddress = process.env.OPENSHIFT_NODEJS_IP || process.env.IP || '127.0.0.1'; | |
var serverport = process.env.OPENSHIFT_NODEJS_PORT || process.env.PORT || c.port; | |
if (process.env.OPENSHIFT_NODEJS_IP !== undefined) { | |
http.listen( serverport, ipaddress, function() { | |
console.log('Now listening on port ' + serverport); | |
}); | |
} else { | |
http.listen( serverport, function() { | |
console.log('Now listening on port ' + c.port); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment