LET THERE BE `STATE REDIRECTS`!!!!!!!!!!!!!!!!!!!!!!!!!!!!

This commit is contained in:
Frakits
2025-08-02 14:20:46 +03:00
parent 267d8104ec
commit 341454b01e
15 changed files with 124 additions and 92 deletions
-25
View File
@@ -1,25 +0,0 @@
[Common]
Name="baconeggandcheese"
Description="who gaf"
APIVersion="uhmmmm probs like 2"
DownloadedFrom="https://yourmom.org"
Dependencies=[
"linkA",
"linkB",
"linkC"
]
Icon64="path/to/icon64.png"
Icon32="path/to/icon32.png"
Icon16="path/to/icon16.png"
Icon="path/to/icon.ico"
[Flags]
UseNoteRendererV2=false
UseAway3D=false
UseDiscordRPCIntegration=true
UseLocalization=false
UseLegacyFlixelAnimateHitbox=false
[Discord]
ClientID="1027994136193810442",
LogoKey="icon"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+70 -34
View File
@@ -35,7 +35,7 @@ class Flags {
public static var MOD_DISCORD_LOGO_KEY:String = "";
public static var MOD_DISCORD_LOGO_TEXT:String = "";
public static var MOD_REDIRECT_STATES:Map<String, String> = [];
@:bypass public static var MOD_REDIRECT_STATES:Map<String, String> = [];
// -- Codename's Default Flags --
public static var CURRENT_API_VERSION:Int = 1;
public static var COMMIT_NUMBER:Int = GitCommitMacro.commitNumber;
@@ -125,9 +125,6 @@ class Flags {
@:also(funkin.game.Character.FALLBACK_DEAD_CHARACTER)
public static var DEFAULT_GAMEOVER_CHARACTER:String = "bf-dead";
public static var DEFAULT_GAMEOVER_SONG:String = "gameOver";
public static var DEFAULT_GAMEOVER_LOSS_SFX:String = "gameOverSFX";
public static var DEFAULT_GAMEOVER_RETRY_SFX:String = "gameOverEnd";
public static var DEFAULT_CAM_ZOOM_INTERVAL:Int = 1;
public static var DEFAULT_CAM_ZOOM_OFFSET:Float = 0;
@@ -160,6 +157,11 @@ class Flags {
public static var ICON_OFFSET:Float = 26;
public static var ICON_LERP:Float = 0.33;
public static var DEFAULT_PREPARE_SPRITE:String = null;
public static var DEFAULT_READY_SPRITE:String = 'game/ready';
public static var DEFAULT_SET_SPRITE:String = 'game/set';
public static var DEFAULT_GO_SPRITE:String = 'game/go';
public static var CAM_BOP_STRENGTH:Float = 0.015;
public static var HUD_BOP_STRENGTH:Float = 0.03;
public static var DEFAULT_CAM_ZOOM_LERP:Float = 0.05;
@@ -202,36 +204,58 @@ class Flags {
public static var URL_FNF_ITCH:String = "https://ninja-muffin24.itch.io/funkin";
/**
* Default editor sound paths
* Default audio paths
*/
public static var DEFAULT_EDITOR_AUTOSAVE_SOUND = "editors/autosave";
public static var DEFAULT_EDITOR_BUTTONCLICK_SOUND = "editors/buttonClick";
public static var DEFAULT_EDITOR_CLICK_SOUND = "editors/click";
public static var DEFAULT_EDITOR_COPY_SOUND = "editors/copy";
public static var DEFAULT_EDITOR_CUT_SOUND = "editors/cut";
public static var DEFAULT_EDITOR_DELETE_SOUND = "editors/delete";
public static var DEFAULT_EDITOR_OFFSETDRAG_SOUND = "editors/offsetDrag";
public static var DEFAULT_EDITOR_PASTE_SOUND = "editors/paste";
public static var DEFAULT_EDITOR_REDO_SOUND = "editors/redo";
public static var DEFAULT_EDITOR_SAVE_SOUND = "editors/save";
public static var DEFAULT_EDITOR_TEXTREMOVE_SOUND = "editors/textRemove";
public static var DEFAULT_EDITOR_TEXTTYPE_SOUND = "editors/textType";
public static var DEFAULT_EDITOR_UNDO_SOUND = "editors/undo";
public static var DEFAULT_EDITOR_WINDOWAPPEAR_SOUND = "editors/windowAppear";
public static var DEFAULT_EDITOR_WINDOWCLOSE_SOUND = "editors/windowClose";
public static var DEFAULT_EDITOR_DROPDOWNAPPEAR_SOUND = "editors/dropdownAppear";
public static var DEFAULT_CHARTER_HITSOUND_SOUND = "editors/charter/hitsound";
public static var DEFAULT_CHARTER_METRONOME_SOUND = "editors/charter/metronome";
public static var DEFAULT_CHARTER_NOTEDELETE_SOUND = "editors/charter/noteDelete";
public static var DEFAULT_CHARTER_NOTEPLACE_SOUND = "editors/charter/notePlace";
public static var DEFAULT_CHARTER_SCROLL_SOUND = "editors/charter/scroll";
public static var DEFAULT_CHARTER_SNAPPINGCHANGE_SOUND = "editors/charter/snappingChange";
public static var DEFAULT_CHARTER_STRUMLOCK_SOUND = "editors/charter/strumLock";
public static var DEFAULT_CHARTER_STRUMUNLOCK_SOUND = "editors/charter/strumUnlock";
public static var DEFAULT_CHARTER_SUSTAINADD_SOUND = "editors/charter/sustainAdd";
public static var DEFAULT_CHARTER_SUSTAINDELETE_SOUND = "editors/charter/sustainDelete";
public static var DEFAULT_CHARACTER_GHOSTDISABLE_SOUND = "editors/character/ghostDisable";
public static var DEFAULT_CHARACTER_GHOSTENABLE_SOUND = "editors/character/ghostEnable";
public static var DEFAULT_MENU_MUSIC:String = "freakyMenu";
public static var DEFAULT_PAUSE_MENU_MUSIC:String = "breakfast";
public static var DEFAULT_GAMEOVER_MUSIC:String = "gameOver";
public static var DEFAULT_MISS1_SOUND:String = "missnote1";
public static var DEFAULT_MISS2_SOUND:String = "missnote2";
public static var DEFAULT_MISS3_SOUND:String = "missnote3";
public static var DEFAULT_INTRO1_SOUND:String = "intro1";
public static var DEFAULT_INTRO2_SOUND:String = "intro2";
public static var DEFAULT_INTRO3_SOUND:String = "intro3";
public static var DEFAULT_INTROGO_SOUND:String = "introGo";
public static var DEFAULT_GAMEOVERSFX_SOUND:String = "gameOverSFX";
public static var DEFAULT_GAMEOVEREND_SOUND:String = "gameOverEnd";
public static var DEFAULT_MENU_SCROLL_SOUND:String = "menu/scroll";
public static var DEFAULT_MENU_CONFIRM_SOUND:String = "menu/confirm";
public static var DEFAULT_MENU_CANCEL_SOUND:String = "menu/cancel";
public static var DEFAULT_MENU_VOLUME_SOUND:String = "menu/volume";
public static var DEFAULT_EDITOR_CHECKBOXCHECKED_SOUND:String = "editors/checkboxChecked";
public static var DEFAULT_EDITOR_CHECKBOXUNCHECKED_SOUND:String = "editors/checkboxUnchecked";
public static var DEFAULT_EDITOR_WARNING_SOUND:String = "editors/warningMenu";
public static var DEFAULT_EDITOR_AUTOSAVE_SOUND:String = "editors/autosave";
public static var DEFAULT_EDITOR_BUTTONCLICK_SOUND:String = "editors/buttonClick";
public static var DEFAULT_EDITOR_CLICK_SOUND:String = "editors/click";
public static var DEFAULT_EDITOR_COPY_SOUND:String = "editors/copy";
public static var DEFAULT_EDITOR_CUT_SOUND:String = "editors/cut";
public static var DEFAULT_EDITOR_DELETE_SOUND:String = "editors/delete";
public static var DEFAULT_EDITOR_OFFSETDRAG_SOUND:String = "editors/offsetDrag";
public static var DEFAULT_EDITOR_PASTE_SOUND:String = "editors/paste";
public static var DEFAULT_EDITOR_REDO_SOUND:String = "editors/redo";
public static var DEFAULT_EDITOR_SAVE_SOUND:String = "editors/save";
public static var DEFAULT_EDITOR_TEXTREMOVE_SOUND:String= "editors/textRemove";
public static var DEFAULT_EDITOR_TEXTTYPE_SOUND:String = "editors/textType";
public static var DEFAULT_EDITOR_UNDO_SOUND:String = "editors/undo";
public static var DEFAULT_EDITOR_WINDOWAPPEAR_SOUND:String = "editors/windowAppear";
public static var DEFAULT_EDITOR_WINDOWCLOSE_SOUND:String = "editors/windowClose";
public static var DEFAULT_EDITOR_DROPDOWNAPPEAR_SOUND:String = "editors/dropdownAppear";
public static var DEFAULT_CHARTER_HITSOUND_SOUND:String = "editors/charter/hitsound";
public static var DEFAULT_CHARTER_METRONOME_SOUND:String = "editors/charter/metronome";
public static var DEFAULT_CHARTER_NOTEDELETE_SOUND:String = "editors/charter/noteDelete";
public static var DEFAULT_CHARTER_NOTEPLACE_SOUND:String = "editors/charter/notePlace";
public static var DEFAULT_CHARTER_SCROLL_SOUND:String = "editors/charter/scroll";
public static var DEFAULT_CHARTER_SNAPPINGCHANGE_SOUND:String = "editors/charter/snappingChange";
public static var DEFAULT_CHARTER_STRUMLOCK_SOUND:String = "editors/charter/strumLock";
public static var DEFAULT_CHARTER_STRUMUNLOCK_SOUND:String = "editors/charter/strumUnlock";
public static var DEFAULT_CHARTER_SUSTAINADD_SOUND:String = "editors/charter/sustainAdd";
public static var DEFAULT_CHARTER_SUSTAINDELETE_SOUND:String = "editors/charter/sustainDelete";
public static var DEFAULT_CHARACTER_GHOSTDISABLE_SOUND:String = "editors/character/ghostDisable";
public static var DEFAULT_CHARACTER_GHOSTENABLE_SOUND:String = "editors/character/ghostEnable";
public static var DEFAULT_GLSL_VERSION:String = "120";
@:also(funkin.backend.utils.HttpUtil.userAgent)
@@ -244,9 +268,20 @@ class Flags {
@:bypass public static var customFlags:Map<String, String> = [];
public static function loadFromData(flags:Map<String, String>, data:String) {
trace(data);
if (!(data.length > 0)) return;
var res = IniUtil.parseString(data);
for (section in res) for (key => value in section) flags[key] = value;
trace(res);
if (res.exists("Common")) for (key => value in res.get("Common")) flags["MOD_" + key] = value;
if (res.exists("Discord")) for (key => value in res.get("Discord")) flags["MOD_DISCORD_" + key] = value;
if (res.exists("Flags")) for (key => value in res.get("Flags")) flags[key] = value;
if (res.exists("StateRedirects")) for (key => value in res.get("StateRedirects"))
if (!Flags.MOD_REDIRECT_STATES.exists(key)) Flags.MOD_REDIRECT_STATES.set(key, value);
if (res.exists("StateRedirects.force")) for (key => value in res.get("StateRedirects.force"))
Flags.MOD_REDIRECT_STATES.set(key, value);
trace(flags);
}
public static function loadFromDatas(datas:Array<String>) {
@@ -290,6 +325,7 @@ class Flags {
if (l.exists(Paths.ini("config/modpack"), AssetType.TEXT))
flagsTxt = l.getAsset(Paths.ini("config/modpack"), AssetType.TEXT);
if (cast(l, IModsAssetLibrary).modName == "assets") continue;
if (cast(l, IModsAssetLibrary).modName == "source") continue;
if (cast(l, IModsAssetLibrary).modName == ModsFolder.currentModFolder) {
var flags:Map<String, String> = [];
+14
View File
@@ -135,6 +135,20 @@ class MainState extends FlxState {
}
}
FlxG.signals.preStateSwitch.add(() -> {
var stateName = Type.getClassName(Type.getClass(@:privateAccess FlxG.game._requestedState));
stateName = stateName.substring(stateName.lastIndexOf(".") + 1);
trace(stateName);
if (Flags.MOD_REDIRECT_STATES.exists(stateName)) {
trace("WE FUCKING GOT IT!");
@:privateAccess {
var classFromString = Type.resolveClass(Flags.MOD_REDIRECT_STATES.get(stateName));
if (classFromString != null) FlxG.game._requestedState = Type.createInstance(classFromString, []);
else FlxG.game._requestedState = new funkin.backend.scripting.ModState(Flags.MOD_REDIRECT_STATES.get(stateName));
}
}
});
if (!Flags.DISABLE_WARNING_SCREEN) FlxG.switchState(new funkin.menus.WarningState());
else FlxG.switchState(new TitleState());
}
+9 -9
View File
@@ -454,7 +454,7 @@ final class CoolUtil
@:noUsing public static function playMenuSong(fadeIn:Bool = false) {
if (FlxG.sound.music == null || !FlxG.sound.music.playing)
{
playMusic(Paths.music('freakyMenu'), true, fadeIn ? 0 : 1, true, 102);
playMusic(Paths.music(Flags.DEFAULT_MENU_MUSIC), true, fadeIn ? 0 : 1, true, 102);
if (fadeIn)
FlxG.sound.music.fadeIn(4, 0, 0.7);
}
@@ -520,14 +520,14 @@ final class CoolUtil
* @param volume At which volume it should play
*/
@:noUsing public static inline function playMenuSFX(menuSFX:CoolSfx = SCROLL, volume:Float = 1):FlxSound {
return FlxG.sound.play(Paths.sound('menu/' + switch(menuSFX) {
case CONFIRM: 'confirm';
case CANCEL: 'cancel';
case SCROLL: 'scroll';
case CHECKED: 'checkboxChecked';
case UNCHECKED: 'checkboxUnchecked';
case WARNING: 'warningMenu';
default: 'scroll';
return FlxG.sound.play(Paths.sound(switch(menuSFX) {
case CONFIRM: Flags.DEFAULT_MENU_CONFIRM_SOUND;
case CANCEL: Flags.DEFAULT_MENU_CANCEL_SOUND;
case SCROLL: Flags.DEFAULT_MENU_SCROLL_SOUND;
case CHECKED: Flags.DEFAULT_EDITOR_CHECKBOXCHECKED_SOUND;
case UNCHECKED: Flags.DEFAULT_EDITOR_CHECKBOXUNCHECKED_SOUND;
case WARNING: Flags.DEFAULT_EDITOR_WARNING_SOUND;
default: Flags.DEFAULT_MENU_SCROLL_SOUND;
}), volume * Options.volumeSFX);
}
+1 -1
View File
@@ -13,7 +13,7 @@ class IniUtil {
public static function parseStringToMap(map:Map<String, Map<String, String>>, data:String) {
var section:Map<String, String> = null;
var regexSec = ~/\\[(.+)\\]/g, regexVal = ~/(.+)=(.+)/g, quote = ~/[\\'"](.+)[\\'"]/g, iln = 0;
var regexSec = ~/^\[(.+)\]/g, regexVal = ~/^([^#;].+)=(.+)/g, quote = ~/[\\'"](.+)[\\'"]/g, iln = 0;
do {
var line = data.substring(iln, ((iln = data.indexOf('\n', iln) + 1) == 0 ? data.length : iln - 1));
if (regexSec.match(line)) {
+20 -13
View File
@@ -10,34 +10,41 @@ class ModConfigWarning extends UIState {
var goToState:Class<FlxState>;
public static inline var defaultModConfigText =
'[Common]
MOD_NAME="YOUR MOD NAME HERE"
MOD_DESCRIPTION="YOUR MOD DESCRIPTION HERE"
MOD_AUTHOR="YOU/YOUR TEAM HERE"
MOD_VERSION="YOUR MOD\'S VERSION HERE"
'[Common] # This section applies the \'MOD_\' prefix to the flags so you don\'t have to.
NAME="YOUR MOD NAME HERE"
DESCRIPTION="YOUR MOD DESCRIPTION HERE"
AUTHOR="YOU/YOUR TEAM HERE"
VERSION="YOUR MOD\'S VERSION HERE"
# DO NOT EDIT!! this is used to check for version compatibility!
MOD_API_VERSION=1
API_VERSION=1
MOD_DOWNLOAD_LINK="YOUR MOD PAGE LINK HERE"
DOWNLOAD_LINK="YOUR MOD PAGE LINK HERE"
# Not supported yet
;MOD_ICON64="path/to/icon64.png"
;MOD_ICON32="path/to/icon32.png"
;MOD_ICON16="path/to/icon16.png"
MOD_ICON="path/to/icon.png"
ICON="path/to/icon.png"
[Flags]
[Flags] # This section doesn\'t apply any prefix.
DISABLE_WARNING_SCREEN=true
# Set this to false if you want to bring back the warning state (prior to 1.0.0)
# NOTE: Beta warning state has been renamed from BetaWarningState.hx to WarningState.hx
DISABLE_LANGUAGES=true
# Some people might not translate their mods, but if you do then you may set this to false
[Discord]
MOD_DISCORD_CLIENT_ID=""
MOD_DISCORD_LOGO_KEY=""
MOD_DISCORD_LOGO_TEXT=""';
[Discord] # This section applies the \'MOD_DISCORD_\' prefix to the flags so you don\'t have to.
CLIENT_ID=""
LOGO_KEY=""
LOGO_TEXT=""
[StateRedirects] # This section is used for state redirecting, see examples below.
;StoryMenuState="funkin.menus.FreeplayState"
;FreeplayState="scriptedFreeplayState"
[StateRedirects.force] # Use this if you want to override redirects set by subsequent addons/mods
';
public function new(library:ModsFolderLibrary, ?goToState:Class<FlxState>) {
super();
+3 -3
View File
@@ -44,9 +44,9 @@ class GameOverSubstate extends MusicBeatSubstate
this.y = y;
this.player = player;
this.characterName = character != null ? character : Flags.DEFAULT_GAMEOVER_CHARACTER;
this.gameOverSong = gameOverSong != null ? gameOverSong : Flags.DEFAULT_GAMEOVER_SONG;
this.lossSFXName = lossSFX != null ? lossSFX : Flags.DEFAULT_GAMEOVER_LOSS_SFX;
this.retrySFX = retrySFX != null ? retrySFX : Flags.DEFAULT_GAMEOVER_RETRY_SFX;
this.gameOverSong = gameOverSong != null ? gameOverSong : Flags.DEFAULT_GAMEOVER_MUSIC;
this.lossSFXName = lossSFX != null ? lossSFX : Flags.DEFAULT_GAMEOVERSFX_SOUND;
this.retrySFX = retrySFX != null ? retrySFX : Flags.DEFAULT_GAMEOVEREND_SOUND;
}
public override function create()
+6 -6
View File
@@ -99,15 +99,15 @@ class PlayState extends MusicBeatState
/**
* Game Over Song. (assets/music/gameOver.ogg)
*/
public var gameOverSong:String = Flags.DEFAULT_GAMEOVER_SONG;
public var gameOverSong:String = Flags.DEFAULT_GAMEOVER_MUSIC;
/**
* Game Over Song. (assets/sounds/gameOverSFX.ogg)
*/
public var lossSFX:String = Flags.DEFAULT_GAMEOVER_LOSS_SFX;
public var lossSFX:String = Flags.DEFAULT_GAMEOVERSFX_SOUND;
/**
* Game Over End SFX, used when retrying. (assets/sounds/gameOverEnd.ogg)
*/
public var retrySFX:String = Flags.DEFAULT_GAMEOVER_RETRY_SFX;
public var retrySFX:String = Flags.DEFAULT_GAMEOVEREND_SOUND;
/**
* Current Stage.
@@ -461,11 +461,11 @@ class PlayState extends MusicBeatState
/**
* Array of sprites for the intro.
*/
public var introSprites:Array<String> = [null, 'game/ready', "game/set", "game/go"];
public var introSprites:Array<String> = [Flags.DEFAULT_PREPARE_SPRITE, Flags.DEFAULT_READY_SPRITE, Flags.DEFAULT_SET_SPRITE, Flags.DEFAULT_GO_SPRITE];
/**
* Array of sounds for the intro.
*/
public var introSounds:Array<String> = ['intro3', 'intro2', "intro1", "introGo"];
public var introSounds:Array<String> = [Flags.DEFAULT_INTRO1_SOUND, Flags.DEFAULT_INTRO2_SOUND, Flags.DEFAULT_INTRO3_SOUND, Flags.DEFAULT_INTROGO_SOUND];
/**
* Whenever the game is paused or not.
@@ -1765,7 +1765,7 @@ class PlayState extends MusicBeatState
var directionID:Null<Int> = note == null ? direction : note.strumID;
if (playerID == null || directionID == null || playerID == -1) return;
var event:NoteMissEvent = gameAndCharsEvent("onPlayerMiss", EventManager.get(NoteMissEvent).recycle(note, -10, 1, muteVocalsOnMiss, note != null ? -0.0475 : -0.04, Paths.soundRandom('missnote', 1, 3), FlxG.random.float(0.1, 0.2), note == null, combo > 5, "sad", true, true, "miss", strumLines.members[playerID].characters, playerID, note != null ? note.noteType : null, directionID, 0));
var event:NoteMissEvent = gameAndCharsEvent("onPlayerMiss", EventManager.get(NoteMissEvent).recycle(note, -10, 1, muteVocalsOnMiss, note != null ? -0.0475 : -0.04, Paths.sound(FlxG.random.getObject([Flags.DEFAULT_MISS1_SOUND, Flags.DEFAULT_MISS2_SOUND, Flags.DEFAULT_MISS3_SOUND])), FlxG.random.float(0.1, 0.2), note == null, combo > 5, "sad", true, true, "miss", strumLines.members[playerID].characters, playerID, note != null ? note.noteType : null, directionID, 0));
strumLine.onMiss.dispatch(event);
if (event.cancelled) return;
+1 -1
View File
@@ -60,7 +60,7 @@ class PauseSubState extends MusicBeatSubstate
pauseScript.setParent(this);
pauseScript.load();
var event = EventManager.get(PauseCreationEvent).recycle('breakfast', menuItems);
var event = EventManager.get(PauseCreationEvent).recycle(Flags.DEFAULT_PAUSE_MENU_MUSIC, menuItems);
pauseScript.call('create', [event]);
menuItems = event.options;