diff --git a/alsoft.txt b/alsoft.txt new file mode 100644 index 00000000..2f928c99 --- /dev/null +++ b/alsoft.txt @@ -0,0 +1,14 @@ +[general] +sample-type=float32 +stereo-mode=speakers +stereo-encoding=panpot +hrtf=false +cf_level=0 +resampler=fast_bsinc24 +front-stablizer=false +output-limiter=false +volume-adjust=0 +[decoder] +hq-mode=false +distance-comp=false +nfc=false \ No newline at end of file diff --git a/libs.xml b/libs.xml index 2811f7b6..891b4c69 100644 --- a/libs.xml +++ b/libs.xml @@ -25,6 +25,8 @@ + + diff --git a/project.xml b/project.xml index 068c5d71..3ddc05f6 100644 --- a/project.xml +++ b/project.xml @@ -68,6 +68,12 @@ + +
+ + +
+ @@ -140,6 +146,9 @@ + + +
@@ -151,6 +160,9 @@ + + + @@ -180,6 +192,7 @@ + diff --git a/source/funkin/backend/assets/Paths.hx b/source/funkin/backend/assets/Paths.hx index 7cd40806..93686c0c 100644 --- a/source/funkin/backend/assets/Paths.hx +++ b/source/funkin/backend/assets/Paths.hx @@ -201,13 +201,15 @@ class Paths * @param Unique Whenever the image should be unique in the cache * @param Key Key to the image in the cache * @param SkipAtlasCheck Whenever the atlas check should be skipped. + * @param SkipMultiCheck Whenever the multi spritesheet check should be skipped. + * @param Ext Extension of the image. * @return FlxFramesCollection Frames */ - static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false, ?Ext:String = null):FlxFramesCollection { + static function loadFrames(path:String, Unique:Bool = false, Key:String = null, SkipAtlasCheck:Bool = false, SkipMultiCheck:Bool = false, ?Ext:String = null):FlxFramesCollection { var noExt = Path.withoutExtension(path); var ext = Ext != null ? Ext : Flags.IMAGE_EXT; - if (Assets.exists('$noExt/1.${ext}')) { + if (!SkipMultiCheck && Assets.exists('$noExt/1.${ext}')) { // MULTIPLE SPRITESHEETS!! var graphic = FlxG.bitmap.add("flixel/images/logo/default.png", false, '$noExt/mult'); @@ -219,7 +221,7 @@ class Paths var cur = 1; var finalFrames = new MultiFramesCollection(graphic); while(Assets.exists('$noExt/$cur.${ext}')) { - var spr = loadFrames('$noExt/$cur.${ext}'); + var spr = loadFrames('$noExt/$cur.${ext}', false, null, false, true); finalFrames.addFrames(spr); cur++; } diff --git a/source/funkin/backend/system/macros/Macros.hx b/source/funkin/backend/system/macros/Macros.hx index d40855b3..5b51a6cd 100644 --- a/source/funkin/backend/system/macros/Macros.hx +++ b/source/funkin/backend/system/macros/Macros.hx @@ -21,6 +21,7 @@ class Macros { // OTHER LIBRARIES & STUFF #if THREE_D_SUPPORT "away3d", "flx3d", #end #if VIDEO_CUTSCENES "hxvlc.flixel", "hxvlc.openfl", #end + #if NAPE_ENABLED "nape", "flixel.addons.nape", #end // BASE HAXE "DateTools", "EReg", "Lambda", "StringBuf", "haxe.crypto", "haxe.display", "haxe.exceptions", "haxe.extern", "scripting" ]) diff --git a/source/funkin/backend/system/modules/ALSoftConfig.hx b/source/funkin/backend/system/modules/ALSoftConfig.hx new file mode 100644 index 00000000..0b1b57a0 --- /dev/null +++ b/source/funkin/backend/system/modules/ALSoftConfig.hx @@ -0,0 +1,31 @@ +package funkin.backend.system.modules; + +import haxe.io.Path; + +/* + * A class that simply points OpenALSoft to a custom configuration file when + * the game starts up. + * + * The config overrides a few global OpenALSoft settings with the aim of + * improving audio quality on desktop targets. + */ +@:keepInit class ALSoftConfig +{ + #if desktop + static function __init__():Void + { + var origin:String = #if hl Sys.getCwd() #else Sys.programPath() #end; + + var configPath:String = Path.directory(Path.withoutExtension(origin)); + #if windows + configPath += "/plugins/alsoft.ini"; + #elseif mac + configPath = Path.directory(configPath) + "/Resources/plugins/alsoft.conf"; + #else + configPath += "/plugins/alsoft.conf"; + #end + + Sys.putEnv("ALSOFT_CONF", configPath); + } + #end +} \ No newline at end of file diff --git a/source/funkin/editors/character/CharacterInfoScreen.hx b/source/funkin/editors/character/CharacterInfoScreen.hx index feeead30..599474cc 100644 --- a/source/funkin/editors/character/CharacterInfoScreen.hx +++ b/source/funkin/editors/character/CharacterInfoScreen.hx @@ -76,6 +76,9 @@ class CharacterInfoScreen extends UISubstateWindow { add(iconColorWheel); addLabelOn(iconColorWheel, "Icon Color"); + if (character.iconColor != null) + iconColorWheel.colorChanged = true; + add(title = new UIText(spriteTextBox.x, spriteTextBox.y + 10 + 46 + 84, 0, "Character Data", 28)); positionXStepper = new UINumericStepper(title.x, title.y + title.height + 36, character.globalOffset.x, 0.001, 2, null, null, 84); diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 494a7e73..391454a6 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -1167,7 +1167,7 @@ class Charter extends UIState { if (note.strumLineID == strumLineID) selection.remove(note); else i++; - } + } else i++; } } #end diff --git a/source/funkin/game/PlayState.hx b/source/funkin/game/PlayState.hx index 884b8433..2e58e98b 100644 --- a/source/funkin/game/PlayState.hx +++ b/source/funkin/game/PlayState.hx @@ -944,7 +944,7 @@ class PlayState extends MusicBeatState var spr = event.spritePath; if (!Assets.exists(spr)) spr = Paths.image('$spr'); - sprite = new FlxSprite().loadAnimatedGraphic(spr); + sprite = new FunkinSprite().loadAnimatedGraphic(spr); sprite.scrollFactor.set(); sprite.scale.set(event.scale, event.scale); sprite.updateHitbox(); @@ -1276,8 +1276,11 @@ class PlayState extends MusicBeatState accFormat.format.color = curRating.color; accuracyTxt.text = 'Accuracy:${accuracy < 0 ? "-%" : '${CoolUtil.quantize(accuracy * 100, 100)}%'} - ${curRating.rating}'; - accuracyTxt._formatRanges[0].range.start = accuracyTxt.text.length - curRating.rating.length; - accuracyTxt._formatRanges[0].range.end = accuracyTxt.text.length; + for (i => frmtRange in accuracyTxt._formatRanges) if (frmtRange.format == accFormat) { + accuracyTxt._formatRanges[i].range.start = accuracyTxt.text.length - curRating.rating.length; + accuracyTxt._formatRanges[i].range.end = accuracyTxt.text.length; + break; + } } } diff --git a/source/funkin/menus/PauseSubState.hx b/source/funkin/menus/PauseSubState.hx index 096ea443..8badd60a 100644 --- a/source/funkin/menus/PauseSubState.hx +++ b/source/funkin/menus/PauseSubState.hx @@ -1,20 +1,20 @@ package funkin.menus; import flixel.sound.FlxSound; -import flixel.text.FlxText; import flixel.tweens.FlxTween; import flixel.util.FlxColor; +import funkin.backend.FunkinText; import funkin.backend.scripting.Script; +import funkin.backend.scripting.events.NameEvent; import funkin.backend.scripting.events.menu.MenuChangeEvent; import funkin.backend.scripting.events.menu.pause.*; -import funkin.backend.scripting.events.NameEvent; import funkin.backend.system.Conductor; import funkin.backend.utils.FunkinParentDisabler; import funkin.editors.charter.Charter; import funkin.menus.StoryMenuState; import funkin.options.OptionsMenu; -import funkin.options.keybinds.KeybindsOptions; import funkin.options.TreeMenu; +import funkin.options.keybinds.KeybindsOptions; class PauseSubState extends MusicBeatSubstate { @@ -22,7 +22,13 @@ class PauseSubState extends MusicBeatSubstate var grpMenuShit:FlxTypedGroup; + var levelInfo:FunkinText; + var levelDifficulty:FunkinText; + var deathCounter:FunkinText; + var multiplayerText:FunkinText; + var menuItems:Array; + var curSelected:Int = 0; var pauseMusic:FlxSound; @@ -59,7 +65,6 @@ class PauseSubState extends MusicBeatSubstate menuItems = event.options; - pauseMusic = FlxG.sound.load(Paths.music(event.music), 0, true); pauseMusic.persist = false; pauseMusic.group = FlxG.sound.defaultMusicGroup; @@ -74,15 +79,13 @@ class PauseSubState extends MusicBeatSubstate bg.scrollFactor.set(); add(bg); - var levelInfo:FlxText = new FlxText(20, 15, 0, PlayState.SONG.meta.displayName, 32); - var levelDifficulty:FlxText = new FlxText(20, 15, 0, PlayState.difficulty.toUpperCase(), 32); - var deathCounter:FlxText = new FlxText(20, 15, 0, "Blue balled: " + PlayState.deathCounter, 32); - var multiplayerText:FlxText = new FlxText(20, 15, 0, PlayState.opponentMode ? 'OPPONENT MODE' : (PlayState.coopMode ? 'CO-OP MODE' : ''), 32); + levelInfo = new FunkinText(20, 15, 0, PlayState.SONG.meta.displayName, 32, false); + levelDifficulty = new FunkinText(20, 15, 0, PlayState.difficulty.toUpperCase(), 32, false); + deathCounter = new FunkinText(20, 15, 0, "Blue balled: " + PlayState.deathCounter, 32, false); + multiplayerText = new FunkinText(20, 15, 0, PlayState.opponentMode ? 'OPPONENT MODE' : (PlayState.coopMode ? 'CO-OP MODE' : ''), 32, false); for(k=>label in [levelInfo, levelDifficulty, deathCounter, multiplayerText]) { label.scrollFactor.set(); - label.setFormat(Paths.font('vcr.ttf'), 32); - label.updateHitbox(); label.alpha = 0; label.x = FlxG.width - (label.width + 20); label.y = 15 + (32 * k); diff --git a/source/funkin/options/TreeMenu.hx b/source/funkin/options/TreeMenu.hx index 4faa8cd0..92540656 100644 --- a/source/funkin/options/TreeMenu.hx +++ b/source/funkin/options/TreeMenu.hx @@ -7,6 +7,7 @@ import funkin.backend.FunkinText; import funkin.editors.ui.UIState; import funkin.menus.MainMenuState; import funkin.options.type.OptionType; +import funkin.options.type.TextOption; import funkin.backend.system.framerate.Framerate; class TreeMenu extends UIState { @@ -18,13 +19,13 @@ class TreeMenu extends UIState { public static var lastState:Class = null; // Static for fixing the softlock bugs when resetting the state - Nex - public function new() { + public function new(scriptsAllowed:Bool = true, ?scriptName:String) { if(lastState == null) lastState = Type.getClass(FlxG.state); - super(); + super(scriptsAllowed, scriptName); } public override function createPost() { - if (main == null) throw "\"main\" variable has not been set in extended class!"; + if (main == null) main = new OptionsScreen("Fallback Treemenu", "Please set the \"main\" variable in your extended class before createPost", [new TextOption("Oops! No Options", "This doesn't look like it was supposed to happen...", () -> FlxG.resetState() ) ]); FlxG.camera.scroll.set(-FlxG.width, 0); @@ -119,4 +120,4 @@ typedef OptionCategory = { typedef OptionTypeDef = { var type:Class; var args:Array; -} \ No newline at end of file +}