]> git.lizzy.rs Git - dragonblocks.git/blob - engine/inventory.js
Reset file permissions to defaults
[dragonblocks.git] / engine / inventory.js
1 /*
2  * inventory.js
3  * 
4  * Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * 
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  * 
21  * 
22  */
23 dragonblocks.Inventory = class{
24         constructor(slots, columns){
25                 this.id = dragonblocks.getToken();
26                 this.slots = slots;
27                 this.columns = columns;
28                 this.list = [];
29                 for(let i = 0; i < this.slots; i++){
30                         this.list[i] = new dragonblocks.createItemstack();
31                 }
32                 this.display = false;
33         }
34         stringify(){
35                 let str = ""
36                 for(let stack of this.list)
37                         str += stack.stringify() + ",";
38                 return str;
39         }
40         parse(str){
41                 for(let i in this.list)
42                         this.list[i].parse(str.split(",")[i]); 
43         }
44         add(itemstring){
45                 var itemstack = dragonblocks.createItemstack(itemstring);
46                 for(let stack of this.list)
47                         stack.item == itemstack.item && stack.add(itemstack);
48                 for(let stack of this.list)
49                         stack.add(itemstack);
50                 return itemstack;
51         }
52         isEmpty(){
53                 for(let stack of this.list)
54                         if(stack.item)
55                                 return false;
56                 return true;
57         }
58         addUpdateListener(func){
59                 for(let stack of this.list)
60                         stack.addUpdateListener(func);
61         }
62         clear(){
63                 for(let stack of this.list)
64                         stack.clear();
65         }
66         calculateWidth(columns){
67                 return dragonblocks.settings.inventory.scale * 1.1 * this.columns + (dragonblocks.settings.inventory.scale * 0.1);
68         }
69         calculateHeight(){
70                 return dragonblocks.settings.inventory.scale * 1.1 * Math.ceil(this.slots/this.columns) + dragonblocks.settings.inventory.scale * 0.1
71         }
72         draw(parent, x, y){
73                 if(this.display){
74                         if(this.getDisplay().parentElement != parent)
75                                 this.remove();
76                         else{
77                                 this.getDisplay().style.left = x + "px";
78                                 this.getDisplay().style.top = y + "px";
79                                 return false;
80                         }
81                 }
82                 let display = document.createElement("div");
83                 display.id = "dragonblocks.inventory[" + this.id + "]";
84                 display.style.position = "absolute";
85                 display.style.left = x + "px";
86                 display.style.top = y + "px";
87                 display.style.width =  this.calculateWidth() + "px";
88                 display.style.height = this.calculateHeight() + "px";
89                 for(let i in this.list){
90                         let x = i % this.columns;
91                         let y = (i - x) / this.columns;
92                         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]);
93                 }
94                 parent.appendChild(display);
95                 this.display = true;
96                 return true;
97         }
98         remove(){
99                 dblib.remove(this.getDisplay());
100                 this.display = false;
101         }
102         show(){
103                 this.getDisplay().style.visibility = "inherit";
104                 this.update();
105         }
106         hide(){
107                 this.getDisplay().style.visibility = "hidden";
108         }
109         update(){
110                 for(let stack of this.list)
111                         stack.update();
112         }
113         getSlot(i){
114                 return this.list[i];
115         }
116         getDisplay(){
117                 return document.getElementById("dragonblocks.inventory[" + this.id + "]");
118         }
119         static drawStack(parent, x, y, stack){
120                 let stackDisplay = document.createElement("div");
121                 stackDisplay.id = "dragonblocks.itemstack[" + stack.id + "]";
122                 stackDisplay.stackid = stack.id;
123                 stackDisplay.style.borderStyle = "solid";
124                 stackDisplay.style.borderWidth = "1px";
125                 stackDisplay.style.borderColor = "#2D2D2D";
126                 stackDisplay.style.width = dragonblocks.settings.inventory.scale + "px";
127                 stackDisplay.style.height = dragonblocks.settings.inventory.scale + "px";
128                 stackDisplay.style.backgroundColor = "#343434";
129                 stackDisplay.style.position = "absolute";
130                 stackDisplay.style.left = x + "px";
131                 stackDisplay.style.top = y + "px";
132                 stackDisplay.addEventListener("mousedown", event => {
133                         let out = dragonblocks.Inventory.out;
134                         if(stack.action)
135                                 return stack.action(out, event.which);
136                         switch(event.which){
137                                 case 1:
138                                         if(out.item)
139                                                 stack.add(out) || stack.swap(out);
140                                         else
141                                                 out.add(stack);
142                                         break;
143                                 case 3:
144                                         if(out.item)
145                                                 stack.addOne(out) || stack.swap(out);
146                                         else
147                                                 out.addHalf(stack);
148                         }
149                 });
150                 stackDisplay.addEventListener("mouseover", event => {
151                         stack.focused = true;
152                         dragonblocks.Inventory.redrawStack(stack);
153                 });
154                 stackDisplay.addEventListener("mouseleave", event => {
155                         stack.focused = false;
156                         dragonblocks.Inventory.redrawStack(stack);
157                 });
158                 let stackDisplayCount = document.createElement("span");
159                 stackDisplayCount.id = "dragonblocks.itemstack[" + stack.id + "].count";
160                 stackDisplayCount.stackid = stack.id;
161                 stackDisplayCount.style.position = "absolute";
162                 stackDisplayCount.style.right = "5px";
163                 stackDisplayCount.style.bottom = "5px";
164                 stackDisplayCount.style.color = "white";
165                 stackDisplayCount.style.cursor = "default";
166                 stackDisplay.appendChild(stackDisplayCount);
167                 parent.appendChild(stackDisplay);
168                 stack.addUpdateListener(_ => {
169                         dragonblocks.Inventory.redrawStack(stack);
170                 });
171                 stack.update();
172         }
173         static redrawStack(stack){
174                 let stackDisplay = document.getElementById("dragonblocks.itemstack[" + stack.id + "]");
175                 if(! stackDisplay)
176                         return;
177                 let stackDisplayCount = document.getElementById("dragonblocks.itemstack[" + stack.id + "].count");
178                 stackDisplay.title = "";
179                 stackDisplay.style.background = "none";
180                 stackDisplayCount.innerHTML = "";
181                 if(stack.item){
182                         stackDisplay.style.background = dragonblocks.getTexture(stack.toItem().texture);
183                         stackDisplay.style.backgroundSize = "cover";
184                         stackDisplay.title = stack.toItem().desc;
185                         if(stack.count > 1)
186                                 stackDisplayCount.innerHTML = stack.count;
187                 }
188                 stackDisplay.style.backgroundColor = "#343434";
189                 if(stack.focused)
190                         stackDisplay.style.backgroundColor = "#7E7E7E";
191                 if(stack.onredraw)
192                         stack.onredraw();
193         }
194         static getStackDisplay(id){
195                 return document.getElementById("dragonblocks.itemstack[" + id + "]");
196         }
197         static insertElement(elem){
198                 document.body.insertBefore(elem, dragonblocks.Inventory.getStackDisplay(dragonblocks.Inventory.out.id));
199         }
200 };
201 setTimeout((function(){
202         let out = dragonblocks.Inventory.out = new dragonblocks.createItemstack();
203         dragonblocks.Inventory.drawStack(document.body, 0, 0, out);
204         dragonblocks.Inventory.getStackDisplay(out.id).style.position = "fixed";
205         out.addUpdateListener(_ => {
206                 dragonblocks.Inventory.redrawStack(out);
207         });
208         out.onredraw = _ => {
209                 dragonblocks.Inventory.getStackDisplay(out.id).style.backgroundColor = "";
210                 dragonblocks.Inventory.getStackDisplay(out.id).style.border = "none";
211         };
212         addEventListener("mousemove", event => {
213                 dragonblocks.Inventory.getStackDisplay(out.id).style.left = event.clientX + 5 + "px";
214                 dragonblocks.Inventory.getStackDisplay(out.id).style.top = event.clientY + 5 + "px";
215         });
216         out.update();
217 }));