2016-01-20 21:56:43 -05:00

411 lines
11 KiB
JavaScript

// Global Variables
var playerInfo = {};
var maxPlayers;
var numberOfPlayers = 1;
// Client Player Info
var myTeam;
var myCoord;
var myUsername;
// Animation Handling
var move; // Prevents move spam.
var moveTimer;
var setup = true;
/*var spectatorChoose = 1;
var spectatedUser;*/
// Timeout Handling
var canSend = true;
var turnTime = 3;
var hasSent = false;
var serverURL = "http://activate.adobe.com:5000"
// Colors
var playerColors = {
"red": "#E62E2E",
"blue": "#4343D8"
};
var claimedColors = {
"red": "#FF9999",
"blue": "#9999FF"
};
document.getElementsByClassName('play')[0].onclick = function initialize() {
var login = document.getElementById("login");
login.parentNode.removeChild(login);
getInitial(); // Gets team, coordinate, and max lobby players.
// TODO IP Handling, most likely not necessary
// Create scoreboard before table to prevent CSS glitching.
createScoreboard();
createInfo();
createTable();
// Update score before creating player so scoreboard starts at 0
updateScore();
waitForPlayers();
};
function getInitial() {
uuid4 = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, _uuid4);
};
//// OPTIMIZATION - cache callback
_uuid4 = function(cc) {
var rr = Math.random() * 16 | 0;
return (cc === 'x' ? rr : (rr & 0x3 | 0x8)).toString(16);
};
myUsername = uuid4();
var userId = {
username: [myUsername]
};
$.ajax({
url: serverURL + '/game',
type: 'POST',
type : 'POST',
data: JSON.stringify(userId, null, '\t'),
dataType: "json",
contentType: 'application/json;charset=UTF-8'
})
.then(
function success(data) {
myTeam = data.team;
myCoord = data.coordinate;
maxPlayers = data.max;
},
function error(e) {
console.log(e);
alert("Error, intial");
}
);
}
function waitForPlayers() {
timer1 = setTimeout(function() {
var sending = {
username: [myUsername]
};
$.ajax(serverURL + '/pregame', {
method: 'POST',
type : 'POST',
data: JSON.stringify(sending, null, '\t'),
dataType: "json",
contentType: 'application/json;charset=UTF-8'
})
.then(
function success(data) {
numberOfPlayers = data.playersInGame;
updateInfo();
if (numberOfPlayers == maxPlayers) {
countdown();
} else {
waitForPlayers();
}
},
function error(e) {
console.log(e);
alert("Error, waiting");
}
);
}, 3000);
}
function countdown() {
timer2 = setTimeout(function() {
$.ajax({
url: serverURL + '/pregame',
type: 'GET',
success: function(data) {
timeLeft = parseInt(data.timeLeft, 10);
updateTimer(timeLeft);
delete data['timeLeft'];
playerInfo = data;
animate();
if (timeLeft === 0) {
startGame();
} else {
countdown();
}
},
error: function(e) {
console.log(e);
alert("Error, countdown");
}
});
}, 250); //Prevent too many requests
}
function startGame() {
document.onkeydown = movePlayer;
document.getElementsByClassName('info')[0].childNodes[0].nodeValue = "Next Turn: 3"
timeMove();
autoScroll('start');
setup = false;
}
function sendMove(x,y) {
if (canSend) {
canSend = false;
hasSent = true;
var move = {
coordinate: [x,y],
team: myTeam,
username: myUsername,
};
$.ajax(serverURL + '/game', {
method: 'POST',
type : 'POST',
data: JSON.stringify(move, null, '\t'),
dataType: "json",
contentType: 'application/json;charset=UTF-8'
})
.then(
function success(data) {
playerInfo = data;
animate();
timeMove();
updateScore();
canSend = true;
hasSent = false;
},
function error(e) {
console.log(e);
alert("Error, move");
}
);
}
}
// CREATION
// Creation of Table
function createTable() {
var body = document.body;
var tbl = document.createElement('table');
tbl.style.border = "1px solid black";
for(var i = 0; i < 20; i++) {
var tr = tbl.insertRow();
for(var j = 0; j < 20; j++) {
var td = tr.insertCell();
}
}
body.appendChild(tbl);
table = document.getElementsByTagName('table')[0];
}
// Creation of Scoreboard
function createScoreboard() {
var scoreboard = document.getElementsByTagName('body')[0].appendChild(document.createElement("DIV"));
scoreboard.className = 'scoreboard';
var redScore = scoreboard.appendChild(document.createElement("SPAN"));
redScore.id = "redscore";
var redNumber = scoreboard.appendChild(document.createElement("SPAN"));
redNumber.id = "rednumber";
redScore.appendChild(document.createTextNode("___"));
redNumber.appendChild(document.createTextNode(""));
scoreboard.appendChild(document.createElement("BR"));
var blueScore = scoreboard.appendChild(document.createElement("SPAN"));
blueScore.id = "bluescore";
var blueNumber = scoreboard.appendChild(document.createElement("SPAN"));
blueNumber.id = "bluenumber";
blueScore.appendChild(document.createTextNode("___"));
blueNumber.appendChild(document.createTextNode(""));
}
// Creation of Information box
function createInfo() {
var table = document.getElementsByTagName('body')[0].appendChild(document.createElement("DIV"));
table.className = 'info';
table.appendChild(document.createTextNode("Players in lobby: " + numberOfPlayers));
}
// UPDATING
function updateScore() {
var score = [
document.getElementsByClassName('red').length,
document.getElementsByClassName('blue').length
];
document.getElementById('rednumber').childNodes[0].nodeValue = " : " + score[0];
document.getElementById('bluenumber').childNodes[0].nodeValue = " : " + score[1];
}
function updateInfo() {
document.getElementsByClassName("info")[0].childNodes[0].nodeValue = "Players In Lobby: " + numberOfPlayers;
}
function updateTimer(timeLeft) {
document.getElementsByClassName("info")[0].childNodes[0].nodeValue = "Countdown: " + timeLeft;
}
// PLAYER HANDLING
function animate() {
for (var user in playerInfo) {
if (playerInfo.hasOwnProperty(user)) {
var playerCoord = playerInfo[user][0];
var playerTeam = playerInfo[user][1];
var lastSquare;
var newSquare;
try {
if(!setup) {
lastSquare = document.getElementById(user);
toClaimed(lastSquare, playerTeam);
}
}
catch(err) {}
finally {
try {
newSquare = coord(playerCoord[0],playerCoord[1]);
if(newSquare.className.includes("blue") || newSquare.className.includes("red")) {
if(!setup) {
killPlayer(lastSquare);
}
} else {
toPlayer(newSquare, playerTeam, user);
}
}
catch(err) {
console.log("errtoplayer")
killPlayer(lastSquare);
}
}
}
}
autoScroll('start');
}
function coord(x,y) {
return table.rows[x].cells[y];
}
function toPlayer(square,team,username) {
square.className = "player " + team;
square.style.backgroundColor = playerColors[team];
square.id = username;
}
function toClaimed(square,team) {
square.style.backgroundColor = claimedColors[team];
square.className = square.className.replace("player ", "");
square.id = "";
}
function movePlayer(e) {
e = e || window.event;
if (e.keyCode === 38) {
sendMove(-1,0);
} else if (e.keyCode === 40) {
sendMove(1,0);
} else if (e.keyCode === 37) {
sendMove(0,-1);
} else if (e.keyCode === 39) {
sendMove(0,1);
}
}
function killPlayer(square) {
var death = {};
death[myUsername] = ["death"];
$.ajax(serverURL + '/game', {
method: 'POST',
type : 'POST',
data: JSON.stringify(death, null, '\t'),
dataType: "json",
contentType: 'application/json;charset=UTF-8'
})
.then(
function success(data) {
toClaimed(square,myTeam);
sendMove(0,0);
// Spectator mode first to set team to spectator
//spectatorMode();
//serverTransfer(coordinate,team,turn,username);
},
function error(e) {
console.log(e);
alert(e);
}
);
}
function timeMove() {
document.getElementsByClassName("info")[0].childNodes[0].nodeValue = "Next Turn: " + turnTime;
if(turnTime == 0) {
turnTime = 3;
if(!hasSent) {
sendMove(0,0);
}
} else {
moveTimer = setTimeout(function() {
turnTime -= 1;
timeMove();
}, 1000)
}
}
/*
function spectatorMode() {
playerCoordinate = null;
playerTeam = 'spectator';
document.getElementsByClassName('spectator')[0].style.opacity = 0.7;
spectatorType = 'spectatorFull';
spectatorFull();
document.getElementsByClassName('spectator')[0].onclick = function changeText() {
spectatorChoose = spectatorChoose * (-1);
if(spectatorChoose == -1) {
document.getElementsByClassName('spectator')[0].childNodes[0].childNodes[0].nodeValue = "Following";
spectatorType = 'spectatorFollow';
document.getElementsByTagName('body')[0].style.overflow = "hidden";
} else {
document.getElementsByClassName('spectator')[0].childNodes[0].childNodes[0].nodeValue = "Full View";
spectatorType = 'spectatorFull';
spectatorFull();
}
};
}
function spectatorFull() {
for(var i = 0; i < document.getElementsByTagName('td').length;i++) {
document.getElementsByTagName('body')[0].style.overflow = "auto";
document.getElementsByTagName('td')[i].style.minWidth = "75px";
document.getElementsByTagName('td')[i].style.height = "75px";
}
}*/
function autoScroll(type) {
center = [
window.innerHeight / -2,
window.innerWidth / -2
];
if(type == 'start') {
$('body').scrollTo(document.getElementById(myUsername), 0, {offset: {top: center[0] , left: center[1]} });
} else if (type == "spectator") {
$('body').scrollTo(document.getElementById(spectatedUser), 100, {offset: {top: center[0] , left: center[1]} });
} else {
alert("Broken?");
// $('body').scrollTo(document.getElementById(username), 100, {offset: {top: center[0] , left: center[1]} });
}
}