you know the fuck what
still a wip Co-Authored-By: Ne_Eo <NeeEoo@users.noreply.github.com>
This commit is contained in:
@@ -25,6 +25,7 @@ interface IModsAssetLibrary {
|
|||||||
public var prefix:String;
|
public var prefix:String;
|
||||||
public var modName:String;
|
public var modName:String;
|
||||||
public var libName:String;
|
public var libName:String;
|
||||||
|
public var basePath:String;
|
||||||
|
|
||||||
#if MOD_SUPPORT
|
#if MOD_SUPPORT
|
||||||
public var _parsedAsset:String;
|
public var _parsedAsset:String;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class ModsFolder {
|
|||||||
#end
|
#end
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
public static function getLoadedMods():Array<String> {
|
public static function getLoadedModsLibs():Array<IModsAssetLibrary> {
|
||||||
var libs = [];
|
var libs = [];
|
||||||
for (i in Paths.assetsTree.libraries) {
|
for (i in Paths.assetsTree.libraries) {
|
||||||
var l = i;
|
var l = i;
|
||||||
@@ -117,13 +117,13 @@ class ModsFolder {
|
|||||||
@:privateAccess
|
@:privateAccess
|
||||||
if (al.__proxy != null) l = al.__proxy;
|
if (al.__proxy != null) l = al.__proxy;
|
||||||
}
|
}
|
||||||
var libString:String;
|
if (l is ScriptedAssetLibrary || l is IModsAssetLibrary) libs.push(cast(l, IModsAssetLibrary));
|
||||||
if (l is ScriptedAssetLibrary || l is IModsAssetLibrary) libString = cast(l, IModsAssetLibrary).modName;
|
|
||||||
else continue;
|
|
||||||
libs.push(libString);
|
|
||||||
}
|
}
|
||||||
return libs;
|
return libs;
|
||||||
}
|
}
|
||||||
|
public static function getLoadedMods():Array<String>
|
||||||
|
return [for (modLib in getLoadedModsLibs()) modLib.modName];
|
||||||
|
|
||||||
public static function prepareLibrary(libName:String, force:Bool = false) {
|
public static function prepareLibrary(libName:String, force:Bool = false) {
|
||||||
var assets:AssetManifest = new AssetManifest();
|
var assets:AssetManifest = new AssetManifest();
|
||||||
assets.name = libName;
|
assets.name = libName;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package funkin.backend.assets;
|
package funkin.backend.assets;
|
||||||
|
|
||||||
import lime.utils.AssetLibrary;
|
import openfl.utils.AssetLibrary;
|
||||||
import lime.utils.Assets as LimeAssets;
|
//import lime.utils.Assets as LimeAssets;
|
||||||
|
|
||||||
import lime.media.AudioBuffer;
|
import lime.media.AudioBuffer;
|
||||||
import lime.graphics.Image;
|
import lime.graphics.Image;
|
||||||
@@ -16,14 +16,14 @@ import sys.FileSystem;
|
|||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
||||||
public var folderPath:String;
|
public var basePath:String;
|
||||||
public var modName:String;
|
public var modName:String;
|
||||||
public var libName:String;
|
public var libName:String;
|
||||||
public var useImageCache:Bool = true;
|
public var useImageCache:Bool = true;
|
||||||
public var prefix = 'assets/';
|
public var prefix = 'assets/';
|
||||||
|
|
||||||
public function new(folderPath:String, libName:String, ?modName:String) {
|
public function new(basePath:String, libName:String, ?modName:String) {
|
||||||
this.folderPath = folderPath;
|
this.basePath = basePath;
|
||||||
this.libName = libName;
|
this.libName = libName;
|
||||||
this.prefix = 'assets/$libName/';
|
this.prefix = 'assets/$libName/';
|
||||||
if(modName == null)
|
if(modName == null)
|
||||||
@@ -33,6 +33,10 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toString():String {
|
||||||
|
return '(ModsFolderLibrary: $libName/$modName)';
|
||||||
|
}
|
||||||
|
|
||||||
#if MOD_SUPPORT
|
#if MOD_SUPPORT
|
||||||
private var editedTimes:Map<String, Float> = [];
|
private var editedTimes:Map<String, Float> = [];
|
||||||
public var _parsedAsset:String = null;
|
public var _parsedAsset:String = null;
|
||||||
@@ -111,7 +115,7 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function getAssetPath() {
|
private function getAssetPath() {
|
||||||
return '$folderPath/$_parsedAsset';
|
return '$basePath/$_parsedAsset';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function __isCacheValid(cache:Map<String, Dynamic>, asset:String, isLocalCache:Bool = false) {
|
private function __isCacheValid(cache:Map<String, Dynamic>, asset:String, isLocalCache:Bool = false) {
|
||||||
@@ -150,4 +154,14 @@ class ModsFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#end
|
#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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -23,6 +23,8 @@ class Paths
|
|||||||
*/
|
*/
|
||||||
inline public static final SOUND_EXT = #if web "mp3" #else "ogg" #end;
|
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 assetsTree:AssetsLibraryList;
|
||||||
|
|
||||||
public static var tempFramesCache:Map<String, FlxFramesCollection> = [];
|
public static var tempFramesCache:Map<String, FlxFramesCollection> = [];
|
||||||
@@ -37,7 +39,7 @@ class Paths
|
|||||||
return library != null ? '$library:assets/$library/$file' : 'assets/$file';
|
return library != null ? '$library:assets/$library/$file' : 'assets/$file';
|
||||||
|
|
||||||
public static inline function translationsMain(key:String)
|
public static inline function translationsMain(key:String)
|
||||||
return getPath('translations/$key');
|
return getPath('$translFolderName/$key');
|
||||||
|
|
||||||
public static inline function translations(key:String)
|
public static inline function translations(key:String)
|
||||||
return translationsMain('${TranslationsUtil.curLanguage}/$key');
|
return translationsMain('${TranslationsUtil.curLanguage}/$key');
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ class ScriptedAssetLibrary extends ModsFolderLibrary {
|
|||||||
public var scriptName:String;
|
public var scriptName:String;
|
||||||
private static var nullValue:Dynamic = {};
|
private static var nullValue:Dynamic = {};
|
||||||
|
|
||||||
public function new(scriptName:String, args:Array<Dynamic> = null, folderPath:String="./assets/", libName:String="assets", ?modName:String) {
|
public function new(scriptName:String, args:Array<Dynamic> = null, basePath:String="./assets/", libName:String="assets", ?modName:String) {
|
||||||
if(modName == null) modName = scriptName;
|
if(modName == null) modName = scriptName;
|
||||||
super(folderPath, libName, modName);
|
super(basePath, libName, modName);
|
||||||
this.scriptName = scriptName;
|
this.scriptName = scriptName;
|
||||||
script = Script.create(Paths.script("data/library/" + scriptName));
|
script = Script.create(Paths.script("data/library/" + scriptName));
|
||||||
script.setParent(this);
|
script.setParent(this);
|
||||||
@@ -31,7 +31,10 @@ class ScriptedAssetLibrary extends ModsFolderLibrary {
|
|||||||
script.load();
|
script.load();
|
||||||
if(args == null) args = [];
|
if(args == null) args = [];
|
||||||
script.call("create", args);
|
script.call("create", args);
|
||||||
trace(script);
|
}
|
||||||
|
|
||||||
|
override function toString():String {
|
||||||
|
return '(ScriptedAssetLibrary: $libName/$modName/$scriptName)';
|
||||||
}
|
}
|
||||||
|
|
||||||
#if MOD_SUPPORT
|
#if MOD_SUPPORT
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package funkin.backend.assets;
|
package funkin.backend.assets;
|
||||||
|
|
||||||
import lime.utils.Log;
|
import lime.utils.Log;
|
||||||
import lime.utils.AssetLibrary;
|
|
||||||
import lime.utils.AssetManifest;
|
import lime.utils.AssetManifest;
|
||||||
|
|
||||||
import haxe.io.Path;
|
import haxe.io.Path;
|
||||||
@@ -15,6 +14,7 @@ import lime.utils.AssetType;
|
|||||||
import lime.utils.Bytes;
|
import lime.utils.Bytes;
|
||||||
import lime.utils.Assets as LimeAssets;
|
import lime.utils.Assets as LimeAssets;
|
||||||
import openfl.text.Font as OpenFLFont;
|
import openfl.text.Font as OpenFLFont;
|
||||||
|
import openfl.utils.AssetLibrary;
|
||||||
|
|
||||||
|
|
||||||
#if MOD_SUPPORT
|
#if MOD_SUPPORT
|
||||||
@@ -26,7 +26,7 @@ import funkin.backend.utils.SysZip;
|
|||||||
import funkin.backend.utils.SysZip.SysZipEntry;
|
import funkin.backend.utils.SysZip.SysZipEntry;
|
||||||
|
|
||||||
class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
||||||
public var zipPath:String;
|
public var basePath:String;
|
||||||
public var modName:String;
|
public var modName:String;
|
||||||
public var libName:String;
|
public var libName:String;
|
||||||
public var useImageCache:Bool = false;
|
public var useImageCache:Bool = false;
|
||||||
@@ -35,16 +35,17 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
public var zip:SysZip;
|
public var zip:SysZip;
|
||||||
public var assets:Map<String, SysZipEntry> = [];
|
public var assets:Map<String, SysZipEntry> = [];
|
||||||
|
|
||||||
public function new(zipPath:String, libName:String, ?modName:String) {
|
public function new(basePath:String, libName:String, ?modName:String) {
|
||||||
this.zipPath = zipPath;
|
|
||||||
this.libName = libName;
|
this.libName = libName;
|
||||||
|
|
||||||
|
this.basePath = basePath;
|
||||||
|
|
||||||
if(modName == null)
|
if(modName == null)
|
||||||
this.modName = libName;
|
this.modName = libName;
|
||||||
else
|
else
|
||||||
this.modName = modName;
|
this.modName = modName;
|
||||||
|
|
||||||
zip = SysZip.openFromFile(zipPath);
|
zip = SysZip.openFromFile(basePath);
|
||||||
zip.read();
|
zip.read();
|
||||||
for(entry in zip.entries)
|
for(entry in zip.entries)
|
||||||
assets[entry.fileName.toLowerCase()] = entry;
|
assets[entry.fileName.toLowerCase()] = entry;
|
||||||
@@ -52,6 +53,10 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toString():String {
|
||||||
|
return '(ZipFolderLibrary: $libName/$modName)';
|
||||||
|
}
|
||||||
|
|
||||||
public var _parsedAsset:String;
|
public var _parsedAsset:String;
|
||||||
|
|
||||||
public override function getAudioBuffer(id:String):AudioBuffer {
|
public override function getAudioBuffer(id:String):AudioBuffer {
|
||||||
@@ -110,8 +115,8 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function getAssetPath() {
|
private function getAssetPath() {
|
||||||
trace('[ZIP]$zipPath/$_parsedAsset');
|
trace('[ZIP]$basePath/$_parsedAsset');
|
||||||
return '[ZIP]$zipPath/$_parsedAsset';
|
return '[ZIP]$basePath/$_parsedAsset';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFiles(folder:String):Array<String> {
|
public function getFiles(folder:String):Array<String> {
|
||||||
@@ -150,5 +155,15 @@ class ZipFolderLibrary extends AssetLibrary implements IModsAssetLibrary {
|
|||||||
}
|
}
|
||||||
return content;
|
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
|
#end
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
package funkin.backend.utils;
|
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 openfl.utils.Assets;
|
||||||
import haxe.io.Path;
|
import haxe.io.Path;
|
||||||
import haxe.xml.Access;
|
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.
|
* 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<String, IFormatInfo> = [];
|
public static var transMap(default, set):Map<String, IFormatInfo> = [];
|
||||||
|
|
||||||
@@ -58,25 +62,37 @@ class TranslationsUtil
|
|||||||
* Updates the language.
|
* Updates the language.
|
||||||
* Also changes the translations map.
|
* 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.
|
* If `name` is not `null`, it will load the translations for the given language.
|
||||||
*/
|
*/
|
||||||
public static function setLanguage(?name:String)
|
public static function setLanguage(?name:String) {
|
||||||
transMap = loadLanguage(name == null ? curLanguage : name);
|
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``.
|
* 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`.
|
* If `id` is `null` then it's gonna search using `defString`.
|
||||||
*/
|
*/
|
||||||
public static function get(defString:String, ?id:String, ?parms:Array<Dynamic>):String
|
public static function get(defString:String, ?id:String, ?params:Array<Dynamic>):String
|
||||||
{
|
{
|
||||||
if (parms == null) parms = [];
|
|
||||||
#if TRANSLATIONS_SUPPORT
|
#if TRANSLATIONS_SUPPORT
|
||||||
if (id == null) id = defString;
|
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
|
#end
|
||||||
return FormatUtil.get(defString).format(parms);
|
return FormatUtil.get(defString).format(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -87,8 +103,10 @@ class TranslationsUtil
|
|||||||
var languages:Array<String> = [];
|
var languages:Array<String> = [];
|
||||||
#if TRANSLATIONS_SUPPORT
|
#if TRANSLATIONS_SUPPORT
|
||||||
var main:String = Paths.translationsMain('');
|
var main:String = Paths.translationsMain('');
|
||||||
for (l in Paths.assetsTree.getFolders(main)) for (f in Paths.assetsTree.getFiles(main + l))
|
for (l in Paths.assetsTree.getFolders(main))
|
||||||
if (Path.extension('$l/$f') == "xml") languages.push(Path.withoutExtension('$l/$f'));
|
for (f in Paths.assetsTree.getFiles(main + l))
|
||||||
|
if (Path.extension('$l/$f') == "xml")
|
||||||
|
languages.push(Path.withoutExtension('$l/$f'));
|
||||||
#end
|
#end
|
||||||
return languages;
|
return languages;
|
||||||
}
|
}
|
||||||
@@ -172,7 +190,7 @@ class StrFormatInfo implements IFormatInfo {
|
|||||||
this.string = str;
|
this.string = str;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function format(values:Array<Dynamic>):String {
|
public function format(params:Array<Dynamic>):String {
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,12 +229,14 @@ class ParamFormatInfo implements IFormatInfo {
|
|||||||
return fi.indexes.length > 0 ? fi : null;
|
return fi.indexes.length > 0 ? fi : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function format(values:Array<Dynamic>):String {
|
public function format(params:Array<Dynamic>):String {
|
||||||
|
if (params == null) params = [];
|
||||||
|
|
||||||
var str:String = "";
|
var str:String = "";
|
||||||
for (i=>s in strings) {
|
for (i=>s in strings) {
|
||||||
str += s;
|
str += s;
|
||||||
if (i < indexes.length)
|
if (i < indexes.length)
|
||||||
str += values[indexes[i]];
|
str += params[indexes[i]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
@@ -224,5 +244,5 @@ class ParamFormatInfo implements IFormatInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface IFormatInfo {
|
interface IFormatInfo {
|
||||||
public function format(values:Array<Dynamic>):String;
|
public function format(params:Array<Dynamic>):String;
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,11 @@ class AssetLibrary #if lime extends LimeAssetLibrary #end
|
|||||||
}
|
}
|
||||||
else
|
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);
|
return super.exists(id, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -301,7 +305,7 @@ class AssetLibrary #if lime extends LimeAssetLibrary #end
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: Make this work by using multiple Futures
|
// 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();
|
return super.load();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user