4 * Copyright 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
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.
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.
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,
26 dragonblocks.backendCall = (call, plain, data) => {
30 let fetchFunc = plain ? $.get : $.getJSON;
32 let response = fetchFunc({
38 return plain ? response.responseText : response.responseJSON;
41 dragonblocks.settings = $.getJSON("settings.json").responseJSON;
43 let version = dragonblocks.version = $.getJSON("version.json").responseJSON;
44 version.commit = version.development && (dragonblocks.backendCall("commitID", true) || "?");
45 version.string = "Dragonblocks "
48 + (version.patch ? "." + version.patch : "")
49 + (version.development ? "-dev-" + version.commit : "");
51 dragonblocks.isChromeApp = window.chrome && chrome.app;
53 addEventListener("error", event => {
54 if (confirm(event.message + "\nStack trace: \n" + event.error.stack + "\nPlease report this to the dragonblocks developers."))
55 location.href = version.repo + "/issues/new?"
56 + "title=" + encodeURIComponent(event.message)
57 + "&body=" + encodeURIComponent(event.error.stack)
60 dragonblocks.backlog = "";
62 dragonblocks.loadModList = _ => {
63 dragonblocks.gamemods = dragonblocks.backendCall("getGamemods");
64 dragonblocks.mods = dragonblocks.backendCall("getMods");
67 dragonblocks.loggedin = dragonblocks.backendCall("isLoggedin");
68 dragonblocks.username = dragonblocks.loggedin ? dragonblocks.backendCall("getUsername", true) : "singleplayer";
70 dragonblocks.log = text => {
71 console.log("[Dragonblocks] " + text);
72 dragonblocks.backlog += text + "\n";
75 dragonblocks.error = err => {
76 let error = new Error(err);
77 dragonblocks.backlog += error;
82 dragonblocks.getModInfo = modname => {
83 return dragonblocks.mods[modname] || dragonblocks.gamemods[modname];
86 dragonblocks.getModpath = modname => {
87 return dragonblocks.getModInfo(modname).path;
92 let loadMod = modname => {
93 if (loadingMods[modname])
94 dragonblocks.error("Circular Mod Dependencies: " + modname);
96 if (dragonblocks.loadedMods[modname])
99 let modinfo = dragonblocks.getModInfo(modname);
102 dragonblocks.error("Unresolved Mod Dependencies: " + modname);
104 loadingMods[modname] = true;
106 for (let dependency of modinfo.dependencies)
109 $.getScript(modinfo.path + "/init.js");
111 dragonblocks.loadedMods[modname] = modinfo;
112 loadingMods[modname] = false;
115 dragonblocks.loadMods = selectedMods = _ => {
116 dragonblocks.loadedMods = {};
118 for (let mod in selectedMods)
119 if (selectedMods[mod])
122 for (let mod in dragonblocks.gamemods)
126 dragonblocks.start = worldProperties => {
127 dragonblocks.log("Starting");
129 for (let func of dragonblocks.onStartCallbacks)
133 dragonblocks.world = new dragonblocks.World(worldProperties);
134 dragonblocks.player = dragonblocks.world.player;
136 for (let func of dragonblocks.onStartedCallbacks)
141 dragonblocks.onStartCallbacks = [];
142 dragonblocks.registerOnStart = func => {
143 dragonblocks.onStartCallbacks.push(func);
146 dragonblocks.onStartedCallbacks = [];
147 dragonblocks.registerOnStarted = func => {
148 dragonblocks.onStartedCallbacks.push(func);
151 dragonblocks.quit = _ => {
152 for (let func of dragonblocks.onQuitCallbacks)
155 if (dragonblocks.loggedin)
157 dragonblocks.player.removeFromMap();
158 dragonblocks.world.save();
165 dragonblocks.onQuitCallbacks = [];
166 dragonblocks.registerOnQuit = func => {
167 dragonblocks.onQuitCallbacks.push(func);
189 "inventory_container",
190 "creative_inventory",
208 let moduleCount = modules.length;
210 let status = document.getElementById("elidragon.status");
211 let loadbar = document.getElementById("elidragon.loadbar");
213 let loadNextModuleRecursive = _ => {
214 let nextModule = modules.shift();
217 let filename = nextModule + ".js";
218 status.innerHTML = filename;
221 url: "engine/" + filename,
225 loadbar.style.width = (moduleCount - modules.length) / moduleCount * 100 + "%";
226 loadNextModuleRecursive();
232 loadNextModuleRecursive();