From a14f75b2efbcefd9ecd491ae8e93d32e1ece61fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=8D=9A=7ENex?= <87421482+NexIsDumb@users.noreply.github.com> Date: Sun, 7 Apr 2024 03:02:16 +0200 Subject: [PATCH] you know the fuck what still a wip Co-Authored-By: Ne_Eo --- .../backend/assets/IModsAssetLibrary.hx | 1 + source/funkin/backend/assets/ModsFolder.hx | 10 ++-- .../backend/assets/ModsFolderLibrary.hx | 26 +++++++--- source/funkin/backend/assets/Paths.hx | 4 +- .../backend/assets/ScriptedAssetLibrary.hx | 9 ++-- .../funkin/backend/assets/ZipFolderLibrary.hx | 29 ++++++++--- .../funkin/backend/utils/TranslationsUtil.hx | 48 +++++++++++++------ source/openfl/utils/AssetLibrary.hx | 8 +++- 8 files changed, 97 insertions(+), 38 deletions(-) diff --git a/source/funkin/backend/assets/IModsAssetLibrary.hx b/source/funkin/backend/assets/IModsAssetLibrary.hx index a080189b..73e34ce5 100644 --- a/source/funkin/backend/assets/IModsAssetLibrary.hx +++ b/source/funkin/backend/assets/IModsAssetLibrary.hx @@ -25,6 +25,7 @@ interface IModsAssetLibrary { public var prefix:String; public var modName:String; public var libName:String; + public var basePath:String; #if MOD_SUPPORT public var _parsedAsset:String; diff --git a/source/funkin/backend/assets/ModsFolder.hx b/source/funkin/backend/assets/ModsFolder.hx index cd1704ed..88a70223 100644 --- a/source/funkin/backend/assets/ModsFolder.hx +++ b/source/funkin/backend/assets/ModsFolder.hx @@ -108,7 +108,7 @@ class ModsFolder { #end return mods; } - public static function getLoadedMods():Array { + public static function getLoadedModsLibs():Array { var libs = []; for (i in Paths.assetsTree.libraries) { var l = i; @@ -117,13 +117,13 @@ class ModsFolder { @:privateAccess if (al.__proxy != null) l = al.__proxy; } - var libString:String; - if (l is ScriptedAssetLibrary || l is IModsAssetLibrary) libString = cast(l, IModsAssetLibrary).modName; - else continue; - libs.push(libString); + if (l is ScriptedAssetLibrary || l is IModsAssetLibrary) libs.push(cast(l, IModsAssetLibrary)); } return libs; } + public static function getLoadedMods():Array + return [for (modLib in getLoadedModsLibs()) modLib.modName]; + public static function prepareLibrary(libName:String, force:Bool = false) { var assets:AssetManifest = new AssetManifest(); assets.name = libName; diff --git a/source/funkin/backend/assets/ModsFolderLibrary.hx b/source/funkin/backend/assets/ModsFolderLibrary.hx index ed608bda..393112da 100644 --- a/source/funkin/backend/assets/ModsFolderLibrary.hx +++ b/source/funkin/backend/assets/ModsFolderLibrary.hx @@ -1,7 +1,7 @@ package funkin.backend.assets; -import lime.utils.AssetLibrary; -import lime.utils.Assets as LimeAssets; +import openfl.utils.AssetLibrary; +//import lime.utils.Assets as LimeAssets; import lime.media.AudioBuffer; import lime.graphics.Image; @@ -16,14 +16,14 @@ import sys.FileSystem; using StringTools; class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary { - public var folderPath:String; + public var basePath:String; public var modName:String; public var libName:String; public var useImageCache:Bool = true; public var prefix = 'assets/'; - public function new(folderPath:String, libName:String, ?modName:String) { - this.folderPath = folderPath; + public function new(basePath:String, libName:String, ?modName:String) { + this.basePath = basePath; this.libName = libName; this.prefix = 'assets/$libName/'; if(modName == null) @@ -33,6 +33,10 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary { super(); } + function toString():String { + return '(ModsFolderLibrary: $libName/$modName)'; + } + #if MOD_SUPPORT private var editedTimes:Map = []; public var _parsedAsset:String = null; @@ -111,7 +115,7 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary { } private function getAssetPath() { - return '$folderPath/$_parsedAsset'; + return '$basePath/$_parsedAsset'; } private function __isCacheValid(cache:Map, asset:String, isLocalCache:Bool = false) { @@ -150,4 +154,14 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary { return true; } #end + + // Backwards compat + + @:noCompletion public var folderPath(get, set):String; + @:noCompletion private inline function get_folderPath():String { + return basePath; + } + @:noCompletion private inline function set_folderPath(value:String):String { + return basePath = value; + } } \ No newline at end of file diff --git a/source/funkin/backend/assets/Paths.hx b/source/funkin/backend/assets/Paths.hx index e8405dc0..e607af4a 100644 --- a/source/funkin/backend/assets/Paths.hx +++ b/source/funkin/backend/assets/Paths.hx @@ -23,6 +23,8 @@ class Paths */ inline public static final SOUND_EXT = #if web "mp3" #else "ogg" #end; + public static inline var translFolderName:String = "translations"; + public static var assetsTree:AssetsLibraryList; public static var tempFramesCache:Map = []; @@ -37,7 +39,7 @@ class Paths return library != null ? '$library:assets/$library/$file' : 'assets/$file'; public static inline function translationsMain(key:String) - return getPath('translations/$key'); + return getPath('$translFolderName/$key'); public static inline function translations(key:String) return translationsMain('${TranslationsUtil.curLanguage}/$key'); diff --git a/source/funkin/backend/assets/ScriptedAssetLibrary.hx b/source/funkin/backend/assets/ScriptedAssetLibrary.hx index 0fd8d380..1f43a58f 100644 --- a/source/funkin/backend/assets/ScriptedAssetLibrary.hx +++ b/source/funkin/backend/assets/ScriptedAssetLibrary.hx @@ -21,9 +21,9 @@ class ScriptedAssetLibrary extends ModsFolderLibrary { public var scriptName:String; private static var nullValue:Dynamic = {}; - public function new(scriptName:String, args:Array = null, folderPath:String="./assets/", libName:String="assets", ?modName:String) { + public function new(scriptName:String, args:Array = null, basePath:String="./assets/", libName:String="assets", ?modName:String) { if(modName == null) modName = scriptName; - super(folderPath, libName, modName); + super(basePath, libName, modName); this.scriptName = scriptName; script = Script.create(Paths.script("data/library/" + scriptName)); script.setParent(this); @@ -31,7 +31,10 @@ class ScriptedAssetLibrary extends ModsFolderLibrary { script.load(); if(args == null) args = []; script.call("create", args); - trace(script); + } + + override function toString():String { + return '(ScriptedAssetLibrary: $libName/$modName/$scriptName)'; } #if MOD_SUPPORT diff --git a/source/funkin/backend/assets/ZipFolderLibrary.hx b/source/funkin/backend/assets/ZipFolderLibrary.hx index 21e425d8..a3bde303 100644 --- a/source/funkin/backend/assets/ZipFolderLibrary.hx +++ b/source/funkin/backend/assets/ZipFolderLibrary.hx @@ -1,7 +1,6 @@ package funkin.backend.assets; import lime.utils.Log; -import lime.utils.AssetLibrary; import lime.utils.AssetManifest; import haxe.io.Path; @@ -15,6 +14,7 @@ import lime.utils.AssetType; import lime.utils.Bytes; import lime.utils.Assets as LimeAssets; import openfl.text.Font as OpenFLFont; +import openfl.utils.AssetLibrary; #if MOD_SUPPORT @@ -26,7 +26,7 @@ import funkin.backend.utils.SysZip; import funkin.backend.utils.SysZip.SysZipEntry; class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary { - public var zipPath:String; + public var basePath:String; public var modName:String; public var libName:String; public var useImageCache:Bool = false; @@ -35,16 +35,17 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary { public var zip:SysZip; public var assets:Map = []; - public function new(zipPath:String, libName:String, ?modName:String) { - this.zipPath = zipPath; + public function new(basePath:String, libName:String, ?modName:String) { this.libName = libName; + this.basePath = basePath; + if(modName == null) this.modName = libName; else this.modName = modName; - zip = SysZip.openFromFile(zipPath); + zip = SysZip.openFromFile(basePath); zip.read(); for(entry in zip.entries) assets[entry.fileName.toLowerCase()] = entry; @@ -52,6 +53,10 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary { super(); } + function toString():String { + return '(ZipFolderLibrary: $libName/$modName)'; + } + public var _parsedAsset:String; public override function getAudioBuffer(id:String):AudioBuffer { @@ -110,8 +115,8 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary { } private function getAssetPath() { - trace('[ZIP]$zipPath/$_parsedAsset'); - return '[ZIP]$zipPath/$_parsedAsset'; + trace('[ZIP]$basePath/$_parsedAsset'); + return '[ZIP]$basePath/$_parsedAsset'; } public function getFiles(folder:String):Array { @@ -150,5 +155,15 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary { } return content; } + + // Backwards compat + + @:noCompletion public var zipPath(get, set):String; + @:noCompletion private inline function get_zipPath():String { + return basePath; + } + @:noCompletion private inline function set_zipPath(value:String):String { + return basePath = value; + } } #end \ No newline at end of file diff --git a/source/funkin/backend/utils/TranslationsUtil.hx b/source/funkin/backend/utils/TranslationsUtil.hx index 181bc189..5946ed63 100644 --- a/source/funkin/backend/utils/TranslationsUtil.hx +++ b/source/funkin/backend/utils/TranslationsUtil.hx @@ -1,5 +1,9 @@ package funkin.backend.utils; +import funkin.backend.assets.ModsFolderLibrary; +import funkin.backend.assets.ModsFolder; +import funkin.backend.assets.IModsAssetLibrary; +import funkin.backend.assets.ZipFolderLibrary; import openfl.utils.Assets; import haxe.io.Path; import haxe.xml.Access; @@ -15,7 +19,7 @@ class TranslationsUtil /** * The current language selected translation map; If the current language it's english, this map will be empty. * - * Using this class function it'll never be `null`. + * It'll never be `null`. */ public static var transMap(default, set):Map = []; @@ -58,25 +62,37 @@ class TranslationsUtil * Updates the language. * Also changes the translations map. * - * If `name` is `null`, its gonne reload current language. + * If `name` is `null`, its gonna use the current language. * If `name` is not `null`, it will load the translations for the given language. */ - public static function setLanguage(?name:String) - transMap = loadLanguage(name == null ? curLanguage : name); + public static function setLanguage(?name:String) { + if(name == null) name = curLanguage; + transMap = loadLanguage(name); + + for(mod in ModsFolder.getLoadedModsLibs()) { + if(!(mod is IModsAssetLibrary) || mod is ZipFolderLibrary) continue; // TODO: add support for zipped mods + // TODO: clean this code + var _mod = cast(mod, openfl.utils.AssetLibrary); + var mod = cast(mod, IModsAssetLibrary); + var mainPath = mod.basePath; + if(!mainPath.endsWith('/')) mainPath += '/'; + trace("Set sub library to " + mainPath + Paths.translFolderName + "/" + name + "/assets/"); + _mod.subLibraries = [ModsFolder.loadLibraryFromFolder(name, '$mainPath${Paths.translFolderName}/$name/assets/', true)]; + } + } /** * This is for checking and getting a translation, `defString` it's just the string that gets returned just in case it won't find the translation OR the current language selected is ``DEFAULT_LANGUAGE``. * * If `id` is `null` then it's gonna search using `defString`. */ - public static function get(defString:String, ?id:String, ?parms:Array):String + public static function get(defString:String, ?id:String, ?params:Array):String { - if (parms == null) parms = []; #if TRANSLATIONS_SUPPORT if (id == null) id = defString; - if (transMap.exists(id)) return transMap.get(id).format(parms); + if (transMap.exists(id)) return transMap.get(id).format(params); #end - return FormatUtil.get(defString).format(parms); + return FormatUtil.get(defString).format(params); } /** @@ -87,8 +103,10 @@ class TranslationsUtil var languages:Array = []; #if TRANSLATIONS_SUPPORT var main:String = Paths.translationsMain(''); - for (l in Paths.assetsTree.getFolders(main)) for (f in Paths.assetsTree.getFiles(main + l)) - if (Path.extension('$l/$f') == "xml") languages.push(Path.withoutExtension('$l/$f')); + for (l in Paths.assetsTree.getFolders(main)) + for (f in Paths.assetsTree.getFiles(main + l)) + if (Path.extension('$l/$f') == "xml") + languages.push(Path.withoutExtension('$l/$f')); #end return languages; } @@ -172,7 +190,7 @@ class StrFormatInfo implements IFormatInfo { this.string = str; } - public function format(values:Array):String { + public function format(params:Array):String { return string; } } @@ -211,12 +229,14 @@ class ParamFormatInfo implements IFormatInfo { return fi.indexes.length > 0 ? fi : null; } - public function format(values:Array):String { + public function format(params:Array):String { + if (params == null) params = []; + var str:String = ""; for (i=>s in strings) { str += s; if (i < indexes.length) - str += values[indexes[i]]; + str += params[indexes[i]]; } return str; @@ -224,5 +244,5 @@ class ParamFormatInfo implements IFormatInfo { } interface IFormatInfo { - public function format(values:Array):String; + public function format(params:Array):String; } \ No newline at end of file diff --git a/source/openfl/utils/AssetLibrary.hx b/source/openfl/utils/AssetLibrary.hx index 64d924d1..e6022182 100644 --- a/source/openfl/utils/AssetLibrary.hx +++ b/source/openfl/utils/AssetLibrary.hx @@ -50,7 +50,11 @@ class AssetLibrary #if lime extends LimeAssetLibrary #end } else { - for(lib in subLibraries) if(lib != null && lib.exists(id, type)) return true; + for(lib in subLibraries) { + trace(lib, id, type); + if(lib != null && lib.exists(id, type)) return true; + } + trace(this, id, type); return super.exists(id, type); } } @@ -301,7 +305,7 @@ class AssetLibrary #if lime extends LimeAssetLibrary #end else { // TODO: Make this work by using multiple Futures - for(lib in subLibraries) if(lib != null) return lib.load(); + for(lib in subLibraries) if(lib != null) lib.load(); return super.load(); } }