Tobee_Night_Funkin_PSYCH/source/Paths.hx

368 lines
10 KiB
Haxe

package;
import flixel.FlxG;
import flixel.graphics.frames.FlxAtlasFrames;
import openfl.utils.AssetType;
import openfl.utils.Assets as OpenFlAssets;
import lime.utils.Assets;
import flixel.FlxSprite;
#if MODS_ALLOWED
import sys.io.File;
import sys.FileSystem;
import flixel.graphics.FlxGraphic;
import openfl.display.BitmapData;
#end
import flash.media.Sound;
using StringTools;
class Paths
{
inline public static var SOUND_EXT = #if web "mp3" #else "ogg" #end;
inline public static var VIDEO_EXT = "mp4";
#if MODS_ALLOWED
#if (haxe >= "4.0.0")
public static var ignoreModFolders:Map<String, Bool> = new Map();
public static var customImagesLoaded:Map<String, Bool> = new Map();
public static var customSoundsLoaded:Map<String, Sound> = new Map();
#else
public static var ignoreModFolders:Map<String, Bool> = new Map<String, Bool>();
public static var customImagesLoaded:Map<String, Bool> = new Map<String, Bool>();
public static var customSoundsLoaded:Map<String, Sound> = new Map<String, Sound>();
#end
#end
public static function destroyLoadedImages(ignoreCheck:Bool = false) {
#if MODS_ALLOWED
if(!ignoreCheck && ClientPrefs.imagesPersist) return; //If there's 20+ images loaded, do a cleanup just for preventing a crash
for (key in customImagesLoaded.keys()) {
var graphic:FlxGraphic = FlxG.bitmap.get(key);
if(graphic != null) {
graphic.bitmap.dispose();
graphic.destroy();
FlxG.bitmap.removeByKey(key);
}
}
Paths.customImagesLoaded.clear();
#end
}
static public var currentModDirectory:String = null;
static var currentLevel:String;
static public function getModFolders()
{
#if MODS_ALLOWED
ignoreModFolders.set('characters', true);
ignoreModFolders.set('custom_events', true);
ignoreModFolders.set('custom_notetypes', true);
ignoreModFolders.set('data', true);
ignoreModFolders.set('songs', true);
ignoreModFolders.set('music', true);
ignoreModFolders.set('sounds', true);
ignoreModFolders.set('videos', true);
ignoreModFolders.set('images', true);
ignoreModFolders.set('stages', true);
ignoreModFolders.set('weeks', true);
#end
}
static public function setCurrentLevel(name:String)
{
currentLevel = name.toLowerCase();
}
public static function getPath(file:String, type:AssetType, ?library:Null<String> = null)
{
if (library != null)
return getLibraryPath(file, library);
if (currentLevel != null)
{
var levelPath:String = '';
if(currentLevel != 'shared') {
levelPath = getLibraryPathForce(file, currentLevel);
if (OpenFlAssets.exists(levelPath, type))
return levelPath;
}
levelPath = getLibraryPathForce(file, "shared");
if (OpenFlAssets.exists(levelPath, type))
return levelPath;
}
return getPreloadPath(file);
}
static public function getLibraryPath(file:String, library = "preload")
{
return if (library == "preload" || library == "default") getPreloadPath(file); else getLibraryPathForce(file, library);
}
inline static function getLibraryPathForce(file:String, library:String)
{
return '$library:assets/$library/$file';
}
inline public static function getPreloadPath(file:String = '')
{
return 'assets/$file';
}
inline static public function file(file:String, type:AssetType = TEXT, ?library:String)
{
return getPath(file, type, library);
}
inline static public function txt(key:String, ?library:String)
{
return getPath('data/$key.txt', TEXT, library);
}
inline static public function xml(key:String, ?library:String)
{
return getPath('data/$key.xml', TEXT, library);
}
inline static public function json(key:String, ?library:String)
{
return getPath('data/$key.json', TEXT, library);
}
inline static public function lua(key:String, ?library:String)
{
return getPath('$key.lua', TEXT, library);
}
static public function video(key:String)
{
#if MODS_ALLOWED
var file:String = modsVideo(key);
if(FileSystem.exists(file)) {
return file;
}
#end
return 'assets/videos/$key.$VIDEO_EXT';
}
static public function sound(key:String, ?library:String):Dynamic
{
#if MODS_ALLOWED
var file:String = modsSounds(key);
if(FileSystem.exists(file)) {
if(!customSoundsLoaded.exists(file)) {
customSoundsLoaded.set(file, Sound.fromFile(file));
}
return customSoundsLoaded.get(file);
}
#end
return getPath('sounds/$key.$SOUND_EXT', SOUND, library);
}
inline static public function soundRandom(key:String, min:Int, max:Int, ?library:String)
{
return sound(key + FlxG.random.int(min, max), library);
}
inline static public function music(key:String, ?library:String):Dynamic
{
#if MODS_ALLOWED
var file:String = modsMusic(key);
if(FileSystem.exists(file)) {
if(!customSoundsLoaded.exists(file)) {
customSoundsLoaded.set(file, Sound.fromFile(file));
}
return customSoundsLoaded.get(file);
}
#end
return getPath('music/$key.$SOUND_EXT', MUSIC, library);
}
inline static public function voices(song:String):Any
{
#if MODS_ALLOWED
var file:Sound = returnSongFile(modsSongs(song.toLowerCase().replace(' ', '-') + '/Voices'));
if(file != null) {
return file;
}
#end
return 'songs:assets/songs/${song.toLowerCase().replace(' ', '-')}/Voices.$SOUND_EXT';
}
inline static public function inst(song:String):Any
{
#if MODS_ALLOWED
var file:Sound = returnSongFile(modsSongs(song.toLowerCase().replace(' ', '-') + '/Inst'));
if(file != null) {
return file;
}
#end
return 'songs:assets/songs/${song.toLowerCase().replace(' ', '-')}/Inst.$SOUND_EXT';
}
#if MODS_ALLOWED
inline static private function returnSongFile(file:String):Sound
{
if(FileSystem.exists(file)) {
if(!customSoundsLoaded.exists(file)) {
customSoundsLoaded.set(file, Sound.fromFile(file));
}
return customSoundsLoaded.get(file);
}
return null;
}
#end
inline static public function image(key:String, ?library:String):Dynamic
{
#if MODS_ALLOWED
var imageToReturn:FlxGraphic = addCustomGraphic(key);
if(imageToReturn != null) return imageToReturn;
#end
return getPath('images/$key.png', IMAGE, library);
}
static public function getTextFromFile(key:String, ?ignoreMods:Bool = false):String
{
#if sys
if (!ignoreMods && FileSystem.exists(mods(key)))
return File.getContent(mods(key));
if (FileSystem.exists(getPreloadPath(key)))
return File.getContent(getPreloadPath(key));
if (currentLevel != null)
{
var levelPath:String = '';
if(currentLevel != 'shared') {
levelPath = getLibraryPathForce(key, currentLevel);
if (FileSystem.exists(levelPath))
return File.getContent(levelPath);
}
levelPath = getLibraryPathForce(key, 'shared');
if (FileSystem.exists(levelPath))
return File.getContent(levelPath);
}
#end
return Assets.getText(getPath(key, TEXT));
}
inline static public function font(key:String)
{
return 'assets/fonts/$key';
}
inline static public function fileExists(key:String, type:AssetType, ?ignoreMods:Bool = false, ?library:String)
{
#if MODS_ALLOWED
if(FileSystem.exists(mods(currentModDirectory + '/' + key)) || FileSystem.exists(mods(key))) {
return true;
}
#end
if(OpenFlAssets.exists(Paths.getPath(key, type))) {
return true;
}
return false;
}
inline static public function getSparrowAtlas(key:String, ?library:String)
{
#if MODS_ALLOWED
var imageLoaded:FlxGraphic = addCustomGraphic(key);
var xmlExists:Bool = false;
if(FileSystem.exists(modsXml(key))) {
xmlExists = true;
}
return FlxAtlasFrames.fromSparrow((imageLoaded != null ? imageLoaded : image(key, library)), (xmlExists ? File.getContent(modsXml(key)) : file('images/$key.xml', library)));
#else
return FlxAtlasFrames.fromSparrow(image(key, library), file('images/$key.xml', library));
#end
}
inline static public function getPackerAtlas(key:String, ?library:String)
{
#if MODS_ALLOWED
var imageLoaded:FlxGraphic = addCustomGraphic(key);
var txtExists:Bool = false;
if(FileSystem.exists(modsTxt(key))) {
txtExists = true;
}
return FlxAtlasFrames.fromSpriteSheetPacker((imageLoaded != null ? imageLoaded : image(key, library)), (txtExists ? File.getContent(modsTxt(key)) : file('images/$key.txt', library)));
#else
return FlxAtlasFrames.fromSpriteSheetPacker(image(key, library), file('images/$key.txt', library));
#end
}
inline static public function formatToSongPath(path:String) {
return path.toLowerCase().replace(' ', '-');
}
#if MODS_ALLOWED
static public function addCustomGraphic(key:String):FlxGraphic {
if(FileSystem.exists(modsImages(key))) {
if(!customImagesLoaded.exists(key)) {
var newBitmap:BitmapData = BitmapData.fromFile(modsImages(key));
var newGraphic:FlxGraphic = FlxGraphic.fromBitmapData(newBitmap, false, key);
newGraphic.persist = true;
FlxG.bitmap.addGraphic(newGraphic);
customImagesLoaded.set(key, true);
}
return FlxG.bitmap.get(key);
}
return null;
}
inline static public function mods(key:String = '') {
return 'mods/' + key;
}
inline static public function modsJson(key:String) {
return modFolders('data/' + key + '.json');
}
inline static public function modsVideo(key:String) {
return modFolders('videos/' + key + '.' + VIDEO_EXT);
}
inline static public function modsMusic(key:String) {
return modFolders('music/' + key + '.' + SOUND_EXT);
}
inline static public function modsSounds(key:String) {
return modFolders('sounds/' + key + '.' + SOUND_EXT);
}
inline static public function modsSongs(key:String) {
return modFolders('songs/' + key + '.' + SOUND_EXT);
}
inline static public function modsImages(key:String) {
return modFolders('images/' + key + '.png');
}
inline static public function modsXml(key:String) {
return modFolders('images/' + key + '.xml');
}
inline static public function modsTxt(key:String) {
return modFolders('images/' + key + '.txt');
}
static public function modFolders(key:String) {
if(currentModDirectory != null && currentModDirectory.length > 0) {
var fileToCheck:String = mods(currentModDirectory + '/' + key);
if(FileSystem.exists(fileToCheck)) {
return fileToCheck;
}
}
return 'mods/' + key;
}
#end
}