mirror of
https://github.com/simon987/Much-Assembly-Required-Frontend.git
synced 2025-04-10 14:26:44 +00:00
311 lines
11 KiB
JavaScript
311 lines
11 KiB
JavaScript
"use strict";
|
|
console.log("hello")
|
|
// --------------------------
|
|
// MAR loop
|
|
function gameLoop() {
|
|
requestAnimationFrame(gameLoop);
|
|
|
|
//UPDATE EFFECTS
|
|
for (var i = 0; i < MAR.effects.length; i++) {
|
|
MAR.effects[i].update();
|
|
}
|
|
//Update objects
|
|
for (var j = 0; j < MAR.objects.length; j++) {
|
|
|
|
if (MAR.objects[j].objectType === 1) {-
|
|
MAR.objects[j].update();
|
|
}
|
|
}
|
|
|
|
MAR.renderer.render(MAR.rootContainer);
|
|
}
|
|
|
|
var setupCallback = function () {
|
|
getWorldTerrain();
|
|
gameLoop();
|
|
};
|
|
|
|
function tick() {
|
|
getGameEffects();
|
|
getGameObjects();
|
|
|
|
//Update indicators
|
|
for (var i = 0; i < MAR.objects.length; i++) {
|
|
if (MAR.objects[i].indicator !== undefined) {
|
|
MAR.objects[i].indicator.updateIcon();
|
|
}
|
|
}
|
|
|
|
//Update debug text
|
|
MAR.timeText.text = "gameTime: " + MAR.time;
|
|
}
|
|
|
|
function getGameObjects() {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open("GET", "./mar/objects.php?x=" + MAR.currentLocX + "&y=" + MAR.currentLocY, true);
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
|
var jsonResponse = JSON.parse(xhr.responseText);
|
|
|
|
for (var i = 0; i < MAR.objects.length; i++) {
|
|
MAR.objects[i].updated = false;
|
|
}
|
|
|
|
for (var i = 0; i < jsonResponse.length; i++) {
|
|
var obj = getObject(jsonResponse[i].i);
|
|
|
|
if (obj !== null) {
|
|
//OBJECT already exist, update
|
|
obj.updated = true;
|
|
|
|
if (obj.objectType === 1) {
|
|
//Update direction
|
|
obj.direction = jsonResponse[i].d;
|
|
|
|
//Update location
|
|
if (obj.x !== jsonResponse[i].x || obj.y !== jsonResponse[i].y) {
|
|
//location changed
|
|
moveObject(jsonResponse[i].x, jsonResponse[i].y, obj);
|
|
}
|
|
|
|
//update held item
|
|
obj.heldItem = jsonResponse[i].h;
|
|
//Update action
|
|
obj.action = jsonResponse[i].a;
|
|
} else if (obj.objectType === 3) {
|
|
//Kiln object already exists, update
|
|
obj.qi = jsonResponse[i].qi; //Queued Iron
|
|
obj.qc = jsonResponse[i].qc; //Queued Copper
|
|
obj.ci = jsonResponse[i].ci; //Cooked Iron
|
|
obj.cc = jsonResponse[i].cc; //Cooked Copper
|
|
obj.f = jsonResponse[i].f; //Fuel
|
|
}
|
|
|
|
|
|
} else {
|
|
var newObj = new GameObject(jsonResponse[i]);
|
|
newObj.updated = true;
|
|
MAR.worldLayer.addChild(newObj.sprite);
|
|
MAR.objects.push(newObj);
|
|
|
|
console.log("DEBUG: added " + newObj.id);
|
|
}
|
|
}
|
|
|
|
//Delete not updated objects (see above comments)
|
|
for (var i = 0; i < MAR.objects.length; i++) {
|
|
if (!MAR.objects[i].updated) {
|
|
console.log("DEBUG: removed " + MAR.objects[i].id);
|
|
MAR.worldLayer.removeChild(MAR.objects[i].sprite);
|
|
MAR.objects.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
MAR.worldLayer.children.sort(depthCompare);
|
|
}
|
|
};
|
|
xhr.send(null);
|
|
}
|
|
|
|
// --------------------------
|
|
// Display a single effect
|
|
function displayEffect(effect) {
|
|
if (effect.t === "ERROR") {
|
|
var newEffect = new IconEffect(effect.x, effect.y, "err_icon");
|
|
MAR.effects.push(newEffect);
|
|
addToWorldLayer(newEffect.sprite);
|
|
}
|
|
if (effect.t === "WARNING") {
|
|
var newEffect = new IconEffect(effect.x, effect.y, "warn_icon");
|
|
MAR.effects.push(newEffect);
|
|
addToWorldLayer(newEffect.sprite);
|
|
}
|
|
if (effect.t === "A_EMOTE") {
|
|
var newEffect = new IconEffect(effect.x, effect.y, "A_icon");
|
|
MAR.effects.push(newEffect);
|
|
addToWorldLayer(newEffect.sprite);
|
|
}
|
|
}
|
|
|
|
// --------------------------
|
|
// Query the MAR API to get the MAR effects
|
|
function getGameEffects() {
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open("GET", "./mar/effects.php?x=" + MAR.currentLocX + "&y=" + MAR.currentLocY, true);
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
|
var effects = JSON.parse(xhr.responseText);
|
|
|
|
for (var i = 0; i < effects.length; i++) {
|
|
displayEffect(effects[i]);
|
|
}
|
|
MAR.worldLayer.children.sort(depthCompare);
|
|
}
|
|
};
|
|
xhr.send(null);
|
|
}
|
|
|
|
function getWorldTerrain() {
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open("GET", "./mar/terrain.php?x=" + MAR.currentLocX + "&y=" + MAR.currentLocY, true);
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
|
var currentTerrain = JSON.parse(xhr.responseText);
|
|
|
|
//Calculate wall height
|
|
//First pass, set wall height to 2 for each wall tile with 3+ adjacent wall tile (diagonals don't count)
|
|
for (var y = 0; y < 16; y++) {
|
|
for (var x = 0; x < 16; x++) {
|
|
var tile = new Tile(currentTerrain[x * 16 + y]);
|
|
|
|
|
|
//Calculate neighbors
|
|
var neighbors = 0;
|
|
if (currentTerrain[x * 16 + y] === 1) {
|
|
if (currentTerrain[x * 16 + y - 16] === 1 ||
|
|
(currentTerrain[x * 16 + y - 16] !== undefined && currentTerrain[x * 16 + y - 16].wallHeight >= 1)) {
|
|
neighbors++;
|
|
} else {
|
|
|
|
}
|
|
if (currentTerrain[x * 16 + y + 16] === 1 ||
|
|
(currentTerrain[x * 16 + y + 16] !== undefined && currentTerrain[x * 16 + y + 16].wallHeight >= 1)) {
|
|
neighbors++;
|
|
}
|
|
if (currentTerrain[x * 16 + y + 1] === 1 ||
|
|
(currentTerrain[x * 16 + y + 1] !== undefined && currentTerrain[x * 16 + y + 1].wallHeight >= 1)) {
|
|
neighbors++;
|
|
}
|
|
if (currentTerrain[x * 16 + y - 1] === 1 ||
|
|
(currentTerrain[x * 16 + y - 1] !== undefined && currentTerrain[x * 16 + y - 1].wallHeight >= 1)) {
|
|
neighbors++;
|
|
}
|
|
|
|
if (neighbors >= 4) {
|
|
tile.wallHeight++;
|
|
}
|
|
}
|
|
|
|
|
|
tile.sprite.tileX = x;
|
|
tile.sprite.tileY = y;
|
|
|
|
tile.sprite.x += (x - y) * 64;
|
|
tile.sprite.y += (x + y) * 32;
|
|
tile.sprite.z += y + x;
|
|
|
|
//A bit hacky but it'll work for now...
|
|
currentTerrain[x * 16 + y] = tile;
|
|
}
|
|
}
|
|
//currentTerrain is no longer an array of ints but an array of Tile objects
|
|
//Add tiles to world layer
|
|
for (var i = 0; i < currentTerrain.length; i++) {
|
|
|
|
|
|
if (currentTerrain[i].sprite.tileId === 1) {
|
|
if (currentTerrain[i].wallHeight === 1) {
|
|
MAR.worldLayer.addChild(currentTerrain[i].sprite);
|
|
} else if (currentTerrain[i].wallHeight === 2) {
|
|
|
|
MAR.worldLayer.addChild(currentTerrain[i].sprite);
|
|
//Add duplicate sprite on top (63 px up)
|
|
var topTile = new Tile(1);
|
|
topTile.sprite.tileX = currentTerrain[i].sprite.tileX;
|
|
topTile.sprite.tileY = currentTerrain[i].sprite.tileY;
|
|
topTile.sprite.tileId = 1;
|
|
|
|
topTile.sprite.x = currentTerrain[i].sprite.x;
|
|
topTile.sprite.y = currentTerrain[i].sprite.y - 40;
|
|
topTile.sprite.z = currentTerrain[i].sprite.z + 1.1;
|
|
MAR.worldLayer.addChild(topTile.sprite);
|
|
MAR.tiles.push(topTile);
|
|
}
|
|
|
|
} else {
|
|
MAR.worldLayer.addChild(currentTerrain[i].sprite);
|
|
}
|
|
|
|
MAR.tiles.push(currentTerrain[i]);
|
|
}
|
|
|
|
|
|
MAR.worldLayer.children.sort(depthCompare);
|
|
}
|
|
|
|
};
|
|
xhr.send(null);
|
|
|
|
}
|
|
|
|
// --------------------------
|
|
// Query the MAR API to get MAR time
|
|
function getGameTime() {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open("GET", "./mar/time.php", true);
|
|
xhr.onreadystatechange = function () {
|
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
|
|
|
if (MAR.time !== xhr.responseText) {
|
|
MAR.timeChanged = true;
|
|
MAR.time = xhr.responseText;
|
|
} else {
|
|
MAR.timeChanged = false;
|
|
}
|
|
}
|
|
};
|
|
xhr.send(null);
|
|
}
|
|
|
|
// --------------------------
|
|
// Change an object's location and initialise the move animation
|
|
function moveObject(newX, newY, gameObject) {
|
|
|
|
//Resync object
|
|
gameObject.sprite.x = (gameObject.x - gameObject.y) * 64;
|
|
gameObject.sprite.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;
|
|
}
|
|
|
|
MAR.worldLayer.children.sort(depthCompare);
|
|
|
|
} |