/*
* inventory.js
- *
+ *
* Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
- *
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
- *
- *
+ *
+ *
*/
-dragonblocks.Inventory = class{
- constructor(slots, columns){
+
+dragonblocks.Inventory = class extends EventTarget
+{
+ constructor(slots, columns)
+ {
+ super();
this.id = dragonblocks.getToken();
+
this.slots = slots;
this.columns = columns;
this.list = [];
- for(let i = 0; i < this.slots; i++){
- this.list[i] = new dragonblocks.createItemstack();
+
+ let self = this;
+
+ for (let i = 0; i < this.slots; i++){
+ let stack = this.list[i] = new dragonblocks.ItemStack();
+ stack.addEventListener("update", event => {
+ self.dispatchEvent(new dragonblocks.Inventory.Event("updateStack", event.stack));
+ });
}
+
this.display = false;
}
- stringify(){
- let str = ""
- for(let stack of this.list)
- str += stack.stringify() + ",";
+
+ serialize()
+ {
+ let str = "";
+
+ for (let stack of this.list)
+ str += stack.serialize() + ",";
+
return str;
}
- parse(str){
- for(let i in this.list)
- this.list[i].parse(str.split(",")[i]);
- }
- add(itemstring){
- var itemstack = dragonblocks.createItemstack(itemstring);
- for(let stack of this.list)
+
+ deserialize(str)
+ {
+ let strList = str.split(",");
+
+ for (let i in this.list)
+ this.list[i].deserialize(strList[i]);
+ }
+
+ add(itemstring)
+ {
+ let itemstack = new dragonblocks.ItemStack(itemstring);
+
+ for (let stack of this.list)
stack.item == itemstack.item && stack.add(itemstack);
- for(let stack of this.list)
+
+ for (let stack of this.list)
stack.add(itemstack);
+
return itemstack;
}
- isEmpty(){
- for(let stack of this.list)
- if(stack.item)
+
+ isEmpty()
+ {
+ for (let stack of this.list)
+ if (stack.item)
return false;
+
return true;
}
- addUpdateListener(func){
- for(let stack of this.list)
- stack.addUpdateListener(func);
- }
- clear(){
+
+ clear()
+ {
for(let stack of this.list)
stack.clear();
}
- calculateWidth(columns){
+
+ calculateWidth(columns)
+ {
return dragonblocks.settings.inventory.scale * 1.1 * this.columns + (dragonblocks.settings.inventory.scale * 0.1);
}
- calculateHeight(){
- return dragonblocks.settings.inventory.scale * 1.1 * Math.ceil(this.slots/this.columns) + dragonblocks.settings.inventory.scale * 0.1
- }
- draw(parent, x, y){
- if(this.display){
- if(this.getDisplay().parentElement != parent)
- this.remove();
- else{
- this.getDisplay().style.left = x + "px";
- this.getDisplay().style.top = y + "px";
+
+ calculateHeight()
+ {
+ return dragonblocks.settings.inventory.scale * 1.1 * Math.ceil(this.slots / this.columns) + dragonblocks.settings.inventory.scale * 0.1
+ }
+
+ draw(parent, x, y)
+ {
+ if (this.display) {
+ let display = this.getDisplay();
+ if (display.parentElement == parent) {
+ display.style.left = x + "px";
+ display.style.top = y + "px";
return false;
+ } else {
+ this.remove();
}
}
- let display = document.createElement("div");
+
+ this.display = true;
+
+ let display = parent.appendChild(document.createElement("div"));
display.id = "dragonblocks.inventory[" + this.id + "]";
display.style.position = "absolute";
display.style.left = x + "px";
display.style.top = y + "px";
display.style.width = this.calculateWidth() + "px";
display.style.height = this.calculateHeight() + "px";
- for(let i in this.list){
+
+ let scale = dragonblocks.settings.inventory.scale * 1.1;
+ let offset = dragonblocks.settings.inventory.scale * 0.1;
+
+ for (let i in this.list) {
let x = i % this.columns;
let y = (i - x) / this.columns;
- dragonblocks.Inventory.drawStack(display, dragonblocks.settings.inventory.scale * 0.1 + x * dragonblocks.settings.inventory.scale * 1.1, dragonblocks.settings.inventory.scale * 0.1 + y * dragonblocks.settings.inventory.scale * 1.1, this.list[i]);
+ this.list[i].draw(display, offset + x * scale, offset + y * scale);
}
- parent.appendChild(display);
- this.display = true;
+
return true;
}
- remove(){
- dblib.remove(this.getDisplay());
+
+ remove()
+ {
+ this.getDisplay().remove();
this.display = false;
}
- show(){
+
+ show()
+ {
this.getDisplay().style.visibility = "inherit";
this.update();
}
- hide(){
+
+ hide()
+ {
this.getDisplay().style.visibility = "hidden";
}
- update(){
- for(let stack of this.list)
+
+ update()
+ {
+ for (let stack of this.list)
stack.update();
}
- getSlot(i){
+
+ getSlot(i)
+ {
return this.list[i];
}
- getDisplay(){
+
+ getDisplay()
+ {
return document.getElementById("dragonblocks.inventory[" + this.id + "]");
}
- static drawStack(parent, x, y, stack){
- let stackDisplay = document.createElement("div");
- stackDisplay.id = "dragonblocks.itemstack[" + stack.id + "]";
- stackDisplay.stackid = stack.id;
- stackDisplay.style.borderStyle = "solid";
- stackDisplay.style.borderWidth = "1px";
- stackDisplay.style.borderColor = "#2D2D2D";
- stackDisplay.style.width = dragonblocks.settings.inventory.scale + "px";
- stackDisplay.style.height = dragonblocks.settings.inventory.scale + "px";
- stackDisplay.style.backgroundColor = "#343434";
- stackDisplay.style.position = "absolute";
- stackDisplay.style.left = x + "px";
- stackDisplay.style.top = y + "px";
- stackDisplay.addEventListener("mousedown", event => {
- let out = dragonblocks.Inventory.out;
- if(stack.action)
- return stack.action(out, event.which);
- switch(event.which){
- case 1:
- if(out.item)
- stack.add(out) || stack.swap(out);
- else
- out.add(stack);
- break;
- case 3:
- if(out.item)
- stack.addOne(out) || stack.swap(out);
- else
- out.addHalf(stack);
- }
- });
- stackDisplay.addEventListener("mouseover", event => {
- stack.focused = true;
- dragonblocks.Inventory.redrawStack(stack);
- });
- stackDisplay.addEventListener("mouseleave", event => {
- stack.focused = false;
- dragonblocks.Inventory.redrawStack(stack);
- });
- let stackDisplayCount = document.createElement("span");
- stackDisplayCount.id = "dragonblocks.itemstack[" + stack.id + "].count";
- stackDisplayCount.stackid = stack.id;
- stackDisplayCount.style.position = "absolute";
- stackDisplayCount.style.right = "5px";
- stackDisplayCount.style.bottom = "5px";
- stackDisplayCount.style.color = "white";
- stackDisplayCount.style.cursor = "default";
- stackDisplay.appendChild(stackDisplayCount);
- parent.appendChild(stackDisplay);
- stack.addUpdateListener(_ => {
- dragonblocks.Inventory.redrawStack(stack);
- });
- stack.update();
- }
- static redrawStack(stack){
- let stackDisplay = document.getElementById("dragonblocks.itemstack[" + stack.id + "]");
- if(! stackDisplay)
- return;
- let stackDisplayCount = document.getElementById("dragonblocks.itemstack[" + stack.id + "].count");
- stackDisplay.title = "";
- stackDisplay.style.background = "none";
- stackDisplayCount.innerHTML = "";
- if(stack.item){
- stackDisplay.style.background = dragonblocks.getTexture(stack.toItem().texture);
- stackDisplay.style.backgroundSize = "cover";
- stackDisplay.title = stack.toItem().desc;
- if(stack.count > 1)
- stackDisplayCount.innerHTML = stack.count;
- }
- stackDisplay.style.backgroundColor = "#343434";
- if(stack.focused)
- stackDisplay.style.backgroundColor = "#7E7E7E";
- if(stack.onredraw)
- stack.onredraw();
- }
- static getStackDisplay(id){
- return document.getElementById("dragonblocks.itemstack[" + id + "]");
- }
- static insertElement(elem){
- document.body.insertBefore(elem, dragonblocks.Inventory.getStackDisplay(dragonblocks.Inventory.out.id));
+};
+
+dragonblocks.Inventory.Event = class extends Event
+{
+ constructor(type, stack)
+ {
+ super(type);
+ this.stack = stack;
}
};
-setTimeout((function(){
- let out = dragonblocks.Inventory.out = new dragonblocks.createItemstack();
- dragonblocks.Inventory.drawStack(document.body, 0, 0, out);
- dragonblocks.Inventory.getStackDisplay(out.id).style.position = "fixed";
- out.addUpdateListener(_ => {
- dragonblocks.Inventory.redrawStack(out);
- });
- out.onredraw = _ => {
- dragonblocks.Inventory.getStackDisplay(out.id).style.backgroundColor = "";
- dragonblocks.Inventory.getStackDisplay(out.id).style.border = "none";
- };
- addEventListener("mousemove", event => {
- dragonblocks.Inventory.getStackDisplay(out.id).style.left = event.clientX + 5 + "px";
- dragonblocks.Inventory.getStackDisplay(out.id).style.top = event.clientY + 5 + "px";
- });
- out.update();
-}));