summaryrefslogtreecommitdiff
path: root/public/javascript/game.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/javascript/game.js')
-rw-r--r--public/javascript/game.js304
1 files changed, 181 insertions, 123 deletions
diff --git a/public/javascript/game.js b/public/javascript/game.js
index 518f08e..137150f 100644
--- a/public/javascript/game.js
+++ b/public/javascript/game.js
@@ -85,6 +85,25 @@ let walkOnceBuffer = [];
let walkInputDirection = -1;
let lockWalkDir = -1;
+const itemTileLayout = [
+ [flourTile, "Flour"],
+ [waterTile, "Water"],
+ [powderTile, "Baking Powder"],
+ [breadTile, "Bread"],
+ [blockStartTile + 0, "Red Block"],
+ [blockStartTile + 1, "Orange Block"],
+ [blockStartTile + 2, "Yellow Block"],
+ [blockStartTile + 3, "Green Block"],
+ [blockStartTile + 4, "Teal Block"],
+ [blockStartTile + 5, "Blue Block"],
+ [blockStartTile + 6, "Purple Block"],
+ [blockStartTile + 7, "Gray Block"],
+ [teleporterStartTile + 0, "Tele North"],
+ [teleporterStartTile + 1, "Tele East"],
+ [teleporterStartTile + 2, "Tele South"],
+ [teleporterStartTile + 3, "Tele West"],
+];
+
// Thanks to CatTail for this snippet of code.
var encodeHtmlEntity = function(str) {
var buf = [];
@@ -165,6 +184,9 @@ function handleGameUpdateRequest(data) {
if (tempCommand.commandName == "placeTile") {
performPlaceTileCommand(tempCommand);
}
+ if (tempCommand.commandName == "placeDoor") {
+ performPlaceDoorCommand(tempCommand);
+ }
if (tempCommand.commandName == "collectTile") {
performCollectTileCommand(tempCommand);
}
@@ -260,6 +282,16 @@ function addPlaceTileCommand(direction, tile) {
});
}
+function addPlaceDoorCommand(direction, doorid) {
+ gameUpdateCommandList.push({
+ commandName: "placeDoor",
+ direction: direction,
+ doorId: doorid,
+ // Note: pos is ignored by the server. It is for client-use only.
+ pos: localPlayer.getPosInWalkDirection(direction).toJson()
+ });
+}
+
function addCollectTileCommand(direction) {
gameUpdateCommandList.push({
commandName: "collectTile",
@@ -428,35 +460,72 @@ function performAddOnlinePlayerCommand(command) {
}
function performSetInventoryCommand(command) {
- var tempInventory = command.inventory;
- var index = 0;
- while (index < inventoryItemList.length) {
- var tempInventoryItem = inventoryItemList[index];
- var tempTile = tempInventoryItem.tile;
- if (tempTile in tempInventory) {
- var tempCount = tempInventory[tempTile];
- tempInventoryItem.setCount(tempCount);
- }
- index += 1;
- }
- localPlayer.breadCount = getInventoryItemByTile(breadTile).count;
- var tempFlourCount = getInventoryItemByTile(flourTile).count;
- var tempWaterCount = getInventoryItemByTile(waterTile).count;
- var tempPowderCount = getInventoryItemByTile(powderTile).count;
- var tempUnbakedBreadCount = Math.min(tempFlourCount, tempWaterCount, tempPowderCount);
- var tempEffectiveBreadCount = localPlayer.breadCount + tempUnbakedBreadCount;
- document.getElementById("breadCount").innerHTML = localPlayer.breadCount;
- document.getElementById("flourCount").innerHTML = tempFlourCount;
- document.getElementById("waterCount").innerHTML = tempWaterCount;
- document.getElementById("powderCount").innerHTML = tempPowderCount;
- document.getElementById("unbakedBreadCount").innerHTML = tempUnbakedBreadCount;
- document.getElementById("effectiveBreadCount").innerHTML = tempEffectiveBreadCount;
+ let inv = localPlayer.inventory = command.inventory;
+ for (let i = 0; i < itemTileLayout.length; i++) {
+ let entry = inventoryUI.entries[i];
+ let item = entry.item;
+ if (typeof item == "number") {
+ let n = inv[item] || 0;
+ entry.setCount(n);
+ }
+ }
+ const a = itemTileLayout.length;
+ const b = inventoryUI.entries.length;
+ for (let i = a; i < b; i++) {
+ inventoryUI.entries[i].markedForDeletion = true;
+ }
+ if (inv[0x9b])
+ for (let j = 0; j < inv[0x9b].length; j++) {
+ let found = false;
+ const doorid = inv[0x9b][j];
+ for (let i = a; i < b; i++) {
+ let entry = inventoryUI.entries[i];
+ let item = entry.item;
+ if (typeof item == "object"
+ && item[0] == 0x9b
+ && item[1] == doorid) {
+ found = true;
+ entry.markedForDeletion = false;
+ }
+ }
+ if (!found) {
+ let entry = new InventoryUIEntry([0x9b, doorid]);
+ entry.setName("Door");
+ entry.setTileAsIcon(0x9b);
+ inventoryUI.entries.push(entry);
+ entry.display();
+ }
+ }
+ for (let i = a; i < b; i++) {
+ let entry = inventoryUI.entries[i];
+ if (entry.markedForDeletion) {
+ console.log("removing entry");
+ entry.remove();
+ i--;
+ }
+ }
+ localPlayer.breadCount = inv[breadTile] || 0;
+ var f = inv[flourTile] || 0;
+ var w = inv[waterTile] || 0;
+ var p = inv[powderTile] || 0;
+ var ub = Math.min(f, w, p);
+ var eb = localPlayer.breadCount + ub;
+ document.getElementById("breadCount").innerHTML = localPlayer.breadCount;
+ document.getElementById("flourCount").innerHTML = f;
+ document.getElementById("waterCount").innerHTML = w;
+ document.getElementById("powderCount").innerHTML = p;
+ document.getElementById("unbakedBreadCount").innerHTML = ub;
+ document.getElementById("effectiveBreadCount").innerHTML = eb;
}
function performPlaceTileCommand(command) {
setTileBufferValue(createPosFromJson(command.pos), command.tile);
}
+function performPlaceDoorCommand(command) {
+ setTileBufferValue(createPosFromJson(command.pos), 0x9b);
+}
+
function performCollectTileCommand(command) {
setTileBufferValue(createPosFromJson(command.pos), emptyTile);
}
@@ -521,93 +590,71 @@ function InventoryItem(tile, name) {
inventoryItemList.push(this);
}
-InventoryItem.prototype.addToModule = function() {
- var tempContainer = document.getElementById("inventoryDiv");
- this.tag = document.createElement("div");
- this.tag.className = "inventoryItem"
- var tempCanvas = document.createElement("canvas");
- var tempSize = 32;
- tempCanvas.width = tempSize;
- tempCanvas.height = tempSize;
- tempCanvas.style.width = tempSize / 2;
- tempCanvas.style.height = tempSize / 2;
- this.tag.appendChild(tempCanvas);
- var tempNameLabel = document.createElement("strong");
- tempNameLabel.innerHTML = this.name;
- this.tag.appendChild(tempNameLabel);
- this.countLabel = document.createElement("span");
- this.tag.appendChild(this.countLabel);
- this.displayCount();
- tempContainer.appendChild(this.tag);
- var tempContext = tempCanvas.getContext("2d");
- drawTileOnContext(tempContext, new Pos(0, 0), tempSize, this.tile);
- this.updateBorder();
- var index = this.getIndex();
- this.tag.onclick = function() {
- selectInventoryItem(index);
- }
-}
-
-InventoryItem.prototype.displayCount = function() {
- this.countLabel.innerHTML = "(x" + this.count + ")";
-}
-
-InventoryItem.prototype.setCount = function(count) {
- this.count = count;
- this.displayCount();
-}
-
-InventoryItem.prototype.getIndex = function() {
- return inventoryItemList.indexOf(this);
-}
-
-InventoryItem.prototype.updateBorder = function() {
- var index = this.getIndex();
- if (index == selectedInventoryItemIndex) {
- this.tag.style.border = "3px #000000 solid";
- } else {
- this.tag.style.border = "3px #FFFFFF solid";
- }
-}
+let inventoryUI = {
+ selent: null,
+ entries: [],
+};
-function selectInventoryItem(index) {
- selectedInventoryItemIndex = index;
- var index = 0;
- while (index < inventoryItemList.length) {
- var tempInventoryItem = inventoryItemList[index];
- tempInventoryItem.updateBorder();
- index += 1;
- }
-}
+class InventoryUIEntry {
+ constructor(item) {
+ this.item = item;
+ this.tag = document.createElement("div");
+ this.tag.className = "inventoryItem"
+ this.cnv = document.createElement("canvas");
+ let tempSize = 32;
+ this.cnv.width = tempSize;
+ this.cnv.height = tempSize;
+ this.cnv.style.width = tempSize / 2;
+ this.cnv.style.height = tempSize / 2;
+ this.tag.appendChild(this.cnv);
+ this.lbl = document.createElement("strong");
+ this.countLabel = document.createElement("span");
+ this.tag.appendChild(this.lbl);
+ this.tag.appendChild(this.countLabel);
+ let that = this;
+ this.tag.onclick = function() {
+ inventoryUI.selent.unborder();
+ inventoryUI.selent = that;
+ that.border();
+ };
+ }
-function getInventoryItemByTile(tile) {
- var index = 0;
- while (index < inventoryItemList.length) {
- var tempInventoryItem = inventoryItemList[index];
- if (tempInventoryItem.tile == tile) {
- return tempInventoryItem;
- }
- index += 1;
- }
- return null;
-}
+ setTileAsIcon(tile) {
+ let tempContext = this.cnv.getContext("2d");
+ drawTileOnContext(tempContext, new Pos(0, 0), this.cnv.width, tile);
+ }
-new InventoryItem(flourTile, "Flour");
-new InventoryItem(waterTile, "Water");
-new InventoryItem(powderTile, "Baking Powder");
-new InventoryItem(breadTile, "Bread");
-new InventoryItem(blockStartTile + 0, "Red Block");
-new InventoryItem(blockStartTile + 1, "Orange Block");
-new InventoryItem(blockStartTile + 2, "Yellow Block");
-new InventoryItem(blockStartTile + 3, "Green Block");
-new InventoryItem(blockStartTile + 4, "Teal Block");
-new InventoryItem(blockStartTile + 5, "Blue Block");
-new InventoryItem(blockStartTile + 6, "Purple Block");
-new InventoryItem(blockStartTile + 7, "Gray Block");
-new InventoryItem(teleporterStartTile + 0, "Tele North");
-new InventoryItem(teleporterStartTile + 1, "Tele East");
-new InventoryItem(teleporterStartTile + 2, "Tele South");
-new InventoryItem(teleporterStartTile + 3, "Tele West");
+ border() {
+ this.tag.style.border = "3px #000000 solid";
+ }
+ unborder() {
+ this.tag.style.border = "3px #ffffff solid";
+ }
+
+ setName(text) {
+ this.lbl.innerHTML = text;
+ }
+
+ setSubtext(text) {
+ this.countLabel.innerHTML = text;
+ }
+ setCount(n) {
+ this.setSubtext("(x" + n + ")");
+ }
+
+ display() {
+ let tempContainer = document.getElementById("inventoryDiv");
+ tempContainer.appendChild(this.tag);
+ }
+ remove() {
+ let i = inventoryUI.entries.indexOf(this);
+ inventoryUI.entries.splice(i, 1);
+ this.tag.parentElement.removeChild(this.tag);
+ if (this == inventoryUI.selent) {
+ inventoryUI.selent = inventoryUI.entries[0];
+ }
+ }
+}
Entity.prototype.remove = function() {
var index = 0;
@@ -712,16 +759,22 @@ Player.prototype.walk = function(direction) {
}
Player.prototype.placeTile = function(direction) {
- var tempPos = this.getPosInWalkDirection(direction);
- var tempInventoryItem = inventoryItemList[selectedInventoryItemIndex];
- if (tempInventoryItem.count <= 0) {
- return;
- }
- tempInventoryItem.count -= 1;
- tempInventoryItem.displayCount();
- var tempTile = tempInventoryItem.tile;
- setTileBufferValue(tempPos, tempTile);
- addPlaceTileCommand(direction, tempTile);
+ let pos = this.getPosInWalkDirection(direction);
+ let item = inventoryUI.selent.item;
+ console.log(item, typeof item, item[0]);
+ if (typeof item == "number") {
+ if (localPlayer.inventory[item] <= 0) {
+ return;
+ }
+ localPlayer.inventory[item]--;
+ inventoryUI.selent.setCount(localPlayer.inventory[item]);
+ setTileBufferValue(pos, item);
+ addPlaceTileCommand(direction, item);
+ } else if (typeof item == "object" && item[0] == 0x9b) {
+ setTileBufferValue(pos, 0x9b);
+ addPlaceDoorCommand(direction, item[1]);
+ inventoryUI.selent.remove();
+ }
}
Player.prototype.removeTile = function(direction) {
@@ -1642,12 +1695,16 @@ function barTimerEvent() {
}
function addAllInventoryItemsToMode() {
- var index = 0;
- while (index < inventoryItemList.length) {
- var tempInventoryItem = inventoryItemList[index];
- tempInventoryItem.addToModule();
- index += 1;
- }
+ for (let i = 0; i < itemTileLayout.length; i++) {
+ let tile = itemTileLayout[i][0];
+ let entry = new InventoryUIEntry(tile);
+ entry.setName(itemTileLayout[i][1]);
+ entry.setTileAsIcon(tile);
+ inventoryUI.entries.push(entry);
+ entry.display();
+ }
+ inventoryUI.selent = inventoryUI.entries[0];
+ inventoryUI.selent.border();
}
function initializeGame() {
@@ -1719,6 +1776,7 @@ function initializeGame() {
gameUpdateSocket.onmessage = function(event) {
handleGameUpdateRequest(JSON.parse(event.data));
};
+
}