Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion source/funkin/backend/assets/ModsFolder.hx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package funkin.backend.assets;

import flixel.util.FlxSignal.FlxTypedSignal;
import funkin.backend.system.MainState;
import funkin.backend.utils.CoolUtil;
import haxe.ds.StringMap;
import haxe.io.Path;
import lime.text.Font;
import openfl.text.Font as OpenFLFont;
Expand Down Expand Up @@ -42,6 +44,8 @@ class ModsFolder {
* Whenever its the first time mods has been reloaded.
*/
private static var __firstTime:Bool = true;

private static var modsListSortCache:StringMap<Array<String>> = new StringMap();

/**
* Initializes `mods` folder.
Expand Down Expand Up @@ -94,7 +98,7 @@ class ModsFolder {
#end
}

public static function getModsList():Array<String> {
public static function getModsList(?sortingOptions:ModSortingOptions):Array<String> {
var mods:Array<String> = [];
#if MOD_SUPPORT
// Mods directory does not exist yet, create it
Expand All @@ -108,6 +112,33 @@ class ModsFolder {
if (FileSystem.isDirectory(modsPath + modFolder)) mods.push(modFolder);
else if (Flags.ALLOWED_ZIP_EXTENSIONS.contains(Path.extension(modFolder))) mods.push(Path.withoutExtension(modFolder));
}

if (sortingOptions != null) {
var sortForge:StringBuf = new StringBuf();
for (i in mods) {
sortForge.add(i);
sortForge.add("::");
}

sortForge.add(Std.string(sortingOptions.descending ? 1 : 0));

sortForge.add(sortingOptions.mode);

final sortForgePure:String = sortForge.toString();
final sortForgeHashed:String = haxe.crypto.Sha256.encode(sortForgePure);

if (modsListSortCache.exists(sortForgeHashed))
mods = modsListSortCache.get(sortForgeHashed);
if (mods.length > 0 && mods[mods.length - 1] == null) mods.pop();
else {
ModSortingController.sort(sortingOptions, mods);
Logs.traceColored([
Logs.logText("Caching mod sort forge: "),
Logs.logText(sortForgePure, GREEN)
], VERBOSE);
modsListSortCache.set(sortForgeHashed, mods);
}
}
#end
return mods;
}
Expand Down Expand Up @@ -167,3 +198,48 @@ class ModsFolder {
}
#end
}

/**
* Describes how mods should be sorted when getting the mods list.
*/
typedef ModSortingOptions = {
/**
* Whether or not the list should go in descending order (e.g. `[2, 1, 0]`).
*/
var descending:Bool;
/**
* The sorting mode to use.
*/
var mode:ModSortingMode;
}

/**
* This class performs the actual sorting for the mods list.
*/
class ModSortingController {
/**
* Sort the mods list, according to the provided sorting options.
*/
public static function sort(sortingOptions:ModSortingOptions, list:Array<String>):Void {
switch (sortingOptions.mode) {
case ModSortingMode.CLEAN: {}
case ModSortingMode.ALPHABETICAL: CoolUtil.sortAlphabetically(list);
}
if (sortingOptions.descending) list.reverse();
}
}

/**
* The mods list can be sorted in all of the ways provided by this enum.
*/
enum abstract ModSortingMode(String) {
/**
* Use the original list received from reading the directory. This may depend
* on the current platform, but remains for legacy purposes.
*/
var CLEAN;
/**
* The list should be in alphabetical order.
*/
var ALPHABETICAL;
}
5 changes: 4 additions & 1 deletion source/funkin/menus/ModSwitchMenu.hx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ class ModSwitchMenu extends MusicBeatSubstate {
bg.alpha = 0;
FlxTween.tween(bg, {alpha: 0.5}, 0.25, {ease: FlxEase.cubeOut});

mods = ModsFolder.getModsList();
mods = ModsFolder.getModsList({
descending: false,
mode: CLEAN,
});
mods.push(null);

alphabets = new FlxTypedGroup<Alphabet>();
Expand Down