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