mirror of
https://github.com/simon987/Much-Assembly-Required-Frontend.git
synced 2025-04-10 14:26:44 +00:00
274 lines
6.8 KiB
JavaScript
274 lines
6.8 KiB
JavaScript
/**
|
|
* Listens for authentications responses from the server
|
|
*/
|
|
function authListener(message){
|
|
|
|
if(message.t === "auth"){
|
|
|
|
if(message.m === "ok"){
|
|
console.log("Auth successful");
|
|
client.requestUserInfo();
|
|
|
|
} else {
|
|
console.log("Auth failed");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Listens for user info responses from the server
|
|
*/
|
|
function userInfoListener(message){
|
|
if(message.t === "userInfo"){
|
|
|
|
game = new Game();
|
|
game.worldX = message.worldX;
|
|
game.worldY = message.worldY;
|
|
|
|
client.requestTerrain();
|
|
}
|
|
}
|
|
|
|
function formattedKeyBuffer(kbBuffer) {
|
|
|
|
var str = "Keyboard: ";
|
|
|
|
for(var i = 0; i < 16; i++){
|
|
|
|
if(kbBuffer[i] !== undefined) {
|
|
|
|
str += "0x" + kbBuffer[i].toString(16) + " ";
|
|
|
|
} else {
|
|
|
|
str += "____ ";
|
|
}
|
|
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
function terrainListener(message){
|
|
if(message.t === "terrain"){
|
|
|
|
if(game.world !== undefined){
|
|
|
|
game.world.update(message.terrain);
|
|
|
|
} else {
|
|
game.world = new Word(message.terrain);
|
|
|
|
//Setup keyboard buffer display
|
|
game.textLayer = new PIXI.Container();
|
|
game.rootContainer.addChild(game.textLayer);
|
|
game.kbBuffer = [];
|
|
|
|
game.keyboardBuffer = new PIXI.Text(formattedKeyBuffer([]), {fontSize: 16, fontFamily: "fixedsys", fill: "white"});
|
|
game.textLayer.addChild(game.keyboardBuffer);
|
|
|
|
|
|
//Handle keypresses
|
|
window.addEventListener('keydown', function(event) {
|
|
|
|
if(game.kbBuffer.length <= 16) {
|
|
|
|
client.sendKeypress(event.keyCode);
|
|
|
|
//Locally update the buffer
|
|
game.kbBuffer.push(event.keyCode);
|
|
game.keyboardBuffer.text = formattedKeyBuffer(game.kbBuffer);
|
|
|
|
if(event.keyCode >= 37 && event.keyCode <= 40){
|
|
event.preventDefault();
|
|
}
|
|
}
|
|
|
|
});
|
|
console.log("Gameloop started");
|
|
gameLoop();
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
function tickListener(message){
|
|
if(message.t === "tick"){
|
|
//Request objects
|
|
client.socket.send(JSON.stringify({t: "object", x: game.worldX, y: game.worldY}));
|
|
|
|
//Update key buffer display
|
|
if(game.textLayer){
|
|
if(message.keys !== undefined){
|
|
console.log(message.keys);
|
|
|
|
game.kbBuffer = message.keys;
|
|
game.keyboardBuffer.text = formattedKeyBuffer(game.kbBuffer);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function objectListener(message){
|
|
|
|
if(message.t === "object"){
|
|
|
|
game.world.updateObjects(message.objects);
|
|
|
|
}
|
|
}
|
|
|
|
function codeListener(message){
|
|
|
|
if(message.t === "code"){
|
|
|
|
ace.edit("editor").setValue(message.code);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function GameClient(callback) {
|
|
|
|
var self = this;
|
|
|
|
var listeners = [];
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("GET", "./getServerInfo.php", true);
|
|
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
|
|
|
console.log("Received server info " + xhr.responseText);
|
|
|
|
setTimeout(function(){
|
|
var info = JSON.parse(xhr.responseText);
|
|
|
|
self.socket = new WebSocket(info.address);
|
|
self.username = info.username;
|
|
self.tickLength = info.tickLength;
|
|
self.serverName = info.serverName;
|
|
|
|
|
|
self.socket.onopen = function () {
|
|
|
|
//Send auth request
|
|
self.socket.send(info.token);
|
|
|
|
|
|
//Setup event managers
|
|
listeners.push(authListener);
|
|
listeners.push(userInfoListener);
|
|
listeners.push(terrainListener);
|
|
listeners.push(tickListener);
|
|
listeners.push(objectListener);
|
|
listeners.push(codeListener);
|
|
|
|
client.socket.onmessage = function(e){
|
|
|
|
//console.log("Received " + e.data);
|
|
var message = JSON.parse(e.data);
|
|
|
|
for(var i = 0; i < listeners.length ; i++){
|
|
listeners[i](message);
|
|
}
|
|
};
|
|
|
|
self.reloadCode();
|
|
|
|
|
|
if(callback !== undefined){
|
|
callback();
|
|
}
|
|
}
|
|
}, 100);
|
|
}
|
|
};
|
|
xhr.send(null);
|
|
|
|
|
|
this.requestUserInfo = function(){
|
|
this.socket.send(JSON.stringify({t: "userInfo"}));
|
|
};
|
|
|
|
this.requestTerrain = function(){
|
|
this.socket.send(JSON.stringify({t: "terrain", x: game.worldX, y: game.worldY}));
|
|
};
|
|
|
|
this.uploadCode = function(code){
|
|
console.log("Uploaded code");
|
|
this.socket.send(JSON.stringify({t: "uploadCode", code: code}))
|
|
};
|
|
|
|
this.reloadCode = function(){
|
|
this.socket.send(JSON.stringify({t: "codeRequest"}))
|
|
};
|
|
|
|
this.sendKeypress = function(key){
|
|
if(key !== 0){
|
|
this.socket.send(JSON.stringify({t:"k", k:key}));
|
|
}
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
// Change an object's location and initialise the move animation
|
|
function moveObject(newX, newY, gameObject) {
|
|
|
|
//Resync object
|
|
|
|
for(clip in gameObject.clips){
|
|
gameObject.clips[clip].x = (gameObject.x - gameObject.y) * 64;
|
|
gameObject.clips[clip].y = ((gameObject.x + gameObject.y) * 32) - 16;
|
|
}
|
|
|
|
var tiledx = newX - gameObject.x;
|
|
var tiledy = newY - gameObject.y;
|
|
|
|
gameObject.dx = 0;
|
|
gameObject.dy = 0;
|
|
|
|
//Recalculate position
|
|
gameObject.x = newX;
|
|
gameObject.y = newY;
|
|
|
|
if (tiledx === 1) {
|
|
//We need to move 128px to the right and the minimum tick length is 1s.
|
|
//This means that we have maximum 60 frames to do the animation
|
|
gameObject.dx = 64 / 58;
|
|
gameObject.dy = 32 / 58;
|
|
gameObject.walking = 58;
|
|
//Recalculate Z order immediately
|
|
gameObject.sprite.z = gameObject.y + gameObject.x + 0.1;
|
|
} else if (tiledx === -1) {
|
|
gameObject.dx = -64 / 58;
|
|
gameObject.dy = -32 / 58;
|
|
gameObject.walking = 58;
|
|
|
|
//The Z order needs to be recalculated when the movement ends
|
|
gameObject.recalculateZAfter = true;
|
|
} else if (tiledy === 1) {
|
|
gameObject.dx = -64 / 58;
|
|
gameObject.dy = 32 / 58;
|
|
gameObject.walking = 58;
|
|
//Recalculate Z order immediately
|
|
gameObject.sprite.z = gameObject.y + gameObject.x + 0.1;
|
|
} else if (tiledy === -1) {
|
|
gameObject.dx = 64 / 58;
|
|
gameObject.dy = -32 / 58;
|
|
gameObject.walking = 58;
|
|
//The Z order needs to be recalculated when the movement ends
|
|
gameObject.recalculateZAfter = true;
|
|
}
|
|
|
|
game.worldLayer.children.sort(depthCompare);
|
|
|
|
}
|
|
|
|
|