]> git.lizzy.rs Git - dragonblocks.git/blob - engine/recipe.js
Implement per-map sky
[dragonblocks.git] / engine / recipe.js
1 /*
2  * recipe.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
24 dragonblocks.Recipe = class
25 {
26         constructor(def)
27         {
28                 if (! def || ! def.result || ! def.recipe instanceof Array || ! def.recipe[0] instanceof Array)
29                         return;
30
31                 this.recipe = def.recipe;
32                 this.result = def.result;
33
34                 this.height = this.recipe.length;
35                 this.width = this.recipe[0].length;
36
37                 dragonblocks.recipes.push(this);
38         }
39
40         match(craftfield)
41         {
42                 if (craftfield.width < this.width || craftfield.height < this.height)
43                         return false;
44
45                 for (let ydiff = 0; ydiff <= craftfield.height - this.height; ydiff++) {
46                         for (let xdiff = 0; xdiff <= craftfield.width - this.width; xdiff++) {
47                                 let found = true;
48
49                                 for (let y = 0; y < craftfield.height; y++) {
50                                         for (let x = 0; x < craftfield.width; x++) {
51                                                 if (! this.recipe[y - ydiff] || ! this.recipe[y - ydiff][x - xdiff]) {
52                                                         if (craftfield.list[y * craftfield.width + x].item)
53                                                                 found = false;
54                                                 } else if (! dragonblocks.itemMatch(craftfield.list[y * craftfield.width + x].item, this.recipe[y - ydiff][x - xdiff])) {
55                                                         found = false;
56                                                 }
57                                         }
58                                 }
59
60                                 if (found)
61                                         return true;
62                         }
63                 }
64
65                 return false;
66         }
67 };
68
69 dragonblocks.recipes = [];
70 dragonblocks.registerRecipe = def => {
71         let recipeDef = new dragonblocks.Recipe(def);
72         dragonblocks.recipes.push(recipeDef);
73 };