]> git.lizzy.rs Git - dragonblocks.git/blob - game/plants/api.js
Map abstraction and World class
[dragonblocks.git] / game / plants / api.js
1 dragonblocks.registerGroup({
2         name: "plants_wood",
3 });
4 dragonblocks.registerGroup({
5         name: "plants_tree",
6 });
7 plants.registerTree = function(obj){
8         if(! (obj.name && obj.tree && obj.growtimeMin && obj.growtimeMax && obj.saplingDropChance))
9                 return;
10         obj.desc = obj.desc || dblib.humanFormat(obj.name);
11         obj.leavesName = obj.leavesName || "Leaves";
12         obj.treeName = obj.treeName || "Tree";
13         obj.woodName = obj.woodName || "Wood";
14         obj.saplingName = obj.saplingName || "Sapling";
15         obj.woodFromTree = obj.woodFromTree || 1;
16         let name = "plants:" + obj.name;
17         let texture = "plants_" + obj.name;
18         obj.tree.replace("leaves", name + "_leaves");
19         obj.tree.replace("tree", name + "_tree");
20         obj.tree.addFunction((node, map, x, y) => {
21                 if(node.stable && node.name != name + "_sapling")
22                         return false;
23         });
24         dragonblocks.registerNode({
25                 name: name + "_sapling",
26                 stable: true,
27                 mobstable: false,
28                 texture: texture + "_sapling.png",
29                 groups: ["snappy"],
30                 hardness: 2,
31                 onset: (map, x, y) => {
32                         dragonblocks.setTimer("growTimer", dblib.random(obj.growtimeMin, obj.growtimeMax), _ => {
33                                 obj.tree.apply(map, x, y);
34                         }, map.getNode(x, y).meta);
35                 },
36                 onremove: (map, x, y) => {
37                         dragonblocks.clearTimer("growTimer", map.getNode(x, y).meta);
38                 },
39                 onplace: (map, x, y) => {
40                         if(map.getNode(x, y + 1) && ! map.getNode(x, y + 1).toNode().inGroup("dirt"))
41                                 return false;
42                 },
43                 desc: obj.desc + " " + obj.saplingName,
44                 stacksize: obj.stacksize,
45                 flammable: true,
46         });
47         dragonblocks.registerNode({
48                 name: name + "_tree",
49                 stable: true,
50                 mobstable: false,
51                 zIndex: -1,
52                 texture: texture + "_tree.png",
53                 groups: ["choppy", "plants_tree"],
54                 hardness: 7,
55                 desc: obj.desc + " " + obj.treeName,
56                 stacksize: obj.stacksize,
57                 flammable: true,
58                 onplace: (map, x, y) => {
59                         setTimeout(_ => {
60                                 map.getNode(x, y).mobstable = true;
61                         });
62                 }
63         });
64         dragonblocks.registerNode({
65                 name: name + "_wood",
66                 stable: true,
67                 texture: texture + "_wood.png",
68                 groups: ["choppy", "plants_wood"],
69                 hardness: 6,
70                 desc: obj.desc + " " + obj.woodName,
71                 stacksize: obj.stacksize,
72                 flammable: true,
73         });
74         dragonblocks.registerNode({
75                 name: name + "_leaves",
76                 stable: true,
77                 mobstable: false,
78                 zIndex: -1,
79                 texture: texture + "_leaves.png",
80                 groups: ["snappy"],
81                 hardness: 3,
82                 drops: _ => {
83                         if(dblib.random(0, obj.saplingDropChance) == 0)
84                                 return name + "_sapling";
85                         return name + "_leaves";
86                 },
87                 desc: obj.desc + " " + obj.leavesName,
88                 stacksize: obj.stacksize,
89                 flammable: true,
90         });
91         dragonblocks.registerRecipe({
92                 result: name + "_wood " + obj.woodFromTree,
93                 recipe: [
94                         [name + "_tree"]
95                 ]
96         });
97 }
98 plants.registerSimple = function(obj){
99         if(! obj || ! obj.name || ! obj.growtimeMin || ! obj.growtimeMax || ! obj.maxHeight || ! obj.growOn)
100                 return;
101         obj.desc = obj.desc || dblib.humanFormat(obj.name);
102         obj.hardness = obj.hardness || 2,
103         obj.groups = obj.groups || ["snappy"];
104         let name = "plants:" + obj.name;
105         dragonblocks.registerNode({
106                 name: name,
107                 texture: "plants_" + obj.name + ".png",
108                 stable: true,
109                 mobstable: obj.mobstable,
110                 groups: obj.groups,
111                 hardness: obj.hardness,
112                 desc: obj.desc || dblib.humanFormat(obj.name),
113                 onset: (map, x, y) => {
114                         let meta = map.getNode(x, y).meta;
115                         meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
116                         meta.growInterval = setInterval(_ => {
117                                 if(! map.getNode(x, y - 1) || map.getNode(x, y - 1).stable)
118                                         return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
119                                 let iy = y + 1;
120                                 while(true){
121                                         if(! map.getNode(x, iy))
122                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
123                                         else if(iy == y + obj.maxHeight)
124                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
125                                         else if(! dragonblocks.itemMatch(obj.growOn, map.getNode(x, iy)))
126                                                 break;
127                                         else if(map.getNode(x, iy).name == name)
128                                                 iy++;
129                                         else
130                                                 return meta.growTime = dblib.random(obj.growtimeMin, obj.growtimeMax);
131                                 }
132                                 meta.growTime--;
133                                 if(meta.growTime <= 0)
134                                         map.setNode(x, y - 1, name);
135                         }, 1000);
136                 },
137                 onremove: (map, x, y) => {
138                           clearInterval(map.getNode(x, y).meta.growInterval);
139                 },
140                 ondig: (map, x, y) => {
141                         if(obj.dropAbove && map.getNode(x, y - 1) && map.getNode(x, y - 1).name == name)
142                                 dragonblocks.player.digEnd(x, y - 1);
143                 },
144                 stacksize: obj.stacksize,
145                 flammable: true,
146         });
147 }
148 plants.registerFlower = function(){}
149 plants.registerGrass = function(){}