XVoxel-ASync/core.js

80 lines
1.5 KiB
JavaScript

var modules = {
"render": {
"source": "./modules/render.js",
"dependsOn": []
},
"input": {
"source": "./modules/input.js",
"dependsOn": ["render"]
},
"resources": {
"source": "./modules/resources.js",
"dependsOn": []
},
"world": {
"source": "./modules/world.js",
"dependsOn": []
},
"network": {
"source": "./modules/network.js",
"dependsOn": []
}
};
var plugins = {
"splash": {
"type": "plugin",
"source": "./plugins/splash.js",
"loadAs": "splash",
"dependsOn": ["render"]
}
};
var loadings = {};
class GameCore extends global.utils.EventListener {
constructor () {
super();
this.modules = {};
this.plugins = {};
}
init (meta) {
return new Promise((function (resolve, reject) {
for (var data in meta) {
if (meta.hasOwnProperty(data)) {
var metadata = meta[data];
if (loadings[data]) continue;
loadings[data] = this.loadModule(data);
}
}
Promise.all(Object.values(loadings)).then((function () {
this.emit("pre-init", {});
resolve(this);
}).bind(this)).catch(reject);
}).bind(this));
}
loadModule (moduleName) {
return load("./modules/" + moduleName + ".js").then((function (mod) {
this.modules[moduleName] = mod;
}).bind(this)).catch(throwError);
}
loadPlugin (pluginName) {
return load("./plugins/" + pluginName + ".js").then((function (plugin) {
this.plugins[pluginName] = plugin;
}).bind(this)).catch(throwError);
}
}
module.exports = {
"GameCore": GameCore,
"loadData": {
"modules": modules,
"plugins": plugins
}
};