411 lines
11 KiB
JavaScript
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]} });
|
|
}
|
|
} |