]> git.lizzy.rs Git - dragonblocks.git/blob - engine/init.js
Reset file permissions to defaults
[dragonblocks.git] / engine / init.js
1 /*
2  * init.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 $.ajaxSetup({
24         async: false,
25         cache: false
26 });
27 addEventListener("contextmenu", event => {
28         event.preventDefault();
29 });
30 dragonblocks = {};
31 dragonblocks.settings = $.getJSON("settings.json").responseJSON;
32 dragonblocks.backlog = "";
33 dragonblocks.mods = [];
34 dragonblocks.settings.version.commit = $.get({
35         url: "api.php",
36         method: "POST",
37         data: {call: "commitID"}
38 }).responseText || dragonblocks.settings.version.commit;
39 dragonblocks.gamemods = $.getJSON({
40         method: "POST",
41         url: "api.php",
42         data: {call: "getGamemods"},
43 }).responseJSON;
44 dragonblocks.availableMods = $.getJSON({
45         method: "POST",
46         url: "api.php",
47         data: {call: "getMods"},
48 }).responseJSON;
49 dragonblocks.loggedin = $.getJSON({
50         url: "api.php",
51         method: "POST",
52         data: {call: "isLoggedin"}
53 }).responseJSON;
54 dragonblocks.username = "singleplayer";
55 if(dragonblocks.loggedin){
56         dragonblocks.username = $.post({
57                 url: "api.php",
58                 data: {call: "getUsername"}
59         }).responseText;
60 }
61 dragonblocks.log = function(text){
62         console.log("[Dragonblocks] " + text);
63         dragonblocks.backlog += text + "\n";
64 }
65 dragonblocks.error = function(err){
66         let error = new Error(err);
67         dragonblocks.backlog += error;
68         throw error;
69 }
70 dragonblocks.getToken = function(){
71         return "#" + (Math.random() * 10).toString().replace(".", "");
72 }
73 dragonblocks.getModpath = function(mod){
74         if(dragonblocks.availableMods.indexOf(mod) != -1)
75                 return "mods/" + mod;
76         if(dragonblocks.gamemods.indexOf(mod) != -1)
77                 return "game/" + mod;
78 }
79 dragonblocks.getVersion = function(){
80         let version = dragonblocks.settings.version;
81         return "Dragonblocks " + version.major + "." + version.minor + (version.patch ? "." + version.patch : "") + (version.development ? "-dev-" + version.commit : "");
82 }
83 dragonblocks.start = function(){
84         for(let func of dragonblocks.onStartFunctions)
85                 func();
86         setTimeout(_ => {
87                 for(let mod of dragonblocks.gamemods)
88                         dragonblocks.loadMod(mod);
89                 for(let mod of dragonblocks.mods)
90                         dragonblocks.loadMod(mod);
91                 new dragonblocks.Map();
92                 new dragonblocks.Player();
93                 if(! dragonblocks.worldIsLoaded)
94                         dragonblocks.generateMap();
95                 for(let func of dragonblocks.onStartedFunctions)
96                         func();
97         });
98 }
99 dragonblocks.onStartFunctions = [];
100 dragonblocks.registerOnStart = function(func){
101         dragonblocks.onStartFunctions.push(func);
102 }
103 dragonblocks.onStartedFunctions = [];
104 dragonblocks.registerOnStarted = function(func){
105         dragonblocks.onStartedFunctions.push(func);
106 }
107 dragonblocks.addFinalStep = function(step){
108         dragonblocks.registerOnStarted(step);
109         dragonblocks.log("dragonblocks.addFinalStep(...) is deprecated. Use dragonblocks.registerOnStarted instead. Trace:");
110         console.trace();
111 }
112 dragonblocks.quit = function(){
113         for(let func of dragonblocks.onQuitFunctions)
114                 func();
115         if(dragonblocks.loggedin)
116                 setTimeout(_ => {
117                         dragonblocks.save();
118                         location.reload();
119                 });
120         else
121                 location.reload();
122 }
123 dragonblocks.onQuitFunctions = [];
124 dragonblocks.registerOnQuit = function(func){
125         dragonblocks.onQuitFunctions.push(func);
126 }
127 dragonblocks.loadWorld = function(world){
128         dragonblocks.worldIsLoaded = true;
129         dragonblocks.worldname = world;
130         dragonblocks.world = $.getJSON("worlds/" + world + "/world.json").responseJSON;
131         dragonblocks.mods = dragonblocks.world.mods;
132         dragonblocks.start();
133 }
134 dragonblocks.createWorld = function(properties){
135         dragonblocks.worldIsLoaded = false;
136         dragonblocks.worldname = properties.worldname;
137         dragonblocks.world = dragonblocks.getEmptyWorld();
138         dragonblocks.entities["dragonblocks:player"].meta.creative = (properties.gamemode == "creative");
139         for(mod in properties.mods)
140                 properties.mods[mod] && dragonblocks.mods.push(mod);
141         dragonblocks.mapgen.selected = properties.mapgen;
142         dragonblocks.start();
143 }
144 dragonblocks.loadedMods = [];
145 dragonblocks.loadingMods = {};
146 dragonblocks.loadMod = function(modname){
147         if(! modname)
148                 return;
149         if(dragonblocks.loadingMods[modname])
150                 dragonblocks.error("Circular Mod Dependencies: " + modname);
151         if(dragonblocks.loadedMods.indexOf(modname) != -1)
152                 return;
153         if(dragonblocks.gamemods.indexOf(modname) != -1)
154                 var modpath = "game/" + modname;
155         else if(dragonblocks.availableMods.indexOf(modname) != -1)
156                 var modpath = "mods/" + modname;
157         else
158                 dragonblocks.error("Unsolved Mod Dependencies: " + modname);
159         let dependencyRequest = $.get(modpath + "/dependencies.txt");
160         if(dependencyRequest.status == 200){
161                 let dependencies = dependencyRequest.responseText.split("\n");
162                 for(let dependency of dependencies)
163                         dragonblocks.loadMod(dependency);
164         }
165         $.getScript(modpath + "/init.js");
166         dragonblocks.loadedMods.push(modname);
167         dragonblocks.loadingMods[modname] = false;
168 }
169 dragonblocks.modules = [
170         "ressources",
171         "key_handler",
172         "gui",
173         "mapgen",
174         "world",
175         "item",
176         "node",
177         "tool",
178         "group",
179         "builtin",
180         "map_node",
181         "map",
182         "itemstack",
183         "inventory",
184         "inventory_group",
185         "hudbar",
186         "inventory_container",
187         "creative_inventory",
188         "recipe",
189         "craftfield",
190         "menu",
191         "skin",
192         "entity",
193         "map_interaction",
194         "spawned_entity",
195         "item_entity",
196         "falling_node",
197         "timer",
198         "player",
199         "pixel_manipulator",
200         "chat",
201         "chatcommands",
202         "mainmenu",
203 ];
204 dragonblocks.moduleCount = dragonblocks.modules.length;
205 dragonblocks.loadModule = function(){
206         if(dragonblocks.modules[0]){
207                 document.getElementById("elidragon.status").innerHTML = dragonblocks.modules[0] + ".js";
208                 $.getScript({
209                         url: "engine/" + dragonblocks.modules.shift() + ".js",
210                         async: true,
211                         success: _ => {
212                                 document.getElementById("elidragon.loadbar").style.width = (dragonblocks.moduleCount - dragonblocks.modules.length) / dragonblocks.moduleCount * 100 + "%";
213                                 dragonblocks.loadModule();
214                         },
215                 });
216         }
217 }
218 dragonblocks.loadModule();