diff --git a/README.md b/README.md index e4d6d14..83c06c7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # OneLoader High performance mod loader for OMORI + + +OneLoader mascot art by [bajamaid](https://twitter.com/bajamaid) + ## Credits/Licensing This project contains in part or in full the following projects: diff --git a/www/modloader/_oneloader_configuration.js b/www/modloader/_oneloader_configuration.js index 25e9ecf..7fd7275 100644 --- a/www/modloader/_oneloader_configuration.js +++ b/www/modloader/_oneloader_configuration.js @@ -3,7 +3,7 @@ if (window.nw.App.argv[0] !== "test") { const MAX_MANIFEST_VERSION = 1; const ID_BLACKLIST = ["gomori"]; const EXTENSION_RULES = { - "png": { "encrypt": "rpgmaker", "target_extension": "rpgmvp" }, + "png": { "encrypt": "rpgmaker", "target_extension": "rpgmvp", "raw": ["img/system/window.png", "img/system/loading.png"] }, "ogg": { "encrypt": "rpgmaker", "target_extension": "rpgmvo" } }; diff --git a/www/modloader/early_loader.js b/www/modloader/early_loader.js index 722236d..a6f0fad 100644 --- a/www/modloader/early_loader.js +++ b/www/modloader/early_loader.js @@ -39,7 +39,9 @@ "pre_plugin_injection": [], "pre_window_onload": [], "when_discovered_2": [], - "when_discovered_3": [] + "when_discovered_3": [], + "exclusion_processor": [], + "exclusion_processor2": [] }, async $runRequire(data, p) { native_fs.writeFileSync(path.join(base, "temp_ONELOADER.js"), data); @@ -296,6 +298,11 @@ } get extensionRule() { + if (EXTENSION_RULES[this.srcExtension] && EXTENSION_RULES[this.srcExtension].raw && EXTENSION_RULES[this.srcExtension].raw.includes( + (this.srcPath + "/" + this.srcFile).toLowerCase() + )) { + return null; + } return EXTENSION_RULES[this.srcExtension] || null; } } @@ -490,6 +497,15 @@ } } + if (this.json._flags && this.json._flags.includes("randomize_plugin_name")) { + if (this.json.plugins_ordered) { + throw new Error("Randomized plugin names or plugins_ordered. Choose one."); + } + } + if (!this.json.plugins_ordered) { + this.json.plugins_ordered = {}; + } + await this.processAsyncExecV1(); if (this.json.files.assets) { await this.processAssetsV1(this.json.files.assets); @@ -970,6 +986,11 @@ window._logLine("Exclusions: " + JSON.stringify(Array.from(exclusions.entries()))); window._logLine("Rquirements: " + JSON.stringify(Array.from(requirements.entries()))); + await $modLoader.$runScripts("exclusion_processor", { + exclusions, + requirements + }); + let exclusionFailures = []; let requirementFailures = []; @@ -988,6 +1009,13 @@ console.log(exclusionFailures, requirementFailures); console.log(exclusions, requirements); + await $modLoader.$runScripts("exclusion_processor2", { + exclusions, + requirements, + exclusionFailures, + requirementFailures + }); + window._logLine("Exclusion failures: " + JSON.stringify(exclusionFailures)); window._logLine("Requirement failures: " + JSON.stringify(requirementFailures)); @@ -1061,17 +1089,34 @@ window._logLine("Looking for plugin conflicts..."); let pluginLocks = new Set(); + let pluginOrderingRules = new Map(); for (let modEntry of $modLoader.knownMods.values()) { for (let pluginName of modEntry.pluginsDelta) { + alert(`The mod ${modEntry.json.id} is using an UNSUPPORTED, DEPRECATED FEATURE. (Plugin Deltas)\nPlease contact the author of ${modEntry.json.id} (Name: ${modEntry.json.name}) in order to get this resolved.`); let fileName = pluginName.match(/[^\/\\]*$/)[0].toLowerCase(); fileName = fileName.match(/(.*)\.[a-z]*$/)[1]; pluginLocks.add(fileName); + pluginOrderingRules.set(fileName, { + culprit: modEntry, + rule: {"at":-1} + }); } } for (let modEntry of $modLoader.knownMods.values()) { for (let pluginName of modEntry.plugins) { let fileName = pluginName.match(/[^\/\\]*$/)[0].toLowerCase(); fileName = fileName.match(/(.*)\.[a-z]*$/)[1]; + if (modEntry.json.plugins_ordered[fileName]) { + pluginOrderingRules.set(fileName, { + culprit: modEntry, + rule: modEntry.json.plugins_ordered[fileName] + }); + } else { + pluginOrderingRules.set(fileName, { + culprit: modEntry, + rule: {"at":-1} + }); + } if (pluginLocks.has(fileName)) { alert("Plugin conflict: " + fileName + " was already replaced when " + modEntry.json.id + " tried to replace it."); throw new Error("Plugin conflicts can't be auto-resolved."); @@ -1080,6 +1125,7 @@ } } + $modLoader.pluginOrderingRules = pluginOrderingRules; $modLoader.pluginLocks = pluginLocks; window._logLine("Installing VFS handler (1/2) [Chrome DevTools mode]"); diff --git a/www/modloader/oneloader-loading-gui2.js b/www/modloader/oneloader-loading-gui2.js index f13aa28..952d7c6 100755 --- a/www/modloader/oneloader-loading-gui2.js +++ b/www/modloader/oneloader-loading-gui2.js @@ -1,3 +1,6 @@ +// Image credit: Bajamaid +const hot_catgirl = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAZlBMVEX///8yNz5AQlGVqMEAAAD1+f/rv66/cV4cHSSetM/99+52WUcqLD7B0uCut8KAk8f/3NZwcHD++/X029LM4PXNwdY+VXCSs9x9nMKszOxqdd0hLFQdITCZsP/q+P/D1N1vfpI8SXYiyUzWAAAAAXRSTlMAQObYZgAAANtJREFUeNp0jIUWBCEIAA10e6+78P9/8rAuYTaMmYf6ILxXlnALdRWCazTkr2KACTnARwJRCIqPieDvxd/5AslkHlLwRg5QCqJHAPAY/w8MgQlg3qzAw/54gnC7BS5YrQFgKwUW5uUSetgdD3CJ/i+wAND3Pf0vZzYgmoi1XIDR6nGcxtFiODMDmsZ7bZxzxqL/913X9T0FxhkKmn/vXOeHIQda/dNN0zBYq7XThOKKhSVv4oQ4ggOrF4voK1r2ciEG70K/NedjUlESjffxVSKtMfFVMm37HAiRBgAiGRaKlPJ1XQAAAABJRU5ErkJggg==`; + window.$oneLoaderGui = new (class OneLoaderGui { constructor() { this.easterEgg = { @@ -9,6 +12,16 @@ window.$oneLoaderGui = new (class OneLoaderGui { this.container.style = "font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #222; color: white; width: 100vw; height: 100vh; position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;"; requestAnimationFrame(() => { this.tryMount(); }); + let catgirlScale = Math.floor(Math.floor(Math.min(window.innerWidth, window.innerHeight) / 3) / 32); + + let catgirlAnimationOptions = [ + ["__oneloader_catgirl__1_", "2s linear"], + ["__oneloader_catgirl__2_", "2s cubic-bezier(0.68, 1.1, 0.59, 0.79)"], + ["__oneloader_catgirl__3_", "1s ease"] + ]; + + let pickedOption = catgirlAnimationOptions[Math.floor(Math.random() * catgirlAnimationOptions.length)]; + this.container.innerHTML = `