From 71ed154b81abbd002d78c09c2dada8a2ad3fa73e Mon Sep 17 00:00:00 2001 From: Kolo <67389779+JustKolosaki@users.noreply.github.com> Date: Thu, 5 Dec 2024 22:24:49 +0100 Subject: [PATCH 01/81] fix that one annoying ass bug for events --- .../charting/toolboxes/ChartEditorEventDataToolbox.hx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx index 70580300e..27d5f21c9 100644 --- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx +++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx @@ -74,6 +74,7 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox return; } + chartEditorState.eventDataToPlace = {}; buildEventDataFormFromSchema(toolboxEventsDataGrid, schema, chartEditorState.eventKindToPlace); if (!_initializing && chartEditorState.currentEventSelection.length > 0) @@ -98,6 +99,8 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox { super.refresh(); + toolboxEventsEventKind.pauseEvent(UIEvent.CHANGE, true); + var newDropdownElement = ChartEditorDropdowns.findDropdownElement(chartEditorState.eventKindToPlace, toolboxEventsEventKind); if (newDropdownElement == null) @@ -156,6 +159,8 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox } } } + + toolboxEventsEventKind.resumeEvent(UIEvent.CHANGE, true, true); } var lastEventKind:String = 'unknown'; @@ -170,8 +175,6 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox // Clear the frame. target.removeAllComponents(); - chartEditorState.eventDataToPlace = {}; - for (field in schema) { if (field == null) continue; @@ -264,7 +267,7 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox var value = event.target.value; if (field.type == ENUM) { - value = event.target.value.value; + value = event.target.value?.value; } else if (field.type == BOOL) { From 943c38767bf7e007ec51864aa0d0f3315f8b9e2d Mon Sep 17 00:00:00 2001 From: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> Date: Tue, 11 Feb 2025 23:07:21 -0600 Subject: [PATCH 02/81] Contributor's guide Co-authored-by: Hundrec Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> --- docs/CONTRIBUTING.md | 244 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 docs/CONTRIBUTING.md diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..b25cbb190 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,244 @@ +# Contributing +Welcome to the Contributing Guide! +You can contribute to the Funkin' repository by opening issues or pull requests. This guide will cover best practices for each type of contribution. + +# Part 1: Etiquette +- Be respectful to one another. We're here to help each other out! +- Keep your titles clear and concise. Do not type the whole description into the title. +- Do not spam by creating unnecessary issues and pull requests. +- Use common sense! + +# Part 2: Issues +Issues serve many purposes, from reporting bugs to suggesting new features. +This section provides guidelines to follow when [opening an issue](https://github.com/FunkinCrew/Funkin/issues). + +## Requirements +Make sure you're playing: +- the latest version of the game (currently v0.5.3) +- without any mods +- on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) + +## Rejected Features +If you want to **suggest a feature**, make sure it hasn't already been rejected. +Here's a list of commonly suggested features and the reasons why they won't be added: + +| Feature | Reason | +| ------- | ------- | +| Combo Break + Accuracy Displays | https://github.com/FunkinCrew/Funkin/pull/2681#issuecomment-2156308982 | +| Toggleable Ghost Tapping | https://github.com/FunkinCrew/Funkin/pull/2564#issuecomment-2119701802 | +| Perfectly Centered Strumlines | _same as above^_ | +| Losing Icons for DD and Parents | https://github.com/FunkinCrew/Funkin/issues/3048#issuecomment-2243491536 | +| Playable GF / Speaker BF / Speaker Pico | https://github.com/FunkinCrew/Funkin/issues/2953#issuecomment-2216985230 | +| Adjusted Difficulty Ratings | https://github.com/FunkinCrew/Funkin/issues/2781#issuecomment-2172053144 | +| Countdown after Unpausing | https://github.com/FunkinCrew/Funkin/issues/2721#issuecomment-2159330106 | +| Importing Charts from Psych Engine (and other mod content) | https://github.com/FunkinCrew/Funkin/issues/2586#issuecomment-2125733327 | +| Backwards Compatibility for Modding | https://github.com/FunkinCrew/Funkin/issues/3949#issuecomment-2608391329 | +| Lua Support | https://github.com/FunkinCrew/Funkin/issues/2643#issuecomment-2143718093 | + +## Issue Types +Choose the issue template that best suits your needs! +Here's what each template is designed for: + +### Bug Report ([view list](https://github.com/FunkinCrew/Funkin/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22type%3A%20minor%20bug%22)) +For minor bugs and general issues with the game. Choose this one if none of the others fit your needs. + +### Crash Report ([view list](https://github.com/FunkinCrew/Funkin/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22type%3A%20major%20bug%22)) +For crashes and freezes like the [Null Object Reference](https://github.com/FunkinCrew/Funkin/issues/2209) problem from v0.3.0. + +### Charting Issue ([view list](https://github.com/FunkinCrew/Funkin/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22type%3A%20charting%20issue%22)) +For misplaced notes, wonky camera movements, broken song events, and everything related to the game's charts. + +### Enhancement ([view list](https://github.com/FunkinCrew/Funkin/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22type%3A%20enhancement%22)) +For suggestions to add new features or improve existing ones. We'd love to hear your ideas! + +### Compiling Help (only after reading the [Troubleshooting Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/TROUBLESHOOTING.md)) +For issues with compiling the game. Legacy versions (before v0.3.0) are not supported. + +> [!TIP] +> If none of the above Issue templates suit your inquiry (e.g. Questions or Coding Help), please [open a discussion](https://github.com/FunkinCrew/Funkin/discussions). + +## Before You Submit... +Complete the Issue Checklist at the top of your template! + +> [!IMPORTANT] +> If you do not complete each step of the Issue Checklist, **your issue may be closed.** + +Be sure to use the search bar on the Issues page to check that your issue hasn't already been reported by someone else. +Duplicate issues make it harder to keep track of important issues with the game. + +Also only report one issue or enhancement at a time! If you have multiple bug reports or suggestions, split them up into separate submissions so they can be checked off one by one. + +Once you're sure your issue is unique and specific, feel free to submit it. + +**Thank you for opening issues!** + +# Part 3: Pull Requests +Community members are welcome to contribute their changes by [opening pull requests](https://github.com/FunkinCrew/Funkin/pulls). +This section covers guidelines for opening and managing pull requests (PRs). + +## Choosing a base branch +When creating a branch in your fork, base your branch on either the `main` or `develop` branch depending on the types of changes you want to make. + +> [!CAUTION] +> Avoid using your fork's default branch (`main` in this case) for your PR. This is considered an [anti-pattern](https://jmeridth.com/posts/do-not-issue-pull-requests-from-your-master-branch/) by GitHub themselves! + +Choose the `main` branch if you modify: +- Documentation (`.md` files) +- GitHub files (`.yml` files or anything in the `.github` folder) + +Choose the `develop` branch if you modify: +- Game code (`.hx` files) +- Any other type of file + +> [!TIP] +> When in doubt, base your branch on the `develop` branch. + +Choosing the right base branch helps keep your commit history clean and avoid merge conflicts. +Once you’re satisfied with the changes you’ve made, open a PR and base it on the same branch you previously chose. + +## Merge conflicts and rebasing +Some game updates introduce significant breaking changes that may create merge conflicts in your PR. To resolve them, you will need to update or rebase your PR. + +Most merge conflicts are small and will only require you to modify a few files to resolve them. +However, some changes are so big that your commit history will look like a mess! +In this case, you will have to perform a [**rebase**](https://docs.github.com/en/get-started/using-git/about-git-rebase). +This process reapplies your changes on top of the updated branch and cleanly resolves the merge conflicts. + +> [!TIP] +> If your commit history becomes too long, you can use rebase to `squash` your PR's commits into a single commit. + +## Code PRs + +> [!IMPORTANT] +> This guide does not cover compiling. If you have trouble compiling the game, refer to the [Compilation Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/COMPILING.md). + +Code-based PRs make changes such as **fixing bugs** or **implementing new features** in the game. +This involves modifying one or several of the repository’s `.hx` files, found within the `source/` folder. + +### Codestyle +Before submitting your PR, check that your code follows the [Style Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/style-guide.md). + +Here are some guidelines for writing comments in your code: +- Leave comments only when you believe a piece of code warrants explanation. +- Ensure that your comments provide meaningful insight into the function or purpose of the code. +- Write your comments in a clear and concise manner. +- Only sign your comments with your name when your changes are complex and may require further explanation. + +### Example Comments +#### DO NOT: +```haxe + /** + * jumps around the song + * works with bpm changes but skipped notes still hurt + * @param sections how many sections to jump, negative = backwards + */ + function changeSection(sections:Int):Void + { + // Pause the music, as you probably guessed + // FlxG.sound.music.pause(); + + // Set the target time in steps, I don’t really get how this works though lol - [GitHub username] + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started, that would probably break a lot of things and cause a whole bunch of problems! + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) // If the music is not null, set the time to the target time + { + FlxG.sound.music.time = targetTimeMs; + } + + // Handle skipped notes and events and all that jazz + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + // regenNoteData(FlxG.sound.music.time); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + // I hate this function - [GitHub username] + resyncVocals(); + } +``` + +#### DO: +```haxe + /** + * Jumps forward or backward a number of sections in the song. + * Accounts for BPM changes, does not prevent death from skipped notes. + * @param sections The number of sections to jump, negative to go backwards. + */ + function changeSection(sections:Int):Void + { + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started. + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) + { + FlxG.sound.music.time = targetTimeMs; + } + + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + resyncVocals(); + } +``` + +## Documentation PRs +Documentation-based PRs make changes such as **fixing typos** or **adding new information** in documentation files. +This involves modifying one or several of the repository’s `.md` files, found throughout the repository. +Make sure your changes are easy to understand and formatted consistently to maximize clarity and readability. + +> [!CAUTION] +> DO NOT TOUCH THE `LICENSE.md` FILE, EVEN TO MAKE SMALL CHANGES! + +### Example Documentation PR +#### DO NOT: +``` +// The original documentation +- `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. + +// The new PR additions +- `ctrl alt shift e`: No idea what this does +- `alt-f4`: closes the game +``` + +#### DO: +``` +// The original documentation +- `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. + +// The new PR additions +- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Prompts the user to save their save data as a JSON file, so its contents can be viewed. Only available on debug builds. +- `ALT-F4`: ***CLOSE GAME***: Closes the game forcibly on Windows. +``` + +## GitHub PRs +GitHub-related PRs make changes such as **tweaking Issue Templates** or **updating the repository’s workflows**. +This involves modifying one or several of the repository’s `.yml` files, or any other file in the `.github` folder. +Please test these changes on your fork’s main branch to avoid breaking anything in this repository (e.g. GitHub Actions, issue templates, etc.)! + +## funkin.assets PRs +The `assets` submodule has its own repository called [funkin.assets](https://github.com/FunkinCrew/funkin.assets). +If you only modify files in the `assets` folder, open a PR in the `funkin.assets` repository instead of the main repository. +If you simultaneously modify files from both repositories, then open two separate PRs and explain the connection in your PR descriptions. + +Be sure to choose `main` as the base branch for `funkin.assets` PRs, as no `develop` branch exists for that repository. + +# Closing +Thank you for reading the Contributing Guide. +We look forward to seeing your contributions to the game! From c6ef9b17a2288f0af82841c299e7aeb6247e0f4a Mon Sep 17 00:00:00 2001 From: Hundrec Date: Fri, 7 Feb 2025 22:52:07 -0700 Subject: [PATCH 03/81] Add more console outputs to Troubleshooting Guide Includes a line about warnings and deprecated functions, as well as a line about the hxcpp prompt. --- docs/TROUBLESHOOTING.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index 54ba396c4..fd2bee464 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -1,11 +1,19 @@ # Troubleshooting Common Compilation Issues +- Any output containing `WARNING` or `(WDeprecated)` + - Will not disrupt compilation and can be safely ignored. + +- `This version of hxcpp` ... `Would you like to do this now [y/n]` + - Type "y" into the console and press Enter. + - Weird macro error with a very tall call stack: Restart Visual Studio Code - NOTE: This is caused by Polymod somewhere, and seems to only occur when there is another compile error somewhere in the program. There is a bounty up for it. -- `Get Thread Context Failed`: Turn off other expensive applications while building +- `Get Thread Context Failed` + - Turn off other expensive applications while building. -- `Type not found: T1`: This is thrown by `json2object`, make sure the data type of `@:default` is correct. +- `Type not found: T1` + - This is thrown by `json2object`, make sure the data type of `@:default` is correct. - NOTE: `flixel.util.typeLimit.OneOfTwo` isn't supported. - `Class lists not properly generated. Try cleaning out your export folder, restarting your IDE, and rebuilding your project.` @@ -15,7 +23,7 @@ - This error occurs if the PDB file located in your `export` folder is in use or exceeds 4 GB. Try deleting the `export` folder and building again from scratch. - `error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)` - - This error can happen during cloning as a result of poor network connectivity. A common fix is to run ` git config --global http.postBuffer 4096M` in your terminal. + - This error can happen during cloning as a result of poor network connectivity. A common fix is to run `git config --global http.postBuffer 4096M` in your terminal. - Repository is missing an `assets` folder, or `assets` folder is empty. - You did not clone the repository correctly! Copy the path to your `funkin` folder and run `cd the\path\you\copied`. Then follow the compilation guide starting from **Step 4**. From 36fd05b1f95c4baab7be2464b2e2086978841d22 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 16:44:36 -0700 Subject: [PATCH 04/81] Link CONTRIBUTING.md in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9239d266c..6c12bfd08 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ This game was made with love to Newgrounds and its community. Extra love to Tom **PLEASE USE THE LINKS ABOVE IF YOU JUST WANT TO PLAY THE GAME** -To learn how to install the necessary dependencies and compile the game from source, please check out our [building the game](/docs/COMPILING.md) guide. +To learn how to install the necessary dependencies and compile the game from source, please follow our [Compiling Guide](/docs/COMPILING.md). # Contributing -You can actively participate in the development of Friday Night Funkin' by opening a [bug report](https://github.com/FunkinCrew/Funkin/issues) or submitting a [code contribution](https://github.com/FunkinCrew/Funkin/pulls)! +Check out our [Contributing Guide](/docs/CONTRIBUTING.md) to learn how you can actively contribute to the development of Friday Night Funkin'! # Modding From e3eddc892d61048261402c96e7bdb1b0ec292960 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 16:50:11 -0700 Subject: [PATCH 05/81] Contributing Guide in Minor Bug Template --- .github/ISSUE_TEMPLATE/bug.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 5210f50bf..24c822805 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -3,14 +3,18 @@ description: Report a bug or an issue in the game. labels: ["type: minor bug", "status: pending triage"] title: "Bug Report: " body: + - type: markdown + attributes: + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES! + - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your issue being addressed! options: - - label: I have read the pinned [Issues Guide](https://github.com/FunkinCrew/Funkin/issues/4050) + - label: I have read the [Contributing Guide](/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my issue has already been reported - - label: I have properly named my issue + - label: I have properly titled my issue - type: dropdown attributes: From dd215687d4a084b4c7e87da07ecfbcace0d17dd0 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 16:50:34 -0700 Subject: [PATCH 06/81] quote --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 24c822805..e49af3755 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -5,7 +5,7 @@ title: "Bug Report: " body: - type: markdown attributes: - value: "# PLEASE READ THE [CONTRIBUTING GUIDE](/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES! + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" - type: checkboxes attributes: From 7b9e375feabca2dabaf0a53a82786e05484da200 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 16:58:34 -0700 Subject: [PATCH 07/81] Fix Contributing link --- .github/ISSUE_TEMPLATE/bug.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index e49af3755..1399c316a 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -5,14 +5,14 @@ title: "Bug Report: " body: - type: markdown attributes: - value: "# PLEASE READ THE [CONTRIBUTING GUIDE](/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your issue being addressed! options: - - label: I have read the [Contributing Guide](/docs/CONTRIBUTING.md) + - label: I have read the [Contributing Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my issue has already been reported - label: I have properly titled my issue From d11027fb08b96198f9bd0035f6c9fbc746956dc0 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:07:12 -0700 Subject: [PATCH 08/81] A lil spacing --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 1399c316a..0d9df9617 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -6,7 +6,6 @@ body: - type: markdown attributes: value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" - - type: checkboxes attributes: label: Issue Checklist @@ -49,6 +48,7 @@ body: placeholder: ex. 0.5.3 validations: required: true + - type: markdown attributes: From 0bc0ab4eec144addb1a343c08d59e031c65e6ab3 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:10:05 -0700 Subject: [PATCH 09/81] Revert spacing --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 0d9df9617..f6f5c3250 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -6,6 +6,7 @@ body: - type: markdown attributes: value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + - type: checkboxes attributes: label: Issue Checklist @@ -48,7 +49,6 @@ body: placeholder: ex. 0.5.3 validations: required: true - - type: markdown attributes: From f8f533ad370e7d01187be8580f0f1cd0cf6b8b6d Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:10:59 -0700 Subject: [PATCH 10/81] Charting Template --- .github/ISSUE_TEMPLATE/charting.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/charting.yml b/.github/ISSUE_TEMPLATE/charting.yml index 3c1e689ce..e86b73c12 100644 --- a/.github/ISSUE_TEMPLATE/charting.yml +++ b/.github/ISSUE_TEMPLATE/charting.yml @@ -3,14 +3,18 @@ description: Report an issue with the placement of notes in the game. labels: ["type: charting issue", "status: pending triage"] title: "Charting Issue: " body: + - type: markdown + attributes: + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your issue being addressed! options: - - label: I have read the pinned [Issues Guide](https://github.com/FunkinCrew/Funkin/issues/4050) + - label: I have read the [Contributing Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my issue has already been reported - - label: I have properly named my issue + - label: I have properly titled my issue - type: dropdown attributes: From a9d0c1cb88c9fa356160df3faa7f014017355360 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:13:46 -0700 Subject: [PATCH 11/81] Compiling Help Template --- .github/ISSUE_TEMPLATE/compiling.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/compiling.yml b/.github/ISSUE_TEMPLATE/compiling.yml index c9e364c3e..6dd9e4cf9 100644 --- a/.github/ISSUE_TEMPLATE/compiling.yml +++ b/.github/ISSUE_TEMPLATE/compiling.yml @@ -3,15 +3,19 @@ description: Report an issue with compiling the game. labels: ["type: compilation help", "status: pending triage"] title: "Compiling Help: " body: + - type: markdown + attributes: + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your issue being addressed! options: - - label: I have read the pinned [Issues Guide](https://github.com/FunkinCrew/Funkin/issues/4050) - label: I have followed the [Compiling Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/COMPILING.md) and the [Troubleshooting Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/TROUBLESHOOTING.md) + - label: I have read the [Contributing Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my issue has already been reported - - label: I have properly named my issue + - label: I have properly titled my issue - type: dropdown attributes: From bda5d90bbcc23fbaa639c1fd8c37563ee45cfeda Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:14:29 -0700 Subject: [PATCH 12/81] Crash Template --- .github/ISSUE_TEMPLATE/crash.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index 4f4928997..f315fcc2c 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -3,14 +3,18 @@ description: Report a crash that occurred while playing the game. labels: ["type: major bug", "status: pending triage"] title: "Crash Report: " body: + - type: markdown + attributes: + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your issue being addressed! options: - - label: I have read the pinned [Issues Guide](https://github.com/FunkinCrew/Funkin/issues/4050) + - label: I have read the [Contributing Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my issue has already been reported - - label: I have properly named my issue + - label: I have properly titled my issue - type: dropdown attributes: From ba78ded457f0bbfefe0109c9a013eaf499ec42ae Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:15:56 -0700 Subject: [PATCH 13/81] Enhancement Template --- .github/ISSUE_TEMPLATE/enhancement.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml index 108279534..ac0e758c8 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yml +++ b/.github/ISSUE_TEMPLATE/enhancement.yml @@ -3,14 +3,18 @@ description: Suggest a new feature. labels: ["type: enhancement", "status: pending triage"] title: "Enhancement: " body: + - type: markdown + attributes: + value: "# PLEASE READ THE [CONTRIBUTING GUIDE](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) BEFORE OPENING ISSUES!" + - type: checkboxes attributes: label: Issue Checklist description: Be sure to complete these steps to increase the chances of your suggestion being considered! options: - - label: I have read the pinned [Issues Guide](https://github.com/FunkinCrew/Funkin/issues/4050) + - label: I have read the [Contributing Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) - label: I have checked the Issues/Discussions pages to see if my enhancement has already been suggested - - label: I have properly named my enhancement + - label: I have properly titled my enhancement - type: textarea attributes: From 8126cca29bdd74a4a36236585c80f833f35a2e2d Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:17:49 -0700 Subject: [PATCH 14/81] PR Template --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8e8a45e19..197a0e629 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,4 @@ - + ## Does this PR close any issues? If so, link them below. ## Briefly describe the issue(s) fixed. From 07b6d8f86f5ec70964309b7d08beb29e12d53946 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 13 Feb 2025 17:25:18 -0700 Subject: [PATCH 15/81] adjust link in PR Template --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 197a0e629..15e94daa5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,4 @@ - + ## Does this PR close any issues? If so, link them below. ## Briefly describe the issue(s) fixed. From 7e820f94974746d63252a1e41852a76ce19990f9 Mon Sep 17 00:00:00 2001 From: MidyGamy Date: Thu, 30 Jan 2025 23:43:52 -0400 Subject: [PATCH 16/81] Added missing debug hotkeys --- docs/Funkin' Debug Hotkeys.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index 416c89714..1202698ac 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -29,3 +29,9 @@ Most of this functionality is only available on debug builds of the game! ## **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. +- `CTRL-ALT-SHIFT-M`: ***NO MORE ACCESS***: Locks back songs in Freeplay (those unloked by default aren't locked. Only available on debug builds. +- `CTRL-ALT-SHIFT-R`: ***GREAT SCORE?***: Give the user a hypothetical overridden score, and see if we can maintain that golden P rank. Only available on debug builds. +- `Ctrl-Alt-Shift-P`: ***Character Unlock screen***: Froce the character select screen to play Pico being unlocked. Only available on debug builds. +- `Ctrl-Alt-Shift-N`: ***Character Not seen***: Mark all characters as not seen and make BF glow again as there is a character to unlock. Only available on debug builds. +- `Ctrl-Alt-Shift-E`: ***Dump save data***: Self explainatory. Only available on debug builds. +- `Ctrl-Alt-Shift-L`: ***Force crash***: Force crash and create a log dump. Only available on debug builds. From f5efc1661164714554c29c663a6af93c073af7b8 Mon Sep 17 00:00:00 2001 From: MidyGamy Date: Fri, 31 Jan 2025 10:57:06 -0400 Subject: [PATCH 17/81] Rewording missing Funkin' Debug Hotkeys.md (thx Hundrec) --- docs/Funkin' Debug Hotkeys.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index 1202698ac..e45e7fe40 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -29,9 +29,9 @@ Most of this functionality is only available on debug builds of the game! ## **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. -- `CTRL-ALT-SHIFT-M`: ***NO MORE ACCESS***: Locks back songs in Freeplay (those unloked by default aren't locked. Only available on debug builds. +- `CTRL-ALT-SHIFT-M`: ***NO MORE ACCESS***: Re-locks all songs in Freeplay except those unlocked by default. Only available on debug builds. - `CTRL-ALT-SHIFT-R`: ***GREAT SCORE?***: Give the user a hypothetical overridden score, and see if we can maintain that golden P rank. Only available on debug builds. -- `Ctrl-Alt-Shift-P`: ***Character Unlock screen***: Froce the character select screen to play Pico being unlocked. Only available on debug builds. -- `Ctrl-Alt-Shift-N`: ***Character Not seen***: Mark all characters as not seen and make BF glow again as there is a character to unlock. Only available on debug builds. -- `Ctrl-Alt-Shift-E`: ***Dump save data***: Self explainatory. Only available on debug builds. -- `Ctrl-Alt-Shift-L`: ***Force crash***: Force crash and create a log dump. Only available on debug builds. +- `CTRL-ALT-SHIFT-P`: ***CHARACTER UNLOCK SCREEN***: Forces the Character Select screen to play Pico's unlocking animation. Only available on debug builds. +- `CTRL-ALT-SHIFT-N`: ***CHARACTER NOT SEEN***: Marks all characters as not seen and enables BF's new character unlocked animation in Freeplay. Only available on debug builds. +- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Export a JSON file of your current save data. Only available on debug builds. +- `CTRL-ALT-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. Only available on debug builds. From 33f943a672fb1cb78b90ca3109c2e5a667dcd245 Mon Sep 17 00:00:00 2001 From: MidyGamy Date: Sat, 1 Feb 2025 12:35:31 -0400 Subject: [PATCH 18/81] More dump save info + force crash now accurate --- docs/Funkin' Debug Hotkeys.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index e45e7fe40..cf85c6c59 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -7,6 +7,8 @@ Most of this functionality is only available on debug builds of the game! - `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-ALT-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. (Only works in the Main Menu on debug builds). + - `CTRL-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. ## **Play State** @@ -33,5 +35,4 @@ Most of this functionality is only available on debug builds of the game! - `CTRL-ALT-SHIFT-R`: ***GREAT SCORE?***: Give the user a hypothetical overridden score, and see if we can maintain that golden P rank. Only available on debug builds. - `CTRL-ALT-SHIFT-P`: ***CHARACTER UNLOCK SCREEN***: Forces the Character Select screen to play Pico's unlocking animation. Only available on debug builds. - `CTRL-ALT-SHIFT-N`: ***CHARACTER NOT SEEN***: Marks all characters as not seen and enables BF's new character unlocked animation in Freeplay. Only available on debug builds. -- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Export a JSON file of your current save data. Only available on debug builds. -- `CTRL-ALT-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. Only available on debug builds. +- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Prompts the user to save their save data as a JSON file, so its contents can be viewed. Only available on debug builds. \ No newline at end of file From 894d0743c9baa3b608d9b39c10820d9b731cb350 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Sun, 16 Feb 2025 18:55:39 -0700 Subject: [PATCH 19/81] Table of Contents for CONTRIBUTING.md --- docs/CONTRIBUTING.md | 53 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index b25cbb190..2a7904a72 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,6 +1,50 @@ # Contributing Welcome to the Contributing Guide! -You can contribute to the Funkin' repository by opening issues or pull requests. This guide will cover best practices for each type of contribution. +You can contribute to the Funkin' repository by opening issues or pull requests. + +This guide will cover best practices for each type of contribution. + +# Table of Contents +
+Contents + +[Part 1: Etiquette](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#part-1-etiquette) + +
+Part 2: Issues + +* [Requirements](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#requirements) + +* [Rejected Features](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#rejected-features) + +* [Issue Types](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#issue-types) + +* [Before You Submit...](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#before-you-submit) + +
+ +
+ +Part 3: Pull Requests + +* [Choosing a base branch](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#choosing-a-base-branch) + +* [Merge conflicts and rebasing](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#merge-conflicts-and-rebasing) + +* [Code PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#code-prs) + +* [Documentation PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#documentation-prs) + +* [GitHub PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#github-prs) + +* [funkin.assets PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#funkinassets-prs) + +
+ +[Closing](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#closing) + +
+ # Part 1: Etiquette - Be respectful to one another. We're here to help each other out! @@ -192,7 +236,9 @@ Here are some guidelines for writing comments in your code: ## Documentation PRs Documentation-based PRs make changes such as **fixing typos** or **adding new information** in documentation files. + This involves modifying one or several of the repository’s `.md` files, found throughout the repository. + Make sure your changes are easy to understand and formatted consistently to maximize clarity and readability. > [!CAUTION] @@ -229,16 +275,21 @@ Make sure your changes are easy to understand and formatted consistently to maxi ## GitHub PRs GitHub-related PRs make changes such as **tweaking Issue Templates** or **updating the repository’s workflows**. + This involves modifying one or several of the repository’s `.yml` files, or any other file in the `.github` folder. + Please test these changes on your fork’s main branch to avoid breaking anything in this repository (e.g. GitHub Actions, issue templates, etc.)! ## funkin.assets PRs The `assets` submodule has its own repository called [funkin.assets](https://github.com/FunkinCrew/funkin.assets). + If you only modify files in the `assets` folder, open a PR in the `funkin.assets` repository instead of the main repository. + If you simultaneously modify files from both repositories, then open two separate PRs and explain the connection in your PR descriptions. Be sure to choose `main` as the base branch for `funkin.assets` PRs, as no `develop` branch exists for that repository. # Closing Thank you for reading the Contributing Guide. + We look forward to seeing your contributions to the game! From bd3acc319cab1ec12b70a3bcdb21757f727e5cb9 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Sat, 22 Feb 2025 13:38:08 -0700 Subject: [PATCH 20/81] Remove issue reopening action --- .github/workflows/label-issue.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/label-issue.yml diff --git a/.github/workflows/label-issue.yml b/.github/workflows/label-issue.yml deleted file mode 100644 index 7430f161c..000000000 --- a/.github/workflows/label-issue.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: "Issue Labeler" -on: - issues: - types: - - opened - - reopened - - edited - -jobs: - # When an issue is opened, detect if it has an empty body or incomplete issue form. - # If it does, close the issue immediately. - empty-issues: - name: Close empty issues - runs-on: ubuntu-latest - steps: - - name: Run empty issues closer action - uses: rickstaa/empty-issues-closer-action@v1 - env: - github_token: ${{ secrets.GITHUB_TOKEN }} - with: - close_comment: Closing this issue because it appears to be empty. Please update the issue for it to be reopened. - open_comment: Reopening this issue because the author provided more information. From 6c9c3e418a047df43e14a0f94a008e569ccd6dbc Mon Sep 17 00:00:00 2001 From: Hundrec Date: Sun, 9 Mar 2025 21:52:51 -0600 Subject: [PATCH 21/81] Add more rejected features to Contributing Guide --- docs/CONTRIBUTING.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 2a7904a72..13e2e3543 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -71,13 +71,21 @@ Here's a list of commonly suggested features and the reasons why they won't be a | Combo Break + Accuracy Displays | https://github.com/FunkinCrew/Funkin/pull/2681#issuecomment-2156308982 | | Toggleable Ghost Tapping | https://github.com/FunkinCrew/Funkin/pull/2564#issuecomment-2119701802 | | Perfectly Centered Strumlines | _same as above^_ | +| MultiKey, 9k, More than 4 keys, etc. | https://github.com/FunkinCrew/Funkin/issues/4243#issuecomment-2692371969 | | Losing Icons for DD and Parents | https://github.com/FunkinCrew/Funkin/issues/3048#issuecomment-2243491536 | | Playable GF / Speaker BF / Speaker Pico | https://github.com/FunkinCrew/Funkin/issues/2953#issuecomment-2216985230 | +| Fresh (Chill Mix) as Title Screen Music | https://github.com/FunkinCrew/Funkin/pull/4282#issuecomment-2709334718 | | Adjusted Difficulty Ratings | https://github.com/FunkinCrew/Funkin/issues/2781#issuecomment-2172053144 | -| Countdown after Unpausing | https://github.com/FunkinCrew/Funkin/issues/2721#issuecomment-2159330106 | +| Difficulty Ratings above 20 | https://github.com/FunkinCrew/Funkin/issues/3075#issuecomment-2368984497 | +| Ability to Reset a Song's Score | https://github.com/FunkinCrew/Funkin/issues/3916#issuecomment-2525408261 | +| Quick Restart Keybind (not R) | https://github.com/FunkinCrew/Funkin/issues/3268#issuecomment-2351095232 | +| Countdown after Unpausing Song | https://github.com/FunkinCrew/Funkin/issues/2721#issuecomment-2159330106 | +| 4:3 Aspect Ratio for Week 6 | https://github.com/FunkinCrew/Funkin/issues/3840#issuecomment-2689158438 | +| "Philly Glow" Effect from Psych Engine | https://github.com/FunkinCrew/Funkin/issues/3788#issuecomment-2688966982 | | Importing Charts from Psych Engine (and other mod content) | https://github.com/FunkinCrew/Funkin/issues/2586#issuecomment-2125733327 | | Backwards Compatibility for Modding | https://github.com/FunkinCrew/Funkin/issues/3949#issuecomment-2608391329 | -| Lua Support | https://github.com/FunkinCrew/Funkin/issues/2643#issuecomment-2143718093 | +| Lua Support | https://github.com/FunkinCrew/Funkin/issues/2643#issuecomment-2143718093 | + ## Issue Types Choose the issue template that best suits your needs! From df353a1ee8a6c79fd825dee7b99b2fe47b8d475d Mon Sep 17 00:00:00 2001 From: Hyper_ Date: Wed, 25 Sep 2024 22:16:21 -0300 Subject: [PATCH 22/81] docs: Some Linux troubleshooting --- docs/COMPILING.md | 4 +++- docs/TROUBLESHOOTING.md | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/COMPILING.md b/docs/COMPILING.md index 6df1232b1..f193b7830 100644 --- a/docs/COMPILING.md +++ b/docs/COMPILING.md @@ -13,7 +13,7 @@ - NOTE: By performing this operation, you are downloading Content which is proprietary and protected by national and international copyright and trademark laws. See [the LICENSE.md file for the Funkin.assets](https://github.com/FunkinCrew/funkin.assets/blob/main/LICENSE.md) repo for more information. 5. Run `haxelib --global install hmm` and then `haxelib --global run hmm setup` to install hmm.json 6. Run `hmm install` to install all haxelibs of the current branch -7. Run `haxelib run lime setup` to set up lime +7. Run `haxelib run lime setup` to set up Lime 8. Perform additional platform setup - For Windows, download the [Visual Studio Build Tools](https://aka.ms/vs/17/release/vs_BuildTools.exe) - When prompted, select "Individual Components" and make sure to download the following: @@ -21,6 +21,8 @@ - Windows 10/11 SDK - Mac: [`lime setup mac` Documentation](https://lime.openfl.org/docs/advanced-setup/macos/) - Linux: [`lime setup linux` Documentation](https://lime.openfl.org/docs/advanced-setup/linux/) + - Note: Funkin's fork currently doesn't come with the necessary binaries so you'll have to rebuild Lime. See [Troubleshooting](TROUBLESHOOTING.md#lime-related-issues). + - One of Funkin's dependencies uses libVLC, which requires you to install some packages to be able to compile: `sudo apt install libvlc-dev libvlccore-dev libvlccore9` - HTML5: Compiles without any extra setup 9. If you are targeting for native, you may need to run `lime rebuild ` and `lime rebuild -debug` 10. `lime test ` to build and launch the game for your platform (for example, `lime test windows`) diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index fd2bee464..e85ef3138 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -29,3 +29,22 @@ - You did not clone the repository correctly! Copy the path to your `funkin` folder and run `cd the\path\you\copied`. Then follow the compilation guide starting from **Step 4**. - Other compilation issues may be caused by installing bad library versions. Try deleting the `.haxelib` folder and following the guide starting from **Step 5**. + +## Lime Related Issues +- Segmentation fault and/or crash after `source/funkin/Conductor.hx:538: Done mapping time changes: [SongTimeChange(0ms,102bpm)]` line appears + - Caused by using official Lime instead of Funkin's fork. Reinstalling Lime should fix it. + - NOTE: Make sure you do this via `hmm` (e.g `hmm reinstall -f lime`) to guarantee you get Funkin's version of Lime. + +- `Uncaught exception - Could not find lime.ndll. This file is provided with Lime's Haxelib releases, but not via Git. Please copy it from Lime's latest Haxelib release into either .haxelib/lime/git/ndll/ or .haxelib/lime/git/ndll/, as appropriate for your system. Advanced users may run "lime rebuild cpp" instead.` + - Usually specific to Linux. Running the commands below should fix it. + ``` + cd .haxelib/lime/git + git submodule init + git submodule sync + git submodule update + cd ../../.. + # Note: The packages here might have different names depending on your distro + sudo apt install libgl1-mesa-dev libglu1-mesa-dev g++ g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev + lime rebuild cpp -64 -release -clean + ``` + - For other platforms you can download pre-built binaries from [Funkin's Lime](https://github.com/FunkinCrew/lime/tree/dev-funkin/ndll). From 9708e20dd4406d0b034c7d1e38ee25b3dd9bc30d Mon Sep 17 00:00:00 2001 From: Hyper_ <40342021+NotHyper-474@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:25:23 -0300 Subject: [PATCH 23/81] Minor adjustments Some reformatting and shortening --- docs/TROUBLESHOOTING.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index e85ef3138..b17ee72b1 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -31,11 +31,11 @@ - Other compilation issues may be caused by installing bad library versions. Try deleting the `.haxelib` folder and following the guide starting from **Step 5**. ## Lime Related Issues -- Segmentation fault and/or crash after `source/funkin/Conductor.hx:538: Done mapping time changes: [SongTimeChange(0ms,102bpm)]` line appears - - Caused by using official Lime instead of Funkin's fork. Reinstalling Lime should fix it. - - NOTE: Make sure you do this via `hmm` (e.g `hmm reinstall -f lime`) to guarantee you get Funkin's version of Lime. +- Segmentation fault and/or crash after `Done mapping time changes: [SongTimeChange(0ms,102bpm)]` + - Caused by using official Lime instead of Funkin's fork. Reinstalling Lime should fix it. + (NOTE: Make sure you do this via `hmm` (e.g `hmm reinstall -f lime`) to guarantee you get Funkin's version of Lime.) -- `Uncaught exception - Could not find lime.ndll. This file is provided with Lime's Haxelib releases, but not via Git. Please copy it from Lime's latest Haxelib release into either .haxelib/lime/git/ndll/ or .haxelib/lime/git/ndll/, as appropriate for your system. Advanced users may run "lime rebuild cpp" instead.` +- `Uncaught exception - Could not find lime.ndll.` ... `Advanced users may run "lime rebuild cpp" instead.` - Usually specific to Linux. Running the commands below should fix it. ``` cd .haxelib/lime/git @@ -43,8 +43,8 @@ git submodule sync git submodule update cd ../../.. - # Note: The packages here might have different names depending on your distro + # Note: The command and packages here might be different depending on your distro. sudo apt install libgl1-mesa-dev libglu1-mesa-dev g++ g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev lime rebuild cpp -64 -release -clean ``` - - For other platforms you can download pre-built binaries from [Funkin's Lime](https://github.com/FunkinCrew/lime/tree/dev-funkin/ndll). + For Windows or MacOS you can download pre-built binaries from [Funkin's Lime](https://github.com/FunkinCrew/lime/tree/dev-funkin/ndll). From 6e44484a1adaea0b8323a7c1c33343272fc892d8 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 11 Mar 2025 08:15:31 -0600 Subject: [PATCH 24/81] Changelog overhaul for 0.5.3, 0.5.2, 0.5.1 Plus added line breaks to match Keep A Changelog's format --- CHANGELOG.md | 331 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 226 insertions(+), 105 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee9ff9e94..63b3b2461 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,80 +6,92 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.5.3] - 2024-10-18 This patch resolves a critical issue which could cause user's save data to become corrupted. It is recommended that users switch to this version immediately and avoid using version 0.5.2. + ### Fixed + - Fixed a critical issue in which the Stage Editor theme value could not be parsed by older versions of the game, resulting in all save data being destroyed. - Added a check which prevents save data from being loaded if it is corrupted rather than overriding it. - `optionsStageEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues. - In the future, Enum values should not be used in order to prevent incompatibilities caused by introducing new types to the save data that older versions cannot parse. -- `optionsChartEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues. - `optionsChartEditor.chartEditorLiveInputStyle` in the save data converted from an Enum to a String to fix save data compatibility issues. - Fixed an issue where some publicly distributed builds of the game were debug builds instead of release builds. ## [0.5.2] - 2024-10-11 + ### Added + - Added InverseDotsShader that emulates flash selections ([097dbf5](https://github.com/FunkinCrew/Funkin/commit/097dbf5bb4346d431d8ca9f0ec4bc5b5e6f4523f)) - by @ninjamuffin99 -- Added a new reworked Stage Editor ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @JustKolosaki in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) -- Added the `color` attribute to stage prop JSON data to allow them to be tinted without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @JustKolosaki -- Added the `angle` attribute to stage prop JSON data to allow them to be rotated without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @JustKolosaki -- Added the `blend` attribute to the stage prop JSON data to allow blend modes to be applied without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @JustKolosaki +- Added a new reworked Stage Editor ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `color` attribute to stage prop JSON data to allow them to be tinted without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `angle` attribute to stage prop JSON data to allow them to be rotated without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `blend` attribute to the stage prop JSON data to allow blend modes to be applied without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) + ### Changed -- (docs) Delete Modding.md since we have a separate modding documentation ([a42240e](https://github.com/FunkinCrew/Funkin/commit/a42240e6a595d33034f2c887bf38a350d1fa0f15)) - by @AbnormalPoof in [#3651](https://github.com/FunkinCrew/Funkin/pull/3651) -- (docs) Create a git cliff template for easier changelog stuff ([91b4544](https://github.com/FunkinCrew/Funkin/commit/91b4544f7ebc51485e3e28c3d716ba6ee69ad885)) - by @ninjamuffin99 in [#3652](https://github.com/FunkinCrew/Funkin/pull/3652) -- (docs) Add additional `variation` input parameter to `Save.hasBeatenSong()` to allow usage of the function by inputting a variation id ([4fa9a0d](https://github.com/FunkinCrew/Funkin/commit/4fa9a0daaa67e0977460b147bd1f74a118e3e2a5)) - by @ninjamuffin99 -- (docs) Added modding docs link in readme ([4b54118](https://github.com/FunkinCrew/Funkin/commit/4b54118731e26118111e06558ae4853c577fe4bb)) - by @Cartridge-Man in [#3082](https://github.com/FunkinCrew/Funkin/pull/3082) -- (docs) Fix some misspellings and grammar in code documentation ([2175bea](https://github.com/FunkinCrew/Funkin/commit/2175beaa651e009332202985be4b7eb4ed36e5a4)) - by @Hundrec in [#3477](https://github.com/FunkinCrew/Funkin/pull/3477) -- (docs) Improvements to Github Issues templates ([399869c](https://github.com/FunkinCrew/Funkin/commit/399869cdccc9c5ac27cecfbcdc33c3d7eb4b348c)) - by @Hundrec in [#3458](https://github.com/FunkinCrew/Funkin/pull/3458) + +- (docs) Added link to modding docs in README ([4b54118](https://github.com/FunkinCrew/Funkin/commit/4b54118731e26118111e06558ae4853c577fe4bb)) - by @Cartridge-Man in [#3082](https://github.com/FunkinCrew/Funkin/pull/3082) +- (docs) Deleted Modding.md since we have a separate modding documentation ([a42240e](https://github.com/FunkinCrew/Funkin/commit/a42240e6a595d33034f2c887bf38a350d1fa0f15)) - by @AbnormalPoof in [#3651](https://github.com/FunkinCrew/Funkin/pull/3651) +- (docs) Fixed some misspellings and grammar in code documentation ([2175bea](https://github.com/FunkinCrew/Funkin/commit/2175beaa651e009332202985be4b7eb4ed36e5a4)) - by @Hundrec in [#3477](https://github.com/FunkinCrew/Funkin/pull/3477) +- (docs) Improvements to GitHub Issue templates ([399869c](https://github.com/FunkinCrew/Funkin/commit/399869cdccc9c5ac27cecfbcdc33c3d7eb4b348c)) - by @Hundrec in [#3458](https://github.com/FunkinCrew/Funkin/pull/3458) +- (docs) Created a git cliff template for easier changelog stuff ([91b4544](https://github.com/FunkinCrew/Funkin/commit/91b4544f7ebc51485e3e28c3d716ba6ee69ad885)) - by @ninjamuffin99 in [#3652](https://github.com/FunkinCrew/Funkin/pull/3652) +- (docs) Added additional `variation` input parameter to `Save.hasBeatenSong()` to allow usage of the function by inputting a variation id ([4fa9a0d](https://github.com/FunkinCrew/Funkin/commit/4fa9a0daaa67e0977460b147bd1f74a118e3e2a5)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) + ### Fixed -- Fix the user song offsets being applied incorrectly, causing stuttering or skipping ([410cfe9](https://github.com/FunkinCrew/Funkin/commit/410cfe972d6df9de4d4d128375cf8380c4f06d92)) - by @JustKolosaki in [#3546](https://github.com/FunkinCrew/Funkin/pull/3546) in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) -- Fixed issues with variation / difficulty loading for Freeplay Menu which caused some songs to disappear ([c0314c8](https://github.com/FunkinCrew/Funkin/commit/c0314c85ecd5116641aff3de8e9153f7fe48e79c)) - by @ninjamuffin99 -- Pico's songs now display properly on the Freeplay Menu ([1d2bd61](https://github.com/FunkinCrew/Funkin/commit/1d2bd61119e5f418df7f11d7ef2a0fdedee17d3d)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) -- Exiting the chart editor doesn't crash the game anymore ([f52472a](https://github.com/FunkinCrew/Funkin/commit/f52472a4767388b22cfbab0f5f7860f6e6762856)) - by @EliteMasterEric and @ianharrigan in [#3519](https://github.com/FunkinCrew/Funkin/pull/3519) -- Disable flickering when attempting to select FPS in the options menu ([b2647fe](https://github.com/FunkinCrew/Funkin/commit/b2647fe09f5281ce7074b26d47bc1524764168ee)) - by @lemz1 in [#3629](https://github.com/FunkinCrew/Funkin/pull/3629) -- Anti-alias / smooth the volume sound tray ([e66290c](https://github.com/FunkinCrew/Funkin/commit/e66290c55f7141402223644f06ec8a69edeee089)) - by @Kn1ghtNight in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) -- Don't restart the FreeplayState song preview when changing the difficulty within the same variation ([903b3fc](https://github.com/FunkinCrew/Funkin/commit/903b3fc59905a70802618a1cd67407722ea956ed)) - by @JustKolosaki in [#3587](https://github.com/FunkinCrew/Funkin/pull/3587) -- Character Select cursor moves properly at lower framerates ([ab5bda3](https://github.com/FunkinCrew/Funkin/commit/ab5bda3ee573a6e03595ec6941e6de38df851889)) - by @ninjamuffin99 in [#3507](https://github.com/FunkinCrew/Funkin/pull/3507) -- Stop allowing F1 to create more than one help dialog window in the Charting Editor ([777978f](https://github.com/FunkinCrew/Funkin/commit/777978f5a544e1b7c89b47dcc365f734eb6d0df1)) - by @amyspark-ng in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) -- Main menu music doesn't cut out when switching states anymore. ([711e0a6](https://github.com/FunkinCrew/Funkin/commit/711e0a6b7547eb04113e9318dab900f01ad576a5)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) -- The dialog now shows up on the animation debugger view ([1fde59f](https://github.com/FunkinCrew/Funkin/commit/1fde59f999eac94eb10fc22094885de2f5310705)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) -- Center preloader 'fnf' and 'dsp' text so it doesn't clip anymore ([165ad60](https://github.com/FunkinCrew/Funkin/commit/165ad6015539a295e9eefdaef291c312e9566b26)) - by @Burgerballs in [#3567](https://github.com/FunkinCrew/Funkin/pull/3567) -- `Song.getFirstValidVariation()` now properly takes into account multiple variations/difficulty input ([d2e2987](https://github.com/FunkinCrew/Funkin/commit/d2e29879fe2acc6febfe0f335f655b741d630c34)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) + +- Input offsets no longer cause songs to stutter or skip ([410cfe9](https://github.com/FunkinCrew/Funkin/commit/410cfe972d6df9de4d4d128375cf8380c4f06d92)) - by @KoloInDaCrib in [#3546](https://github.com/FunkinCrew/Funkin/pull/3546) +- Exiting the Input Offset menu no longer crashes the game ([39b1a42](https://github.com/FunkinCrew/Funkin/commit/39b1a42cfeafe2b7be8b66e2fe529e853d9ae197)) - by @lemz1 in [#3493](https://github.com/FunkinCrew/Funkin/pull/3493) +- Pico's songs now display properly in the Freeplay Menu ([1d2bd61](https://github.com/FunkinCrew/Funkin/commit/1d2bd61119e5f418df7f11d7ef2a0fdedee17d3d)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- Fixed issues with variation/difficulty loading for Freeplay Menu which caused some songs to disappear ([c0314c8](https://github.com/FunkinCrew/Funkin/commit/c0314c85ecd5116641aff3de8e9153f7fe48e79c)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- `Song.getFirstValidVariation()` now properly takes into account multiple variation/difficulty inputs ([d2e2987](https://github.com/FunkinCrew/Funkin/commit/d2e29879fe2acc6febfe0f335f655b741d630c34)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- Song previews no longer restart when changing difficulties within the same variation ([903b3fc](https://github.com/FunkinCrew/Funkin/commit/903b3fc59905a70802618a1cd67407722ea956ed)) - by @KoloInDaCrib in [#3587](https://github.com/FunkinCrew/Funkin/pull/3587) +- Main menu music no longer cuts out when switching states ([711e0a6](https://github.com/FunkinCrew/Funkin/commit/711e0a6b7547eb04113e9318dab900f01ad576a5)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) +- Centered preloader 'fnf' and 'dsp' text so they don't clip anymore ([165ad60](https://github.com/FunkinCrew/Funkin/commit/165ad6015539a295e9eefdaef291c312e9566b26)) - by @Burgerballs in [#3567](https://github.com/FunkinCrew/Funkin/pull/3567) +- FPS setting in options menu no longer flickers when selected ([b2647fe](https://github.com/FunkinCrew/Funkin/commit/b2647fe09f5281ce7074b26d47bc1524764168ee)) - by @lemz1 in [#3629](https://github.com/FunkinCrew/Funkin/pull/3629) +- Volume sound tray is now anti-aliased/smoothed ([e66290c](https://github.com/FunkinCrew/Funkin/commit/e66290c55f7141402223644f06ec8a69edeee089)) - by @Kn1ghtNight in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) +- Fixed looping animations for modded StrumlineNote sprites ([bc546e8](https://github.com/FunkinCrew/Funkin/commit/bc546e86aa77ffc795b3f079de5f590289a9c583)) - by @DaWaterMalone in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) +- Stopped allowing inputs after selecting a character in Character Select ([dbf66ac](https://github.com/FunkinCrew/Funkin/commit/dbf66ac250137262866d75f7c1387645b35d88d0)) - by @ACrazyTown in [#3398](https://github.com/FunkinCrew/Funkin/pull/3398) +- Player and girlfriend no longer disappear or overlap themselves in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Player no longer enters twice after entering Character Select or when spamming buttons ([30a9887](https://github.com/FunkinCrew/Funkin/commit/30a98871367b494c85934cd3fcfa91eeb774a7d5)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Wrong girlfriend no longer appears in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Cursor now updates properly when moving and selecting in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Cursor now moves properly at lower framerates in Character Select ([ab5bda3](https://github.com/FunkinCrew/Funkin/commit/ab5bda3ee573a6e03595ec6941e6de38df851889)) - by @ninjamuffin99 in [#3507](https://github.com/FunkinCrew/Funkin/pull/3507) +- Exiting the Chart Editor no longer crashes the game ([f52472a](https://github.com/FunkinCrew/Funkin/commit/f52472a4767388b22cfbab0f5f7860f6e6762856)) - by @EliteMasterEric and @ianharrigan in [#3519](https://github.com/FunkinCrew/Funkin/pull/3519) +- Properly format the millisecond counter in the Chart Editor playbar ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) +- Pressing F1 multiple times no longer creates more than one help window in the Chart Editor ([777978f](https://github.com/FunkinCrew/Funkin/commit/777978f5a544e1b7c89b47dcc365f734eb6d0df1)) - by @amyspark-ng in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) +- The dialog box now shows up in the Animation Editor ([1fde59f](https://github.com/FunkinCrew/Funkin/commit/1fde59f999eac94eb10fc22094885de2f5310705)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) - (debug) No more fullscreening when typing "F" in the flixel debugger console ([29b6763](https://github.com/FunkinCrew/Funkin/commit/29b6763290df05d42039806f3d142740568c80f0)) - by @ninjamuffin99 -- Fix crash in LatencyState when exiting / cleaning up state data ([39b1a42](https://github.com/FunkinCrew/Funkin/commit/39b1a42cfeafe2b7be8b66e2fe529e853d9ae197)) - by @lemz1 in [#3493](https://github.com/FunkinCrew/Funkin/pull/3493) -- Add additional classes to Polymod blacklist for security ([b0b73c8](https://github.com/FunkinCrew/Funkin/commit/b0b73c83994f33118c6a69550da9ec8ec1c07adc)) - by @EliteMasterEric in [#3558](https://github.com/FunkinCrew/Funkin/pull/3558) -- Stop allowing inputs after selecting a character ([dbf66ac](https://github.com/FunkinCrew/Funkin/commit/dbf66ac250137262866d75f7c1387645b35d88d0)) - by @ACrazyTown in [#3398](https://github.com/FunkinCrew/Funkin/pull/3398) -- Fix conflict with modded StrumlineNote sprite looping animation ([bc546e8](https://github.com/FunkinCrew/Funkin/commit/bc546e86aa77ffc795b3f079de5f590289a9c583)) - by @DaWaterMalone in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) -- Properly format the millisecond counter in the chart editor playbar ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) -- Fixed an issue where the player and girlfriend would disappear or overlap themselves in Character Select ([community fix by @gamerbross](https://github.com/FunkinCrew/Funkin/pull/3457)) -- Fixed an issue where the game would show the wrong girlfriend in Character Select ([community fix by @gamerbross](https://github.com/FunkinCrew/Funkin/pull/3457)) -- Fixed an issue where the cursor wouldn't update properly in Character Select ([community fix by @gamerbross](https://github.com/FunkinCrew/Funkin/pull/3457)) -- Fixed an issue where the player would display double after entering character select or when spamming buttons ([community fix by @gamerbross](https://github.com/FunkinCrew/Funkin/pull/3457)) +- Added additional classes to Polymod blacklist for security ([b0b73c8](https://github.com/FunkinCrew/Funkin/commit/b0b73c83994f33118c6a69550da9ec8ec1c07adc)) - by @EliteMasterEric in [#3558](https://github.com/FunkinCrew/Funkin/pull/3558) ## New Contributors for 0.5.2 -* @JustKolosaki made their first contribution in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) + * @Kn1ghtNight made their first contribution in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) -* @DaWaterMalone made their first contribution in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) -* @amyspark-ng made their first contribution in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) * @Cartridge-Man made their first contribution in [#3082](https://github.com/FunkinCrew/Funkin/pull/3082) +* @KoloInDaCrib made their first contribution in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) * @afreetoplaynoob made their first contribution in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) +* @amyspark-ng made their first contribution in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) +* @DaWaterMalone made their first contribution in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) ## [0.5.1] - 2024-09-30 + ### Added + - Readded the Merch button to the main menu. - Click it to check out our Makeship campaign! - Added Discord Rich Presence support. People can now see what song you are playing from Discord! - We'll get mod support working for this eventually. - Added an FPS limit option to the Preferences menu. - You can now change how high the game tries to push your frame rate, from as little as 30 to as high as 300. -- Added support for the Tracy instrumenation-based profiling tool in development environments. Enable it with the `-DFEATURE_DEBUG_TRACY` compilation flag. +- Added support for the Tracy instrumentation-based profiling tool in development environments. Enable it with the `-DFEATURE_DEBUG_TRACY` compilation flag. - For the people who aren't nerds, this is a tool for tracking down performance issues! - Playable Character data now defines an asset location for an Animate Atlas to display Girlfriend. - This includes the option to display a visualizer, if configured correctly. - Separated the Perfect and Perfect (Gold) animations in the Playable Character data. - Base game just uses the same animation for both, but modders can split the animations up on their custom characters now. -- Added a bunch of Flash project files from the Weekend 1 and Playable Pico updates to the `Funkin.art` repository. +- Added a bunch of Flash project files from the Weekend 1 and Playable Pico updates to the `funkin.art` repository. - Added the `flipX` and `flipY` parameters to props in the Stage data. ([community feature by AbnormalPoof](https://github.com/FunkinCrew/Funkin/pull/3474)) + ### Changed + - The game's mod API version check is now more dynamic. - The update accepts mods with API version `0.5.0` as well as `0.5.1`. - Pico is no longer unlocked for all players automatically. @@ -89,64 +101,69 @@ This patch resolves a critical issue which could cause user's save data to becom - The game now complains if you create a song variation with symbols in the name. - Switched the force crash keybind from Ctrl-Shift-L to Ctrl-Alt-Shift-L. - Added some additional functions to `funkin.Assets` after `openfl.utils.Assets` had to get blacklisted from scripts. + ### Fixed -- Fixed an issue where DadBattle (Pico Mix) was not properly credited to `TeraVex (ft. Saruky)`. -- Fixed an issue where DadBattle (Pico Mix) was missing charts on the Normal and Easy difficulty. -- Fixed an issue where Spookeez (Pico Mix) was not properly credited to `Six Impala (ft. Saster)`. -- Fixed an issue where the "Shit!" judgement would display with anti-aliasing in Week 6. -- Fixed an issue where Pico Erect could be played with different instrumentals. -- Fixed an issue where Pico would not play his shooting animations in Stress. -- Fixed an issue where Freeplay would display no custom songs when switching characters. -- Fixed an issue where Freeplay would sometimes display the wrong text on the capsules. -- Fixed an issue where duplicate difficulties from custom variations wouldn't display properly in Freeplay. -- Fixed an issue where custom note styles would sometimes just use default values rather than using the fallback note style. -- Fixed an issue where custom note styles would randomly fail to fetch information about their fallback note style. -- Fixed an issue where the Screenshots and Chart Editor binds displayed in the controls menu on Web builds (where they are disabled). -- Fixed an issue where the Stage Editor bind displayed in the controls menu even when the feature was disabled. -- Fixed an issue where the Freeplay Character Select keybind displayed weird in the keybinds menu. -- Fixed an issue where setting the input offset or visual offset too high would cause the song to skip. -- Fixed an issue where video cutscenes would not scale their volume properly. -- Fixed an issue where Cocoa Erect (Erect difficulty) had a tap note stacked on top of a hold note, -- Fixed an issue where the game would stutter when playing on the Week 5 Remix stage. -- Fixed an issue where the save data version number wouldn't get written to save data properly. -- Fixed an issue where the example mod could not be loaded. -- Fixed an issue where a script error would display when entering Blazin'. -- Fixed an issue where pressing F5 to force reload a song would sometimes cause the game to crash. -- Fixed an issue where animations on Animate Atlas characters would throw a bunch of warnings in the console. -- Fixed an issue where characters with high offsets would shift over after the player dies or restarts. -- Fixed an issue where Pico wouldn't play out his full burp animation in South (Pico Mix). -- Fixed an issue where Results screen audio could continue into Freeplay or even gameplay. -- Fixed an issue where some audio tracks would get destroyed even if they were flagged as persistent. -- Fixed an issue where the audio track would stay muted if you missed a note just before Pico burps. -- Fixed an issue where the curtains in Week 1 would display in front of larger characters. -- Fixed an issue where Boyfriend wouldn't play his death animation properly on Week 2's Remix stage. -- Fixed an issue in Freeplay where the clear % would not display after switching characters. -- Fixed an issue in Freeplay where character remixes would display the base song's highscore. -- Fixed an issue where Pico would become locked every time the game starts, and you would have to watch the unlock animation each game boot. + +- DadBattle (Pico Mix) is now properly credited to `TeraVex (ft. Saruky)`. +- DadBattle (Pico Mix) now has charts for Normal and Easy difficulties. +- Spookeez (Pico Mix) is now properly credited to `Six Impala (ft. Saster)`. +- The "Shit!" judgement no longer displays with anti-aliasing in Week 6. +- Pico Erect can no longer be played with different instrumentals. +- Pico now plays his shooting animations in Stress. +- Freeplay now displays custom songs when switching characters. +- Freeplay no longer displays the wrong text on capsules. +- Duplicate difficulties from custom variations now display properly in Freeplay. +- Custom note styles no longer sometimes use default values rather than the fallback note style +- Custom note styles no longer randomly fail to fetch information about their fallback note style. +- Screenshots and Chart Editor binds no longer display in the controls menu on Web builds (where they are disabled). +- Stage Editor bind no longer displays in the controls menu even when the feature is disabled. +- Freeplay Character Select keybind no longer displays strangely in the controls menu. +- Setting the input offset or visual offset to high values no longer causes the song to skip. +- Video cutscenes now scale their volume properly. +- The game no longer stutters when playing on the Week 5 Remix stage. +- The save data version number is now written to the save data properly. +- The example mod can now be loaded. +- Entering Blazin' no longer displays a script error. +- Pressing F5 to force reload a song no longer occasionally causes the game to crash. +- Animations on Animate Atlas characters no longer throw a bunch of warnings in the console. +- Characters with high offsets no longer shift over after the player dies or restarts. +- The audio track now unmutes if you miss a note just before Pico burps. +- Pico now plays out his full burp animation in South (Pico Mix). +- Removed a tap note stacked on top of a hold note in Cocoa Erect (Erect difficulty). +- Results screen audio no longer continues into Freeplay or gameplay. +- Audio tracks no longer get destroyed if they are flagged as persistent. +- The curtains in Week 1 no longer display in front of larger characters. +- Boyfriend now plays his death animation properly on the Week 2 Remix stage. +- The clear % now displays in Freeplay after switching characters. +- Character remixes no longer display the base song's highscore in Freeplay. +- Pico is no longer locked every time the game starts, and you no longer have to watch the unlock animation each game boot. - The animation should now play only once per save file. -- Fixed an issue where Spirit's trail in Week 6 would not display correctly. -- Fixed an issue where the Input Offsets menu would crash when entering it before playing a song on web builds. -- Fixed an issue where the Results screen would spam the percentage tick noise instead of playing when the value changes. -- Fixed an issue where parts of the Chart Editor could not be interacted with. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3337)) -- Fixed an issue where classic FocusCamera song events could cause the camera to snap in place. ([community fix by nebulazorua](https://github.com/FunkinCrew/Funkin/pull/2331)) -- Fixed an issue where achieving the same rank on a song (but a different clear %) would override your clear %, even if it was lower. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3019)) -- Fixed an issue where the FPS counter would display even if Debug Display was turned off. ([community fix by Lethrial](https://github.com/FunkinCrew/Funkin/pull/3356)) -- Fixed an issue where selecting the area to the left of the Chart Editor would select some of the player's notes ([community fix by NotHyper-474](https://github.com/FunkinCrew/Funkin/pull/3093)) -- Fixed an issue where pixel icons in the Chart Editor would not display correctly. ([community fix by Techniktil](https://github.com/FunkinCrew/Funkin/pull/3339)) -- Fixed an issue where `Stage.addCharacter` would not properly assign the `characterType`. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3357)) -- Fixed an issue where players could interact with Character Select during the unlock sequence, causing a crash. ([community fix by ActualMandM](https://github.com/FunkinCrew/Funkin/pull/3355)) -- Fixed an issue where hold notes in Week 6 were not scaled/positioned correctly. ([community fix by dombomb64](https://github.com/FunkinCrew/Funkin/pull/3351)) -- Fixed an issue where audio offets would not interact with the Chart Editor properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3384)) -- Fixed an issue where fetching Modules during the `onDestroy` event would fail at random. ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/3131)) -- Fixed an issue where `onSubStateOpenEnd` and `onSubStateCloseEnd` script events would not always get called. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3138)) +- Spirit's trail in Week 6 now displays correctly. +- The Input Offsets menu no longer crashes when entering it before playing a song on web builds. +- The Results screen now plays the percentage tick sound when the value changes instead of spamming the sound. +- The Chart Editor can now be interacted with properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3337)) +- Classic FocusCamera song events no longer cause the camera to snap in place. ([community fix by nebulazorua](https://github.com/FunkinCrew/Funkin/pull/2331)) +- Achieving the same rank on a song with a lower clear % no longer overwrites your clear %. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3019)) +- The FPS counter no longer displays if Debug Display is turned off. ([community fix by Lethrial](https://github.com/FunkinCrew/Funkin/pull/3356)) +- Selecting the area to the left of the Chart Editor no longer selects some of the player's notes. ([community fix by NotHyper-474](https://github.com/FunkinCrew/Funkin/pull/3093)) +- Pixel icons now display correctly in the Chart Editor. ([community fix by Techniktil](https://github.com/FunkinCrew/Funkin/pull/3339)) +- `Stage.addCharacter` now properly assigns the `characterType`. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3357)) +- Players can no longer crash the game by interacting with Character Select during the unlock sequence. ([community fix by ActualMandM](https://github.com/FunkinCrew/Funkin/pull/3355)) +- Pixel hold note trails in Week 6 are now scaled/positioned correctly. ([community fix by dombomb64](https://github.com/FunkinCrew/Funkin/pull/3351)) +- Audio offsets now interact with the Chart Editor properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3384)) +- Fetching Modules during the `onDestroy` event no longer fails at random. ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/3131)) +- `onSubStateOpenEnd` and `onSubStateCloseEnd` script events are now called consistently. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3138)) ## New Contributors for 0.5.1 -* @Lethrial made their first contribution in [#3356](https://github.com/FunkinCrew/Funkin/pull/3356) + * @dombomb64 made their first contribution in [#3351](https://github.com/FunkinCrew/Funkin/pull/3351) +* @Lethrial made their first contribution in [#3356](https://github.com/FunkinCrew/Funkin/pull/3356) ## [0.5.0] - 2024-09-12 + ### Added + - Added a new Character Select screen to switch between playable characters in Freeplay - Modding isn't 100% there but we're working on it! - Added Pico as a playable character! Unlock him by completing Weekend 1 (if you haven't already done that) @@ -182,7 +199,9 @@ This patch resolves a critical issue which could cause user's save data to becom - Implemented support for scripted Note Kinds. You can use HScript define a different note style to display for these notes as well as custom behavior. (community feature by lemz1) - Implemented support for Numeric and Selector options in the Options menu. ([community feature by FlooferLand](https://github.com/FunkinCrew/Funkin/pull/2942)) - Implemented new animations for Tankman and Pico. + ## Changed + - Girlfriend and Nene now perform previously unused animations when you achieve a large combo, or drop a large combo. - The pixel character icons in the Freeplay menu now display an animation! - Altered how Week 6 displays sprites to make things look more retro. @@ -202,7 +221,9 @@ This patch resolves a critical issue which could cause user's save data to becom - Animation offsets no longer directly modify the `x` and `y` position of props, which makes props work better with tweens ([community fix by Sword352](https://github.com/FunkinCrew/Funkin/pull/2310)) - The YEAH! events in Tutorial now use chart events rather than being hard-coded ([community fix by anysad](https://github.com/FunkinCrew/Funkin/pull/3007)) - The player's Score now displays commas in it (community fix by loggo) + ## Fixed + - Fixed an issue where songs with no notes would crash on the Results screen. - Fixed an issue where the old icon easter egg would not work properly on pixel levels. - Fixed an issue where you could play notes during the Thorns cutscene. @@ -225,21 +246,26 @@ This patch resolves a critical issue which could cause user's save data to becom - Fixed an issue in Story Mode where a song that isn't valid for the current variation could be selected ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3037)) ## New Contributors for 0.5.0 + +* @Sword352 made their first contribution in [#2310](https://github.com/FunkinCrew/Funkin/pull/2310) +* @cyn0x8 made their first contribution in [#2494](https://github.com/FunkinCrew/Funkin/pull/2494) +* @KarimAkra made their first contribution in [#2713](https://github.com/FunkinCrew/Funkin/pull/2713) +* @AppleHair made their first contribution in [#2742](https://github.com/FunkinCrew/Funkin/pull/2742) +* @JVNpixels made their first contribution in [#2873](https://github.com/FunkinCrew/Funkin/pull/2873) * @Flooferland made their first contribution in [#2942](https://github.com/FunkinCrew/Funkin/pull/2942) * @anysad made their first contribution in [#3007](https://github.com/FunkinCrew/Funkin/pull/3007) -* @Sword352 made their first contribution in [#2310](https://github.com/FunkinCrew/Funkin/pull/2310) -* @KarimAkra made their first contribution in [#2713](https://github.com/FunkinCrew/Funkin/pull/2713) -* @JVNpixels made their first contribution in [#2873](https://github.com/FunkinCrew/Funkin/pull/2873) -* @AppleHair made their first contribution in [#2742](https://github.com/FunkinCrew/Funkin/pull/2742) * @7oltan made their first contribution in [#3035](https://github.com/FunkinCrew/Funkin/pull/3035) -* @cyn0x8 made their first contribution in [#2494](https://github.com/FunkinCrew/Funkin/pull/2494) ## [0.4.1] - 2024-06-12 + ### Added + - Pressing ESCAPE on the title screen on desktop now exits the game, allowing you to exit the game while in fullscreen on desktop - Freeplay menu controls (favoriting and switching categories) are now rebindable from the Options menu, and now have default binds on controllers. + ### Changed + - Highscores and ranks are now saved separately, which fixes the issue where people would overwrite their saves with higher scores, which would remove their rank if they had a lower one. - A-Bot speaker now reacts to the user's volume preference on desktop ([thanks to M7theguy for the issue report/suggestion](https://github.com/FunkinCrew/Funkin/issues/2744)!) @@ -251,7 +277,9 @@ which would remove their rank if they had a lower one. - Re-enabled custom camera events in Roses (Erect/Nightmare) - Tweaked the chart for Lit Up (Hard) - Corrected the difficulty ratings for M.I.L.F (Easy/Normal/Hard) + ### Fixed + - Fixed an issue in the controls menu where some control binds would overlap their names - Fixed crash when attempting to exit the gameover screen when also attempting to retry the song ([thanks DMMaster636 for the PR!](https://github.com/FunkinCrew/Funkin/pull/2709)) - Fix botplay sustain release bug ([thanks Hundrec!](https://github.com/FunkinCrew/Funkin/pull/2683)) @@ -265,12 +293,15 @@ which would remove their rank if they had a lower one. - Fixed the black "temp" graphic on freeplay from being incorrectly sized / masked, now it's identical to the dad freeplay graphic ## New Contributors for 0.4.1 -* @DMMaster636 made their first contribution in [#2709](https://github.com/FunkinCrew/Funkin/pull/2709) + * @Hundrec made their first contribution in [#2683](https://github.com/FunkinCrew/Funkin/pull/2683) +* @DMMaster636 made their first contribution in [#2709](https://github.com/FunkinCrew/Funkin/pull/2709) ## [0.4.0] - 2024-06-06 + ### Added + - 2 new Erect remixes, Eggnog and Satin Panties. Check them out from the Freeplay menu! - Major visual improvements to the Results screen, with additional animations and audio based on your performance. - Major visual improvements to the Freeplay screen, with song difficulty ratings and player rank displays. @@ -278,7 +309,9 @@ which would remove their rank if they had a lower one. - Added a Charter field to the chart format, to allow for crediting the creator of a level's chart. - You can see who charted a song from the Pause menu. - Added a new Scroll Speed chart event to change the note speed mid-song ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2409)) + ### Changed + - Tweaked the charts for several songs: - Tutorial (increased the note speed slightly) - Spookeez @@ -298,7 +331,9 @@ which would remove their rank if they had a lower one. - Health icons now support a Winning frame without requiring a spritesheet, simply include a third frame in the icon file. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2593)) - Remember that for more complex behaviors such as animations or transitions, you should use an XML file to define each frame. - Improved the Event Toolbox in the Chart Editor; dropdowns are now bigger, include search field, and display elements in alphabetical order rather than a random order. + ### Fixed + - Fixed an issue where Nene's visualizer would not play on Desktop builds - Fixed a bug where the game would silently fail to load saves on HTML5 - Fixed some bugs with the props on the Story Menu not bopping properly @@ -322,20 +357,25 @@ which would remove their rank if they had a lower one. - Additional bug fixes and optimizations. ## New Contributors for 0.4.0 -* @Keoiki made their first contribution in [#2581](https://github.com/FunkinCrew/Funkin/pull/2581) -* @richTrash21 made their first contribution in [#2493](https://github.com/FunkinCrew/Funkin/pull/2493) -* @sector-a made their first contribution in [#2585](https://github.com/FunkinCrew/Funkin/pull/2585) -* @MaybeMaru made their first contribution in [#2488](https://github.com/FunkinCrew/Funkin/pull/2488) -* @Ethan-makes-music made their first contribution in [#2624](https://github.com/FunkinCrew/Funkin/pull/2624) + * @Noobz4Life made their first contribution in [#2472](https://github.com/FunkinCrew/Funkin/pull/2472) -* @NotHyper-474 made their first contribution in [#2629](https://github.com/FunkinCrew/Funkin/pull/2629) +* @MaybeMaru made their first contribution in [#2488](https://github.com/FunkinCrew/Funkin/pull/2488) +* @richTrash21 made their first contribution in [#2493](https://github.com/FunkinCrew/Funkin/pull/2493) +* @Keoiki made their first contribution in [#2581](https://github.com/FunkinCrew/Funkin/pull/2581) +* @sector-a made their first contribution in [#2585](https://github.com/FunkinCrew/Funkin/pull/2585) * @PurSnake made their first contribution in [#2610](https://github.com/FunkinCrew/Funkin/pull/2610) +* @Ethan-makes-music made their first contribution in [#2624](https://github.com/FunkinCrew/Funkin/pull/2624) +* @NotHyper-474 made their first contribution in [#2629](https://github.com/FunkinCrew/Funkin/pull/2629) ## [0.3.3] - 2024-05-14 + ### Changed + - Cleaned up some code in `PlayAnimationSongEvent.hx` ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2308)) + ### Fixed + - Fixes to the Loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2499)) - Don't allow any more inputs when exiting freeplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2470)) - Fixed using mouse wheel to scroll on freeplay ([thanks JugieNoob!](https://github.com/FunkinCrew/Funkin/pull/2466)) @@ -353,18 +393,21 @@ which would remove their rank if they had a lower one. - Fix a crash on Freeplay found on AMD graphics cards ## New Contributors for 0.3.3 -* @Burgerballs made their first contribution in [#2308](https://github.com/FunkinCrew/Funkin/pull/2308) -* @lemz1 made their first contribution in [#2499](https://github.com/FunkinCrew/Funkin/pull/2499) -* @gamerbross made their first contribution in [#2470](https://github.com/FunkinCrew/Funkin/pull/2470) -* @JugieNoob made their first contribution in [#2466](https://github.com/FunkinCrew/Funkin/pull/2466) -* @MadBear422 made their first contribution in [#2370](https://github.com/FunkinCrew/Funkin/pull/2370) -* @ImCodist made their first contribution in [#2309](https://github.com/FunkinCrew/Funkin/pull/2309) + * @TheGaloXx made their first contribution in [#2300](https://github.com/FunkinCrew/Funkin/pull/2300) +* @Burgerballs made their first contribution in [#2308](https://github.com/FunkinCrew/Funkin/pull/2308) +* @ImCodist made their first contribution in [#2309](https://github.com/FunkinCrew/Funkin/pull/2309) * @nebulazorua made their first contribution in [#2323](https://github.com/FunkinCrew/Funkin/pull/2323) +* @MadBear422 made their first contribution in [#2370](https://github.com/FunkinCrew/Funkin/pull/2370) +* @JugieNoob made their first contribution in [#2466](https://github.com/FunkinCrew/Funkin/pull/2466) +* @gamerbross made their first contribution in [#2470](https://github.com/FunkinCrew/Funkin/pull/2470) +* @lemz1 made their first contribution in [#2499](https://github.com/FunkinCrew/Funkin/pull/2499) ## [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. - Implemented a blacklist to prevent mods from calling system functions. - Added a couple utility functions to call useful stuff that got blacklisted. @@ -372,11 +415,15 @@ which would remove their rank if they had a lower one. - Added the current loaded modlist to crash logs. - Added the `visible` attribute to Level JSON data. - Enabled ZIP file system support for Polymod (make sure the metadata is in the root of the ZIP). + ### Changed + - Songs in the mod folders will display in Freeplay without any extra scripting. - Story levels in the mod folders will display in Story without any extra scripting. - All audio should sound better in HTML5, less muddy + ### Fixed + - Fixed a typo in the credits folder (`Custcene` -> `Cutscene`) - Fixed an issue where health icon transition animations would loop and never finish properly. - Fixed an issue where video cutscenes flagged as mid-song would crash the game when they finish. @@ -385,18 +432,24 @@ which would remove their rank if they had a lower one. - Fixed an issue where the preloader would spam the logs when it was complete and waiting for user input. - Should definitely have the fix for freeplay where it stops taking control of the main menu below it - Changed the code for the story menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1 + ### Removed + - Removed some unused `.txt` files in the `assets/data` folder. ## [0.3.1] - 2024-05-01 + ### Changed + - Ensure the Git commit hash always displays in the log files. - Added whether the local Git repo was modified to the log files. - Removed "PROTOTYPE" text on release builds only (it still shows on debug builds). - Added additional credits and special thanks. - Updated peepo in creds to peepo173 + ### Fixed + - Fix a crash when retrieving system specs while handing a crash. - Fix a crash triggered when pausing before the song started. - Fix a crash triggered when dying before the song started. @@ -407,7 +460,9 @@ which would remove their rank if they had a lower one. ## [0.3.0] - 2024-04-30 + ### Added + - New Story Level: Weekend 1, starting Pico, Darnell, and Nene. - Beat the level in Story Mode to unlock the songs for Freeplay! - 12 new Erect remixes, featuring Kawai Sprite, Saruky, Kohta Takahashi, and Saster @@ -421,7 +476,9 @@ which would remove their rank if they had a lower one. - New song events system allows for simple customization of camera behavior. - Mods can implement custom song events via HScript, and new built-in song events will come in the future. - New credits menu to list all the dozens of people who contributed. + ### Changed + - Completely refactored the game's input system for higher reliability and accuracy. - Reworked note rendering to massively reduce lag on larger charts. - Reworks to scoring and health gain. @@ -436,35 +493,49 @@ which would remove their rank if they had a lower one. - Fully refactored the game's chart file format for extensibility and readability. - You can migrate old charts using the Import FNF Legacy option in the chart editor. - Various visual tweaks and improvements. + ### Fixed + - 17 quadrillion bugs across hundreds of PRs. ## [0.2.8] - 2021-04-18 (note, this one is iffy cuz we slacked wit it lol!) + ### Added + - TANKMAN! 3 NEW SONGS BY KAWAISPRITE (UGH, GUNS, STRESS)! Charting help by MtH! - Monster added into week 2, FINALLY (Charting help by MtH and ChaoticGamer!) - Can now change song difficulty mid-game. - Shows some song info on pause screen. - Cute little icons onto freeplay menu - Offset files for easier modification of characters + ### Changed + - ASSET LOADING OVERHAUL, WAY FASTER LOAD TIMES ON WEB!!! (THANKS TO GEOKURELI WOKE KING) - Made difficulty selector on freeplay menu more apparent + ### Fixed + - That one random note on Bopeebo ## [0.2.7.1] - 2021-02-14 + ### Added + - Easter eggs - readme's in desktop versions of the game + ### Changed + - New icons, old one was placeholder since October woops! - Made the transitions between the story mode levels more seamless. - Offset of the Newgrounds logo on boot screen. - Made the changelog txt so it can be opened easier by normal people who don't have a markdown reader (most normal people); + ### Fixed + - Fixed crashes on Week 6 story mode dialogue if spam too fast ([Thanks to Lotusotho for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/357)) - Should show intro credits on desktop versions of the game more consistently - Layering on Week 4 songs with GF and the LIMO LOL HOW TF I MISS THIS @@ -474,21 +545,29 @@ which would remove their rank if they had a lower one. ## [0.2.7] - 2021-02-02 + ### Added + - PIXEL DAY UPDATE LOL 1 WEEK LATER - 3 New songs by Kawaisprite! - COOL CUTSCENES - WEEK 6 YOYOYOYOY - Swaggy pixel art by Moawling! + ### Changed + - Made it so you lose sliiiightly more health when you miss a note. - Removed the default HaxeFlixel pause screen when the game window loses focus, can get screenshots of the game easier hehehe + ### Fixed + - Idle animation bug with BF christmas and BF hair blow sprites ([Thanks to Injourn for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/237)) ## [0.2.6] - 2021-01-20 + ### Added + - 3 NEW CHRISTMAS SONGS. 2 BY KAWAISPRITE, 1 BY BASSETFILMS!!!!! BF WITH DRIP! SANTA HANGIN OUT! - Enemy icons change when they you are winning a lot ([Thanks to pahaze for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/138)) - Holding CTRL in charting editor places notes on both sides @@ -496,11 +575,17 @@ which would remove their rank if they had a lower one. - Other charting editor workflow improvements - More hair physics - Heads appear at top of chart editor to help show which side ur charting for + ### Changed + - Tweaked code relating to inputs, hopefully making notes that are close together more fair to hit + ### Removed + - Removed APE + ### Fixed + - Maybe fixed double notes / jump notes. Need to tweak it for balance, but should open things up for cooler charts in the future. - Old Verison popup screen weirdness ([Thanks to gedehari for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/155)) - Song no longer loops when finishing the song. ([Thanks Injourn for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/132)) @@ -509,7 +594,9 @@ which would remove their rank if they had a lower one. ## [0.2.5] - 2020-12-27 + ### Added + - MOMMY GF, 3 NEW ASS SONGS BY KAWAISPRITE, NEW ART BY PHANTOMARCADE,WOOOOOOAH!!!! - Different icons depending on which character you are against, art by EVILSK8R!! - Autosave to chart editor @@ -517,31 +604,45 @@ which would remove their rank if they had a lower one. - Swap button in note editor - a new boot text or two - automatic check for when you're on an old version of the game! + ### Changed + - Made Spookeez on Normal easier. - Mouse is now visible in note editor + ### Fixed + - Crash when playing Week 3 and then playing a non-week 3 song - When pausing music at the start, it doesn't continue the song anyways. ([shoutouts gedehari for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/48)) - IDK i think backing out of song menu should play main menu songs again hehe ([shoutouts gedehari for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/48)) ## [0.2.4] - 2020-12-11 + ### Added + - 3 NEW SONGS BY KAWAISPRITE. Pico, Philly, and Blammed. - NEW CHARACTER, PICO. Based off the classic Flash game "Pico's School" by Tom Fulp - NEW LEVEL WOW! PHILLY BABEEEE + ### Changed + - Made it less punishing to ATTEMPT to hit a note and miss, rather than let it pass you + ### Fixed + - Song desync of you paused and unpaused frequently ([shoutouts SonicBlam](https://github.com/FunkinCrew/Funkin/issues/37)) - Animation offsets when GF is scared ## [0.2.3] - 2020-12-04 + ### Added + - More intro texts + ### Fixed + - Exploit where you could potentially give yourself a high score via the debug menu - Issue/bug where you could spam the confirm button on the story menu ([shoutouts lotusotho for the CODE contribution/pull request!](https://github.com/FunkinCrew/Funkin/pull/19)) - Glitch where if you never would lose health if you missed a note on a fast song (shoutouts [MrDulfin](https://github.com/FunkinCrew/Funkin/issues/10), [HotSauceBurritos](https://github.com/FunkinCrew/Funkin/issues/13) and [LobsterMango](https://lobstermango.newgrounds.com)) @@ -549,15 +650,21 @@ which would remove their rank if they had a lower one. ## [0.2.2] - 2020-11-20 + ### Added + - Music playing on the freeplay menu. - UI sounds on freeplay menu - Score now shows mid-song. - Menu on pause screen! Can resume, and restart song, or go back to main menu. - New music made for pause menu! + ### Changed + - Moved all the intro texts to its own txt file instead of being hardcoded, this allows for much easier customization. File is in the data folder, called "introText.txt", follow the format in there and you're probably good to go! + ### Fixed + - Fixed soft lock when pausing on song finish ([shoutouts gedehari](https://github.com/FunkinCrew/Funkin/issues/15)) - Think I fixed issue that led to in-game scores being off by 2 ([shoutouts Mike](https://github.com/FunkinCrew/Funkin/issues/4)) - Should have fixed the 1 frame note appearance thing. ([shoutouts Mike](https://github.com/FunkinCrew/Funkin/issues/6)) @@ -567,36 +674,50 @@ which would remove their rank if they had a lower one. ## [0.2.1.2] - 2020-11-06 + ### Fixed + - Story mode scores not properly resetting, leading to VERY inflated highscores on the leaderboards. This also requires me to clear the scores that are on the leaderboard right now, sorry! - Difficulty on storymode and in freeplay scores - Hard mode difficulty on campaign levels have been fixed ## [0.2.1.1] - 2020-11-06 + ### Fixed + - Week 2 not unlocking properly ## [0.2.1] - 2020-11-06 + ### Added + - Scores to the freeplay menu - A few new intro boot messages. - Lightning effect in Spooky stages - Campaign scores, can now compete on scoreboards for campaign! - Can now change difficulties in Freeplay mode + ### Changed + - Balanced out Normal mode for the harder songs(DadBattle and Spookeez, not South yet). Should be much easier all around. - Put tutorial in it's own 'week', so that if you want to play week 1, you don't have to play the tutorial. + ### Fixed + - One of the charting bits on South and Spookeez during the intro. ## [0.2.0] - 2020-11-01 + ### Added + - Uhh Newgrounds release lolol I always lose track of shit. ## [0.1.0] - 2020-10-05 + ### Added + - Uh, everything. This the game's initial gamejam release. We put it out From 56033b3288ba9dc3868a5d897fb313c8a2acc5ff Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 11 Mar 2025 09:30:36 -0600 Subject: [PATCH 25/81] Changelog overhaul for 0.4.1, 0.4.0, 0.3.3, 0.3.2, 0.3.1, 0.3.0 --- CHANGELOG.md | 226 +++++++++++++++++++++++++-------------------------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63b3b2461..13ef473a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,13 +49,13 @@ This patch resolves a critical issue which could cause user's save data to becom - Volume sound tray is now anti-aliased/smoothed ([e66290c](https://github.com/FunkinCrew/Funkin/commit/e66290c55f7141402223644f06ec8a69edeee089)) - by @Kn1ghtNight in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) - Fixed looping animations for modded StrumlineNote sprites ([bc546e8](https://github.com/FunkinCrew/Funkin/commit/bc546e86aa77ffc795b3f079de5f590289a9c583)) - by @DaWaterMalone in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) - Stopped allowing inputs after selecting a character in Character Select ([dbf66ac](https://github.com/FunkinCrew/Funkin/commit/dbf66ac250137262866d75f7c1387645b35d88d0)) - by @ACrazyTown in [#3398](https://github.com/FunkinCrew/Funkin/pull/3398) -- Player and girlfriend no longer disappear or overlap themselves in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- Player no longer enters twice after entering Character Select or when spamming buttons ([30a9887](https://github.com/FunkinCrew/Funkin/commit/30a98871367b494c85934cd3fcfa91eeb774a7d5)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- Wrong girlfriend no longer appears in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- The player and girlfriend no longer disappear or overlap themselves in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- The player no longer enters twice after entering Character Select or when spamming buttons ([30a9887](https://github.com/FunkinCrew/Funkin/commit/30a98871367b494c85934cd3fcfa91eeb774a7d5)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- The wrong girlfriend no longer appears in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) - Cursor now updates properly when moving and selecting in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) - Cursor now moves properly at lower framerates in Character Select ([ab5bda3](https://github.com/FunkinCrew/Funkin/commit/ab5bda3ee573a6e03595ec6941e6de38df851889)) - by @ninjamuffin99 in [#3507](https://github.com/FunkinCrew/Funkin/pull/3507) - Exiting the Chart Editor no longer crashes the game ([f52472a](https://github.com/FunkinCrew/Funkin/commit/f52472a4767388b22cfbab0f5f7860f6e6762856)) - by @EliteMasterEric and @ianharrigan in [#3519](https://github.com/FunkinCrew/Funkin/pull/3519) -- Properly format the millisecond counter in the Chart Editor playbar ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) +- The millisecond counter in the Chart Editor playbar is now properly formatted ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) - Pressing F1 multiple times no longer creates more than one help window in the Chart Editor ([777978f](https://github.com/FunkinCrew/Funkin/commit/777978f5a544e1b7c89b47dcc365f734eb6d0df1)) - by @amyspark-ng in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) - The dialog box now shows up in the Animation Editor ([1fde59f](https://github.com/FunkinCrew/Funkin/commit/1fde59f999eac94eb10fc22094885de2f5310705)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) - (debug) No more fullscreening when typing "F" in the flixel debugger console ([29b6763](https://github.com/FunkinCrew/Funkin/commit/29b6763290df05d42039806f3d142740568c80f0)) - by @ninjamuffin99 @@ -104,53 +104,53 @@ This patch resolves a critical issue which could cause user's save data to becom ### Fixed -- DadBattle (Pico Mix) is now properly credited to `TeraVex (ft. Saruky)`. -- DadBattle (Pico Mix) now has charts for Normal and Easy difficulties. -- Spookeez (Pico Mix) is now properly credited to `Six Impala (ft. Saster)`. -- The "Shit!" judgement no longer displays with anti-aliasing in Week 6. -- Pico Erect can no longer be played with different instrumentals. -- Pico now plays his shooting animations in Stress. -- Freeplay now displays custom songs when switching characters. +- Pico is no longer locked every time the game starts, and you no longer have to watch the unlock animation each game boot. + - The animation should now play only once per save file. +- The clear % now displays in Freeplay after switching characters. +- Character remixes no longer display the base song's highscore in Freeplay. - Freeplay no longer displays the wrong text on capsules. +- Freeplay now displays custom songs when switching characters. - Duplicate difficulties from custom variations now display properly in Freeplay. -- Custom note styles no longer sometimes use default values rather than the fallback note style +- DadBattle (Pico Mix) now has charts for Normal and Easy difficulties. +- DadBattle (Pico Mix) is now properly credited to `TeraVex (ft. Saruky)`. +- Spookeez (Pico Mix) is now properly credited to `Six Impala (ft. Saster)`. +- The audio track now unmutes if you miss a note just before Pico burps. +- Pico now plays out his full burp animation in South (Pico Mix). +- Removed a tap note stacked on top of a hold note in Cocoa Erect (Erect difficulty). +- Pico Erect can no longer be played with different instrumentals. +- The curtains in Week 1 no longer display in front of larger characters. +- Boyfriend now plays his death animation properly on the Week 2 Remix stage. +- The game no longer stutters when playing on the Week 5 Remix stage. +- The "Shit!" judgement no longer displays with anti-aliasing in Week 6. +- Spirit's trail in Week 6 now displays correctly. +- Pico now plays his shooting animations in Stress. +- Characters with high offsets no longer shift over after the player dies or restarts. +- Custom note styles no longer sometimes use default values rather than the fallback note style. - Custom note styles no longer randomly fail to fetch information about their fallback note style. - Screenshots and Chart Editor binds no longer display in the controls menu on Web builds (where they are disabled). - Stage Editor bind no longer displays in the controls menu even when the feature is disabled. - Freeplay Character Select keybind no longer displays strangely in the controls menu. -- Setting the input offset or visual offset to high values no longer causes the song to skip. +- Audio tracks no longer get destroyed if they are flagged as persistent. - Video cutscenes now scale their volume properly. -- The game no longer stutters when playing on the Week 5 Remix stage. +- Results screen audio no longer continues into Freeplay or gameplay. +- The Results screen now plays the percentage tick sound when the value changes instead of spamming the sound. - The save data version number is now written to the save data properly. - The example mod can now be loaded. -- Entering Blazin' no longer displays a script error. - Pressing F5 to force reload a song no longer occasionally causes the game to crash. - Animations on Animate Atlas characters no longer throw a bunch of warnings in the console. -- Characters with high offsets no longer shift over after the player dies or restarts. -- The audio track now unmutes if you miss a note just before Pico burps. -- Pico now plays out his full burp animation in South (Pico Mix). -- Removed a tap note stacked on top of a hold note in Cocoa Erect (Erect difficulty). -- Results screen audio no longer continues into Freeplay or gameplay. -- Audio tracks no longer get destroyed if they are flagged as persistent. -- The curtains in Week 1 no longer display in front of larger characters. -- Boyfriend now plays his death animation properly on the Week 2 Remix stage. -- The clear % now displays in Freeplay after switching characters. -- Character remixes no longer display the base song's highscore in Freeplay. -- Pico is no longer locked every time the game starts, and you no longer have to watch the unlock animation each game boot. - - The animation should now play only once per save file. -- Spirit's trail in Week 6 now displays correctly. +- Entering Blazin' no longer displays a script error. - The Input Offsets menu no longer crashes when entering it before playing a song on web builds. -- The Results screen now plays the percentage tick sound when the value changes instead of spamming the sound. -- The Chart Editor can now be interacted with properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3337)) +- Setting the input offset or visual offset to high values no longer causes the song to skip. - Classic FocusCamera song events no longer cause the camera to snap in place. ([community fix by nebulazorua](https://github.com/FunkinCrew/Funkin/pull/2331)) +- Pixel hold note trails in Week 6 are now scaled/positioned correctly. ([community fix by dombomb64](https://github.com/FunkinCrew/Funkin/pull/3351)) - Achieving the same rank on a song with a lower clear % no longer overwrites your clear %. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3019)) - The FPS counter no longer displays if Debug Display is turned off. ([community fix by Lethrial](https://github.com/FunkinCrew/Funkin/pull/3356)) +- The Chart Editor can now be interacted with properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3337)) - Selecting the area to the left of the Chart Editor no longer selects some of the player's notes. ([community fix by NotHyper-474](https://github.com/FunkinCrew/Funkin/pull/3093)) - Pixel icons now display correctly in the Chart Editor. ([community fix by Techniktil](https://github.com/FunkinCrew/Funkin/pull/3339)) -- `Stage.addCharacter` now properly assigns the `characterType`. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3357)) -- Players can no longer crash the game by interacting with Character Select during the unlock sequence. ([community fix by ActualMandM](https://github.com/FunkinCrew/Funkin/pull/3355)) -- Pixel hold note trails in Week 6 are now scaled/positioned correctly. ([community fix by dombomb64](https://github.com/FunkinCrew/Funkin/pull/3351)) - Audio offsets now interact with the Chart Editor properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3384)) +- Players can no longer crash the game by interacting with Character Select during the unlock sequence. ([community fix by ActualMandM](https://github.com/FunkinCrew/Funkin/pull/3355)) +- `Stage.addCharacter` now properly assigns the `characterType`. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3357)) - Fetching Modules during the `onDestroy` event no longer fails at random. ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/3131)) - `onSubStateOpenEnd` and `onSubStateCloseEnd` script events are now called consistently. ([community fix by lemz1](https://github.com/FunkinCrew/Funkin/pull/3138)) @@ -180,7 +180,7 @@ This patch resolves a critical issue which could cause user's save data to becom - Eggnog (Pico Mix) - Ugh (Pico Mix) - Guns (Pico Mix) -- Added 1 new Boyfriend remix! Access it by completing Weekend 1 as Pico and then selecting Boyfriend from in the Character Select screen +- Added 1 new Boyfriend remix! Access it by completing Weekend 1 as Pico and then selecting Boyfriend in the Character Select screen - Darnell (BF Mix) - Added 2 new Erect remixes! Access them by switching difficulty on the song - Cocoa Erect @@ -194,7 +194,7 @@ This patch resolves a critical issue which could cause user's save data to becom - Week 4 Erect Stage - Week 5 Erect Stage - Weekend 1 Erect Stage -- Implemented alternate animations and music for Pico in the results screen. +- Implemented alternate animations and music for Pico in the Results screen. - These display on Pico remixes, as well as when playing Weekend 1. - Implemented support for scripted Note Kinds. You can use HScript define a different note style to display for these notes as well as custom behavior. (community feature by lemz1) - Implemented support for Numeric and Selector options in the Options menu. ([community feature by FlooferLand](https://github.com/FunkinCrew/Funkin/pull/2942)) @@ -208,42 +208,42 @@ This patch resolves a critical issue which could cause user's save data to becom - Character offsets are now independent of the character's scale. - This should resolve issues with offsets when porting characters from older mods. - Pixel character offsets have been modified to compensate. +- Reworked the JSON merging system in Polymod; you can now include JSONPatch files under `_merge` in your mod folder to add, modify, or remove values in a JSON without replacing it entirely! +- The `danceEvery` property of characters and stage props can now use values with a precision of `0.25`, to play their idle animation up to four times per beat. +- Characters now respect the `danceEvery` property ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2925)) - Note style data can now specify custom combo count graphics, judgement graphics, countdown graphics, and countdown audio. ([community feature by anysad](https://github.com/FunkinCrew/Funkin/pull/3020)) - These were previously using hardcoded values based on whether the stage was `school` or `schoolEvil`. -- The `danceEvery` property of characters and stage props can now use values with a precision of `0.25`, to play their idle animation up to four times per beat. -- Reworked the JSON merging system in Polymod; you can now include JSONPatch files under `_merge` in your mod folder to add, modify, or remove values in a JSON without replacing it entirely! -- Cutscenes now automatically pause when tabbing out ([community fix by AbnormalPoof](https://github.com/FunkinCrew/Funkin/pull/2903)) -- Characters will now respect the `danceEvery` property ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2925)) -- The F5 function now reloads the current song's chart data from disc ([community feature by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2990)) -- Refactored the compilation guide and added common troubleshooting steps ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2813)) -- Made several layout improvements and fixes to the Animation Offsets editor in the Debug menu ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2820)) -- Fixed a bug where the Back sound would be not played when leaving the Story menu and Options menu ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2986)) -- Animation offsets no longer directly modify the `x` and `y` position of props, which makes props work better with tweens ([community fix by Sword352](https://github.com/FunkinCrew/Funkin/pull/2310)) - The YEAH! events in Tutorial now use chart events rather than being hard-coded ([community fix by anysad](https://github.com/FunkinCrew/Funkin/pull/3007)) +- Cutscenes now automatically pause when tabbing out ([community fix by AbnormalPoof](https://github.com/FunkinCrew/Funkin/pull/2903)) +- The F5 function now reloads the current song's chart data from disk ([community feature by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2990)) +- Made several layout improvements and fixes to the Animation Offsets editor in the Debug menu ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2820)) +- Animation offsets no longer directly modify the `x` and `y` position of props, which makes props work better with tweens ([community fix by Sword352](https://github.com/FunkinCrew/Funkin/pull/2310)) +- Fixed a bug where the Back sound would be not played when leaving the Story menu and Options menu ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2986)) - The player's Score now displays commas in it (community fix by loggo) +- Refactored the compilation guide and added common troubleshooting steps ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2813)) ## Fixed -- Fixed an issue where songs with no notes would crash on the Results screen. -- Fixed an issue where the old icon easter egg would not work properly on pixel levels. -- Fixed an issue where you could play notes during the Thorns cutscene. -- Fixed an issue where the Heart icon when favoriting a song in Freeplay would be malformed. -- Fixed an issue where Pico's death animation displays a faint blue background ([community fix by doggogit](https://github.com/FunkinCrew/funkin.assets/pull/1)) -- Fixed an issue where mod songs would not play a preview in the Freeplay menu ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2724)) -- Fixed an issue where the Memory Usage counter could overflow and display a negative number ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2713)) -- Fixed an issue where pressing the Chart Editor keybind while playtesting a chart would reset the chart editor ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2739)) -- Fixed a crash bug when pressing F5 after seeing the sticker transition ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2863)) -- Fixed an issue where the Story Mode menu couldn't be scrolled with a mouse ([community fix by JVNpixels](https://github.com/FunkinCrew/Funkin/pull/2873)) -- Fixed an issue causing the song to majorly desync sometimes ([community fix by Burgerballs](https://github.com/FunkinCrew/Funkin/pull/3058)) -- Fixed an issue where the Freeplay song preview would not respect the instrumental ID specified in the song metadata ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2742)) -- Fixed an issue where Tankman's icon wouldn't display in the Chart Editor ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2912)) -- Fixed an issue where pausing the game during a camera zoom would zoom the pause menu. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2567)) -- Fixed an issue where certain UI elements would not flash at a consistent rate ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/2494)) -- Fixed an issue where the game would not use the placeholder health icon as a fallback ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/3005)) -- Fixed an issue where the chart editor could get stuck creating a hold note when using Live Inputs ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2992)) -- Fixed an issue where character graphics could not be placed in week folders ([community fix by 7oltan](https://github.com/FunkinCrew/Funkin/pull/3035)) -- Fixed a crash issue when a Freeplay song has no `Normal` difficulty ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3036) and [gamerbross](https://github.com/FunkinCrew/Funkin/pull/2712)) -- Fixed an issue in Story Mode where a song that isn't valid for the current variation could be selected ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3037)) +- Songs with no notes no longer crash on the Results screen. +- Note inputs are no longer accepted during the Thorns cutscene. +- The old icon easter egg now works properly on pixel levels. +- The Heart icon is no longer malformed when favoriting a song in Freeplay. +- Freeplay songs with no `Normal` difficulty no longer crash the game ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3036) and [gamerbross](https://github.com/FunkinCrew/Funkin/pull/2712)) +- Songs that aren't valid for the current variation can no longer be selected ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3037)) +- The Freeplay song preview now respects the instrumental ID specified in the song metadata ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2742)) +- Modded songs now play previews in the Freeplay menu ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2724)) +- The Story Mode menu can now be scrolled using the mouse wheel ([community fix by JVNpixels](https://github.com/FunkinCrew/Funkin/pull/2873)) +- Pressing F5 after seeing the sticker transition no longer crashes the game ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2863)) +- Pausing the game during a camera zoom no longer zooms the pause menu as well ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2567)) +- The song no longer majorly desyncs at times ([community fix by Burgerballs](https://github.com/FunkinCrew/Funkin/pull/3058)) +- Pico's death animation no longer displays a faint blue background ([community fix by doggogit](https://github.com/FunkinCrew/funkin.assets/pull/1)) +- The game now uses the placeholder health icon as a fallback ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/3005)) +- Pressing the Chart Editor keybind while playtesting a chart no longer resets the Chart Editor ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2739)) +- The Chart Editor no longer gets stuck creating a hold note when using Live Inputs ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2992)) +- Tankman's icon now displays in the Chart Editor ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2912)) +- The Memory Usage counter no longer overflows and displays a negative number ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2713)) +- Certain UI elements now flash at a consistent rate ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/2494)) +- Character graphics can now be placed in week folders ([community fix by 7oltan](https://github.com/FunkinCrew/Funkin/pull/3035)) ## New Contributors for 0.5.0 @@ -270,7 +270,7 @@ This patch resolves a critical issue which could cause user's save data to becom which would remove their rank if they had a lower one. - A-Bot speaker now reacts to the user's volume preference on desktop ([thanks to M7theguy for the issue report/suggestion](https://github.com/FunkinCrew/Funkin/issues/2744)!) - On Freeplay, heart icons are shifted to the right when you favorite a song that has no rank on it. -- Only play `scrollMenu` sound effect when there's a real change on the freeplay menu ([thanks gamerbross for the PR!](https://github.com/FunkinCrew/Funkin/pull/2741)) +- Only play `scrollMenu` sound effect when there's a real change on the Freeplay menu ([thanks gamerbross for the PR!](https://github.com/FunkinCrew/Funkin/pull/2741)) - Gave antialiasing to the edge of the dad graphic on Freeplay - Rearranged some controls in the controls menu - Made several chart revisions @@ -280,17 +280,17 @@ which would remove their rank if they had a lower one. ### Fixed -- Fixed an issue in the controls menu where some control binds would overlap their names -- Fixed crash when attempting to exit the gameover screen when also attempting to retry the song ([thanks DMMaster636 for the PR!](https://github.com/FunkinCrew/Funkin/pull/2709)) -- Fix botplay sustain release bug ([thanks Hundrec!](https://github.com/FunkinCrew/Funkin/pull/2683)) -- Fix for the camera not pausing during a gameplay pause ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2684)) -- Fixed issue where Pico's gameplay sprite would unintentionally appear on the gameover screen when dying on 2hot from an explosion -- Freeplay previews properly fade volume during the BF idle animation -- Fixed bug where DadBattle incorrectly appeared as DadBattle Erect when returning to freeplay on Hard -- Fixed 2hot not appearing under the "#" category in Freeplay menu -- Fixed a bug where the Chart Editor would crash when attempting to select an event with the Event toolbox open -- Improved offsets for Pico and Tankman opponents so they don't slide around as much. -- Fixed the black "temp" graphic on freeplay from being incorrectly sized / masked, now it's identical to the dad freeplay graphic +- Control binds in the controls menu no longer overlap their names +- Attempting to exit the gameover screen and retry the song at the same time no longer crashes the game ([thanks DMMaster636 for the PR!](https://github.com/FunkinCrew/Funkin/pull/2709)) +- Botplay mode now handles the player's animations properly during hold notes ([thanks Hundrec!](https://github.com/FunkinCrew/Funkin/pull/2683)) +- Camera movement now pauses when the game is paused ([thanks Matriculaso!](https://github.com/FunkinCrew/Funkin/pull/2684)) +- Pico's gameplay sprite no longer appears on the gameover screen when dying from an explosion in 2hot +- Freeplay previews now properly fade in volume during the BF idle animation +- DadBattle no longer incorrectly appears as DadBattle Erect when returning to Freeplay on Hard +- 2hot now appears under the "#" category in Freeplay menu +- The Chart Editor no longer crashes when selecting an event with the Event toolbox open +- Improved offsets for Pico and Tankman opponents so they don't slide around as much +- The black "temp" graphic in Freeplay is now correctly sized/masked, now it's identical to the Dad Freeplay graphic ## New Contributors for 0.4.1 @@ -334,26 +334,26 @@ which would remove their rank if they had a lower one. ### Fixed -- Fixed an issue where Nene's visualizer would not play on Desktop builds -- Fixed a bug where the game would silently fail to load saves on HTML5 -- Fixed some bugs with the props on the Story Menu not bopping properly -- Additional fixes to the Loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2553)) +- Nene's visualizer now plays on Desktop builds +- The game no longer silently fails to load saves on HTML5 +- Props on the Story Menu now bop properly +- Additional fixes for the loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2553)) - Fixed several bugs with the TitleState, including missing music when returning from the Main Menu ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2539)) -- Fixed a camera bug in the Main Menu ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2576)) -- Fixed a bug where changing difficulties in Story mode wouldn't update the score ([thanks sector-a!](https://github.com/FunkinCrew/Funkin/pull/2585)) +- The Main Menu camera now properly follows the selected item ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2576)) +- Changing difficulties in Story Mode now updates the score text ([thanks sector-a!](https://github.com/FunkinCrew/Funkin/pull/2585)) - Fixed a crash in Freeplay caused by a level referencing an invalid song ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2457)) -- Fixed a bug where pressing the volume keys would stop the Toy commercial ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2540)) -- Fixed a bug where the Chart Editor Playtest would crash when losing ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2518)) -- Fixed a bug where hold notes would display improperly in the Chart Editor when downscroll was enabled for gameplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2565)) -- Fixed a bug where hold notes would be positioned wrong on downscroll ([thanks MaybeMaru!](https://github.com/FunkinCrew/Funkin/pull/2488)) +- Pressing the volume keys no longer stops the Toy commercial ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2540)) +- Playtesting in the Chart Editor no longer crashes when losing ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2518)) +- Hold notes now display properly in the Chart Editor when downscroll is enabled for gameplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2565)) +- Hold notes are now positioned correctly with downscroll enabled ([thanks MaybeMaru!](https://github.com/FunkinCrew/Funkin/pull/2488)) - Removed a large number of unused imports to optimize builds ([thanks Ethan-makes-music!](https://github.com/FunkinCrew/Funkin/pull/2624)) - Improved debug logging for unscripted stages ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2603)) - Fixed a crash on Linux caused by an old version of hxCodec ([thanks Noobz4Life!](https://github.com/FunkinCrew/Funkin/pull/2472)) - Optimized animation handling for characters ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2493)) +- The Chart Editor no longer uses an incorrect instrumental on imported Legacy songs ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2604)) +- Opening the game from the command line no longer crashes the preloader ([thanks NotHyper-474!](https://github.com/FunkinCrew/Funkin/pull/2629)) +- Characters no longer use the wrong scale value sometimes ([thanks PurSnake!](https://github.com/FunkinCrew/Funkin/pull/2610)) - Made improvements to compiling documentation (thanks gedehari!) -- Fixed an issue where the Chart Editor would use an incorrect instrumental on imported Legacy songs ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2604)) -- Fixed a bug where opening the game from the command line would crash the preloader ([thanks NotHyper-474!](https://github.com/FunkinCrew/Funkin/pull/2629)) -- Fixed a bug where characters would sometimes use the wrong scale value ([thanks PurSnake!](https://github.com/FunkinCrew/Funkin/pull/2610)) - Additional bug fixes and optimizations. ## New Contributors for 0.4.0 @@ -376,21 +376,21 @@ which would remove their rank if they had a lower one. ### Fixed -- Fixes to the Loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2499)) -- Don't allow any more inputs when exiting freeplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2470)) -- Fixed using mouse wheel to scroll on freeplay ([thanks JugieNoob!](https://github.com/FunkinCrew/Funkin/pull/2466)) -- Fixed the resets of the health icons, score, and notes when re-entering gameplay from gameover ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2390)) -- Fixed the chart editor character selector's hitbox width ([thanks MadBear422!](https://github.com/FunkinCrew/Funkin/pull/2370)) +- Fixes for the Loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2499)) +- Don't allow inputs when exiting Freeplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2470)) +- Fixed mouse wheel scrolling in Freeplay ([thanks JugieNoob!](https://github.com/FunkinCrew/Funkin/pull/2466)) +- Health icons, score, and notes now reset properly when re-entering gameplay from gameover ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2390)) +- Fixed the character selector's hitbox width in the Chart Editor ([thanks MadBear422!](https://github.com/FunkinCrew/Funkin/pull/2370)) - Fixed camera stutter once a wipe transition to the Main Menu completes ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2315)) -- Fixed an issue where hold note would be invisible for a single frame ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2309)) -- Fix tween accumulation on title screen when pressing Y multiple times ([thanks TheGaloXx!](https://github.com/FunkinCrew/Funkin/pull/2300)) -- Fix a crash when querying FlxG.state in the crash handler -- Fix for a game over easter egg so you don't accidentally exit it when viewing -- Fix an issue where the Freeplay menu never displays 100% clear -- Fix an issue where Weekend 1 Pico attempted to retrieve a missing asset. -- Fix an issue where duplicate keybinds would be stored, potentially causing a crash +- Hold notes no longer become invisible for a single frame ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2309)) +- Tweens no longer accumulate on the Title screen when pressing Y multiple times ([thanks TheGaloXx!](https://github.com/FunkinCrew/Funkin/pull/2300)) +- Fixed a crash when querying FlxG.state in the crash handler +- Fixed a game over easter egg so you don't accidentally exit it when viewing +- The Freeplay menu can now display 100% clear +- Weekend 1 Pico no longer attempts to retrieve a missing asset +- Fixed an issue where duplicate keybinds would be stored, potentially causing a crash - Chart debug key now properly returns you to the previous chart editor session if you were playtesting a chart ([thanks nebulazorua!](https://github.com/FunkinCrew/Funkin/pull/2323)) -- Fix a crash on Freeplay found on AMD graphics cards +- Fixed a crash on Freeplay found on AMD graphics cards ## New Contributors for 0.3.3 @@ -430,7 +430,7 @@ which would remove their rank if they had a lower one. - Fixed an issue where some substate lifecycle events were not being dispatched. - Fixed a crash when trying to load into the Animation Offsets menu with an invalid character. - Fixed an issue where the preloader would spam the logs when it was complete and waiting for user input. -- Should definitely have the fix for freeplay where it stops taking control of the main menu below it +- Should definitely have the fix for Freeplay where it stops taking control of the main menu below it - Changed the code for the story menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1 ### Removed @@ -446,17 +446,17 @@ which would remove their rank if they had a lower one. - Added whether the local Git repo was modified to the log files. - Removed "PROTOTYPE" text on release builds only (it still shows on debug builds). - Added additional credits and special thanks. -- Updated peepo in creds to peepo173 +- Updated peepo in creds to peepo173. ### Fixed -- Fix a crash when retrieving system specs while handing a crash. -- Fix a crash triggered when pausing before the song started. -- Fix a crash triggered when dying before the song started. -- Fix a crash triggered when unloading certain graphics. -- Pico game over confirm plays correctly -- When exiting from a song into freeplay, main menu no longer takes inputs unintentionally (aka issues with merch links opening up when selecting songs) -- Fix for arrow keys causing web browser page scroll +- Fixed a crash when retrieving system specs while handing a crash. +- Fixed a crash triggered when pausing before the song starts. +- Fixed a crash triggered when dying before the song starts. +- Fixed a crash triggered when unloading certain graphics. +- Pico game over confirm now plays correctly. +- When exiting from a song into Freeplay, main menu no longer takes inputs unintentionally (aka issues with merch links opening up when selecting songs). +- Arrow keys no longer cause the web browser page to scroll. ## [0.3.0] - 2024-04-30 @@ -465,10 +465,10 @@ which would remove their rank if they had a lower one. - New Story Level: Weekend 1, starting Pico, Darnell, and Nene. - Beat the level in Story Mode to unlock the songs for Freeplay! -- 12 new Erect remixes, featuring Kawai Sprite, Saruky, Kohta Takahashi, and Saster +- 12 new Erect remixes, featuring Kawai Sprite, Saruky, Kohta Takahashi, and Saster. - Unlocked instantly in Freeplay - New visually enhanced Freeplay menu. - - Sorting, favorites, and more. + - Sorting, favorites, and more - New Results screen upon completing any song or story level. - New refactored Chart Editor prototype (accessible via `~` in the main menu or `7` in the Play State, rebindable). (VERY EARLY PROTOTYPE. EXPECT BUGS AND CRASHES) - Implemented a new scripting system using HScript (an interpreted language with Haxe-like syntax) for incredible flexibility. From bb8d3ae3dcb88bd9309c0f9a1b36a087694f46d7 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 11 Mar 2025 09:52:36 -0600 Subject: [PATCH 26/81] Combine those lines Thanks Hyper! --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ef473a4..69f79e09b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ This patch resolves a critical issue which could cause user's save data to becom - Fixed a critical issue in which the Stage Editor theme value could not be parsed by older versions of the game, resulting in all save data being destroyed. - Added a check which prevents save data from being loaded if it is corrupted rather than overriding it. -- `optionsStageEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues. +- `optionsStageEditor.theme` and `optionsChartEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues. - In the future, Enum values should not be used in order to prevent incompatibilities caused by introducing new types to the save data that older versions cannot parse. - `optionsChartEditor.chartEditorLiveInputStyle` in the save data converted from an Enum to a String to fix save data compatibility issues. - Fixed an issue where some publicly distributed builds of the game were debug builds instead of release builds. From 7d80e6657bd01313f1d09d518298866d43c3cfd4 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 11 Mar 2025 16:15:44 -0600 Subject: [PATCH 27/81] A few more rewordings --- CHANGELOG.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69f79e09b..201b8081c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -425,13 +425,13 @@ which would remove their rank if they had a lower one. ### Fixed - Fixed a typo in the credits folder (`Custcene` -> `Cutscene`) -- Fixed an issue where health icon transition animations would loop and never finish properly. -- Fixed an issue where video cutscenes flagged as mid-song would crash the game when they finish. -- Fixed an issue where some substate lifecycle events were not being dispatched. -- Fixed a crash when trying to load into the Animation Offsets menu with an invalid character. -- Fixed an issue where the preloader would spam the logs when it was complete and waiting for user input. -- Should definitely have the fix for Freeplay where it stops taking control of the main menu below it -- Changed the code for the story menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1 +- Health icon transition animations now finish properly instead of looping forever. +- Video cutscenes flagged as mid-song no longer crash the game when they finish. +- Substate lifecycle events are now dispatched consistently. +- Trying to load into the Animation Offsets menu with an invalid character no longer crashes the game. +- The preloader no longer spams the logs when it is complete and waiting for user input. +- Should definitely have the fix for Freeplay where it stops taking control of the main menu below it. +- Changed the code for the Story Mode menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1 ### Removed From cef0cbf9d480bc6c0e655b3c111887616df2fe67 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Wed, 12 Mar 2025 01:14:39 -0600 Subject: [PATCH 28/81] Remove docs entries in Changelog + add punctuation --- CHANGELOG.md | 300 ++++++++++++++++++++++++++------------------------- 1 file changed, 155 insertions(+), 145 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 201b8081c..f33ea2bf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,62 +4,55 @@ 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.5.3] - 2024-10-18 -This patch resolves a critical issue which could cause user's save data to become corrupted. It is recommended that users switch to this version immediately and avoid using version 0.5.2. +This patch resolves a critical issue that could cause user's save data to become corrupted. It is recommended that users switch to this version immediately and avoid using version 0.5.2. ### Fixed - Fixed a critical issue in which the Stage Editor theme value could not be parsed by older versions of the game, resulting in all save data being destroyed. - - Added a check which prevents save data from being loaded if it is corrupted rather than overriding it. -- `optionsStageEditor.theme` and `optionsChartEditor.theme` in the save data converted from an Enum to a String to fix save data compatibility issues. + - Added a check that prevents save data from being loaded if it is corrupted rather than overwriting it. +- Converted `optionsStageEditor.theme`, `optionsChartEditor.theme`, and `optionsChartEditor.chartEditorLiveInputStyle` in the save data from an Enum to a String to fix save data compatibility issues. - In the future, Enum values should not be used in order to prevent incompatibilities caused by introducing new types to the save data that older versions cannot parse. -- `optionsChartEditor.chartEditorLiveInputStyle` in the save data converted from an Enum to a String to fix save data compatibility issues. -- Fixed an issue where some publicly distributed builds of the game were debug builds instead of release builds. + + ## [0.5.2] - 2024-10-11 ### Added -- Added InverseDotsShader that emulates flash selections ([097dbf5](https://github.com/FunkinCrew/Funkin/commit/097dbf5bb4346d431d8ca9f0ec4bc5b5e6f4523f)) - by @ninjamuffin99 -- Added a new reworked Stage Editor ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) -- Added the `color` attribute to stage prop JSON data to allow them to be tinted without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) -- Added the `angle` attribute to stage prop JSON data to allow them to be rotated without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) -- Added the `blend` attribute to the stage prop JSON data to allow blend modes to be applied without code ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) - -### Changed - -- (docs) Added link to modding docs in README ([4b54118](https://github.com/FunkinCrew/Funkin/commit/4b54118731e26118111e06558ae4853c577fe4bb)) - by @Cartridge-Man in [#3082](https://github.com/FunkinCrew/Funkin/pull/3082) -- (docs) Deleted Modding.md since we have a separate modding documentation ([a42240e](https://github.com/FunkinCrew/Funkin/commit/a42240e6a595d33034f2c887bf38a350d1fa0f15)) - by @AbnormalPoof in [#3651](https://github.com/FunkinCrew/Funkin/pull/3651) -- (docs) Fixed some misspellings and grammar in code documentation ([2175bea](https://github.com/FunkinCrew/Funkin/commit/2175beaa651e009332202985be4b7eb4ed36e5a4)) - by @Hundrec in [#3477](https://github.com/FunkinCrew/Funkin/pull/3477) -- (docs) Improvements to GitHub Issue templates ([399869c](https://github.com/FunkinCrew/Funkin/commit/399869cdccc9c5ac27cecfbcdc33c3d7eb4b348c)) - by @Hundrec in [#3458](https://github.com/FunkinCrew/Funkin/pull/3458) -- (docs) Created a git cliff template for easier changelog stuff ([91b4544](https://github.com/FunkinCrew/Funkin/commit/91b4544f7ebc51485e3e28c3d716ba6ee69ad885)) - by @ninjamuffin99 in [#3652](https://github.com/FunkinCrew/Funkin/pull/3652) -- (docs) Added additional `variation` input parameter to `Save.hasBeatenSong()` to allow usage of the function by inputting a variation id ([4fa9a0d](https://github.com/FunkinCrew/Funkin/commit/4fa9a0daaa67e0977460b147bd1f74a118e3e2a5)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- Added InverseDotsShader that emulates flash selections. ([097dbf5](https://github.com/FunkinCrew/Funkin/commit/097dbf5bb4346d431d8ca9f0ec4bc5b5e6f4523f)) - by @ninjamuffin99 +- Added a new reworked Stage Editor. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `color` attribute to stage prop JSON data to allow them to be tinted without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `angle` attribute to stage prop JSON data to allow them to be rotated without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) +- Added the `blend` attribute to the stage prop JSON data to allow blend modes to be applied without code. ([27a0b44](https://github.com/FunkinCrew/Funkin/pull/3482/commits/27a0b4426f86f04362f97e16e2eff580c9402f34)) - by @KoloInDaCrib in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) ### Fixed -- Input offsets no longer cause songs to stutter or skip ([410cfe9](https://github.com/FunkinCrew/Funkin/commit/410cfe972d6df9de4d4d128375cf8380c4f06d92)) - by @KoloInDaCrib in [#3546](https://github.com/FunkinCrew/Funkin/pull/3546) -- Exiting the Input Offset menu no longer crashes the game ([39b1a42](https://github.com/FunkinCrew/Funkin/commit/39b1a42cfeafe2b7be8b66e2fe529e853d9ae197)) - by @lemz1 in [#3493](https://github.com/FunkinCrew/Funkin/pull/3493) -- Pico's songs now display properly in the Freeplay Menu ([1d2bd61](https://github.com/FunkinCrew/Funkin/commit/1d2bd61119e5f418df7f11d7ef2a0fdedee17d3d)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) -- Fixed issues with variation/difficulty loading for Freeplay Menu which caused some songs to disappear ([c0314c8](https://github.com/FunkinCrew/Funkin/commit/c0314c85ecd5116641aff3de8e9153f7fe48e79c)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) -- `Song.getFirstValidVariation()` now properly takes into account multiple variation/difficulty inputs ([d2e2987](https://github.com/FunkinCrew/Funkin/commit/d2e29879fe2acc6febfe0f335f655b741d630c34)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) -- Song previews no longer restart when changing difficulties within the same variation ([903b3fc](https://github.com/FunkinCrew/Funkin/commit/903b3fc59905a70802618a1cd67407722ea956ed)) - by @KoloInDaCrib in [#3587](https://github.com/FunkinCrew/Funkin/pull/3587) -- Main menu music no longer cuts out when switching states ([711e0a6](https://github.com/FunkinCrew/Funkin/commit/711e0a6b7547eb04113e9318dab900f01ad576a5)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) -- Centered preloader 'fnf' and 'dsp' text so they don't clip anymore ([165ad60](https://github.com/FunkinCrew/Funkin/commit/165ad6015539a295e9eefdaef291c312e9566b26)) - by @Burgerballs in [#3567](https://github.com/FunkinCrew/Funkin/pull/3567) -- FPS setting in options menu no longer flickers when selected ([b2647fe](https://github.com/FunkinCrew/Funkin/commit/b2647fe09f5281ce7074b26d47bc1524764168ee)) - by @lemz1 in [#3629](https://github.com/FunkinCrew/Funkin/pull/3629) -- Volume sound tray is now anti-aliased/smoothed ([e66290c](https://github.com/FunkinCrew/Funkin/commit/e66290c55f7141402223644f06ec8a69edeee089)) - by @Kn1ghtNight in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) -- Fixed looping animations for modded StrumlineNote sprites ([bc546e8](https://github.com/FunkinCrew/Funkin/commit/bc546e86aa77ffc795b3f079de5f590289a9c583)) - by @DaWaterMalone in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) -- Stopped allowing inputs after selecting a character in Character Select ([dbf66ac](https://github.com/FunkinCrew/Funkin/commit/dbf66ac250137262866d75f7c1387645b35d88d0)) - by @ACrazyTown in [#3398](https://github.com/FunkinCrew/Funkin/pull/3398) -- The player and girlfriend no longer disappear or overlap themselves in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- The player no longer enters twice after entering Character Select or when spamming buttons ([30a9887](https://github.com/FunkinCrew/Funkin/commit/30a98871367b494c85934cd3fcfa91eeb774a7d5)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- The wrong girlfriend no longer appears in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- Cursor now updates properly when moving and selecting in Character Select ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) -- Cursor now moves properly at lower framerates in Character Select ([ab5bda3](https://github.com/FunkinCrew/Funkin/commit/ab5bda3ee573a6e03595ec6941e6de38df851889)) - by @ninjamuffin99 in [#3507](https://github.com/FunkinCrew/Funkin/pull/3507) -- Exiting the Chart Editor no longer crashes the game ([f52472a](https://github.com/FunkinCrew/Funkin/commit/f52472a4767388b22cfbab0f5f7860f6e6762856)) - by @EliteMasterEric and @ianharrigan in [#3519](https://github.com/FunkinCrew/Funkin/pull/3519) -- The millisecond counter in the Chart Editor playbar is now properly formatted ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) -- Pressing F1 multiple times no longer creates more than one help window in the Chart Editor ([777978f](https://github.com/FunkinCrew/Funkin/commit/777978f5a544e1b7c89b47dcc365f734eb6d0df1)) - by @amyspark-ng in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) -- The dialog box now shows up in the Animation Editor ([1fde59f](https://github.com/FunkinCrew/Funkin/commit/1fde59f999eac94eb10fc22094885de2f5310705)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) -- (debug) No more fullscreening when typing "F" in the flixel debugger console ([29b6763](https://github.com/FunkinCrew/Funkin/commit/29b6763290df05d42039806f3d142740568c80f0)) - by @ninjamuffin99 -- Added additional classes to Polymod blacklist for security ([b0b73c8](https://github.com/FunkinCrew/Funkin/commit/b0b73c83994f33118c6a69550da9ec8ec1c07adc)) - by @EliteMasterEric in [#3558](https://github.com/FunkinCrew/Funkin/pull/3558) +- Input offsets no longer cause songs to stutter or skip. ([410cfe9](https://github.com/FunkinCrew/Funkin/commit/410cfe972d6df9de4d4d128375cf8380c4f06d92)) - by @KoloInDaCrib in [#3546](https://github.com/FunkinCrew/Funkin/pull/3546) +- Exiting the Input Offset menu no longer crashes the game. ([39b1a42](https://github.com/FunkinCrew/Funkin/commit/39b1a42cfeafe2b7be8b66e2fe529e853d9ae197)) - by @lemz1 in [#3493](https://github.com/FunkinCrew/Funkin/pull/3493) +- Pico's songs now display properly in the Freeplay Menu. ([1d2bd61](https://github.com/FunkinCrew/Funkin/commit/1d2bd61119e5f418df7f11d7ef2a0fdedee17d3d)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- Fixed issues with variation/difficulty loading for Freeplay Menu which caused some songs to disappear. ([c0314c8](https://github.com/FunkinCrew/Funkin/commit/c0314c85ecd5116641aff3de8e9153f7fe48e79c)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- `Song.getFirstValidVariation()` now properly takes into account multiple variation/difficulty inputs. ([d2e2987](https://github.com/FunkinCrew/Funkin/commit/d2e29879fe2acc6febfe0f335f655b741d630c34)) - by @ninjamuffin99 in [#3506](https://github.com/FunkinCrew/Funkin/pull/3506) +- Song previews no longer restart when changing difficulties within the same variation. ([903b3fc](https://github.com/FunkinCrew/Funkin/commit/903b3fc59905a70802618a1cd67407722ea956ed)) - by @KoloInDaCrib in [#3587](https://github.com/FunkinCrew/Funkin/pull/3587) +- Main menu music no longer cuts out when switching states. ([711e0a6](https://github.com/FunkinCrew/Funkin/commit/711e0a6b7547eb04113e9318dab900f01ad576a5)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) +- Centered preloader 'fnf' and 'dsp' text so they don't clip anymore. ([165ad60](https://github.com/FunkinCrew/Funkin/commit/165ad6015539a295e9eefdaef291c312e9566b26)) - by @Burgerballs in [#3567](https://github.com/FunkinCrew/Funkin/pull/3567) +- FPS setting in options menu no longer flickers when selected. ([b2647fe](https://github.com/FunkinCrew/Funkin/commit/b2647fe09f5281ce7074b26d47bc1524764168ee)) - by @lemz1 in [#3629](https://github.com/FunkinCrew/Funkin/pull/3629) +- Volume sound tray is now anti-aliased/smoothed. ([e66290c](https://github.com/FunkinCrew/Funkin/commit/e66290c55f7141402223644f06ec8a69edeee089)) - by @Kn1ghtNight in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) +- Fixed looping animations for modded StrumlineNote sprites. ([bc546e8](https://github.com/FunkinCrew/Funkin/commit/bc546e86aa77ffc795b3f079de5f590289a9c583)) - by @DaWaterMalone in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) +- Stopped allowing inputs after selecting a character in Character Select. ([dbf66ac](https://github.com/FunkinCrew/Funkin/commit/dbf66ac250137262866d75f7c1387645b35d88d0)) - by @ACrazyTown in [#3398](https://github.com/FunkinCrew/Funkin/pull/3398) +- The player and girlfriend no longer disappear or overlap themselves in Character Select. ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- The player no longer enters twice after entering Character Select or when spamming buttons. ([30a9887](https://github.com/FunkinCrew/Funkin/commit/30a98871367b494c85934cd3fcfa91eeb774a7d5)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- The wrong girlfriend no longer appears in Character Select. ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Cursor now updates properly when moving and selecting in Character Select. ([9324359](https://github.com/FunkinCrew/Funkin/commit/9324359d2fce6a7097077d169a0efcd80e6fefa1)) - by @gamerbross in [#3457](https://github.com/FunkinCrew/Funkin/pull/3457) +- Cursor now moves properly at lower framerates in Character Select. ([ab5bda3](https://github.com/FunkinCrew/Funkin/commit/ab5bda3ee573a6e03595ec6941e6de38df851889)) - by @ninjamuffin99 in [#3507](https://github.com/FunkinCrew/Funkin/pull/3507) +- Exiting the Chart Editor no longer crashes the game. ([f52472a](https://github.com/FunkinCrew/Funkin/commit/f52472a4767388b22cfbab0f5f7860f6e6762856)) - by @EliteMasterEric and @ianharrigan in [#3519](https://github.com/FunkinCrew/Funkin/pull/3519) +- The millisecond counter in the Chart Editor playbar is now properly formatted. ([f1b6e6c](https://github.com/FunkinCrew/Funkin/commit/f1b6e6c4e42455e0c2900d738ebc24893f2479a0)) - by @afreetoplaynoob in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) +- Pressing F1 multiple times no longer creates more than one help window in the Chart Editor. ([777978f](https://github.com/FunkinCrew/Funkin/commit/777978f5a544e1b7c89b47dcc365f734eb6d0df1)) - by @amyspark-ng in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) +- The dialog box now shows up in the Animation Editor. ([1fde59f](https://github.com/FunkinCrew/Funkin/commit/1fde59f999eac94eb10fc22094885de2f5310705)) - by @EliteMasterEric in [#3530](https://github.com/FunkinCrew/Funkin/pull/3530) +- (debug) No more fullscreening when typing "F" in the flixel debugger console. ([29b6763](https://github.com/FunkinCrew/Funkin/commit/29b6763290df05d42039806f3d142740568c80f0)) - by @ninjamuffin99 +- Added additional classes to Polymod blacklist for security. ([b0b73c8](https://github.com/FunkinCrew/Funkin/commit/b0b73c83994f33118c6a69550da9ec8ec1c07adc)) - by @EliteMasterEric in [#3558](https://github.com/FunkinCrew/Funkin/pull/3558) ## New Contributors for 0.5.2 @@ -71,6 +64,7 @@ This patch resolves a critical issue which could cause user's save data to becom * @DaWaterMalone made their first contribution in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) + ## [0.5.1] - 2024-09-30 ### Added @@ -92,19 +86,18 @@ This patch resolves a critical issue which could cause user's save data to becom ### Changed -- The game's mod API version check is now more dynamic. - - The update accepts mods with API version `0.5.0` as well as `0.5.1`. - Pico is no longer unlocked for all players automatically. - You need to beat Weekend 1 in Story Mode in order to unlock him in Character Select. +- The game's mod API version check is now more dynamic. + - The update accepts mods with API version `0.5.0` as well as `0.5.1`. - Removed some of the more spammy `trace()` calls to improve debugging a bit. -- Improved some of the compilation and modding documentation. -- The game now complains if you create a song variation with symbols in the name. +- The game now complains if you create a song variation with symbols in its name. - Switched the force crash keybind from Ctrl-Shift-L to Ctrl-Alt-Shift-L. - Added some additional functions to `funkin.Assets` after `openfl.utils.Assets` had to get blacklisted from scripts. ### Fixed -- Pico is no longer locked every time the game starts, and you no longer have to watch the unlock animation each game boot. +- Pico is no longer locked every time the game starts, so you no longer have to watch the unlock animation each game boot. - The animation should now play only once per save file. - The clear % now displays in Freeplay after switching characters. - Character remixes no longer display the base song's highscore in Freeplay. @@ -160,15 +153,16 @@ This patch resolves a critical issue which could cause user's save data to becom * @Lethrial made their first contribution in [#3356](https://github.com/FunkinCrew/Funkin/pull/3356) + ## [0.5.0] - 2024-09-12 ### Added -- Added a new Character Select screen to switch between playable characters in Freeplay +- Added a new Character Select screen to switch between playable characters in Freeplay. - Modding isn't 100% there but we're working on it! -- Added Pico as a playable character! Unlock him by completing Weekend 1 (if you haven't already done that) - - The songs from Weekend 1 have moved; you must now switch to Pico via Character Select screen in Freeplay to access them -- Added 11 new Pico remixes! Access them by selecting Pico from in the Character Select screen +- Added Pico as a playable character! Unlock him by completing Weekend 1 (if you haven't already done that). + - The songs from Weekend 1 have moved; you must now switch to Pico via Character Select screen in Freeplay to access them. +- Added 11 new Pico remixes! Access them by selecting Pico in the Character Select screen. - Bopeebo (Pico Mix) - Fresh (Pico Mix) - DadBattle (Pico Mix) @@ -180,14 +174,14 @@ This patch resolves a critical issue which could cause user's save data to becom - Eggnog (Pico Mix) - Ugh (Pico Mix) - Guns (Pico Mix) -- Added 1 new Boyfriend remix! Access it by completing Weekend 1 as Pico and then selecting Boyfriend in the Character Select screen +- Added 1 new Boyfriend remix! Access it by completing Weekend 1 as Pico and then selecting Boyfriend in the Character Select screen. - Darnell (BF Mix) -- Added 2 new Erect remixes! Access them by switching difficulty on the song +- Added 2 new Erect remixes! Access them by switching difficulties on the songs. - Cocoa Erect - Ugh Erect -- Implemented support for a new Instrumental Selector in Freeplay - - Beating a Pico remix lets you use that instrumental when playing as Boyfriend -- Added the first batch of Erect Stages! These graphical overhauls of the original stages will be used when playing Erect remixes and Pico remixes +- Implemented support for a new Instrumental Selector in Freeplay. + - Beating a Pico remix lets you use that instrumental when playing as Boyfriend. +- Added the first batch of Erect Stages! These graphical overhauls of the original stages will be used when playing Erect remixes and Pico remixes: - Week 1 Erect Stage - Week 2 Erect Stage - Week 3 Erect Stage @@ -210,17 +204,16 @@ This patch resolves a critical issue which could cause user's save data to becom - Pixel character offsets have been modified to compensate. - Reworked the JSON merging system in Polymod; you can now include JSONPatch files under `_merge` in your mod folder to add, modify, or remove values in a JSON without replacing it entirely! - The `danceEvery` property of characters and stage props can now use values with a precision of `0.25`, to play their idle animation up to four times per beat. -- Characters now respect the `danceEvery` property ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2925)) +- Characters now respect the `danceEvery` property. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2925)) - Note style data can now specify custom combo count graphics, judgement graphics, countdown graphics, and countdown audio. ([community feature by anysad](https://github.com/FunkinCrew/Funkin/pull/3020)) - These were previously using hardcoded values based on whether the stage was `school` or `schoolEvil`. -- The YEAH! events in Tutorial now use chart events rather than being hard-coded ([community fix by anysad](https://github.com/FunkinCrew/Funkin/pull/3007)) -- Cutscenes now automatically pause when tabbing out ([community fix by AbnormalPoof](https://github.com/FunkinCrew/Funkin/pull/2903)) -- The F5 function now reloads the current song's chart data from disk ([community feature by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2990)) -- Made several layout improvements and fixes to the Animation Offsets editor in the Debug menu ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2820)) -- Animation offsets no longer directly modify the `x` and `y` position of props, which makes props work better with tweens ([community fix by Sword352](https://github.com/FunkinCrew/Funkin/pull/2310)) -- Fixed a bug where the Back sound would be not played when leaving the Story menu and Options menu ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2986)) -- The player's Score now displays commas in it (community fix by loggo) -- Refactored the compilation guide and added common troubleshooting steps ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2813)) +- The YEAH! events in Tutorial now use chart events rather than being hard-coded. ([community fix by anysad](https://github.com/FunkinCrew/Funkin/pull/3007)) +- Cutscenes now automatically pause when tabbing out. ([community fix by AbnormalPoof](https://github.com/FunkinCrew/Funkin/pull/2903)) +- The F5 function now reloads the current song's chart data from disk. ([community feature by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2990)) +- Made several layout improvements and fixes to the Animation Offsets editor in the Debug menu. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2820)) +- Animation offsets no longer directly modify the `x` and `y` position of props, making props work better with tweens. ([community fix by Sword352](https://github.com/FunkinCrew/Funkin/pull/2310)) +- Fixed a bug where the Back sound would be not played when leaving the Story menu and Options menu. ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2986)) +- The player's Score now displays commas in it. (community fix by loggo) ## Fixed @@ -228,22 +221,22 @@ This patch resolves a critical issue which could cause user's save data to becom - Note inputs are no longer accepted during the Thorns cutscene. - The old icon easter egg now works properly on pixel levels. - The Heart icon is no longer malformed when favoriting a song in Freeplay. -- Freeplay songs with no `Normal` difficulty no longer crash the game ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3036) and [gamerbross](https://github.com/FunkinCrew/Funkin/pull/2712)) -- Songs that aren't valid for the current variation can no longer be selected ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3037)) -- The Freeplay song preview now respects the instrumental ID specified in the song metadata ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2742)) -- Modded songs now play previews in the Freeplay menu ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2724)) -- The Story Mode menu can now be scrolled using the mouse wheel ([community fix by JVNpixels](https://github.com/FunkinCrew/Funkin/pull/2873)) -- Pressing F5 after seeing the sticker transition no longer crashes the game ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2863)) -- Pausing the game during a camera zoom no longer zooms the pause menu as well ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2567)) -- The song no longer majorly desyncs at times ([community fix by Burgerballs](https://github.com/FunkinCrew/Funkin/pull/3058)) -- Pico's death animation no longer displays a faint blue background ([community fix by doggogit](https://github.com/FunkinCrew/funkin.assets/pull/1)) -- The game now uses the placeholder health icon as a fallback ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/3005)) -- Pressing the Chart Editor keybind while playtesting a chart no longer resets the Chart Editor ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2739)) -- The Chart Editor no longer gets stuck creating a hold note when using Live Inputs ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2992)) -- Tankman's icon now displays in the Chart Editor ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2912)) -- The Memory Usage counter no longer overflows and displays a negative number ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2713)) -- Certain UI elements now flash at a consistent rate ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/2494)) -- Character graphics can now be placed in week folders ([community fix by 7oltan](https://github.com/FunkinCrew/Funkin/pull/3035)) +- Freeplay songs with no `Normal` difficulty no longer crash the game. ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3036) and [gamerbross](https://github.com/FunkinCrew/Funkin/pull/2712)) +- Songs that aren't valid for the current variation can no longer be selected. ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/3037)) +- The Freeplay song preview now respects the instrumental ID specified in the song metadata. ([community fix by AppleHair](https://github.com/FunkinCrew/Funkin/pull/2742)) +- Modded songs now play previews in the Freeplay menu. ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2724)) +- The Story Mode menu can now be scrolled using the mouse wheel. ([community fix by JVNpixels](https://github.com/FunkinCrew/Funkin/pull/2873)) +- Pressing F5 after seeing the sticker transition no longer crashes the game. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2863)) +- Pausing the game during a camera zoom no longer zooms the pause menu as well. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2567)) +- The song no longer majorly desyncs at times. ([community fix by Burgerballs](https://github.com/FunkinCrew/Funkin/pull/3058)) +- Pico's death animation no longer displays a faint blue background. ([community fix by doggogit](https://github.com/FunkinCrew/funkin.assets/pull/1)) +- The game now uses the placeholder health icon as a fallback. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/3005)) +- Pressing the Chart Editor keybind while playtesting a chart no longer resets the Chart Editor. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2739)) +- The Chart Editor no longer gets stuck creating a hold note when using Live Inputs. ([community fix by gamerbross](https://github.com/FunkinCrew/Funkin/pull/2992)) +- Tankman's icon now displays in the Chart Editor. ([community fix by Hundrec](https://github.com/FunkinCrew/Funkin/pull/2912)) +- The Memory Usage counter no longer overflows and displays a negative number. ([community fix by KarimAkra](https://github.com/FunkinCrew/Funkin/pull/2713)) +- Certain UI elements now flash at a consistent rate. ([community fix by cyn0x8](https://github.com/FunkinCrew/Funkin/pull/2494)) +- Character graphics can now be placed in week folders. ([community fix by 7oltan](https://github.com/FunkinCrew/Funkin/pull/3035)) ## New Contributors for 0.5.0 @@ -257,40 +250,40 @@ This patch resolves a critical issue which could cause user's save data to becom * @7oltan made their first contribution in [#3035](https://github.com/FunkinCrew/Funkin/pull/3035) + ## [0.4.1] - 2024-06-12 ### Added -- Pressing ESCAPE on the title screen on desktop now exits the game, allowing you to exit the game while in fullscreen on desktop +- Pressing ESCAPE on the title screen on desktop now exits the game, allowing you to exit the game while in fullscreen on desktop. - Freeplay menu controls (favoriting and switching categories) are now rebindable from the Options menu, and now have default binds on controllers. ### Changed -- Highscores and ranks are now saved separately, which fixes the issue where people would overwrite their saves with higher scores, -which would remove their rank if they had a lower one. -- A-Bot speaker now reacts to the user's volume preference on desktop ([thanks to M7theguy for the issue report/suggestion](https://github.com/FunkinCrew/Funkin/issues/2744)!) -- On Freeplay, heart icons are shifted to the right when you favorite a song that has no rank on it. -- Only play `scrollMenu` sound effect when there's a real change on the Freeplay menu ([thanks gamerbross for the PR!](https://github.com/FunkinCrew/Funkin/pull/2741)) -- Gave antialiasing to the edge of the dad graphic on Freeplay -- Rearranged some controls in the controls menu -- Made several chart revisions +- Highscores and ranks are now saved separately, fixing an issue where lower ranks would overwrite higher ranks if the player achieved a new highscore. +- A-Bot speaker now reacts to the user's volume preference on desktop. ([thanks to M7theguy for the issue report/suggestion](https://github.com/FunkinCrew/Funkin/issues/2744)!) +- Freeplay heart icons are now shifted to the right when favoriting a song with no rank. +- The `scrollMenu` sound effect now only plays when there's a real change on the Freeplay menu. ([thanks gamerbross for the PR!](https://github.com/FunkinCrew/Funkin/pull/2741)) +- Applied anti-aliasing to the edge of the Freeplay Dad graphic. +- Rearranged some controls in the controls menu. +- Made several chart revisions: - Re-enabled custom camera events in Roses (Erect/Nightmare) - - Tweaked the chart for Lit Up (Hard) - - Corrected the difficulty ratings for M.I.L.F (Easy/Normal/Hard) + - Tweaked chart for Lit Up (Hard) + - Corrected difficulty ratings for M.I.L.F (Easy/Normal/Hard) ### Fixed -- Control binds in the controls menu no longer overlap their names -- Attempting to exit the gameover screen and retry the song at the same time no longer crashes the game ([thanks DMMaster636 for the PR!](https://github.com/FunkinCrew/Funkin/pull/2709)) -- Botplay mode now handles the player's animations properly during hold notes ([thanks Hundrec!](https://github.com/FunkinCrew/Funkin/pull/2683)) -- Camera movement now pauses when the game is paused ([thanks Matriculaso!](https://github.com/FunkinCrew/Funkin/pull/2684)) -- Pico's gameplay sprite no longer appears on the gameover screen when dying from an explosion in 2hot -- Freeplay previews now properly fade in volume during the BF idle animation -- DadBattle no longer incorrectly appears as DadBattle Erect when returning to Freeplay on Hard -- 2hot now appears under the "#" category in Freeplay menu -- The Chart Editor no longer crashes when selecting an event with the Event toolbox open -- Improved offsets for Pico and Tankman opponents so they don't slide around as much -- The black "temp" graphic in Freeplay is now correctly sized/masked, now it's identical to the Dad Freeplay graphic +- Control binds in the controls menu no longer overlap their names. +- Attempting to exit the gameover screen and retry the song at the same time no longer crashes the game. ([thanks DMMaster636 for the PR!](https://github.com/FunkinCrew/Funkin/pull/2709)) +- Botplay mode now handles the player's animations properly during hold notes. ([thanks Hundrec!](https://github.com/FunkinCrew/Funkin/pull/2683)) +- Camera movement now pauses when the game is paused. ([thanks Matriculaso!](https://github.com/FunkinCrew/Funkin/pull/2684)) +- Pico's gameplay sprite no longer appears on the gameover screen when dying from an explosion in 2hot. +- Freeplay previews now properly fade in volume during the BF idle animation. +- DadBattle no longer incorrectly appears as DadBattle Erect when returning to Freeplay on Hard. +- 2hot now appears under the "#" category in Freeplay menu. +- The Chart Editor no longer crashes when selecting an event with the Event toolbox open. +- Improved offsets for Pico and Tankman opponents so they don't slide around as much. +- The black "temp" graphic in Freeplay is now correctly sized/masked, now it's identical to the Dad Freeplay graphic. ## New Contributors for 0.4.1 @@ -298,6 +291,7 @@ which would remove their rank if they had a lower one. * @DMMaster636 made their first contribution in [#2709](https://github.com/FunkinCrew/Funkin/pull/2709) + ## [0.4.0] - 2024-06-06 ### Added @@ -308,11 +302,11 @@ which would remove their rank if they had a lower one. - Freeplay now plays a preview of songs when you hover over them. - Added a Charter field to the chart format, to allow for crediting the creator of a level's chart. - You can see who charted a song from the Pause menu. -- Added a new Scroll Speed chart event to change the note speed mid-song ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2409)) +- Added a new Scroll Speed chart event to change the note speed mid-song. ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2409)) ### Changed -- Tweaked the charts for several songs: +- Tweaked charts for several songs: - Tutorial (increased the note speed slightly) - Spookeez - Monster @@ -334,26 +328,25 @@ which would remove their rank if they had a lower one. ### Fixed -- Nene's visualizer now plays on Desktop builds -- The game no longer silently fails to load saves on HTML5 -- Props on the Story Menu now bop properly -- Additional fixes for the loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2553)) -- Fixed several bugs with the TitleState, including missing music when returning from the Main Menu ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2539)) -- The Main Menu camera now properly follows the selected item ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2576)) -- Changing difficulties in Story Mode now updates the score text ([thanks sector-a!](https://github.com/FunkinCrew/Funkin/pull/2585)) -- Fixed a crash in Freeplay caused by a level referencing an invalid song ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2457)) -- Pressing the volume keys no longer stops the Toy commercial ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2540)) -- Playtesting in the Chart Editor no longer crashes when losing ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2518)) -- Hold notes now display properly in the Chart Editor when downscroll is enabled for gameplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2565)) -- Hold notes are now positioned correctly with downscroll enabled ([thanks MaybeMaru!](https://github.com/FunkinCrew/Funkin/pull/2488)) -- Removed a large number of unused imports to optimize builds ([thanks Ethan-makes-music!](https://github.com/FunkinCrew/Funkin/pull/2624)) -- Improved debug logging for unscripted stages ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2603)) -- Fixed a crash on Linux caused by an old version of hxCodec ([thanks Noobz4Life!](https://github.com/FunkinCrew/Funkin/pull/2472)) -- Optimized animation handling for characters ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2493)) -- The Chart Editor no longer uses an incorrect instrumental on imported Legacy songs ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2604)) -- Opening the game from the command line no longer crashes the preloader ([thanks NotHyper-474!](https://github.com/FunkinCrew/Funkin/pull/2629)) -- Characters no longer use the wrong scale value sometimes ([thanks PurSnake!](https://github.com/FunkinCrew/Funkin/pull/2610)) -- Made improvements to compiling documentation (thanks gedehari!) +- Nene's visualizer now plays on Desktop builds. +- The game no longer silently fails to load saves on HTML5. +- Props on the Story Menu now bop properly. +- Additional fixes for the loading bar on HTML5. ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2553)) +- Fixed several bugs with the TitleState, including missing music when returning from the Main Menu. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2539)) +- The Main Menu camera now properly follows the selected item. ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2576)) +- Changing difficulties in Story Mode now updates the score text. ([thanks sector-a!](https://github.com/FunkinCrew/Funkin/pull/2585)) +- Fixed a crash in Freeplay caused by a level referencing an invalid song. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2457)) +- Pressing the volume keys no longer stops the Toy commercial. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2540)) +- Playtesting in the Chart Editor no longer crashes when losing. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2518)) +- Hold notes now display properly in the Chart Editor when downscroll is enabled for gameplay. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2565)) +- Hold notes are now positioned correctly with downscroll enabled. ([thanks MaybeMaru!](https://github.com/FunkinCrew/Funkin/pull/2488)) +- Removed a large number of unused imports to optimize builds. ([thanks Ethan-makes-music!](https://github.com/FunkinCrew/Funkin/pull/2624)) +- Improved debug logging for unscripted stages. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2603)) +- Fixed a crash on Linux caused by an old version of hxCodec. ([thanks Noobz4Life!](https://github.com/FunkinCrew/Funkin/pull/2472)) +- Optimized animation handling for characters. ([thanks richTrash21!](https://github.com/FunkinCrew/Funkin/pull/2493)) +- The Chart Editor no longer uses an incorrect instrumental on imported Legacy songs. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2604)) +- Opening the game from the command line no longer crashes the preloader. ([thanks NotHyper-474!](https://github.com/FunkinCrew/Funkin/pull/2629)) +- Characters no longer use the wrong scale value sometimes. ([thanks PurSnake!](https://github.com/FunkinCrew/Funkin/pull/2610)) - Additional bug fixes and optimizations. ## New Contributors for 0.4.0 @@ -368,29 +361,30 @@ which would remove their rank if they had a lower one. * @NotHyper-474 made their first contribution in [#2629](https://github.com/FunkinCrew/Funkin/pull/2629) + ## [0.3.3] - 2024-05-14 ### Changed -- Cleaned up some code in `PlayAnimationSongEvent.hx` ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2308)) +- Cleaned up some code in `PlayAnimationSongEvent.hx`. ([thanks Burgerballs!](https://github.com/FunkinCrew/Funkin/pull/2308)) ### Fixed -- Fixes for the Loading bar on HTML5 ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2499)) -- Don't allow inputs when exiting Freeplay ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2470)) -- Fixed mouse wheel scrolling in Freeplay ([thanks JugieNoob!](https://github.com/FunkinCrew/Funkin/pull/2466)) -- Health icons, score, and notes now reset properly when re-entering gameplay from gameover ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2390)) -- Fixed the character selector's hitbox width in the Chart Editor ([thanks MadBear422!](https://github.com/FunkinCrew/Funkin/pull/2370)) -- Fixed camera stutter once a wipe transition to the Main Menu completes ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2315)) -- Hold notes no longer become invisible for a single frame ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2309)) -- Tweens no longer accumulate on the Title screen when pressing Y multiple times ([thanks TheGaloXx!](https://github.com/FunkinCrew/Funkin/pull/2300)) -- Fixed a crash when querying FlxG.state in the crash handler -- Fixed a game over easter egg so you don't accidentally exit it when viewing -- The Freeplay menu can now display 100% clear -- Weekend 1 Pico no longer attempts to retrieve a missing asset -- Fixed an issue where duplicate keybinds would be stored, potentially causing a crash -- Chart debug key now properly returns you to the previous chart editor session if you were playtesting a chart ([thanks nebulazorua!](https://github.com/FunkinCrew/Funkin/pull/2323)) -- Fixed a crash on Freeplay found on AMD graphics cards +- Fixes for the Loading bar on HTML5. ([thanks lemz1!](https://github.com/FunkinCrew/Funkin/pull/2499)) +- Don't allow inputs when exiting Freeplay. ([thanks gamerbross!](https://github.com/FunkinCrew/Funkin/pull/2470)) +- Fixed mouse wheel scrolling in Freeplay. ([thanks JugieNoob!](https://github.com/FunkinCrew/Funkin/pull/2466)) +- Health icons, score, and notes now reset properly when re-entering gameplay from gameover. ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2390)) +- Fixed the character selector's hitbox width in the Chart Editor. ([thanks MadBear422!](https://github.com/FunkinCrew/Funkin/pull/2370)) +- Fixed camera stutter once a wipe transition to the Main Menu completes. ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2315)) +- Hold notes no longer become invisible for a single frame. ([thanks ImCodist!](https://github.com/FunkinCrew/Funkin/pull/2309)) +- Tweens no longer accumulate on the Title screen when pressing Y multiple times. ([thanks TheGaloXx!](https://github.com/FunkinCrew/Funkin/pull/2300)) +- Fixed a crash when querying FlxG.state in the crash handler. +- Fixed a game over easter egg so you don't accidentally exit it when viewing. +- The Freeplay menu can now display 100% clear. +- Weekend 1 Pico no longer attempts to retrieve a missing asset. +- Fixed an issue where duplicate keybinds would be stored, potentially causing a crash. +- Chart debug key now properly returns you to the previous chart editor session if you were playtesting a chart. ([thanks nebulazorua!](https://github.com/FunkinCrew/Funkin/pull/2323)) +- Fixed a crash on Freeplay found on AMD graphics cards. ## New Contributors for 0.3.3 @@ -404,6 +398,7 @@ which would remove their rank if they had a lower one. * @lemz1 made their first contribution in [#2499](https://github.com/FunkinCrew/Funkin/pull/2499) + ## [0.3.2] - 2024-05-03 ### Added @@ -412,7 +407,7 @@ which would remove their rank if they had a lower one. - Implemented a blacklist to prevent mods from calling system functions. - Added a couple utility functions to call useful stuff that got blacklisted. - Added an `onSongLoad` script event which allows for mutation of notes and events. -- Added the current loaded modlist to crash logs. +- Added the currently loaded modlist to crash logs. - Added the `visible` attribute to Level JSON data. - Enabled ZIP file system support for Polymod (make sure the metadata is in the root of the ZIP). @@ -420,7 +415,7 @@ which would remove their rank if they had a lower one. - Songs in the mod folders will display in Freeplay without any extra scripting. - Story levels in the mod folders will display in Story without any extra scripting. -- All audio should sound better in HTML5, less muddy +- All audio should sound better in HTML5, less muddy. ### Fixed @@ -431,13 +426,14 @@ which would remove their rank if they had a lower one. - Trying to load into the Animation Offsets menu with an invalid character no longer crashes the game. - The preloader no longer spams the logs when it is complete and waiting for user input. - Should definitely have the fix for Freeplay where it stops taking control of the main menu below it. -- Changed the code for the Story Mode menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1 +- Changed the code for the Story Mode menu difficulties so that "normal" doesn't overlap the arrows after leaving Weekend 1. ### Removed - Removed some unused `.txt` files in the `assets/data` folder. + ## [0.3.1] - 2024-05-01 ### Changed @@ -459,11 +455,12 @@ which would remove their rank if they had a lower one. - Arrow keys no longer cause the web browser page to scroll. + ## [0.3.0] - 2024-04-30 ### Added -- New Story Level: Weekend 1, starting Pico, Darnell, and Nene. +- New Story Level: Weekend 1, starring Pico, Darnell, and Nene. - Beat the level in Story Mode to unlock the songs for Freeplay! - 12 new Erect remixes, featuring Kawai Sprite, Saruky, Kohta Takahashi, and Saster. - Unlocked instantly in Freeplay @@ -499,6 +496,7 @@ which would remove their rank if they had a lower one. - 17 quadrillion bugs across hundreds of PRs. + ## [0.2.8] - 2021-04-18 (note, this one is iffy cuz we slacked wit it lol!) ### Added @@ -520,6 +518,7 @@ which would remove their rank if they had a lower one. - That one random note on Bopeebo + ## [0.2.7.1] - 2021-02-14 ### Added @@ -544,6 +543,7 @@ which would remove their rank if they had a lower one. - Antialiasing on the skyscraper lights + ## [0.2.7] - 2021-02-02 ### Added @@ -564,6 +564,7 @@ which would remove their rank if they had a lower one. - Idle animation bug with BF christmas and BF hair blow sprites ([Thanks to Injourn for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/237)) + ## [0.2.6] - 2021-01-20 ### Added @@ -593,6 +594,7 @@ which would remove their rank if they had a lower one. - Boyfriend animations on hold notes, and pressing on repeating notes should behave differently + ## [0.2.5] - 2020-12-27 ### Added @@ -617,6 +619,7 @@ which would remove their rank if they had a lower one. - IDK i think backing out of song menu should play main menu songs again hehe ([shoutouts gedehari for the Pull Request!](https://github.com/FunkinCrew/Funkin/pull/48)) + ## [0.2.4] - 2020-12-11 ### Added @@ -635,6 +638,7 @@ which would remove their rank if they had a lower one. - Animation offsets when GF is scared + ## [0.2.3] - 2020-12-04 ### Added @@ -649,6 +653,7 @@ which would remove their rank if they had a lower one. - Fixed tiny note bleed over thingies (shoutouts [lotusotho](https://github.com/FunkinCrew/Funkin/pull/24)) + ## [0.2.2] - 2020-11-20 ### Added @@ -673,6 +678,7 @@ which would remove their rank if they had a lower one. - Animation issue where GF would freak out on the title screen if you returned to it([shoutouts MultiXIII](https://github.com/FunkinCrew/Funkin/issues/12)). + ## [0.2.1.2] - 2020-11-06 ### Fixed @@ -682,6 +688,7 @@ which would remove their rank if they had a lower one. - Hard mode difficulty on campaign levels have been fixed + ## [0.2.1.1] - 2020-11-06 ### Fixed @@ -689,6 +696,7 @@ which would remove their rank if they had a lower one. - Week 2 not unlocking properly + ## [0.2.1] - 2020-11-06 ### Added @@ -709,6 +717,7 @@ which would remove their rank if they had a lower one. - One of the charting bits on South and Spookeez during the intro. + ## [0.2.0] - 2020-11-01 ### Added @@ -716,6 +725,7 @@ which would remove their rank if they had a lower one. - Uhh Newgrounds release lolol I always lose track of shit. + ## [0.1.0] - 2020-10-05 ### Added From 4383fcf32c280a1c0ee7b9c80d255611d497cabc Mon Sep 17 00:00:00 2001 From: Hundrec Date: Fri, 14 Mar 2025 00:14:03 -0600 Subject: [PATCH 29/81] Correctly list all new contributors since Weekend 1 Gives those contributors their credit! Lists all first-time GitHub contributors, even if their change isn't listed as an entry in the Changelog. Quadruple-checked for good measure. --- CHANGELOG.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f33ea2bf6..5754bc43a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,7 +58,6 @@ This patch resolves a critical issue that could cause user's save data to become * @Kn1ghtNight made their first contribution in [#2853](https://github.com/FunkinCrew/Funkin/pull/2853) * @Cartridge-Man made their first contribution in [#3082](https://github.com/FunkinCrew/Funkin/pull/3082) -* @KoloInDaCrib made their first contribution in [#3482](https://github.com/FunkinCrew/Funkin/pull/3482) * @afreetoplaynoob made their first contribution in [#3537](https://github.com/FunkinCrew/Funkin/pull/3537) * @amyspark-ng made their first contribution in [#3552](https://github.com/FunkinCrew/Funkin/pull/3552) * @DaWaterMalone made their first contribution in [#3577](https://github.com/FunkinCrew/Funkin/pull/3577) @@ -140,7 +139,7 @@ This patch resolves a critical issue that could cause user's save data to become - The FPS counter no longer displays if Debug Display is turned off. ([community fix by Lethrial](https://github.com/FunkinCrew/Funkin/pull/3356)) - The Chart Editor can now be interacted with properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3337)) - Selecting the area to the left of the Chart Editor no longer selects some of the player's notes. ([community fix by NotHyper-474](https://github.com/FunkinCrew/Funkin/pull/3093)) -- Pixel icons now display correctly in the Chart Editor. ([community fix by Techniktil](https://github.com/FunkinCrew/Funkin/pull/3339)) +- Pixel icons now display correctly in the Chart Editor. ([community fix by TechnikTil](https://github.com/FunkinCrew/Funkin/pull/3339)) - Audio offsets now interact with the Chart Editor properly. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3384)) - Players can no longer crash the game by interacting with Character Select during the unlock sequence. ([community fix by ActualMandM](https://github.com/FunkinCrew/Funkin/pull/3355)) - `Stage.addCharacter` now properly assigns the `characterType`. ([community fix by Kade-github](https://github.com/FunkinCrew/Funkin/pull/3357)) @@ -151,6 +150,7 @@ This patch resolves a critical issue that could cause user's save data to become * @dombomb64 made their first contribution in [#3351](https://github.com/FunkinCrew/Funkin/pull/3351) * @Lethrial made their first contribution in [#3356](https://github.com/FunkinCrew/Funkin/pull/3356) +* @KoloInDaCrib made their first contribution in [#3371](https://github.com/FunkinCrew/Funkin/pull/3371) @@ -243,9 +243,11 @@ This patch resolves a critical issue that could cause user's save data to become * @Sword352 made their first contribution in [#2310](https://github.com/FunkinCrew/Funkin/pull/2310) * @cyn0x8 made their first contribution in [#2494](https://github.com/FunkinCrew/Funkin/pull/2494) * @KarimAkra made their first contribution in [#2713](https://github.com/FunkinCrew/Funkin/pull/2713) +* @tposejank made their first contribution in [#2717](https://github.com/FunkinCrew/Funkin/pull/2717) * @AppleHair made their first contribution in [#2742](https://github.com/FunkinCrew/Funkin/pull/2742) * @JVNpixels made their first contribution in [#2873](https://github.com/FunkinCrew/Funkin/pull/2873) * @Flooferland made their first contribution in [#2942](https://github.com/FunkinCrew/Funkin/pull/2942) +* @Punkinator7 made their first contribution in [#2962](https://github.com/FunkinCrew/Funkin/pull/2962) * @anysad made their first contribution in [#3007](https://github.com/FunkinCrew/Funkin/pull/3007) * @7oltan made their first contribution in [#3035](https://github.com/FunkinCrew/Funkin/pull/3035) @@ -287,8 +289,9 @@ This patch resolves a critical issue that could cause user's save data to become ## New Contributors for 0.4.1 -* @Hundrec made their first contribution in [#2683](https://github.com/FunkinCrew/Funkin/pull/2683) +* @Hundrec made their first contribution in [#2661](https://github.com/FunkinCrew/Funkin/pull/2661) * @DMMaster636 made their first contribution in [#2709](https://github.com/FunkinCrew/Funkin/pull/2709) +* @eltociear made their first contribution in [#2730](https://github.com/FunkinCrew/Funkin/pull/2730) @@ -353,12 +356,17 @@ This patch resolves a critical issue that could cause user's save data to become * @Noobz4Life made their first contribution in [#2472](https://github.com/FunkinCrew/Funkin/pull/2472) * @MaybeMaru made their first contribution in [#2488](https://github.com/FunkinCrew/Funkin/pull/2488) +* @NotHyper-474 made their first contribution in [#2490](https://github.com/FunkinCrew/Funkin/pull/2490) * @richTrash21 made their first contribution in [#2493](https://github.com/FunkinCrew/Funkin/pull/2493) +* @TechnikTil made their first contribution in [#2508](https://github.com/FunkinCrew/Funkin/pull/2508) +* @SanicBTW made their first contribution in [#2544](https://github.com/FunkinCrew/Funkin/pull/2544) +* @EnterTheVoid-x86 made their first contribution in [#2573](https://github.com/FunkinCrew/Funkin/pull/2573) * @Keoiki made their first contribution in [#2581](https://github.com/FunkinCrew/Funkin/pull/2581) * @sector-a made their first contribution in [#2585](https://github.com/FunkinCrew/Funkin/pull/2585) * @PurSnake made their first contribution in [#2610](https://github.com/FunkinCrew/Funkin/pull/2610) * @Ethan-makes-music made their first contribution in [#2624](https://github.com/FunkinCrew/Funkin/pull/2624) -* @NotHyper-474 made their first contribution in [#2629](https://github.com/FunkinCrew/Funkin/pull/2629) +* @An-enderman made their first contribution in [#2662](https://github.com/FunkinCrew/Funkin/pull/2662) +* @moondroidcoder made their first contribution in [#2701](https://github.com/FunkinCrew/Funkin/pull/2701) @@ -388,6 +396,7 @@ This patch resolves a critical issue that could cause user's save data to become ## New Contributors for 0.3.3 +* @Chubercik made their first contribution in [#2297](https://github.com/FunkinCrew/Funkin/pull/2297) * @TheGaloXx made their first contribution in [#2300](https://github.com/FunkinCrew/Funkin/pull/2300) * @Burgerballs made their first contribution in [#2308](https://github.com/FunkinCrew/Funkin/pull/2308) * @ImCodist made their first contribution in [#2309](https://github.com/FunkinCrew/Funkin/pull/2309) From 055c4d9b752f9c6a9d9b806f01ce21b95afbe811 Mon Sep 17 00:00:00 2001 From: Lasercar Date: Sun, 23 Feb 2025 16:52:24 +1000 Subject: [PATCH 30/81] Add remaining debug keys --- docs/Funkin' Debug Hotkeys.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index cf85c6c59..0f92170bb 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -3,6 +3,7 @@ Most of this functionality is only available on debug builds of the game! ## Any State +- `INSERT`: ***MEMORY GARBAGE COLLECTION***: Immediately perform memory garbage collection. - `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! @@ -11,6 +12,9 @@ Most of this functionality is only available on debug builds of the game! - `CTRL-SHIFT-L`: ***FORCE CRASH***: Immediately crash the game with a detailed crash log and a stack trace. +## Loading State +- `SPACE`: Trace callbacks. + ## **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. @@ -19,20 +23,29 @@ Most of this functionality is only available on debug builds of the game! - `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. +- `CHART Hotkey`: ***OPEN CHART EDITOR ON SONG***: Redirect to the chart editor playing the current song. +- `STAGE Hotkey`: ***OPEN STAGE EDITOR ON STAGE***: Open the stage editor overlaying the current state. ## **Freeplay State** -- `F` (Freeplay Menu) - Move to Favorites -- `Q` (Freeplay Menu) - Back one category -- `E` (Freeplay Menu) - Forward one category +- `CTRL-HOLD`: When a song preview is played it will instead play the preview for the first variation available for that song. +- `SHIFT-HOLD`: ***BOTPLAY***: Will enable botplay when a song is started. +- `P`: ***SWITCH TO PICO/BF***: Switch to Pico or BF (reopens Freeplay as the other character). +- `T`: ***TEST RANK***: Test rank the tutorial (/random if the character has no variation for it) with Perfect Gold. +- `CTRL+LEFT`/`RIGHT`/`UP`/`DOWN+SHIFT/ALT`: ***OFFSET BF DJ IN CARTOON STATE***: Offset the BF DJ in the cartoon state by 1 pixel in that direction. `SHIFT` to move 10 pixels, `ALT` to move 0.1 pixels. +- `CTRL+C`: ***SET/UNSET DJ CARTOON***: Set the Freeplay DJ's state to cartoon, or change it back to idle. ## **Title State** -- `Y` - WOAH +- `ESCAPE`: ***QUIT***: Quit the game. +- `D`: COOL +- `UI LEFT`/`UI RIGHT Hotkey`: 2COOL +- `Y`: WOAH ## **Main Menu** +- `SHIFT-HOLD`: ***OPEN FREEPLAY WITH PICO***: Entering freeplay will set the target character to Pico. - `~`: ***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. - `CTRL-ALT-SHIFT-M`: ***NO MORE ACCESS***: Re-locks all songs in Freeplay except those unlocked by default. Only available on debug builds. - `CTRL-ALT-SHIFT-R`: ***GREAT SCORE?***: Give the user a hypothetical overridden score, and see if we can maintain that golden P rank. Only available on debug builds. - `CTRL-ALT-SHIFT-P`: ***CHARACTER UNLOCK SCREEN***: Forces the Character Select screen to play Pico's unlocking animation. Only available on debug builds. - `CTRL-ALT-SHIFT-N`: ***CHARACTER NOT SEEN***: Marks all characters as not seen and enables BF's new character unlocked animation in Freeplay. Only available on debug builds. -- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Prompts the user to save their save data as a JSON file, so its contents can be viewed. Only available on debug builds. \ No newline at end of file +- `CTRL-ALT-SHIFT-E`: ***DUMP SAVE DATA***: Prompts the user to save their save data as a JSON file, so its contents can be viewed. Only available on debug builds. From b74df06f48400bdb3c23dd27ad69a24b92cfe625 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Fri, 14 Mar 2025 21:09:01 -0600 Subject: [PATCH 31/81] Reword some debug hotkeys --- docs/Funkin' Debug Hotkeys.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/Funkin' Debug Hotkeys.md b/docs/Funkin' Debug Hotkeys.md index 0f92170bb..9c10f060c 100644 --- a/docs/Funkin' Debug Hotkeys.md +++ b/docs/Funkin' Debug Hotkeys.md @@ -23,16 +23,16 @@ Most of this functionality is only available on debug builds of the game! - `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. -- `CHART Hotkey`: ***OPEN CHART EDITOR ON SONG***: Redirect to the chart editor playing the current song. -- `STAGE Hotkey`: ***OPEN STAGE EDITOR ON STAGE***: Open the stage editor overlaying the current state. +- `CHART Hotkey`: ***OPEN CHART EDITOR***: Open the Chart Editor with the current song loaded. +- `STAGE Hotkey`: ***OPEN STAGE EDITOR***: Open the old Stage Editor overlay. ## **Freeplay State** -- `CTRL-HOLD`: When a song preview is played it will instead play the preview for the first variation available for that song. -- `SHIFT-HOLD`: ***BOTPLAY***: Will enable botplay when a song is started. - `P`: ***SWITCH TO PICO/BF***: Switch to Pico or BF (reopens Freeplay as the other character). -- `T`: ***TEST RANK***: Test rank the tutorial (/random if the character has no variation for it) with Perfect Gold. -- `CTRL+LEFT`/`RIGHT`/`UP`/`DOWN+SHIFT/ALT`: ***OFFSET BF DJ IN CARTOON STATE***: Offset the BF DJ in the cartoon state by 1 pixel in that direction. `SHIFT` to move 10 pixels, `ALT` to move 0.1 pixels. -- `CTRL+C`: ***SET/UNSET DJ CARTOON***: Set the Freeplay DJ's state to cartoon, or change it back to idle. +- `T`: ***TEST RANK ANIMATION***: Play the Gold Perfect rank animation on the currently selected song. +- `SHIFT-ACCEPT`: ***BOTPLAY MODE***: Start a song with Botplay mode enabled. +- `CTRL-Switch Song`: Play the first unlocked alternate instrumental as the song preview. +- `CTRL-LEFT`/`RIGHT`/`UP`/`DOWN`: ***OFFSET BF DJ IN CARTOON STATE***: While BF DJ's TV animation is playing, offset the DJ by 1 pixel in the opposite direction. `SHIFT` to move 10 pixels, `ALT` to move 0.1 pixels. +- `CTRL-C`: ***TRIGGER DJ CARTOON***: Play the Freeplay DJ's cartoon animation. Press again to return to its regular animation. ## **Title State** - `ESCAPE`: ***QUIT***: Quit the game. @@ -41,8 +41,8 @@ Most of this functionality is only available on debug builds of the game! - `Y`: WOAH ## **Main Menu** -- `SHIFT-HOLD`: ***OPEN FREEPLAY WITH PICO***: Entering freeplay will set the target character to Pico. - `~`: ***DEBUG***: Opens a menu to access the Chart Editor and other work-in-progress editors. Rebindable in the options menu. +- `SHIFT-ACCEPT`: ***OPEN FREEPLAY AS PICO***: When selecting Freeplay, open the Freeplay menu with the playable character set to Pico. - `CTRL-ALT-SHIFT-W`: ***ALL ACCESS***: Unlocks all songs in Freeplay. Only available on debug builds. - `CTRL-ALT-SHIFT-M`: ***NO MORE ACCESS***: Re-locks all songs in Freeplay except those unlocked by default. Only available on debug builds. - `CTRL-ALT-SHIFT-R`: ***GREAT SCORE?***: Give the user a hypothetical overridden score, and see if we can maintain that golden P rank. Only available on debug builds. From 871709bb7d63963ba5855cd269ef99520c04684c Mon Sep 17 00:00:00 2001 From: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> Date: Wed, 19 Mar 2025 19:43:42 -0500 Subject: [PATCH 32/81] Some additions to the Contributor's Guide Co-authored-by: Hundrec Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> --- docs/CONTRIBUTING.md | 238 +++++++++++++++++++++++++++++++------------ 1 file changed, 175 insertions(+), 63 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 13e2e3543..8cf9174af 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing Welcome to the Contributing Guide! -You can contribute to the Funkin' repository by opening issues or pull requests. +You can contribute to the Funkin' repository by opening issues or pull requests. This guide will cover best practices for each type of contribution. @@ -11,7 +11,7 @@ This guide will cover best practices for each type of contribution. [Part 1: Etiquette](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#part-1-etiquette)
-Part 2: Issues +Part 2: Issues * [Requirements](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#requirements) @@ -24,8 +24,8 @@ This guide will cover best practices for each type of contribution.
- -Part 3: Pull Requests + +Part 3: Pull Requests * [Choosing a base branch](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#choosing-a-base-branch) @@ -39,6 +39,8 @@ This guide will cover best practices for each type of contribution. * [funkin.assets PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#funkinassets-prs) + * [Charting PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#charting-prs) +
[Closing](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#closing) @@ -54,7 +56,7 @@ This guide will cover best practices for each type of contribution. # Part 2: Issues Issues serve many purposes, from reporting bugs to suggesting new features. -This section provides guidelines to follow when [opening an issue](https://github.com/FunkinCrew/Funkin/issues). +This section provides guidelines to follow when [opening an issue](https://github.com/FunkinCrew/Funkin/issues). ## Requirements Make sure you're playing: @@ -84,7 +86,7 @@ Here's a list of commonly suggested features and the reasons why they won't be a | "Philly Glow" Effect from Psych Engine | https://github.com/FunkinCrew/Funkin/issues/3788#issuecomment-2688966982 | | Importing Charts from Psych Engine (and other mod content) | https://github.com/FunkinCrew/Funkin/issues/2586#issuecomment-2125733327 | | Backwards Compatibility for Modding | https://github.com/FunkinCrew/Funkin/issues/3949#issuecomment-2608391329 | -| Lua Support | https://github.com/FunkinCrew/Funkin/issues/2643#issuecomment-2143718093 | +| Lua Support | https://github.com/FunkinCrew/Funkin/issues/2643#issuecomment-2143718093 | ## Issue Types @@ -122,6 +124,9 @@ Also only report one issue or enhancement at a time! If you have multiple bug re Once you're sure your issue is unique and specific, feel free to submit it. +> [!IMPORTANT] +> **DO NOT CLOSE YOUR ISSUE FOR ANY REASON!** Your issue will be taken care of by a moderator! + **Thank you for opening issues!** # Part 3: Pull Requests @@ -133,6 +138,7 @@ When creating a branch in your fork, base your branch on either the `main` or `d > [!CAUTION] > Avoid using your fork's default branch (`main` in this case) for your PR. This is considered an [anti-pattern](https://jmeridth.com/posts/do-not-issue-pull-requests-from-your-master-branch/) by GitHub themselves! +> Instead, make a separate branch for your additions (ex. `docs/fix-typo` or `minor-bugfix`). Choose the `main` branch if you modify: - Documentation (`.md` files) @@ -165,85 +171,173 @@ This process reapplies your changes on top of the updated branch and cleanly res > This guide does not cover compiling. If you have trouble compiling the game, refer to the [Compilation Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/COMPILING.md). Code-based PRs make changes such as **fixing bugs** or **implementing new features** in the game. + This involves modifying one or several of the repository’s `.hx` files, found within the `source/` folder. ### Codestyle -Before submitting your PR, check that your code follows the [Style Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/style-guide.md). +Before submitting your PR, check that your code follows the [Style Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/style-guide.md). This keeps your code consistent with the rest of the codebase! +### Code comments +Code comments help others understand your changes, so the way you write them is important! Here are some guidelines for writing comments in your code: -- Leave comments only when you believe a piece of code warrants explanation. +- Leave comments only when you believe a piece of code warrants explanation. If a piece of code is self-explanatory, it does not need a comment. - Ensure that your comments provide meaningful insight into the function or purpose of the code. - Write your comments in a clear and concise manner. - Only sign your comments with your name when your changes are complex and may require further explanation. -### Example Comments +### Example code comments #### DO NOT: +Below are examples of what you SHOULD NOT do when writing code comments. ```haxe - /** - * jumps around the song - * works with bpm changes but skipped notes still hurt - * @param sections how many sections to jump, negative = backwards - */ - function changeSection(sections:Int):Void +/** + * jumps around the song + * works with bpm changes but skipped notes still hurt + * @param sections how many sections to jump, negative = backwards + */ +function changeSection(sections:Int):Void +{ + // Pause the music, as you probably guessed + // FlxG.sound.music.pause(); + + // Set the target time in steps, I don’t really get how this works though lol - [GitHub username] + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started, that would probably break a lot of things and cause a bunch of problems! + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) // If the music is not null, set the time to the target time { - // Pause the music, as you probably guessed - // FlxG.sound.music.pause(); - - // Set the target time in steps, I don’t really get how this works though lol - [GitHub username] - var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); - var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); - - // Don't go back in time to before the song started, that would probably break a lot of things and cause a whole bunch of problems! - targetTimeMs = Math.max(0, targetTimeMs); - - if (FlxG.sound.music != null) // If the music is not null, set the time to the target time - { - FlxG.sound.music.time = targetTimeMs; - } - - // Handle skipped notes and events and all that jazz - handleSkippedNotes(); - SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); - // regenNoteData(FlxG.sound.music.time); - - Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); - - // I hate this function - [GitHub username] - resyncVocals(); + FlxG.sound.music.time = targetTimeMs; } + + // Handle skipped notes and events and all that jazz + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + // regenNoteData(FlxG.sound.music.time); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + // I hate this function - [GitHub username] + resyncVocals(); +} +``` + +```haxe +// End the song when the music is complete. +FlxG.sound.music.onComplete = function() { + endSong(skipEndingTransition); +}; +// A negative instrumental offset means the song skips the first few milliseconds of the track. +// This just gets added into the startTimestamp behavior so we don't need to do anything extra. +FlxG.sound.music.play(true, Math.max(0, startTimestamp - Conductor.instance.combinedOffset)); +FlxG.sound.music.pitch = playbackRate; + +// Prevent the volume from being wrong. +FlxG.sound.music.volume = 1.0; +// IF fadetween is not null we cancel it +if (FlxG.sound.music.fadeTween != null) FlxG.sound.music.fadeTween.cancel(); + +// Play the vocals +trace('Playing vocals...'); +// Add the vocals +add(vocals); +// Play the vocals for real this time lol +vocals.play(); +// Set the vocals volume +vocals.volume = 1.0; +// Set the vocals pitch +vocals.pitch = playbackRate; +// Set the vocals time to the music time +vocals.time = FlxG.sound.music.time; +// trace('${FlxG.sound.music.time}'); +// trace('${vocals.time}'); +// functionThatWasntHereBeforeThisPRorSomethingIdKLOL(); +/* testsprite = new FlxSprite(0, 0); +testsprite.loadGraphic(Paths.image('test')); +testsprite.screenCenter(); +add(testsprite); */ + +// Me too [GitHub username] I hate this function it gave me pain and suffering - Girlfriend +resyncVocals(); +``` + +```haxe +#if FEATURE_DEBUG_FUNCTIONS +// PAGEUP: who knows what this does +// SHIFT+PAGEUP: There will be dire consequences. +if (FlxG.keys.justPressed.PAGEUP) changeSection(FlxG.keys.pressed.SHIFT ? 20 : 2); +// PAGEUP: who knows what this does +// SHIFT+PAGEUP: There will be dire consequences. +if (FlxG.keys.justPressed.PAGEDOWN) changeSection(FlxG.keys.pressed.SHIFT ? -20 : -2); +#end ``` #### DO: +Below are examples on what you SHOULD do when writing code comments. ```haxe - /** - * Jumps forward or backward a number of sections in the song. - * Accounts for BPM changes, does not prevent death from skipped notes. - * @param sections The number of sections to jump, negative to go backwards. - */ - function changeSection(sections:Int):Void +/** + * Jumps forward or backward a number of sections in the song. + * Accounts for BPM changes, does not prevent death from skipped notes. + * @param sections The number of sections to jump, negative to go backwards. + */ +function changeSection(sections:Int):Void +{ + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started. + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) { - var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); - var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); - - // Don't go back in time to before the song started. - targetTimeMs = Math.max(0, targetTimeMs); - - if (FlxG.sound.music != null) - { - FlxG.sound.music.time = targetTimeMs; - } - - handleSkippedNotes(); - SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); - - Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); - - resyncVocals(); + FlxG.sound.music.time = targetTimeMs; } + + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + resyncVocals(); +} +``` + +```haxe +FlxG.sound.music.onComplete = function() { + endSong(skipEndingTransition); +}; +// A negative instrumental offset means the song skips the first few milliseconds of the track. +// This just gets added into the startTimestamp behavior so we don't need to do anything extra. +FlxG.sound.music.play(true, Math.max(0, startTimestamp - Conductor.instance.combinedOffset)); +FlxG.sound.music.pitch = playbackRate; + +// Prevent the volume from being wrong. +FlxG.sound.music.volume = 1.0; +if (FlxG.sound.music.fadeTween != null) FlxG.sound.music.fadeTween.cancel(); + +trace('Playing vocals...'); +add(vocals); +vocals.play(); +vocals.volume = 1.0; +vocals.pitch = playbackRate; +vocals.time = FlxG.sound.music.time; +resyncVocals(); +``` + +```haxe +#if FEATURE_DEBUG_FUNCTIONS +// PAGEUP: Skip forward two sections. +// SHIFT+PAGEUP: Skip forward twenty sections. +if (FlxG.keys.justPressed.PAGEUP) changeSection(FlxG.keys.pressed.SHIFT ? 20 : 2); +// PAGEDOWN: Skip backward two section. Doesn't replace notes. +// SHIFT+PAGEDOWN: Skip backward twenty sections. +if (FlxG.keys.justPressed.PAGEDOWN) changeSection(FlxG.keys.pressed.SHIFT ? -20 : -2); +#end ``` ## Documentation PRs -Documentation-based PRs make changes such as **fixing typos** or **adding new information** in documentation files. +Documentation-based PRs make changes such as **fixing typos** or **adding new information** in documentation files. This involves modifying one or several of the repository’s `.md` files, found throughout the repository. @@ -297,6 +391,24 @@ If you simultaneously modify files from both repositories, then open two separat Be sure to choose `main` as the base branch for `funkin.assets` PRs, as no `develop` branch exists for that repository. +### Charting PRs +Charting PRs make changes such as **adding/removing notes** or **adjusting the placement of song events**. + +This involves modifying one or several of the `funkin.assets` repository's `.json` chart files, found in the `preload/data/songs/` directory. + +These PRs should only be opened in the `funkin.assets` repository. + +> [!CAUTION] +> **No Major Recharts!** Any PR that makes major chart modifications will be rejected. +> Keep your PRs to small tweaks and fixes. + +Here are some guidelines for opening a Charting PR: +- **Explain the issue.** Which song, variation, difficulty, and section/timestamp is the problem in? Help us understand with screenshots and videos. +- **Show your changes.** How does the chart look with your changes? Provide screenshots and videos here as well. +- **Minimize the diff.** If your changes are very small (e.g. a few notes), do not re-export the chart using the Chart Editor. Instead, manually edit the `.json` chart files to help GitHub display your changes cleanly. + +If your PR is accepted, you will be credited as a GitHub contributor (but not as a charter in the Pause Menu). + # Closing Thank you for reading the Contributing Guide. From 439be3cb2657e7feee4b9b11664aac1246f6d0b0 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Mon, 17 Mar 2025 19:32:41 -0600 Subject: [PATCH 33/81] Update templates and docs to 0.6.0 --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- .github/ISSUE_TEMPLATE/charting.yml | 2 +- .github/ISSUE_TEMPLATE/compiling.yml | 2 +- .github/ISSUE_TEMPLATE/crash.yml | 2 +- docs/CONTRIBUTING.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index f6f5c3250..919d6335c 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.5.3 + placeholder: ex. 0.6.0 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/charting.yml b/.github/ISSUE_TEMPLATE/charting.yml index e86b73c12..aadb897f5 100644 --- a/.github/ISSUE_TEMPLATE/charting.yml +++ b/.github/ISSUE_TEMPLATE/charting.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.5.3 + placeholder: ex. 0.6.0 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/compiling.yml b/.github/ISSUE_TEMPLATE/compiling.yml index 6dd9e4cf9..1d049870c 100644 --- a/.github/ISSUE_TEMPLATE/compiling.yml +++ b/.github/ISSUE_TEMPLATE/compiling.yml @@ -34,7 +34,7 @@ body: attributes: label: Version description: Which version are you compiling? The game version is in the bottom left corner of the main menu or in the project.hxp file. - placeholder: ex. 0.5.3 + placeholder: ex. 0.6.0 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index f315fcc2c..01eeeeeb1 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.5.3 + placeholder: ex. 0.6.0 validations: required: true diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 8cf9174af..aa4587967 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -60,7 +60,7 @@ This section provides guidelines to follow when [opening an issue](https://githu ## Requirements Make sure you're playing: -- the latest version of the game (currently v0.5.3) +- the latest version of the game (currently v0.6.0) - without any mods - on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) From 3ccd1b04da5e7c91d85e1ceb46bc7d52d9722558 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Mon, 31 Mar 2025 14:27:04 -0600 Subject: [PATCH 34/81] Bump repo versions to 0.6.1 --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- .github/ISSUE_TEMPLATE/charting.yml | 2 +- .github/ISSUE_TEMPLATE/compiling.yml | 2 +- .github/ISSUE_TEMPLATE/crash.yml | 2 +- docs/CONTRIBUTING.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 919d6335c..73713df76 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.0 + placeholder: ex. 0.6.1 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/charting.yml b/.github/ISSUE_TEMPLATE/charting.yml index aadb897f5..aca027bd8 100644 --- a/.github/ISSUE_TEMPLATE/charting.yml +++ b/.github/ISSUE_TEMPLATE/charting.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.0 + placeholder: ex. 0.6.1 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/compiling.yml b/.github/ISSUE_TEMPLATE/compiling.yml index 1d049870c..fb5d8f16f 100644 --- a/.github/ISSUE_TEMPLATE/compiling.yml +++ b/.github/ISSUE_TEMPLATE/compiling.yml @@ -34,7 +34,7 @@ body: attributes: label: Version description: Which version are you compiling? The game version is in the bottom left corner of the main menu or in the project.hxp file. - placeholder: ex. 0.6.0 + placeholder: ex. 0.6.1 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index 01eeeeeb1..c6135c649 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.0 + placeholder: ex. 0.6.1 validations: required: true diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index aa4587967..f87ea574a 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -60,7 +60,7 @@ This section provides guidelines to follow when [opening an issue](https://githu ## Requirements Make sure you're playing: -- the latest version of the game (currently v0.6.0) +- the latest version of the game (currently v0.6.1) - without any mods - on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) From 3c6466bec7ca4fa006215a2cd3387ff9d8d70ac3 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Mon, 31 Mar 2025 19:18:34 -0600 Subject: [PATCH 35/81] Bump repo versions to 0.6.2 --- .github/ISSUE_TEMPLATE/bug.yml | 2 +- .github/ISSUE_TEMPLATE/charting.yml | 2 +- .github/ISSUE_TEMPLATE/compiling.yml | 2 +- .github/ISSUE_TEMPLATE/crash.yml | 2 +- docs/CONTRIBUTING.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 73713df76..1c82abc2a 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.1 + placeholder: ex. 0.6.2 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/charting.yml b/.github/ISSUE_TEMPLATE/charting.yml index aca027bd8..810a3778d 100644 --- a/.github/ISSUE_TEMPLATE/charting.yml +++ b/.github/ISSUE_TEMPLATE/charting.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.1 + placeholder: ex. 0.6.2 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/compiling.yml b/.github/ISSUE_TEMPLATE/compiling.yml index fb5d8f16f..a3370e3c5 100644 --- a/.github/ISSUE_TEMPLATE/compiling.yml +++ b/.github/ISSUE_TEMPLATE/compiling.yml @@ -34,7 +34,7 @@ body: attributes: label: Version description: Which version are you compiling? The game version is in the bottom left corner of the main menu or in the project.hxp file. - placeholder: ex. 0.6.1 + placeholder: ex. 0.6.2 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/crash.yml b/.github/ISSUE_TEMPLATE/crash.yml index c6135c649..04fea1d13 100644 --- a/.github/ISSUE_TEMPLATE/crash.yml +++ b/.github/ISSUE_TEMPLATE/crash.yml @@ -46,7 +46,7 @@ body: attributes: label: Version description: Which version are you playing on? The game version is in the bottom left corner of the main menu. - placeholder: ex. 0.6.1 + placeholder: ex. 0.6.2 validations: required: true diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index f87ea574a..6459b98ca 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -60,7 +60,7 @@ This section provides guidelines to follow when [opening an issue](https://githu ## Requirements Make sure you're playing: -- the latest version of the game (currently v0.6.1) +- the latest version of the game (currently v0.6.2) - without any mods - on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) From b48b5ae1aae460efe7fb205f22a9810ed216215c Mon Sep 17 00:00:00 2001 From: kade-github <26305836+Kade-github@users.noreply.github.com> Date: Fri, 18 Apr 2025 11:10:16 -0700 Subject: [PATCH 36/81] remember diff for generate song list --- source/funkin/ui/freeplay/FreeplayState.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/funkin/ui/freeplay/FreeplayState.hx b/source/funkin/ui/freeplay/FreeplayState.hx index 2ec105ea0..5c5c9e0c3 100644 --- a/source/funkin/ui/freeplay/FreeplayState.hx +++ b/source/funkin/ui/freeplay/FreeplayState.hx @@ -203,6 +203,7 @@ class FreeplayState extends MusicBeatSubState currentCharacter = fetchPlayableCharacter(); currentVariation = rememberedVariation; + currentDifficulty = rememberedDifficulty; styleData = FreeplayStyleRegistry.instance.fetchEntry(currentCharacter.getFreeplayStyleID()); rememberedCharacterId = currentCharacter?.id ?? Constants.DEFAULT_CHARACTER; fromCharSelect = params?.fromCharSelect ?? false; @@ -697,7 +698,6 @@ class FreeplayState extends MusicBeatSubState // Gets all available difficulties for our character, via our available variations var difficultiesAvailable:Array = song.data.listDifficulties(null, characterVariations); - return difficultiesAvailable.contains(currentDifficulty); }); From 6a1160feaba170a9d673fb1dd1b455594ff8830e Mon Sep 17 00:00:00 2001 From: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:55:34 -0500 Subject: [PATCH 37/81] chore: Enable null safety for 11 classes --- source/funkin/Assets.hx | 1 + source/funkin/effects/FunkTrail.hx | 1 + source/funkin/effects/RetroCameraFade.hx | 1 + source/funkin/modding/events/ScriptEvent.hx | 4 ++-- source/funkin/play/components/TallyCounter.hx | 6 ++++-- source/funkin/ui/MusicBeatState.hx | 5 +++-- source/funkin/ui/MusicBeatSubState.hx | 5 +++-- source/funkin/ui/PixelatedIcon.hx | 1 + source/funkin/ui/TextMenuList.hx | 3 +++ 9 files changed, 19 insertions(+), 8 deletions(-) diff --git a/source/funkin/Assets.hx b/source/funkin/Assets.hx index 6b1131691..f77e3ea3e 100644 --- a/source/funkin/Assets.hx +++ b/source/funkin/Assets.hx @@ -6,6 +6,7 @@ import openfl.utils.Future; * A wrapper around `openfl.utils.Assets` which disallows access to the harmful functions. * Later we'll add Funkin-specific caching to this. */ +@:nullSafety class Assets { /** diff --git a/source/funkin/effects/FunkTrail.hx b/source/funkin/effects/FunkTrail.hx index 1bf3e69b8..42fe4b227 100644 --- a/source/funkin/effects/FunkTrail.hx +++ b/source/funkin/effects/FunkTrail.hx @@ -10,6 +10,7 @@ import flixel.math.FlxPoint; * An offshoot of FlxTrail, but accomodates the way Funkin * does offsets for characters. example, fixes Spirits trail */ +@:nullSafety class FunkTrail extends FlxTrail { /** diff --git a/source/funkin/effects/RetroCameraFade.hx b/source/funkin/effects/RetroCameraFade.hx index d4c1da5ef..ef65eef4c 100644 --- a/source/funkin/effects/RetroCameraFade.hx +++ b/source/funkin/effects/RetroCameraFade.hx @@ -4,6 +4,7 @@ import flixel.util.FlxTimer; import flixel.FlxCamera; import openfl.filters.ColorMatrixFilter; +@:nullSafety class RetroCameraFade { // im lazy, but we only use this for week 6 diff --git a/source/funkin/modding/events/ScriptEvent.hx b/source/funkin/modding/events/ScriptEvent.hx index 6f4742a29..20269f5a3 100644 --- a/source/funkin/modding/events/ScriptEvent.hx +++ b/source/funkin/modding/events/ScriptEvent.hx @@ -486,9 +486,9 @@ class StateChangeScriptEvent extends ScriptEvent /** * The state the game is moving into. */ - public var targetState(default, null):FlxState; + public var targetState(default, null):Null; - public function new(type:ScriptEventType, targetState:FlxState, cancelable:Bool = false):Void + public function new(type:ScriptEventType, targetState:Null, cancelable:Bool = false):Void { super(type, cancelable); this.targetState = targetState; diff --git a/source/funkin/play/components/TallyCounter.hx b/source/funkin/play/components/TallyCounter.hx index 777ff5fe8..417e61369 100644 --- a/source/funkin/play/components/TallyCounter.hx +++ b/source/funkin/play/components/TallyCounter.hx @@ -8,6 +8,7 @@ import funkin.util.MathUtil; /** * Numerical counters used next to each judgement in the Results screen. */ +@:nullSafety class TallyCounter extends FlxTypedSpriteGroup { public var curNumber:Float = 0; @@ -17,13 +18,13 @@ class TallyCounter extends FlxTypedSpriteGroup public var align:FlxTextAlign = FlxTextAlign.LEFT; - public function new(x:Float, y:Float, neededNumber:Int = 0, ?flavour:Int = 0xFFFFFFFF, align:FlxTextAlign = FlxTextAlign.LEFT) + public function new(x:Float, y:Float, neededNumber:Int = 0, ?flavour:Int, align:FlxTextAlign = FlxTextAlign.LEFT) { super(x, y); this.align = align; - this.flavour = flavour; + this.flavour = flavour ?? 0xFFFFFFFF; this.neededNumber = neededNumber; @@ -79,6 +80,7 @@ class TallyCounter extends FlxTypedSpriteGroup } } +@:nullSafety class TallyNumber extends FlxSprite { public function new(x:Float, y:Float, digit:Int) diff --git a/source/funkin/ui/MusicBeatState.hx b/source/funkin/ui/MusicBeatState.hx index 99591345f..ce53f6c8d 100644 --- a/source/funkin/ui/MusicBeatState.hx +++ b/source/funkin/ui/MusicBeatState.hx @@ -18,6 +18,7 @@ import funkin.input.Controls; * MusicBeatState actually represents the core utility FlxState of the game. * It includes functionality for event handling, as well as maintaining BPM-based update events. */ +@:nullSafety class MusicBeatState extends FlxTransitionableState implements IEventHandler { var controls(get, never):Controls; @@ -25,8 +26,8 @@ class MusicBeatState extends FlxTransitionableState implements IEventHandler inline function get_controls():Controls return PlayerSettings.player1.controls; - public var leftWatermarkText:FlxText = null; - public var rightWatermarkText:FlxText = null; + public var leftWatermarkText:Null = null; + public var rightWatermarkText:Null = null; public var conductorInUse(get, set):Conductor; diff --git a/source/funkin/ui/MusicBeatSubState.hx b/source/funkin/ui/MusicBeatSubState.hx index 59fdb7e99..72e3167e6 100644 --- a/source/funkin/ui/MusicBeatSubState.hx +++ b/source/funkin/ui/MusicBeatSubState.hx @@ -16,10 +16,11 @@ import funkin.input.Controls; /** * MusicBeatSubState reincorporates the functionality of MusicBeatState into an FlxSubState. */ +@:nullSafety class MusicBeatSubState extends FlxSubState implements IEventHandler { - public var leftWatermarkText:FlxText = null; - public var rightWatermarkText:FlxText = null; + public var leftWatermarkText:Null = null; + public var rightWatermarkText:Null = null; public var conductorInUse(get, set):Conductor; diff --git a/source/funkin/ui/PixelatedIcon.hx b/source/funkin/ui/PixelatedIcon.hx index 280ed98d0..8b580ec29 100644 --- a/source/funkin/ui/PixelatedIcon.hx +++ b/source/funkin/ui/PixelatedIcon.hx @@ -6,6 +6,7 @@ import funkin.graphics.FlxFilteredSprite; * The icon that gets used for Freeplay capsules and char select * NOT to be confused with the CharIcon class, which is for the in-game icons */ +@:nullSafety class PixelatedIcon extends FlxFilteredSprite { public function new(x:Float, y:Float) diff --git a/source/funkin/ui/TextMenuList.hx b/source/funkin/ui/TextMenuList.hx index cc1fc408c..11238fbff 100644 --- a/source/funkin/ui/TextMenuList.hx +++ b/source/funkin/ui/TextMenuList.hx @@ -3,6 +3,7 @@ package funkin.ui; import funkin.ui.AtlasText; import funkin.ui.MenuList; +@:nullSafety class TextMenuList extends MenuTypedList { public function new(navControls:NavControls = Vertical, ?wrapMode) @@ -18,6 +19,7 @@ class TextMenuList extends MenuTypedList } } +@:nullSafety class TextMenuItem extends TextTypedMenuItem { public function new(x = 0.0, y = 0.0, name:String, font:AtlasFont = BOLD, ?callback:Void->Void) @@ -27,6 +29,7 @@ class TextMenuItem extends TextTypedMenuItem } } +@:nullSafety class TextTypedMenuItem extends MenuTypedItem { public function new(x = 0.0, y = 0.0, label:T, name:String, ?callback:Void->Void) From dda91cf770758f7126f48b106eafc9eb59bd87f9 Mon Sep 17 00:00:00 2001 From: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> Date: Tue, 15 Apr 2025 06:17:42 -0500 Subject: [PATCH 38/81] change requested by eric --- source/funkin/modding/events/ScriptEvent.hx | 4 ++-- source/funkin/ui/MusicBeatState.hx | 1 + source/funkin/ui/MusicBeatSubState.hx | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/funkin/modding/events/ScriptEvent.hx b/source/funkin/modding/events/ScriptEvent.hx index 20269f5a3..6f4742a29 100644 --- a/source/funkin/modding/events/ScriptEvent.hx +++ b/source/funkin/modding/events/ScriptEvent.hx @@ -486,9 +486,9 @@ class StateChangeScriptEvent extends ScriptEvent /** * The state the game is moving into. */ - public var targetState(default, null):Null; + public var targetState(default, null):FlxState; - public function new(type:ScriptEventType, targetState:Null, cancelable:Bool = false):Void + public function new(type:ScriptEventType, targetState:FlxState, cancelable:Bool = false):Void { super(type, cancelable); this.targetState = targetState; diff --git a/source/funkin/ui/MusicBeatState.hx b/source/funkin/ui/MusicBeatState.hx index ce53f6c8d..47d0d1ef3 100644 --- a/source/funkin/ui/MusicBeatState.hx +++ b/source/funkin/ui/MusicBeatState.hx @@ -164,6 +164,7 @@ class MusicBeatState extends FlxTransitionableState implements IEventHandler sort(SortUtil.byZIndex, FlxSort.ASCENDING); } + @:nullSafety(Off) override function startOutro(onComplete:() -> Void):Void { var event = new StateChangeScriptEvent(STATE_CHANGE_BEGIN, null, true); diff --git a/source/funkin/ui/MusicBeatSubState.hx b/source/funkin/ui/MusicBeatSubState.hx index 72e3167e6..d13f99459 100644 --- a/source/funkin/ui/MusicBeatSubState.hx +++ b/source/funkin/ui/MusicBeatSubState.hx @@ -187,6 +187,7 @@ class MusicBeatSubState extends FlxSubState implements IEventHandler this._parentState.openSubState(substate); } + @:nullSafety(Off) override function startOutro(onComplete:() -> Void):Void { var event = new StateChangeScriptEvent(STATE_CHANGE_BEGIN, null, true); From 93d4f30cadf6f54a469dfadbbb81af03835ab4fa Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Tue, 15 Apr 2025 20:09:27 -0400 Subject: [PATCH 39/81] Make ScreenshotPlugin null-safe. --- .../funkin/util/plugins/ScreenshotPlugin.hx | 152 ++++++++---------- 1 file changed, 70 insertions(+), 82 deletions(-) diff --git a/source/funkin/util/plugins/ScreenshotPlugin.hx b/source/funkin/util/plugins/ScreenshotPlugin.hx index 1b7a03a54..dad604211 100644 --- a/source/funkin/util/plugins/ScreenshotPlugin.hx +++ b/source/funkin/util/plugins/ScreenshotPlugin.hx @@ -3,7 +3,6 @@ package funkin.util.plugins; import flixel.FlxBasic; import flixel.FlxG; import flixel.FlxState; -import flixel.input.keyboard.FlxKey; import flixel.tweens.FlxEase; import flixel.tweens.FlxTween; import flixel.util.FlxColor; @@ -12,7 +11,6 @@ import flixel.util.FlxTimer; import funkin.util.WindowUtil; import funkin.util.logging.CrashHandler; import flixel.addons.util.FlxAsyncLoop; -import funkin.graphics.FunkinSprite; import funkin.input.Cursor; import funkin.audio.FunkinSound; import openfl.display.Bitmap; @@ -23,39 +21,44 @@ import openfl.geom.Rectangle; import openfl.utils.ByteArray; import openfl.events.MouseEvent; import funkin.Preferences; -import flixel.addons.plugin.screengrab.FlxScreenGrab; +/** + * Parameters for starting the `ScreenshotPlugin`. + */ typedef ScreenshotPluginParams = { ?region:Rectangle, - flashColor:Null, }; /** - * TODO: Contribute this upstream. + * A Flixel plugin, which renders on top of the game, and provides the functionality + * and visual feedback for taking screenshots. */ +@:nullSafety class ScreenshotPlugin extends FlxBasic { /** * Current `ScreenshotPlugin` instance */ - public static var instance:ScreenshotPlugin = null; + public static var instance(get, never):ScreenshotPlugin; - public static final SCREENSHOT_FOLDER = 'screenshots'; + static var _instance:Null = null; - var region:Null; + static function get_instance():ScreenshotPlugin + { + if (_instance == null) + { + _instance = new ScreenshotPlugin({}); + } + return _instance; + } /** - * The color used for the flash + * The folder where screenshots are saved */ - public static var flashColor(default, set):Int = 0xFFFFFFFF; + public static final SCREENSHOT_FOLDER:String = 'screenshots'; - public static function set_flashColor(v:Int):Int - { - flashColor = v; - if (instance != null && instance.flashBitmap != null) instance.flashBitmap.bitmapData = new BitmapData(lastWidth, lastHeight, true, v); - return flashColor; - } + var region:Null; /** * A signal fired before the screenshot is taken. @@ -68,8 +71,8 @@ class ScreenshotPlugin extends FlxBasic */ public var onPostScreenshot(default, null):FlxTypedSignalVoid>; - private static var lastWidth:Int; - private static var lastHeight:Int; + static var lastWidth:Int = 0; + static var lastHeight:Int = 0; var flashSprite:Sprite; var flashBitmap:Bitmap; @@ -83,7 +86,7 @@ class ScreenshotPlugin extends FlxBasic var screenshotBeingSpammed:Bool = false; - var screenshotSpammedTimer:FlxTimer; + var screenshotSpammedTimer:Null = null; var screenshotBuffer:Array = []; var screenshotNameBuffer:Array = []; @@ -94,31 +97,23 @@ class ScreenshotPlugin extends FlxBasic var stateChanging:Bool = false; var noSavingScreenshots:Bool = false; - var flashTween:FlxTween; + var flashTween:Null = null; - var previewFadeInTween:FlxTween; - var previewFadeOutTween:FlxTween; + var previewFadeInTween:Null = null; + var previewFadeOutTween:Null = null; - var asyncLoop:FlxAsyncLoop; + var asyncLoop:Null = null; public function new(params:ScreenshotPluginParams) { super(); - if (instance != null) - { - destroy(); - return; - } - - instance = this; - lastWidth = FlxG.width; lastHeight = FlxG.height; flashSprite = new Sprite(); flashSprite.alpha = 0; - flashBitmap = new Bitmap(new BitmapData(lastWidth, lastHeight, true, params.flashColor)); + flashBitmap = new Bitmap(new BitmapData(lastWidth, lastHeight, true, Preferences.flashingLights ? FlxColor.WHITE : FlxColor.TRANSPARENT)); flashSprite.addChild(flashBitmap); previewSprite = new Sprite(); @@ -137,7 +132,6 @@ class ScreenshotPlugin extends FlxBasic FlxG.stage.addChild(flashSprite); region = params.region ?? null; - flashColor = params.flashColor; onPreScreenshot = new FlxTypedSignalVoid>(); onPostScreenshot = new FlxTypedSignalVoid>(); @@ -205,7 +199,7 @@ class ScreenshotPlugin extends FlxBasic sprite.alpha = 0; } // screenshot spamming timer - if (screenshotSpammedTimer == null || screenshotSpammedTimer.finished == true) + if (screenshotSpammedTimer == null || screenshotSpammedTimer.finished) { screenshotSpammedTimer = new FlxTimer().start(1, function(_) { // The player's stopped spamming shots, so we can stop the screenshot spam mode too @@ -242,12 +236,12 @@ class ScreenshotPlugin extends FlxBasic */ public static function initialize():Void { - FlxG.plugins.addPlugin(new ScreenshotPlugin( - { - flashColor: Preferences.flashingLights ? FlxColor.WHITE : null, // Was originally a black flash. - })); + FlxG.plugins.addPlugin(new ScreenshotPlugin({})); } + /** + * @return `true` if the screenshot key is currently pressed. + */ public function hasPressedScreenshot():Bool { #if FEATURE_SCREENSHOTS @@ -257,16 +251,11 @@ class ScreenshotPlugin extends FlxBasic #end } - public function updateFlashColor():Void - { - Preferences.flashingLights ? set_flashColor(FlxColor.WHITE) : null; - } - - private function resizeBitmap(width:Int, height:Int) + function resizeBitmap(width:Int, height:Int):Void { lastWidth = width; lastHeight = height; - flashBitmap.bitmapData = new BitmapData(lastWidth, lastHeight, true, flashColor); + flashBitmap.bitmapData = new BitmapData(lastWidth, lastHeight, true, Preferences.flashingLights ? FlxColor.WHITE : FlxColor.TRANSPARENT); outlineBitmap.bitmapData = new BitmapData(Std.int(lastWidth / 5) + 10, Std.int(lastHeight / 5) + 10, true, 0xFFFFFFFF); } @@ -277,8 +266,8 @@ class ScreenshotPlugin extends FlxBasic { onPreScreenshot.dispatch(); - var shot = new Bitmap(BitmapData.fromImage(FlxG.stage.window.readPixels())); - if (screenshotBeingSpammed == true) + var shot:Bitmap = new Bitmap(BitmapData.fromImage(FlxG.stage.window.readPixels())); + if (screenshotBeingSpammed) { // Save the screenshots to the buffer instead if (screenshotBuffer.length < 100) @@ -318,7 +307,7 @@ class ScreenshotPlugin extends FlxBasic onPostScreenshot.dispatch(shot); } - final CAMERA_FLASH_DURATION = 0.25; + static final CAMERA_FLASH_DURATION:Float = 0.25; /** * Visual and audio feedback when a screenshot is taken. @@ -332,10 +321,10 @@ class ScreenshotPlugin extends FlxBasic FunkinSound.playOnce(Paths.sound('screenshot'), 1.0); } - static final PREVIEW_INITIAL_DELAY = 0.25; // How long before the preview starts fading in. - static final PREVIEW_FADE_IN_DURATION = 0.3; // How long the preview takes to fade in. - static final PREVIEW_FADE_OUT_DELAY = 1.25; // How long the preview stays on screen. - static final PREVIEW_FADE_OUT_DURATION = 0.3; // How long the preview takes to fade out. + static final PREVIEW_INITIAL_DELAY:Float = 0.25; // How long before the preview starts fading in. + static final PREVIEW_FADE_IN_DURATION:Float = 0.3; // How long the preview takes to fade in. + static final PREVIEW_FADE_OUT_DELAY:Float = 1.25; // How long the preview stays on screen. + static final PREVIEW_FADE_OUT_DURATION:Float = 0.3; // How long the preview takes to fade out. /** * Show a fancy preview for the screenshot @@ -367,12 +356,12 @@ class ScreenshotPlugin extends FlxBasic // fuck it, cursed locally scoped functions, purely because im lazy // (and so we can check changingAlpha, which is locally scoped.... because I'm lazy...) - var onHover = function(e:MouseEvent) { + var onHover:MouseEvent->Void = function(e:MouseEvent) { if (!changingAlpha) e.target.alpha = 0.6; targetAlpha = 0.6; }; - var onHoverOut = function(e:MouseEvent) { + var onHoverOut:MouseEvent->Void = function(e:MouseEvent) { if (!changingAlpha) e.target.alpha = 1; targetAlpha = 1; } @@ -461,7 +450,7 @@ class ScreenshotPlugin extends FlxBasic static function getCurrentState():FlxState { - var state = FlxG.state; + var state:FlxState = FlxG.state; while (state.subState != null) { state = state.subState; @@ -484,12 +473,12 @@ class ScreenshotPlugin extends FlxBasic */ function encode(bitmap:Bitmap):ByteArray { - var compressor = returnEncoder(Preferences.saveFormat); + var compressor:PNGEncoderOptions = new PNGEncoderOptions(); return bitmap.bitmapData.encode(bitmap.bitmapData.rect, compressor); } - var previousScreenshotName:String; - var previousScreenshotCopyNum:Int; + var previousScreenshotName:Null = null; + var previousScreenshotCopyNum:Int = 0; /** * Save the generated bitmap to a file. @@ -498,7 +487,7 @@ class ScreenshotPlugin extends FlxBasic * @param screenShotNum Used for the delay save option, to space out the saving of the images. * @param delaySave If true, the image gets saved with the screenShotNum as the delay. */ - function saveScreenshot(bitmap:Bitmap, targetPath = "image", screenShotNum:Int = 0, delaySave:Bool = true) + function saveScreenshot(bitmap:Bitmap, targetPath = "image", screenShotNum:Int = 0, delaySave:Bool = true):Void { makeScreenshotPath(); // Check that we're not overriding a previous image, and keep making a unique path until we can @@ -520,13 +509,14 @@ class ScreenshotPlugin extends FlxBasic targetPath = getScreenshotPath() + newTargetPath + '.' + Std.string(Preferences.saveFormat).toLowerCase(); } - // TODO: Make this work on browser. + // TODO: Make screenshot saving work on browser. // Maybe save the images into a buffer that you can download as a zip or something? That'd work // Shouldn't be too hard to do something similar to the chart editor saving - if (delaySave) // Save the images with a delay (a timer) + if (delaySave) + { // Save the images with a delay (a timer) new FlxTimer().start(screenShotNum, function(_) { - var pngData = encode(bitmap); + var pngData:ByteArray = encode(bitmap); if (pngData == null) { @@ -547,9 +537,10 @@ class ScreenshotPlugin extends FlxBasic if (Preferences.previewOnSave) showFancyPreview(bitmap); // Only show the preview after a screenshot is saved } }); + } else // Save the screenshot immediately { - var pngData = encode(bitmap); + var pngData:ByteArray = encode(bitmap); if (pngData == null) { @@ -567,7 +558,7 @@ class ScreenshotPlugin extends FlxBasic } // I' m very happy with this code, all of it just works - function saveBufferedScreenshots(screenshots:Array, screenshotNames) + function saveBufferedScreenshots(screenshots:Array, screenshotNames:Array):Void { trace('Saving screenshot buffer'); var i:Int = 0; @@ -581,14 +572,16 @@ class ScreenshotPlugin extends FlxBasic }, 1); getCurrentState().add(asyncLoop); if (!Preferences.flashingLights && !Preferences.previewOnSave) + { showFancyPreview(screenshots[screenshots.length - 1]); // show the preview for the last screenshot + } } /** * Similar to the above function, but cancels the tweens, undos the mouse * and doesn't have the async loop because this is called before the state changes */ - function saveUnsavedBufferedScreenshots() + function saveUnsavedBufferedScreenshots():Void { stateChanging = true; // Cancel the tweens of the capture feedback if they're running @@ -627,17 +620,7 @@ class ScreenshotPlugin extends FlxBasic unsavedScreenshotNameBuffer = []; } - public function returnEncoder(saveFormat:String):Any - { - return switch (saveFormat) - { - // JPEG encoder causes the game to crash????? - // case "JPEG": new openfl.display.JPEGEncoderOptions(Preferences.jpegQuality); - default: new openfl.display.PNGEncoderOptions(); - } - } - - function postStateSwitch() + function postStateSwitch():Void { stateChanging = false; screenshotBeingSpammed = false; @@ -646,7 +629,7 @@ class ScreenshotPlugin extends FlxBasic override public function destroy():Void { - if (instance == this) instance = null; + if (instance == this) _instance = null; if (FlxG.plugins.list.contains(this)) FlxG.plugins.remove(this); @@ -663,13 +646,18 @@ class ScreenshotPlugin extends FlxBasic @:privateAccess for (parent in [flashSprite, previewSprite]) + { + if (parent == null) continue; for (child in parent.__children) + { parent.removeChild(child); + } + } - flashSprite = null; - flashBitmap = null; - previewSprite = null; - shotPreviewBitmap = null; - outlineBitmap = null; + // flashSprite = null + // flashBitmap = null + // previewSprite = null + // shotPreviewBitmap = null + // outlineBitmap = null } } From 945314d271a7b63e31c9c12bbd0329beebaf97c4 Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Fri, 18 Apr 2025 19:41:53 -0400 Subject: [PATCH 40/81] lime bump for windows fix --- hmm.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hmm.json b/hmm.json index 71e7b490f..a6c30c452 100644 --- a/hmm.json +++ b/hmm.json @@ -143,7 +143,7 @@ "name": "lime", "type": "git", "dir": null, - "ref": "e41e3d428ccdd13a1197b20c353f7c40acb45e96", + "ref": "c86fe6ab24f9f438c82e91acfc4f87c548b2127d", "url": "https://github.com/FunkinCrew/lime" }, { @@ -210,4 +210,4 @@ "url": "https://github.com/fponticelli/thx.semver" } ] -} \ No newline at end of file +} From 12ee60f77657518e00c1724ea661314b4a13fc58 Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Fri, 18 Apr 2025 20:18:39 -0400 Subject: [PATCH 41/81] Mac ndlls lime hmm bump --- hmm.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hmm.json b/hmm.json index a6c30c452..bd3bfcbd2 100644 --- a/hmm.json +++ b/hmm.json @@ -143,7 +143,7 @@ "name": "lime", "type": "git", "dir": null, - "ref": "c86fe6ab24f9f438c82e91acfc4f87c548b2127d", + "ref": "fa615b75b92166f2a4d98c8766141d831877a807", "url": "https://github.com/FunkinCrew/lime" }, { @@ -210,4 +210,4 @@ "url": "https://github.com/fponticelli/thx.semver" } ] -} +} \ No newline at end of file From 68892b92ab8cf93d2022933821e8e7ede4a81b4c Mon Sep 17 00:00:00 2001 From: mint Date: Sat, 19 Apr 2025 02:32:16 +0200 Subject: [PATCH 42/81] hotfix(ci): bump neko version to 2.4.1 --- .github/actions/setup-haxe/action.yml | 2 +- build/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/setup-haxe/action.yml b/.github/actions/setup-haxe/action.yml index 602d22649..f6dd14f99 100644 --- a/.github/actions/setup-haxe/action.yml +++ b/.github/actions/setup-haxe/action.yml @@ -30,7 +30,7 @@ runs: echo "TIMER_HAXE=$(date +%s)" >> "$GITHUB_ENV" - name: Install Haxe - uses: funkincrew/ci-haxe@v3.2.6 + uses: funkincrew/ci-haxe@v3.2.7 with: haxe-version: ${{ inputs.haxe }} diff --git a/build/Dockerfile b/build/Dockerfile index 9d06a94e5..2ea9eccea 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -102,7 +102,7 @@ RUN < Date: Sat, 19 Apr 2025 02:58:52 +0200 Subject: [PATCH 43/81] hotfix: mac lime ndlls again? --- hmm.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hmm.json b/hmm.json index bd3bfcbd2..053415481 100644 --- a/hmm.json +++ b/hmm.json @@ -143,7 +143,7 @@ "name": "lime", "type": "git", "dir": null, - "ref": "fa615b75b92166f2a4d98c8766141d831877a807", + "ref": "1e79c20a6ee13fa168535f9f76a368e3284ddc3a", "url": "https://github.com/FunkinCrew/lime" }, { @@ -210,4 +210,4 @@ "url": "https://github.com/fponticelli/thx.semver" } ] -} \ No newline at end of file +} From 8fb35ac82233c589abb6f3c93dd79fc1a3dbc387 Mon Sep 17 00:00:00 2001 From: mint Date: Sat, 19 Apr 2025 03:17:47 +0200 Subject: [PATCH 44/81] hotfix(ci): for now, disable fail-fast so we can get some windows builds --- .github/workflows/build-game.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-game.yml b/.github/workflows/build-game.yml index 539a15efc..3bc3993e3 100644 --- a/.github/workflows/build-game.yml +++ b/.github/workflows/build-game.yml @@ -118,6 +118,7 @@ jobs: build-game-on-host: strategy: + fail-fast: false matrix: include: - target: windows From 2984ce48528b8a25c3f42f9feb38cbe5e367b695 Mon Sep 17 00:00:00 2001 From: mint Date: Sat, 19 Apr 2025 03:23:27 +0200 Subject: [PATCH 45/81] hotfix(ci): use our own runners again :) --- .github/workflows/build-game.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-game.yml b/.github/workflows/build-game.yml index 3bc3993e3..9d75191f1 100644 --- a/.github/workflows/build-game.yml +++ b/.github/workflows/build-game.yml @@ -122,7 +122,7 @@ jobs: matrix: include: - target: windows - runs-on: windows-latest + runs-on: windows - target: macos runs-on: macos runs-on: From 9dd8a257dfabc23aecfa554c46687a01c0681495 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Tue, 15 Apr 2025 21:11:40 -0400 Subject: [PATCH 46/81] Update assets submodule to include twenty-seven chart tweak commits --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 6342a5536..a114b45f6 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 6342a55361058e9c7c070eb6437267eac9cd06ce +Subproject commit a114b45f69b911fedc3aa6a204d48cda8d40ceba From df6ffca01f9c94c7fa55c8291ebce85b8e56c0ee Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Wed, 16 Apr 2025 21:44:23 -0400 Subject: [PATCH 47/81] Update assets submodule (charting revert stuff) --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index a114b45f6..12d7521e3 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a114b45f69b911fedc3aa6a204d48cda8d40ceba +Subproject commit 12d7521e38d4791746b541ed55a8adac9544be66 From aa37745bbd03bc6e633ad0ac03850ee3fb5c1df8 Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Mon, 21 Apr 2025 19:48:35 -0400 Subject: [PATCH 48/81] assets submod (week 6 shader fixin) --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 12d7521e3..a09b58b7f 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 12d7521e38d4791746b541ed55a8adac9544be66 +Subproject commit a09b58b7f9c9bb8faf69608be6f764ce82cd0ecc From b40b4b03692910afceff361cf6ca3298fd787e3c Mon Sep 17 00:00:00 2001 From: sector-a <82838084+sector-a@users.noreply.github.com> Date: Sat, 5 Apr 2025 20:21:13 +0300 Subject: [PATCH 49/81] Fix Animation Editor Crash Fix poor code formatting This is unnecessary now --- source/funkin/ui/debug/anim/DebugBoundingState.hx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/funkin/ui/debug/anim/DebugBoundingState.hx b/source/funkin/ui/debug/anim/DebugBoundingState.hx index e1f21f5b0..5b8d21cfb 100644 --- a/source/funkin/ui/debug/anim/DebugBoundingState.hx +++ b/source/funkin/ui/debug/anim/DebugBoundingState.hx @@ -528,8 +528,11 @@ class DebugBoundingState extends FlxState trace('Added ${offsetAnimationDropdown.dataSource.size} to HaxeUI dropdown'); offsetAnimationDropdown.onChange = function(event:UIEvent) { - trace('Selected animation ${event?.data?.id}'); - playCharacterAnimation(event.data.id, true); + if (event.data != null) + { + trace('Selected animation ${event.data.id}'); + playCharacterAnimation(event.data.id, true); + } } txtOffsetShit.text = 'Offset: ' + swagChar.animOffsets; From 4b883d43390f444bb62f291bb1df90677cc4f13a Mon Sep 17 00:00:00 2001 From: Hundrec Date: Sat, 5 Apr 2025 22:23:56 -0600 Subject: [PATCH 50/81] Restore Contributing Guide to latest version Merge conflicts yay Co-Authored-By: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> --- docs/CONTRIBUTING.md | 228 ++++++++++++++++++++++++++++++++----------- 1 file changed, 170 insertions(+), 58 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index d9eea297b..0f1985fab 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -39,6 +39,8 @@ This guide will cover best practices for each type of contribution. * [funkin.assets PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#funkinassets-prs) + * [Charting PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#charting-prs) + [Closing](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#closing) @@ -58,7 +60,7 @@ This section provides guidelines to follow when [opening an issue](https://githu ## Requirements Make sure you're playing: -- the latest version of the game (currently v0.5.3) +- the latest version of the game (currently v0.6.2) - without any mods - on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) @@ -122,6 +124,9 @@ Also only report one issue or enhancement at a time! If you have multiple bug re Once you're sure your issue is unique and specific, feel free to submit it. +> [!IMPORTANT] +> **DO NOT CLOSE YOUR ISSUE FOR ANY REASON!** Your issue will be taken care of by a moderator! + **Thank you for opening issues!** # Part 3: Pull Requests @@ -133,6 +138,7 @@ When creating a branch in your fork, base your branch on either the `main` or `d > [!CAUTION] > Avoid using your fork's default branch (`main` in this case) for your PR. This is considered an [anti-pattern](https://jmeridth.com/posts/do-not-issue-pull-requests-from-your-master-branch/) by GitHub themselves! +> Instead, make a separate branch for your additions (ex. `docs/fix-typo` or `minor-bugfix`). Choose the `main` branch if you modify: - Documentation (`.md` files) @@ -165,81 +171,169 @@ This process reapplies your changes on top of the updated branch and cleanly res > This guide does not cover compiling. If you have trouble compiling the game, refer to the [Compilation Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/COMPILING.md). Code-based PRs make changes such as **fixing bugs** or **implementing new features** in the game. + This involves modifying one or several of the repository’s `.hx` files, found within the `source/` folder. ### Codestyle -Before submitting your PR, check that your code follows the [Style Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/style-guide.md). +Before submitting your PR, check that your code follows the [Style Guide](https://github.com/FunkinCrew/Funkin/blob/main/docs/style-guide.md). This keeps your code consistent with the rest of the codebase! +### Code comments +Code comments help others understand your changes, so the way you write them is important! Here are some guidelines for writing comments in your code: -- Leave comments only when you believe a piece of code warrants explanation. +- Leave comments only when you believe a piece of code warrants explanation. If a piece of code is self-explanatory, it does not need a comment. - Ensure that your comments provide meaningful insight into the function or purpose of the code. - Write your comments in a clear and concise manner. - Only sign your comments with your name when your changes are complex and may require further explanation. -### Example Comments +### Example code comments #### DO NOT: +Below are examples of what you SHOULD NOT do when writing code comments. ```haxe - /** - * jumps around the song - * works with bpm changes but skipped notes still hurt - * @param sections how many sections to jump, negative = backwards - */ - function changeSection(sections:Int):Void +/** + * jumps around the song + * works with bpm changes but skipped notes still hurt + * @param sections how many sections to jump, negative = backwards + */ +function changeSection(sections:Int):Void +{ + // Pause the music, as you probably guessed + // FlxG.sound.music.pause(); + + // Set the target time in steps, I don’t really get how this works though lol - [GitHub username] + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started, that would probably break a lot of things and cause a bunch of problems! + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) // If the music is not null, set the time to the target time { - // Pause the music, as you probably guessed - // FlxG.sound.music.pause(); - - // Set the target time in steps, I don’t really get how this works though lol - [GitHub username] - var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); - var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); - - // Don't go back in time to before the song started, that would probably break a lot of things and cause a whole bunch of problems! - targetTimeMs = Math.max(0, targetTimeMs); - - if (FlxG.sound.music != null) // If the music is not null, set the time to the target time - { - FlxG.sound.music.time = targetTimeMs; - } - - // Handle skipped notes and events and all that jazz - handleSkippedNotes(); - SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); - // regenNoteData(FlxG.sound.music.time); - - Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); - - // I hate this function - [GitHub username] - resyncVocals(); + FlxG.sound.music.time = targetTimeMs; } + + // Handle skipped notes and events and all that jazz + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + // regenNoteData(FlxG.sound.music.time); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + // I hate this function - [GitHub username] + resyncVocals(); +} +``` + +```haxe +// End the song when the music is complete. +FlxG.sound.music.onComplete = function() { + endSong(skipEndingTransition); +}; +// A negative instrumental offset means the song skips the first few milliseconds of the track. +// This just gets added into the startTimestamp behavior so we don't need to do anything extra. +FlxG.sound.music.play(true, Math.max(0, startTimestamp - Conductor.instance.combinedOffset)); +FlxG.sound.music.pitch = playbackRate; + +// Prevent the volume from being wrong. +FlxG.sound.music.volume = 1.0; +// IF fadetween is not null we cancel it +if (FlxG.sound.music.fadeTween != null) FlxG.sound.music.fadeTween.cancel(); + +// Play the vocals +trace('Playing vocals...'); +// Add the vocals +add(vocals); +// Play the vocals for real this time lol +vocals.play(); +// Set the vocals volume +vocals.volume = 1.0; +// Set the vocals pitch +vocals.pitch = playbackRate; +// Set the vocals time to the music time +vocals.time = FlxG.sound.music.time; +// trace('${FlxG.sound.music.time}'); +// trace('${vocals.time}'); +// functionThatWasntHereBeforeThisPRorSomethingIdKLOL(); +/* testsprite = new FlxSprite(0, 0); +testsprite.loadGraphic(Paths.image('test')); +testsprite.screenCenter(); +add(testsprite); */ + +// Me too [GitHub username] I hate this function it gave me pain and suffering - Girlfriend +resyncVocals(); +``` + +```haxe +#if FEATURE_DEBUG_FUNCTIONS +// PAGEUP: who knows what this does +// SHIFT+PAGEUP: There will be dire consequences. +if (FlxG.keys.justPressed.PAGEUP) changeSection(FlxG.keys.pressed.SHIFT ? 20 : 2); +// PAGEUP: who knows what this does +// SHIFT+PAGEUP: There will be dire consequences. +if (FlxG.keys.justPressed.PAGEDOWN) changeSection(FlxG.keys.pressed.SHIFT ? -20 : -2); +#end ``` #### DO: +Below are examples on what you SHOULD do when writing code comments. ```haxe - /** - * Jumps forward or backward a number of sections in the song. - * Accounts for BPM changes, does not prevent death from skipped notes. - * @param sections The number of sections to jump, negative to go backwards. - */ - function changeSection(sections:Int):Void +/** + * Jumps forward or backward a number of sections in the song. + * Accounts for BPM changes, does not prevent death from skipped notes. + * @param sections The number of sections to jump, negative to go backwards. + */ +function changeSection(sections:Int):Void +{ + var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); + var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); + + // Don't go back in time to before the song started. + targetTimeMs = Math.max(0, targetTimeMs); + + if (FlxG.sound.music != null) { - var targetTimeSteps:Float = Conductor.instance.currentStepTime + (Conductor.instance.stepsPerMeasure * sections); - var targetTimeMs:Float = Conductor.instance.getStepTimeInMs(targetTimeSteps); - - // Don't go back in time to before the song started. - targetTimeMs = Math.max(0, targetTimeMs); - - if (FlxG.sound.music != null) - { - FlxG.sound.music.time = targetTimeMs; - } - - handleSkippedNotes(); - SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); - - Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); - - resyncVocals(); + FlxG.sound.music.time = targetTimeMs; } + + handleSkippedNotes(); + SongEventRegistry.handleSkippedEvents(songEvents, Conductor.instance.songPosition); + + Conductor.instance.update(FlxG.sound?.music?.time ?? 0.0); + + resyncVocals(); +} +``` + +```haxe +FlxG.sound.music.onComplete = function() { + endSong(skipEndingTransition); +}; +// A negative instrumental offset means the song skips the first few milliseconds of the track. +// This just gets added into the startTimestamp behavior so we don't need to do anything extra. +FlxG.sound.music.play(true, Math.max(0, startTimestamp - Conductor.instance.combinedOffset)); +FlxG.sound.music.pitch = playbackRate; + +// Prevent the volume from being wrong. +FlxG.sound.music.volume = 1.0; +if (FlxG.sound.music.fadeTween != null) FlxG.sound.music.fadeTween.cancel(); + +trace('Playing vocals...'); +add(vocals); +vocals.play(); +vocals.volume = 1.0; +vocals.pitch = playbackRate; +vocals.time = FlxG.sound.music.time; +resyncVocals(); +``` + +```haxe +#if FEATURE_DEBUG_FUNCTIONS +// PAGEUP: Skip forward two sections. +// SHIFT+PAGEUP: Skip forward twenty sections. +if (FlxG.keys.justPressed.PAGEUP) changeSection(FlxG.keys.pressed.SHIFT ? 20 : 2); +// PAGEDOWN: Skip backward two section. Doesn't replace notes. +// SHIFT+PAGEDOWN: Skip backward twenty sections. +if (FlxG.keys.justPressed.PAGEDOWN) changeSection(FlxG.keys.pressed.SHIFT ? -20 : -2); +#end ``` ## Documentation PRs @@ -297,7 +391,25 @@ If you simultaneously modify files from both repositories, then open two separat Be sure to choose `main` as the base branch for `funkin.assets` PRs, as no `develop` branch exists for that repository. +### Charting PRs +Charting PRs make changes such as **adding/removing notes** or **adjusting the placement of song events**. + +This involves modifying one or several of the `funkin.assets` repository's `.json` chart files, found in the `preload/data/songs/` directory. + +These PRs should only be opened in the `funkin.assets` repository. + +> [!CAUTION] +> **No Major Recharts!** Any PR that makes major chart modifications will be rejected. +> Keep your PRs to small tweaks and fixes. + +Here are some guidelines for opening a Charting PR: +- **Explain the issue.** Which song, variation, difficulty, and section/timestamp is the problem in? Help us understand with screenshots and videos. +- **Show your changes.** How does the chart look with your changes? Provide screenshots and videos here as well. +- **Minimize the diff.** If your changes are very small (e.g. a few notes), do not re-export the chart using the Chart Editor. Instead, manually edit the `.json` chart files to help GitHub display your changes cleanly. + +If your PR is accepted, you will be credited as a GitHub contributor (but not as a charter in the Pause Menu). + # Closing Thank you for reading the Contributing Guide. -We look forward to seeing your contributions to the game! +We look forward to seeing your contributions to the game! \ No newline at end of file From ccaa3d1070eca98ea6f963a620aae08bde711153 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 18 Mar 2025 04:00:18 -0600 Subject: [PATCH 51/81] Consistent hyphens in CODESTYLE.md --- CODESTYLE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CODESTYLE.md b/CODESTYLE.md index 2b6333258..32723531e 100644 --- a/CODESTYLE.md +++ b/CODESTYLE.md @@ -14,8 +14,8 @@ Code Quality is handled by the `vshaxe.haxe-checkstyle` extension, which include * `IndentationCharacter` checks what is used to indent, `Indentation` checks how deep the indentation is. * `CommentedOutCode` check is in place because old code should be retrieved via Git history. * TODO items: Enable these one-by-one and fix them to improve the overall code quality. - - Reconfigure `MethodLength` - - Reconfigure `CyclomaticComplexity` + - Re-configure `MethodLength` + - Re-configure `CyclomaticComplexity` - Re-enable `MagicNumber` - Re-configure `NestedControlFlow` - Re-configure `NestedIfDepth` @@ -28,5 +28,5 @@ Prettier automatically handles formatting of JSON files, and can be configured i ### Prettier Notes * Prettier will automatically attempt to place expressions on a single line if they fit, but will keep them multi-line if they are manually made multi-line. - * This means that long singleline objects are automatically expanded, and short multiline objects aren't automatically collapsed. + * This means that long single-line objects are automatically expanded, and short multi-line objects aren't automatically collapsed. * You may want to use regex replacement to manually remove the first newline in short multi-line objects to convince Prettier to collapse them. From e7cf5fbbdc849e53e92eeea79e67a67b5d98d33f Mon Sep 17 00:00:00 2001 From: Hundrec Date: Tue, 18 Mar 2025 04:01:58 -0600 Subject: [PATCH 52/81] Grammatical fix in style-guide.md --- docs/style-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/style-guide.md b/docs/style-guide.md index 4c4e01492..4df4a163d 100644 --- a/docs/style-guide.md +++ b/docs/style-guide.md @@ -4,7 +4,7 @@ This short document is designed to give a run-down on how code should be formatt ## Notes on IDEs and Extensions -The Visual Studio Code IDE is highly recommended, as this repo contains various configuration that works with VSCode extensions to automatically style certain things for you. +The Visual Studio Code IDE is highly recommended, as this repo contains various configurations that work with VSCode extensions to automatically style certain things for you. VSCode is also the only IDE that has any good tools for Haxe so yeah. From 0d8cfaf104044b3d5f6ad9fb89ac2911af57d1fa Mon Sep 17 00:00:00 2001 From: Hundrec Date: Fri, 4 Apr 2025 18:32:03 -0600 Subject: [PATCH 53/81] Remove 0.6.0 Changelog entries that weren't implemented + polish --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f911d413..f30cef15c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,20 +4,34 @@ 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.6.2] - 2025-03-31 + ### Added -- 0.6 credits list updated + +- Updated the 0.6 credits list + ### Fixed -- Additional shader fix for Stress Pico crashing at the end (was the same issue as Senpai Pico shader error, just in a different shaderfile) + +- Additional shader fix for Stress (Pico Mix) crashing at the end (was the same issue as Senpai Pico shader error, just in a different shaderfile) + + ## [0.6.1] - 2025-03-31 + ### Fixed + - Hopefully Senpai Pico/Erect mix shader isn't brokey - NG API encryption key was added proper, so medals + leaderboards posting should work + + ## [0.6.0] - 2025-03-31 The Pit Stop 2 update! + ### Added + - Added six (!) new playable songs! Check them out in the Freeplay menu for their respective characters. - Cocoa (Pico Mix) - Senpai (Pico Mix) @@ -38,7 +52,6 @@ The Pit Stop 2 update! - The new sticker system isn't fully available to mods yet, but we're working on it! - New option in the Preferences menu: Strumline Backgrounds! - Options in the Preferences menu now display an on-screen description when selected. -- Added a little easter egg to Pico's Good Results Screen animation. - The HOME and END keys now jump to the top and bottom of the Freeplay song list, respectively. ([bb974c2](https://github.com/FunkinCrew/Funkin/commit/bb974c264270d10ff503784063e5d77bb352b3f7)) - by @AbnormalPoof in [#4103](https://github.com/FunkinCrew/Funkin/pull/4103) - Added an option to launch the game in fullscreen. ([ee53ccd](https://github.com/FunkinCrew/Funkin/commit/ee53ccd32721e0790adfe82c60d4aca419db0a7f)) - by @AbnormalPoof in [#3738](https://github.com/FunkinCrew/Funkin/pull/3738) - Added descriptions for each item in the Preferences menu. ([a17b0e8](https://github.com/FunkinCrew/Funkin/commit/a17b0e8b3cc1d56fcdc0b51eaca9fd57cdb5bce0)) - by @anysad in [#3872](https://github.com/FunkinCrew/Funkin/pull/3872) @@ -52,42 +65,31 @@ The Pit Stop 2 update! - Added `DEBUG_BUILD` value to `Constants` to indicate whether a build has debug functions enabled. ([ad45b72](https://github.com/FunkinCrew/Funkin/commit/ad45b72b1ae8eb73a12dc51bcb59f66cc55e7bbd)) - by @AbnormalPoof in [#3853](https://github.com/FunkinCrew/Funkin/pull/3853) ### Changed + - Switched from hxCodec to hxvlc for video playback. This may break a mod or two. - Check the [Funkin Modding Docs](https://funkincrew.github.io/funkin-modding-docs/09-migration/09-02-0.5.0-to-0.6.0.html) for more info on how to update your mods. - Polymod should now ignore `.git` files when loading mods. -- Lots of improvements to issue and pull request organization. - by @Hundrec and @AbnormalPoof +- Lots of improvements to GitHub issue and pull request organization. - by @Hundrec and @AbnormalPoof - Overhauled the Changelog to improve readability and properly credit contributors. ([4383fcf](https://github.com/FunkinCrew/Funkin/commit/4383fcf32c280a1c0ee7b9c80d255611d497cabc)) - by @Hundrec in [#4296](https://github.com/FunkinCrew/Funkin/pull/4296) and [#4298](https://github.com/FunkinCrew/Funkin/pull/4298) - Made various improvements to the screenshot function. ([9ce7bbc](https://github.com/FunkinCrew/Funkin/commit/9ce7bbcfbb8f30ae120c876194f89bc4c787f585)) - by @Lasercar in [#4082](https://github.com/FunkinCrew/Funkin/pull/4082) - Accept keybinds (Z and Space by default) can now be used to exit the Results screen. ([edb270d](https://github.com/FunkinCrew/Funkin/commit/edb270d15e41784dccbf75639ac731840e80fe23)) - by @JVNpixels in [#3799](https://github.com/FunkinCrew/Funkin/pull/3799) - Reordered UI keybinds in the controls menu for consistency. ([a01bcc3](https://github.com/FunkinCrew/Funkin/commit/a01bcc3da836ec52851ca9de13ef459daf61269a)) - by @lemz1 in [#3027](https://github.com/FunkinCrew/Funkin/pull/3027) - New save files now have default Freeplay controls for gamepads. ([2b7f62e](https://github.com/FunkinCrew/Funkin/commit/2b7f62edd33de5527e259d9e5643f926d35da734)) - by @MrMadera in [#3934](https://github.com/FunkinCrew/Funkin/pull/3934) -- Renamed “Auto Pause” preference to “Pause on Unfocus” for clarity. ([49a21c1](https://github.com/FunkinCrew/Funkin/commit/49a21c198236fbecbe5902bb106f78939cc6442a)) - by @JackXson-Real in [#4346](https://github.com/FunkinCrew/Funkin/pull/4346) - Made scrolling smoother in the Chart Editor. ([20d9016](https://github.com/FunkinCrew/Funkin/commit/20d90169845f1e50f849e39f4c5f818359756c78)) - by @ninjamuffin99 in [#3768](https://github.com/FunkinCrew/Funkin/pull/3768) -- The Chart Editor now clears the undo/redo history after loading a new song. ([c7bdc1a](https://github.com/FunkinCrew/Funkin/commit/c7bdc1abe265678468920ca3cc3d7eface5d6925)) - by @Lasercar in [#4308](https://github.com/FunkinCrew/Funkin/pull/4308) - Mods with missing dependencies are now skipped instead of preventing all mods from loading. ([1c2fb43](https://github.com/FunkinCrew/Funkin/commit/1c2fb43ae16cf40be5ef94c40b047e8e772b1211)) - by @AbnormalPoof in [#3993](https://github.com/FunkinCrew/Funkin/pull/3993) - Slightly improved flexibility for modding note hit animations. ([3aad825](https://github.com/FunkinCrew/Funkin/commit/3aad825f865c4ed87016983d44121e2c1610d332)) - by @TechnikTil in [#3936](https://github.com/FunkinCrew/Funkin/pull/3936) - Introduced several QoL modding changes. ([785c4be](https://github.com/FunkinCrew/Funkin/commit/785c4be88b52dc1b5899013822fc004ba7d9894d)) - by @Kade-github in [#4009](https://github.com/FunkinCrew/Funkin/pull/4009) - Lots of smaller bug fixes. -## New Contributors for 0.6.0 +### Fixed -* @PatoFlamejanteTV made their first contribution in [#3843](https://github.com/FunkinCrew/Funkin/pull/3843) -* @sphis-Sinco made their first contribution in [#3881](https://github.com/FunkinCrew/Funkin/pull/3881) -* @MrMadera made their first contribution in [#3934](https://github.com/FunkinCrew/Funkin/pull/3934) -* @Lasercar made their first contribution in [#4100](https://github.com/FunkinCrew/Funkin/pull/4065) -* @MidyGamy made their first contribution in [#4068](https://github.com/FunkinCrew/Funkin/pull/4068) -* @MrScottyPieey made their first contribution in [#4085](https://github.com/FunkinCrew/Funkin/pull/4085) -* @JackXson-Real made their first contribution in [#4346](https://github.com/FunkinCrew/Funkin/pull/4346) - -# Fixed - Fixed a bug where the song would restart from the beginning instead of moving to the Results screen. ([3667c51](https://github.com/FunkinCrew/Funkin/commit/3667c51c1efe14cfe7c810e2f35991f08f50781a)) - by @KoloInDaCrib in [#4309](https://github.com/FunkinCrew/Funkin/pull/4309) and @Lasercar in [#4330](https://github.com/FunkinCrew/Funkin/pull/4330) - Reduced stuttering when resyncing instrumental and voices tracks. ([22d41d2](https://github.com/FunkinCrew/Funkin/commit/22d41d21b88acb7422a0afcda8414682710bd2ed)) - by @TechnikTil in [#3955](https://github.com/FunkinCrew/Funkin/pull/3955) - Songs with only instrumental tracks no longer stutter. ([dfe02ec](https://github.com/FunkinCrew/Funkin/commit/dfe02ec668b61d6308f459c978d12a7487f9dc28)) - by @KoloInDaCrib in [#3861](https://github.com/FunkinCrew/Funkin/pull/3861) -- The mouse cursor is no longer visible outside of debug editors. ([1c12b84](https://github.com/FunkinCrew/Funkin/commit/1c12b8467eca350eb28138473360d5358fa620e2)) - by @sphis-Sinco in [#3881](https://github.com/FunkinCrew/Funkin/pull/3881) +- The debug mouse cursor no longer flickers before the Title Screen loads. ([1c12b84](https://github.com/FunkinCrew/Funkin/commit/1c12b8467eca350eb28138473360d5358fa620e2)) - by @sphis-Sinco in [#3881](https://github.com/FunkinCrew/Funkin/pull/3881) - Unbound keys now display as [N/A] instead of crashing the game. ([94e5d3c](https://github.com/FunkinCrew/Funkin/commit/94e5d3ca258cbaa5d9ab6f0cb26feda83b3433a2)) - by @NotHyper-474 in [#4355](https://github.com/FunkinCrew/Funkin/pull/4355) - Songs can no longer be spam-selected after selecting an instrumental in Freeplay. ([0e0c4ae](https://github.com/FunkinCrew/Funkin/commit/0e0c4aeb7745cfb9479685ccbb635cf3743cddbb)) - by @AbnormalPoof in [#3866](https://github.com/FunkinCrew/Funkin/pull/3866) - The Random capsule can now switch to Erect/Nightmare difficulties in Freeplay. ([6f32747](https://github.com/FunkinCrew/Funkin/commit/6f327474f30374f50774f432ea3ccb6d02579445)) - by @KoloInDaCrib in [#3838](https://github.com/FunkinCrew/Funkin/pull/3838) -- The millions place digit of the Freeplay score now updates properly. ([3719ca6](https://github.com/FunkinCrew/Funkin/commit/3719ca6ce7a170c3c890cdb2aeea3e4534b91736)) - by @Lasercar in [#4065](https://github.com/FunkinCrew/Funkin/pull/4065) - Fixed a rare bug where a song would not register as beaten. ([a3e2373](https://github.com/FunkinCrew/Funkin/commit/a3e23733db104b1ef00cfcff17db3a5d032a4d67)) - by @AbnormalPoof in [#3820](https://github.com/FunkinCrew/Funkin/pull/3820) - The difficulty graphic on the Results screen no longer cuts off incorrectly. ([b13bf05](https://github.com/FunkinCrew/Funkin/commit/b13bf05d16ff2977309e0c7ba3f049c0134e8902)) - by @AbnormalPoof in [#4161](https://github.com/FunkinCrew/Funkin/pull/4161) - Four-digit long Total Notes values in the Results screen no longer overflow to the right. ([2be4c0c](https://github.com/FunkinCrew/Funkin/commit/2be4c0c7196e018a43f9697f015179f3efc3fcdb)) - by @Hundrec in [#4356](https://github.com/FunkinCrew/Funkin/pull/4356) @@ -99,6 +101,16 @@ The Pit Stop 2 update! - Removed an unused class from Polymod blacklist. ([06c12e3](https://github.com/FunkinCrew/Funkin/commit/06c12e36c6bd6df4e2be32a3bec540172e79e162)) - by @AbnormalPoof in [#3729](https://github.com/FunkinCrew/Funkin/pull/3729) - Many additional small bug fixes. +## New Contributors for 0.6.0 + +* @PatoFlamejanteTV made their first contribution in [#3843](https://github.com/FunkinCrew/Funkin/pull/3843) +* @sphis-Sinco made their first contribution in [#3881](https://github.com/FunkinCrew/Funkin/pull/3881) +* @MrMadera made their first contribution in [#3934](https://github.com/FunkinCrew/Funkin/pull/3934) +* @MidyGamy made their first contribution in [#4068](https://github.com/FunkinCrew/Funkin/pull/4068) +* @Lasercar made their first contribution in [#4082](https://github.com/FunkinCrew/Funkin/pull/4082) +* @MrScottyPieey made their first contribution in [#4085](https://github.com/FunkinCrew/Funkin/pull/4085) + + ## [0.5.3] - 2024-10-18 This patch resolves a critical issue that could cause user's save data to become corrupted. It is recommended that users switch to this version immediately and avoid using version 0.5.2. From 030abed2074e3b45ae58fad9372afe092715f7fd Mon Sep 17 00:00:00 2001 From: Hundrec Date: Fri, 4 Apr 2025 19:02:47 -0600 Subject: [PATCH 54/81] Oops, one more lil space --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f30cef15c..0a34ec499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,7 @@ The Pit Stop 2 update! - Added offsets support for album titles. ([69d8570](https://github.com/FunkinCrew/Funkin/commit/69d8570a9eb06011ed6dd95fcbef83d90f7f8684)) - by @AbnormalPoof in [#3618](https://github.com/FunkinCrew/Funkin/pull/3618) - Added three new properties to stage data: `angle`, `scroll`, and `alpha`. ([ff56b19](https://github.com/FunkinCrew/Funkin/commit/ff56b1948aef42bbb6bb4ede4f9b2012d49ab044)) - by @AbnormalPoof in [#3720](https://github.com/FunkinCrew/Funkin/pull/3720) - Added script events for losing/gaining focus. ([4b127b6](https://github.com/FunkinCrew/Funkin/commit/4b127b64130f6f753d0574ec66a1672322e4bd13)) - by @AbnormalPoof in [#3721](https://github.com/FunkinCrew/Funkin/pull/3721) -- Added 10 new functions to `ReflectUtil`.([6216655](https://github.com/FunkinCrew/Funkin/commit/62166554e7a176245d1a63bd15122033044c4e40)) - by @AbnormalPoof in [#3622](https://github.com/FunkinCrew/Funkin/pull/3622), [#3809](https://github.com/FunkinCrew/Funkin/pull/3809), and [#4019](https://github.com/FunkinCrew/Funkin/pull/4019) +- Added 10 new functions to `ReflectUtil`. ([6216655](https://github.com/FunkinCrew/Funkin/commit/62166554e7a176245d1a63bd15122033044c4e40)) - by @AbnormalPoof in [#3622](https://github.com/FunkinCrew/Funkin/pull/3622), [#3809](https://github.com/FunkinCrew/Funkin/pull/3809), and [#4019](https://github.com/FunkinCrew/Funkin/pull/4019) - Added `DEBUG_BUILD` value to `Constants` to indicate whether a build has debug functions enabled. ([ad45b72](https://github.com/FunkinCrew/Funkin/commit/ad45b72b1ae8eb73a12dc51bcb59f66cc55e7bbd)) - by @AbnormalPoof in [#3853](https://github.com/FunkinCrew/Funkin/pull/3853) ### Changed From 695c708cb0e5bd29de07a14ec15e9abd37ff48ab Mon Sep 17 00:00:00 2001 From: Hundrec Date: Sat, 5 Apr 2025 00:02:18 -0600 Subject: [PATCH 55/81] Add a few fixes and changes from 0.6.0 --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a34ec499..93ac9acea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,8 @@ The Pit Stop 2 update! - Switched from hxCodec to hxvlc for video playback. This may break a mod or two. - Check the [Funkin Modding Docs](https://funkincrew.github.io/funkin-modding-docs/09-migration/09-02-0.5.0-to-0.6.0.html) for more info on how to update your mods. - Polymod should now ignore `.git` files when loading mods. +- The pause menu can now be opened and closed rapidly. +- Adjusted difficulty ratings and scroll speeds for many songs. - Lots of improvements to GitHub issue and pull request organization. - by @Hundrec and @AbnormalPoof - Overhauled the Changelog to improve readability and properly credit contributors. ([4383fcf](https://github.com/FunkinCrew/Funkin/commit/4383fcf32c280a1c0ee7b9c80d255611d497cabc)) - by @Hundrec in [#4296](https://github.com/FunkinCrew/Funkin/pull/4296) and [#4298](https://github.com/FunkinCrew/Funkin/pull/4298) - Made various improvements to the screenshot function. ([9ce7bbc](https://github.com/FunkinCrew/Funkin/commit/9ce7bbcfbb8f30ae120c876194f89bc4c787f585)) - by @Lasercar in [#4082](https://github.com/FunkinCrew/Funkin/pull/4082) @@ -79,10 +81,15 @@ The Pit Stop 2 update! - Mods with missing dependencies are now skipped instead of preventing all mods from loading. ([1c2fb43](https://github.com/FunkinCrew/Funkin/commit/1c2fb43ae16cf40be5ef94c40b047e8e772b1211)) - by @AbnormalPoof in [#3993](https://github.com/FunkinCrew/Funkin/pull/3993) - Slightly improved flexibility for modding note hit animations. ([3aad825](https://github.com/FunkinCrew/Funkin/commit/3aad825f865c4ed87016983d44121e2c1610d332)) - by @TechnikTil in [#3936](https://github.com/FunkinCrew/Funkin/pull/3936) - Introduced several QoL modding changes. ([785c4be](https://github.com/FunkinCrew/Funkin/commit/785c4be88b52dc1b5899013822fc004ba7d9894d)) - by @Kade-github in [#4009](https://github.com/FunkinCrew/Funkin/pull/4009) -- Lots of smaller bug fixes. +- Lots of smaller changes. ### Fixed +- Shaders no longer create thin seams within atlas sprites. +- Completing a song in Practice Mode no longer plays a new rank animation in the Freeplay menu. +- Fixed lots of charting issues across many songs. +- The Chart Editor grid now properly adjusts to the new BPM after switching variations. +- Fixed a few crashes in the Stage Editor. - Fixed a bug where the song would restart from the beginning instead of moving to the Results screen. ([3667c51](https://github.com/FunkinCrew/Funkin/commit/3667c51c1efe14cfe7c810e2f35991f08f50781a)) - by @KoloInDaCrib in [#4309](https://github.com/FunkinCrew/Funkin/pull/4309) and @Lasercar in [#4330](https://github.com/FunkinCrew/Funkin/pull/4330) - Reduced stuttering when resyncing instrumental and voices tracks. ([22d41d2](https://github.com/FunkinCrew/Funkin/commit/22d41d21b88acb7422a0afcda8414682710bd2ed)) - by @TechnikTil in [#3955](https://github.com/FunkinCrew/Funkin/pull/3955) - Songs with only instrumental tracks no longer stutter. ([dfe02ec](https://github.com/FunkinCrew/Funkin/commit/dfe02ec668b61d6308f459c978d12a7487f9dc28)) - by @KoloInDaCrib in [#3861](https://github.com/FunkinCrew/Funkin/pull/3861) From d54df57b952bcdffc836ae5c63dc351f54a00281 Mon Sep 17 00:00:00 2001 From: Hundrec Date: Thu, 10 Apr 2025 22:49:12 -0600 Subject: [PATCH 56/81] Two more Chart Editor entries in Changelog --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93ac9acea..13cc8626a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,10 +51,11 @@ The Pit Stop 2 update! - Added new stickers which appear when exiting Pico songs! - The new sticker system isn't fully available to mods yet, but we're working on it! - New option in the Preferences menu: Strumline Backgrounds! -- Options in the Preferences menu now display an on-screen description when selected. +- New song event type in the Chart Editor: Set Health Icon! + - This event is now used in Stress (Pico Mix). - The HOME and END keys now jump to the top and bottom of the Freeplay song list, respectively. ([bb974c2](https://github.com/FunkinCrew/Funkin/commit/bb974c264270d10ff503784063e5d77bb352b3f7)) - by @AbnormalPoof in [#4103](https://github.com/FunkinCrew/Funkin/pull/4103) - Added an option to launch the game in fullscreen. ([ee53ccd](https://github.com/FunkinCrew/Funkin/commit/ee53ccd32721e0790adfe82c60d4aca419db0a7f)) - by @AbnormalPoof in [#3738](https://github.com/FunkinCrew/Funkin/pull/3738) -- Added descriptions for each item in the Preferences menu. ([a17b0e8](https://github.com/FunkinCrew/Funkin/commit/a17b0e8b3cc1d56fcdc0b51eaca9fd57cdb5bce0)) - by @anysad in [#3872](https://github.com/FunkinCrew/Funkin/pull/3872) +- Added on-screen descriptions for each item in the Preferences menu. ([a17b0e8](https://github.com/FunkinCrew/Funkin/commit/a17b0e8b3cc1d56fcdc0b51eaca9fd57cdb5bce0)) - by @anysad in [#3872](https://github.com/FunkinCrew/Funkin/pull/3872) - Added precise scrolling in the Chart Editor using Ctrl-Mouse Wheel. ([0d8e4a5](https://github.com/FunkinCrew/Funkin/commit/0d8e4a53305d6d069454812766300122f3581e31)) - by @ninjamuffin99 in [#3806](https://github.com/FunkinCrew/Funkin/pull/3806) - Added a “None” option to the character selector in the Chart Editor. ([d9637d3](https://github.com/FunkinCrew/Funkin/commit/d9637d3a19466b9fc68a102676c46a74ef504909)) - by @Lasercar in [#4279](https://github.com/FunkinCrew/Funkin/pull/4279) - Added the ability to flip the character in the Animation Editor. ([de02137](https://github.com/FunkinCrew/Funkin/commit/de02137d7c7d1779e85aeda34743f506a5b9cc27)) - by @AbnormalPoof in [#3028](https://github.com/FunkinCrew/Funkin/pull/3028) @@ -71,6 +72,8 @@ The Pit Stop 2 update! - Polymod should now ignore `.git` files when loading mods. - The pause menu can now be opened and closed rapidly. - Adjusted difficulty ratings and scroll speeds for many songs. +- Chart Editor event fields now allow for values to be as specific as desired. + - For example, the Zoom Camera event can now be set to 0.9857. - Lots of improvements to GitHub issue and pull request organization. - by @Hundrec and @AbnormalPoof - Overhauled the Changelog to improve readability and properly credit contributors. ([4383fcf](https://github.com/FunkinCrew/Funkin/commit/4383fcf32c280a1c0ee7b9c80d255611d497cabc)) - by @Hundrec in [#4296](https://github.com/FunkinCrew/Funkin/pull/4296) and [#4298](https://github.com/FunkinCrew/Funkin/pull/4298) - Made various improvements to the screenshot function. ([9ce7bbc](https://github.com/FunkinCrew/Funkin/commit/9ce7bbcfbb8f30ae120c876194f89bc4c787f585)) - by @Lasercar in [#4082](https://github.com/FunkinCrew/Funkin/pull/4082) From 2b7254fbd2356e9da91e216f178a88f17874a6eb Mon Sep 17 00:00:00 2001 From: Super <38338700+superpowers04@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:38:46 -0400 Subject: [PATCH 57/81] Add FlxG.fixedTimestep change to initState --- source/funkin/InitState.hx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/funkin/InitState.hx b/source/funkin/InitState.hx index 5973937bf..994480abd 100644 --- a/source/funkin/InitState.hx +++ b/source/funkin/InitState.hx @@ -107,6 +107,9 @@ class InitState extends FlxState // Set the game to a lower frame rate while it is in the background. FlxG.game.focusLostFramerate = 30; + // Makes Flixel use frame times instead of locked movements per frame for things like tweens + FlxG.fixedTimestep = false; + setupFlixelDebug(); // From e6e3a30c0c5dd7c86ec6e3b64251314fcb5cf247 Mon Sep 17 00:00:00 2001 From: Abnormal <86753001+AbnormalPoof@users.noreply.github.com> Date: Sat, 29 Mar 2025 02:08:28 -0500 Subject: [PATCH 58/81] docs: Add missing documentation to the remaining functions in `Module` --- source/funkin/modding/module/Module.hx | 86 ++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/source/funkin/modding/module/Module.hx b/source/funkin/modding/module/Module.hx index 57f0cc2da..012b9869f 100644 --- a/source/funkin/modding/module/Module.hx +++ b/source/funkin/modding/module/Module.hx @@ -57,6 +57,9 @@ class Module implements IPlayStateScriptedClass implements IStateChangingScripte // TODO: Half of these aren't actually being called!!!!!!! + /** + * Called when ANY script event is dispatched. + */ public function onScriptEvent(event:ScriptEvent) {} /** @@ -71,55 +74,138 @@ class Module implements IPlayStateScriptedClass implements IStateChangingScripte */ public function onDestroy(event:ScriptEvent) {} + /** + * Called every frame. + */ public function onUpdate(event:UpdateScriptEvent) {} + /** + * Called when the game is paused. + */ public function onPause(event:PauseScriptEvent) {} + /** + * Called when the game is resumed. + */ public function onResume(event:ScriptEvent) {} + /** + * Called when the song begins. + */ public function onSongStart(event:ScriptEvent) {} + /** + * Called when the song ends. + */ public function onSongEnd(event:ScriptEvent) {} + /** + * Called when the player dies. + */ public function onGameOver(event:ScriptEvent) {} + /** + * Called when a note on the strumline has been rendered and is now onscreen. + * This gets dispatched for both the player and opponent strumlines. + */ public function onNoteIncoming(event:NoteScriptEvent) {} + /** + * Called when a note has been hit. + * This gets dispatched for both the player and opponent strumlines. + */ public function onNoteHit(event:HitNoteScriptEvent) {} + /** + * Called when a note has been missed. + * This gets dispatched for both the player and opponent strumlines. + */ public function onNoteMiss(event:NoteScriptEvent) {} + /** + * Called when the player presses a key without any notes present. + */ public function onNoteGhostMiss(event:GhostMissNoteScriptEvent) {} + /** + * Called when a step is hit in the song. + */ public function onStepHit(event:SongTimeScriptEvent) {} + /** + * Called when a beat is hit in the song. + */ public function onBeatHit(event:SongTimeScriptEvent) {} + /** + * Called when a song event is triggered. + */ public function onSongEvent(event:SongEventScriptEvent) {} + /** + * Called when the countdown begins. + */ public function onCountdownStart(event:CountdownScriptEvent) {} + /** + * Called for every step in the countdown. + */ public function onCountdownStep(event:CountdownScriptEvent) {} + /** + * Called when the countdown ends, but BEFORE the song starts. + */ public function onCountdownEnd(event:CountdownScriptEvent) {} + /** + * Called when the song's chart has been parsed and loaded. + */ public function onSongLoaded(event:SongLoadScriptEvent) {} + /** + * Called when the game is about to switch to a new state. + */ public function onStateChangeBegin(event:StateChangeScriptEvent) {} + /** + * Called after the game has switched to a new state. + */ public function onStateChangeEnd(event:StateChangeScriptEvent) {} + /** + * Called when the game regains focus. + * This does not get called if "Auto Pause" is disabled. + */ public function onFocusGained(event:FocusScriptEvent) {} + /** + * Called when the game loses focus. + * This does not get called if "Auto Pause" is disabled. + */ public function onFocusLost(event:FocusScriptEvent) {} + /** + * Called when the game is about to open a substate. + */ public function onSubStateOpenBegin(event:SubStateScriptEvent) {} + /** + * Called when a substate has been opened. + */ public function onSubStateOpenEnd(event:SubStateScriptEvent) {} + /** + * Called when the game is about to close a substate. + */ public function onSubStateCloseBegin(event:SubStateScriptEvent) {} + /** + * Called when a substate has been closed. + */ public function onSubStateCloseEnd(event:SubStateScriptEvent) {} + /** + * Called when the song has been restarted. + */ public function onSongRetry(event:SongRetryEvent) {} } From 51324e9c283c43ca861d3369ba9b3e1db9c89765 Mon Sep 17 00:00:00 2001 From: Kolo <67389779+JustKolosaki@users.noreply.github.com> Date: Thu, 10 Oct 2024 19:21:51 +0200 Subject: [PATCH 59/81] mmyes --- source/funkin/play/ResultScore.hx | 2 ++ source/funkin/ui/freeplay/FreeplayScore.hx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/source/funkin/play/ResultScore.hx b/source/funkin/play/ResultScore.hx index c5713b7b0..31cbb0bc6 100644 --- a/source/funkin/play/ResultScore.hx +++ b/source/funkin/play/ResultScore.hx @@ -19,6 +19,8 @@ class ResultScore extends FlxTypedSpriteGroup var dumbNumb = Std.parseInt(Std.string(val)); var prevNum:ScoreNum; + dumbNumb = Std.int(Math.min(dumbNumb, Math.pow(10, group.members.length) - 1)); + while (dumbNumb > 0) { scoreStart += 1; diff --git a/source/funkin/ui/freeplay/FreeplayScore.hx b/source/funkin/ui/freeplay/FreeplayScore.hx index fee55ce7c..8c0911a70 100644 --- a/source/funkin/ui/freeplay/FreeplayScore.hx +++ b/source/funkin/ui/freeplay/FreeplayScore.hx @@ -14,6 +14,8 @@ class FreeplayScore extends FlxTypedSpriteGroup var dumbNumb = Std.parseInt(Std.string(val)); var prevNum:ScoreNum; + dumbNumb = Std.int(Math.min(dumbNumb, Math.pow(10, group.members.length) - 1)); + while (dumbNumb > 0) { group.members[loopNum].digit = dumbNumb % 10; From 95ade2a08b7709e8208ec1b3e123bf5b4308ba10 Mon Sep 17 00:00:00 2001 From: cyn0x8 Date: Sun, 6 Apr 2025 01:12:04 -0700 Subject: [PATCH 60/81] FileUtil overhaul + sandboxing --- source/funkin/modding/PolymodHandler.hx | 3 + .../ui/debug/charting/ChartEditorState.hx | 2 +- .../dialogs/ChartEditorWelcomeDialog.hx | 2 +- .../ui/debug/stageeditor/StageEditorState.hx | 2 +- .../components/BackupAvailableDialog.hx | 4 +- .../stageeditor/components/WelcomeDialog.hx | 2 +- source/funkin/util/FileUtil.hx | 1019 +++++++++++++++-- 7 files changed, 909 insertions(+), 125 deletions(-) diff --git a/source/funkin/modding/PolymodHandler.hx b/source/funkin/modding/PolymodHandler.hx index 0bcef1f79..95401ac8d 100644 --- a/source/funkin/modding/PolymodHandler.hx +++ b/source/funkin/modding/PolymodHandler.hx @@ -250,6 +250,9 @@ class PolymodHandler Polymod.addImportAlias('lime.utils.Assets', funkin.Assets); Polymod.addImportAlias('openfl.utils.Assets', funkin.Assets); + // `funkin.util.FileUtil` has unrestricted access to the file system. + Polymod.addImportAlias('funkin.util.FileUtil', funkin.util.FileUtilSandboxed); + // Add blacklisting for prohibited classes and packages. // `Sys` diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index 22845155f..7a4bfa87f 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -2361,7 +2361,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState } } - if (!FileUtil.doesFileExist(chartPath)) + if (!FileUtil.fileExists(chartPath)) { trace('Previously loaded chart file (${chartPath.toString()}) does not exist, disabling link...'); menuItemRecentChart.disabled = true; diff --git a/source/funkin/ui/debug/charting/dialogs/ChartEditorWelcomeDialog.hx b/source/funkin/ui/debug/charting/dialogs/ChartEditorWelcomeDialog.hx index 5de5fb6d2..8d5e8b620 100644 --- a/source/funkin/ui/debug/charting/dialogs/ChartEditorWelcomeDialog.hx +++ b/source/funkin/ui/debug/charting/dialogs/ChartEditorWelcomeDialog.hx @@ -106,7 +106,7 @@ class ChartEditorWelcomeDialog extends ChartEditorBaseDialog } } - if (!FileUtil.doesFileExist(chartPath)) + if (!FileUtil.fileExists(chartPath)) { trace('Previously loaded chart file (${chartPath}) does not exist, disabling link...'); linkRecentChart.disabled = true; diff --git a/source/funkin/ui/debug/stageeditor/StageEditorState.hx b/source/funkin/ui/debug/stageeditor/StageEditorState.hx index e66245b24..aaafc1a52 100644 --- a/source/funkin/ui/debug/stageeditor/StageEditorState.hx +++ b/source/funkin/ui/debug/stageeditor/StageEditorState.hx @@ -1073,7 +1073,7 @@ class StageEditorState extends UIState var filePath = new haxe.io.Path(file); var item = new MenuItem(); item.text = filePath.file + "." + filePath.ext; - item.disabled = !FileUtil.doesFileExist(file); + item.disabled = !FileUtil.fileExists(file); var load = function(file:String) { currentFile = file; diff --git a/source/funkin/ui/debug/stageeditor/components/BackupAvailableDialog.hx b/source/funkin/ui/debug/stageeditor/components/BackupAvailableDialog.hx index 6c3041e28..5ab4029ef 100644 --- a/source/funkin/ui/debug/stageeditor/components/BackupAvailableDialog.hx +++ b/source/funkin/ui/debug/stageeditor/components/BackupAvailableDialog.hx @@ -32,7 +32,7 @@ class BackupAvailableDialog extends Dialog { super(); - if (!FileUtil.doesFileExist(filePath)) return; + if (!FileUtil.fileExists(filePath)) return; // time text var fileDate = Path.withoutExtension(Path.withoutDirectory(filePath)); @@ -62,7 +62,7 @@ class BackupAvailableDialog extends Dialog } buttonOpenBackup.onClick = function(_) { - if (FileUtil.doesFileExist(filePath) && state.welcomeDialog != null) // doing a check in case a sleezy FUCK decides to delete the backup file AFTER dialog opens + if (FileUtil.fileExists(filePath) && state.welcomeDialog != null) // doing a check in case a sleezy FUCK decides to delete the backup file AFTER dialog opens { state.welcomeDialog.loadFromFilePath(filePath); } diff --git a/source/funkin/ui/debug/stageeditor/components/WelcomeDialog.hx b/source/funkin/ui/debug/stageeditor/components/WelcomeDialog.hx index 2794da465..0dc688f14 100644 --- a/source/funkin/ui/debug/stageeditor/components/WelcomeDialog.hx +++ b/source/funkin/ui/debug/stageeditor/components/WelcomeDialog.hx @@ -35,7 +35,7 @@ class WelcomeDialog extends Dialog { trace(file); - if (!FileUtil.doesFileExist(file)) continue; // whats the point of loading something that doesnt exist + if (!FileUtil.fileExists(file)) continue; // whats the point of loading something that doesnt exist var patj = new haxe.io.Path(file); diff --git a/source/funkin/util/FileUtil.hx b/source/funkin/util/FileUtil.hx index 5b053bb08..f1dcbb0a6 100644 --- a/source/funkin/util/FileUtil.hx +++ b/source/funkin/util/FileUtil.hx @@ -13,9 +13,12 @@ import haxe.ui.containers.dialogs.Dialogs; import haxe.ui.containers.dialogs.Dialogs.SelectedFileInfo; import haxe.ui.containers.dialogs.Dialogs.FileDialogExtensionInfo; +using StringTools; + /** * Utilities for reading and writing files on various platforms. */ +@:nullSafety class FileUtil { public static final FILE_FILTER_FNFC:FileFilter = new FileFilter("Friday Night Funkin' Chart (.fnfc)", "*.fnfc"); @@ -46,6 +49,43 @@ class FileUtil label: 'Friday Night Funkin\' Stage', }; + /** + * Paths which should not be deleted or modified by scripts. + */ + private static final PROTECTED_PATHS:Array = [ + '', + 'assets', + 'manifest', + 'manifest/*', + 'plugins', + 'plugins/*', + 'Funkin.exe', + 'Funkin', + 'libvlc.dll', + 'libvlccore.dll', + 'lime.ndll' + ]; + + /** + * Invalid filesystem characters. + */ + private static final INVALID_CHARS:Array = [':', '*', '?', '"', '<', '>', '|']; + + #if sys + private static var _gameDirectory:Null = null; + public static var gameDirectory(get, never):String; + + public static function get_gameDirectory():String + { + if (_gameDirectory != null) + { + return _gameDirectory; + } + + return _gameDirectory = Path.directory(Path.normalize(sys.FileSystem.fullPath(Sys.programPath()))); + } + #end + /** * Browses for a single file, then calls `onSelect(fileInfo)` when a file is selected. * Powered by HaxeUI, so it works on all platforms. @@ -55,15 +95,15 @@ class FileUtil * @param onSelect A callback that provides a `SelectedFileInfo` object when a file is selected. * @param onCancel A callback that is called when the user closes the dialog without selecting a file. */ - public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, ?onSelect:SelectedFileInfo->Void, - ?onCancel:Void->Void) + public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, + ?onCancel:()->Void) { var onComplete = function(button, selectedFiles) { if (button == DialogButton.OK && selectedFiles.length > 0) { onSelect(selectedFiles[0]); } - else + else if (onCancel != null) { onCancel(); } @@ -74,7 +114,7 @@ class FileUtil readContents: true, readAsBinary: true, // Binary multiple: false, - extensions: typeFilter ?? [], + extensions: typeFilter ?? new Array(), title: dialogTitle, }); } @@ -88,15 +128,15 @@ class FileUtil * @param onSelect A callback that provides a `SelectedFileInfo` object when a file is selected. * @param onCancel A callback that is called when the user closes the dialog without selecting a file. */ - public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, ?onSelect:SelectedFileInfo->Void, - ?onCancel:Void->Void) + public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, + ?onCancel:()->Void):Void { var onComplete = function(button, selectedFiles) { if (button == DialogButton.OK && selectedFiles.length > 0) { onSelect(selectedFiles[0]); } - else + else if (onCancel != null) { onCancel(); } @@ -107,7 +147,7 @@ class FileUtil readContents: true, readAsBinary: false, // Text multiple: false, - extensions: typeFilter ?? [], + extensions: typeFilter ?? new Array(), title: dialogTitle, }); } @@ -119,21 +159,29 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function browseForDirectory(?typeFilter:Array, ?onSelect:String->Void, ?onCancel:Void->Void, ?defaultPath:String, + public static function browseForDirectory(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop - var filter:String = convertTypeFilter(typeFilter); + var filter:Null = convertTypeFilter(typeFilter); var fileDialog:FileDialog = new FileDialog(); - if (onSelect != null) fileDialog.onSelect.add(onSelect); - if (onCancel != null) fileDialog.onCancel.add(onCancel); + fileDialog.onSelect.add(onSelect); + if (onCancel != null) + { + fileDialog.onCancel.add(onCancel); + } + fileDialog.browse(OPEN_DIRECTORY, filter, defaultPath, dialogTitle); + return true; - #elseif html5 - onCancel(); - return false; #else - onCancel(); + trace('WARNING: browseForDirectory not implemented for this platform'); + + if (onCancel != null) + { + onCancel(); + } + return false; #end } @@ -144,21 +192,29 @@ class FileUtil * * @return Whether the file dialog was opened successfully. */ - public static function browseForMultipleFiles(?typeFilter:Array, ?onSelect:Array->Void, ?onCancel:Void->Void, ?defaultPath:String, + public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop - var filter:String = convertTypeFilter(typeFilter); + var filter:Null = convertTypeFilter(typeFilter); var fileDialog:FileDialog = new FileDialog(); - if (onSelect != null) fileDialog.onSelectMultiple.add(onSelect); - if (onCancel != null) fileDialog.onCancel.add(onCancel); + fileDialog.onSelectMultiple.add(onSelect); + if (onCancel != null) + { + fileDialog.onCancel.add(onCancel); + } + fileDialog.browse(OPEN_MULTIPLE, filter, defaultPath, dialogTitle); + return true; - #elseif html5 - onCancel(); - return false; #else - onCancel(); + trace('WARNING: browseForMultipleFiles not implemented for this platform'); + + if (onCancel != null) + { + onCancel(); + } + return false; #end } @@ -170,21 +226,29 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function browseForSaveFile(?typeFilter:Array, ?onSelect:String->Void, ?onCancel:Void->Void, ?defaultPath:String, + public static function browseForSaveFile(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop - var filter:String = convertTypeFilter(typeFilter); + var filter:Null = convertTypeFilter(typeFilter); var fileDialog:FileDialog = new FileDialog(); - if (onSelect != null) fileDialog.onSelect.add(onSelect); - if (onCancel != null) fileDialog.onCancel.add(onCancel); + fileDialog.onSelect.add(onSelect); + if (onCancel != null) + { + fileDialog.onCancel.add(onCancel); + } + fileDialog.browse(SAVE, filter, defaultPath, dialogTitle); + return true; - #elseif html5 - onCancel(); - return false; #else - onCancel(); + trace('WARNING: browseForSaveFile not implemented for this platform'); + + if (onCancel != null) + { + onCancel(); + } + return false; #end } @@ -195,25 +259,49 @@ class FileUtil * * @return Whether the file dialog was opened successfully. */ - public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:String->Void, ?onCancel:Void->Void, ?defaultFileName:String, + public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String)->Void, ?onCancel:()->Void, ?defaultFileName:String, ?dialogTitle:String):Bool { #if desktop - var filter:String = convertTypeFilter(typeFilter); + var filter:Null = convertTypeFilter(typeFilter); var fileDialog:FileDialog = new FileDialog(); - if (onSave != null) fileDialog.onSave.add(onSave); - if (onCancel != null) fileDialog.onCancel.add(onCancel); + if (onSave != null) + { + fileDialog.onSave.add(onSave); + } + + if (onCancel != null) + { + fileDialog.onCancel.add(onCancel); + } + fileDialog.save(data, filter, defaultFileName, dialogTitle); + return true; #elseif html5 var filter:String = defaultFileName != null ? Path.extension(defaultFileName) : null; var fileDialog:FileDialog = new FileDialog(); - if (onSave != null) fileDialog.onSave.add(onSave); - if (onCancel != null) fileDialog.onCancel.add(onCancel); + if (onSave != null) + { + fileDialog.onSave.add(onSave); + } + + if (onCancel != null) + { + fileDialog.onCancel.add(onCancel); + } + fileDialog.save(data, filter, defaultFileName, dialogTitle); + return true; #else - onCancel(); + trace('WARNING: saveFile not implemented for this platform'); + + if (onCancel != null) + { + onCancel(); + } + return false; #end } @@ -226,16 +314,17 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function saveMultipleFiles(resources:Array, ?onSaveAll:Array->Void, ?onCancel:Void->Void, ?defaultPath:String, + public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool { #if desktop // Prompt the user for a directory, then write all of the files to there. - var onSelectDir:String->Void = function(targetPath:String):Void { - var paths:Array = []; + var onSelectDir:(String)->Void = function(targetPath:String):Void { + var paths:Array = new Array(); for (resource in resources) { - var filePath = haxe.io.Path.join([targetPath, resource.fileName]); + /* + var filePath:String = Path.join([targetPath, resource.fileName]); try { if (resource.data == null) @@ -248,25 +337,50 @@ class FileUtil writeBytesToPath(filePath, resource.data, force ? Force : Skip); } } - catch (_) + catch (e:Dynamic) { throw 'Failed to write file (probably already exists): $filePath'; } + */ + if (resource.data == null) + { + trace('WARNING: File ${resource.fileName} has no data or content. Skipping.'); + continue; + } + + var filePath:String = Path.join([targetPath, resource.fileName]); + + paths.push(filePath); } - onSaveAll(paths); + + if (onSaveAll != null) + { + onSaveAll(paths); + } } + trace('Browsing for directory to save individual files to...'); + #if mac defaultPath = null; #end + browseForDirectory(null, onSelectDir, onCancel, defaultPath, 'Choose directory to save all files to...'); + return true; #elseif html5 saveFilesAsZIP(resources, onSaveAll, onCancel, defaultPath, force); + return true; #else - onCancel(); + trace('WARNING: saveMultipleFiles not implemented for this platform'); + + if (onCancel != null) + { + onCancel(); + } + return false; #end } @@ -274,14 +388,19 @@ class FileUtil /** * Takes an array of file entries and prompts the user to save them as a ZIP file. */ - public static function saveFilesAsZIP(resources:Array, ?onSave:Array->Void, ?onCancel:Void->Void, ?defaultPath:String, force:Bool = false):Bool + public static function saveFilesAsZIP(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool { // Create a ZIP file. var zipBytes:Bytes = createZIPFromEntries(resources); - var onSave:String->Void = function(path:String) { - trace('Saved ${resources.length} files to ZIP at "$path".'); - if (onSave != null) onSave([path]); + var onSave:(String)->Void = function(path:String) { + trace('Saved ${resources.length} files to ZIP at "$path"'); + + if (onSave != null) + { + onSave([path]); + } }; + // Prompt the user to save the ZIP file. saveFile(zipBytes, [FILE_FILTER_ZIP], onSave, onCancel, defaultPath, 'Save files as ZIP...'); return true; @@ -290,14 +409,18 @@ class FileUtil /** * Takes an array of file entries and prompts the user to save them as a FNFC file. */ - public static function saveChartAsFNFC(resources:Array, ?onSave:Array->Void, ?onCancel:Void->Void, ?defaultPath:String, + public static function saveChartAsFNFC(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool { // Create a ZIP file. var zipBytes:Bytes = createZIPFromEntries(resources); - var onSave:String->Void = function(path:String) { - trace('Saved FNF file to "$path"'); - if (onSave != null) onSave([path]); + var onSave:(String)->Void = function(path:String) { + trace('Saved FNFC file to "$path"'); + + if (onSave != null) + { + onSave([path]); + } }; // Prompt the user to save the ZIP file. saveFile(zipBytes, [FILE_FILTER_FNFC], onSave, onCancel, defaultPath, 'Save chart as FNFC...'); @@ -335,8 +458,7 @@ class FileUtil #if sys return sys.io.File.getContent(path); #else - trace('ERROR: readStringFromPath not implemented for this platform'); - return null; + throw 'Direct file reading by path is not supported on this platform.'; #end } @@ -350,21 +472,13 @@ class FileUtil public static function readBytesFromPath(path:String):Bytes { #if sys - if (!doesFileExist(path)) return null; return sys.io.File.getBytes(path); #else - return null; + throw 'Direct file reading by path is not supported on this platform.'; #end } - public static function doesFileExist(path:String):Bool - { - #if sys - return sys.FileSystem.exists(path); - #else - return false; - #end - } + /** * Browse for a file to read and execute a callback once we have a file reference. @@ -372,37 +486,45 @@ class FileUtil * * @param callback The function to call when the file is loaded. */ - public static function browseFileReference(callback:FileReference->Void) + public static function browseFileReference(callback:(FileReference)->Void):Void { var file = new FileReference(); file.addEventListener(Event.SELECT, function(e) { var selectedFileRef:FileReference = e.target; trace('Selected file: ' + selectedFileRef.name); + selectedFileRef.addEventListener(Event.COMPLETE, function(e) { var loadedFileRef:FileReference = e.target; trace('Loaded file: ' + loadedFileRef.name); + callback(loadedFileRef); }); + selectedFileRef.load(); }); + file.browse(); } /** * Prompts the user to save a file to their computer. */ - public static function writeFileReference(path:String, data:String) + public static function writeFileReference(path:String, data:String):Void { var file = new FileReference(); + file.addEventListener(Event.COMPLETE, function(e:Event) { - trace('Successfully wrote file.'); + trace('Successfully wrote file: "$path"'); }); + file.addEventListener(Event.CANCEL, function(e:Event) { - trace('Cancelled writing file.'); + trace('Cancelled writing file: "$path"'); }); + file.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent) { - trace('IO error writing file.'); + trace('IO error writing file: "$path"'); }); + file.save(data, path); } @@ -416,16 +538,9 @@ class FileUtil public static function readJSONFromPath(path:String):Dynamic { #if sys - try - { - return SerializerUtil.fromJSON(sys.io.File.getContent(path)); - } - catch (ex) - { - return null; - } + return SerializerUtil.fromJSON(sys.io.File.getContent(path)); #else - return null; + throw 'Direct file reading by path is not supported on this platform.'; #end } @@ -440,26 +555,27 @@ class FileUtil public static function writeStringToPath(path:String, data:String, mode:FileWriteMode = Skip):Void { #if sys + if (directoryExists(path)) + { + throw 'Target path is a directory, not a file: "$path"'; + } + createDirIfNotExists(Path.directory(path)); + switch (mode) { case Force: sys.io.File.saveContent(path, data); case Skip: - if (!doesFileExist(path)) + if (!pathExists(path)) { sys.io.File.saveContent(path, data); } - else - { - // Do nothing. - // throw 'File already exists: $path'; - } case Ask: - if (doesFileExist(path)) + if (pathExists(path)) { // TODO: We don't have the technology to use native popups yet. - throw 'File already exists: $path'; + throw 'Entry at path already exists: $path'; } else { @@ -467,7 +583,7 @@ class FileUtil } } #else - throw 'Direct file writing by path not supported on this platform.'; + throw 'Direct file writing by path is not supported on this platform.'; #end } @@ -482,34 +598,42 @@ class FileUtil public static function writeBytesToPath(path:String, data:Bytes, mode:FileWriteMode = Skip):Void { #if sys + if (directoryExists(path)) + { + throw 'Target path is a directory, not a file: "$path"'; + } + createDirIfNotExists(Path.directory(path)); + + var shouldWrite:Bool = true; switch (mode) { case Force: - sys.io.File.saveBytes(path, data); + shouldWrite = true; case Skip: - if (!doesFileExist(path)) + if (!pathExists(path)) { - sys.io.File.saveBytes(path, data); - } - else - { - // Do nothing. - // throw 'File already exists: $path'; + shouldWrite = true; } case Ask: - if (doesFileExist(path)) + if (pathExists(path)) { // TODO: We don't have the technology to use native popups yet. - throw 'File already exists: $path'; + throw 'Entry at path already exists: "$path"'; } else { - sys.io.File.saveBytes(path, data); + shouldWrite = true; } } + + if (shouldWrite) + { + createDirIfNotExists(Path.directory(path)); + sys.io.File.saveBytes(path, data); + } #else - throw 'Direct file writing by path not supported on this platform.'; + throw 'Direct file writing by path is not supported on this platform.'; #end } @@ -523,9 +647,141 @@ class FileUtil public static function appendStringToPath(path:String, data:String):Void { #if sys - sys.io.File.append(path, false).writeString(data); + if (!pathExists(path)) + { + writeStringToPath(path, data, Force); + return; + } + else if (directoryExists(path)) + { + throw 'Target path is a directory, not a file: "$path"'; + } + + var output:Null = null; + try + { + output = sys.io.File.append(path, false); + output.writeString(data); + output.close(); + } + catch (e:Dynamic) + { + if (output != null) + { + output.close(); + } + + throw 'Failed to append to file: "$path"'; + } #else - throw 'Direct file writing by path not supported on this platform.'; + throw 'Direct file writing by path is not supported on this platform.'; + #end + } + + /** + * Moves a file from one location to another. + * Only works on desktop. + * + * @param path The path to the file. + * @param destination The path to move the file to. + */ + public static function moveFile(path:String, destination:String):Void + { + #if sys + if (Path.extension(destination) != '') + { + destination = Path.directory(destination); + } + + sys.FileSystem.rename(path, Path.join([destination, Path.withoutDirectory(path)])); + #else + throw 'File moving is not supported on this platform.'; + #end + } + + /** + * Delete a file at the given path. + * Only works on desktop. + * + * @param path The path to the file. + */ + public static function deleteFile(path:String):Void + { + #if sys + sys.FileSystem.deleteFile(path); + #else + throw 'File deletion is not supported on this platform.'; + #end + } + + /** + * Get a file's size in bytes. Max representable size is ~2.147 GB. + * Only works on desktop. + * + * @param path The path to the file. + * @return The size of the file in bytes. + */ + public static function getFileSize(path:String):Int + { + #if sys + return sys.FileSystem.stat(path).size; + #else + throw 'File size calculation is not supported on this platform.'; + #end + } + + /** + * Check if a path exists on the filesystem. + * Only works on desktop. + * + * @param path The path to the potential file or directory. + * @return Whether the path exists. + */ + public static function pathExists(path:String):Bool + { + #if sys + return sys.FileSystem.exists(path); + #else + return false; + #end + } + + /** + * Check if a path is a file on the filesystem. + * Only works on desktop. + * + * @param path The path to the potential file. + * @return Whether the path exists and is a file. + */ + public static function fileExists(path:String):Bool + { + #if sys + return pathExists(path) && !directoryExists(path); + #else + throw 'Filesystem check is not supported on this platform.'; + #end + } + + /** + * Check if a path is a directory on the filesystem. + * Only works on desktop. + * + * @param path The path to the potential directory. + * @return Whether the path exists and is a directory. + */ + public static function directoryExists(path:String):Bool + { + #if sys + try + { + return sys.FileSystem.isDirectory(path); + } + catch (e:Dynamic) + { + return false; + } + #else + throw 'Filesystem check is not supported on this platform.'; #end } @@ -538,14 +794,182 @@ class FileUtil public static function createDirIfNotExists(dir:String):Void { #if sys - if (!doesFileExist(dir)) + if (!directoryExists(dir)) { sys.FileSystem.createDirectory(dir); } + #else + throw 'Directory creation is not supported on this platform.'; #end } - static var tempDir:String = null; + /** + * List all entries in a directory. + * Only works on desktop. + * + * @param path The path to the directory. + * @return An array of entries in the directory. + */ + public static function readDir(path:String):Array + { + #if sys + return sys.FileSystem.readDirectory(path); + #else + throw 'Directory reading is not supported on this platform.'; + #end + } + + /** + * Move a directory from one location to another, optionally ignoring some paths. + * Only works on desktop. + * + * @param path The path to the directory. + * @param destination The path to move the directory to. + * @param ignore A list of paths to ignore. + * @param strict Fails if the destination directory is not empty. + */ + public static function moveDir(path:String, destination:String, ?ignore:Array, strict:Bool = true):Void + { + #if sys + if (!directoryExists(path)) + { + throw 'Path is not a directory: "$path"'; + } + + createDirIfNotExists(destination); + if (strict) + { + // Ensure the destination is empty if strict mode is enabled. + var entries:Array = readDir(destination); + if (entries.length > 0) + { + throw 'Destination directory "$destination" is not empty.'; + } + } + + var stack:Array = [path]; + while (stack.length > 0) + { + var currentPath:Null = stack.pop(); + if (currentPath == null) continue; + + var entries:Array = readDir(currentPath); + for (entry in entries) + { + var entryPath:String = Path.join([currentPath, entry]); + if (ignore != null && ignore.contains(entryPath)) continue; + if (directoryExists(entryPath)) + { + stack.push(entryPath); + } + else + { + moveFile(entryPath, Path.join([destination, entry])); + } + } + } + + if (readDir(path)?.length == 0) + { + deleteDir(path); + } + #else + throw 'Directory moving is not supported on this platform.'; + #end + } + + /** + * Delete a directory, optionally including its contents, and optionally ignoring some paths. + * Only works on desktop. + * + * @param path The path to the directory. + * @param recursive Whether to delete all contents of the directory. + * @param ignore A list of paths to ignore. + */ + public static function deleteDir(path:String, recursive:Bool = false, ?ignore:Array):Void + { + #if sys + if (!directoryExists(path)) + { + throw 'Path is not a valid directory: "$path"'; + } + + if (recursive) + { + var stack:Array = [path]; + while (stack.length > 0) + { + var currentPath:Null = stack.pop(); + if (currentPath == null) continue; + + var entries:Array = readDir(currentPath); + for (entry in entries) + { + var entryPath:String = Path.join([currentPath, entry]); + if (ignore != null && ignore.contains(entryPath)) continue; + if (directoryExists(entryPath)) + { + stack.push(entryPath); + } + else + { + deleteFile(entryPath); + } + } + } + } + else + { + sys.FileSystem.deleteDirectory(path); + } + #else + throw 'Directory deletion is not supported on this platform.'; + #end + } + + /** + * Get a directory's total size in bytes. Max representable size is ~2.147 GB. + * Only works on desktop. + * + * @param path The path to the directory. + * @return The total size of the directory in bytes. + */ + public static function getDirSize(path:String):Int + { + #if sys + if (!directoryExists(path)) + { + throw 'Path is not a valid directory path: $path'; + } + + var stack:Array = [path]; + var total:Int = 0; + while (stack.length > 0) + { + var currentPath:Null = stack.pop(); + if (currentPath == null) continue; + + for (entry in readDir(currentPath)) + { + var entryPath:String = Path.join([currentPath, entry]); + if (directoryExists(entryPath)) + { + stack.push(entryPath); + } + else + { + total += getFileSize(entryPath); + } + } + } + + return total; + #else + throw 'Directory size calculation not supported on this platform.'; + #end + } + + static var tempDir:Null = null; static final TEMP_ENV_VARS:Array = ['TEMP', 'TMPDIR', 'TEMPDIR', 'TMP']; /** @@ -554,19 +978,19 @@ class FileUtil * * @return The path to the temporary directory. */ - public static function getTempDir():String + public static function getTempDir():Null { if (tempDir != null) return tempDir; #if sys #if windows - var path:String = null; + var path:Null = null; for (envName in TEMP_ENV_VARS) { path = Sys.getEnv(envName); if (path == '') path = null; if (path != null) break; } - tempDir = Path.join([path, 'funkin/']); + tempDir = Path.join([path ?? '', 'funkin/']); return tempDir; #else tempDir = '/tmp/funkin/'; @@ -577,6 +1001,51 @@ class FileUtil #end } + /** + * Rename a file or directory. + * Only works on desktop. + * + * @param path The path to the file or directory. + * @param newName The new name of the file or directory. + * @param keepExtension Whether to keep the extension the same, if applicable. + */ + public static function rename(path:String, newName:String, keepExtension:Bool = true):Void + { + #if sys + if (!pathExists(path)) + { + throw 'Path does not exist: "$path"'; + } + + final isDirectory:Bool = directoryExists(path); + newName = Path.withoutDirectory(newName); + if (isDirectory) + { + newName = Path.withoutExtension(newName); + } + else if (keepExtension) + { + newName = Path.withExtension(newName, Path.extension(path)); + } + + newName = Path.join([Path.directory(path), newName]); + if (newName == path) + { + return; + } + + if (pathExists(newName)) + { + // Prevent overwriting something. + throw 'Destination path already exists: "$newName"'; + } + + sys.FileSystem.rename(path, newName); + #else + throw 'File renaming by path is not supported on this platform.'; + #end + } + /** * Create a Bytes object containing a ZIP file, containing the provided entries. * @@ -593,29 +1062,30 @@ class FileUtil public static function readZIPFromBytes(input:Bytes):Array { - trace('TEST: ' + input.length); - trace(input.sub(0, 30).toHex()); var bytesInput = new haxe.io.BytesInput(input); var zippedEntries = haxe.zip.Reader.readZip(bytesInput); - var results:Array = []; + var results:Array = new Array(); for (entry in zippedEntries) { if (entry.compressed) { entry.data = haxe.zip.Reader.unzip(entry); } + results.push(entry); } + return results; } public static function mapZIPEntriesByName(input:Array):Map { - var results:Map = []; + var results:Map = new Map(); for (entry in input) { results.set(entry.fileName, entry); } + return results; } @@ -653,7 +1123,12 @@ class FileUtil }; } - public static function openFolder(pathFolder:String) + /** + * Open a folder in the file explorer. + * + * @param pathFolder The path to the folder. + */ + public static function openFolder(pathFolder:String):Void { #if windows Sys.command('explorer', [pathFolder]); @@ -664,28 +1139,334 @@ class FileUtil // FileUtil.hx note: this was originally used to open the logs specifically! // thats why the above comment is there! Sys.command('open', [pathFolder]); - #end - + #elseif linux // TODO: implement linux // some shit with xdg-open :thinking: emoji... + #else + throw 'External folder open is not supported on this platform.'); + #end } - static function convertTypeFilter(typeFilter:Array):String + private static function convertTypeFilter(?typeFilter:Array):Null { - var filter:String = null; + var filter:Null = null; if (typeFilter != null) { - var filters:Array = []; + var filters:Array = new Array(); for (type in typeFilter) { - filters.push(StringTools.replace(StringTools.replace(type.extension, '*.', ''), ';', ',')); + filters.push(type.extension.replace('*.', '').replace(';', ',')); } + filter = filters.join(';'); } + return filter; } } +/** + * Utilities for reading and writing files on various platforms. + * Wrapper for `FileUtil` that sanitizes paths for script safety. + */ +@:nullSafety +class FileUtilSandboxed +{ + /** + * Prevent paths from exiting the root. + * + * @param path The path to sanitize. + * @return The sanitized path. + */ + public static function sanitizePath(path:String):String + { + if (path == null) + { + #if sys + return FileUtil.gameDirectory; + #else + return ''; + #end + } + + if (path.contains(':')) + { + path = path.substring(path.lastIndexOf(':') + 1); + } + + path = path.trim().replace('\\', '/'); + while (path.contains('//')) + { + path = path.replace('//', '/'); + } + + @:privateAccess for (char in FileUtil.INVALID_CHARS) + { + path = path.replace(char, ''); + } + + var parts:Array = path.split('/'); + var sanitized:Array = new Array(); + for (part in parts) + { + switch (part) + { + case '.' | '': continue; + case '..': sanitized.pop(); + default: sanitized.push(part); + } + } + + var ret:String = sanitized.join('/'); + + #if sys + var realPath:String = Path.normalize(sys.FileSystem.fullPath(Path.join([FileUtil.gameDirectory, ret]))); + // ^ TODO: figure out how to get "real" path of symlinked paths + + if (!realPath.startsWith(FileUtil.gameDirectory.toString())) + { + return FileUtil.gameDirectory; + } + + ret = realPath; + #end + + return ret; + } + + /** + * Check against protected paths. + * @param path The path to check. + * @return Whether the path is protected. + */ + public static function isProtected(path:String):Bool + { + path = sanitizePath(path); + @:privateAccess for (protected in FileUtil.PROTECTED_PATHS) + { + if (path == protected || (protected.contains('*') && path.startsWith(protected.substring(0, protected.indexOf('*'))))) + { + return true; + } + } + + return false; + } + + public static final FILE_FILTER_FNFC:FileFilter = FileUtil.FILE_FILTER_FNFC; + public static final FILE_FILTER_JSON:FileFilter = FileUtil.FILE_FILTER_JSON; + public static final FILE_FILTER_ZIP:FileFilter = FileUtil.FILE_FILTER_ZIP; + public static final FILE_FILTER_PNG:FileFilter = FileUtil.FILE_FILTER_PNG; + + public static final FILE_EXTENSION_INFO_FNFC:FileDialogExtensionInfo = FileUtil.FILE_EXTENSION_INFO_FNFC; + public static final FILE_EXTENSION_INFO_ZIP:FileDialogExtensionInfo = FileUtil.FILE_EXTENSION_INFO_ZIP; + public static final FILE_EXTENSION_INFO_PNG:FileDialogExtensionInfo = FileUtil.FILE_EXTENSION_INFO_PNG; + + public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, + ?onCancel:()->Void) + { + FileUtil.browseForBinaryFile(dialogTitle, typeFilter, onSelect, onCancel); + } + + public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, + ?onCancel:()->Void):Void + { + FileUtil.browseForTextFile(dialogTitle, typeFilter, onSelect, onCancel); + } + + public static function browseForDirectory(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + ?dialogTitle:String):Bool + { + return FileUtil.browseForDirectory(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); + } + + public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + ?dialogTitle:String):Bool + { + return FileUtil.browseForMultipleFiles(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); + } + + public static function browseForSaveFile(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + ?dialogTitle:String):Bool + { + return FileUtil.browseForSaveFile(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); + } + + public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String)->Void, ?onCancel:()->Void, ?defaultFileName:String, + ?dialogTitle:String):Bool + { + return FileUtil.saveFile(data, typeFilter, onSave, onCancel, defaultFileName, dialogTitle); + } + + public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + force:Bool = false):Bool + { + return FileUtil.saveMultipleFiles(resources, onSaveAll, onCancel, defaultPath, force); + } + + public static function saveFilesAsZIP(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool + { + return FileUtil.saveFilesAsZIP(resources, onSave, onCancel, defaultPath, force); + } + + public static function saveChartAsFNFC(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + force:Bool = false):Bool + { + return FileUtil.saveChartAsFNFC(resources, onSave, onCancel, defaultPath, force); + } + + public static function saveFilesAsZIPToPath(resources:Array, path:String, mode:FileWriteMode = Skip):Bool + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot write to protected path: $path'; + return FileUtil.saveFilesAsZIPToPath(resources, path, mode); + } + + public static function readStringFromPath(path:String):String + { + return FileUtil.readStringFromPath(sanitizePath(path)); + } + + public static function readBytesFromPath(path:String):Bytes + { + return FileUtil.readBytesFromPath(sanitizePath(path)); + } + + public static function browseFileReference(callback:(FileReference)->Void):Void + { + FileUtil.browseFileReference(callback); + } + + public static function writeFileReference(path:String, data:String):Void + { + FileUtil.writeFileReference(path, data); + } + + public static function readJSONFromPath(path:String):Dynamic + { + return FileUtil.readJSONFromPath(sanitizePath(path)); + } + + public static function writeStringToPath(path:String, data:String, mode:FileWriteMode = Skip):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot write to protected path: $path'; + FileUtil.writeStringToPath(path, data, mode); + } + + public static function writeBytesToPath(path:String, data:Bytes, mode:FileWriteMode = Skip):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot write to protected path: $path'; + FileUtil.writeBytesToPath(path, data, mode); + } + + public static function appendStringToPath(path:String, data:String):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot write to protected path: $path'; + FileUtil.appendStringToPath(path, data); + } + + public static function moveFile(path:String, destination:String):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot move protected path: $path'; + if (isProtected(destination = sanitizePath(destination))) throw 'Cannot move to protected path: $destination'; + FileUtil.moveFile(path, destination); + } + + public static function deleteFile(path:String):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot delete protected path: $path'; + FileUtil.deleteFile(path); + } + + public static function getFileSize(path:String):Int + { + return FileUtil.getFileSize(sanitizePath(path)); + } + + public static function pathExists(path:String):Bool + { + return FileUtil.pathExists(sanitizePath(path)); + } + + public static function fileExists(path:String):Bool + { + return FileUtil.fileExists(sanitizePath(path)); + } + + public static function directoryExists(path:String):Bool + { + return FileUtil.directoryExists(sanitizePath(path)); + } + + public static function createDirIfNotExists(dir:String):Void + { + FileUtil.createDirIfNotExists(sanitizePath(dir)); + } + + public static function readDir(path:String):Array + { + return FileUtil.readDir(sanitizePath(path)); + } + + public static function moveDir(path:String, destination:String, ?ignore:Array, strict:Bool = true):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot move protected path: "$path"'; + if (isProtected(destination = sanitizePath(destination))) throw 'Cannot move to protected path: "$destination"'; + FileUtil.moveDir(path, destination, ignore, strict); + } + + public static function deleteDir(path:String, recursive:Bool = false, ?ignore:Array):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot delete protected path: "$path"'; + FileUtil.deleteDir(path, recursive, ignore); + } + + public static function getDirSize(path:String):Int + { + return FileUtil.getDirSize(sanitizePath(path)); + } + + public static function getTempDir():Null + { + return FileUtil.getTempDir(); + } + + public static function rename(path:String, newName:String, keepExtension:Bool = true):Void + { + if (isProtected(path = sanitizePath(path))) throw 'Cannot rename protected path: "$path"'; + FileUtil.rename(path, sanitizePath(newName), keepExtension); + } + + public static function createZIPFromEntries(entries:Array):Bytes + { + return FileUtil.createZIPFromEntries(entries); + } + + public static function readZIPFromBytes(input:Bytes):Array + { + return FileUtil.readZIPFromBytes(input); + } + + public static function mapZIPEntriesByName(input:Array):Map + { + return FileUtil.mapZIPEntriesByName(input); + } + + public static function makeZIPEntry(name:String, content:String):Entry + { + return FileUtil.makeZIPEntry(name, content); + } + + public static function makeZIPEntryFromBytes(name:String, data:haxe.io.Bytes):Entry + { + return FileUtil.makeZIPEntryFromBytes(name, data); + } + + public static function openFolder(pathFolder:String) + { + FileUtil.openFolder(pathFolder); + } +} + enum FileWriteMode { /** From e572c7c2fbccbcb42bc2f9be1d8a5e77a558a4c2 Mon Sep 17 00:00:00 2001 From: Super <38338700+superpowers04@users.noreply.github.com> Date: Tue, 15 Apr 2025 15:27:28 -0400 Subject: [PATCH 61/81] Remove FlxG.fixedTimeStep from PlayState It's in TitleState now --- source/funkin/play/PlayState.hx | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/funkin/play/PlayState.hx b/source/funkin/play/PlayState.hx index e0d47ebc6..642d3ced9 100644 --- a/source/funkin/play/PlayState.hx +++ b/source/funkin/play/PlayState.hx @@ -656,9 +656,6 @@ class PlayState extends MusicBeatSubState cameraFollowPoint = new FlxObject(0, 0); } - // Reduce physics accuracy (who cares!!!) to improve animation quality. - FlxG.fixedTimestep = false; - // This state receives update() even when a substate is active. this.persistentUpdate = true; // This state receives draw calls even when a substate is active. From 83c367e23b751e15beef5bb518945a83fdef0d83 Mon Sep 17 00:00:00 2001 From: Kolo <67389779+JustKolosaki@users.noreply.github.com> Date: Mon, 14 Apr 2025 19:51:18 +0200 Subject: [PATCH 62/81] another bugfix yeah i hate dropdowns i hate dropdowns i hate dropdowns --- .../charting/toolboxes/ChartEditorEventDataToolbox.hx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx index d556a0d30..1bdfc2272 100644 --- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx +++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx @@ -55,6 +55,7 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox } var eventType:String = event.data.id; + var sameEvent:Bool = (eventType == chartEditorState.eventKindToPlace); trace('ChartEditorEventDataToolbox - Event type changed: $eventType'); @@ -69,7 +70,7 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox return; } - chartEditorState.eventDataToPlace = {}; + if (!sameEvent) chartEditorState.eventDataToPlace = {}; buildEventDataFormFromSchema(toolboxEventsDataGrid, schema, chartEditorState.eventKindToPlace); if (!_initializing && chartEditorState.currentEventSelection.length > 0) @@ -85,9 +86,13 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox chartEditorState.notePreviewDirty = true; } } + toolboxEventsEventKind.pauseEvent(UIEvent.CHANGE, true); + var startingEventValue = ChartEditorDropdowns.populateDropdownWithSongEvents(toolboxEventsEventKind, chartEditorState.eventKindToPlace); trace('ChartEditorEventDataToolbox - Starting event kind: ${startingEventValue}'); toolboxEventsEventKind.value = startingEventValue; + + toolboxEventsEventKind.resumeEvent(UIEvent.CHANGE, true, true); } public override function refresh():Void @@ -262,7 +267,8 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox var value = event.target.value; if (field.type == ENUM) { - value = event.target.value?.value; + var drp:DropDown = cast event.target; + value = drp.selectedItem?.value ?? field.defaultValue; } else if (field.type == BOOL) { From 83bb3bb5074ecb5f50ee21979711efcda9d8017d Mon Sep 17 00:00:00 2001 From: Hyper_ <40342021+NotHyper-474@users.noreply.github.com> Date: Mon, 7 Apr 2025 21:07:46 -0300 Subject: [PATCH 63/81] feat: Show current beat and step next to song position --- source/funkin/ui/debug/charting/ChartEditorState.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index 7a4bfa87f..43204281e 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -5117,6 +5117,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState var songPosMinutes:String = Std.string(Math.floor((Math.abs(songPos) / 1000) / 60)).lpad('0', 2); if (songPos < 0) songPosMinutes = '-' + songPosMinutes; var songPosString:String = '${songPosMinutes}:${songPosSeconds}.${songPosMilliseconds}'; + songPosString += ' | Beat: ${Conductor.instance.currentBeat} | Step: ${Conductor.instance.currentStep}'; if (playbarSongPos.value != songPosString) playbarSongPos.value = songPosString; From 85915eae8c63bb8a337ffc3eee990eb04b421b92 Mon Sep 17 00:00:00 2001 From: Hyper_ <40342021+NotHyper-474@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:58:35 -0300 Subject: [PATCH 64/81] Implement suggestion: Fractional beat display --- source/funkin/ui/debug/charting/ChartEditorState.hx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index 43204281e..421097b20 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -5117,7 +5117,11 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState var songPosMinutes:String = Std.string(Math.floor((Math.abs(songPos) / 1000) / 60)).lpad('0', 2); if (songPos < 0) songPosMinutes = '-' + songPosMinutes; var songPosString:String = '${songPosMinutes}:${songPosSeconds}.${songPosMilliseconds}'; - songPosString += ' | Beat: ${Conductor.instance.currentBeat} | Step: ${Conductor.instance.currentStep}'; + + var roundedBeat = FlxMath.roundDecimal(Conductor.instance.currentBeatTime, 2); + var parts:Array = Std.string(roundedBeat).split('.'); + if (parts.length == 1) parts.push('00'); + songPosString += ' | Beat: ${parts.join('.')} | Step: ${Conductor.instance.currentStep}'; if (playbarSongPos.value != songPosString) playbarSongPos.value = songPosString; From f20b938f3f87a8921b0e17b73fee25e552798091 Mon Sep 17 00:00:00 2001 From: Hyper_ <40342021+NotHyper-474@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:02:03 -0300 Subject: [PATCH 65/81] fix: Pad number with 1 decimal place with zero Merge pull request #1000 from FunkinCrew/hyper/chart-editor-display-beat [PUBLIC PR] Display current beat and step in the Chart Editor --- source/funkin/ui/debug/charting/ChartEditorState.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index 421097b20..d05171f91 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -5121,6 +5121,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState var roundedBeat = FlxMath.roundDecimal(Conductor.instance.currentBeatTime, 2); var parts:Array = Std.string(roundedBeat).split('.'); if (parts.length == 1) parts.push('00'); + else if (parts[1].length < 2) parts[1] += '0'; songPosString += ' | Beat: ${parts.join('.')} | Step: ${Conductor.instance.currentStep}'; if (playbarSongPos.value != songPosString) playbarSongPos.value = songPosString; From b3f17983204665782c7fe981be91ecfad88b3a5c Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Mon, 21 Apr 2025 21:06:28 -0400 Subject: [PATCH 66/81] assets submod (tankman deathlines for bf) --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index a09b58b7f..80e2d717f 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit a09b58b7f9c9bb8faf69608be6f764ce82cd0ecc +Subproject commit 80e2d717f2b167b4d740e1a3f2eb576b55df0edd From 53dec057bee0a913d60e0c70d45dbb59a58620b0 Mon Sep 17 00:00:00 2001 From: nebulazorua <12458328+nebulazorua@users.noreply.github.com> Date: Thu, 17 Apr 2025 08:17:35 +0800 Subject: [PATCH 67/81] vuln patch part 1 so now you cant open files as easily i think oops --- source/funkin/util/FileUtil.hx | 135 ++++++++++++------------------- source/funkin/util/WindowUtil.hx | 6 ++ 2 files changed, 59 insertions(+), 82 deletions(-) diff --git a/source/funkin/util/FileUtil.hx b/source/funkin/util/FileUtil.hx index f1dcbb0a6..a5eda796b 100644 --- a/source/funkin/util/FileUtil.hx +++ b/source/funkin/util/FileUtil.hx @@ -50,20 +50,10 @@ class FileUtil }; /** - * Paths which should not be deleted or modified by scripts. + * Paths which should not be deleted or modified by scripts. */ private static final PROTECTED_PATHS:Array = [ - '', - 'assets', - 'manifest', - 'manifest/*', - 'plugins', - 'plugins/*', - 'Funkin.exe', - 'Funkin', - 'libvlc.dll', - 'libvlccore.dll', - 'lime.ndll' + '', 'assets', 'manifest', 'manifest/*', 'plugins', 'plugins/*', 'Funkin.exe', 'Funkin', 'libvlc.dll', 'libvlccore.dll', 'lime.ndll' ]; /** @@ -95,8 +85,8 @@ class FileUtil * @param onSelect A callback that provides a `SelectedFileInfo` object when a file is selected. * @param onCancel A callback that is called when the user closes the dialog without selecting a file. */ - public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, - ?onCancel:()->Void) + public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo) -> Void, + ?onCancel:() -> Void) { var onComplete = function(button, selectedFiles) { if (button == DialogButton.OK && selectedFiles.length > 0) @@ -128,8 +118,8 @@ class FileUtil * @param onSelect A callback that provides a `SelectedFileInfo` object when a file is selected. * @param onCancel A callback that is called when the user closes the dialog without selecting a file. */ - public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, - ?onCancel:()->Void):Void + public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo) -> Void, + ?onCancel:() -> Void):Void { var onComplete = function(button, selectedFiles) { if (button == DialogButton.OK && selectedFiles.length > 0) @@ -159,7 +149,7 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function browseForDirectory(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForDirectory(?typeFilter:Array, onSelect:(String) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop @@ -192,7 +182,7 @@ class FileUtil * * @return Whether the file dialog was opened successfully. */ - public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop @@ -226,7 +216,7 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function browseForSaveFile(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForSaveFile(?typeFilter:Array, onSelect:(String) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { #if desktop @@ -259,7 +249,7 @@ class FileUtil * * @return Whether the file dialog was opened successfully. */ - public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String)->Void, ?onCancel:()->Void, ?defaultFileName:String, + public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String) -> Void, ?onCancel:() -> Void, ?defaultFileName:String, ?dialogTitle:String):Bool { #if desktop @@ -314,34 +304,34 @@ class FileUtil * @param typeFilter TODO What does this do? * @return Whether the file dialog was opened successfully. */ - public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, force:Bool = false):Bool { #if desktop // Prompt the user for a directory, then write all of the files to there. - var onSelectDir:(String)->Void = function(targetPath:String):Void { + var onSelectDir:(String) -> Void = function(targetPath:String):Void { var paths:Array = new Array(); for (resource in resources) { /* - var filePath:String = Path.join([targetPath, resource.fileName]); - try - { - if (resource.data == null) + var filePath:String = Path.join([targetPath, resource.fileName]); + try { - trace('WARNING: File $filePath has no data or content. Skipping.'); - continue; + if (resource.data == null) + { + trace('WARNING: File $filePath has no data or content. Skipping.'); + continue; + } + else + { + writeBytesToPath(filePath, resource.data, force ? Force : Skip); + } } - else + catch (e:Dynamic) { - writeBytesToPath(filePath, resource.data, force ? Force : Skip); + throw 'Failed to write file (probably already exists): $filePath'; } - } - catch (e:Dynamic) - { - throw 'Failed to write file (probably already exists): $filePath'; - } - */ + */ if (resource.data == null) { trace('WARNING: File ${resource.fileName} has no data or content. Skipping.'); @@ -350,7 +340,6 @@ class FileUtil var filePath:String = Path.join([targetPath, resource.fileName]); - paths.push(filePath); } @@ -388,11 +377,12 @@ class FileUtil /** * Takes an array of file entries and prompts the user to save them as a ZIP file. */ - public static function saveFilesAsZIP(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool + public static function saveFilesAsZIP(resources:Array, ?onSave:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, + force:Bool = false):Bool { // Create a ZIP file. var zipBytes:Bytes = createZIPFromEntries(resources); - var onSave:(String)->Void = function(path:String) { + var onSave:(String) -> Void = function(path:String) { trace('Saved ${resources.length} files to ZIP at "$path"'); if (onSave != null) @@ -409,12 +399,12 @@ class FileUtil /** * Takes an array of file entries and prompts the user to save them as a FNFC file. */ - public static function saveChartAsFNFC(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function saveChartAsFNFC(resources:Array, ?onSave:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, force:Bool = false):Bool { // Create a ZIP file. var zipBytes:Bytes = createZIPFromEntries(resources); - var onSave:(String)->Void = function(path:String) { + var onSave:(String) -> Void = function(path:String) { trace('Saved FNFC file to "$path"'); if (onSave != null) @@ -478,15 +468,13 @@ class FileUtil #end } - - /** * Browse for a file to read and execute a callback once we have a file reference. * Works great on HTML5 or desktop. * * @param callback The function to call when the file is loaded. */ - public static function browseFileReference(callback:(FileReference)->Void):Void + public static function browseFileReference(callback:(FileReference) -> Void):Void { var file = new FileReference(); file.addEventListener(Event.SELECT, function(e) { @@ -1123,29 +1111,8 @@ class FileUtil }; } - /** - * Open a folder in the file explorer. - * - * @param pathFolder The path to the folder. - */ - public static function openFolder(pathFolder:String):Void - { - #if windows - Sys.command('explorer', [pathFolder]); - #elseif mac - // mac could be fuckie with where the log folder is relative to the game file... - // if this comment is still here... it means it has NOT been verified on mac yet! - // - // FileUtil.hx note: this was originally used to open the logs specifically! - // thats why the above comment is there! - Sys.command('open', [pathFolder]); - #elseif linux - // TODO: implement linux - // some shit with xdg-open :thinking: emoji... - #else - throw 'External folder open is not supported on this platform.'); - #end - } + public static function openFolder(pathFolder:String) // what is this for?? + WindowUtil.openFolder(pathFolder); private static function convertTypeFilter(?typeFilter:Array):Null { @@ -1211,9 +1178,12 @@ class FileUtilSandboxed { switch (part) { - case '.' | '': continue; - case '..': sanitized.pop(); - default: sanitized.push(part); + case '.' | '': + continue; + case '..': + sanitized.pop(); + default: + sanitized.push(part); } } @@ -1262,54 +1232,55 @@ class FileUtilSandboxed public static final FILE_EXTENSION_INFO_ZIP:FileDialogExtensionInfo = FileUtil.FILE_EXTENSION_INFO_ZIP; public static final FILE_EXTENSION_INFO_PNG:FileDialogExtensionInfo = FileUtil.FILE_EXTENSION_INFO_PNG; - public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, - ?onCancel:()->Void) + public static function browseForBinaryFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo) -> Void, + ?onCancel:() -> Void) { FileUtil.browseForBinaryFile(dialogTitle, typeFilter, onSelect, onCancel); } - public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo)->Void, - ?onCancel:()->Void):Void + public static function browseForTextFile(dialogTitle:String, ?typeFilter:Array, onSelect:(SelectedFileInfo) -> Void, + ?onCancel:() -> Void):Void { FileUtil.browseForTextFile(dialogTitle, typeFilter, onSelect, onCancel); } - public static function browseForDirectory(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForDirectory(?typeFilter:Array, onSelect:(String) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { return FileUtil.browseForDirectory(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); } - public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForMultipleFiles(?typeFilter:Array, onSelect:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { return FileUtil.browseForMultipleFiles(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); } - public static function browseForSaveFile(?typeFilter:Array, onSelect:(String)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function browseForSaveFile(?typeFilter:Array, onSelect:(String) -> Void, ?onCancel:() -> Void, ?defaultPath:String, ?dialogTitle:String):Bool { return FileUtil.browseForSaveFile(typeFilter, onSelect, onCancel, defaultPath, dialogTitle); } - public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String)->Void, ?onCancel:()->Void, ?defaultFileName:String, + public static function saveFile(data:Bytes, ?typeFilter:Array, ?onSave:(String) -> Void, ?onCancel:() -> Void, ?defaultFileName:String, ?dialogTitle:String):Bool { return FileUtil.saveFile(data, typeFilter, onSave, onCancel, defaultFileName, dialogTitle); } - public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function saveMultipleFiles(resources:Array, ?onSaveAll:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, force:Bool = false):Bool { return FileUtil.saveMultipleFiles(resources, onSaveAll, onCancel, defaultPath, force); } - public static function saveFilesAsZIP(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, force:Bool = false):Bool + public static function saveFilesAsZIP(resources:Array, ?onSave:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, + force:Bool = false):Bool { return FileUtil.saveFilesAsZIP(resources, onSave, onCancel, defaultPath, force); } - public static function saveChartAsFNFC(resources:Array, ?onSave:(Array)->Void, ?onCancel:()->Void, ?defaultPath:String, + public static function saveChartAsFNFC(resources:Array, ?onSave:(Array) -> Void, ?onCancel:() -> Void, ?defaultPath:String, force:Bool = false):Bool { return FileUtil.saveChartAsFNFC(resources, onSave, onCancel, defaultPath, force); @@ -1331,7 +1302,7 @@ class FileUtilSandboxed return FileUtil.readBytesFromPath(sanitizePath(path)); } - public static function browseFileReference(callback:(FileReference)->Void):Void + public static function browseFileReference(callback:(FileReference) -> Void):Void { FileUtil.browseFileReference(callback); } diff --git a/source/funkin/util/WindowUtil.hx b/source/funkin/util/WindowUtil.hx index fc590444c..665512e5b 100644 --- a/source/funkin/util/WindowUtil.hx +++ b/source/funkin/util/WindowUtil.hx @@ -22,6 +22,11 @@ class WindowUtil */ public static function openURL(targetUrl:String):Void { + // Ensure you can't open protocols such as steam://, file://, etc + var protocol:Array = targetUrl.split("://"); + if (protocol.length == 1) targetUrl = 'https://${targetUrl}'; + else if (protocol[0] != 'http' && protocol[0] != 'https') throw "openURL can only open http and https links."; + #if FEATURE_OPEN_URL #if linux Sys.command('/usr/bin/xdg-open $targetUrl &'); @@ -64,6 +69,7 @@ class WindowUtil */ public static function openFolder(targetPath:String):Void { + if (!sys.FileSystem.exists(targetPath) || !sys.FileSystem.isDirectory(targetPath)) throw 'openFolder should only be used to open existing folders.'; #if FEATURE_OPEN_URL #if windows Sys.command('explorer', [targetPath.replace('/', '\\')]); From e290e0c7027ab60b707a7d3ecb65a4c74f7b24c9 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Mon, 21 Apr 2025 22:38:50 -0400 Subject: [PATCH 68/81] Make merch referrals error-proof (they don't work if the API is disabled whoops!) --- .../funkin/api/newgrounds/NewgroundsClient.hx | 3 + source/funkin/api/newgrounds/Referral.hx | 55 +++++++++++++++++++ source/funkin/ui/mainmenu/MainMenuState.hx | 16 ++---- 3 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 source/funkin/api/newgrounds/Referral.hx diff --git a/source/funkin/api/newgrounds/NewgroundsClient.hx b/source/funkin/api/newgrounds/NewgroundsClient.hx index 2dff97f80..36ab563ab 100644 --- a/source/funkin/api/newgrounds/NewgroundsClient.hx +++ b/source/funkin/api/newgrounds/NewgroundsClient.hx @@ -149,6 +149,9 @@ class NewgroundsClient Save.instance.ngSessionId = null; } + /** + * @return `true` if the user is logged in to Newgrounds. + */ public function isLoggedIn():Bool { #if FEATURE_NEWGROUNDS diff --git a/source/funkin/api/newgrounds/Referral.hx b/source/funkin/api/newgrounds/Referral.hx new file mode 100644 index 000000000..7fa38a518 --- /dev/null +++ b/source/funkin/api/newgrounds/Referral.hx @@ -0,0 +1,55 @@ +package funkin.api.newgrounds; + +#if FEATURE_NEWGROUNDS +import io.newgrounds.NG; +#end +import funkin.api.newgrounds.NewgroundsClient; +import funkin.util.WindowUtil; + +/** + * Handles referrals to links retrieved from the Newgrounds API. + */ +class Referral +{ + /** + * Opens the referral page with the given name. + * @param referralName The name of the referral. + * @param fallbackUrl The URL to open if the referral fails or is not available. + */ + static function doReferral(referralName:String, fallbackUrl:String):Void + { + #if FEATURE_NEWGROUNDS + if (NewgroundsClient.instance.isLoggedIn()) + { + NG.core?.calls.loader.loadReferral(false) + .addComponentParameter("referral_name", referralName) + .addResponseHandler(response -> { + trace(response); + if (response.success) + { + WindowUtil.openURL(response.result.data.url); + } + else + { + WindowUtil.openURL(fallbackUrl); + } + }) + .send(); + } + else + { + WindowUtil.openURL(fallbackUrl); + } + #else + WindowUtil.openURL(fallbackUrl); + #end + } + + /** + * Opens the merch referral page. + */ + public static function doMerchReferral():Void + { + doReferral("merch_link", Constants.URL_MERCH_FALLBACK); + } +} diff --git a/source/funkin/ui/mainmenu/MainMenuState.hx b/source/funkin/ui/mainmenu/MainMenuState.hx index 74093fd42..7c93bb9ea 100644 --- a/source/funkin/ui/mainmenu/MainMenuState.hx +++ b/source/funkin/ui/mainmenu/MainMenuState.hx @@ -21,11 +21,12 @@ import funkin.ui.title.TitleState; import funkin.ui.story.StoryMenuState; import funkin.ui.Prompt; import funkin.util.WindowUtil; +import funkin.api.newgrounds.Referral; #if FEATURE_DISCORD_RPC import funkin.api.discord.DiscordClient; #end #if FEATURE_NEWGROUNDS -import io.newgrounds.NG; +import funkin.api.newgrounds.NewgroundsClient; #end class MainMenuState extends MusicBeatState @@ -168,9 +169,9 @@ class MainMenuState extends MusicBeatState this.leftWatermarkText.text = Constants.VERSION; #if FEATURE_NEWGROUNDS - if (NG.core?.loggedIn) + if (NewgroundsClient.instance.isLoggedIn()) { - this.leftWatermarkText.text += ' | Newgrounds: Logged in as ${NG.core?.user?.name}'; + this.leftWatermarkText.text += ' | Newgrounds: Logged in as ${NewgroundsClient.instance.user?.name}'; } #end } @@ -233,14 +234,7 @@ class MainMenuState extends MusicBeatState function selectMerch() { - NG.core?.calls.loader.loadReferral(false) - .addComponentParameter("referral_name", "merch_link") - .addResponseHandler(response -> { - if (response.success) WindowUtil.openURL(response.result.data.url) - else - WindowUtil.openURL(Constants.URL_MERCH_FALLBACK); - }) - .send(); + Referral.doMerchReferral(); } #end From 1c4b8751b733665fa3689e83154fc1d0f36dbdfc Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 23 Apr 2025 19:52:29 -0400 Subject: [PATCH 69/81] Pico Results Screen Easter Egg (#1007) --- assets | 2 +- hmm.json | 4 ++-- source/funkin/InitState.hx | 3 +-- .../funkin/data/freeplay/player/PlayerData.hx | 6 ++++- source/funkin/play/ResultState.hx | 24 +++++++++++++++---- source/funkin/ui/debug/anim/FlxAnimateTest.hx | 4 ++-- 6 files changed, 30 insertions(+), 13 deletions(-) diff --git a/assets b/assets index 80e2d717f..2efd58c74 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 80e2d717f2b167b4d740e1a3f2eb576b55df0edd +Subproject commit 2efd58c7472e10978cdc08e329bc11c5e2ab30e9 diff --git a/hmm.json b/hmm.json index 053415481..41624948c 100644 --- a/hmm.json +++ b/hmm.json @@ -32,8 +32,8 @@ "name": "flxanimate", "type": "git", "dir": null, - "ref": "713d3de0e566d6cd54cde13711ab3e4f60f59f4b", - "url": "https://github.com/Dot-Stuff/flxanimate" + "ref": "f8842cea9883d6112a2c854cf93fa72856171428", + "url": "https://github.com/FunkinCrew/flxanimate" }, { "name": "format", diff --git a/source/funkin/InitState.hx b/source/funkin/InitState.hx index 994480abd..d374e4c9c 100644 --- a/source/funkin/InitState.hx +++ b/source/funkin/InitState.hx @@ -252,8 +252,7 @@ class InitState extends FlxState title: "Cum Song Erect by Kawai Sprite", songId: "cum", characterId: "pico", - difficultyId: "nightmare", - variationId: "erect", + difficultyId: "hard", isNewHighscore: true, scoreData: { diff --git a/source/funkin/data/freeplay/player/PlayerData.hx b/source/funkin/data/freeplay/player/PlayerData.hx index a6e962598..b6bf8e019 100644 --- a/source/funkin/data/freeplay/player/PlayerData.hx +++ b/source/funkin/data/freeplay/player/PlayerData.hx @@ -334,7 +334,11 @@ typedef PlayerResultsAnimationData = */ var renderType:String; - var assetPath:String; + @:optional + var assetPath:Null; + + @:optional + var scriptClass:Null; @:optional @:default([0, 0]) diff --git a/source/funkin/play/ResultState.hx b/source/funkin/play/ResultState.hx index 591bbef49..e29bbddee 100644 --- a/source/funkin/play/ResultState.hx +++ b/source/funkin/play/ResultState.hx @@ -31,6 +31,7 @@ import funkin.ui.freeplay.charselect.PlayableCharacter; import funkin.ui.freeplay.FreeplayState; import funkin.ui.MusicBeatSubState; import funkin.ui.story.StoryMenuState; +import funkin.modding.base.ScriptedFlxAtlasSprite; #if FEATURE_NEWGROUNDS import funkin.api.newgrounds.Medals; #end @@ -189,13 +190,27 @@ class ResultState extends MusicBeatSubState if (Preferences.naughtyness && animData.filter != "naughty" || !Preferences.naughtyness && animData.filter != "safe") continue; } - var animPath:String = Paths.stripLibrary(animData.assetPath); - var animLibrary:String = Paths.getLibrary(animData.assetPath); + var animPath:String = ""; + var animLibrary:String = ""; + + if (animData.assetPath != null) + { + animPath = Paths.stripLibrary(animData.assetPath); + animLibrary = Paths.getLibrary(animData.assetPath); + } var offsets = animData.offsets ?? [0, 0]; switch (animData.renderType) { case 'animateatlas': - var animation:FlxAtlasSprite = new FlxAtlasSprite(offsets[0], offsets[1], Paths.animateAtlas(animPath, animLibrary)); + @:nullSafety(Off) + var animation:FlxAtlasSprite = null; + + if (animData.scriptClass != null) animation = ScriptedFlxAtlasSprite.init(animData.scriptClass, offsets[0], offsets[1]); + else + animation = new FlxAtlasSprite(offsets[0], offsets[1], Paths.animateAtlas(animPath, animLibrary)); + + if (animation == null) continue; + animation.zIndex = animData.zIndex ?? 500; animation.scale.set(animData.scale ?? 1.0, animData.scale ?? 1.0); @@ -224,7 +239,6 @@ class ResultState extends MusicBeatSubState animation.onAnimationComplete.add((_name:String) -> { if (animation != null) { - trace("AHAHAH"); animation.anim.curFrame = animData.loopFrame ?? 0; animation.anim.play(); // unpauses this anim, since it's on PlayOnce! } @@ -492,7 +506,7 @@ class ResultState extends MusicBeatSubState // Only play the tick sound if the number increased. if (clearPercentLerp != clearPercentCounter.curNumber) { - trace('$clearPercentLerp and ${clearPercentCounter.curNumber}'); + // trace('$clearPercentLerp and ${clearPercentCounter.curNumber}'); clearPercentLerp = clearPercentCounter.curNumber; FunkinSound.playOnce(Paths.sound('scrollMenu')); } diff --git a/source/funkin/ui/debug/anim/FlxAnimateTest.hx b/source/funkin/ui/debug/anim/FlxAnimateTest.hx index 44917e2a5..cbf1c4339 100644 --- a/source/funkin/ui/debug/anim/FlxAnimateTest.hx +++ b/source/funkin/ui/debug/anim/FlxAnimateTest.hx @@ -22,9 +22,9 @@ class FlxAnimateTest extends MusicBeatState { super.create(); - sprite = new FlxAtlasSprite(0, 0, 'assets/images/charSelect/maskTest'); + sprite = new FlxAtlasSprite(-100, 0, 'week3:assets/week3/images/philly/erect/picoFlowers'); add(sprite); - sprite.playAnimation(null, false, false, true); + sprite.playAnimation(sprite.anim.stageInstance.symbol.name, false, false, true); } public override function update(elapsed:Float):Void From 7e200241ef2738b619f8a29722236566011974fd Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Thu, 24 Apr 2025 20:51:07 -0400 Subject: [PATCH 70/81] assets submod (satin panties fixins) --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 2efd58c74..4edbc533a 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 2efd58c7472e10978cdc08e329bc11c5e2ab30e9 +Subproject commit 4edbc533a5c380dbf9047bc60f69155f8e79ffe6 From f1cc0928205ec60822dcf5ffe1cceb9ad27ba60e Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Thu, 24 Apr 2025 21:29:18 -0400 Subject: [PATCH 71/81] quickie haxe checkstyle thing that annoy me all the time grr.. --- checkstyle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkstyle.json b/checkstyle.json index 6c463f75a..ff46f5e3a 100644 --- a/checkstyle.json +++ b/checkstyle.json @@ -347,7 +347,7 @@ { "props": { "allowSingleLineStatement": true, - "tokens": ["FOR", "IF", "ELSE_IF", "WHILE", "DO_WHILE"] + "tokens": ["FOR", "ELSE_IF", "WHILE", "DO_WHILE"] }, "type": "NeedBraces" }, From 78646c4635a71c560b3cecc8d59e03d658d22f3d Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Thu, 24 Apr 2025 21:43:56 -0400 Subject: [PATCH 72/81] fix for difficulty stars not appearing when returning from character select --- source/funkin/ui/freeplay/AlbumRoll.hx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/funkin/ui/freeplay/AlbumRoll.hx b/source/funkin/ui/freeplay/AlbumRoll.hx index 9559bbe23..2996458eb 100644 --- a/source/funkin/ui/freeplay/AlbumRoll.hx +++ b/source/funkin/ui/freeplay/AlbumRoll.hx @@ -91,20 +91,16 @@ class AlbumRoll extends FlxSpriteGroup if (albumId == null) { this.visible = false; - difficultyStars.stars.visible = false; return; } else - { this.visible = true; - } albumData = AlbumRegistry.instance.fetchEntry(albumId); if (albumData == null) { FlxG.log.warn('Could not find album data for album ID: ${albumId}'); - return; }; @@ -113,9 +109,7 @@ class AlbumRoll extends FlxSpriteGroup newAlbumArt.replaceFrameGraphic(0, albumGraphic); buildAlbumTitle(albumData.getAlbumTitleAssetKey(), albumData.getAlbumTitleOffsets()); - applyExitMovers(); - refresh(); } From 745f49ca6d95c8de0e5eeb30908024b551a557eb Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Thu, 24 Apr 2025 22:17:35 -0400 Subject: [PATCH 73/81] tiny little cleans in char select nametag --- source/funkin/ui/charSelect/CharSelectSubState.hx | 2 +- source/funkin/ui/charSelect/Nametag.hx | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/source/funkin/ui/charSelect/CharSelectSubState.hx b/source/funkin/ui/charSelect/CharSelectSubState.hx index 48a88be33..87f08960c 100644 --- a/source/funkin/ui/charSelect/CharSelectSubState.hx +++ b/source/funkin/ui/charSelect/CharSelectSubState.hx @@ -498,7 +498,7 @@ class CharSelectSubState extends MusicBeatSubState grpIcons.scrollFactor.set(); } - function unLock() + function unLock():Void { var index = nonLocks[0]; diff --git a/source/funkin/ui/charSelect/Nametag.hx b/source/funkin/ui/charSelect/Nametag.hx index b6cedb0c7..5bdb0e7e8 100644 --- a/source/funkin/ui/charSelect/Nametag.hx +++ b/source/funkin/ui/charSelect/Nametag.hx @@ -18,9 +18,6 @@ class Nametag extends FlxSprite shader = mosaicShader; switchChar("bf"); - - FlxG.debugger.addTrackerProfile(new TrackerProfile(Nametag, ["midpointX", "midpointY"])); - FlxG.debugger.track(this, "Nametag"); } public function updatePosition():Void @@ -71,16 +68,12 @@ class Nametag extends FlxSprite } } - function setBlockTimer(frame:Int, ?forceX:Float, ?forceY:Float) + function setBlockTimer(frame:Int, ?forceX:Float, ?forceY:Float):Void { - var daX:Float = 10 * FlxG.random.int(1, 4); - var daY:Float = 10 * FlxG.random.int(1, 4); + var daX:Float = forceX ?? 10 * FlxG.random.int(1, 4); + var daY:Float = forceY ?? 10 * FlxG.random.int(1, 4); - if (forceX != null) daX = forceX; - - if (forceY != null) daY = forceY; - - new FlxTimer().start(frame / 30, _ -> { + FlxTimer.wait(frame / 30, () -> { mosaicShader.setBlockSize(daX, daY); }); } From b7675aa44097b3cbfee012fe50451daff3c4ed97 Mon Sep 17 00:00:00 2001 From: Cameron Taylor Date: Fri, 25 Apr 2025 00:18:58 -0400 Subject: [PATCH 74/81] assets submod (Cheer overrides lightning scare from kade) --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 4edbc533a..725ab30be 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 4edbc533a5c380dbf9047bc60f69155f8e79ffe6 +Subproject commit 725ab30be24ceee990d42887edeef7af7c45642a From c41c80099873e92d6b5d48de0276c03b1db8d04f Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Tue, 15 Apr 2025 01:19:01 -0400 Subject: [PATCH 75/81] Fix a bug where render distance ignores scroll speed (test on 0.5x scroll speed), then do some code cleanup and documentation. --- source/funkin/play/notes/Strumline.hx | 226 +++++++++++++++++++++----- 1 file changed, 188 insertions(+), 38 deletions(-) diff --git a/source/funkin/play/notes/Strumline.hx b/source/funkin/play/notes/Strumline.hx index 2c941d31d..b9f812745 100644 --- a/source/funkin/play/notes/Strumline.hx +++ b/source/funkin/play/notes/Strumline.hx @@ -18,35 +18,46 @@ import funkin.play.notes.notekind.NoteKindManager; */ class Strumline extends FlxSpriteGroup { + /** + * The directions of the notes on the strumline, in order. + */ public static final DIRECTIONS:Array = [NoteDirection.LEFT, NoteDirection.DOWN, NoteDirection.UP, NoteDirection.RIGHT]; + + /** + * A magic number for the size of the strumline, in pixels. + */ public static final STRUMLINE_SIZE:Int = 104; + + /** + * The spacing between notes on the strumline, in pixels. + */ public static final NOTE_SPACING:Int = STRUMLINE_SIZE + 8; // Positional fixes for new strumline graphics. - static final INITIAL_OFFSET = -0.275 * STRUMLINE_SIZE; + static final INITIAL_OFFSET:Float = -0.275 * STRUMLINE_SIZE; static final NUDGE:Float = 2.0; static final KEY_COUNT:Int = 4; static final NOTE_SPLASH_CAP:Int = 6; - static var RENDER_DISTANCE_MS(get, never):Float; + var renderDistanceMs(get, never):Float; /** * The custom render distance for the strumline. * This should be in miliseconds only! Not pixels. */ - public static var CUSTOM_RENDER_DISTANCE_MS:Float = 0.0; + public var customRenderDistanceMs:Float = 0.0; /** * Whether to use the custom render distance. * If false, the render distance will be calculated based on the screen height. */ - public static var USE_CUSTOM_RENDER_DISTANCE:Bool = false; + public var useCustomRenderDistance:Bool = false; - static function get_RENDER_DISTANCE_MS():Float + function get_renderDistanceMs():Float { - if (USE_CUSTOM_RENDER_DISTANCE) return CUSTOM_RENDER_DISTANCE_MS; - return FlxG.height / Constants.PIXELS_PER_MS; + if (useCustomRenderDistance) return customRenderDistanceMs; + return FlxG.height / Constants.PIXELS_PER_MS / scrollSpeed; } /** @@ -71,6 +82,9 @@ class Strumline extends FlxSpriteGroup // Used in-game to control the scroll speed within a song public var scrollSpeed:Float = 1.0; + /** + * Reset the scroll speed to the current chart's scroll speed. + */ public function resetScrollSpeed():Void { scrollSpeed = PlayState.instance?.currentChart?.scrollSpeed ?? 1.0; @@ -101,8 +115,16 @@ class Strumline extends FlxSpriteGroup */ public var notes:FlxTypedSpriteGroup; + /** + * The hold notes currently being rendered on the strumline. + * This group iterates over this every frame to update hold note positions. + * The PlayState also iterates over this to calculate user inputs. + */ public var holdNotes:FlxTypedSpriteGroup; + /** + * A signal that is dispatched when a note is spawned and heading towards the strumline. + */ public var onNoteIncoming:FlxTypedSignalVoid>; var background:FunkinSprite; @@ -218,6 +240,9 @@ class Strumline extends FlxSpriteGroup return value; } + /** + * Refresh the strumline, sorting its children by z-index. + */ public function refresh():Void { sort(SortUtil.byZIndex, FlxSort.ASCENDING); @@ -241,7 +266,7 @@ class Strumline extends FlxSpriteGroup #if FEATURE_GHOST_TAPPING /** - * Returns `true` if no notes are in range of the strumline and the player can spam without penalty. + * @return `true` if no notes are in range of the strumline and the player can spam without penalty. */ public function mayGhostTap():Bool { @@ -286,31 +311,41 @@ class Strumline extends FlxSpriteGroup }); } - public function getNoteSprite(noteData:SongNoteData):NoteSprite + /** + * Get a note sprite corresponding to the given note data. + * @param target The note data for the note sprite. + * @return The note sprite. + */ + public function getNoteSprite(target:SongNoteData):NoteSprite { - if (noteData == null) return null; + if (target == null) return null; for (note in notes.members) { if (note == null) continue; if (note.alive) continue; - if (note.noteData == noteData) return note; + if (note.noteData == target) return note; } return null; } - public function getHoldNoteSprite(noteData:SongNoteData):SustainTrail + /** + * Get a hold note sprite corresponding to the given note data. + * @param target The note data for the hold note. + * @return The hold note sprite. + */ + public function getHoldNoteSprite(target:SongNoteData):SustainTrail { - if (noteData == null || ((noteData.length ?? 0.0) <= 0.0)) return null; + if (target == null || ((target.length ?? 0.0) <= 0.0)) return null; for (holdNote in holdNotes.members) { if (holdNote == null) continue; if (holdNote.alive) continue; - if (holdNote.noteData == noteData) return holdNote; + if (holdNote.noteData == target) return holdNote; } return null; @@ -367,18 +402,13 @@ class Strumline extends FlxSpriteGroup /** * For a note's strumTime, calculate its Y position relative to the strumline. * NOTE: Assumes Conductor and PlayState are both initialized. - * @param strumTime - * @return Float + * @param strumTime The strumtime of the note. + * @return The Y position of the note. */ - public function calculateNoteYPos(strumTime:Float, vwoosh:Bool = true):Float + public function calculateNoteYPos(strumTime:Float):Float { - // Make the note move faster visually as it moves offscreen. - // var vwoosh:Float = (strumTime < Conductor.songPosition) && vwoosh ? 2.0 : 1.0; - // ^^^ commented this out... do NOT make it move faster as it moves offscreen! - var vwoosh:Float = 1.0; - return - Constants.PIXELS_PER_MS * (conductorInUse.songPosition - strumTime - Conductor.instance.inputOffset) * scrollSpeed * vwoosh * (Preferences.downscroll ? 1 : -1); + Constants.PIXELS_PER_MS * (conductorInUse.songPosition - strumTime - Conductor.instance.inputOffset) * scrollSpeed * (Preferences.downscroll ? 1 : -1); } function updateNotes():Void @@ -392,7 +422,7 @@ class Strumline extends FlxSpriteGroup var songStart:Float = PlayState.instance?.startTimestamp ?? 0.0; var hitWindowStart:Float = conductorInUse.songPosition - Constants.HIT_WINDOW_MS; - var renderWindowStart:Float = conductorInUse.songPosition + RENDER_DISTANCE_MS; + var renderWindowStart:Float = conductorInUse.songPosition + renderDistanceMs; for (noteIndex in nextNoteIndex...noteData.length) { @@ -407,7 +437,7 @@ class Strumline extends FlxSpriteGroup } if (note.time > renderWindowStart) break; // Note is too far ahead to render - var noteSprite = buildNoteSprite(note); + var noteSprite:NoteSprite = buildNoteSprite(note); if (note.length > 0) { @@ -429,7 +459,7 @@ class Strumline extends FlxSpriteGroup if (!customPositionData) note.y = this.y - INITIAL_OFFSET + calculateNoteYPos(note.strumTime, vwoosh); // If the note is miss - var isOffscreen = Preferences.downscroll ? note.y > FlxG.height : note.y < -note.height; + var isOffscreen:Bool = Preferences.downscroll ? note.y > FlxG.height : note.y < -note.height; if (note.handledMiss && isOffscreen) { killNote(note); @@ -453,7 +483,8 @@ class Strumline extends FlxSpriteGroup } } - var renderWindowEnd = holdNote.strumTime + holdNote.fullSustainLength + Constants.HIT_WINDOW_MS + RENDER_DISTANCE_MS / 8; + final magicNumberIGuess:Float = 8; + var renderWindowEnd:Float = holdNote.strumTime + holdNote.fullSustainLength + Constants.HIT_WINDOW_MS + (renderDistanceMs / magicNumberIGuess); if (holdNote.missedNote && conductorInUse.songPosition >= renderWindowEnd) { @@ -607,6 +638,9 @@ class Strumline extends FlxSpriteGroup nextNoteIndex = 0; } + /** + * Called on each beat of the song. + */ public function onBeatHit():Void { if (notes.members.length > 1) notes.members.insertionSort(compareNoteSprites.bind(FlxSort.ASCENDING)); @@ -614,16 +648,29 @@ class Strumline extends FlxSpriteGroup if (holdNotes.members.length > 1) holdNotes.members.insertionSort(compareHoldNoteSprites.bind(FlxSort.ASCENDING)); } + /** + * Called when a key is pressed. + * @param dir The direction of the key that was pressed. + */ public function pressKey(dir:NoteDirection):Void { heldKeys[dir] = true; } + /** + * Called when a key is released. + * @param dir The direction of the key that was released. + */ public function releaseKey(dir:NoteDirection):Void { heldKeys[dir] = false; } + /** + * Check if a key is held down. + * @param dir The direction of the key to check. + * @return `true` if the key is held down, `false` otherwise. + */ public function isKeyHeld(dir:NoteDirection):Bool { return heldKeys[dir]; @@ -673,6 +720,11 @@ class Strumline extends FlxSpriteGroup #end } + /** + * Apply note data from a chart to this strumline. + * Note data should be valid and apply only to this strumline. + * @param data The note data to apply. + */ public function applyNoteData(data:Array):Void { this.notes.clear(); @@ -685,6 +737,7 @@ class Strumline extends FlxSpriteGroup } /** + * Hit a note. * @param note The note to hit. * @param removeNote True to remove the note immediately, false to make it transparent and let it move offscreen. */ @@ -716,6 +769,10 @@ class Strumline extends FlxSpriteGroup #end } + /** + * Kill a note heading towards the strumline. + * @param note The note to kill. Gets recycled and reused for performance. + */ public function killNote(note:NoteSprite):Void { if (note == null) return; @@ -730,41 +787,76 @@ class Strumline extends FlxSpriteGroup } } + /** + * Get a strumline note sprite by its index. + * @param index The index of the note to get. + * @return The note. + */ public function getByIndex(index:Int):StrumlineNote { return this.strumlineNotes.members[index]; } + /** + * Get a strumline note sprite by its direction. + * @param direction The direction of the note to get. + * @return The note. + */ public function getByDirection(direction:NoteDirection):StrumlineNote { return getByIndex(DIRECTIONS.indexOf(direction)); } + /** + * Play a static animation for a given direction. + * @param direction The direction of the note to play the static animation for. + */ public function playStatic(direction:NoteDirection):Void { getByDirection(direction).playStatic(); } + /** + * Play a press animation for a given direction. + * @param direction The direction of the note to play the press animation for. + */ public function playPress(direction:NoteDirection):Void { getByDirection(direction).playPress(); } + /** + * Play a confirm animation for a given direction. + * @param direction The direction of the note to play the confirm animation for. + */ public function playConfirm(direction:NoteDirection):Void { getByDirection(direction).playConfirm(); } + /** + * Play a confirm animation for a hold note. + * @param direction The direction of the note to play the confirm animation for. + */ public function holdConfirm(direction:NoteDirection):Void { getByDirection(direction).holdConfirm(); } + /** + * Check if a given direction is playing the confirm animation. + * @param direction The direction of the note to check. + * @return `true` if the note is playing the confirm animation, `false` otherwise. + */ public function isConfirm(direction:NoteDirection):Bool { return getByDirection(direction).isConfirm(); } + /** + * Play a note splash for a given direction. + * @param direction The direction of the note to play the splash animation for. + */ public function playNoteSplash(direction:NoteDirection):Void { if (!showNotesplash) return; @@ -787,6 +879,10 @@ class Strumline extends FlxSpriteGroup } } + /** + * Play a note hold cover for a given hold note. + * @param holdNote The hold note to play the cover animation for. + */ public function playNoteHoldCover(holdNote:SustainTrail):Void { if (!showNotesplash) return; @@ -817,6 +913,11 @@ class Strumline extends FlxSpriteGroup } } + /** + * Build a note sprite for a given note data. + * @param note The note data to build the note sprite for. + * @return The note sprite. Will recycle a note sprite from the pool if available for performance. + */ public function buildNoteSprite(note:SongNoteData):NoteSprite { var noteSprite:NoteSprite = constructNoteSprite(); @@ -833,13 +934,17 @@ class Strumline extends FlxSpriteGroup noteSprite.x += getXPos(DIRECTIONS[note.getDirection() % KEY_COUNT]); noteSprite.x -= (noteSprite.width - Strumline.STRUMLINE_SIZE) / 2; // Center it noteSprite.x -= NUDGE; - // noteSprite.x += INITIAL_OFFSET; noteSprite.y = -9999; } return noteSprite; } + /** + * Build a hold note sprite for a given note data. + * @param note The note data to build the hold note sprite for. + * @return The hold note sprite. Will recycle a hold note sprite from the pool if available for performance. + */ public function buildHoldNoteSprite(note:SongNoteData):SustainTrail { var holdNoteSprite:SustainTrail = constructHoldNoteSprite(); @@ -874,7 +979,7 @@ class Strumline extends FlxSpriteGroup } /** - * Custom recycling behavior. + * Custom recycling behavior for note splashes. */ function constructNoteSplash():NoteSplash { @@ -908,7 +1013,7 @@ class Strumline extends FlxSpriteGroup } /** - * Custom recycling behavior. + * Custom recycling behavior for note hold covers. */ function constructNoteHoldCover():NoteHoldCover { @@ -942,7 +1047,7 @@ class Strumline extends FlxSpriteGroup } /** - * Custom recycling behavior. + * Custom recycling behavior for note sprites. */ function constructNoteSprite():NoteSprite { @@ -968,7 +1073,7 @@ class Strumline extends FlxSpriteGroup } /** - * Custom recycling behavior. + * Custom recycling behavior for hold note sprites. */ function constructHoldNoteSprite():SustainTrail { @@ -1020,6 +1125,10 @@ class Strumline extends FlxSpriteGroup FlxTween.tween(arrow, {y: arrow.y + 10, alpha: 1}, 1, {ease: FlxEase.circOut, startDelay: 0.5 + (0.2 * index)}); } + /** + * Play a fade in animation on all arrows in the strumline. + * Used when starting a song in Freeplay mode. + */ public function fadeInArrows():Void { for (index => arrow in this.strumlineNotes.members.keyValueIterator()) @@ -1028,24 +1137,50 @@ class Strumline extends FlxSpriteGroup } } + /** + * Compare two note data objects by their strumtime. + * @param order The order to sort the notes in. + * @param a The first note data object. + * @param b The second note data object. + * @return The comparison result, based on the time of the notes. + */ function compareNoteData(order:Int, a:SongNoteData, b:SongNoteData):Int { return FlxSort.byValues(order, a.time, b.time); } + /** + * Compare two note sprites by their strumtime. + * @param order The order to sort the notes in. + * @param a The first note sprite. + * @param b The second note sprite. + * @return The comparison result, based on the time of the notes. + */ function compareNoteSprites(order:Int, a:NoteSprite, b:NoteSprite):Int { return FlxSort.byValues(order, a?.strumTime, b?.strumTime); } + /** + * Compare two hold note sprites by their strumtime. + * @param order The order to sort the notes in. + * @param a The first hold note sprite. + * @param b The second hold note sprite. + * @return The comparison result, based on the time of the notes. + */ function compareHoldNoteSprites(order:Int, a:SustainTrail, b:SustainTrail):Int { return FlxSort.byValues(order, a?.strumTime, b?.strumTime); } - override function findMinYHelper() + /** + * Find the minimum Y position of the strumline. + * Ignores the background to ensure the strumline is positioned correctly. + * @return The minimum Y position of the strumline. + */ + override function findMinYHelper():Float { - var value = Math.POSITIVE_INFINITY; + var value:Float = Math.POSITIVE_INFINITY; for (member in group.members) { if (member == null) continue; @@ -1053,18 +1188,28 @@ class Strumline extends FlxSpriteGroup if (member == this.background) continue; var minY:Float; - if (member.flixelType == SPRITEGROUP) minY = (cast member : FlxSpriteGroup).findMinY(); + if (member.flixelType == SPRITEGROUP) + { + minY = (cast member : FlxSpriteGroup).findMinY(); + } else + { minY = member.y; + } if (minY < value) value = minY; } return value; } - override function findMaxYHelper() + /** + * Find the maximum Y position of the strumline. + * Ignores the background to ensure the strumline is positioned correctly. + * @return The maximum Y position of the strumline. + */ + override function findMaxYHelper():Float { - var value = Math.NEGATIVE_INFINITY; + var value:Float = Math.NEGATIVE_INFINITY; for (member in group.members) { if (member == null) continue; @@ -1072,9 +1217,14 @@ class Strumline extends FlxSpriteGroup if (member == this.background) continue; var maxY:Float; - if (member.flixelType == SPRITEGROUP) maxY = (cast member : FlxSpriteGroup).findMaxY(); + if (member.flixelType == SPRITEGROUP) + { + maxY = (cast member : FlxSpriteGroup).findMaxY(); + } else + { maxY = member.y + member.height; + } if (maxY > value) value = maxY; } From e21b01aa661dfd40b5587c4477755fc1bd3564bf Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Tue, 15 Apr 2025 01:29:41 -0400 Subject: [PATCH 76/81] Fix a broken usage. --- source/funkin/play/notes/Strumline.hx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/source/funkin/play/notes/Strumline.hx b/source/funkin/play/notes/Strumline.hx index b9f812745..0bd3f52d0 100644 --- a/source/funkin/play/notes/Strumline.hx +++ b/source/funkin/play/notes/Strumline.hx @@ -454,9 +454,8 @@ class Strumline extends FlxSpriteGroup { if (note == null || !note.alive) continue; - var vwoosh:Bool = note.holdNoteSprite == null; // Set the note's position. - if (!customPositionData) note.y = this.y - INITIAL_OFFSET + calculateNoteYPos(note.strumTime, vwoosh); + if (!customPositionData) note.y = this.y - INITIAL_OFFSET + calculateNoteYPos(note.strumTime); // If the note is miss var isOffscreen:Bool = Preferences.downscroll ? note.y > FlxG.height : note.y < -note.height; @@ -525,17 +524,15 @@ class Strumline extends FlxSpriteGroup var yOffset:Float = (holdNote.fullSustainLength - holdNote.sustainLength) * Constants.PIXELS_PER_MS; - var vwoosh:Bool = false; - if (!customPositionData) { if (Preferences.downscroll) { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime, vwoosh) - holdNote.height + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) - holdNote.height + STRUMLINE_SIZE / 2; } else { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime, vwoosh) + yOffset + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + yOffset + STRUMLINE_SIZE / 2; } } @@ -575,17 +572,16 @@ class Strumline extends FlxSpriteGroup { // Hold note is new, render it normally. holdNote.visible = true; - var vwoosh:Bool = false; if (!customPositionData) { if (Preferences.downscroll) { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime, vwoosh) - holdNote.height + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) - holdNote.height + STRUMLINE_SIZE / 2; } else { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime, vwoosh) + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + STRUMLINE_SIZE / 2; } } } From 19eb138666f14c7dd9e3d324e125f4fa3bd58e21 Mon Sep 17 00:00:00 2001 From: kade-github <26305836+Kade-github@users.noreply.github.com> Date: Tue, 22 Apr 2025 09:34:16 -0700 Subject: [PATCH 77/81] vwooshin for retry --- source/funkin/play/PlayState.hx | 22 ++++++- source/funkin/play/notes/NoteSprite.hx | 5 ++ source/funkin/play/notes/Strumline.hx | 76 ++++++++++++++++++++--- source/funkin/play/notes/StrumlineNote.hx | 5 ++ source/funkin/play/notes/SustainTrail.hx | 5 ++ 5 files changed, 104 insertions(+), 9 deletions(-) diff --git a/source/funkin/play/PlayState.hx b/source/funkin/play/PlayState.hx index 642d3ced9..e4b7d7ad3 100644 --- a/source/funkin/play/PlayState.hx +++ b/source/funkin/play/PlayState.hx @@ -875,6 +875,10 @@ class PlayState extends MusicBeatSubState // Delete all notes and reset the arrays. regenNoteData(); + // so the song doesn't start too early :D + Conductor.instance.update(-5000, false); + + // Reset camera zooming cameraBopIntensity = Constants.DEFAULT_BOP_INTENSITY; hudCameraZoomIntensity = (cameraBopIntensity - 1.0) * 2.0; @@ -883,11 +887,27 @@ class PlayState extends MusicBeatSubState health = Constants.HEALTH_STARTING; songScore = 0; Highscore.tallies.combo = 0; - Countdown.performCountdown(); + // timer for vwoosh + var vwooshTimer = new FlxTimer(); + vwooshTimer.start(0.5, function(t:FlxTimer) { + Conductor.instance.update(startTimestamp - Conductor.instance.combinedOffset, false); + if (playerStrumline.notes.length == 0) playerStrumline.updateNotes(); + if (opponentStrumline.notes.length == 0) opponentStrumline.updateNotes(); + playerStrumline.vwooshInNotes(); + opponentStrumline.vwooshInNotes(); + Countdown.performCountdown(); + }); + // Reset the health icons. + if (currentStage.getBoyfriend() != null) + { currentStage.getBoyfriend().initHealthIcon(false); + } + if (currentStage.getDad() != null) + { currentStage.getDad().initHealthIcon(true); + } needsReset = false; } diff --git a/source/funkin/play/notes/NoteSprite.hx b/source/funkin/play/notes/NoteSprite.hx index 4fa0a4052..509bfc3e6 100644 --- a/source/funkin/play/notes/NoteSprite.hx +++ b/source/funkin/play/notes/NoteSprite.hx @@ -104,6 +104,11 @@ class NoteSprite extends FunkinSprite return noteData.length > 0; } + /** + * The Y Offset of the note. + */ + public var yOffset:Float = 0.0; + /** * Set this flag to true when hitting the note to avoid scoring it multiple times. */ diff --git a/source/funkin/play/notes/Strumline.hx b/source/funkin/play/notes/Strumline.hx index 0bd3f52d0..50c85b733 100644 --- a/source/funkin/play/notes/Strumline.hx +++ b/source/funkin/play/notes/Strumline.hx @@ -1,5 +1,6 @@ package funkin.play.notes; +import flixel.math.FlxPoint; import flixel.util.FlxSignal.FlxTypedSignal; import flixel.FlxG; import funkin.play.notes.notestyle.NoteStyle; @@ -356,6 +357,8 @@ class Strumline extends FlxSpriteGroup */ public function vwooshNotes():Void { + var vwooshTime:Float = 0.5; + for (note in notes.members) { if (note == null) continue; @@ -366,7 +369,7 @@ class Strumline extends FlxSpriteGroup var targetY:Float = FlxG.height + note.y; if (Preferences.downscroll) targetY = 0 - note.height; - FlxTween.tween(note, {y: targetY}, 0.5, + FlxTween.tween(note, {y: targetY}, vwooshTime, { ease: FlxEase.expoIn, onComplete: function(twn) { @@ -387,7 +390,7 @@ class Strumline extends FlxSpriteGroup var targetY:Float = FlxG.height + holdNote.y; if (Preferences.downscroll) targetY = 0 - holdNote.height; - FlxTween.tween(holdNote, {y: targetY}, 0.5, + FlxTween.tween(holdNote, {y: targetY}, vwooshTime, { ease: FlxEase.expoIn, onComplete: function(twn) { @@ -399,6 +402,53 @@ class Strumline extends FlxSpriteGroup } } + /** + * Reverse of vwooshNotes, we bring the notes IN (by their offsets) + */ + public function vwooshInNotes():Void + { + var vwooshTime:Float = 0.5; + + for (note in notes.members) + { + if (note == null) continue; + if (!note.alive) continue; + + note.yOffset = 200; + if (Preferences.downscroll) + { + note.yOffset = -200; + } + FlxTween.tween(note, {yOffset: 0}, vwooshTime, + { + ease: FlxEase.expoOut, + onComplete: function(twn) { + note.yOffset = 0; + } + }); + } + + for (holdNote in holdNotes.members) + { + if (holdNote == null) continue; + if (!holdNote.alive) continue; + + holdNote.yOffset = 200; + if (Preferences.downscroll) + { + holdNote.yOffset = -200; + } + FlxTween.tween(holdNote, {yOffset: 0}, vwooshTime, + { + ease: FlxEase.expoOut, + onComplete: function(twn) { + holdNote.yOffset = 0; + } + }); + } + } + + /** * For a note's strumTime, calculate its Y position relative to the strumline. * NOTE: Assumes Conductor and PlayState are both initialized. @@ -411,7 +461,7 @@ class Strumline extends FlxSpriteGroup Constants.PIXELS_PER_MS * (conductorInUse.songPosition - strumTime - Conductor.instance.inputOffset) * scrollSpeed * (Preferences.downscroll ? 1 : -1); } - function updateNotes():Void + public function updateNotes():Void { if (noteData.length == 0) return; @@ -455,7 +505,7 @@ class Strumline extends FlxSpriteGroup if (note == null || !note.alive) continue; // Set the note's position. - if (!customPositionData) note.y = this.y - INITIAL_OFFSET + calculateNoteYPos(note.strumTime); + if (!customPositionData) note.y = this.y - INITIAL_OFFSET + calculateNoteYPos(note.strumTime) + note.yOffset; // If the note is miss var isOffscreen:Bool = Preferences.downscroll ? note.y > FlxG.height : note.y < -note.height; @@ -528,11 +578,16 @@ class Strumline extends FlxSpriteGroup { if (Preferences.downscroll) { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) - holdNote.height + STRUMLINE_SIZE / 2; + holdNote.y = this.y + - INITIAL_OFFSET + + calculateNoteYPos(holdNote.strumTime) + - holdNote.height + + STRUMLINE_SIZE / 2 + + holdNote.yOffset; } else { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + yOffset + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + yOffset + STRUMLINE_SIZE / 2 + holdNote.yOffset; } } @@ -577,11 +632,16 @@ class Strumline extends FlxSpriteGroup { if (Preferences.downscroll) { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) - holdNote.height + STRUMLINE_SIZE / 2; + holdNote.y = this.y + - INITIAL_OFFSET + + calculateNoteYPos(holdNote.strumTime) + - holdNote.height + + STRUMLINE_SIZE / 2 + + holdNote.yOffset; } else { - holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + STRUMLINE_SIZE / 2; + holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + STRUMLINE_SIZE / 2 + holdNote.yOffset; } } } diff --git a/source/funkin/play/notes/StrumlineNote.hx b/source/funkin/play/notes/StrumlineNote.hx index 03b782485..324234cc4 100644 --- a/source/funkin/play/notes/StrumlineNote.hx +++ b/source/funkin/play/notes/StrumlineNote.hx @@ -26,6 +26,11 @@ class StrumlineNote extends FunkinSprite return this.direction; } + /** + * The Y Offset of the note. + */ + public var yOffset:Float = 0.0; + /** * Set this flag to `true` to disable performance optimizations that cause * the Strumline note sprite to ignore `velocity` and `acceleration`. diff --git a/source/funkin/play/notes/SustainTrail.hx b/source/funkin/play/notes/SustainTrail.hx index 937bc0ceb..36dc3bfab 100644 --- a/source/funkin/play/notes/SustainTrail.hx +++ b/source/funkin/play/notes/SustainTrail.hx @@ -33,6 +33,11 @@ class SustainTrail extends FlxSprite public var cover:NoteHoldCover = null; + /** + * The Y Offset of the note. + */ + public var yOffset:Float = 0.0; + /** * Set to `true` if the user hit the note and is currently holding the sustain. * Should display associated effects. From 03d46084b4805bc2aeff0ba00773c6cbd5fb9628 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Fri, 25 Apr 2025 02:32:28 -0400 Subject: [PATCH 78/81] Update game version to v0.6.3. --- docs/CONTRIBUTING.md | 4 ++-- project.hxp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 0f1985fab..b03d67fc0 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -60,7 +60,7 @@ This section provides guidelines to follow when [opening an issue](https://githu ## Requirements Make sure you're playing: -- the latest version of the game (currently v0.6.2) +- the latest version of the game (currently v0.6.3) - without any mods - on [Newgrounds](https://www.newgrounds.com/portal/view/770371) or downloaded from [itch.io](https://ninja-muffin24.itch.io/funkin) @@ -412,4 +412,4 @@ If your PR is accepted, you will be credited as a GitHub contributor (but not as # Closing Thank you for reading the Contributing Guide. -We look forward to seeing your contributions to the game! \ No newline at end of file +We look forward to seeing your contributions to the game! diff --git a/project.hxp b/project.hxp index 43666b3b5..858cdbdf6 100644 --- a/project.hxp +++ b/project.hxp @@ -25,7 +25,7 @@ class Project extends HXProject { * REMEMBER TO CHANGE THIS WHEN THE GAME UPDATES! * You only have to change it here, the rest of the game will query this value. */ - static final VERSION:String = "0.6.2"; + static final VERSION:String = "0.6.3"; /** * The game's name. Used as the default window title. From 63f216ea7161415512bebf59ac3e460763c7f367 Mon Sep 17 00:00:00 2001 From: kade-github <26305836+Kade-github@users.noreply.github.com> Date: Fri, 25 Apr 2025 12:06:48 -0700 Subject: [PATCH 79/81] assets submodule update --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index 4edbc533a..fd7bb8d04 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 4edbc533a5c380dbf9047bc60f69155f8e79ffe6 +Subproject commit fd7bb8d04a25add13e913e184f6afa89d4c59a05 From adefa902e79620a2be717969a63c151be6464307 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Fri, 25 Apr 2025 14:48:37 -0400 Subject: [PATCH 80/81] Fix several issues preventing builds on HTML5 --- hmm.json | 2 +- source/funkin/util/FileUtil.hx | 14 ++++++++++++-- source/funkin/util/WindowUtil.hx | 8 ++++++++ source/funkin/util/macro/RegistryMacro.hx | 3 +-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/hmm.json b/hmm.json index 41624948c..406a2a1d7 100644 --- a/hmm.json +++ b/hmm.json @@ -143,7 +143,7 @@ "name": "lime", "type": "git", "dir": null, - "ref": "1e79c20a6ee13fa168535f9f76a368e3284ddc3a", + "ref": "be81ad7e4e1a92c3482bcc009648a4ac892cfa35", "url": "https://github.com/FunkinCrew/lime" }, { diff --git a/source/funkin/util/FileUtil.hx b/source/funkin/util/FileUtil.hx index a5eda796b..cf9109bcf 100644 --- a/source/funkin/util/FileUtil.hx +++ b/source/funkin/util/FileUtil.hx @@ -53,7 +53,17 @@ class FileUtil * Paths which should not be deleted or modified by scripts. */ private static final PROTECTED_PATHS:Array = [ - '', 'assets', 'manifest', 'manifest/*', 'plugins', 'plugins/*', 'Funkin.exe', 'Funkin', 'libvlc.dll', 'libvlccore.dll', 'lime.ndll' + '', + 'assets', + 'manifest', + 'manifest/*', + 'plugins', + 'plugins/*', + 'Funkin.exe', + 'Funkin', + 'libvlc.dll', + 'libvlccore.dll', + 'lime.ndll' ]; /** @@ -269,7 +279,7 @@ class FileUtil return true; #elseif html5 - var filter:String = defaultFileName != null ? Path.extension(defaultFileName) : null; + var filter:Null = defaultFileName != null ? Path.extension(defaultFileName) : null; var fileDialog:FileDialog = new FileDialog(); if (onSave != null) { diff --git a/source/funkin/util/WindowUtil.hx b/source/funkin/util/WindowUtil.hx index 665512e5b..c6d8bee6a 100644 --- a/source/funkin/util/WindowUtil.hx +++ b/source/funkin/util/WindowUtil.hx @@ -69,6 +69,9 @@ class WindowUtil */ public static function openFolder(targetPath:String):Void { + #if html5 + throw 'Cannot open URLs on this platform.'; + #else if (!sys.FileSystem.exists(targetPath) || !sys.FileSystem.isDirectory(targetPath)) throw 'openFolder should only be used to open existing folders.'; #if FEATURE_OPEN_URL #if windows @@ -81,6 +84,7 @@ class WindowUtil #else throw 'Cannot open URLs on this platform.'; #end + #end } /** @@ -89,6 +93,9 @@ class WindowUtil */ public static function openSelectFile(targetPath:String):Void { + #if html5 + throw 'Cannot open URLs on this platform.'; + #else #if FEATURE_OPEN_URL #if windows Sys.command('explorer', ['/select,' + targetPath.replace('/', '\\')]); @@ -101,6 +108,7 @@ class WindowUtil #else throw 'Cannot open URLs on this platform.'; #end + #end } /** diff --git a/source/funkin/util/macro/RegistryMacro.hx b/source/funkin/util/macro/RegistryMacro.hx index bc16e92be..e7c0d401e 100644 --- a/source/funkin/util/macro/RegistryMacro.hx +++ b/source/funkin/util/macro/RegistryMacro.hx @@ -8,7 +8,6 @@ import haxe.macro.Expr.TypeDefKind; import haxe.macro.Expr.MetadataEntry; import haxe.macro.Type; import haxe.macro.Type.ClassType; -import sys.FileSystem; using Lambda; using haxe.macro.ExprTools; @@ -362,7 +361,7 @@ class RegistryMacro static function listBaseGameEntryIds(dataFilePath:String):Array { var result:Array = []; - var files:Array = FileSystem.readDirectory(dataFilePath); + var files:Array = sys.FileSystem.readDirectory(dataFilePath); for (file in files) { From 584b1ece07cd7ce61c345081c120faee2623a832 Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Fri, 25 Apr 2025 22:27:57 -0400 Subject: [PATCH 81/81] Update assets submodule --- assets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets b/assets index fd7bb8d04..ac932c19f 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit fd7bb8d04a25add13e913e184f6afa89d4c59a05 +Subproject commit ac932c19f9f8b4e2ee627bdfe72b51636e9d21ef