diff --git a/CHANGELOG.md b/CHANGELOG.md index e7f830047..2f0a0dcff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.3] - 2024-05-14 +### Changed +- Cleaned up some code in `PlayAnimationSongEvent.hx` (thanks BurgerBalls!) +### Fixed +- Fix Web Loading Bar (thanks lemz1!) +- Don't allow any more inputs when exiting freeplay (thanks gamerbros!) +- Fixed using mouse wheel to scroll on freeplay (thanks JugieNoob!) +- Fixed the reset's of the health icons, score, and notes when re-entering gameplay from gameover (thanks ImCodist!) +- Fixed the chart editor character selector's hitbox width (thanks MadBear422!) +- Fixed camera stutter once a wipe transition to the Main Menu completes (thanks ImCodist!) +- Fixed an issue where hold note would be invisible for a single frame (thanks ImCodist!) +- Fix tween accumulation on title screen when pressing Y multiple times (thanks TheGaloXx!) +- Fix for a game over easter egg so you don't accidentally exit it when viewing + ## [0.3.2] - 2024-05-03 ### Added - Added `,` and `.` keybinds to the Chart Editor. These place Focus Camera events at the playhead, for the opponent and player respectively. diff --git a/Project.xml b/Project.xml index fcfcfb9f3..24cdac270 100644 --- a/Project.xml +++ b/Project.xml @@ -1,7 +1,7 @@ - + diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index c560c5422..1287d5a1b 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -1,31 +1,31 @@ # Funkin' Debug Hotkeys -`F4` (EVERYWHERE) - Leave Current State and move to Main Menu -`F5` (EVERYWHERE) - Hot Reload Data Files +Most of this functionality is only available on debug builds of the game! -`Y` (Title Screen) - WOAH +## Any State +- `F2`: ***OVERLAY***: Enables the Flixel debug overlay, which has partial support for scripting. +- `F3`: ***SCREENSHOT***: Takes a screenshot of the game and saves it to the local `screenshots` directory. Works outside of debug builds too! +- `F4`: ***EJECT***: Forcibly switch state to the Main Menu (with no extra transition). Useful if you're stuck in a level and you need to get out! +- `F5`: ***HOT RELOAD***: Forcibly reload the game's scripts and data files, then restart the current state. If any files in the `assets` folder have been modified, the game should process the changes for you! NOTE: Known bug, this does not reset song charts or song scripts, but it should reset everything else (such as stage layout data and character animation data). +- `CTRL-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. -`~` (Main Menu) - Access Debug Menu +## **Play State** +- `H`: ***HIDE UI***: Makes the user interface invisible. Works in Pause Menu, great for screenshots. +- `1`: ***END SONG***: Immediately ends the song and moves to Results Screen on Freeplay, or next song on Story Mode. +- `2`: ***GAIN HEALTH***: Debug function, add 10% to the player's health. +- `3`: ***LOSE HEALTH***: Debug function, subtract 5% to the player's health. +- `9`: NEATO! +- `PAGEUP` (MacOS: `Fn-Up`): ***FORWARDS TIME TRAVEL****: Move forward by 2 sections. Hold SHIFT to move forward by 20 sections instead. +- `PAGEDOWN` (MacOS: `Fn-Down`): ***BACKWARDS TIME TRAVEL****: Move backward by 2 sections. Hold SHIFT to move backward by 20 sections instead. -`U` (Play) - Open Stage Editor State -`H` (Play) - Show/Hide HUD -`1` (Play) - End Song -`2` (Play) - Add 10% Health -`3` (Play) - Subtract 5% Health -`7` (Play) - (NOT WORKING) Open Chart Editor -`8` (Play) - Open Animation Editor -`9` (Play) - (Easter Egg) Classic Health Icon -`PGUP`/`Fn+Up` (Play) - Skip Forward In Time -`PGDN`/`Fn+Down` (Play) - 🦃 That's right, we're going to go BACK IN TIME +## **Freeplay State** +- `F` (Freeplay Menu) - Move to Favorites +- `Q` (Freeplay Menu) - Back one category +- `E` (Freeplay Menu) - Forward one category -`F` (Freeplay Menu) - Move to Favorites -`P` (Freeplay Menu) - Switch to Pico (probably doesn't work) -`T` (Freeplay Menu) - Start typing in search bar -`Q` (Freeplay Menu) - Back one letter -`E` (Freeplay Menu) - Forward one letter +## **Title State** +- `Y` - WOAH -`Arrows` (Stage Editor) - Move Prop -`Ctrl-Z` (Stage Editor) - Undo -`Y` (Stage Editor) - Leave Stage Editor - -`H` (Pause Menu) - Hide the Pause Menu UI (good for screenshots!) +## **Main Menu** +- `~`: ***DEBUG****: Opens a menu to access the Chart Editor and other work-in-progress editors. Rebindable in the options menu. +- `CTRL-ALT-SHIFT-W`: ***ALL ACCESS***: Unlocks all songs in Freeplay. Only available on debug builds. diff --git a/source/funkin/input/Controls.hx b/source/funkin/input/Controls.hx index 1983d413b..548e4edfa 100644 --- a/source/funkin/input/Controls.hx +++ b/source/funkin/input/Controls.hx @@ -527,6 +527,14 @@ class Controls extends FlxActionSet action.inputs[i].inputID = toAdd; } hasReplaced = true; + } else if (input.device == KEYBOARD && input.inputID == toAdd) { + // This key is already bound! + if (hasReplaced) { + // Remove the duplicate keybind, don't replace. + action.inputs.remove(input); + } else { + hasReplaced = true; + } } } @@ -989,6 +997,7 @@ class Controls extends FlxActionSet for (control in Control.createAll()) { var inputs:Array = Reflect.field(data, control.getName()); + inputs = inputs.unique(); if (inputs != null) { if (inputs.length == 0) { @@ -1038,7 +1047,11 @@ class Controls extends FlxActionSet var inputs = getInputsFor(control, device); isEmpty = isEmpty && inputs.length == 0; - if (inputs.length == 0) inputs = [FlxKey.NONE]; + if (inputs.length == 0) { + inputs = [FlxKey.NONE]; + } else { + inputs = inputs.unique(); + } Reflect.setField(data, control.getName(), inputs); } diff --git a/source/funkin/play/PlayState.hx b/source/funkin/play/PlayState.hx index 44ad819c4..a9ca09ce8 100644 --- a/source/funkin/play/PlayState.hx +++ b/source/funkin/play/PlayState.hx @@ -826,6 +826,8 @@ class PlayState extends MusicBeatSubState resetCamera(); + var fromDeathState = isPlayerDying; + persistentUpdate = true; persistentDraw = true; @@ -863,8 +865,11 @@ class PlayState extends MusicBeatSubState if (currentStage != null) currentStage.resetStage(); - playerStrumline.vwooshNotes(); - opponentStrumline.vwooshNotes(); + if (!fromDeathState) + { + playerStrumline.vwooshNotes(); + opponentStrumline.vwooshNotes(); + } playerStrumline.clean(); opponentStrumline.clean(); @@ -1075,6 +1080,22 @@ class PlayState extends MusicBeatSubState function moveToGameOver():Void { + // Reset and update a bunch of values in advance for the transition back from the game over substate. + playerStrumline.clean(); + opponentStrumline.clean(); + + songScore = 0; + updateScoreText(); + + health = Constants.HEALTH_STARTING; + healthLerp = health; + + healthBar.value = healthLerp; + + iconP1.updatePosition(); + iconP2.updatePosition(); + + // Transition to the game over substate. var gameOverSubState = new GameOverSubState( { isChartingMode: isChartingMode, @@ -2549,12 +2570,20 @@ class PlayState extends MusicBeatSubState // Redirect to the chart editor playing the current song. if (controls.DEBUG_CHART) { - disableKeys = true; - persistentUpdate = false; - FlxG.switchState(() -> new ChartEditorState( - { - targetSongId: currentSong.id, - })); + if (isChartingMode) + { + if (FlxG.sound.music != null) FlxG.sound.music.pause(); // Don't reset song position! + this.close(); // This only works because PlayState is a substate! + } + else + { + disableKeys = true; + persistentUpdate = false; + FlxG.switchState(() -> new ChartEditorState( + { + targetSongId: currentSong.id, + })); + } } #end diff --git a/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx b/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx index eb60cb6db..1edbb6c00 100644 --- a/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx +++ b/source/funkin/ui/debug/charting/dialogs/ChartEditorCharacterIconSelectorMenu.hx @@ -67,7 +67,7 @@ class ChartEditorCharacterIconSelectorMenu extends ChartEditorBaseMenu var charGrid = new Grid(); charGrid.columns = 5; - charGrid.width = 100; + charGrid.width = this.width; charSelectScroll.addComponent(charGrid); var charIds:Array = CharacterDataParser.listCharacterIds(); diff --git a/source/funkin/ui/freeplay/FreeplayState.hx b/source/funkin/ui/freeplay/FreeplayState.hx index 7b7543845..1c7926f62 100644 --- a/source/funkin/ui/freeplay/FreeplayState.hx +++ b/source/funkin/ui/freeplay/FreeplayState.hx @@ -733,8 +733,8 @@ class FreeplayState extends MusicBeatSubState } } - lerpScore = MathUtil.coolLerp(lerpScore, intendedScore, 0.2); - lerpCompletion = MathUtil.coolLerp(lerpCompletion, intendedCompletion, 0.9); + lerpScore = MathUtil.smoothLerp(lerpScore, intendedScore, elapsed, 0.5); + lerpCompletion = MathUtil.smoothLerp(lerpCompletion, intendedCompletion, elapsed, 0.5); if (Math.isNaN(lerpScore)) { @@ -889,11 +889,24 @@ class FreeplayState extends MusicBeatSubState spamTimer = 0; } + #if !html5 if (FlxG.mouse.wheel != 0) { dj.resetAFKTimer(); - changeSelection(-Math.round(FlxG.mouse.wheel / 4)); + changeSelection(-Math.round(FlxG.mouse.wheel)); } + #else + if (FlxG.mouse.wheel < 0) + { + dj.resetAFKTimer(); + changeSelection(-Math.round(FlxG.mouse.wheel / 8)); + } + else if (FlxG.mouse.wheel > 0) + { + dj.resetAFKTimer(); + changeSelection(-Math.round(FlxG.mouse.wheel / 8)); + } + #end if (controls.UI_LEFT_P && !FlxG.keys.pressed.CONTROL) { @@ -910,6 +923,7 @@ class FreeplayState extends MusicBeatSubState if (controls.BACK) { + busy = true; FlxTween.globalManager.clear(); FlxTimer.globalManager.clear(); dj.onIntroDone.removeAll(); diff --git a/source/funkin/ui/transition/LoadingState.hx b/source/funkin/ui/transition/LoadingState.hx index 28533e35b..95c378b24 100644 --- a/source/funkin/ui/transition/LoadingState.hx +++ b/source/funkin/ui/transition/LoadingState.hx @@ -162,7 +162,9 @@ class LoadingState extends MusicBeatSubState { targetShit = FlxMath.remapToRange(callbacks.numRemaining / callbacks.length, 1, 0, 0, 1); - loadBar.scale.x = FlxMath.lerp(loadBar.scale.x, targetShit, 0.50); + var lerpWidth:Int = Std.int(FlxMath.lerp(loadBar.width, FlxG.width * targetShit, 0.2)); + loadBar.setGraphicSize(lerpWidth, loadBar.height); + loadBar.updateHitbox(); FlxG.watch.addQuick('percentage?', callbacks.numRemaining / callbacks.length); } diff --git a/source/funkin/util/logging/CrashHandler.hx b/source/funkin/util/logging/CrashHandler.hx index 8cfa2270f..71d1ad394 100644 --- a/source/funkin/util/logging/CrashHandler.hx +++ b/source/funkin/util/logging/CrashHandler.hx @@ -141,7 +141,9 @@ class CrashHandler fullContents += '\n'; - fullContents += 'Flixel Current State: ${Type.getClassName(Type.getClass(FlxG.state))}\n'; + var currentState = FlxG.state != null ? Type.getClassName(Type.getClass(FlxG.state)) : 'No state loaded'; + + fullContents += 'Flixel Current State: ${currentState}\n'; fullContents += '\n';