1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-09-03 20:28:04 +00:00

Compare commits

...

1984 commits

Author SHA1 Message Date
Eviethecoder 222de6f36c character sing overides and no anim notes 2025-08-13 12:40:16 -05:00
JackXson-Real d95f239dfb fix mobile finally(?) 2025-08-13 14:35:28 +08:00
Karim Akra 495690f41c
Don't use any lerping on the conductor when the song isn't playing! 2025-08-13 10:47:47 +07:00
Kolo b166cd9a7e save the goddamn changes graahhhhhh 2025-08-12 20:18:56 -05:00
Kolo 7f82b48e3f whatever. go my destroy() override 2025-08-12 20:18:56 -05:00
JackXson-Real 1fc611d130 fix main menu scrolling during transition 2025-08-13 05:35:33 +08:00
Kolo 57a276d17c lasercar nagged me to move the change somewhere else 2025-08-13 02:06:17 +08:00
Kolo 9b1b22c9d5 i literally had to set the holdNoteSprite to null that's all 2025-08-13 02:06:17 +08:00
MaybeMaru f6de4c54d3 Small optimizations 2025-08-12 12:49:54 -05:00
PurSnake e3aceacb59 one commit - one condition in changeDiff
welp, its fully done
i hope
💯
2025-08-12 23:27:33 +08:00
PurSnake 546375087c make albumRoll great again season 2 2025-08-12 23:27:33 +08:00
PurSnake c093e0ca1c make albumRoll great again 2025-08-12 23:27:33 +08:00
Abnormal 7c6efba577 bump submod again FUUUUUUUUUUUUUUUUUUUUUUUUUCK 2025-08-12 15:56:39 +08:00
MoonDroid 6f5e3a50d2 Embarrassing update flixel ref 2025-08-11 21:35:41 -04:00
MoonDroid 2d0d5f8a2e For some reason if you don't do this the saved playbackrate becomes inconsistent :( 2025-08-11 21:35:41 -04:00
MoonDroid 826249f78c Update hmm flixel ref 2025-08-11 21:35:41 -04:00
MoonDroid 0af4c82723 Change floor to round for leftover pitch/playbackRate rounding 2025-08-11 21:35:41 -04:00
MoonDroid c16e45049b chore: Switch FlxMath.clamp calls to .clamp instead 2025-08-11 21:35:41 -04:00
MoonDroid ae00e14a5b chore: Remove useless line from WelcomeDialog 2025-08-11 21:35:41 -04:00
MoonDroid 42a9c43127 chore: Switch all FlxMath.bound calls to .clamp calls instead 2025-08-11 21:35:41 -04:00
Cameron Taylor 17ece1423a don't log "starting prebuild tasks" 2025-08-11 18:26:50 -07:00
Abnormal 6540faefdd update assets submodule with the latest changes 2025-08-12 06:57:28 +08:00
Hundrec eb24d4d19e Polish all the charts
Makes various changes to each chart:
* Adjust the length of every hold note trail to match the vocals as closely as possible, across all variations and difficulties
* Revise Easy and Normal charts to be more consistent with the player's chart (from Week 1 to Week 3)
* Fix a handful of charting errors reported on GitHub with Cory
* Fix even more charting errors not reported on GitHub
* Additional bits to make these the most polished charts yet
2025-08-11 09:58:25 -07:00
Kolo 01a2458c12 force the tween graaahhhhhhhhh 2025-08-11 11:37:06 -05:00
Abnormal 38e7e230d8 bump hscript to fix an issue with final variables 2025-08-10 01:13:41 +08:00
Mikolka 84f119036b Update hmm.json 2025-08-10 00:47:51 +08:00
Abnormal 74a783c3db bump assets 2025-08-09 02:41:54 +08:00
Abnormal 09d5926455 bump polymod hscript and flxanimate woohoo!!!!!!!! 2025-08-09 02:31:49 +08:00
sector-a 5f8b7787cb Remove a left-over trace 2025-08-09 01:34:15 +08:00
Cameron Taylor a7156978a1 small regex change to checkstyle to allow leading underscores (_instance is now an allowed variable name) 2025-08-07 13:29:44 -07:00
Hundrec 65349f4714
Trim env lines to fix issues with CRLF line endings
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-08 01:04:58 +07:00
MoonDroid 93ad7e8932 Update exclusions to ASTC textures 2025-08-08 01:04:18 +07:00
Karim Akra df388dfaa6 why are we configuring assets before ASTC?? 2025-08-08 01:04:18 +07:00
Karim Akra c142add8a1 fixed an oopsie with exclusions 2025-08-08 01:04:18 +07:00
Karim Akra a75c41b813 Update astc-compressor!! 2025-08-08 01:04:18 +07:00
Karim Akra 7fd74edf2b Prevent the song from drifting away after a lagspike 2025-08-08 01:02:55 +07:00
Karim Akra 44370c2653 Fix chromebooks using mobile layout! 2025-08-07 09:56:03 -05:00
Hyper_ 1fbb7604dd nuh uh *gives back ability to fullscreen* 2025-08-06 15:30:15 -07:00
Hundrec 0e52744718
Fix visual bugs when selecting between two hold note trails in Chart Editor
Co-authored-by: Kolo <67389779+KoloInDaCrib@users.noreply.github.com>
2025-08-06 15:26:24 -07:00
PurSnake feb55b2625 stuff 2025-08-06 11:47:10 -05:00
Hundrec 4341a53486 Revert turntable lights changes 2025-08-05 16:21:05 -05:00
Karim Akra 0566cd3e58 get this out of here at once 2025-08-06 01:02:34 +08:00
Karim Akra a2f7fa9ef4 Fixed the lerp speed when changing playback rate 2025-08-06 01:02:34 +08:00
Karim Akra 3a30b681b6 tweaked the ease ratio 2025-08-06 01:02:34 +08:00
Karim Akra 0bd4ce4c97 Adjusted the lerp ratio to work better on lower FPS & added threshold for normal conductor updates 2025-08-06 01:02:34 +08:00
Karim Akra df0d977e6c Adjust the conductor arguments for smoother notes scrolling 2025-08-06 01:02:34 +08:00
Lasercar 1df0cb95f6 Fix onNoteHoldDrop logic
Co-Authored-By: Lasercar <64717068+Lasercar@users.noreply.github.com>
2025-08-05 15:00:01 +03:00
MAJigsaw77 ce83e962bf Fix swapped args oops. 2025-08-05 01:14:22 -04:00
MAJigsaw77 fb293ebcd2 Add a custom ApplicationMain to enable some winapi stuff. 2025-08-05 01:14:22 -04:00
MAJigsaw77 bb7b00cf77 Replace the application popup. 2025-08-05 01:14:22 -04:00
MAJigsaw77 e16391a05c Add winapi stuff. 2025-08-05 01:14:22 -04:00
Abnormal 5aba4b54a5 Fix some warnings/crashes in Week 6 2025-08-05 06:14:42 +08:00
Eric cb611f77a0 Update documentation in FreeplayDJ.hx 2025-08-05 06:04:08 +08:00
Abnormal b5345e1da2 lol we forgot 2025-08-05 05:54:22 +08:00
Abnormal 8d6590e765 bump art submod 2025-08-05 05:09:29 +08:00
Abnormal e39b32bab0
Merge pull request #1530 from FunkinCrew/cool-merging 2025-08-04 15:42:34 -05:00
Hundrec d5754c5da2
Merge public docs changes
Merge main into develop because it would be so awesome
2025-08-05 04:17:09 +08:00
Hundrec fbe83be936
Merge branch 'develop' into cool-merging 2025-08-05 04:15:55 +08:00
Abnormal 8d14df77ff bump the submod wooHOOOOOOOOO 2025-08-05 03:49:07 +08:00
Herman Khomich 55358463f8 Remove repeated creation of strumlineScale in a row / Strumline.hx 2025-08-04 14:21:26 -05:00
Abnormal 4ea99656f2 no more PROPER TURNTABLE LIGHTS FIX *vine boom* 2025-08-05 01:58:10 +08:00
Hyper_ 34ce13c5df chore: Add null safety to PlayState and LoadingState 2025-08-05 01:18:53 +08:00
Abnormal 1d8679941e fix tankman variant names 2025-08-04 20:12:22 +03:00
Abnormal 086f28fef1
fix invisible pixels on some sprites
Co-authored-by: MAJigsaw77 <77043862+MAJigsaw77@users.noreply.github.com>
2025-08-04 19:51:50 +03:00
Abnormal fb4967c94b
fix the pico blazin death confirm offsets
Co-authored-by: MAJigsaw77 <77043862+MAJigsaw77@users.noreply.github.com>
2025-08-04 19:46:24 +03:00
Abnormal 293b70bbed update the submod 2025-08-04 19:31:56 +03:00
Abnormal 64f4620b5a dude........fuck yes. 2025-08-04 19:31:56 +03:00
JackXson-Real 9c1e22309b decrease preview volume from 80% to 70% 2025-08-03 15:59:12 -05:00
JackXson-Real 4ecef6db74 increase preview volume to 80% 2025-08-03 15:59:12 -05:00
Kolo b128741075 mb gang 2025-08-03 15:49:36 -05:00
AwesomezPro99 86e69cfbd1 Fixed Window Title When Pressing F4 2025-08-03 15:36:26 -05:00
Karim Akra aa8690fce3
Merge pull request #1489 from FunkinCrew/pr-5565/SrtHero278/pointer-fixes
[PUBLIC PR] Properly add the touch pointer on playstate
2025-08-03 17:45:12 +03:00
MrMadera e281bdddca south button now works! 2025-08-03 21:29:29 +08:00
MoonDroid 19fdda7cd9 fix: Call Math.round and FlxMath.clamp for better readability and slightly better functionality
what a mouthful :(
2025-08-03 15:54:16 +03:00
MoonDroid d72b989bf5 Delete useless line 2025-08-03 15:54:16 +03:00
Lasercar cd99905bdf Fix volumes being reset to 100% after playtest 2025-08-03 15:54:16 +03:00
Lasercar 3f82f3792b Set playspeed after variation load 2025-08-03 15:54:16 +03:00
trofim.al 1d8ed5198c api version 0.7.0
Update example mod's API version so it actually loads. part 2.
2025-08-03 13:41:33 +03:00
AwesomezPro99 8cd3785e3c Fix Blazin' Death Pause 2025-08-03 13:01:13 +03:00
MAJigsaw77 7e01e7332b Fix html5 compile. 2025-08-03 12:48:54 +07:00
MAJigsaw77 c3a837b054 Dont compile the android classes on other targets. 2025-08-03 12:48:54 +07:00
MAJigsaw77 a92567886c Relocate the external folder outside of mobile package. 2025-08-03 12:48:54 +07:00
Abnormal 4cbfaefc1a Slightly longer fade transition
Co-authored-by: VirtuGuy <103977942+VirtuGuy@users.noreply.github.com>
2025-08-02 22:10:26 +03:00
AwesomezPro99 705e6b3308 Add Camera Fade To Song Select 2025-08-02 22:10:26 +03:00
Abnormal 56878befef update the haxelibs.......yippee...... 2025-08-02 21:59:30 +03:00
Abnormal 44cdbb08c4 asset changes wooooooooooooooo 2025-08-02 17:18:18 +03:00
Kolo d6fe54ee79 gyafyhaswguhyshbughsd 2025-08-02 17:18:18 +03:00
Kolo 32c775ef3f tooltips....BUT FOR NOTES! 2025-08-02 17:18:18 +03:00
PurSnake 1605514424 Seriously? 2025-08-02 17:02:31 +03:00
Hyper_ 743e8b13c2 me...................................................................................... 2025-08-02 16:22:18 +03:00
Eric cf89d672e7
Merge pull request #5392 from SantiagoCalebe/main
Just a lil' update of the readme
2025-08-02 08:55:57 -04:00
Kolo 661ddb15f7 me......................................................................... 2025-08-02 07:16:05 -05:00
Hundrec 72fa82716d A little more README polish 2025-08-02 18:54:18 +08:00
Santiago a069ca2dc6
I think i have a problem 2025-08-02 07:46:57 -03:00
Santiago 90a2d7a1ad
??? 2025-08-02 07:41:13 -03:00
cyn0x8 3170346b83 Create ModStore.hx 2025-08-02 11:32:44 +03:00
anysad e6d737125e feature: are you sure? 2025-08-02 11:28:17 +03:00
AwesomezPro99 3d88fbb11f Update PreferencesMenu.hx 2025-08-02 11:10:03 +03:00
JVN-Pixels 0d6bc2bedd Fix NOR in Freeplay after spamming the letter keybinds 2025-08-02 11:07:04 +03:00
anysad da5f691865 fix: no more animation editor crash 2025-08-02 11:03:23 +03:00
Hyper_ f63cbf073a Restore a lost change from #4787 2025-08-02 10:55:58 +03:00
Kolo 30721c3a30 tfw changeDiff wasn't even being called 2025-08-02 10:49:15 +03:00
JackXson-Real 2b1f346097 Add enter/exit animation for charSelect nametag part 2 2025-08-02 10:38:32 +03:00
Mihai Alexandru 12117557c7
Merge branch 'master' into pr-5565/SrtHero278/pointer-fixes 2025-08-02 10:33:33 +03:00
Hundrec 6b0e607af0 Update another contributor's name 2025-08-02 04:37:19 +08:00
Hundrec 2263b36cd7 Add a new contributor to Changelog and adjust spacing 2025-08-02 04:37:19 +08:00
Abnormal 2dcc528847 bump polymod to optimize some shiiiiiiiiiiiiiiiit 2025-08-02 02:19:14 +08:00
ExcodeFNF 5cb33e895c Freeplay CoolColors Array Removal 2025-08-02 02:01:36 +08:00
AwesomezPro99 1b91f3b57c Fixed DJ Flicker After New Rank 2025-08-02 01:28:14 +08:00
Eric e5e3270fef Update hmm.json to optimize FlxAnimate 2025-08-02 00:43:57 +08:00
EliteMasterEric e003a38cab Exclude the debug print function when we aren't in the build step 2025-08-01 18:32:37 +03:00
SrtHero278 890d1dafcb include the camera parameter in the comment 2025-08-01 19:48:39 +07:00
SrtHero278 9d2cfa9686 Fix touch pointer positioning when in PlayState 2025-08-01 19:48:39 +07:00
Karim Akra e6fd5d9b12
Make the Android back button close the game when in TitleState
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-01 13:59:02 +07:00
Cameron Taylor 967397311b remove tiny uncommented code, and simplify an unneeded variable initialization 2025-08-01 13:15:56 +07:00
Cameron Taylor 542f59ef72 tallyCompletion() function for cleanup + constency 2025-08-01 13:15:56 +07:00
Kade 065ee74aea
Scoreable notekinds
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-01 13:05:11 +07:00
Mihai Alexandru 312b5c8812
Flair adjustments to the build process
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-01 12:05:21 +07:00
Mihai Alexandru e9aa6872a3
Bump libs refs
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-01 12:03:58 +07:00
Karim Akra 4f9b63f22c
Configure the android adaptive icons through lime & moved the icons stuff to art submodule
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-08-01 01:17:29 +07:00
MAJigsaw77 962519e7f0 Fix android compile. 2025-07-28 10:41:31 +03:00
MAJigsaw77 34bae4a431 Fix compile once again. 2025-07-28 10:41:31 +03:00
Karim Akra 79478080f6 oops 2025-07-28 10:41:31 +03:00
Karim Akra 65a3ccc8fe add the same changes to the .env parser on project.hxp !! 2025-07-28 10:41:31 +03:00
Karim Akra 4ac851c387 add support for target specific environment values
and renamed `GLOBAL_ADMOB_PUBLISHER` to `MOBILE_GLOBAL_ADMOB_PUBLISHER` !!
2025-07-28 10:41:31 +03:00
MAJigsaw77 70d5730b70 Fix compile. 2025-07-27 00:56:31 -05:00
Abnormal c527fed70c conflict stuffs lol 2025-07-27 00:56:31 -05:00
TechnikTil 054a5cd00b fix fullscreen bug and show clear save data if logged out of ng 2025-07-27 00:56:31 -05:00
TechnikTil 19c5de8fe2 HOPEFULLY FIX EVERYTHING WRONG (this time it was tested between two computers) 2025-07-27 00:56:31 -05:00
TechnikTil dbc26fd621 hopefully fix everything with load from ng 2025-07-27 00:56:31 -05:00
TechnikTil eb1986b246 move clear save data to the top, add clear ng save data 2025-07-27 00:56:31 -05:00
TechnikTil d661d93184 rewrite NGSaveSlot.load to be async, dont precache assets, error handling 2025-07-27 00:56:31 -05:00
TechnikTil 4a07d0a347 make newgrounds functions in Save static and only available if newgrounds feature flag is enabled, make sure base save slot is loaded and is not empty, and recover save data in case newgrounds doesnt wanna play nice 2025-07-27 00:56:31 -05:00
TechnikTil 832f01345f Add Save Data Options, also allow user to load and save with Newgrounds Save Slots. 2025-07-27 00:56:31 -05:00
MAJigsaw77 e8d41c938c Use no-traces define instead of the flag. 2025-07-26 13:46:48 -05:00
MAJigsaw77 a94bd7f36c Fix compiling. 2025-07-26 13:43:19 -05:00
EliteMasterEric c185f10e65 Move Discord client ID to .env 2025-07-26 13:43:19 -05:00
Cameron Taylor 52f3c63071 mobile fix where the capsules don't properly shift away from the letter sorting crap 2025-07-26 12:31:38 +03:00
Cameron Taylor e71062b914 some lil variable renaming in SongMenuItem.hx 2025-07-26 12:31:38 +03:00
Cameron Taylor 3aa6a36b5e small function renaming 2025-07-26 12:31:38 +03:00
MAJigsaw77 a89fa9c121 Acually fix it (oops). 2025-07-26 11:55:36 +03:00
MAJigsaw77 cb2015f51a Fix a workflow compile error. 2025-07-26 11:55:36 +03:00
MAJigsaw77 139ce3847c Fix for env vars that contain = as one of thier characters. 2025-07-26 11:55:36 +03:00
EliteMasterEric 87b40c1203 Obsolete NewgroundsCredentials.hx for storing secret keys in favor of .env 2025-07-26 11:55:36 +03:00
Kade b9852c316b
offset menu changes
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-26 10:36:29 +03:00
Cameron Taylor 444697620c
Use round instead of floor to fix rounding errors in Preferences.
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-26 10:04:00 +03:00
sector-a 6abeefb15d
Set cliprect for clear percent.
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-25 17:43:34 +03:00
sector-a 530bd1f11d
Add onPause callback to pause substate.
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-25 17:36:34 +03:00
sector-a 76c0dea92b
Move results and death haptics to scripts. 2025-07-25 17:23:04 +03:00
Karim Akra 2d7a2202f5
Fix song restarting bug (for good??).
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-25 16:45:55 +03:00
sector-a 1f18a3d1f4
Fix diff dots alignment.
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-25 16:37:39 +03:00
sector-a 0d57f61ffa
Scale up the bg in debug menu on widescreen
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-25 16:19:46 +03:00
MAJigsaw77 9fa70775b9 Use funkin.Assets instead of openfl.utils.Assets. 2025-07-25 16:15:51 +03:00
sector-a 463afb43c0 assets submod 2025-07-25 16:15:51 +03:00
sector-a 2833827fbf Change the way game searches for pixel icons 2025-07-25 16:15:51 +03:00
Santiago 01cd72e805
Merge branch 'main' into main 2025-07-22 14:13:22 -03:00
Eric 72e0ff6c9b
Merge pull request #5487 from Lasercar/bunker-infiltrated
Bump to 0.7.4
2025-07-22 11:59:45 -04:00
Eric 2586154376
Merge pull request #5488 from FunkinCrew/develop-v0.7.3
Update main branch to v0.7.3
2025-07-22 11:59:01 -04:00
Lasercar 82367dffc2 Bunker infiltrated 2025-07-23 00:30:15 +10:00
charlesisfeline 7c675ecf17 the psych confusion continues! 2025-07-22 10:03:25 +08:00
Hundrec b4e52df156 3 2025-07-22 07:56:14 +08:00
Hundrec cf70bf2c6c Friday Night Funkin' if it was good 2025-07-22 07:56:14 +08:00
Hyper_ fb6d1b36d3 lasercar................................................................................................................................................................................................. 2025-07-22 07:43:15 +08:00
MoonDroid 0c0c63bc03 fix: Move hasInitialized to onPurchasesUpdate instead. 2025-07-21 19:08:14 -04:00
Hyper_ 01620fda9b The most deranged line loss of all time 2025-07-22 06:41:46 +08:00
cherry 3bcd6813c1 Clear key from correct map 2025-07-22 06:12:56 +08:00
sector-a d44966efd2 Prevent AA calculations if AA_STAGES are 0 in DropShadow shaders 2025-07-21 18:02:18 -04:00
sector-a 79c3e2de11
assets ref
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-22 04:50:15 +07:00
Karim Akra 8372d47d11 Fixed the menu item getting disabled if you hit back during the transition 2025-07-22 05:21:40 +08:00
MoonDroid d89ebdf58f Attempt to fix the soft lock issue for Main Menu. 2025-07-22 05:21:40 +08:00
kade-github 1e8c472084 holy shit 2025-07-21 23:16:43 +03:00
kade-github 17cef6f897 fix for winblows 2025-07-21 23:16:43 +03:00
kade-github 2cc43ee1f6 text fix for my mobile fellas 2025-07-21 23:16:43 +03:00
Eric 2277acccfa Update hmm.json 2025-07-22 04:00:29 +08:00
Eric 351719ab13
Merge pull request #5438 from FunkinCrew/EliteMasterEric-patch-4
Update lime, openfl, flixel repo URLs in hmm.json
2025-07-21 13:05:40 -04:00
Eric 4ecfe9863e
Update lime, openfl, flixel repo URLs in hmm.json 2025-07-21 13:05:15 -04:00
Eric 48e140e5c0
Merge pull request #5432 from FunkinCrew/develop-0.7.2
Release the mobile source code already
2025-07-21 12:17:54 -04:00
Hundrec e6bb965d6b
Merge branch 'main' into develop-0.7.2 2025-07-22 00:13:47 +08:00
Baran b00376c88c 0.7.2 bumping is real 2025-07-21 10:33:13 -05:00
Hundrec ed86b326ab i forgot my milkshake 2025-07-18 09:03:05 -05:00
Hundrec 596c5813d7 Someone get me a typewriter 2025-07-18 16:09:16 +08:00
Hundrec ae68925911 They say you can never have enough Changelog 2025-07-18 16:09:16 +08:00
Hundrec d7c3799562 Even more Changelog entries 2025-07-18 16:09:16 +08:00
Hundrec 47ab14a855 More Changelog adjustments 2025-07-18 16:09:16 +08:00
Hundrec 940e165612 Another change 2025-07-18 16:09:16 +08:00
Hundrec 5181023887 How can I play this? There's no ' 2025-07-18 16:09:16 +08:00
Hundrec 32e774b005 Additional entries for 0.7.2 2025-07-18 16:09:16 +08:00
Hundrec c353cc54a1 god effing damnit 2025-07-18 15:45:53 +08:00
Abnormal 48d0798e5f fix bf perfect gold results anim 2025-07-18 14:03:31 +08:00
EliteMasterEric 0463b4e26b Fix a bug where flames would show during the new rank animation 2025-07-18 12:24:30 +08:00
MAJigsaw77 0c1842038f Update hmm.json 2025-07-18 04:49:03 +07:00
Karim Akra aa0b8cbbbe Fixed the main menu options not working on Desktop 2025-07-17 17:19:17 -04:00
EliteMasterEric 52cd4f6c36 one-line bug fix for freeplay flame positions :O 2025-07-18 05:09:17 +08:00
Santiago 96a1796905
readme update 2025-07-17 17:39:53 -03:00
EliteMasterEric 6be7e89222 OK I tested it like 15 times in a row so if the bug still exists I'm going to blow a gasket 2025-07-17 14:50:28 -04:00
EliteMasterEric abea46939f Fix a softlock when tapping multiple buttons on the main menu at the same time 2025-07-17 14:50:28 -04:00
EliteMasterEric 3a5f1e14cf This made the flag always false? I blame the mobile people for this 2025-07-17 14:50:28 -04:00
Karim Akra 849e413bb7 update assets 2025-07-18 02:47:05 +08:00
Mihai Alexandru b4a7bd7462
Fix compile pref. (#1439) 2025-07-17 21:32:10 +03:00
MoonDroid beb64528fb Properly manage swipe threshold on states. 2025-07-18 02:08:46 +08:00
luckydog7 eac940bccb temp credits font fix 2025-07-17 10:55:15 -07:00
MoonDroid aa1c71cafd Properly get the store's IAP in main menu 2025-07-17 10:54:02 -07:00
EliteMasterEric f4bedc359a Update Polymod version 2025-07-18 01:47:30 +08:00
Karim Akra 01428dd5cf
Fixed a tiny issue that caused cutscenes to softlock (#1432) 2025-07-17 12:51:06 +03:00
CrusherNotDrip 541bb78da9 Bump to 0.7.1 2025-07-16 21:51:46 -05:00
MoonDroid c6e19c8512
Merge pull request #1423 from FunkinCrew/feature/haptics-intensity-pref 2025-07-17 04:11:16 +07:00
MoonDroid e30a4ebb7b Merge branch 'master' into feature/haptics-intensity-pref 2025-07-17 04:08:51 +07:00
Cameron Taylor 949f409cff a few little FreeplayScore tidying perhaps 2025-07-17 04:28:52 +08:00
Cameron Taylor 4c5aa9743e a few little FreeplayState tidying perhaps 2025-07-17 04:28:52 +08:00
Cameron Taylor 3fa2b3574b potential fix for FUNK-2563 (incorrectly rounds to negative integer limit?) 2025-07-17 04:28:52 +08:00
TechnikTil 1e41ac3052 make currentCharacterId the actual current character ID. also get the style from the style id instead of the character 2025-07-16 23:26:22 +03:00
MoonDroid 936812ae1e assets submod 2025-07-17 03:05:16 +07:00
MoonDroid ad3bf2d2d2 Update haptic values to compensate for default 1 multiplier 2025-07-17 03:04:54 +07:00
kade-github 1b1c2a124b STOP MAKING IT PRIVATE!!! 2025-07-17 03:58:03 +08:00
kade-github 2aff2fa201 downscroll... 2025-07-17 03:58:03 +08:00
kade-github 7ec602f6ec forgot dis 2025-07-17 03:58:03 +08:00
kade-github 4fbeffb57c extra sync logic fix 2025-07-17 03:58:03 +08:00
kade-github f029a27a3f external devices and what not 2025-07-17 03:58:03 +08:00
sector-a 8a99fa4184
Add toggling the old icon by touching the player icon
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-17 02:22:17 +07:00
MAJigsaw77 f21b015292 Update hmm.json 2025-07-17 03:14:09 +08:00
Karim Akra bc8e35409b update assets submod to fix the stage vanishing when getting hit by can in practice mode 2025-07-17 03:01:25 +08:00
Karim Akra 006f1dce0a Fixed the crash in 2hot and blazin 2025-07-17 03:01:25 +08:00
Karim Akra 78186188d7 Revert "openalsoft audio fix"
This reverts commit 4029e92181.
2025-07-17 02:51:44 +08:00
Karim Akra 762486639e Revert "run da formatter"
This reverts commit b5bb9721da.
2025-07-17 02:51:44 +08:00
Abnormal b5bb9721da run da formatter 2025-07-16 10:29:48 -07:00
cyn0x8 4029e92181 openalsoft audio fix
Co-authored-by: Smokey <78874128+Smokey555@users.noreply.github.com>
Co-authored-by: Cobalt Bar <79053181+CobaltBar@users.noreply.github.com>
2025-07-16 10:29:48 -07:00
sector-a 9c7f87c225 Disable the nametag mosaic sequence on menu startup 2025-07-16 23:33:51 +08:00
sector-a 43420092f3 Change minimal intensity multiplier to 0.1 2025-07-16 17:34:41 +03:00
sector-a d8cd580535 Make haptics intensity on ios and android the same 2025-07-16 16:51:02 +03:00
sector-a 13c08b285d Add haptics intensity preference 2025-07-16 16:51:02 +03:00
Abnormal 6238b72d8c bump polymod to fix a pico mix crash 2025-07-16 21:26:49 +08:00
Eric bf92bf3f60 Update hmm.json 2025-07-15 18:21:25 -07:00
Cameron Taylor 6467cd75a8
IAP compiler conditional fix (#1416) 2025-07-16 01:39:12 +03:00
Karim Akra 32dc25bbf6 Fix the credits menu on iOS 2025-07-15 18:14:47 -04:00
Karim Akra 11cb409bd2 Fixed the crash in game over 2025-07-16 00:41:43 +03:00
Mihai Alexandru f245365ed3
Merge pull request #1413 from FunkinCrew/mob-320/controls-menu-back-button
[MOB-320] Add back button to controls menu.
2025-07-16 00:22:32 +03:00
Karim Akra e0d0230b88
Dont show the toast if the theres no debug message (#1405) 2025-07-16 00:17:22 +03:00
Cameron Taylor f8634e2b81 tidy: small preloader code removing 2025-07-16 00:54:35 +07:00
Cameron Taylor 4f68f63e2d preloader lookin alright on iOS now 2025-07-16 00:54:35 +07:00
Cameron Taylor e9e0567f8b preloader placement wips
more preloader placeholder wips
2025-07-16 00:54:35 +07:00
Cameron Taylor 8db768fd2a tidy(preloader): some variable renaming 2025-07-16 00:54:35 +07:00
Cameron Taylor cf814ee4e2 tidy(preloader): stop the preloader from spamming traces after completing 2025-07-16 00:54:35 +07:00
Mihai Alexandru 43b7be4e71
Merge branch 'master' into bugfix/android-toast-iap 2025-07-15 20:50:35 +03:00
MoonDroid 7d555b4155 Update credits 2025-07-15 20:47:11 +03:00
MAJigsaw77 88ad99c3ef Merge branch 'master' into bugfix/android-toast-iap 2025-07-15 20:33:44 +03:00
MAJigsaw77 d92b7ff3f5 Merge branch 'master' into bugfix/android-toast-iap 2025-07-15 20:33:19 +03:00
MoonDroid 66c6a78319 Properly set hasInitilaized on android 2025-07-16 00:32:52 +07:00
MoonDroid e6a2a09801 Make the IAP product value actually saved into the game save file. 2025-07-16 00:32:52 +07:00
MAJigsaw77 8944e07fe1 Use a separated case here. 2025-07-16 00:32:52 +07:00
MAJigsaw77 188260ea81 Correctly handle iap callbacks when purchasing. 2025-07-16 00:32:52 +07:00
Hundrec 22c6ce42ba Blazin' fix changelog entry 2025-07-16 00:53:17 +08:00
EliteMasterEric d8445fe54a Update assets submodule 2025-07-16 00:53:17 +08:00
Abnormal c3592ee6f5 bump versionnn to 0.7.2 FUUUUUCKKK 2025-07-15 19:47:10 +08:00
MAJigsaw77 e402328969 Merge branch 'master' into bugfix/android-toast-iap 2025-07-15 12:46:04 +03:00
Abnormal 150a1d5b0a erm......lol? 2025-07-15 17:42:06 +08:00
MAJigsaw77 d468477663 Dont show the toast if the theres no debug message 2025-07-15 12:27:20 +03:00
Abnormal ecaf51ef41 add 2 missing entires 2025-07-15 17:12:17 +08:00
Abnormal 05627a50d5 0.7.2 changeloggyyyyyyyy 2025-07-15 17:12:17 +08:00
kade-github efe333da92 fix jump note GOD DAM NIT 2025-07-15 15:11:13 +08:00
kade-github e946b54249 sync fixies... can't hurt 2025-07-15 15:11:13 +08:00
Abnormal 1d4a94041b enable traces only on debuggggg 2025-07-15 00:01:14 -07:00
Abnormal 11da19ce1e zack got pissed off about this in vc so im making a pr for this 2025-07-15 00:01:14 -07:00
Cameron Taylor 126ed3a67a use unicode in the iOS app title to force spacing 2025-07-15 14:54:35 +08:00
Hundrec 468197e74e 0.7.1 Changelog 2025-07-14 23:52:10 -07:00
Cameron Taylor 7f17ad8bb8
Merge pull request #1400 from FunkinCrew/jni-conditionals
quick android conditionals
2025-07-14 15:34:17 -04:00
Hundrec e9ef340c63 missed one 2025-07-14 13:49:24 -05:00
Cameron Taylor 61bda6c2c2
Merge pull request #1394 from FunkinCrew/freeplay-sound-fix
Freeplay sound fix and other little freeplay cleanups and tidyings
2025-07-14 14:48:28 -04:00
Cameron Taylor 07f649ca37 LetterSort was causing that freeplay sound bug 2025-07-14 14:47:24 -04:00
Cameron Taylor 11ecd07606 various tiny lil tidyings in FreeplayState 2025-07-14 14:47:24 -04:00
Cameron Taylor 822c5ba405 use controls.active instead of busy for FreeplayState 2025-07-14 14:47:24 -04:00
Cameron Taylor d61f89b0e4 make quick and easy little currentCapsule getter 2025-07-14 14:47:24 -04:00
Cameron Taylor 9dfae07225 capsule song text no longer exposed 2025-07-14 14:47:24 -04:00
Cameron Taylor 01fad012f2 quick android conditionals 2025-07-14 14:45:06 -04:00
Abnormal 9843f9549c final changelog for 0.7.0 2025-07-15 02:44:46 +08:00
Cameron Taylor 044106e8a9 WaveformDataParser memory optimize + speed optimize perhaps + refactor mini 2025-07-14 10:38:27 -07:00
Cameron Taylor d338be9270 removed some unused code in WaveformDataParser.hx 2025-07-14 10:38:27 -07:00
Cameron Taylor e4d3e18e4f charteditor: player and opponent toolboxes are disabled, so we don't want to run their handler code (since it initalizes them, which takes about 0.5s extra to load!) 2025-07-14 10:38:27 -07:00
Hundrec 5f5fff870c Update issue templates for Mobile 2025-07-14 08:25:10 -05:00
CrusherNotDrip 52acd86cdf bump versions to 0.7.0 2025-07-14 07:38:31 -05:00
Abnormal dd104365e7 bump flixel AGAIN 2025-07-14 08:54:56 +08:00
Abnormal b0581f728a bump flixel 2025-07-13 16:06:31 +08:00
MAJigsaw77 5e50432b30 Add Intent.FLAG_GRANT_WRITE_URI_PERMISSION. 2025-07-13 08:49:32 +03:00
MAJigsaw77 314d8af9c8 Some adjustments 2025-07-13 08:49:32 +03:00
MAJigsaw77 f91261f748 Small adjustment to ReloadAssetsDebugPlugin. 2025-07-13 08:49:32 +03:00
Karim Akra 0567849665 Added a button in options menu to open the data folder
The game also reloads mods after closing the folder!!

Co-Authored-By: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-07-13 08:49:32 +03:00
MAJigsaw77 a701e6a4a9 Some fixes. 2025-07-13 08:49:32 +03:00
MAJigsaw77 abfc4ca79c Fix formatting and properly delete folders recursevely. 2025-07-13 08:49:32 +03:00
Karim Akra 797a8bfcba fix the docy provider 2025-07-13 08:49:32 +03:00
MAJigsaw77 d70838cca9 Bruh what 2025-07-13 08:49:32 +03:00
MAJigsaw77 0d845154ef Add @:unreflective here. 2025-07-13 08:49:32 +03:00
MAJigsaw77 9e04db2c5c Adjustments 2025-07-13 08:49:32 +03:00
luckydog7 c0d3b9daa2 isChildDocument implementation 2025-07-13 08:49:32 +03:00
luckydog7 0f336ae0e6 Add provider 2025-07-13 08:49:32 +03:00
kade-github 8c8eedf17a sector!!!! 2025-07-12 19:05:04 +08:00
EliteMasterEric 793b533b88 Fix being able to modify final constants 2025-07-12 18:39:26 +08:00
EliteMasterEric 852a74c33d Bump Polymod version 2025-07-12 18:39:26 +08:00
EliteMasterEric bfdafd7f37 You can now access abstracts properly! 2025-07-12 18:39:26 +08:00
EliteMasterEric 37d0d1b14e Latest experimental Polymod 2025-07-12 18:39:26 +08:00
EliteMasterEric 2649e247fa Update Polymod and HScript to include the latest fixes. 2025-07-12 18:39:26 +08:00
EliteMasterEric fafe157a70 Update the variation list when switching difficulties forces a song switch. 2025-07-12 16:51:08 +08:00
kade-github 39a4292dc5 fix jump note 2025-07-12 16:48:48 +08:00
EliteMasterEric aad0a0afb6 Fix a crash related to pausing stage sounds on HTML5 2025-07-11 17:22:52 -05:00
Karim Akra f8516cfb4d Fix sustain trail notes being flipped on upscroll in keyboards on mobile 2025-07-09 13:36:43 -07:00
Hundrec 3987445bd6 Bump resync threshold to 40 again... 2025-07-09 19:14:49 +08:00
Abnormal eea829ca7d
[MOBILE] Freeplay swiping fixes (#1386)
* I Have No Idea What Zack Fixed Here Please Help Me

* I Have No Idea What Zack Fixed Here Please Help Me

* fix: Slight scroll velocity issue with diff swipes

---------

Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-09 11:11:57 +00:00
Abnormal d98628ca0f fix: Fix a bug preventing FNF Legacy files from being imported on macOS 2025-07-09 05:27:24 -05:00
kade-github a6b3eb0b81 right lined 2025-07-09 05:20:34 -05:00
Abnormal 49e64a517e fix animation indices for darnell and spooky kids 2025-07-09 04:56:48 -05:00
Abnormal ef9fd48ab2 update submod 2025-07-09 17:54:55 +08:00
fabs efdc869206 fix dot position on mobile 2025-07-09 01:19:15 -05:00
fabs 077e0c920f assets submod 2025-07-09 01:19:15 -05:00
fabs bb714f210b implement dots into freeplay 2025-07-09 01:19:15 -05:00
fabs f0a112f185 difficulty dot code 2025-07-09 01:19:15 -05:00
EliteMasterEric 1025fed57f Use cyn0x8's Sequence class to fix the nametags. 2025-07-09 01:02:55 -05:00
cyn0x8 9e182f70d2 timer sequence 2025-07-09 01:02:55 -05:00
Abnormal 87fea7674b fuck it remove this as well 2025-07-09 00:02:53 -04:00
Abnormal e309bac626 fix compiling error 2025-07-09 00:02:53 -04:00
luckydog7 8c6324641e fixed bug when notes are offset when touching in keyboard mode 2025-07-09 03:11:13 +07:00
Karim Akra 6b7b5d0bf7 fixed controls few menus with keyboard 2025-07-09 03:11:13 +07:00
Karim Akra a74dcbc6f9 Fix keyboard & gamepad support on menus and playstate 2025-07-09 03:11:13 +07:00
Abnormal d6d7a0886f remove a useless boolean from freeplay 2025-07-08 18:46:30 +08:00
Kolo 7e76cf6634 maz................................................................. 2025-07-07 18:27:40 -07:00
Lasercar 48013168ef Open hold note context menu if note is hold note 2025-07-07 18:27:14 -07:00
MoonDroid 1201a781c9
assets submod (#1375) 2025-07-08 00:56:03 +03:00
Karim Akra 9ad5126806 Set the gradle project directory to bin-bundle on bundle builds (& bump lime for the changes) 2025-07-08 03:52:10 +07:00
Karim Akra c2755a745c de-bump FlxAnimate 2025-07-08 04:29:14 +08:00
Abnormal a73b879fee add new desktop icons 2025-07-08 03:19:04 +08:00
VioletSnowLeopard e7c4b1ba38 start gameover retry music after stopping death quotes 2025-07-07 11:16:09 -04:00
Lasercar 62d24fcf4c Selection context menu fix
Can someone please tell me why there's a button to select everything in the selection context menu????
2025-07-07 11:04:11 -04:00
Abnormal 3b897417fb small scripted class additions...... 2025-07-07 10:47:09 -04:00
Kolo 7bb2336972 spare some script class pie for sparrow dawg 2025-07-07 10:47:09 -04:00
Abnormal f13eb5be53 multiple week 3 fixes
Co-authored-by: ShadzXD <136199318+ShadzXD@users.noreply.github.com>
2025-07-07 22:35:34 +08:00
Lasercar 7aa77a11cf Sort the default difficulties 2025-07-07 10:35:26 -04:00
Keoiki f54e140b65 Load FreeplayStyles on asset reload. 2025-07-07 07:16:28 -05:00
Kolo 0ea42e18e9 cancel tweens of txtCopyNotif 2025-07-07 04:07:05 -05:00
Abnormal a8a99c327d Restore "Fix several Polymod-related bugs" 2025-07-07 12:29:37 +08:00
Abnormal e2722434e0
fix: Fix playback rate being busted on mobile
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-06 15:56:03 +07:00
Mihai Alexandru a08ada7e69
Show toast on Android IAP purchase update.
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-06 15:47:16 +07:00
Cameron Taylor 21e5501835 difficulty touch controls implementation 2025-07-06 15:23:18 +07:00
Cameron Taylor 125aa0a438 some cute guard clauses 2025-07-06 15:23:18 +07:00
Cameron Taylor 6591fd8f2a remove some unused/redundant variables 2025-07-06 15:23:18 +07:00
Cameron Taylor b205a0b931 top left freeplay text grab stuff take it out 2025-07-06 15:23:18 +07:00
Cameron Taylor 7a6326b178 freeplay backingCard proper null safety 2025-07-06 15:23:18 +07:00
Cameron Taylor df1dbeaef0 tidy: removed unused import in Freeplay 2025-07-06 15:23:18 +07:00
Cameron Taylor 91a16f6dc3 put DifficultySprite into it's own class lil cleanup in progres 2025-07-06 15:23:18 +07:00
Cameron Taylor acd10ffbe5 some lil null safety fix for SwipeUtil 2025-07-06 15:23:18 +07:00
sector-a 86241d53da Add adaptive icon
Co-Authored-By: Karim Akra <144803230+KarimAkra@users.noreply.github.com>
2025-07-05 21:30:25 +03:00
Mihai Alexandru 99769cb50b
Merge pull request #1360 from FunkinCrew/feature/num-pref-dragging
Add dragging for the NumberPreferenceItem
2025-07-05 21:21:35 +03:00
MAJigsaw77 9036f94970 Remove traces from NumberPreferenceItem. 2025-07-05 21:18:04 +03:00
sector-a f00f631db8
Merge branch 'master' into feature/num-pref-dragging 2025-07-05 18:42:15 +03:00
sector-a d0b64fe4da Add dragging for the NumberPreferenceItem 2025-07-05 18:35:23 +03:00
kade-github f378c0adb6 comments and qol stuff 2025-07-04 18:53:58 -07:00
Hundrec ae6562f42b
change resync threshold back to 30 2025-07-04 03:39:38 +07:00
kade-github 313cf4b253 new music 2025-07-02 17:40:16 -05:00
Hundrec dbd52a5bf1 Nudge notification box away from playbar
Thanks Kolo and Lasercar!

Co-Authored-By: Kolo <67389779+koloindacrib@users.noreply.github.com>
Co-Authored-By: Lasercar <64717068+lasercar@users.noreply.github.com>
2025-07-02 14:33:10 -05:00
Mihai Alexandru 810162de27
mobile: update extension-iapcore to 1.0..3. (#1346) 2025-07-03 00:24:22 +07:00
Abnormal 711656bcf4 run haxe formatter on project.hxp and assets 2025-07-01 17:29:02 +08:00
Abnormal 95262b316a bring them back but for mobile 2025-07-01 14:11:39 +08:00
Abnormal 82bbb9d30d use delta time for the conductor update 2025-07-01 14:11:39 +08:00
Hundrec b06a28e79c Changelog's back! 2025-06-30 12:17:27 -05:00
kade-github 811cc4b4b0 hacky fix to get the game out 2025-06-30 19:08:38 +08:00
kade-github 00a4f47e42 no offsets in the charting state 2025-06-30 18:37:00 +08:00
Abnormal d703609a0a remove conductor arguments from update() 2025-06-30 14:49:01 +08:00
kade-github 2c035d77cc the newline fix of the century 2025-06-30 00:00:02 -05:00
T5mpler 96d1324af1 Fix a bug where holding down a note after dropping a previous one would sometimes not make its cover show. 2025-06-29 22:30:29 -05:00
Abnormal 543d6454f6 fix: Fix a hang when playtesting Week 6 songs in Story Mode 2025-06-29 17:38:10 -05:00
kade-github c414de48f2 non-negative offsets 2025-06-29 17:34:23 +08:00
kade-github 70fbd200bd video offsets 2025-06-29 10:04:25 +03:00
Kade ec10f273b6
Merge pull request #1298 from FunkinCrew/kade-github/new-offsets 2025-06-28 22:44:27 -07:00
MAJigsaw77 2f223f84f5 Add FEATURE_DEBUG_MENU and FEATURE_ANIMATION_EDITOR defines. 2025-06-29 07:45:07 +03:00
Abnormal 32f32ba0bd blacklist FlxSave 2025-06-28 20:52:41 -05:00
EliteMasterEric 25bf04d581 Implement a stub Discord API for builds where the client is disabled. 2025-06-28 19:23:34 -05:00
EliteMasterEric f036593037 Fix error messages from the game trying to pre-cache the note style 2025-06-28 19:23:34 -05:00
kade-github 9ec7a5068a
change RESYNC_THRESHOLD to 70 2025-06-28 16:17:56 -07:00
kade-github 55e1967423
Merge branch 'master' into kade-github/new-offsets 2025-06-28 13:55:32 -07:00
kade-github d3207de231
fixes 2025-06-28 13:47:28 -07:00
kade-github afc08e285c
Bug Fixes for Offsets 2025-06-28 13:47:28 -07:00
kade-github 28fc5109d4
Offset menu Final maybe 2025-06-28 13:47:27 -07:00
kade-github 2b5ba8dfa9
Offsets menu wip 2025-06-28 13:47:27 -07:00
kade-github 0ef1df33c9
calculate note y is in GRhythmUtil now 2025-06-28 13:47:07 -07:00
kade-github b3aa6a0b8d
Hit Window process in it's own file 2025-06-28 13:47:07 -07:00
Mihai Alexandru 126da44a95
Merge pull request #1310 from FunkinCrew/resync-vocals-song-start
Resync vocals on song start
2025-06-28 14:39:12 +03:00
Mihai Alexandru f6d9acb63a
Merge branch 'master' into resync-vocals-song-start 2025-06-28 14:32:01 +03:00
Mihai Alexandru f78431da3c
Merge pull request #1261 from FunkinCrew/pr-2655/lemz1/recycle-credits-lines
[PUBLIC PR] Recycle Credits Lines
2025-06-28 14:29:34 +03:00
Mihai Alexandru 21bbef5542
Merge branch 'master' into pr-2655/lemz1/recycle-credits-lines 2025-06-28 14:18:23 +03:00
Abnormal 46c40f67cc the lime bump of the century 2025-06-28 18:59:38 +08:00
Mihai Alexandru cdfce1af12
Merge pull request #1326 from FunkinCrew/touch-controls-define-gets-some-actual-use
Allow `TouchUtil` functions to be used on desktop
2025-06-28 13:51:45 +03:00
Mihai Alexandru 8aff75b308
Merge branch 'master' into touch-controls-define-gets-some-actual-use 2025-06-28 13:43:28 +03:00
Abnormal 58f101bf01 chore: Run Haxe Formatter on the source code 2025-06-28 18:41:49 +08:00
Hundrec c49666c4b4
Fix remaining smoothLerp deprecations 2025-06-28 13:18:24 +03:00
Abnormal 73ec37a473
Move resync threshold to a constant variable 2025-06-28 10:50:59 +03:00
MAJigsaw77 adf2b49a72 update haxeui-flixel. 2025-06-28 02:32:59 -05:00
MAJigsaw77 a11bde6f76 update haxeui-core and remove flixel-text-input. 2025-06-28 02:32:59 -05:00
Hundrec 8b6b91cc23 Fix build errors for MathUtil 2025-06-28 01:11:18 -05:00
cyn0x8 94eae116c7 MathUtil additions + lerp fix 2025-06-28 01:11:18 -05:00
MoonDroid faadf406c3
Merge pull request #1321 from FunkinCrew/moon/hacky-gc-calls 2025-06-28 12:09:11 +07:00
Abnormal d4c7339373 allow TouchUtil functions to be used outside of FEATURE_TOUCH_CONTROLS 2025-06-27 22:46:00 -05:00
Hundrec 55d34c3c9d Disable keys before Senpai dialogue 2025-06-27 20:06:16 -05:00
Abnormal 7ed374f1e5 hundrec's suggestion 2025-06-28 08:54:37 +08:00
Abnormal 4e87c7d40c added a bunch of new changelog entries 2025-06-28 08:54:37 +08:00
Mihai Alexandru 377697a358
Limit gyro panning 2025-06-28 01:23:32 +07:00
MAJigsaw77 32701d9ab0 fix a tiny mistake 2025-06-27 03:59:02 -04:00
MoonDroid c897d89b35 fix: Properly check if touch overlaps difficulty to prevent double-swiping 2025-06-27 03:59:02 -04:00
MoonDroid 1f65a9c5a1 Update lime ref 2025-06-27 03:59:02 -04:00
MoonDroid d061ba4e43 Update grig.audio ref 2025-06-27 03:59:02 -04:00
MoonDroid d4d52a1394 Exclude titleEnter sprite from compression 2025-06-27 03:59:02 -04:00
MoonDroid cedf17fb99 fix: Fix temporary softlocking in main-menu 2025-06-27 03:59:02 -04:00
MoonDroid 97620e6038 chore: Reduce margin of error of desyncs to 30 2025-06-27 03:59:02 -04:00
MoonDroid 1d3b5eb246 Attempt to fix callback mishap for IAP
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-06-27 03:59:02 -04:00
Abnormal 40c292127d add mobile platforms to platformutil 2025-06-27 01:33:58 -04:00
Hundrec 79cc20ffe8 fix car reset positions + remove redundant resets 2025-06-26 23:41:02 -05:00
Abnormal 4eb3c764ab is that... *gulps* a submod update (lasercar charting field fix) 2025-06-26 22:39:26 -05:00
Hundrec e2efd2bc81 adjust song metadata trace 2025-06-26 22:39:26 -05:00
Lasercar 894d8cb463 Fix chart(er)
The charter is literally never ever set in the new or clone function of the songMetadata. HOW????
2025-06-26 22:39:26 -05:00
Abnormal 3fd80504e3 fix the most annoying chart editor bug ever 2025-06-27 10:17:48 +08:00
MoonDroid 42ec7f7796 Call GC only for IPhones above 12 2025-06-27 07:31:32 +07:00
MoonDroid bc4c944d4d Call GC after results if there is no stickers. 2025-06-27 07:28:53 +07:00
MoonDroid 715d2ba65f feat: Add DeviceUtil class 2025-06-27 06:44:35 +07:00
MoonDroid 067b56c5fa
Merge pull request #1320 from FunkinCrew/patch/default-astc-value 2025-06-27 05:43:58 +07:00
Karim Akra d73eb4e392
minor spelling mistake (Thanks Abnormal)
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-06-27 01:11:49 +03:00
Karim Akra 5a19397481 Add a default value for FEATURE_COMPRESSED_TEXTURES on project.hxp 2025-06-27 00:54:03 +03:00
VioletSnowLeopard eb80a52841 fix null safety for CompiledClassList.get
Co-Authored-By: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
2025-06-26 16:48:31 +08:00
VioletSnowLeopard 57d0871b5c null safe registries in funkin.data 2025-06-26 16:48:31 +08:00
Hundrec 066ed53a6d minor spelling mistake 2025-06-26 16:42:45 +08:00
Abnormal 6f35209d63 add hundrec's changelog revisions
Co-authored-by: Hundrec <hundrecard@gmail.com>
2025-06-26 16:42:45 +08:00
MAJigsaw77 5be5abf4c9 chore: fix multiple warnings. 2025-06-26 04:00:57 -04:00
EliteMasterEric ab89cd33f9 What a stupid change, what kind of dumbass made this? 2025-06-26 02:48:46 -05:00
Abnormal 7febe5b5ad update submod for optimized shit 2025-06-26 02:10:47 -04:00
Abnormal 4cc922c373 add the long awaited tap to enter for mobile.... 2025-06-26 02:10:47 -04:00
Abnormal 4557a681d1 This desync is Pissing me off... I'm the original Starwalker 2025-06-26 00:17:19 -05:00
EliteMasterEric 2e99737485 Update hmm.json 2025-06-26 12:21:25 +08:00
Cameron Taylor 7db71574d1 TracyProfiler.hx more frame mark functions 2025-06-26 12:21:25 +08:00
Hundrec b1376f7401 Hundrec's second batch of charting fixes 2025-06-26 12:14:38 +08:00
Hyper_ 06a440f21c fix: (and refactor) Fix some issues with chart editor sustain trails
Fixes the sustain height not being updated when undoing/redoing length commands
Fixes hanging duplicate sustain trail when dragging the notes
Refactored the displayed hold note sprite kill checks and removed an unnecessary check
2025-06-25 23:21:02 -04:00
Lasercar 6dcec592f4 mute/ zero volume disables visualiser 2025-06-26 11:00:05 +08:00
Hundrec a0d3f8ec55 default gamepad freeplay jump binds
Co-Authored-By: MrMadera <90923803+mrmadera@users.noreply.github.com>
2025-06-25 21:17:11 -05:00
EliteMasterEric 9f9af722ca Fix a breaking build error on HTML5 2025-06-25 21:05:57 -05:00
Karim Akra 3962989f83
Merge pull request #1306 from FunkinCrew/null-safety/fix-touch-hitboxes
Fix wonky main menu hitboxes thanks to recent null-safety changes
2025-06-26 01:29:34 +03:00
Karim Akra b3d1adbd7f make menuItems nullable and initialize it inside of create() 2025-06-26 01:14:10 +03:00
MoonDroid cf0da45dd8 fix: Call camera reset BEFORE menuItems to prevent wonky touch hitboxes
sigh!!
2025-06-26 04:56:15 +07:00
MoonDroid 68695329cf Fix compile errors related to null-safety 2025-06-25 14:32:59 -05:00
lemz 1b68c3a8d6 squashed commits 2025-06-25 13:45:43 -05:00
EliteMasterEric 647ce880e1 Add a bunch more classes to null safety. 2025-06-25 13:42:24 -05:00
EliteMasterEric e9915e52fa Fix compile issues. 2025-06-25 09:07:48 -04:00
Hyper_ 18fe868233 chore: Add null-safety for some classes in funkin.ui 2025-06-25 09:07:48 -04:00
EliteMasterEric 0869362fa1 Fix a compilation issue. 2025-06-25 08:36:19 -04:00
Lasercar 87a09cae21 Null safe some graphics classes 2025-06-25 08:36:19 -04:00
Abnormal 4766a92946 Run Haxe Formatter on every script within preload/scripts 2025-06-25 18:34:24 +08:00
MoonDroid 74b30c0be4 feat: Properly call pause() on tabbing out, including for conversations and cutscenes 2025-06-24 18:44:27 -04:00
MoonDroid d0ff60ad0a feat: Make cutscene/conversation pauses call the pause function 2025-06-24 18:44:27 -04:00
MoonDroid 1dd6fb8dd4 chore: Use Preferences.autoPause instead of FlxG.autoPause 2025-06-24 18:44:27 -04:00
MoonDroid 2042f3db8a refactor: Rewrite how pause() works in PlayState and adding different modes 2025-06-24 18:44:27 -04:00
MoonDroid b67cbc132d assets submod 2025-06-24 18:44:27 -04:00
Abnormal 720d279f89 okay well that didn't work 2025-06-24 17:39:38 -04:00
Abnormal 97754e5ed3 wonder if this fixes it 2025-06-24 17:39:38 -04:00
Abnormal e2e8c383cd hundrec's req changes
Co-authored-by: Kolo <67389779+KoloInDaCrib@users.noreply.github.com>
2025-06-24 17:39:38 -04:00
Kolo 19d1a8c593 remove the greed from weekend 1's title 2025-06-24 17:39:38 -04:00
Abnormal 8dd007a7c2 the evil is defeated 2025-06-24 17:17:31 -04:00
Abnormal 3747b94246 fix: Check if TERM starts with xterm instead of directly checking 2025-06-24 17:17:31 -04:00
VioletSnowLeopard 7cc9464573 refresh song list when changing difficulties 2025-06-24 16:35:12 -04:00
Abnormal 7b9bce3b4e fix: Fix pixel strumline being weird as shit on downscroll 2025-06-25 03:56:22 +08:00
Hundrec 91550181f5 Remove misses from Gold (Perfect) debug 2025-06-24 14:27:00 -05:00
Abnormal c5308ccbb9 feat: add perfect (gold) to results debug 2025-06-24 14:27:00 -05:00
anysad dcac362003 bye combomilestone comments 2025-06-23 23:31:06 -05:00
Abnormal ae51c2ea5a update submod 2025-06-23 21:40:19 -05:00
Hyper_ 905181c9af Add labels for current beat and step in ChartEditorState (replaces previous display) 2025-06-23 21:40:19 -05:00
Hyper_ 11d9998e5c Fix Debug Results not showing proper rank 2025-06-23 21:25:40 -05:00
Hyper_ 37dc66bc18 i hate these yanderedev ass if-elses but I just wanna fix this bug 2025-06-23 19:26:52 -04:00
MoonDroid 74627795d2 Fix compile-time error for desktop builds 2025-06-23 17:06:48 -05:00
EliteMasterEric 903ca851bc Disable CI builds on Android for now. 2025-06-23 16:35:34 -05:00
sector-a 24c469dc31
Merge pull request #1287 from FunkinCrew/feature/increase-diff-hitbox
Hitbox changes for Freeplay's difficulty sprite
2025-06-24 00:28:18 +03:00
cyn0x8 eb6becc03f scriptable class changes 2025-06-23 17:24:36 -04:00
Abnormal fbd80ea41f kolo........................................................................................................................................
Co-authored-by: Kolo <67389779+KoloInDaCrib@users.noreply.github.com>
2025-06-23 17:13:07 -04:00
Kolo ccd0148e9b easy pico shall not be easy default....... 2025-06-23 17:13:07 -04:00
MoonDroid 3a7379e851 fix: Decrease boundaries for diff swipes and add a swipe check. 2025-06-24 03:58:34 +07:00
MoonDroid a7055efb27 fix: Prevent wacky multi-swipes on difficulty sprite 2025-06-24 03:57:46 +07:00
MoonDroid 98cd45453b fix: Increase hitbox vertically for difficulty sprite 2025-06-24 03:56:59 +07:00
Hyper_ c13167ece8 chore: Add null-safety for Leaderboards and Medals 2025-06-23 16:37:17 -04:00
VioletSnowLeopard 7d9a9f452d null safety for legacy importer 2025-06-23 16:34:17 -04:00
Abnormal c30b519bc4 chore: Add null safety for most of the classes in funkin.audio.* 2025-06-23 16:20:40 -04:00
Lasercar 9b06bd6b11 NuN safety 2025-06-23 16:05:43 -04:00
Lasercar f3db69cca8 Null safety
For real this time!
2025-06-23 15:45:27 -04:00
Lasercar 9174b83c93 Text Null Safety 2025-06-23 15:20:06 -04:00
anysad 74a8b8862e goodbye nulls! 2025-06-23 15:07:03 -04:00
Hyper_ 88ed66affa chore: Add null safety to various utility and plugin classes
And add a bit of error handling to CharSelectGF & CharSelectSubState

Co-Authored-By: Linus Torvalds <torvalds@linux-foundation.org>
2025-06-23 14:13:35 -04:00
Lasercar 3ac2a02291 funkin null safe 2025-06-23 13:49:32 -04:00
sector-a c1d4bba813
Merge pull request #1257 from FunkinCrew/mobile/button-fixes
Fix various menu button issues for Mobile
2025-06-23 17:06:39 +03:00
MoonDroid 80f3fb6150 fix: the stupid fucking alpha i fucking hate you i hope you DIE
i love you alpha -sigma
2025-06-23 20:57:50 +07:00
MoonDroid 94742eb9ba fix: Properly play the back button animation in Freeplay 2025-06-23 20:21:47 +07:00
MoonDroid 5c06d263b2 fix: Prevent the buttons to be pressed mid-transition to also prevent softlocking
I HATE THIS
2025-06-23 20:21:31 +07:00
Abnormal be60e52725 fix: Fix the stage editor crashing if an FNFS file is loaded through the Recent File section 2025-06-23 05:54:51 +08:00
Hundrec 9e07f5dd5a forgor a semicolon 2025-06-23 04:51:40 +08:00
Hundrec f1bef04165 Unlock Pico, restore input offsets on Desktop 2025-06-23 04:51:40 +08:00
MoonDroid 9687cff9d4 assets submod 2025-06-22 15:49:32 -05:00
Kolo f9c1f7a5f7 clear up styleSheet be4 entering 2025-06-23 03:02:19 +08:00
Lasercar 3d3e2bd378 Intro done right 2025-06-19 22:18:26 -05:00
Abnormal 9804111583 [insert the name of the person that added an extra check for onConfirm idk man]........................................................................................................................................................................................... 2025-06-19 22:15:01 -05:00
Eric 7cbb896a57
Fix several script errors (#1258) 2025-06-19 23:25:40 +00:00
Kolo 0001017c00 the grand reopening 2025-06-19 17:57:12 -04:00
Eric 7d6a4cb763
Changelog for mobile build (#1202)
* First draft of the changelog for mobile build

* first batch of public prs

* mention astc (suggestion by kade)

* add the remaining main repo prs

* ALL OF THEM. ARE DONE.

* some adjustments

* mention haptics

* Some minor cleanup.

---------

Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-06-19 21:35:38 +00:00
MoonDroid fee5ab49af assets submod 2025-06-19 17:31:13 -04:00
MoonDroid 5201160973 assets submod 2025-06-19 17:31:13 -04:00
MoonDroid 4772dfdc13 Prevent overlapping transitions and checks for both backbutton and optionsbutton
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-06-19 22:12:13 +07:00
MoonDroid 9e3efc0de7 fix: Prevent options back-queuing 2025-06-19 22:09:44 +07:00
MoonDroid c4d24e6d3e refactor: Rework both backButton and optionsButton for better callbacks and readability
Co-authored-by: Mihai Alexandru <77043862+MAJigsaw77@users.noreply.github.com>
2025-06-19 22:07:27 +07:00
MoonDroid fc82b79c9a fix: Prevent back queueing in Options 2025-06-19 17:08:50 +07:00
MoonDroid a98f6f9778 fix: Prevent queuing the back button in Main Menu 2025-06-19 17:08:02 +07:00
MoonDroid 4ca42c3975 fix: Add missing import
hi kade
2025-06-19 17:07:34 +07:00
MoonDroid 51127dfd87 refactor: Change how callbacks are called and added extra checks to avoid softlocking for BackButton 2025-06-19 17:07:18 +07:00
MoonDroid cae7c8a785 fix: Properly check if the state is busy or not for back button in Freeplay 2025-06-19 17:06:43 +07:00
CrusherNotDrip 204501779d This should be 0.0 2025-06-18 22:46:01 -05:00
Abnormal d7c83a5b70 fix a syntax error 2025-06-18 19:53:53 -04:00
Lasercar 4e31003a0f New highscore plays twice fix 2025-06-18 19:53:53 -04:00
Hyper_ cce8c18822 Reduce calls to hold note trail graphic update 2025-06-18 13:02:01 -07:00
zackaryowo ea6cb75b77 A different approach
Let's just override the original implementation with our own!
2025-06-18 13:01:16 -07:00
zackaryowo 9bd2c0b13b Fix dialogue hanging bug
...wait, it's just one line?
2025-06-18 13:01:16 -07:00
GitRan af716f9273 Allow disabling cool funcitons !! 2025-06-18 13:01:16 -07:00
GitRan 88d0e8c3b0 FunkinTypeText: Account for dialogue text wrapping 2025-06-18 13:01:16 -07:00
MoonDroid 6114dfcedb
Merge pull request #1185 from FunkinCrew/feature/mobile-unlock-everything 2025-06-18 18:32:09 +07:00
MoonDroid 52d891c8ff fix: Prevent char select transition to be spam-triggered in Freeplay 2025-06-18 18:31:26 +07:00
sector-a d040e1f72f
assets submod 2025-06-18 18:12:43 +07:00
Mihai Alexandru 8393c789e2
admob: dont run interstitial ads within the rank bg tween.
Co-authored-by: Hundrec <hundrecard@gmail.com>
2025-06-18 17:58:22 +07:00
JackXson-Real 39104fe77f "Auto Pause" -> "Pause on Unfocus" 2025-06-18 01:54:03 -05:00
EliteMasterEric 0e9bb20592 Use a version of OpenFL with improved shader error handling 2025-06-17 16:56:31 -07:00
Kolo 56a18e1cf6 2bugs2fix 2025-06-17 19:17:27 -04:00
EliteMasterEric 948030ef1d Fix several null reference issues tied to the Game Over substate. 2025-06-17 17:19:36 -05:00
Kade 8dce8afdfc add shader teehee 2025-06-17 17:13:43 -05:00
kade-github e7c6798f44 remove unused imports 2025-06-17 17:13:43 -05:00
kade-github 5482dee750 Stop everything, kris get the colorTransform 2025-06-17 17:13:43 -05:00
Lasercar 5549fddec3 Get deselected 2025-06-17 16:50:08 -05:00
Lasercar 65461d839b Close the toolboxes 2025-06-17 16:50:08 -05:00
Hundrec 2a63c1a7ba Stage Editor exit button rename
Co-Authored-By: Lasercar <64717068+lasercar@users.noreply.github.com>
2025-06-17 17:11:00 -04:00
Lasercar fee29f69ec I.. quit (to the menu)! 2025-06-17 17:11:00 -04:00
Lasercar 539720f84d There's a reason it's called the MAIN menu 2025-06-17 17:11:00 -04:00
Lasercar 576f8e54ff Stage editor - Ctrl+N new stage
Also windows target configuration preset for straight to stage editor (not to be confused with the stage builder)
2025-06-17 17:11:00 -04:00
Kade 50ca508fdd Exclude the censored versions for diff platforms 2025-06-17 16:57:11 -04:00
Abnormal 8824a382b9 update submod for censored cutscenes 2025-06-17 16:57:11 -04:00
Hundrec d6ec32f334
assets submod for close button fix (#1241) 2025-06-17 20:18:04 +00:00
Kade d356cfaee6 bump lime-mobile for linux ndlls 2025-06-17 15:13:29 -04:00
EliteMasterEric 49eff01afd Fixed locked characters not showing up properly when selected 2025-06-17 15:08:48 -04:00
EliteMasterEric c4aff95886 Fix inverted condition (whoops) 2025-06-17 15:08:48 -04:00
EliteMasterEric 9f41e22428 Always disable character unlock animations when UNLOCK_EVERYTHING is enabled 2025-06-17 15:08:48 -04:00
EliteMasterEric 123c9396ba Apply UNLOCK_EVERYTHING on mobile by default. 2025-06-17 15:08:48 -04:00
Lasercar 136a5dfad4 Fix Are you sure?
Also they now dance to Artistic Expression
2025-06-18 02:54:37 +08:00
Abnormal f23eddcf2c
forgot vocals aren't included (#1240)
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
2025-06-17 18:49:51 +00:00
Mihai Alexandru 13d8127e75
Merge pull request #1237 from FunkinCrew/gyro-damping
Gyro damping
2025-06-17 17:42:31 +03:00
MAJigsaw77 7d0772170f Merge branch 'master' into gyro-damping 2025-06-17 17:32:25 +03:00
Mihai Alexandru 43bf102d68
Merge pull request #1093 from FunkinCrew/bugfix/ios-simulator
Improvements to iOS simulator, and iOS build documentation
2025-06-17 08:30:40 +03:00
Mihai Alexandru 24101d654d
Merge branch 'master' into bugfix/ios-simulator 2025-06-17 08:29:46 +03:00
Abnormal e82b578eb8 fix a crash when returning to the chart editor on release builds 2025-06-16 23:41:45 -05:00
Hundrec 3eace5a7c8
Adjust GCD MathUtil comments 2025-06-17 12:32:11 +08:00
Cameron Taylor 153f2be177 soften (and sorta limit?) the panning on main menu 2025-06-16 19:51:54 -04:00
Cameron Taylor 380f9e70d5 document the GCD function in MathUtil 2025-06-16 19:50:28 -04:00
Kade ff2dff0635
Merge pull request #1235 from FunkinCrew/html5-build-fix-gyro 2025-06-16 16:37:11 -07:00
EliteMasterEric 24d1116deb Preload all the graphics of a note style before the song starts, greatly reduces stutters early in the song. 2025-06-16 16:34:07 -07:00
EliteMasterEric 8e085171d5 Updated OpenFL to fix HTML5 build issues, tied to gyro functions 2025-06-16 18:37:20 -04:00
Lasercar 4819a74c29 Charselect remember character 2025-06-16 16:08:17 -04:00
Eric f95258358c
Format and re-arrange project.hxp (#1233)
* Format and re-arrange project.hxp

* Remove merge conflict
2025-06-16 19:34:03 +00:00
Eric 962d0b0dc2
Document how to install mods on mobile (#1219)
* Gotta document how to install mods on mobile

* iOS mod installation steps

* Update mod installation docs for all platforms

* Fix weird merge issue in mod install docs.

---------

Co-authored-by: Hundrec <hundrecard@gmail.com>
2025-06-16 16:17:18 +00:00
100ec 6fa4280e31 Re-enable Input Offsets menu for Desktop oopsies 2025-06-16 09:13:05 -07:00
Hundrec 0d2a737a8a finish a comment in project.hxp 2025-06-16 09:12:35 -07:00
Kade 779919d11b
Merge pull request #1224 from FunkinCrew/doppelganger-assets-update 2025-06-16 09:11:57 -07:00
100ec 4a9e8490fc Bump assets for doppelganger cutscene crash 2025-06-16 10:05:35 -05:00
Abnormal 80db44be2b bump flxanimate to fix an issue with the turntable lights 2025-06-16 00:45:48 -04:00
Eric 0f85b4a85d
Update Lime submodule to fix Github Actions build issues (#1226)
* Update Lime submodule to fix build issues

* Disable automatic iOS builds in Github Actions until we fix build issues
2025-06-16 04:44:02 +00:00
Hyper_ c0e0523651 fix: Clear waveform data when destroying audio
This fixes an issue where recycled sounds would use the previous sound's waveform data.
2025-06-16 02:45:44 +08:00
Abnormal 41a246c9a5
add missing 0.6.4 prs
the people will get their fixed debris in pico great results animation
2025-06-14 20:36:37 -05:00
Abnormal cfed20983b add the missing pull requests from 0.6.4 2025-06-14 20:33:10 -05:00
Mihai Alexandru 2273a1b346
Merge pull request #1214 from FunkinCrew/back-button-tweaks
Back Button fixes
2025-06-14 22:11:29 +03:00
MAJigsaw77 a69e08e986 Merge branch 'master' into back-button-tweaks 2025-06-14 22:06:18 +03:00
Mihai Alexandru 1c7abb6391
Merge pull request #1216 from FunkinCrew/bugfix/fix-menus-widescreen-alignment
[WIDE SCREE] Fix some aligment for the UI in some menus
2025-06-14 22:01:45 +03:00
MAJigsaw77 839ff43123 Merge branch 'master' into bugfix/fix-menus-widescreen-alignment 2025-06-14 21:30:03 +03:00
Mihai Alexandru 84e0104984
Merge pull request #1220 from FunkinCrew/gyro
gyroscope panning funzies on main menu
2025-06-14 21:28:01 +03:00
MAJigsaw77 092732a535 Merge branch 'gyro' of https://github.com/FunkinCrew/Funkin-secret into gyro 2025-06-14 21:26:52 +03:00
MAJigsaw77 ff6aea9efd hmm update the refs for android gyro fixes 2025-06-14 21:26:37 +03:00
Mihai Alexandru f1c15c8a84
Merge branch 'master' into gyro 2025-06-14 21:22:25 +03:00
Cameron Taylor beab53a489 hmm update for gyro related branches 2025-06-13 22:37:05 -04:00
Abnormal 8bbdc8c0f4
Merge pull request #1189 from FunkinCrew/feat/naughtyness-off-mobile
Add `FEATURE_NAUGHTYNESS` and `CENSOR_EXPLITIVES` flags
2025-06-13 21:36:17 -05:00
Abnormal 80948ba4ad update assets submod to fix missing imports 2025-06-13 21:26:21 -05:00
Abnormal 5c2cc82340 missed a spot 2025-06-13 21:17:14 -04:00
EliteMasterEric d8a6abc48d Rename the variable to CENSOR_EXPLETIVES 2025-06-13 21:17:09 -04:00
EliteMasterEric 5cbea2851c Update assets submodule 2025-06-13 21:16:54 -04:00
EliteMasterEric 2cf29a67d9 Added a separate variable specifically for mobile censorship. 2025-06-13 21:16:42 -04:00
Abnormal e8cd87c1f1 Add FEATURE_NAUGHTYNESS and turn it off for mobile builds 2025-06-13 21:16:41 -04:00
Abnormal 075f03235d fix: Fix an issue where the album didn't update when switching variations 2025-06-13 21:09:10 -04:00
Cameron Taylor fcb5fe85ff gyroscope panning funzies on main menu 2025-06-13 20:47:09 -04:00
Abnormal bbd598a560 add the remaining asset changes that got lost in the rebase 2025-06-13 11:34:26 -05:00
EliteMasterEric 5ca21d1bb3 Update Polymod to include some moderate optimizations 2025-06-12 23:52:36 -07:00
MoonDroid a9ba2a7a1c
Merge pull request #1213 from FunkinCrew/feature/various-haptic-changes 2025-06-13 11:12:48 +07:00
KarimAkra a2c0625137 Fixed title state aligment 2025-06-13 07:10:55 +03:00
KarimAkra d0d1d3c376 story menu state aligments 2025-06-13 07:10:43 +03:00
Karim Akra d0fe228e21
Scale the pico accept backing card for wide screen 2025-06-13 09:53:52 +07:00
MoonDroid 1b7dc5f1ac fix: Make backing out of options instant 2025-06-13 09:45:55 +07:00
MoonDroid ea0e4ee56d fix: Remove all callbacks when destroyed 2025-06-13 09:45:36 +07:00
MoonDroid 1b1d0a978d Play cancelMenu when backing out 2025-06-13 09:45:19 +07:00
sector-a bf007e2a2c art submod 2025-06-13 05:01:57 +03:00
sector-a aa24e08fdb Merge branch 'master' into feature/various-haptic-changes 2025-06-13 05:00:36 +03:00
sector-a d72b2bb2da assets submod 2025-06-13 04:57:29 +03:00
sector-a 49693f06e9 winter horrorland haptics 2025-06-13 04:57:23 +03:00
KarimAkra 99ad45997e Push the strums a bit back to the left 2025-06-13 04:21:21 +03:00
MoonDroid 849553e0f0
Merge pull request #1212 from FunkinCrew/character-select-extensions 2025-06-13 06:52:58 +07:00
KarimAkra 48ca0ecef3 Update art 2025-06-13 02:48:29 +03:00
KarimAkra 403c6250f8 Merge branch 'master' into character-select-extensions 2025-06-13 02:48:19 +03:00
KarimAkra ffbc8c80c8 nudge the speakers a bit to cover the curtain properly 2025-06-13 02:42:05 +03:00
Karim Akra aacb200638
Merge pull request #1207 from FunkinCrew/mobile/freeplay-tweaks
Couple of Freeplay tweaks for final release
2025-06-13 02:04:25 +03:00
KarimAkra 603e370908 assets submodule !! 2025-06-13 01:29:26 +03:00
MoonDroid 43d8b522cb
Merge pull request #1210 from FunkinCrew/bugfix/freeze-video-restarting 2025-06-13 05:24:07 +07:00
KarimAkra b75cfcb833 Fixed last few issues with ios for notch and centering on character select 2025-06-13 01:18:22 +03:00
KarimAkra dc800dc48e added logicalSize to FullScreenScaleMode 2025-06-13 00:32:09 +03:00
MAJigsaw77 9706a55eca Merge branch 'master' into bugfix/freeze-video-restarting 2025-06-13 00:04:07 +03:00
KarimAkra 6b11f8b852 slight refactor for FullScreenScaleMode to fix some wide screen related issue 2025-06-12 23:45:50 +03:00
KutikiPlayz 6ad9ffc7f9 notes move freaking normally 2025-06-12 13:21:39 -07:00
MAJigsaw77 895eeed852 fix: restart on video cutscenes. 2025-06-12 17:56:26 +03:00
MAJigsaw77 4541f91d84 hmm: update hxvlc version. 2025-06-12 17:49:38 +03:00
luckydog7 068a995cdd
ios: tweaking audiosession to fix some bugs 2025-06-12 18:17:35 +07:00
MAJigsaw77 1a07e082c9 fix: freeze when restarting a video cutscene. 2025-06-12 12:47:36 +03:00
EliteMasterEric 4fa12a3486 Try to add mobile to the build-game workflows 2025-06-12 03:33:34 -05:00
EliteMasterEric 0a9ac0e93c Try to fix "Cancel merged branches" workflow 2025-06-12 03:33:34 -05:00
EliteMasterEric 974a78919d Additional documentation for workflows 2025-06-12 03:33:34 -05:00
EliteMasterEric fb9bf59a7e Fix a null error caused by calling Constants.VERSION too early. 2025-06-12 03:33:34 -05:00
Cameron Taylor e0b4c30719
icon update for iOS 2025-06-12 15:23:37 +07:00
Abnormal 80ffe6faa7 asset submod for stage editor 2025-06-12 02:08:27 -06:00
Kolo 15083a4776 delete logic fix + 2 new feats
feat 1: new objects now have the zIndex 1 higher than the last one (thanks hundrec)
feat 2: chars to test as are now saved (thanks imverybad)
2025-06-12 00:47:24 -06:00
Kolo 0dbffa6875 even more fixes and missing features 2025-06-12 00:47:24 -06:00
Kolo a776ce1a81 stage editor bugfixes + features :D 2025-06-12 00:47:24 -06:00
MoonDroid 738bd8b7c7 Increase arrows touch hitbox for Freeplay 2025-06-12 13:32:15 +07:00
MoonDroid d79f99475e Remove swipe right to exit on Freeplay 2025-06-12 13:31:46 +07:00
Hundrec 221c3db6e6 Restore camera events for Pico Erect 2025-06-12 01:01:53 -05:00
MoonDroid e92c6ec8f7
Merge pull request #1200 from FunkinCrew/bugfix/hide-pause-button-and-bring-resume-back 2025-06-12 12:00:35 +07:00
EliteMasterEric de0a56ec95 Temporarily disable the input offsets feature until we get it fully functioning again. 2025-06-11 20:15:55 -07:00
EliteMasterEric aefa8d149f Fix typos preventing builds on "master" branch 2025-06-11 20:29:51 -06:00
EliteMasterEric 29ee386dfe Update Polymod to allow mods with versions v0.6.3 or v0.7.0. 2025-06-11 19:21:00 -06:00
sector-a 0d965ba91c Fix pause button hiding 2025-06-12 04:06:56 +03:00
Kade a29e20098b
Merge pull request #1174 from FunkinCrew/bugfix/html5-reflectutil-nullsafety 2025-06-11 17:36:40 -07:00
Kade a2c5758112
Merge branch 'master' into bugfix/html5-reflectutil-nullsafety 2025-06-11 17:36:11 -07:00
EliteMasterEric 01fd37e08b Remove the redundant TimerUtil class. 2025-06-11 17:35:01 -07:00
Lasercar 5eecef17a1 Try push unique the difficulties for the notes 2025-06-11 17:32:44 -07:00
Lasercar 9df5395ff8 Load meta/chartdata fix
Deletes the song serialiser class, it has no use anymore
Also fixes the BPM changes
Note style is properly set when metadata toolbox is refreshed
Add variation dialog now fills note style dropdown with note styles and sets it properly afterwards
Also makes a few optimisations for the chart editor
2025-06-11 17:32:44 -07:00
Kolo 50d9584a38 another 20 trillion sandboxed classes 2025-06-11 17:31:40 -07:00
zackaryowo 0e24ae911f Fixed instrumentalOffset goofiness :D 2025-06-11 19:24:46 -05:00
zackaryowo c87a39b6c2 Oops, don't need this here
Thank you @NotHyper-474!
2025-06-11 19:24:46 -05:00
zackaryowo 760190d135 Update source/funkin/Conductor.hx
thank you https://github.com/cyn0x8 for reminding me FlxMath.bound exists

Co-Authored-By: cyn <cyn0x8+git@gmail.com>
2025-06-11 19:24:46 -05:00
GitRan 9f8e42bd3c Alter countdown + conductor behavior
Conductor's minimum songPosition when music is playing is now combinedOffset.

resyncVocals is also no longer used when the song starts, as it complicates matters and causes weird double-upping whatever due to the song being played, paused, and then played again
2025-06-11 19:24:46 -05:00
GitRan 1f75a641e0 Fix audio offset interactions with song start
Don't use combined offset here-- using it will cause the instrumental to skip forwards due to your offset. Just use instrumental offset, and don't play it when the song starts-- let resyncVocals do that
2025-06-11 19:24:46 -05:00
sector-a 47f0fc7236 Bring back the resume entry in pause in cutscenes 2025-06-12 02:55:43 +03:00
sector-a 79185596c1 Hide the pause button on ending cutscenes 2025-06-12 02:53:42 +03:00
Hundrec 8cae34eed7
[PUBLIC PR] Hyper's Stacked Notes Viewer (#1165)
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Hyper_ <survivaltemer@gmail.com>
Co-authored-by: lemz1 <ismael.amjad07@gmail.com>
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
Co-authored-by: Kade <26305836+Kade-github@users.noreply.github.com>
2025-06-11 16:24:30 -07:00
Mihai Alexandru a0ae4de5e8
mobile: make changing difficulties add to ad counter 2025-06-12 05:29:37 +07:00
Eric e7df920e74 Revert "rank anim only plays when entering freeplay or changing difficulties"
This reverts commit 55221646b8.
2025-06-11 16:29:17 -06:00
Mihai Alexandru 07958590a4
fix: iap not working correctly when upgrading 2025-06-12 05:18:19 +07:00
Mihai Alexandru bc01d5cffa
fix: audio desync when restarting a video cutscene. 2025-06-12 04:41:01 +07:00
MAJigsaw77 295e6f652e fix: fix gitaroo pause menu on wide screen. 2025-06-11 04:42:33 -06:00
KarimAkra ea01052b18 Fixed static guy and some resolution dependant issues 2025-06-11 12:46:21 +03:00
Hundrec cacb95bdd3 Tiny mobile link adjustments 2025-06-11 03:21:10 -06:00
MoonDroid 44fa64542a Exclude chart-editor, soundtray and stageBuild from ASTC compression
also reorganizes the list
2025-06-11 03:21:10 -06:00
MoonDroid 43c7f4e883 Update lime ref 2025-06-11 03:21:10 -06:00
MoonDroid 157a0a36dc assets submod 2025-06-11 03:21:10 -06:00
MoonDroid 034a861c69 Set minimum iOS version to be 16.0 2025-06-11 03:21:10 -06:00
MoonDroid 333e5326a2 Update readme to include links for mobile builds 2025-06-11 03:21:10 -06:00
EliteMasterEric 8e7de54aa0 Disable initial caching of "shared" assets on HTML5. 2025-06-11 05:08:37 -04:00
EliteMasterEric ea81e061d2 Fix null safety issues specific to HTML5 2025-06-11 05:08:37 -04:00
Abnormal cd3b7d7b95 ???????????????????????? 2025-06-11 02:52:05 -06:00
Abnormal 5d4e1d276b additional revision made after pr was pulled internally
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
2025-06-11 02:52:05 -06:00
VioletSnowLeopard 55221646b8 rank anim only plays when entering freeplay or changing difficulties 2025-06-11 04:26:55 -04:00
Cameron Taylor f599e53448 update grig to cam branch 2025-06-10 19:22:53 -04:00
MoonDroid 7629a1a92d Update lime ref 2025-06-10 19:22:53 -04:00
MoonDroid 1c8f320a54 Update grig.audio refs to FunkinCrew's 2025-06-10 19:22:53 -04:00
EliteMasterEric e7ddf9fbc8 Move hmm schema to its own file. 2025-06-10 18:16:17 -04:00
Cameron Taylor 9d6450454e json schema for hmm.json files (json schema testing) 2025-06-10 18:16:17 -04:00
Abnormal b80a8d60af fix: Fix the Stage Editor button in the Debug Menu not doing anything 2025-06-10 17:57:22 -04:00
Hyper_ d968fb271c Make sound effects pause with the game 2025-06-10 17:23:46 -04:00
Abnormal 70f0a54191 feat: Options Menu scrolling 2025-06-10 08:57:55 -07:00
Abnormal 29b94ea736 add cache to Assets 2025-06-10 08:57:14 -07:00
MoonDroid 8ca4d933aa
Merge pull request #1182 from FunkinCrew/mobile/admob-and-iapcore-fixes 2025-06-10 20:43:47 +07:00
MAJigsaw77 20e8a4566d mobile: make MAX_BEFORE_AD final. 2025-06-10 15:32:17 +03:00
MAJigsaw77 69c5c05039 mobile: adjust admob and iapcore variables a little. 2025-06-10 15:29:08 +03:00
MAJigsaw77 299a720575 mobile: multiiple fixes to admob and iapcore code. 2025-06-10 14:52:06 +03:00
sector-a 8d7500e8c0
assets submod 2025-06-10 18:40:22 +07:00
Hyper_ cadfa3b7ce Polymod: Blacklist funkin.util.macro.*
It has `CompiledClassList` which allows access to `sys` and Newgrounds API functions.
2025-06-10 06:23:37 -05:00
MoonDroid 5342601f8b fix: Call the callbacks if the upgrade is purchased 2025-06-10 05:01:30 -06:00
MoonDroid f6b1ff13bc
Merge pull request #1169 from FunkinCrew/mobile-main-menu 2025-06-10 17:52:38 +07:00
MoonDroid d43e9506b3 Merge branch 'master' into mobile-main-menu 2025-06-10 17:38:08 +07:00
MoonDroid 753f51dcf6 assets submod
two
2025-06-10 17:31:58 +07:00
MoonDroid 9303e4c272 Force FPS, pause on unfocus, and debug display to be a set value on mobile 2025-06-10 17:15:41 +07:00
MoonDroid b0f4a075b5 fix: Tweak back button position in Preferences 2025-06-10 17:15:12 +07:00
MoonDroid 031f888a25 Remove debug display, pause on unfocus, and FPS from Mobile 2025-06-10 17:14:52 +07:00
MoonDroid bc94a5a6ac fix: Remove control schemes and add back button into Options 2025-06-10 17:13:56 +07:00
MoonDroid 2450961b28 Add IAP functionality to the upgrade item in Main Menu 2025-06-10 17:13:04 +07:00
Hundrec 8b8737006f
Add "Team Organizers" to credits 2025-06-10 16:44:28 +07:00
Hundrec 5c4fa108c0 stages go wiiide 2025-06-09 18:53:17 -07:00
sector-a f4245ee0da
assets submod (#1168) 2025-06-10 03:57:05 +07:00
fabs aa8f5087b5 set upgraded to true on pc always 2025-06-09 21:43:28 +01:00
fabs edc668dad5 add options button to main menu + upgrade button tweaks 2025-06-09 21:21:09 +01:00
fabs 2771a13d5e tweak behavior for main menu items on mobile 2025-06-09 21:20:54 +01:00
fabs b63e02d9e7 make freeplay back button instant 2025-06-09 21:20:32 +01:00
fabs 9d3595c855 implement new back button + options button to musicbeatstates 2025-06-09 21:20:16 +01:00
fabs 250b5cb54f add options button 2025-06-09 21:19:48 +01:00
fabs e457b3e03b add instant option for back button 2025-06-09 21:19:36 +01:00
fabs 38e0cb6ab1 remove trace from sparkles 2025-06-09 21:19:11 +01:00
fabs 4746e8d7a5 assets submod 2025-06-09 17:50:16 +01:00
fabs db2644c0ff add upgrade button to main menu + simple logic 2025-06-09 17:49:37 +01:00
fabs f9aff5b11b upgrade sparkles.. 2025-06-09 17:49:27 +01:00
KarimAkra cc9797c452 adjust character select for wide screen
small bug, the static guy is off position sorry will fix it later i need ot go now TwT
2025-06-09 11:14:57 +03:00
MAJigsaw77 a97acfe18e mobile: move ad banner to the top left. 2025-06-09 01:31:19 -06:00
Hyper_ 65ed58350b Fix implementation of fastIndexOf causing duplicate notes in displayedNoteData 2025-06-08 23:59:33 -04:00
fabs 9e6c17507f assets submod 2025-06-09 03:15:05 +01:00
fabs 3360493444 implement extended assets 2025-06-09 03:14:57 +01:00
Hundrec e657bc900b
save ALL params grrrrr
Co-authored-by: Kolo <67389779+JustKolosaki@users.noreply.github.com>
2025-06-09 08:03:05 +07:00
MoonDroid 5a5f1f83f3
[PUBLIC PR + TWEAKS] Always display charSelectHint after unlocking character, and adjust message for mobile (#1157) 2025-06-09 08:02:23 +07:00
Hundrec 277416b6a3
Nudge metadata differently for mobile 2025-06-09 08:00:43 +07:00
Hundrec 37a40c24a1 super secret change don't look 2025-06-08 20:10:54 -04:00
Mihai Alexandru e90b74f788
Comment the failed ad banner placeholder code. 2025-06-09 06:53:55 +07:00
Hundrec ad11fb26b9 Kolo's mommy mearest pixel fix yay 2025-06-08 19:35:48 -04:00
sector-a 287603ad30
Assets submod 2025-06-09 06:03:45 +07:00
Lasercar 1c25713464 Use first difficulty as fallback 2025-06-08 16:57:34 -06:00
Hundrec 7cbc5b0dc7 Adjust character select hint message for mobile 2025-06-08 16:51:31 -06:00
Hundrec 7ccf75cd86 Always display charSelectHint after unlocking character 2025-06-08 16:49:09 -06:00
Mihai Alexandru eec304f42f
mobile: add RESTORE PURCHASES button on the options menu. 2025-06-09 05:41:16 +07:00
MoonDroid 7e4508f991 fix: Re-add the ability for the user to hold-scroll on Freeplay 2025-06-08 13:36:08 -06:00
MoonDroid f74d1655d5 fix: Change ACCEPT to ENTER
Having it on ACCEPT only speeds it up for a frame
2025-06-08 13:30:58 -06:00
Mihai Alexandru 5057f3d1de
Merge pull request #1147 from FunkinCrew/fix/menu-cleanup
[MOBILE] Small menu fixes for mobile release
2025-06-08 21:32:55 +03:00
MoonDroid a103b9641f
Merge pull request #1154 from FunkinCrew/bugfix/admob-running-no-any-state 2025-06-08 20:33:39 +07:00
MAJigsaw77 9e58ef70fb Adjutements to how playing counter work aswell as playing an ad in the pause menu before restarting the song. 2025-06-08 16:29:33 +03:00
MoonDroid f5a453b2e7
Merge pull request #1151 from FunkinCrew/mobile-pause-plus-back 2025-06-08 20:23:05 +07:00
MoonDroid d432e086cc Merge branch 'master' into mobile-pause-plus-back 2025-06-08 20:19:01 +07:00
MoonDroid f2280b1c0f fix: Move the backbutton correctly to the bottom right, remove forced color 2025-06-08 19:22:46 +07:00
MoonDroid 7f619640f2 fix: Increase GLOBAL_PLAYING_COUNTER when resetting PlayState in Pause Menu 2025-06-08 18:52:01 +07:00
MoonDroid 9d5613cc95 fix: Move pause metadata to bottom right on mobile 2025-06-08 18:43:01 +07:00
Mihai Alexandru 96c788a420
mobile: don't initialize the VolumePlugin. 2025-06-08 17:19:51 +07:00
Mihai Alexandru 07f792e358
hmm: update mobile extensions refs. 2025-06-08 17:12:08 +07:00
MoonDroid 24db9235e1 fix: Add targetStateFactory to prevent Stickers to be called during an ad. 2025-06-08 16:50:28 +07:00
MAJigsaw77 370e00c9b9 Move the metadata buttom right. 2025-06-08 12:22:19 +03:00
fabs 6d5767aef2 assets submod 2025-06-08 04:09:45 +01:00
fabs b3ebfd0910 pause button/pause screen rework 2025-06-08 04:09:40 +01:00
fabs a9a4dad511 forgot these oooops 2025-06-08 04:09:27 +01:00
fabs dc04ff23d7 move back button + swap class names 2025-06-08 04:09:20 +01:00
fabs 72f7317db2 rework freeplay back button 2025-06-08 04:07:56 +01:00
fabs 57ebeb25e4 i feel like this makes more sense 2025-06-08 04:06:30 +01:00
fabs 7fd1d312d7 rename FunkinBackspace + back button rework 2025-06-08 04:05:52 +01:00
Eric c2643c3873
Update project.hxp 2025-06-07 21:17:10 -04:00
Eric a1c1187b43
Use the official team ID 2025-06-07 21:16:55 -04:00
MoonDroid a7e46ed55b fix: Prevent difficulty sprite from just disappearing 2025-06-07 22:26:12 +07:00
MoonDroid 22c24f53f6 fix: Push the difficulty sprites slightly to the left for Story Menu 2025-06-07 22:25:47 +07:00
MoonDroid 262c4fb9a1 chore: Moved haptics preference option up 2025-06-07 22:24:40 +07:00
sector-a 75aea15539
Fix death haptics not working on some variations 2025-06-07 21:56:52 +07:00
MoonDroid 6e8494e615 Merge branch 'bugfix/admob-running-no-any-state' of https://github.com/FunkinCrew/Funkin-secret into bugfix/admob-running-no-any-state 2025-06-07 21:41:20 +07:00
MoonDroid 4392f5e642 fix: prevent death quote looping in Game Over 2025-06-07 21:41:08 +07:00
MAJigsaw77 21616e9399 Combine both ad counters into GLOBAL_PLAYING_COUNTER. 2025-06-07 17:26:38 +03:00
MAJigsaw77 814c563c55 Move gameover ads loading to gameover state. 2025-06-07 16:38:38 +03:00
MAJigsaw77 537c7cb5a1 Add a callback when the ad finishes showing. 2025-06-07 15:34:57 +03:00
Karim Akra 1801c542a6
Merge pull request #1133 from FunkinCrew/chore/invert-freeplay-swipes
More inverted difficulty anim fixes
2025-06-07 15:05:08 +03:00
MoonDroid f854a6e07a
Merge pull request #1130 from FunkinCrew/Hyper/fix-countdown-stacking 2025-06-07 08:24:23 +07:00
VioletSnowLeopard e193f7392a set selected after changing difficulties or unfavoriting a song 2025-06-06 21:22:36 -04:00
Hyper_ eb8d878aeb Prevent vwoosh timer from running outside PlayState 2025-06-06 21:10:03 -04:00
Hyper_ f19ae72b27 Improve vwoosh timer behaviour (no freezing the whole game this time) 2025-06-06 21:10:03 -04:00
Kolo 63eca96c98 run checks if timer's running 2025-06-06 21:10:03 -04:00
Lasercar b008f88e0d I sawed this playbackspeed in half! 2025-06-06 21:05:56 -04:00
Lasercar a50a014de3 Whoops, didn't save and load the stuff properly 2025-06-06 21:05:56 -04:00
Lasercar f78ab4da1d Save chart editor vocal volume and playback speed
Also opponent hitsounds
2025-06-06 21:05:56 -04:00
Hundrec 1d1c1403c3 second batch of public assets PRs 2025-06-06 20:56:49 -04:00
MoonDroid 743462d96e
Merge pull request #1134 from FunkinCrew/perf/sustain-trail-leak 2025-06-07 07:51:24 +07:00
EliteMasterEric 72a6b92daf Remove auto-rebuilding of HXCPP (it forces the game to clean build every time) 2025-06-06 20:46:50 -04:00
EliteMasterEric 285a607d9a Stop recreating the Hold Note graphic every time it is revived. This plugs a memory leak. 2025-06-06 20:45:23 -04:00
EliteMasterEric c6526527f1 Add HXCPP build to Prebuild, and add timer to Prebuild script 2025-06-06 20:45:23 -04:00
EliteMasterEric 7b3c9f1131 Update HXCPP to support the latest version of Tracy, check out the flame graph! 2025-06-06 20:45:23 -04:00
Eric 402f2707b3
Merge pull request #1140 from FunkinCrew/abnormalpoof/discordrpc-trace-removal
[PUBLIC PR] Remove spammy traces from DiscordClient
2025-06-06 20:33:39 -04:00
Abnormal e89f9f50dc fix: Remove spammy trace calls from DiscordClient 2025-06-06 20:33:31 -04:00
Hundrec 4eaa3842c6 apply these latencystate changes very important!!!
Co-Authored-By: Kade <26305836+Kade-github@users.noreply.github.com>
2025-06-06 17:21:54 -07:00
JackXson-Real 1d9e34359c OptionsState now remembers selection 2025-06-06 17:21:54 -07:00
JackXson-Real 5361df2544 latency state exits to options state 2025-06-06 17:21:54 -07:00
Eric 60a707b963
Merge pull request #1126 from FunkinCrew/Hundrec/hide-debug-cursor
[PUBLIC PR] Hide debug cursor when Title Screen starts
2025-06-06 20:08:23 -04:00
Hundrec 6222c389e3 Hide cursor when Title Screen starts 2025-06-06 20:03:51 -04:00
Eric 6265d751f8
Merge pull request #1125 from FunkinCrew/Hundrec/faves-week-sort
[PUBLIC PR] Sort Favorites by Week order, not alphabetically
2025-06-06 20:01:50 -04:00
Eric aff83bab4d
Merge pull request #1136 from FunkinCrew/KoloInDaCrib/move-sustains-with-notes
[PUBLIC PR] Move Hold Trails with Note Heads in Chart Editor
2025-06-06 19:48:56 -04:00
Kolo d3d8aaae7b move da hold note trails 2025-06-06 19:16:29 -04:00
Eric c263b4bc83
Merge pull request #1127 from FunkinCrew/Hundrec/fix-playstate-typos
[PUBLIC PR] Fix typos and errors in PlayState comments
2025-06-06 19:15:00 -04:00
Hundrec 7a2be205b9 Fix typos and errors in PlayState comments
Co-Authored-By: VioletSnowLeopard <202548129+violetsnowleopard@users.noreply.github.com>
2025-06-06 19:14:46 -04:00
Eric cd0e8a301d
Merge pull request #1135 from FunkinCrew/VioletSnowLeopard/squashed-capsule
[PUBLIC PR] Fix Two Issues With Song Text on Freeplay Capsules
2025-06-06 19:10:44 -04:00
VioletSnowLeopard 8b80478229 Fix squashed text for real this time 2025-06-06 15:54:19 -06:00
VioletSnowLeopard 0c62428fc8 fix song text remaining highlighted
unintentionally fixes song text squishing
2025-06-06 15:54:19 -06:00
EliteMasterEric 2904e660e9 Add confirmation sound and animation before transitioning to Chart Editor in Freeplay 2025-06-06 15:05:08 -06:00
EliteMasterEric e2b9cc9ed5 Provide difficulty and variation to Chart Editor when transitioning from Freeplay 2025-06-06 15:05:08 -06:00
EliteMasterEric 5ac9cee76c Fix Freeplay -> Chart Editor debug key not being processed properly 2025-06-06 15:05:08 -06:00
MoonDroid 62fa3ef934 Switch values for capsule swipes 2025-06-07 01:33:23 +07:00
MoonDroid d81e409d93
Merge pull request #1117 from FunkinCrew/mob-96/week3-train-haptics 2025-06-07 01:28:56 +07:00
MoonDroid aac09f86fe Merge branch 'master' into mob-96/week3-train-haptics 2025-06-07 01:28:15 +07:00
MoonDroid 428c5443f6 Update assets submodule ref 2025-06-07 01:23:01 +07:00
MoonDroid 1e5ec7850f Update art submodule ref 2025-06-07 00:36:26 +07:00
MoonDroid 2e0dfab9fb chore: Properly animate difficulty swipes and invert swipes for capsule/diff drags 2025-06-07 00:36:07 +07:00
sector-a d78117e377 Assets submod 2025-06-06 14:39:20 +03:00
sector-a 7aa0db844b Solve merge conflicts 2025-06-06 14:30:14 +03:00
sector-a d72d93083f Merge branch 'rewrite/master' into mob-96/week3-train-haptics 2025-06-06 14:29:58 +03:00
Eric 9769a626bc
Merge pull request #1131 from FunkinCrew/assets/public-batch-one
[ASSETS] First batch of public assets PRs
2025-06-06 02:45:52 -04:00
Hundrec afcf9a26cc first batch of public assets PRs 2025-06-06 00:30:29 -06:00
Karim Akra 28363652ef
Added outline for circle hints 2025-06-06 12:57:50 +07:00
Eric 42ff442ef8
Merge pull request #1128 from FunkinCrew/Raltyro/lit-up-id
[PUBLIC PR] Fix Lit Up being impossible to submit score into
2025-06-06 01:21:35 -04:00
Eric 29f7aca135
Merge pull request #5183 from Hundrec/patch-13
[DOCS] Fix a link in a Changelog entry
2025-06-06 01:14:53 -04:00
Ralty 183cec62dc Fix Lit Up being impossible to submit score into 2025-06-05 22:34:42 -06:00
Hundrec da0964a7b7 Remove alphabetical sort from Favorites 2025-06-05 21:53:33 -06:00
sector-a fabc16d265
Add haptics preference 2025-06-06 04:10:25 +07:00
sector-a 57bb462a38
Merge pull request #1119 from FunkinCrew/admob/pause-banner-top-center
[Admob] Use `TOP_CENTER` for the `AD` banner on the pause menu.
2025-06-05 13:03:18 +03:00
MAJigsaw77 2f647127b1 Use TOP_CENTER for the AD banner on the pause menu. 2025-06-05 10:05:28 +03:00
Cameron Taylor bbddb34853
Merge pull request #1112 from FunkinCrew/lasercar/chart-editor-tweens
[PUBLIC PR] Add additional tween types to Chart Editor events
2025-06-05 02:29:55 -04:00
Cameron Taylor 1d88ec473e
Merge pull request #1114 from FunkinCrew/nothyper/tracy-framemark
[PUBLIC PR] Remove unnecessary Tracy frame mark
2025-06-05 02:25:38 -04:00
sector-a bb98883807 art submod 2025-06-05 04:35:18 +03:00
Eric 451d4d1399
Fix typo in project.hxp (#1116) 2025-06-05 04:03:31 +03:00
Eric b66a955d65
Merge pull request #1109 from FunkinCrew/violetsnowleopard/fix-combo
[PUBLIC PR] Fix Combo Drop animations
2025-06-04 20:36:39 -04:00
VioletSnowLeopard 34d5ed1169 Fix combo drop animations 2025-06-04 20:30:21 -04:00
Eric ea6e2aef7b
Merge pull request #1098 from FunkinCrew/chore/disable-lime-asset-cache-version-macro
[CHORE] Disable the lime.utils.AssetCache version macro
2025-06-04 20:24:38 -04:00
Eric 099d1b3eb1
Merge pull request #1108 from FunkinCrew/lasercar/rank-smash
[PUBLIC PR] New rank doesn't SMASH old rank
2025-06-04 20:08:41 -04:00
Lasercar ab817bb1ea Fake rank now visible
Also fixes the song text clipping the rank area when getting a new rank
2025-06-04 19:56:36 -04:00
Eric 6077ba67f7
Merge pull request #1107 from FunkinCrew/lasercar/character-select-no-character
[PUBLIC PR] Fix crash in character select menu
2025-06-04 19:38:35 -04:00
Lasercar 3bbb4b06c8 no character? 2025-06-04 19:38:04 -04:00
Eric f92fe3ff15
Merge pull request #1105 from FunkinCrew/violetsnowleopard/unnecesarryline
[PUBLIC PR] Remove an unnecessary line from `FreeplayState.hx`
2025-06-04 19:27:00 -04:00
VioletSnowLeopard 067a04e069 Remove this unnecessary line
`curSelected` is always set to 0 directly above this
2025-06-04 19:26:35 -04:00
sector-a e9697e6f40 Make sharpness changeable 2025-06-05 01:34:09 +03:00
sector-a 0345107e71
Disable inst select menu on mobile 2025-06-05 05:17:33 +07:00
Lasercar 5177e1275e Add all tween types 2025-06-04 17:31:26 -04:00
Karim Akra be57d2fa3c
Merge pull request #1104 from FunkinCrew/menu-cleanup
Clean up Menu code and fix a few menu-related issues.
2025-06-04 22:27:53 +03:00
MoonDroid ff7b7b5d3e
Increase verticle hitbox for the default control scheme (#1103) 2025-06-04 22:24:17 +03:00
MoonDroid e7c42dae0c
fix: Invert difficulty change and its animations. (#1102) 2025-06-04 21:57:34 +03:00
Karim Akra 07ad53a09b
Merge pull request #1101 from FunkinCrew/refactor/pause-layout
Refactor pause menu layout
2025-06-04 21:54:35 +03:00
MoonDroid 113326089a
Merge pull request #1096 from FunkinCrew/feature/in-app-review 2025-06-05 00:05:31 +07:00
Karim Akra ed0abb8215
Use proper insets for IOS notch rectangle 2025-06-04 23:54:56 +07:00
MoonDroid 405fe21c53 fix: Further improve scrolling in Story Menu by preventing unintended diagonal scrolling behavior 2025-06-04 23:44:32 +07:00
MoonDroid e5b280c646 Turn off FEATURE_NEWGROUNDS for Mobile platforms 2025-06-04 23:43:49 +07:00
MoonDroid 36cbfe91bb Disable launchStoryboard temporarily until we find a fix 2025-06-04 23:43:21 +07:00
MoonDroid 4081f329d2 chore: Remove test purchase flow from OptionsState 2025-06-04 23:42:14 +07:00
MoonDroid 402d5b730b refactor: lock scrolling in Main Menu, and prevent accidental tapping in Options Menu 2025-06-04 23:41:47 +07:00
MoonDroid 5e7e2f45f3 Remove merch from Main Menu on mobile. 2025-06-04 23:31:25 +07:00
MoonDroid 80393bbc6d Revert "Push the pausebutton slightly further onto the left for iOS."
This reverts commit 7689c7d2e4.
2025-06-04 22:17:31 +07:00
MoonDroid 2c44785c39 Move pause metadata text to bottom-right corner
also fix an issue where the countdown keeps running during pause.
2025-06-04 22:12:54 +07:00
KarimAkra 329be321eb Merge branch 'feature/in-app-review' of github.com:FunkinCrew/Funkin-secret into feature/in-app-review 2025-06-04 17:57:54 +03:00
KarimAkra e79d4e69c2 Properly add IOS support for IAR 2025-06-04 17:57:48 +03:00
MoonDroid fda944a9f7 fix: Prevent accidental taps by distinguishing swipes from taps 2025-06-04 21:18:52 +07:00
MoonDroid ab00a126fa refactor: Move pause and countdown logic into function, trigger on tab-out 2025-06-04 21:17:53 +07:00
MoonDroid 7689c7d2e4 Push the pausebutton slightly further onto the left for iOS. 2025-06-04 21:16:03 +07:00
EliteMasterEric 91d1fb74f7 Enable IAR on iOS 2025-06-04 10:06:27 -04:00
KarimAkra a5921ab96c Disable the lime.utils.AssetCache version macro 2025-06-04 16:31:15 +03:00
Eric 7fca9d4c7e
Additional mobile build configuration 2025-06-04 07:17:01 +07:00
EliteMasterEric 0e26f9d936 Implement in-app reviews 2025-06-03 20:00:34 -04:00
Karim Akra af71c3acd7
Fix the freeplay flames position 2025-06-04 05:42:06 +07:00
Karim Akra 9e8c4f1fa1
Set ASTC blocksize to 10x10 (#1095) 2025-06-04 05:41:25 +07:00
Eric 268166b7e0
Merge pull request #1046 from FunkinCrew/fix/attract-state-touch
Fix AttractState skipping for mobile
2025-06-03 09:58:22 -04:00
KarimAkra 9bd65a4782 Added a FlxPieDial meter to AttractState for skipping the video 2025-06-03 09:47:41 -04:00
EliteMasterEric 8a3e623d28 Improvements to iOS simulator build documentation 2025-06-03 06:06:24 -04:00
Cameron Taylor 9d671888ef
Merge pull request #1057 from FunkinCrew/charlesisfeline/polymod-unserializer-2
[PUBLIC PR] Fix script blacklisting of haxe.Unserializer.
2025-06-03 03:41:03 -04:00
fabs 1fc71a3852 assets submod.............. 2025-06-03 03:37:46 -04:00
fabs af546a14a2 assets submod 2025-06-03 03:34:03 -04:00
fabs 7d5904b539 assets submod 2025-06-03 03:24:02 -04:00
Cameron Taylor fb2d587a15 Merge branch 'abnormal/playstate-instance-crash' into rewrite/master 2025-06-03 03:22:22 -04:00
Cameron Taylor 2b4a42ac0a Merge branch 'hundrec/chart-editor-ms-display' into rewrite/master 2025-06-03 03:17:47 -04:00
Eric 0f36a05311
Merge pull request #1090 from FunkinCrew/xcode-deploy
bump lime for some xcode helpers
2025-06-03 03:15:05 -04:00
Cameron Taylor 12fc467312 bump lime for some xcode helpers 2025-06-03 03:14:56 -04:00
Hundrec f3dbd763d2 0.7 chart tweaks assets submod 2025-06-03 03:14:12 -04:00
Cameron Taylor 9ed4d7e8fc bump hmm FlxAnimate version for reflection changes 2025-06-03 02:59:26 -04:00
Cameron Taylor 43abebcafd Merge branch 'abnormal/format-hxp' into rewrite/master 2025-06-03 02:54:53 -04:00
Eric a5ae068801
Merge pull request #1091 from FunkinCrew/fix-assets-submod
Point assets submodule to latest secret commit
2025-06-02 19:24:34 -04:00
Hundrec 3f8e96965b Fix assets submod
It was pointing to the public submod again
2025-06-02 19:24:10 -04:00
Karim Akra 367c56c5e7
Merge pull request #1047 from FunkinCrew/invert-difficutly-capsule-drag
Invert difficulty drag
2025-06-03 00:47:01 +03:00
KarimAkra b2aa111b71 Fixed scrollig upwards being too sensitive compared to dawnwards 2025-06-03 00:45:30 +03:00
Mihai Alexandru c6c48bd9a8
chore: backlist mobile extensions access.
"backlist"
2025-06-03 04:33:57 +07:00
Mihai Alexandru 835b79e3de
chore: use trace instead of using Sys.println on mobile utils. (#1088) 2025-06-03 03:59:13 +07:00
Karim Akra ba12d505d6
Merge pull request #1056 from FunkinCrew/feature/bandaid-memory
Band-aid memory fixes to help the game run better.
2025-06-02 23:52:21 +03:00
KarimAkra 193f83e000 Improved memory cleaning by including the weeks directories to the textures purge 2025-06-02 23:45:39 +03:00
EliteMasterEric b69ef72d51 Remove spam from the README 2025-06-02 11:41:22 -07:00
EliteMasterEric 44eb13ef9b Fix issue where prebuild script wouldn't get called properly. 2025-06-02 11:41:22 -07:00
Karim Akra 3fca9cee63
remove the shadowed lime.utils.Log class (#1040) 2025-06-02 08:11:16 +07:00
Karim Akra e7a460042b
fix the opponent strums being misaligned on wide screens 2025-06-02 07:12:48 +07:00
Mihai Alexandru ad1021ee33
feature: add a placeholder solid color graphic when a banner advertisement fails to load. 2025-06-02 07:12:16 +07:00
Mihai Alexandru e9c411f770
[BUGFIX] Fix Android compile with Admob and add openAdInspector function. (#1070) 2025-06-02 07:10:33 +07:00
Mihai Alexandru 8711db49c7
hmm: update extension-haptics to 1.0.2 to fix some issues on iOS. (#1069) 2025-06-02 07:07:28 +07:00
MoonDroid 7485bc990e
Merge pull request #1076 from FunkinCrew/bugfix/better-capsule-scrolling-hitbox 2025-06-02 06:59:21 +07:00
MoonDroid c333bbaa23
Merge branch 'rewrite/master' into feature/bandaid-memory 2025-06-02 06:57:12 +07:00
MoonDroid 28d3999797
Merge pull request #1085 from FunkinCrew/feature/polymod-blacklist-fixes 2025-06-02 06:55:41 +07:00
MoonDroid 8f216ada02 Fix build error for admob on Android 2025-06-02 06:53:16 +07:00
EliteMasterEric 52dfee61fa Fix null safety on ReflectUtil 2025-06-01 18:42:19 -04:00
EliteMasterEric a62d2b94a9 Fix several merge conflicts causing builds to fail. 2025-06-01 18:33:34 -04:00
EliteMasterEric 2e486d987b Add "hscript" to the HScript blacklist 2025-06-01 18:05:24 -04:00
EliteMasterEric 83e1e1f68f Full documentation and null safety for ReflectUtil, and add FIELD_NAME_BLACKLIST to prevent abuse. 2025-06-01 18:02:42 -04:00
EliteMasterEric 3d6882c282 Disable complaints about alignment of conditional compilation 2025-06-01 18:01:41 -04:00
MoonDroid 11383e9385
Merge branch 'rewrite/master' into feature/bandaid-memory 2025-06-02 02:13:19 +07:00
MoonDroid 7d567de24f fix: Increase scroll hitbox slightly and make it so flicks can only be triggered on the htibox. 2025-06-01 18:16:26 +07:00
Hundrec 35d4d24731
that's not even the right link
what
2025-06-01 01:50:33 -06:00
Hundrec c0dde5c936
missed one
funkin.assets
2025-06-01 01:46:27 -06:00
Lasercar dc56ccada5 ctrl click on hold note null reference fix 2025-05-30 19:49:58 -07:00
Hyper_ d3490f8c99 Fix possible crash when trying to open nonexistent folders 2025-05-30 19:49:33 -07:00
Lasercar 1959a5250f Difficulty no longer always set to normal 2025-05-30 19:49:00 -07:00
Lasercar ae2c2db28f fixed success message (also forgor playstate change) 2025-05-30 19:49:00 -07:00
Lasercar 82af988dce chart editor target song variation parameter 2025-05-30 19:49:00 -07:00
Lasercar e3fca16793 chart editor target song difficulty parameter 2025-05-30 19:49:00 -07:00
Eric 2221594883
[PUBLIC PR] Press Chart Editor key in Freeplay to open that song (#1061)
Co-authored-by: Lasercar <B_l_u_t_a_c_k@hotmail.com.au>
2025-05-30 19:48:22 -07:00
Hundrec be7313453f Make it 500, actually 2025-05-30 19:47:24 -07:00
Hundrec c9c284787e Raise max fps cap to 360 2025-05-30 19:47:24 -07:00
Eric 93e4f799f4
Remove JPEG (#1065)
Co-authored-by: Lasercar <64717068+Lasercar@users.noreply.github.com>
2025-05-30 19:46:34 -07:00
anysad c7abb19698 fix playhead width 2025-05-30 19:45:32 -07:00
Hundrec 7c7dc11f18 Prevent the playhead from scrolling before song start 2025-05-30 19:45:02 -07:00
anysad b883ad3d50 bye bye trace! 2025-05-30 19:44:27 -07:00
Lasercar 426a9c0c10 Clear un/redo history on song load 2025-05-30 19:44:03 -07:00
Hyper_ 0b7a94b1cc Remove V-Sync option from in PreferencesMenu on web builds 2025-05-30 19:43:26 -07:00
EliteMasterEric 711d3896cb Update FlxAnimate to optimize deconstruction 2025-05-30 18:29:57 -04:00
Eric 98236a541a
Merge pull request #1075 from FunkinCrew/kade-github/revert-asset-changes
[CLEANUP] Fix asset submodule
2025-05-29 17:33:17 -04:00
KarimAkra 3179d33a17 Adjust the capsule scroll hitbox size for easier navigation on wider screens 2025-05-29 23:17:41 +03:00
kade-github 3f23b79087
sub fix 2025-05-29 12:17:54 -07:00
kade-github f16b8630ff
Revert "assets submod" 2025-05-29 12:09:21 -07:00
kade-github 1c747657d2 master switch for submod 2025-05-29 10:51:59 -07:00
fabs 924f72f96c assets submod 2025-05-29 10:51:59 -07:00
Hundrec 26dc895a27 Fix chart editor playbar ms display 2025-05-29 00:12:19 -04:00
Hyper_ 58257f6ac1 fix: Cleanup on LatencyState not being performed when closed/destroyed by state switch 2025-05-28 23:21:40 -04:00
CrusherNotDrip b52c73f2b0 Fix crash when mashing I or D on title state. 2025-05-28 23:14:43 -04:00
Lasercar 564d679f96 fix: Fixes a bug where you open the user guide in the stage editor multiple times 2025-05-28 23:04:48 -04:00
Lasercar 5695bc20e7 Cancel state change on debug menu 2025-05-28 22:57:56 -04:00
charlesisfeline 3dc7699aac silly typo... 2025-05-28 21:24:42 -04:00
MoonDroid dc60c12963 fix: properly reset variables and checks for capsule clicks 2025-05-29 08:17:10 +07:00
MoonDroid 6b63884e38 Merge remote-tracking branch 'origin/rewrite/master' into feature/bandaid-memory 2025-05-29 08:10:54 +07:00
MoonDroid 4eff23a6f2 chore: update compression-excludes.txt with additional exclusions
Some of these if compressed will benefit us with nothing but app size increase.
2025-05-29 08:03:49 +07:00
MoonDroid d8db5f7d88 refactor: optimize clearFreeplay() to improve cleanup of freeplay assets 2025-05-29 08:01:49 +07:00
MoonDroid 23d31ff73b feat: add clearStickers() to clean sticker data from memory, alongside purging cache in StickerSubState 2025-05-29 08:01:15 +07:00
MoonDroid a89351f083 feat: add null safety to FunkinMemory class for improved stability 2025-05-29 07:53:38 +07:00
MoonDroid fb3277ea35 fix: update memory management during state transitions 2025-05-29 07:33:47 +07:00
MoonDroid 71cadd31ed Change block size value from 4x4 to 12x12 2025-05-29 07:03:51 +07:00
Eric 1bd281830e
Merge pull request #1051 from FunkinCrew/kade-github/fixup
fix a fuck up by me (sorry)
2025-05-28 19:53:59 -04:00
kade-github 751f569e69
Merge branch 'merge-from-public' into kade-github/fixup 2025-05-28 16:48:46 -07:00
kade-github c363a53f9d
Revert "Merge public commits to MAIN and DEVELOP (#1045)"
This reverts commit d61cc1d5be.
2025-05-28 16:46:04 -07:00
EliteMasterEric fc83685b0f Remove a bunch of deprecation warnings 2025-05-28 16:33:10 -07:00
MoonDroid 25e04cf061 Fix private access errors and remove iOS compiler block 2025-05-28 16:24:57 -07:00
MAJigsaw77 8965bb059e fix: ensure admob doesnt stop the audio session on iOS. 2025-05-28 16:24:57 -07:00
Eric d61cc1d5be
Merge public commits to MAIN and DEVELOP (#1045)
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
Co-authored-by: Lasercar <64717068+Lasercar@users.noreply.github.com>
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Lasercar <B_l_u_t_a_c_k@hotmail.com.au>
Co-authored-by: anysad <anysadiscool@gmail.com>
Co-authored-by: VioletSnowLeopard <ngzeretzke@gmail.com>
Co-authored-by: unknown <47027981+ACrazyTown@users.noreply.github.com>
Co-authored-by: kade-github <26305836+Kade-github@users.noreply.github.com>
Co-authored-by: JackXson-Real <32755192+JackXson-Real@users.noreply.github.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
Co-authored-by: CrusherNotDrip <90648119+CrusherNotDrip@users.noreply.github.com>
Co-authored-by: cyn0x8 <cyn0x8+git@gmail.com>
Co-authored-by: ChillyBeanBAM <109490279+ChillyBeanBAM@users.noreply.github.com>
2025-05-28 16:06:35 -07:00
MoonDroid 45bcb93c21 Invert capsule difficulty drag to the correct values. 2025-05-28 22:14:37 +07:00
EliteMasterEric 2e8338a5dc Merge remote-tracking branch 'public/develop' into merge-from-public 2025-05-27 16:13:23 -04:00
EliteMasterEric cb43dd34b4 Merge remote-tracking branch 'public/main' into rewrite/master 2025-05-27 16:11:39 -04:00
Hyper_ 83216e171c Remove unnecessary Tracy frame mark
This is already done by OpenFL
2025-05-26 17:46:36 -03:00
Eric 3b55c5b15f
Merge pull request #1039 from FunkinCrew/feature/unlock-everything
Make the flag `UNLOCK_EVERYTHING` work properly.
2025-05-26 01:59:10 -04:00
MoonDroid d4ef73fb93
Merge branch 'rewrite/master' into feature/unlock-everything 2025-05-25 09:34:15 +07:00
MoonDroid 7f924cd563 fix(mobile): Made freeplay scrolling more consistent and less buggy when dragging diagonally. 2025-05-23 16:00:06 -04:00
MoonDroid bbfbce6404 Update lime and astc-compressor refs 2025-05-23 15:42:18 -04:00
KarimAkra 91e9d5d55c Fixed the dark bar being missing (small) on the boyfriend backing card 2025-05-23 15:17:27 -04:00
Kade 6ec380e699
Merge pull request #1026 from FunkinCrew/flick-math 2025-05-22 13:20:37 -07:00
MoonDroid d311a16459 Merge remote-tracking branch 'origin/rewrite/master' into flick-math 2025-05-22 19:09:51 +07:00
MoonDroid a5b4a7d2cc Make UNLOCK_EVERYTHING work properly with songs. 2025-05-22 16:55:51 +07:00
MAJigsaw77 59a2b4ce6f hmm: update hxvlc and androidtools to fix some issues. 2025-05-20 21:23:12 -07:00
sector-a 5788d04890 Prevent stacked amplitude from not working and fix hold note end vibration 2025-05-20 10:34:56 -07:00
sector-a 30e9b2fb67 Improve the way note vibrations are handled and tweak hold note vibrations 2025-05-20 10:34:56 -07:00
MoonDroid a60560e36c fix: ensure draggingDifficulty is set correctly during swipe interactions 2025-05-20 10:34:33 -07:00
MoonDroid 511fd88ee9 fix: replace #if mobile with #if FEATURE_TOUCH_CONTROLS for clarity and consistency 2025-05-20 10:34:33 -07:00
MoonDroid a73ba04706 feat(mobile): improve touch interaction with granular state tracking and enhanced flick scrolling
- Added detailed touch state tracking to improve drag and selection behavior in FreeplayState
- Enhanced capsule scrolling with better flick handling for smoother touch device interaction
2025-05-20 10:34:33 -07:00
MoonDroid 17f614ea06 refactor: replace FlxSprite with FlxObject for touch hitboxes 2025-05-20 10:34:33 -07:00
MoonDroid 29143505cc chore: clean up unused and reorder imports in FreeplayState 2025-05-20 10:34:33 -07:00
MAJigsaw77 c462a5f8d0 videos: initialize hxvlc's handle early for faster loading speeds. 2025-05-20 10:32:54 -07:00
MAJigsaw77 0d5fd4a0c5 hmm: update hxvlc to 2.2.0. 2025-05-20 10:32:54 -07:00
mint 54547e7dd1 ci-checkout v7.3.3 2025-05-16 10:34:21 -04:00
mint 4b58cd0812 v7.3 of actions/checkout :3 2025-05-16 10:34:21 -04:00
mint dd809e0455 get more debug info out of ci-checkout 2025-05-16 10:34:21 -04:00
mint 22d2b95e7f test new submodule alias feature in funkin:actions/checkout 2025-05-16 10:34:21 -04:00
mint 310c074d78 ci: update checkout action 2025-05-16 10:34:21 -04:00
Eric 1dba74c704
Merge pull request #5102 from FunkinCrew/main
[CHORE + GITHUB] Merge main into develop, again edition
2025-05-16 01:52:41 -04:00
Eric d127b824c8
Merge pull request #5101 from Hundrec/github/size-label-adjustment
[GITHUB] Adjust PR size labeler thresholds
2025-05-16 01:35:02 -04:00
Hundrec fda568c6a8
Adjust line change PR labeler thresholds 2025-05-15 23:21:23 -06:00
Eric be027e2a01
Merge pull request #5093 from FunkinCrew/main
[CHORE + GITHUB] Merge `main` into `develop`, tiny n huge edition
2025-05-14 16:34:06 -04:00
Eric 0ec6233119
Merge pull request #5068 from Hundrec/github/more-size-labels
[GITHUB] More PR size labels
2025-05-14 13:33:58 -04:00
Cameron Taylor 94f1720870 accomodate notch positioning for different orientations 2025-05-12 14:13:20 -04:00
Cameron Taylor 4f3f43d6e7 tidy(iOS): rename some variables in ScreenUtil.hx 2025-05-12 14:13:20 -04:00
Cameron Taylor 6689ae9e9d fix(iOS): fix the notch size math on iOS 2025-05-12 14:13:20 -04:00
Cameron Taylor 8e7ddc0f53 bump lime to latest from lime-mobile/main 2025-05-12 14:13:20 -04:00
Cameron Taylor fda719ae7b reorganize hmm alphabetically (automatically done by hmm) 2025-05-12 14:13:20 -04:00
MoonDroid 666b57a1cb Increase scroll camera's height to account for bigger screens. 2025-05-12 12:52:24 -04:00
Hundrec d86dacf354
More PR size labels 2025-05-11 19:51:27 -06:00
Abnormal a413318782 chore: Format the project.hxp file 2025-05-11 18:43:45 -05:00
MoonDroid 6289dfdd02 Adjust touch movement scaling in FreeplayState
New flixel ref has DPI Scaling for flicks, and added DPI scaling to freeplay's scroll too.
2025-05-12 06:24:13 +07:00
Abnormal c77e164513
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Co-authored-by: Hundrec <hundrecard@gmail.com>
2025-05-11 20:23:33 +00:00
Abnormal d2acb5d167 fix: Fix the game crashing when hot reloading with F5 2025-05-11 15:13:27 -05:00
MoonDroid adfd73d6ab Enhance touch controls by adding capsule hitbox and updating hit detection logic 2025-05-10 10:21:25 -07:00
MAJigsaw77 728558b279 Update extension-haptics. 2025-05-10 10:19:53 -07:00
MAJigsaw77 d104e3381b Update extension-iapcore. 2025-05-10 10:19:53 -07:00
MAJigsaw77 14e8e1f42f Update extension-androidtools. 2025-05-10 10:19:53 -07:00
MAJigsaw77 24e535c90a Update extension-admob. 2025-05-10 10:19:53 -07:00
Cameron Taylor cbff9a3719 freeplay momentum scrolling on mobile 2025-05-09 22:58:06 -04:00
kade-github 9a3e58a7d4 lock sync for static man 2025-05-09 12:55:10 -04:00
sector-a c8a86d3df8 Add the pressAction method in TouchUtil and use it everywhere it's useful 2025-05-09 12:54:45 -04:00
Eric 44c32cb0fc
More public 0.6.4 fixes (#1016)
Co-authored-by: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
Co-authored-by: Lasercar <64717068+Lasercar@users.noreply.github.com>
Co-authored-by: Lasercar <B_l_u_t_a_c_k@hotmail.com.au>
Co-authored-by: anysad <anysadiscool@gmail.com>
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: VioletSnowLeopard <ngzeretzke@gmail.com>
Co-authored-by: unknown <47027981+ACrazyTown@users.noreply.github.com>
Co-authored-by: kade-github <26305836+Kade-github@users.noreply.github.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
Co-authored-by: CrusherNotDrip <90648119+CrusherNotDrip@users.noreply.github.com>
Co-authored-by: cyn0x8 <cyn0x8+git@gmail.com>
2025-05-08 10:28:39 -07:00
Eric 96f4b8effc
Merge pull request #5020 from ChillyBeanBAM/main
[DOCS] Add a missing first-time contributor to v0.6.4 changelog
2025-05-06 19:51:38 -04:00
Eric 15fcb2b15f
Merge pull request #4946 from Hundrec/changelog/freeplay-fixes-mention
[DOCS] Four more Freeplay entries for 0.6.4 Changelog
2025-05-06 19:51:23 -04:00
Eric 50f99f9ba7
Merge pull request #5025 from Hundrec/pr-template
[GITHUB] Clean up PR Template
2025-05-06 19:51:03 -04:00
Eric 33084db558
Merge pull request #5032 from AbnormalPoof/docs/rejected-feature-addition
[DOCS] Changes to the Contributing Guide's rejected features
2025-05-06 19:44:59 -04:00
Cameron Taylor 35f7113091 assets submod 2025-05-06 18:09:16 -04:00
MAJigsaw77 83d198493c Implement IAP on iOS.
Co-Authored-By: MoonDroid <zdgzackda@gmail.com>
2025-05-06 18:08:26 -04:00
MAJigsaw77 cd71102f8d Update hxcpp ref. 2025-05-06 18:08:26 -04:00
KarimAkra 283d7c0971 Fixed wide screen cap making the game position look off
Co-Authored-By: luckydog7 <59097731+luckydog7@users.noreply.github.com>
2025-05-06 18:08:26 -04:00
sector-a e9b1d5fc04 Make downscroll unavailable if Arrows scheme is selected 2025-05-06 18:08:26 -04:00
sector-a 13a2b192b9 Add available to menu items 2025-05-06 18:08:26 -04:00
sector-a 27b1cd32b7 fix wrong class path 2025-05-06 18:08:26 -04:00
KarimAkra fffea09270 Chore: rename Desktop with Native in places where the stuff apply for both Mobile & Desktop 2025-05-06 18:08:26 -04:00
KarimAkra d3705042cf Use NO_TESTING_ADS instead of !TESTING_ADS 2025-05-06 18:08:26 -04:00
KarimAkra f9b0acb998 these aren't needed actually 2025-05-06 18:08:26 -04:00
KarimAkra 377626c279 minimum SDK is supposed to be 28? 2025-05-06 18:08:26 -04:00
KarimAkra b536619773 silly me! 2025-05-06 18:08:26 -04:00
KarimAkra b189518383 update assets for 2hot cutscene pause button pos fix 2025-05-06 18:08:26 -04:00
KarimAkra f6569907c8 delete this old unused scrapped hag 2025-05-06 18:08:26 -04:00
KarimAkra a34cbaf87f Made FunkinBackspace automatically take android's back button as a back action
so now on Android you can use the phone's back button instead of always having to press the button in game!
2025-05-06 18:08:26 -04:00
KarimAkra ec5a736be6 move the DPad control scheme by the notch & give it tweens 2025-05-06 18:08:26 -04:00
MoonDroid 00b54150a4 Adjust target position calculations for fullscreen scaling in SongMenuItem. 2025-05-06 18:08:26 -04:00
MoonDroid b0c3c020e0 Fix an issue where the songs dont refresh when you change the difficulty through capsule. 2025-05-06 18:08:26 -04:00
KarimAkra 045b240949 Automated the ASTC textures compression process to be in build time 2025-05-06 18:08:26 -04:00
KarimAkra b84b531a2c Fixed VSync getting automatically enabled on focus lost/gained in Mobile 2025-05-06 18:08:26 -04:00
KarimAkra fc78eeee4f Fixed un-indexed freeplay scrolling with touch 2025-05-06 18:08:26 -04:00
KarimAkra 910500ea26 fixed the astc textures excludes 2025-05-06 18:08:26 -04:00
KarimAkra 3dc693f8b6 not unofficial anymore !! 2025-05-06 18:08:26 -04:00
KarimAkra a7b4f3d420 Format project.hxp 2025-05-06 18:08:26 -04:00
sector-a c992180f7c Fix capsules behavior in freeplay being a little bit weird 2025-05-06 18:08:26 -04:00
sector-a b0468fa056 Set target android SDK version in Project.hxp 2025-05-06 18:08:26 -04:00
sector-a c026c104f5 Fix Strumline for the Arrows controls scheme 2025-05-06 18:08:26 -04:00
sector-a 353f1780d1 Added nullSafety back in MusicBeat(Sub)State and fixed the errors 2025-05-06 18:08:26 -04:00
Cameron Taylor c648a5dbf2 art submod (macos code notarize script 2025-05-06 18:02:40 -04:00
Abnormal a1a4acc12d Modifications to the rejected features list
Co-authored-by: Hundrec <hundrecard@gmail.com>
2025-05-06 14:04:37 -05:00
Hundrec 2c2da142da
Clean up PR Template 2025-05-06 00:07:03 -06:00
Cameron Taylor 2777ec03a4 add team id for iOS compiling 2025-05-05 23:06:42 -07:00
Cameron Taylor 86ead7096e tidy(preloader): remove old progressBar code (i believe this was a solid progress bar, we use pieces now 2025-05-05 23:05:47 -07:00
Cameron Taylor bdb8857d5c tidy(preloader): remove unused site lock things, unplanned feature 2025-05-05 23:05:47 -07:00
Cameron Taylor 2325317902 tidy(preloader): guard clause readability change for updateProgressLeftText() 2025-05-05 23:05:47 -07:00
Cameron Taylor adb74b4539 tidy(preloader): cleanup relating to displaying current status. We get the string info from our enum abstract instead 2025-05-05 23:05:47 -07:00
Cameron Taylor f737ce6ed3 tidy(preloader): remove some old preloader code relating to logo 2025-05-05 23:05:47 -07:00
ChillyBeanBAM f650c3962d
done! 2025-05-05 18:17:14 -04:00
ChillyBeanBAM b2fb2916dc
Whoops! Missed me! 2025-05-05 18:07:05 -04:00
Eric 0927966c09
Merge pull request #4992 from FunkinCrew/EliteMasterEric-patch-4
[DOCS] Add documentation for using Tracy profiler
2025-05-04 14:13:01 -04:00
Eric 642331b2d0
Create TRACY.md 2025-05-04 14:10:25 -04:00
Eric 372e43d181
Merge pull request #4972 from Kade-github/patch-1
[DOCS] Extra compile instruction for linux
2025-05-04 13:49:20 -04:00
Kade 2fdf63da35
grammar 2025-05-03 17:05:42 -07:00
Kade ccb75e8d4e
linux compile help 2025-05-03 17:04:04 -07:00
Hundrec 23996095e1
Forgor this PR in 0.6.4 lol!
4 more entries for those cool Freeplay fixes
2025-05-02 22:53:49 -06:00
Eric 7352ab79bd
Merge pull request #4944 from VioletSnowLeopard/ya-missed-one
[DOCS] Add a Missing New Contributor for 0.6.4
2025-05-02 23:36:15 -04:00
VioletSnowLeopard 0ad2780c5d add a missing new contributor 2025-05-02 23:28:42 -04:00
Eric 68b12b8a97
Merge pull request #4921 from JackXson-Real/0.6.4-docs2
Bump Repo Versions to 0.6.4
2025-05-02 23:06:51 -04:00
Eric 6c489812f9
Merge pull request #4943 from FunkinCrew/develop
v0.6.4 Release
2025-05-02 22:47:11 -04:00
Eric 0b976b0d71
Merge pull request #4942 from AbnormalPoof/0.6.4-changelog-version-bump
[DOCS] CHANGELOG for 0.6.4 + Bump version to 0.6.4
2025-05-02 22:28:13 -04:00
Abnormal ae1239c57d CHANGELOG for 0.6.4 2025-05-02 21:20:14 -05:00
Abnormal bfbbf9cb01 Bump game version to 0.6.4 2025-05-02 21:02:22 -05:00
Eric 6f8d62ac33
Merge pull request #4939 from Hundrec/changelog/assets-entries
[DOCS] Credit some funkin.assets PRs in the Changelog
2025-05-02 19:45:29 -04:00
Hundrec a19413b1ea Credit some funkin.assets PRs
Establishing a system for writing funkin.assets entries
2025-05-02 17:42:30 -06:00
EliteMasterEric d29bb47d22 Update assets submodule 2025-05-02 18:52:21 -04:00
Eric d29ecfb7c4
Merge pull request #4936 from CrusherNotDrip/bugfix/tooltip-chart-editor
[BUGFIX] Prevent the game from crashing when clicking a recent chart before tooltip shows up
2025-05-02 17:55:41 -04:00
Eric cdd17ce033
Merge pull request #4938 from AbnormalPoof/bugfix/quick-web-fix
2 more commits from #3032
2025-05-02 17:54:38 -04:00
Eric 8e8b26f029
Merge pull request #4564 from AbnormalPoof/bugfix/texture-atlas-looping
[BUGFIX] Fix texture atlas sprites looping infinitely
2025-05-02 17:52:13 -04:00
cyn0x8 6f43438cdb hopefully fix #4814 2025-05-02 16:41:03 -05:00
cyn0x8 a74369c77e fixes + stronger sandboxing 2025-05-02 16:40:50 -05:00
CrusherNotDrip def1b74eb6
Stop the game from crashing when clicking a recent chart before tooltip appears 2025-05-02 16:40:31 -04:00
Eric 6bdfde4a72
Merge pull request #4934 from VioletSnowLeopard/patch3
<RECOVERY> Restore a commit from Hundrec
2025-05-02 16:06:38 -04:00
Eric c70fa7c94a
Merge pull request #4933 from VioletSnowLeopard/patch2
Fix the Changelog on the develop branch again
2025-05-02 16:06:29 -04:00
Abnormal c0353bca2b remove extra callback (already gets called in _onAnimationComplete() by dispatching the animation name to onAnimationComplete 2025-05-02 13:53:30 -05:00
Abnormal f385cf9fd3 fix: Fix texture atlases looping indefinitely 2025-05-02 13:52:16 -05:00
Eric 301f71b428
Merge pull request #4930 from Hundrec/Lasercar/commit-recovery
<RECOVERY> Restore two of Lasercar's commits
2025-05-02 14:30:11 -04:00
Eric 189e028442
Merge pull request #4931 from ACrazyTown/fix/crash-log-memory-overflow
Fix memory overflow in crash log (Redo)
2025-05-02 14:30:03 -04:00
Eric a9647cf9fc
Merge pull request #4617 from Lasercar/destroy-the-volume-plugin
[BUGFIX] Destroy the volume plugin when wiping save data
2025-05-02 14:29:54 -04:00
Eric 05b9d68645
Merge pull request #4227 from Lasercar/main-menu-not-remembering-freeplay-menu-selection-fix
Main menu not remembering freeplay menu selection fix
2025-05-02 14:29:29 -04:00
Eric 45f0f14ed9
Merge pull request #4318 from Lasercar/fix-strumline-offset-when-downscroll
Fix strumline offset when downscroll
2025-05-02 14:29:11 -04:00
Eric a8262a8d3b
Merge pull request #3090 from anysad/fix-animation-file-save
[BUGFIX] Animation Editor not saving the file name
2025-05-02 14:21:46 -04:00
Eric 264c2d8e77
Merge pull request #4266 from NotHyper-474/bugfix/chart-editor-broken-resize
[BUGFIX] Chart Editor - Fix resolution breaking after returning from PlayState
2025-05-02 14:21:33 -04:00
Eric b2f231e889
Merge pull request #4871 from NotHyper-474/bugfix/initstate-spam-medal-crash-fix
[BUGFIX] Fix crash when spamming enter when opening game (properly this time)
2025-05-02 14:21:21 -04:00
Hundrec 360b73dd0b Specify "flip horizontally" shortcut in Changelog entry 2025-05-02 11:15:41 -04:00
VioletSnowLeopard 34bb201104 Fix the changelog again 2025-05-02 11:02:29 -04:00
Hundrec d9fcaf0e63 Restore Lasercar's changes
Dropped them somewhere whoopsie

Co-Authored-By: Lasercar <64717068+Lasercar@users.noreply.github.com>
2025-05-02 05:02:29 -06:00
Eric 56259b9143
Merge pull request #4923 from Hundrec/negative-freeplay-clear
[BUGFIX] Fix `Fix Fix scoring changes`
2025-05-01 23:43:49 -04:00
Hundrec dc2acac152 no more negative clear percent shenanigans
"a thousand curses upon you for not testing your prs before making them /j"
- AbnormalPoof

Co-Authored-By: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
2025-05-01 21:23:55 -06:00
JackXson-Real 62510c2403 Bump Repo Version to 0.6.4 2025-05-01 22:52:35 -04:00
Eric a2e647ac8b
Merge pull request #984 from FunkinCrew/funkin-mobile/main
The BIG Mobile branch
2025-05-01 22:06:08 -04:00
EliteMasterEric c823bba3d1 Fix some merge conflict issues 2025-05-01 22:03:50 -04:00
Eric bf5a669592
Merge pull request #4919 from Kade-github/real-capsule-fix
Sorting in freeplay is weird
2025-05-01 21:56:24 -04:00
kade-github 8b9775d91f
the falsening by VioletSnowLeopard 2025-05-01 18:50:03 -07:00
EliteMasterEric e917da0a7b Merge branch 'rewrite/master' into funkin-mobile/main 2025-05-01 21:46:20 -04:00
Eric 6caeda9a9d
Merge pull request #4898 from Lasercar/fix-fix-scoring-changes
[BUGFIX] Fix `Fix scoring changes`
2025-05-01 21:42:29 -04:00
Eric 9983556748
Merge pull request #4358 from VioletSnowLeopard/fix-special-pause-menu-chance
[BUGFIX] Fix the chance of getting the special pause menu
2025-05-01 21:40:58 -04:00
EliteMasterEric 651298e908 Update assets submodule 2025-05-01 21:37:52 -04:00
Hyper_ 142ea6db0c fix: Force UI Camera resize 2025-05-01 22:32:02 -03:00
Eric 5397924edd
Merge pull request #4913 from VioletSnowLeopard/fix-switching-filters
[BUGFIX] Fix the Behavior of Selected Song when Changing Filters in Freeplay
2025-05-01 21:24:52 -04:00
EliteMasterEric 94bd18fe17 Merge remote-tracking branch 'public/main' into develop 2025-05-01 21:10:40 -04:00
Eric 664d9e0fb3
Merge pull request #4214 from Lasercar/freeplay-ui-fixes
Freeplay UI fixes
2025-05-01 21:07:51 -04:00
VioletSnowLeopard edf6889af9 fix switching filters to do its intended behavior 2025-05-01 20:57:39 -04:00
Eric c65dddacc0
Merge pull request #4894 from AbnormalPoof/chore/art-submod
[GITHUB] Update `art` submodule to the latest commit
2025-05-01 20:43:41 -04:00
Eric 659ea41206
Merge pull request #4649 from NotHyper-474/feature/chart-more-song-info
[ENHANCEMENT] Chart Editor - Display current beat & step
2025-05-01 20:37:40 -04:00
Eric 5cd47a4414
Merge pull request #4553 from VioletSnowLeopard/fix-dialogue-pause-menu
Change order of Restart and Skip in Dialogue pause menu
2025-05-01 20:37:18 -04:00
EliteMasterEric 8de74c361c Additional cleanup 2025-05-01 19:55:44 -04:00
MoonDroid 6c842fea20 Make widescreen not mobile only.
Fix a typo in Main too.
Reposositon
2025-05-02 00:26:59 +07:00
MoonDroid 41ce874595 Update Android setup docs. 2025-05-01 23:27:05 +07:00
MoonDroid 9216fff9b0 Move InAppPurchasesUtil and AdMobUtil to funkin/api/mobile 2025-05-01 23:24:51 +07:00
Eric 65699ee865 Update CONTRIBUTING.md 2025-05-01 01:38:44 -04:00
Hundrec d423eb3ddd Update Charting PR policy in CONTRIBUTING.md
We no longer accept chart modifications.
2025-05-01 01:38:44 -04:00
unknown c67085a46a
Fix memory overflow in crash log 2025-04-30 23:41:14 +02:00
Hyper_ a83a4a599c fix: Null-check MedalList's internal map 2025-04-30 12:31:01 -03:00
Lasercar f6ac4cad43 Whoops, missed this one 2025-04-30 23:58:09 +10:00
VioletSnowLeopard 0101bae7ec convert decimal chance to percent 2025-04-30 09:31:22 -04:00
Abnormal 4c5335d7a3 art submod 2025-04-30 02:37:13 -05:00
EliteMasterEric b811ca91a6 Update link to art submodule to include latest assets 2025-04-30 02:01:54 -04:00
Hyper_ c5f2a74494 fix: Prevent loading invalid variation 2025-04-30 00:44:12 -04:00
Kolo 3e0dbe2758 performCleanup on reload 2025-04-30 00:43:37 -04:00
thesuperpig56 bbc0546c74 Shortened statement based on suggestion.
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-04-30 00:42:15 -04:00
thesuperpig56 617d5ffa06 Called the wrong character here, whoops! 2025-04-30 00:42:15 -04:00
thesuperpig56 73114e2da6 Avoid crash when restarting song without characters. 2025-04-30 00:42:15 -04:00
Kolo 808698ace7 medal fix thing 2025-04-30 00:41:28 -04:00
VioletSnowLeopard 832bc5bd83 fix two issues with random capsule 2025-04-30 00:37:08 -04:00
EliteMasterEric 0253df7269 Feature flag cleanup 2025-04-30 00:31:31 -04:00
EliteMasterEric 40f44ece5b Dependency cleanup 2025-04-30 00:30:51 -04:00
TechnikTil b15e809c63 fix freeplay dj softlock 2025-04-29 18:01:55 -04:00
Lasercar 8074d57186 Don't add the default difficulty to song metadata
It'll now only add the current difficulty to the metadata if it doesn't exist in it when saved.
2025-04-29 18:01:23 -04:00
Kolo 31d3718e5c music file priority thing
(updated a misleading comment, lols!)
2025-04-29 16:27:21 -04:00
Lasercar 5fdbd23a17 Misses now actually make you miss your grade
Sustain notes no longer add to the miss tally
2025-04-29 16:24:50 -04:00
Eric 23a9e7f944
Merge pull request #4881 from Lasercar/fix-preferences-not-saving-due-to-enums-AGAIN
[BIGFIX] Fix Options not loading from Save Data
2025-04-29 16:23:47 -04:00
Eric 0397a41a7f
Merge pull request #4883 from Hundrec/patch-11
[DOCS] Credit Lasercar for a crash fix from an assets PR
2025-04-29 16:23:31 -04:00
KarimAkra 49114c5d37 Merge branch 'funkin-mobile/main' of github.com:FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-29 19:02:21 +03:00
MoonDroid 9b8330ced1 Merge branch 'funkin-mobile/main' of https://github.com/FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-29 22:33:14 +07:00
MoonDroid 1baf7fea80 Update mobile compiling guide with detailed setup instructions for Android on Windows and macOS 2025-04-29 22:33:02 +07:00
KarimAkra 588eea019d fixed memory counter position 2025-04-29 17:06:55 +03:00
KarimAkra 9307f514fe Added safety checks for ASTC textures 2025-04-29 17:05:20 +03:00
Lasercar afbb335993 Destroy the volume plugin 2025-04-29 20:23:52 +10:00
Lasercar 2bc1a31427 fix capsule jumpin and random capsule starting x position 2025-04-29 20:04:56 +10:00
Lasercar dafbb43532 capsule jump in 2025-04-29 19:59:35 +10:00
Lasercar 4978c89ac3 capsule options menu null reference fix 2025-04-29 19:57:31 +10:00
Lasercar 29b541af38 First rank overrides itself fix 2025-04-29 19:57:31 +10:00
Lasercar fc09350be7 This should fix the squashed capsule text, right? 2025-04-29 19:57:23 +10:00
Lasercar e1ca3c69f0 Fixed letter sort animation 2025-04-29 19:53:32 +10:00
Lasercar a15bd36943 Freeplay UI fixes
Input is disabled as soon as possible when a capsule is open
Input re-enables after capsule errors
instrument selector uses the capsule's target position as it's position, rather than the capsule's position
2025-04-29 19:53:32 +10:00
Hundrec 51605e50f8
Credit Lasercar for a crash fix from assets PR 2025-04-29 01:31:19 -06:00
Lasercar 3a1b573ea3 Fix save being loaded twice for no reason 2025-04-29 17:14:23 +10:00
Lasercar ef6b214872 Save vsync mode as string but get as vsync mode 2025-04-29 17:14:23 +10:00
sector-a e6df6d5116 Temporarily remove nullSafety in two classes 2025-04-29 04:13:25 +03:00
sector-a d82d231539 Set minimal android sdk version through Project.hxp 2025-04-29 03:56:09 +03:00
Eric 8f2a8c8335
Merge pull request #4873 from NotHyper-474/patch-1
Remove leftover from merge-conflict in CHANGELOG
2025-04-28 17:59:02 -04:00
Hyper_ 7f5b4974c3
Update CHANGELOG.md
Remove left-over from merge conflict.
2025-04-28 18:30:39 -03:00
Eric d63782ee9d
Merge pull request #4869 from ShadzXD/patch-3
[DOCS] Update CHANGELOG.MD to include my pull request.
2025-04-28 17:01:12 -04:00
EliteMasterEric 19b1c32124 Merge remote-tracking branch 'public/develop' into develop 2025-04-28 16:56:51 -04:00
ShadzXD d183876514
Merge pull request #1 from Hundrec/patch-11
Tiny polish for Eggnog cutscene Changelog entry
2025-04-28 22:50:36 +02:00
Hundrec db0ac48192
Tiny polish for Eggnog cutscene Changelog entry 2025-04-28 14:47:42 -06:00
Eric ba37405e4b
Merge pull request #4868 from Hundrec/remove-changelog
Remove Changelog from game files
2025-04-28 16:40:53 -04:00
ShadzXD 66197b34f6
Update CHANGELOG.md 2025-04-28 22:40:26 +02:00
Hundrec a7da71c8a8 Remove Changelog from game files
since it keeps getting revised after each release

Co-Authored-By: Hyper_ <40342021+NotHyper-474@users.noreply.github.com>
2025-04-28 14:38:52 -06:00
Eric 5bd081c2af
Merge pull request #4866 from Hundrec/0.6.3-changelog-additions
[DOCS] Additional 0.6.3 Changelog bugfix entries + updated commit links
2025-04-28 16:26:51 -04:00
Eric aefc4db277
Merge branch 'main' into 0.6.3-changelog-additions 2025-04-28 16:26:43 -04:00
Eric adc14cc15d
Merge pull request #4867 from FunkinCrew/develop2
Copied some files that weren't in main before back into develop
2025-04-28 16:21:54 -04:00
Eric a8294a9cce
Merge pull request #4865 from FunkinCrew/0.6.3-release
Move public fix to main branch
2025-04-28 16:15:57 -04:00
EliteMasterEric 80569c806c Merge remote-tracking branch 'public/main' into 0.6.3-release 2025-04-28 16:15:09 -04:00
EliteMasterEric d6837eba2e Merge remote-tracking branch 'public/main' into 0.6.3-release 2025-04-28 16:14:37 -04:00
EliteMasterEric 0d7c78305d Split up the compiling guide for mobile into its own file to keep things organized (may need additional proofreading) 2025-04-28 14:09:40 -04:00
EliteMasterEric e71bd1f5a4 Remove outdated unused chart docs 2025-04-28 14:09:13 -04:00
EliteMasterEric 7e62782fa1 Merge branch 'rewrite/master' into funkin-mobile/main 2025-04-28 13:49:40 -04:00
Hundrec 924b1cf386
Remove Newgrounds authentication entry
because it wasn't actually fixed
2025-04-27 20:43:09 -06:00
Hundrec 0839c16535
More 0.6.3 entries + updated commit links 2025-04-27 06:04:15 -06:00
KarimAkra 7fe621a839 Small implementation to ASTC textures 2025-04-27 14:33:34 +03:00
Karim Akra 7dc4bb940c
Set screen metrics for launch storyboard 2025-04-27 04:09:12 +03:00
Hundrec db3e012cb0
[DOCS] Changelog for 0.6.3 (#4816)
* Changelog for 0.6.3

* Clarify mod API version entry

* 0.6.3 Changelog tweaks
2025-04-26 05:18:01 -04:00
Til 6c2ebff680
bump to 0.6.3 (#4448)
Co-authored-by: Eric <ericmyllyoja@gmail.com>
2025-04-26 00:48:37 -04:00
Eric df0f915be5
Merge pull request #1014 from FunkinCrew/kade-github/pico-mix-bugfix
FUNK-1944 Bugfix for Pico (Pico Mix's) that would cause the doppelganger cutscene bad shit
2025-04-25 22:29:54 -04:00
EliteMasterEric 104d3cffcb Merge branch 'rewrite/master' into kade-github/pico-mix-bugfix 2025-04-25 22:29:32 -04:00
EliteMasterEric 584b1ece07 Update assets submodule 2025-04-25 22:27:57 -04:00
Eric 4555b6736e Rewrote recommendation to use Funkin haxelib and hmm 2025-04-25 21:41:16 -04:00
Hundrec 0c674ac23b Specify "flip horizontally" shortcut in Changelog entry 2025-04-25 21:37:11 -04:00
Eric c5e5ab16df Recommend Funkin's fork of hmm (fewer issues with Lime) 2025-04-25 17:50:45 -04:00
EliteMasterEric adefa902e7 Fix several issues preventing builds on HTML5 2025-04-25 12:14:28 -07:00
kade-github 63f216ea71
assets submodule update 2025-04-25 12:06:48 -07:00
EliteMasterEric 03d46084b4 Update game version to v0.6.3. 2025-04-25 02:32:28 -04:00
kade-github 19eb138666 vwooshin for retry 2025-04-25 00:32:07 -04:00
EliteMasterEric e21b01aa66 Fix a broken usage. 2025-04-25 00:32:00 -04:00
EliteMasterEric c41c800998 Fix a bug where render distance ignores scroll speed (test on 0.5x scroll speed), then do some code cleanup and documentation. 2025-04-25 00:32:00 -04:00
Cameron Taylor b7675aa440 assets submod (Cheer overrides lightning scare from kade) 2025-04-25 00:20:46 -04:00
Cameron Taylor 745f49ca6d tiny little cleans in char select nametag 2025-04-24 19:26:35 -07:00
Cameron Taylor 78646c4635 fix for difficulty stars not appearing when returning from character select 2025-04-24 19:14:11 -07:00
Cameron Taylor f1cc092820 quickie haxe checkstyle thing that annoy me all the time grr.. 2025-04-24 21:29:18 -04:00
Cameron Taylor 7e200241ef assets submod (satin panties fixins) 2025-04-24 20:54:57 -04:00
Eric 1c4b8751b7
Pico Results Screen Easter Egg (#1007) 2025-04-23 16:52:29 -07:00
Abnormal 926d8c0517 Contributor's Guide Maintenance Policy
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-04-23 17:06:13 -04:00
EliteMasterEric e290e0c702 Make merch referrals error-proof (they don't work if the API is disabled whoops!) 2025-04-22 19:14:15 -04:00
nebulazorua 53dec057be vuln patch part 1
so now you cant open files as easily i think

oops
2025-04-22 19:14:15 -04:00
Cameron Taylor b3f1798320 assets submod (tankman deathlines for bf) 2025-04-22 19:02:58 -04:00
Hyper_ f20b938f3f 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
2025-04-22 19:02:56 -04:00
Hyper_ 85915eae8c Implement suggestion: Fractional beat display 2025-04-22 19:02:09 -04:00
Hyper_ 83bb3bb507 feat: Show current beat and step next to song position 2025-04-22 19:02:09 -04:00
Kade 642b2142ca Merge pull request #999 from FunkinCrew/kolo/chart-event-crash-fix
[PUBLIC PR] Fix a crash when messing with events in the chart editor
2025-04-22 19:00:24 -04:00
Kade 0c6b730647 Merge pull request #998 from FunkinCrew/kolo/cap-score-display
[PUBLIC PR] Cap Score Displays to their biggest possible values
2025-04-22 19:00:24 -04:00
Kolo 83c367e23b another bugfix yeah
i hate dropdowns i hate dropdowns i hate dropdowns
2025-04-22 19:00:24 -04:00
Kade fe7bf3dd55 Merge pull request #994 from FunkinCrew/cyn0x8/fileutil-sandbox
[PUBLIC PR] Sandboxing for FileUtil (prevent deleting important game files etc)
2025-04-22 19:00:24 -04:00
Kade 273d950899 Merge branch 'rewrite/master' into kolo/cap-score-display 2025-04-22 19:00:24 -04:00
Kolo 9e61481cfe Merge branch 'develop' of https://github.com/FunkinCrew/Funkin into chart-events-fix 2025-04-22 19:00:24 -04:00
Super e572c7c2fb Remove FlxG.fixedTimeStep from PlayState
It's in TitleState now
2025-04-22 19:00:24 -04:00
cyn0x8 95ade2a08b FileUtil overhaul + sandboxing 2025-04-22 19:00:24 -04:00
Kolo 51324e9c28 mmyes 2025-04-22 19:00:24 -04:00
Abnormal e6e3a30c0c docs: Add missing documentation to the remaining functions in Module 2025-04-22 19:00:24 -04:00
Super 2b7254fbd2 Add FlxG.fixedTimestep change to initState 2025-04-22 19:00:24 -04:00
Hundrec d54df57b95 Two more Chart Editor entries in Changelog 2025-04-22 19:00:24 -04:00
Cameron Taylor b295e31266 Merge branch 'rewrite/master' into public-changes 2025-04-22 19:00:24 -04:00
Hundrec 695c708cb0 Add a few fixes and changes from 0.6.0 2025-04-22 19:00:24 -04:00
EliteMasterEric 4a7f56a7ad Merge remote-tracking branch 'public/develop' into develop 2025-04-22 19:00:24 -04:00
Hundrec 030abed207 Oops, one more lil space 2025-04-22 19:00:24 -04:00
Hundrec 0d8cfaf104 Remove 0.6.0 Changelog entries that weren't implemented + polish 2025-04-22 19:00:24 -04:00
EliteMasterEric caf708fe4a Merge remote-tracking branch 'public/main' into develop 2025-04-22 18:41:41 -04:00
Hundrec e7cf5fbbdc Grammatical fix in style-guide.md 2025-04-22 18:41:41 -04:00
Hundrec ccaa3d1070 Consistent hyphens in CODESTYLE.md 2025-04-22 18:41:41 -04:00
Hundrec 4b883d4339 Restore Contributing Guide to latest version
Merge conflicts yay

Co-Authored-By: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-04-22 18:41:41 -04:00
sector-a b40b4b0369 Fix Animation Editor Crash
Fix poor code formatting

This is unnecessary now
2025-04-22 15:53:53 -04:00
Cameron Taylor aa37745bbd assets submod (week 6 shader fixin) 2025-04-22 15:51:45 -04:00
sector-a 5279aefec9 Assets ref 2025-04-21 18:46:18 +03:00
KarimAkra b541c5d974 disable DPI awareness as it causes issues 2025-04-21 01:11:17 +03:00
KarimAkra 4d77d21b15 Refactor menus UI positioning for notch size to look cleaner 2025-04-21 01:10:37 +03:00
KarimAkra 7f19faabc4 Merge branch 'funkin-mobile/main' of github.com:FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-20 22:09:59 +03:00
KarimAkra 2ba225265f Apply a custom LaunchScreen.storyboard for iOS
This makes the app use a proper logcal resolution (point per pixel res, not native idk why & i hate iOS)
2025-04-20 22:09:56 +03:00
MoonDroid 10d58c26b0 Merge branch 'funkin-mobile/main' of https://github.com/FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-20 21:09:16 +07:00
MoonDroid e0e660f357 Update art ref. 2025-04-20 21:09:11 +07:00
MAJigsaw77 647b69bb0c Use gradients on labels. 2025-04-20 10:42:31 +03:00
MAJigsaw77 94cd22e243 Follow the notch possition on CreditsState. 2025-04-20 10:41:09 +03:00
MAJigsaw77 324ef37505 Follow the notch possition on StoryMenuState. 2025-04-20 10:40:44 +03:00
MAJigsaw77 3cc189869b Some formatting on InAppPurchasesUtil. 2025-04-20 10:39:47 +03:00
EliteMasterEric df6ffca01f Update assets submodule (charting revert stuff) 2025-04-19 19:41:27 -04:00
EliteMasterEric 9dd8a257df Update assets submodule to include twenty-seven chart tweak commits 2025-04-19 19:38:18 -04:00
MAJigsaw77 cc7def5178 Somewhat finished the IAP implementation. 2025-04-20 00:39:14 +03:00
sector-a 842d1a72a4 DialogueBox tweaks for fullscreen 2025-04-19 23:11:58 +03:00
KarimAkra 3d52aab7a3 Use correct path for the .env file for iOS 2025-04-19 12:26:39 +03:00
KarimAkra f3b20dbbd3 properly calculate gameNotchSize and gameNotchPosition 2025-04-19 12:24:12 +03:00
KarimAkra a54bf9c7fd Merge branch 'funkin-mobile/main' of github.com:FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-19 12:21:35 +03:00
KarimAkra 2ae503cfec Properly define openfl_dpi_aware in Project.hxp 2025-04-19 12:21:31 +03:00
MoonDroid b8db4947d6 Merge branch 'funkin-mobile/main' of https://github.com/FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-19 16:09:36 +07:00
MoonDroid 53794ab4cc Fix compiling for desktop platforms by adding missing conditionals in some classes. 2025-04-19 16:09:19 +07:00
MoonDroid 804984b8c1 Add conditional path for DATA_FILE_BASE_PATH for iOS. 2025-04-19 16:08:30 +07:00
MoonDroid 63ec721aa1 Fix notch calculation for iOS. 2025-04-19 16:06:57 +07:00
mint 2984ce4852
hotfix(ci): use our own runners again :) 2025-04-19 03:23:27 +02:00
mint 8fb35ac822
hotfix(ci): for now, disable fail-fast so we can get some windows builds 2025-04-19 03:17:47 +02:00
mint e8c42c281f
hotfix: mac lime ndlls again? 2025-04-19 02:58:52 +02:00
mint 68892b92ab
hotfix(ci): bump neko version to 2.4.1 2025-04-19 02:32:22 +02:00
Cameron Taylor 12ee60f776 Mac ndlls lime hmm bump 2025-04-18 20:18:39 -04:00
Cameron Taylor 945314d271 lime bump for windows fix 2025-04-18 19:41:53 -04:00
EliteMasterEric 93d4f30cad Make ScreenshotPlugin null-safe. 2025-04-18 19:40:39 -04:00
Abnormal dda91cf770 change requested by eric 2025-04-18 19:35:24 -04:00
Abnormal 6a1160feab chore: Enable null safety for 11 classes 2025-04-18 19:35:24 -04:00
kade-github b48b5ae1aa remember diff for generate song list 2025-04-18 17:33:31 -04:00
MAJigsaw77 0444d47458 Dont add the fpsCounter on Main.
I think this was a left over?
2025-04-18 23:44:42 +03:00
MAJigsaw77 2ac0627063 Update extensions on hmm.json. 2025-04-18 18:28:36 +03:00
MAJigsaw77 b755ed8d98 Implement extension-iapcore and testing for it. 2025-04-18 18:28:09 +03:00
KarimAkra 64126a3df5 fixed StickerSubState import on PauseSubState 2025-04-18 17:08:46 +03:00
KarimAkra e78d3ecf8f remove VSync option from mobile 2025-04-18 14:47:56 +03:00
KarimAkra c246de1ee1 these workflows shouldn't be here 2025-04-18 14:43:03 +03:00
KarimAkra a7ef5580a4 Merge branch 'rewrite/master' of github.com:FunkinCrew/Funkin-secret into funkin-mobile/main 2025-04-18 14:41:20 +03:00
KarimAkra f961b1cae2 update assets submodule 2025-04-18 14:38:14 +03:00
KarimAkra 827066b589 Added extension-haptics, extension-admob and extension-androidtools to hmm.json 2025-04-18 14:35:11 +03:00
KarimAkra 1dfe8866ab Don't touch the flixel soundtray on mobile targets
FlxG.game.soundTray stays null on mobile targets
2025-04-18 14:34:32 +03:00
fabs 5bf8154e0b otis muzzle flashing (assets submod) 2025-04-17 19:59:59 -04:00
EliteMasterEric 6de51848fd Update assets submodule 2025-04-17 19:59:59 -04:00
Cameron Taylor ee906ae8c0 fix: make the sound tray volume be less loud (#990) 2025-04-17 19:59:59 -04:00
Kade 7eebce432d [PUBLIC PR] Prevent softlock caused by removing all keybinds for a UI control (#988)
* prevent removing last keybind for UI controls

* add popup to alert you cannot remove keybind

* ensure controls list is unique

* Use public submodule URLs (would be nice if this was automatic but oh well)

---------

Co-authored-by: VioletSnowLeopard <ngzeretzke@gmail.com>
Co-authored-by: EliteMasterEric <ericmyllyoja@gmail.com>
2025-04-17 19:59:59 -04:00
EliteMasterEric 750779a3fb Disable the pop-in animation on the Random capsule for consistency. 2025-04-17 18:25:44 -04:00
kade-github 095bc9006d animation on all diffs 2025-04-17 18:25:44 -04:00
kade-github 09fdd0c91e going to erect with the erect takes you to the closest erect 2025-04-17 18:25:44 -04:00
kade-github be5d6227a7 erect nearest neighbor select 2025-04-17 18:25:44 -04:00
sector-a 14cf382192 Update assets 2025-04-17 21:34:02 +03:00
sector-a 1f22313b8a Force downscroll mode for Arrows controls scheme 2025-04-17 21:33:58 +03:00
sector-a e359dad1e8 Remove option item for HitboxShowcase 2025-04-17 21:07:44 +03:00
sector-a 4d88df2120 Don't create Launch in Fullscreen preference item on mobile 2025-04-17 20:37:43 +03:00
sector-a 1c11a7003f Fix controls scheme menu 2025-04-17 20:23:13 +03:00
sector-a 2932c24418 Add UNLOCK_EVERYTHING for testing purpose 2025-04-17 20:04:05 +03:00
sector-a bb46b699eb Prevent SoundTray crash and Update Assets 2025-04-17 19:53:11 +03:00
sector-a dc000b33eb Add FEATURE_HAPTICS 2025-04-17 19:51:36 +03:00
MoonDroid 75d8101030 Comment this out temporarily until we fix up flixel. 2025-04-17 21:53:12 +07:00
MoonDroid 90fb8a1883 Fix black screen bug in StoryMenuState. 2025-04-17 21:52:51 +07:00
MoonDroid 50baf0c869 Fix idling difficulty position in FreeplayState. 2025-04-17 21:52:51 +07:00
MoonDroid 9e133b0a8a Fix a lil typo from the project file. 2025-04-17 20:27:44 +07:00
KarimAkra da3f5a48c9 Updated assets submodule 2025-04-17 16:20:59 +03:00
KarimAkra 36d361aa22 fixed the admob app id env being incorrect lol 2025-04-17 16:14:59 +03:00
KarimAkra b6e31e581a Fixed building errors 2025-04-17 14:51:33 +03:00
KarimAkra 5dd26101f2 Added environment config for getting android keystore & admob IDs 2025-04-17 14:22:45 +03:00
MoonDroid 81c92fc11f Fix a bug with freeplay's difficulty swiping where it freezes the capsule. 2025-04-17 13:16:23 +03:00
MoonDroid 44e166d411 Turn off non-exempt encryption config for iOS 2025-04-17 13:16:06 +03:00
KarimAkra 5b8b943b99 allow changing difficulty on story mode by swiping left and right 2025-04-17 13:15:06 +03:00
MoonDroid c9138e4d1f Small clean up to the new code in Freeplay. 2025-04-17 13:14:40 +03:00
MoonDroid 2bfc24f22b Add the ability to swipe on the mp3 capsules to change difficulty. 2025-04-17 13:14:16 +03:00
MoonDroid ebb9d373c3 Refactor handleInput() into smaller neater functions, and add an extra difficulty check to avoid swipe issues. 2025-04-17 13:13:54 +03:00
sector-a fc2e28ab18 Adjust strumline background for Arrows scheme 2025-04-17 13:12:41 +03:00
sector-a b4f30c341e Fix strumline background 2025-04-17 13:12:18 +03:00
sector-a 995f6c5adb Do not create screenshot options if FEATURE_SCREENSHOTS is disabled 2025-04-17 13:11:57 +03:00
Karim Akra 7dee8e6e54 Give bundles a designated gradle project folder for building 2025-04-17 13:10:11 +03:00
sector-a bcdbe2993c Fix selection in Freeplay 2025-04-17 13:09:57 +03:00
sector-a 8bf14b7d0c Scale the dialogue box and speaker on fullscreen 2025-04-17 13:09:44 +03:00
sector-a 261a237934 Fix difficulty stars position 2025-04-17 13:09:09 +03:00
KarimAkra ede705987c Possibly fixed notch calculation for iOS 2025-04-17 13:08:27 +03:00
MAJigsaw77 edfcfc8c55 Disable screenshots for mobile platforms 2025-04-17 13:08:07 +03:00
MoonDroid 828de1c512 Add grpDifficulty back to freeplay. 2025-04-17 13:06:01 +03:00
MoonDroid 85e77486f7 Properly fixed the strumline crash and visual bugs for mobile. 2025-04-17 13:06:01 +03:00
MoonDroid 50f467c366 Temporary crash fix for strumlines on mobile. 2025-04-17 13:03:27 +03:00
MAJigsaw77 97f8de0de4 Fixed notch position with createPrefItemEnum. 2025-04-17 13:03:27 +03:00
Karim Akra dfa8e635f1 Use pad delivery assets on bundles only 2025-04-17 13:03:27 +03:00
sector-a ed5b7fbb31 Do not initialize NewgroundsMedalPlugin if newgrounds feature is disabled 2025-04-17 13:03:27 +03:00
sector-a 418f7d71f9 Small fixes 2025-04-17 13:03:27 +03:00
sector-a 7111492578 Don't make it inline 2025-04-17 13:03:27 +03:00
sector-a baaaaddead Small fix 2025-04-17 13:03:27 +03:00
sector-a c2956cd253 Put newgrounds related code in a define 2025-04-17 13:03:27 +03:00
sector-a 999557b501 Add private access to get funnyCam 2025-04-17 13:03:27 +03:00
sector-a 73914c6858 Don't build credentials if newgrounds feature is disabled 2025-04-17 13:03:27 +03:00
sector-a 4976a099af Fix FunkinHitbox 2025-04-17 13:03:27 +03:00
sector-a ec5f8344ed Put onEventLogged under a define 2025-04-17 13:03:26 +03:00
sector-a 219c46f56b Fix an import path 2025-04-17 13:03:26 +03:00
sector-a 4f5b0f2453 Put newground imports in Events class under a define 2025-04-17 13:03:26 +03:00
sector-a 0d2c48c374 Don't enable newgrounds API features on mobile 2025-04-17 13:03:01 +03:00
MAJigsaw77 359e40bf4d Add lerping to the fps & memory counters reposition. 2025-04-17 12:56:58 +03:00
MAJigsaw77 bd39e2023c Change the duration and ampl of the sticker vibration. 2025-04-17 12:55:56 +03:00
MAJigsaw77 809f4107ab Fix hitbox's hint's label tweening. 2025-04-17 12:55:43 +03:00
MAJigsaw77 e838fef8e6 Update to extension-haptics and update extension-admob aswell. 2025-04-17 12:55:12 +03:00
MoonDroid 2c5c66286a Move admob interstitial trigger from transition to targetState switching in ResultState. 2025-04-17 12:54:10 +03:00
MoonDroid a64f7aa5d3 Fix bundling gradle error for android. 2025-04-17 12:53:07 +03:00
MoonDroid 5ca22a6910 Fix options menu hitboxes 2025-04-17 12:52:19 +03:00
MAJigsaw77 bed90dc230 Add InAppPurchasesUtil. 2025-04-17 12:50:25 +03:00
sector-a ff144cf30b Fix a typo in options desc 2025-04-17 12:49:17 +03:00
MoonDroid 58468abba7 Slightly push the album art and title upwards to fix the overlapping issue with the back button on mobile. 2025-04-17 12:46:45 +03:00
MAJigsaw77 5d26f8b433 Move the banner to top-left and fix some offsets inside the pause menu. 2025-04-17 12:46:10 +03:00
sector-a b68ba97ca6 Add tween out for backbutton in freeplay when the menu gets closed. 2025-04-17 12:44:30 +03:00
sector-a ba449cabd6 Added vibrations to the sticker transition 2025-04-17 12:44:07 +03:00
MoonDroid 61f1bdd89a Refactor the new flick and scroll code for mobile, aswell as fix a few unnoticable bugs. 2025-04-17 12:43:23 +03:00
MoonDroid 6d6441de6f Tweak hitbox values for the default control scheme on mobile. 2025-04-17 12:43:15 +03:00
MoonDroid f7f502dd92 Tweak scrolling values for mobile & fix flick wrapping for mobile in Freeplay. 2025-04-17 12:42:50 +03:00
zackdroidcoder 6133087c2c Remove project file's attempt at signing, add noalpha icons for iOS 2025-04-17 12:41:26 +03:00
zacksgamerz 4226ba8978 Work in progress sketch for new flicks and scrolls on freeplay 2025-04-17 12:40:21 +03:00
Karim Akra b012096151 Update signing method 2025-04-17 12:39:20 +03:00
KarimAkra 39313be86b revert things i accidentally comitted 2025-04-17 12:38:15 +03:00
Mihai Alexandru b1986fb9c5 Fix boundingBoxColor nullSafety. 2025-04-17 12:36:28 +03:00
KarimAkra 4d74ccbc4e add a -test compile flag 2025-04-17 12:36:12 +03:00
KarimAkra bef3815901 Fixed freeplay highlight and selection 2025-04-17 12:34:17 +03:00
KarimAkra 37fa11fe08 revamp songs selection and highlight on freeplay 2025-04-17 12:34:17 +03:00
KarimAkra e8d3fa8a35 simplfy the un-indexed freeplay scrolling logic 2025-04-17 12:34:17 +03:00
KarimAkra 0a0789faea Fixed selection 2025-04-17 12:32:28 +03:00
KarimAkra 5d6e44d5f1 Un-index freeplay
that's experimental
there's a weird bug when selecting a song where it confirms instead of selecting for some reason
2025-04-17 12:26:10 +03:00
zacksgamerz 7119d6a476 Tune the size of the hitboxes, strums, and incoming notes to be slighlty bigger. 2025-04-17 12:24:45 +03:00
sector-a 1093dd3400 Make pico playable haptics also work for dark and christmas versions 2025-04-17 12:24:29 +03:00
MAJigsaw77 c7906edc1e Some things
* Fixed some other checkstyle issues.
* The controls schemes options menu now shows the hitboxes without a gradient to look better.
* Attempted to rewrite the tweeing system on the FunkinHint, needs more looking.
2025-04-17 12:22:56 +03:00
sector-a 3fcc2cc5bc Add unique haptics for each game over animation 2025-04-17 12:22:56 +03:00
MAJigsaw77 34f97e3e3e One lined tweens for the bg. 2025-04-17 12:22:56 +03:00
Mihai Alexandru e0fcd655e7 Change the pointers for iOS at ScreenUtil 2025-04-17 12:22:32 +03:00
MAJigsaw77 b1089958c7 Tween the bg color to gray when entering demo mode. 2025-04-17 12:20:40 +03:00
MAJigsaw77 ea2b63b1bb Updated some stuff
* Fixed some check-style warnings
* Merged polygon button and normal button together
* Updated `funkin.haptic` ref.
* Simplified `getNotchRect` for `iOS`.
2025-04-17 12:19:24 +03:00
MAJigsaw77 7fb5d8c65c Fixed a checkstyle issue with admob util. 2025-04-17 12:15:10 +03:00
MAJigsaw77 86f8cb76f2 Simplified some logic in the admob util. 2025-04-17 12:14:55 +03:00
sector-a b03eef01ca Add sharpness for vibrations (iOS only) 2025-04-17 12:13:47 +03:00
sector-a 5d7517b839 Fix sustain notes vibrations for pixel notes 2025-04-17 12:08:23 +03:00
sector-a 1790c13fac Changed vibration at rank tally animation end in results screen 2025-04-17 12:08:13 +03:00
sector-a 180ec17ce3 Prevent sustained vibrations not ending 2025-04-17 12:07:59 +03:00
KarimAkra 5a39439fcc Align the pause button with the notch 2025-04-17 12:07:17 +03:00
sector-a 2f6e6ef7cd Bound hitbox showcases x axis on dragging 2025-04-17 12:07:03 +03:00
KarimAkra 75e0992509 Fixed notch rect on ios platforms (??) 2025-04-17 12:06:50 +03:00
KarimAkra 67f0425e89 Fixed the result screen scroll text not being aligned properly on notched displays 2025-04-17 12:06:43 +03:00
sector-a 3a084accc9 Force amplitude to be bigger on iOS 2025-04-17 12:06:01 +03:00
zacksgamerz 31c96bc6a1 Added mobile compiler flag for the size change. 2025-04-17 12:04:09 +03:00
zacksgamerz f439624404 Scaled down the size of the incomming notes for the player for the default control scheme. 2025-04-17 12:03:58 +03:00
zacksgamerz 0b2bb3391c Fix the difficulty sprites not showing up in Freeplay. 2025-04-17 12:03:52 +03:00
zacksgamerz ffee837bcd Fixed flooring mistake for haptics in pico's freeplay.
What happens if you floor 0.3? it returns ZERO :D
2025-04-17 12:03:42 +03:00
zacksgamerz e4733f9a5c Tune the size for the player strumline a tiny bit. 2025-04-17 12:03:32 +03:00
Mihai Alexandru 4dcaae5786 Add iap extension in da repo. 2025-04-17 12:03:16 +03:00
sector-a 8fa6809723 Add vibration for locked selection in Character Select menu 2025-04-17 01:04:17 +03:00
sector-a 6b3fb46ae5 Forgot some few vars 2025-04-17 01:03:58 +03:00
Mihai Alexandru d05a3519a3 Forgot to iInitialize funkin.haptic in InitState... 2025-04-17 01:03:36 +03:00
zacksgamerz 1a75c094b3 Refactored Tweening for TouchPointerPlugin, and added skipTween argument to removeAll() 2025-04-17 01:02:28 +03:00
zacksgamerz def86a44eb Refactored the middle offset code for the default control scheme, added amplification and increased it by 15 px. 2025-04-17 01:02:28 +03:00
zacksgamerz 3b3f4543b4 Increased player strumline size by 0.05 percent for the default control scheme. 2025-04-17 01:02:28 +03:00
zacksgamerz d92d3130c8 Fixed opponentStrumline wacky positioning. 2025-04-17 01:02:28 +03:00
zacksgamerz 01cc9f1ae4 Added aspect ratio amplification to opponent's strumline in default controls. 2025-04-17 01:02:28 +03:00
zacksgamerz 9775034d7a Add tapping to LetterSort for Freeplay. 2025-04-17 01:01:40 +03:00
Mihai Alexandru 824767af66 Replace the traditional lime Haptics with funkin.haptic
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-17 01:01:26 +03:00
Karim Akra 07818b84fd Added IOS signing place holder 2025-04-17 00:42:39 +03:00
sector-a ae4384453c Tweak freeplay scrolling vibrations a lil bit 2025-04-17 00:42:39 +03:00
sector-a a80e3df799 Add vibrateByPreset method for calling vibrations using VibrationPresets 2025-04-17 00:42:35 +03:00
sector-a 52929de50a Rework hitbox items scrolling in scheme menu 2025-04-17 00:40:30 +03:00
zacksgamerz b81ff3c136 Fixed an issue where the touch pointer would permanently persist after switching states. Re-arranged imports in TouchPointerPlugin. 2025-04-17 00:38:35 +03:00
zacksgamerz f11d7e8147 Disabled wrapping in Story Menu and fixed an unknown bug with the swipe threshold. 2025-04-17 00:38:23 +03:00
zacksgamerz 8f123e4ab9 Made it so you need to tap on LetterSort first so it would receive input. 2025-04-17 00:38:20 +03:00
zacksgamerz 25d27e62ce Refactored scroll up and down logic in Freeplay. 2025-04-17 00:37:32 +03:00
zacksgamerz b9230b6eb2 Add swipe gesture to back out in Freeplay. 2025-04-17 00:36:49 +03:00
KarimAkra 2236865f0f Remove the unused FullScreenScaleMode class 2025-04-17 00:33:23 +03:00
KarimAkra e197b7325a Fixed the Preferences Menu options not aligning correctly on notched displays 2025-04-17 00:33:07 +03:00
KarimAkra 6080cd5bf3 Fixed the freeplay rating stars flames position to align properly with the notch 2025-04-17 00:32:53 +03:00
zacksgamerz ef35ba759e Added pointer fade out to each individual touch pointer. Changed the color of the touch pointer and added a "screen" blendmode. 2025-04-17 00:32:29 +03:00
zacksgamerz f246fa2e6c Fix tween cancellation and update flick direction logic in FreeplayState. 2025-04-17 00:32:17 +03:00
Karim Akra 2973b65c69 Check for resolution validity on desktop only 2025-04-17 00:31:51 +03:00
zacksgamerz f6ee1c8f92 Cancel existing tweens for difficulty groups before starting a new tween in FreeplayState. 2025-04-17 00:31:19 +03:00
zacksgamerz 3389eaef96 Changed justSwiped to swipe in StoryMenuState. 2025-04-17 00:31:19 +03:00
zacksgamerz 86d050a11f Refactor swipe threshold calculation to use SwipeUtil across multiple states. 2025-04-17 00:31:19 +03:00
Mihai Alexandru 5c0de03a74 Adjust the preferences options x to follow the cutout. 2025-04-17 00:31:18 +03:00
zacksgamerz afe0087591 Invert flicks for a hotfix. 2025-04-17 00:30:33 +03:00
KarimAkra 616004d7f6 move FullScreenScaleMode from flixel.system.scaleModes to funkin.ui 2025-04-17 00:29:45 +03:00
Karim Akra 854f62ba54 Use correct arguments for aspect ratio validity check 2025-04-17 00:28:11 +03:00
zacksgamerz 7374986c05 Fix aspect ratio validation by using gameHeight instead of gameWidth 2025-04-17 00:28:11 +03:00
KarimAkra 6a064dc7f7 Fixed an issue with the game looking off on invalid aspect ratios 2025-04-17 00:28:11 +03:00
KarimAkra d9bc989b91 Fixed notch rectangle calculations for iOS (??) 2025-04-17 00:28:11 +03:00
zacksgamerz 7bd6e09dcf Slightly adjust the hitbox's width for the default control scheme on mobile. 2025-04-17 00:28:11 +03:00
zacksgamerz 45986f34c1 Adjust note hitbox calculations for mobile to be more wide-screen friendly. 2025-04-17 00:27:30 +03:00
Mihai Alexandru 3386d62951 Video Playback Optimization. 2025-04-17 00:27:13 +03:00
zacksgamerz 85330f73a1 Small readability tuning for initNoteHitbox in PlayState. 2025-04-17 00:26:46 +03:00
zacksgamerz 318e73a030 Fixed a small typo in playstate. 2025-04-17 00:26:20 +03:00
zacksgamerz 62acfd8365 Add TODO comment to address touch pointer positioning issue in PlayState 2025-04-17 00:25:56 +03:00
zacksgamerz cbc3b6c0b5 Enhance documentation and reorganize imports for the TouchPointerPlugin class 2025-04-17 00:25:56 +03:00
zacksgamerz 3e71f12871 Remove unused strength calculation in HapticUtil 2025-04-17 00:25:56 +03:00
zacksgamerz 1a28e48434 Adjust hitbox dimensions for the default mobile controls scheme. 2025-04-17 00:25:56 +03:00
zacksgamerz d57409ca20 Character Select Menu Fixed the issue where it instantly selects the item when you first tap into it. 2025-04-17 00:25:56 +03:00
zacksgamerz 195e3082df Remove gamepad rumble in HapticUtil since it got reverted in openfl & flixel. 2025-04-16 23:42:51 +03:00
KarimAkra 27adb17a38 Fixed the null object refrence in AttractState on mobile platforms 2025-04-16 23:41:55 +03:00
sector-a 85f3f4b047 Bound currentIndex in Controls Scheme Menu for targets with touch support 2025-04-16 23:41:53 +03:00
sector-a 16f8678d0f Bound currentEntry in Pause SubState for targets with touch support 2025-04-16 23:41:18 +03:00
sector-a 64877bc999 Rename MobileControlsSchemeMenu to ControlsSchemeMenu 2025-04-16 23:41:11 +03:00
Mihai Alexandru 6b2572c176 Disable logging for AdMobUtil. 2025-04-16 23:38:58 +03:00
zacksgamerz 7a747993e7 Fixed issues with pixel notes' hitboxes on the default control scheme, adjusted positioning and scaled down the size even further. 2025-04-16 23:32:22 +03:00
Mihai Alexandru 5d2bd38f72 Attempt to implement controller rumble to HapticUtil
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-16 23:31:49 +03:00
Mihai Alexandru 1e40568ca9 Fixed minor issues in AdMobUtil 2025-04-16 23:25:13 +03:00
Kolo 855deb5828 set enabled when prompt gone 2025-04-16 16:06:39 -04:00
KarimAkra 51b82a0a7c Fixed minor issues with swipes and Pointer Plugin 2025-04-16 16:07:59 +03:00
sector-a 6c2ff099da Uncomment swipeThreshold.set() calls 2025-04-16 16:05:53 +03:00
KarimAkra 8119dcca8e Fixed a tiny mistake in TouchPointerPlugin to make it use the instance variable 2025-04-16 16:05:43 +03:00
KarimAkra a289fb7f54 Fixed common issues with the Pointer Plugin 2025-04-16 16:05:20 +03:00
zacksgamerz 6f9b8f0284 Add TouchPointerPlugin integration and update pointer group initialization 2025-04-16 16:04:58 +03:00
zacksgamerz 46d10ede43 Comment out pointer group addition and fix variable assignments in TouchPointer 2025-04-16 16:04:38 +03:00
zacksgamerz 16884ba28e Implement TouchPointerPlugin and remove old legacy TouchPointer code. 2025-04-16 16:04:22 +03:00
KarimAkra c636024f75 Fixed pausing in PlayState when fake cutouts are present. 2025-04-16 15:59:28 +03:00
KarimAkra a4207c1020 Allow skipping the video after holding the screen for 1.5 seconds with touch 2025-04-16 15:56:44 +03:00
KarimAkra a2c2b8d9dd Fixed the FPS counter position and removed skipping with touch from AttractState 2025-04-16 15:54:38 +03:00
KarimAkra c466e1aa12 Refactor positioning of FPS and memory counters for mobile 2025-04-16 15:51:27 +03:00
KarimAkra 3bdd7b20b0 Added fake cutouts functions 2025-04-16 15:49:40 +03:00
Mihai Alexandru 5b4ed6e726 Use untyped on width/height setter.
Also simplified something.
2025-04-16 15:44:31 +03:00
luckydog7 96ce6086e1 Implementing the maximum aspect ratio 2025-04-16 15:38:12 +03:00
sector-a 0e256021b1 Made note vibrations weaker, removed HAPTIC_VIBRATIONS define, moved vibration option from mobileOptions to options 2025-04-16 15:29:26 +03:00
zacksgamerz 18dcb8f446 Replaced all old flick checks, swipe checks, etc. with the proper checks from Flixel. Updated flixel ref. Removed justFlicked checks as they are unused.
Replace swipeThreshold updates with the one in FlxTouchManager

Temporarily remove swipeThreshold sets for testing.

Proper SwipeUtil refactoring. Completely replaced all flick and movement checks with the one in Flixel. Rewrote most of the documentation to be more accurate.

Invert flick checks as it already comes inverted from FlxFlick.

Define fixes for SwipeUtil

Fixed null safety issues on compiling.
2025-04-16 15:22:10 +03:00
sector-a ca391c6e32 Add Sustain Note vibration 2025-04-16 15:15:15 +03:00
sector-a 5ae73361b0 Move noteVibrations variable to Strumline and Add Sustain note splash vibration 2025-04-16 15:15:15 +03:00
sector-a 4cee6a9d56 Make Note Vibrations stacked amplitude work as intended 2025-04-16 15:15:15 +03:00
KarimAkra c3ed2019b5 Change System.allowScreenTimeout on state/substate destroy instead of close 2025-04-16 15:10:46 +03:00
KarimAkra 6720f7f9ca one shall stand one shall fall 2025-04-16 15:07:36 +03:00
KarimAkra 6b090542f1 added some args that are missing from the FunkinHitbox hitbox constructor 2025-04-16 15:06:20 +03:00
KarimAkra eb3022a0fc Oopsie 2025-04-16 15:06:20 +03:00
KarimAkra ea9938a318 rename DISABLE_ADMOB_ADS to FEATURE_ADMOB_ADS 2025-04-16 15:06:07 +03:00
zacksgamerz f17b9d234c Scale down the strumline size visually but increase the hitbox to be bigger for the default control scheme. Added double note overlap. 2025-04-16 15:03:07 +03:00
zacksgamerz 5b9bd1af00 Removw justMoved check as it makes confirming the selected song significantly harder. 2025-04-16 15:00:52 +03:00
zacksgamerz 9d48a04564 Fixed issue where you can't confirm your selection by tapping the icons in the character select menu. 2025-04-16 15:00:52 +03:00
sector-a f970ea6acf Move TouchUtil and SwipeUtil to funkin.util 2025-04-16 15:00:02 +03:00
sector-a 8b1b81a925 Add mobile support to Latency State 2025-04-16 14:57:33 +03:00
sector-a 2d8a493897 Add directionsOverride and colorsOverride to FunkinHitbox 2025-04-16 14:57:33 +03:00
zacksgamerz 3bcb63cb84 Made minor changes to the overlap checks in CharSelectSubState, and added another way for the player to accept by tapping on the character. Replaced FlxSprite hitboxes with FlxObject. 2025-04-16 14:56:44 +03:00
zacksgamerz 0d35b66903 Refactored the drag difficulty checks in Freeplay to be more clean and readable. 2025-04-16 14:56:15 +03:00
zacksgamerz db84186627 Made intuitive swipe controls for LetterSort. 2025-04-16 14:55:26 +03:00
sector-a e3e98dc057 Note vibrations with stackable amplitude 2025-04-16 14:54:31 +03:00
sector-a 5d70cdbeb2 scheme menu fixes for widescreen 2025-04-16 14:37:10 +03:00
KarimAkra 3e75701c1c Adjust Arrows control scheme notes sizes for easier reading & pressing
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-16 14:35:28 +03:00
KarimAkra 0fc5b84237 Implement Google Play Asset Delivery, Added some flags & refactored bundle system
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
2025-04-16 14:29:08 +03:00
KarimAkra f23a6a8ac8 Adjust notes scale & spacing for Arrows control scheme
Co-Authored-By: luckydog7 <59097731+luckydog7@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-16 13:52:00 +03:00
sector-a 4b797d3526 allow input offset on mobile and gameover input delay 2025-04-16 13:39:04 +03:00
KarimAkra 82a9dabc7f Added ability to swipe on difficulties to change them on FreeplayState
Co-Authored-By: Karim Akra <144803230+karimakra@users.noreply.github.com>
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-04-16 13:21:16 +03:00
sector-a 3f7ae02d54 Scheme menu and its components code refactor 2025-04-16 13:05:35 +03:00
EliteMasterEric 963e2ecd63 Edit RegistryMacro to automatically populate baseGameEntryIds list. 2025-04-15 20:25:18 -04:00
lemz1 14975212a9 macro
registry macro

Merge branch 'lemz1/registry-entry-data' into lemz1/registry-macro-stufff
2025-04-15 20:25:18 -04:00
Hyper_ 3ad14bac32 fix: Double check if events are the same when doing indexOf
This is basically copy-pasted from SongNoteDataArrayTools lol
2025-04-15 19:47:39 -04:00
KarimAkra e9b1800ec9 Improves HapticUtil's code a bit
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: Karim Akra <144803230+karimakra@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-16 00:22:56 +03:00
sector-a bee846ec8c Rename NoteDPad controls scheme to Arrows
my bad
2025-04-16 00:09:46 +03:00
KarimAkra e5f3223e76 Refactor FullScreenScaleMode
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: Karim Akra <144803230+karimakra@users.noreply.github.com>
2025-04-15 23:50:40 +03:00
KarimAkra d80afc35b4 Fixed a few issues with touch controls & flicks
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-04-15 23:39:17 +03:00
KarimAkra 5c9d76791b Added a FeatureFlag to build an Android App Bundle (.AAB)
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
2025-04-15 23:23:08 +03:00
KarimAkra 2a6720da2e Added a new "Note DPad" control scheme
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
Co-Authored-By: luckydog7 <59097731+luckydog7@users.noreply.github.com>
2025-04-15 22:54:00 +03:00
KarimAkra 068747b01a Optimized Memory Usage & Added FunkinMemory
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-04-15 22:20:01 +03:00
sector-a 4962d55b22 hide hitbox if game is paused
forgot something!!!!
2025-04-15 21:37:29 +03:00
KarimAkra 66e6ea9d41 Fixed few issues with extension-admob implementation
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
2025-04-15 21:37:22 +03:00
KarimAkra d43dfac3e4 Added vibrations to most ResultState ranks and more!
* Vibrations for most ranks
* Vibrations when scrolling through FreeplayState
* Vibrations for notes hits
* Vibrations for game over

Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:37:14 +03:00
KarimAkra 9cf134fc2a Made more menus adapted to wide-screens & fixed some bugs
* Made stuff on the edge of the screen get moved away by the notch
* Made FreeplayState look better on wide-screens
* Adapted StoryMenuState to wide-screens
* Fixed the transition being small on some screen sizes
* refactored some code
2025-04-15 21:37:06 +03:00
KarimAkra 7b1abe437f Add proper configuration for AdMob ads
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
Co-Authored-By: Lily <egzozu.be.bas@gmail.com>
2025-04-15 21:37:00 +03:00
KarimAkra 193d293dea Added HapticUtil and some vibrations to some menus & scenes!
Added vibrations to:

* TitleState on beat hits during into
* Freeplay when a new rank is slammed to the capsule
* Some vibrations on ResultState (such as when the tally counter increases...)

Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:36:54 +03:00
sector-a 530ca0d929 play video ad after results screen instead of in it 2025-04-15 21:36:49 +03:00
sector-a c99778266b Scheme Menu is basically done! 2025-04-15 21:36:43 +03:00
KarimAkra 2680b064fe Blacklist admob from Polymod HScript 2025-04-15 21:36:37 +03:00
KarimAkra 9dc48978f8 Massive Touch Controls Overhaul
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>

This overhaul includes:

* Flicks on menus
* Changing options by sliding the finger over screen
* Changing options by pressing the option itself
* Touch Pointers
* And more!

Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:36:28 +03:00
KarimAkra f6a261e5bd Adjusted back button position on Scheme Menu
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:36:19 +03:00
KarimAkra a707472270 Got a functional Scheme Menu for mobile
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:36:12 +03:00
KarimAkra 7babcfaf6b Implement extension-admob for mobile ads
forgor that

videos and fixed banner size

make this a define

keep thes demo units when using TESTING_ADS only

always enable it on debug builds (?)

Update AdMobUtil.hx

admob features

Update PlayState.hx

Update AdMobUtil.hx

Update AdMobUtil.hx

Show privacy options form if required.

Update Main.hx

Update Main.hx

Update PlayState.hx

Update AdMobUtil.hx

Update AdMobUtil.hx

Update AdMobUtil.hx

Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
2025-04-15 21:36:05 +03:00
KarimAkra 1b2f75395f Added a missing import in FunkinButton
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-04-15 21:35:57 +03:00
sector-a 8704666edb some back button fixes! 2025-04-15 21:35:48 +03:00
KarimAkra 66683c11a0 Fixed a bug with circle buttons overlap check (last time I swear)
that's better ig
2025-04-15 21:35:41 +03:00
KarimAkra 5d624fe1b9 Attempt to add native code for obtaining notch size on iOS
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: Lily <egzozu.be.bas@gmail.com>
2025-04-15 21:35:35 +03:00
KarimAkra c4bb161865 Fixed a bug with circle buttons overlap 2025-04-15 21:35:28 +03:00
KarimAkra b1b30ed09f Formatted some code for freeplay & fixed strumlines position on wide-screens 2025-04-15 21:35:19 +03:00
sector-a f5ffdbe82d Scheme menu rework (unfinished) 2025-04-15 21:34:44 +03:00
KarimAkra ad4b1ce51b Adjusted freeplay to work on wide-screens
fixed some backing cards and the capsule ranking position
2025-04-15 21:34:00 +03:00
KarimAkra 9657b7eb72 Add proper overlap and input check for circle buttons scheme
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
2025-04-15 21:33:50 +03:00
Mihai Alexandru 381bc6521c Fix an issue with FunkinButton overlap checks
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
2025-04-15 21:33:41 +03:00
KarimAkra 8a60bc26b5 Experimental full screen scale mode for mobile 2025-04-15 21:33:32 +03:00
KarimAkra a732d27e93 Fix the background text of ResultState going off of FlxGame bounds 2025-04-15 21:33:18 +03:00
KarimAkra 944141292d Move part of the code from the old repository
Co-Authored-By: sector-a <82838084+sector-a@users.noreply.github.com>
Co-Authored-By: mcagabe19 <egzozu.be.bas@gmail.com>
Co-Authored-By: Mihai Alexandru <77043862+majigsaw77@users.noreply.github.com>
Co-Authored-By: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
Co-Authored-By: luckydog7 <59097731+luckydog7@users.noreply.github.com>
2025-04-15 21:32:39 +03:00
Cameron Taylor e672c0978f hmm lime bump 2025-04-14 23:35:43 -04:00
Cameron Taylor 0d5b7d4ed4 also conditional for WindowUtils.setVSyncMode() for mac 2025-04-14 23:27:34 -04:00
kade-github 7e90423495 Pre-Processor to disable VSync on MacOS 2025-04-14 23:27:34 -04:00
kade-github c7c2620217 Set vsync on launch (might need to be set elsewhere too) 2025-04-14 21:42:24 -04:00
kade-github 3944816021 Error handling from wiki 2025-04-14 21:42:24 -04:00
kade-github db00feff93 Vsync does work now 2025-04-14 21:42:24 -04:00
kade-github 6e2a077d6b Fixes from merge 2025-04-14 21:42:22 -04:00
EliteMasterEric 1ee8246b48 Added a preference to enable VSync. 2025-04-14 21:40:58 -04:00
Eric 20c3228d8c Don't discount the score so much on miss, but still keep it meaningful. 2025-04-14 19:32:55 -04:00
EliteMasterEric 01bf3bee11 Dropping hold notes should no longer cost health by default. 2025-04-14 19:32:55 -04:00
EliteMasterEric 4d9638f0ac Fix the clamping. 2025-04-14 19:32:55 -04:00
EliteMasterEric b00589367c Make hold drop penalty threshold match the hit window. 2025-04-14 19:32:55 -04:00
EliteMasterEric 577421a782 Scoring rework: Penalize the player (deducting health and score) for dropping a hold note before it's finished. 2025-04-14 19:32:54 -04:00
EliteMasterEric 72e9fb641e Scoring rework: Reduce health given by hold notes by 20%. 2025-04-14 19:32:16 -04:00
EliteMasterEric 429f6f9bc0 Remove the unused input splitter. 2025-04-14 19:32:16 -04:00
EliteMasterEric 550bf95c76 Split miss penalty and ghost miss penalty into two variables (but make them equal for now). 2025-04-14 19:32:16 -04:00
EliteMasterEric da686ed0c4 Scoring rebalance: Misses now reduce your final grade, which impacts your rank 2025-04-14 19:32:16 -04:00
EliteMasterEric 9f3711bf43 Scoring rebalance: Misses are now worth -250 points (up from -10). 2025-04-14 19:32:16 -04:00
EliteMasterEric 6390725ef0 Redo data format for sticker packs to make it simpler and allow for song-specific selections. 2025-04-14 19:25:42 -04:00
Abnormal cdc468ba15 feat: Sticker Registry 2025-04-14 19:25:29 -04:00
EliteMasterEric deb4e1921d Fix an issue where Stress would crash on the second playthrough 2025-04-14 15:45:29 -04:00
Kolo 068c9fb43d no thoughts save empty
also more code clarity ig
2025-04-14 15:28:14 -04:00
Abnormal 5be4f3bbb9 chore: Remove ComboMilestone 2025-04-14 15:28:14 -04:00
Abnormal b83ae65a65 docs: Add missing documentation to the remaining functions in Module 2025-04-14 15:28:14 -04:00
Hundrec dc876be57c Two more Chart Editor entries in Changelog 2025-04-14 15:28:14 -04:00
Hundrec c08847f48d Add a few fixes and changes from 0.6.0 2025-04-14 15:28:14 -04:00
Hundrec 19912b5f89 Oops, one more lil space 2025-04-14 15:28:14 -04:00
Hundrec 019473dec2 Remove 0.6.0 Changelog entries that weren't implemented + polish 2025-04-14 15:28:14 -04:00
EliteMasterEric f001562270 Update HXVLC to 2.1.2 2025-04-13 21:45:39 -04:00
Hundrec 34bb58015d Add Combo Milestones to Rejected Features list 2025-04-13 00:37:16 -04:00
Abnormal d86fe68d80 docs: Add missing documentation to the remaining functions in Module 2025-04-12 00:54:04 -04:00
Lasercar 1434820d10 remove removed debug keys 2025-04-12 00:53:51 -04:00
Hundrec 08fb5b8459 Two more Chart Editor entries in Changelog 2025-04-12 00:53:29 -04:00
Hyper_ 8e8dcaa7f9 docs: (TROUBLESHOOTING.md) Correct outdated information about Lime troubleshooting
The commit of Lime that Funkin uses now includes Linux NDLLs. These are built on a system with GLibC 2.38 though which breaks compatibility with lots of stable distributions troubleshooting was added for those systems too.
2025-04-12 00:53:18 -04:00
Hyper_ b35059ec99 docs: (COMPILING.md) Remove outdated info about Lime fork 2025-04-12 00:53:18 -04:00
EliteMasterEric b28ba8f465 Update assets submodule 2025-04-11 16:07:53 -04:00
EliteMasterEric dcc8085691 Update assets submodule 2025-04-11 16:00:16 -04:00
Eric c186666402 Update mod version number (this requires mods to check they are working, then change their metadata) 2025-04-11 15:58:51 -04:00
EliteMasterEric 6f93960cb5 Update HaxeUI to their latest versions. 2025-04-11 15:58:34 -04:00
Cameron Taylor a756ceac22 properly initialize soundtray on game start if muted 2025-04-10 18:43:54 -04:00
Cameron Taylor c394520019 small cleanups / tidying of FunkinSoundTray.hx 2025-04-10 18:43:54 -04:00
Cameron Taylor 2d93baf968 properly save mute preferences by doing the save on show() in the soundtray 2025-04-10 18:43:54 -04:00
EliteMasterEric 4a98e6999f Update assets submodule 2025-04-09 18:13:30 -04:00
EliteMasterEric 9ff14aed42 Fix an issue where Pico's retry animation is broken on Ugh/Guns Pico Mix 2025-04-09 15:58:44 -04:00
EliteMasterEric 0a7bd3111f Fix a crash with the chart editor Note window (via Lasercar) 2025-04-09 15:52:47 -04:00
VioletSnowLeopard 1f88a3b6e1 swap restart and skip in dialogue pause menu 2025-04-09 15:33:54 -04:00
Hundrec fcb47ff4fc Grammatical fix in style-guide.md 2025-04-08 23:18:17 -04:00
Hundrec 3218ceeecd Consistent hyphens in CODESTYLE.md 2025-04-08 23:18:17 -04:00
Hundrec 1823373d7e Add a few fixes and changes from 0.6.0 2025-04-08 23:18:04 -04:00
Hundrec af14d42939 Oops, one more lil space 2025-04-08 23:18:04 -04:00
Hundrec 3dd3338ab2 Remove 0.6.0 Changelog entries that weren't implemented + polish 2025-04-08 23:18:04 -04:00
Hyper_ 26f2578bf2 fix: Pad number with 1 decimal place with zero 2025-04-08 16:02:03 -03:00
Hyper_ c32ade49b9 Implement suggestion: Fractional beat display 2025-04-07 23:59:55 -03:00
Hyper_ d4eee38fd2 feat: Show current beat and step next to song position 2025-04-07 21:08:01 -03:00
Hundrec 6543c58363 Restore Contributing Guide to latest version
Merge conflicts yay

Co-Authored-By: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-04-06 03:50:32 -04:00
EliteMasterEric 158c015682 Use public URLs for git submodules 2025-04-04 15:16:58 -04:00
Eric 278bac7b6d
Merge pull request #4554 from FunkinCrew/release/v0.6.2
Release the source code for v0.6.2
2025-04-04 15:03:23 -04:00
EliteMasterEric 29cddfb528 Merge remote-tracking branch 'public/main' into release/v0.6.2 2025-04-04 15:01:59 -04:00
VioletSnowLeopard da9f17cf87 swap restart and skip in dialogue pause menu 2025-04-04 14:41:33 -04:00
EliteMasterEric 02dc353032 Update assets submodule 2025-04-04 14:41:22 -04:00
EliteMasterEric d31ef12363 Use public submodule URLs (would be nice if this was automatic but oh well) 2025-04-04 14:28:12 -04:00
EliteMasterEric c7d4406a34 Fix results screen music continuing to play when using the debugger 2025-04-03 22:01:32 -04:00
EliteMasterEric 68e9daffe8 Zero out the ABot visualizer before the song starts. 2025-04-03 16:04:19 -04:00
EliteMasterEric c157338783 Fix certain characters pixel icons not displaying properly in the chart editor. 2025-04-03 16:04:07 -04:00
EliteMasterEric eb9c2c2c99 Fix Pixo's freeplay AFK animation not playing (properly this time). 2025-04-03 16:02:10 -04:00
EliteMasterEric afb4a3dd68 Remove some unused/redundant debug hotkeys. 2025-04-03 16:02:10 -04:00
Cameron Taylor 9b5032ee84 quick patch for cory 2025-04-02 21:54:27 -04:00
Cameron Taylor 62621881c0 data -> data.score 2025-04-02 16:18:58 -04:00
Cameron Taylor 52be941b45 Auto Pause -> Pause on Unfocus (was changed before but prob bad merge somewhere reverted it?) 2025-04-02 13:55:54 -04:00
Cameron Taylor c94b3a3b65 2024 -> 2025 0.6.x changelog date fixins (closes FUNK-1740) 2025-04-02 13:41:54 -04:00
EliteMasterEric 8291fe0407 Make the back of ABot's stereo display slightly wider. 2025-04-02 13:37:50 -04:00
EliteMasterEric f935526baa Update assets submodule 2025-04-02 13:36:22 -04:00
EliteMasterEric 102ac4bfc8 Fix a bug where restarting the level would add more Tankmen to the background. 2025-04-02 13:34:23 -04:00
EliteMasterEric f8b212a318 Improve null safety of medal and leaderboard classes. 2025-04-02 13:33:32 -04:00
EliteMasterEric 3bd79b822e Fix a deprecation warning. 2025-04-02 13:33:32 -04:00
EliteMasterEric 17a4be66b9 Fix highscores not submitting to the website unless they are a personal best. 2025-04-02 13:33:06 -04:00
EliteMasterEric 54cd52db76 Fix an issue where story mode medals would not be awarded without a personal best. 2025-04-02 13:33:06 -04:00
Cameron Taylor 4fa0334e7b easier script for creating macos universal binaries 2025-04-01 16:41:46 -04:00
Eric b7761d45b7 Disable FEATURE_RESULTS_DEBUG on release builds by default. 2025-03-31 22:39:08 -04:00
Hundrec 3c6466bec7 Bump repo versions to 0.6.2 2025-03-31 21:20:18 -04:00
Cameron Taylor 1d5d0ddd52 IGJHSpritin credits fix (assets submod) 2025-03-31 19:55:42 -04:00
Cameron Taylor 0818bd9c93 disable results screen debugger 2025-03-31 19:51:22 -04:00
Cameron Taylor 43f6cf6267 changelog update 0.6.2 2025-03-31 19:48:06 -04:00
Cameron Taylor cfd380b243 creds update (assets submod) 2025-03-31 19:45:09 -04:00
Cameron Taylor dd1b09a293 same shader fix but on the DropShadowScreenspace 2025-03-31 19:25:10 -04:00
Hundrec 3ccd1b04da Bump repo versions to 0.6.1 2025-03-31 18:42:17 -04:00
Cameron Taylor 0526eb7a64 0.6.1 quick hotfix crap 2025-03-31 16:01:50 -04:00
Cameron Taylor 6b321b72ae fix the ternary operator for DropShadowShader 2025-03-31 15:37:39 -04:00
Cameron Taylor 9580875c23 remove NewgroundsCredentials.hx derp 2025-03-31 14:42:16 -04:00
Eric d6d8df9f67
Merge pull request #949 from FunkinCrew/ng-partial-autologin
only do a partial auto login, when logging in via NG or via saved session
2025-03-31 14:28:39 -04:00
Cameron Taylor 4eb4b00271 only do a partial auto login, when logging in via NG or via saved session 2025-03-31 14:15:06 -04:00
EliteMasterEric e7634c90e7 Fix an animation issue with the cans in 2hot. 2025-03-31 13:28:13 -04:00
Hundrec 439be3cb26 Update templates and docs to 0.6.0 2025-03-31 13:21:55 -04:00
Eric 5e93920797
Merge pull request #948 from FunkinCrew/fix/stress-null-script
null out rimlightCamera and remove it from FlxG.cameras(assets submod)
2025-03-31 12:20:20 -04:00
Cameron Taylor a4069eba2a null out rimlightCamera and remove it from FlxG.cameras(assets submod) 2025-03-31 00:43:13 -04:00
EliteMasterEric 30168a1160 Fix a build error caused by references to invalid leaderboards. 2025-03-31 00:10:06 -04:00
EliteMasterEric a2fcaec9ff Use production build medal IDs and leaderboard IDs in release builds. 2025-03-30 22:51:52 -04:00
EliteMasterEric e5e3453c1f Add Stress Pico + Char Select medals, and fix medals to work on release builds 2025-03-30 21:59:17 -04:00
EliteMasterEric 0d8b04dd56 Add an option to destroy save data in the options menu. 2025-03-30 19:17:08 -04:00
EliteMasterEric 3b997d7c0f Add finalized loss SFX 2025-03-30 19:00:04 -04:00
EliteMasterEric 3ff93f1923 Fixed some bugs with death quotes and added final lines. 2025-03-30 18:54:12 -04:00
EliteMasterEric 64d8e81ed1 Rework death quotes logic to make more sense. 2025-03-30 18:54:06 -04:00
EliteMasterEric a741b4eed3 Add Stress Pico Intro Cutscene (assets submod) 2025-03-30 18:38:18 -04:00
EliteMasterEric 81e7c6b84a Fix a bug with the intro and end cutscenes conflicting. 2025-03-30 16:02:10 -04:00
fabs 77e06bc9d4 assets submod 2025-03-29 21:54:20 +00:00
fabs c6966c2b63 screenspace shader 2025-03-29 21:47:39 +00:00
Eric a9652544f5
Merge pull request #937 from FunkinCrew/album-roll-expansion2
change expansion 2 -> volume 4, and add the proper new expansion 2 stuff
2025-03-28 22:02:56 -04:00
Cameron Taylor 042d29309f volume4 spritesheet crap 2025-03-28 21:47:36 -04:00
Cameron Taylor 05d88ba0bf change expansion 2 -> volume 4, and add the proper new expansion 2 stuff 2025-03-28 20:27:12 -04:00
EliteMasterEric d07d173631 Fixed the seizure bug. 2025-03-28 19:07:43 -04:00
Eric d02d86edcd
Merge pull request #935 from FunkinCrew/2hot-rain-fix
fix: phillystreets rain starts properly
2025-03-27 20:35:02 -04:00
Eric e99526d195
Merge pull request #933 from FunkinCrew/freeplay-ranking-tidy
refactor some FreeplayRank stuff to hold both blurred and unblurred ranking
2025-03-27 20:27:00 -04:00
Cameron Taylor 14e5c1c655 fix: phillystreets rain starts properly 2025-03-27 20:26:50 -04:00
Cameron Taylor f7a48bcb3b refactor some FreeplayRank stuff to hold both blurred and unblurred ranking 2025-03-27 20:26:50 -04:00
EliteMasterEric db43704fe3 Roses stage animation fix 2025-03-27 20:11:07 -04:00
Eric 35780ec9f3
Merge pull request #929 from FunkinCrew/pico-chart-editor-fix
variations loading via fnfc fix in progress
2025-03-27 19:13:02 -04:00
Cameron Taylor 36997e8b30 variations loading via fnfc fix in progress 2025-03-27 18:00:24 -04:00
Abnormal abe4ac8485 Remove the Alphabet class 2025-03-27 15:59:35 -04:00
EliteMasterEric f61dfa1f66 Fix typo. 2025-03-27 15:49:09 -04:00
EliteMasterEric 0bc938d0fa Implement support for Newgrounds Events 2025-03-27 15:49:09 -04:00
EliteMasterEric 668b2cdfb7 Remove a problematic mask from the medal animation. 2025-03-27 15:49:07 -04:00
EliteMasterEric 96e29b7921 Tweaks to medals and leaderboards (split Erect/character remixes, fix test medals not working etc) 2025-03-27 15:48:53 -04:00
EliteMasterEric 00893768d1 Evil school shader fix 2025-03-27 13:16:54 -04:00
Cameron Taylor 8e43a7ae0c bump FlxAnimate back to commit 713d3d for now 2025-03-27 10:44:03 -04:00
Eric 251e96b426
Merge pull request #908 from FunkinCrew/hxcpp-hmm-bump
bump hxcpp hmm version to v4.3.75
2025-03-26 03:29:22 -04:00
Cameron Taylor 94331bd938 bump hxcpp hmm version to v4.3.75 2025-03-26 02:53:06 -04:00
EliteMasterEric c4b9097868 Update difficulty rankings 2025-03-26 01:16:53 -04:00
EliteMasterEric 64eb80e8b7 Game Over (Pico Pixel) 2025-03-26 01:15:24 -04:00
EliteMasterEric d84c2e7875 Fix an issue where the game would try to render destroyed note graphics. 2025-03-25 22:02:43 -04:00
EliteMasterEric d08c8a541e Fix some issues with HScript, and enable the ?? operator. 2025-03-25 22:02:43 -04:00
EliteMasterEric ba7c263d23 Update changelog to include contributor list. 2025-03-25 22:02:43 -04:00
Cameron Taylor 293cd7d50a shader fix for week 3 gameover 2025-03-25 19:06:58 -04:00
Cameron Taylor 57b2ae9f37 2hot pico gameover fix 2025-03-25 18:55:44 -04:00
Cameron Taylor 431241bf19 quick fix for results screen debug crap 2025-03-25 18:14:53 -04:00
EliteMasterEric 703eae8c62 Update the changelog with all the public fixes (thanks Hundrec) 2025-03-25 15:37:13 -04:00
EliteMasterEric 34c07811d1 Update assets submodule 2025-03-25 15:37:13 -04:00
Abnormal 871709bb7d Some additions to the Contributor's Guide
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-03-25 15:18:43 -04:00
Hundrec 91a594cc85 Nudge Results totals left if 4 digits long 2025-03-25 15:03:08 -04:00
EliteMasterEric 43bdd38a44 Fix all game over screen being broken 2025-03-25 14:59:16 -04:00
Cameron Taylor 6e463e0188 debug: add simple result screen debug mode 2025-03-25 14:48:31 -04:00
Cameron Taylor 319419c541 refactor: refactor some of the Page menu handling out of OptionsState 2025-03-24 19:20:25 -04:00
Cameron Taylor e8c07c9ec6 debug: added debug menu option to open ResultsState (and fixed small crash when opening ResultsScreen in this way)
part 1 of results screen debug stuff
2025-03-24 19:20:25 -04:00
Cameron Taylor fa5a80df08 screenshot plugin fix for high dpi / larger window sizes 2025-03-24 17:42:35 -04:00
Lasercar e51b6147b5 unused code removed and comment cleanup 2025-03-24 17:32:49 -04:00
Lasercar 2a9712466e Fixed cursor & preview not being reset for state changes 2025-03-24 17:32:49 -04:00
Lasercar e9891c4d00 Fancy preview is back!
Also now saves on window close/crash.
Also standardised the option descriptions.
2025-03-24 17:32:49 -04:00
Lasercar 5c47ed4a8c Set screenshotBeingSpammed to false after state change
Because the timer has been killed
2025-03-24 17:32:49 -04:00
Lasercar 6e4e7008f2 another whoops 2025-03-24 17:32:49 -04:00
Lasercar 79e31636e2 Save unsaved screenshots in buffer before state change 2025-03-24 17:32:49 -04:00
Lasercar 8fcd145d53 Option to only show the preview when a screenshot is saved
Enabled by default, the idea is that the less tech savy players won't bother changing the option to false and end up reporting that they lost screenshots after changing states
2025-03-24 17:32:49 -04:00
Lasercar e30e6ee4ed comment cleanup 2025-03-24 17:32:49 -04:00
Lasercar bab920dc82 comment typo 2025-03-24 17:32:49 -04:00
Lasercar ab2dd75986 now it's actually asynchronous
Though with the caveat of unsaved screenshots not being saved after state change
2025-03-24 17:32:49 -04:00
Lasercar a8440062b8 fixed duplicate screenshot handling code 2025-03-24 17:32:49 -04:00
Lasercar 824cf7cf1b frame delayed screenshots + timer'd screenshot save 2025-03-24 17:32:49 -04:00
Lasercar 65786d8f1c small fix 2025-03-24 17:32:49 -04:00
Lasercar bcd29b5d67 idk 2025-03-24 17:32:49 -04:00
Lasercar 95847440b5 didn't reverse my test of the JPEG encoder 2025-03-24 17:32:49 -04:00
Lasercar c776900df0 screenshot options 2025-03-24 17:32:49 -04:00
Lasercar fc9b395138 forgot to uncomment the bit making the async loop null 2025-03-24 17:32:49 -04:00
Lasercar 7b54292bf7 another whoops 2025-03-24 17:32:49 -04:00
Lasercar 4ef0c18212 idk 2025-03-24 17:32:49 -04:00
Lasercar 8e4f9fe66b forgot a thing 2025-03-24 17:32:49 -04:00
Lasercar 92b24b91e7 asynchronous screenshot buffer saving 2025-03-24 17:32:49 -04:00
Lasercar 0db0d88256 Show a preview of last image in the image buffer 2025-03-24 17:32:49 -04:00
Lasercar 535ff2211a Popup no longer shows up in screenshots 2025-03-24 17:32:49 -04:00
Lasercar f7329e0687 Improved? screenshotting 2025-03-24 17:32:49 -04:00
Lasercar 868932cd13 screenshot preview in screenshot fix 2025-03-24 17:32:49 -04:00
Lasercar 9c2ef02368 NuN GF
Adds a none/null option for the character selector dropdown
Also fixes a few null references that happen when one or both characters are null in the playstate
2025-03-24 15:00:01 -04:00
Cameron Taylor 4187244305 Merge branch 'bugfix/missing-pitstop2-mp3s' into rewrite/master 2025-03-24 14:41:51 -04:00
Kolo 65b9466ce3 eric's suggestion 2025-03-24 14:40:55 -04:00
Kolo a5e5c1dee2 freeplay random button fix 2025-03-24 14:40:55 -04:00
Kolo a90b911653 freeplay random button fix 2025-03-24 14:40:55 -04:00
EliteMasterEric 06940573ca Update assets submodule 2025-03-24 13:38:07 -04:00
EliteMasterEric 01693eb4ce Display additional info messages in the terminal (without breaking VSCode!) 2025-03-21 20:07:29 -04:00
Cameron Taylor 1adcc67acb
Merge pull request #914 from FunkinCrew/public/copybara-refs/pull/4355/merge
[PUBLIC PR] [BUGFIX] Fallback when no defined inputs
2025-03-21 19:10:15 -04:00
EliteMasterEric 1506225100 Last batch of chart tweaks I think. 2025-03-21 19:09:16 -04:00
EliteMasterEric 43a09f668e Update assets submodule 2025-03-21 19:06:56 -04:00
Cameron Taylor 07c433e6d4 Merge branch 'notehold-styles' into rewrite/master 2025-03-21 18:58:29 -04:00
EliteMasterEric febe5e84a2 Don't display the rank animation in Freeplay if Practice Mode or Bot Play Mode were enabled. 2025-03-20 15:13:32 -04:00
EliteMasterEric d7c3b64e02 Disable note inputs when the song is over. 2025-03-20 15:13:32 -04:00
EliteMasterEric 0f6e6c4701 Fix a crash when using -DRESULTS. playerCharacterId was already calculated earlier. 2025-03-20 15:13:32 -04:00
Kolo b70946f3c3 fix backspace and enter causing crash 2025-03-20 15:08:07 -04:00
Hyper_ 099c309f9b fix: Fallback to 'N/A' text when no inputs avaliable in getDialogueName 2025-03-20 03:05:59 -04:00
ember / mint 02dcef4727
hotfix: temporarily use windows-latest runners for windows builds (#910) 2025-03-18 19:25:42 +00:00
Hundrec bf36a86877 Remember selection when exiting to Title Screen 2025-03-18 20:47:21 +10:00
Cameron Taylor a72fce14d1 Merge branch 'public-develop' into rewrite/master 2025-03-17 22:20:28 -04:00
EliteMasterEric 2f339e8113 Update FlxAnimate 2025-03-17 14:40:22 -04:00
anysad 9829103671 Fix Animation Editor not saving the file name 2025-03-17 07:13:14 -04:00
Lasercar e83b88d320 I'm so done with this stupid bug
Eric wuz here!
2025-03-17 06:44:21 -04:00
Kolo 3667c51c1e prevent unnecessary resync 2025-03-17 06:19:54 -04:00
Hundrec a55bf60fcf 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.
2025-03-15 19:49:54 -04:00
Hundrec 90c5eea0af Remove docs entries in Changelog + add punctuation 2025-03-15 19:49:54 -04:00
Hundrec 63883a1f07 A few more rewordings 2025-03-15 19:49:54 -04:00
Hundrec 5ecad9ea9b Combine those lines
Thanks Hyper!
2025-03-15 19:49:54 -04:00
Hundrec 128642264d Changelog overhaul for 0.4.1, 0.4.0, 0.3.3, 0.3.2, 0.3.1, 0.3.0 2025-03-15 19:49:54 -04:00
Hundrec fa772bdec1 Changelog overhaul for 0.5.3, 0.5.2, 0.5.1
Plus added line breaks to match Keep A Changelog's format
2025-03-15 19:49:54 -04:00
Hyper_ 0a8d7a23bf Minor adjustments
Some reformatting and shortening
2025-03-15 19:49:54 -04:00
Hyper_ bf1a238f6a docs: Some Linux troubleshooting 2025-03-15 19:49:54 -04:00
Hundrec 3a5b625f05 Add more rejected features to Contributing Guide 2025-03-15 19:49:54 -04:00
Hundrec f94a202f9c Remove issue reopening action 2025-03-15 19:49:54 -04:00
Hundrec 5e3dfbb1f5 Table of Contents for CONTRIBUTING.md 2025-03-15 19:49:54 -04:00
MidyGamy dd82bb8ed5 More dump save info + force crash now accurate 2025-03-15 19:49:54 -04:00
MidyGamy 8fa3384c1e Rewording missing Funkin' Debug Hotkeys.md (thx Hundrec) 2025-03-15 19:49:54 -04:00
MidyGamy d51622f563 Added missing debug hotkeys 2025-03-15 19:49:54 -04:00
Hundrec 2041b6969c adjust link in PR Template 2025-03-15 19:49:54 -04:00
Hundrec e1fde6ddd9 PR Template 2025-03-15 19:49:54 -04:00
Hundrec b8f2524fa2 Revert spacing 2025-03-15 19:49:54 -04:00
Hundrec 4adb3005ae Fix Contributing link 2025-03-15 19:49:54 -04:00
Hundrec b0151da0e7 Contributing Guide in Minor Bug Template 2025-03-15 19:49:54 -04:00
Hundrec b74df06f48 Reword some debug hotkeys 2025-03-14 23:37:25 -04:00
Lasercar 055c4d9b75 Add remaining debug keys 2025-03-14 23:37:25 -04:00
Lasercar ea93ec90cb Fix strumline offset when downscroll 2025-03-15 13:20:39 +10:00
Hundrec 4383fcf32c 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.
2025-03-14 02:17:46 -04:00
Hundrec cef0cbf9d4 Remove docs entries in Changelog + add punctuation 2025-03-14 02:17:46 -04:00
Eric 3158e5a5da
Merge pull request #898 from FunkinCrew/public-develop
Two commits from public
2025-03-12 19:01:39 -04:00
EliteMasterEric 20403eb80f Merge branch 'public-develop' into public-develop-2 2025-03-12 18:58:43 -04:00
Cameron Taylor 6b9e6c9ebc holdnotecover implementation stuff 2025-03-11 23:17:29 -04:00
Hundrec 7d80e6657b A few more rewordings 2025-03-11 19:26:36 -04:00
Hundrec bb8d3ae3dc Combine those lines
Thanks Hyper!
2025-03-11 19:26:36 -04:00
Hundrec 56033b3288 Changelog overhaul for 0.4.1, 0.4.0, 0.3.3, 0.3.2, 0.3.1, 0.3.0 2025-03-11 19:26:36 -04:00
Hundrec 6e44484a1a Changelog overhaul for 0.5.3, 0.5.2, 0.5.1
Plus added line breaks to match Keep A Changelog's format
2025-03-11 19:26:36 -04:00
Cameron Taylor 26de08c005 note hold and splash in progress 2025-03-11 18:46:06 -04:00
Cameron Taylor d5e3fbb384 change the default scrollFactor for stagedata prop stuff from 0,0 to 1,1 2025-03-11 18:39:00 -04:00
Cameron Taylor b46e61a650 forgotten assets submod for the note splash PR 2025-03-11 18:31:32 -04:00
Cameron Taylor 82a316c5b3 Merge branch 'rewrite/master' into public-develop-merge 2025-03-11 17:19:24 -04:00
fabs 44d41a848c assets submod 2025-03-11 16:39:48 -04:00
Eric 99657f1c79
Merge pull request #827 from FunkinCrew/ninjamuffin99/funk-1328
feat: Switching sorting in Freeplay, if your currently selected song …
2025-03-10 22:55:20 -04:00
Cameron Taylor fb26aeb71a feat: Switching sorting in Freeplay, if your currently selected song is in the next section, we move there immediately for easier navigation 2025-03-10 21:44:24 -04:00
EliteMasterEric 6b404c4fcf Don't award Friday Night medal just for logging in, you have to beat a song. 2025-03-10 20:47:06 -04:00
EliteMasterEric 4e05d16cb6 Merge branch 'public-develop' into public-develop-merge 2025-03-10 20:46:33 -04:00
Eric 7ab3818344
Merge pull request #877 from FunkinCrew/notesplash-styles
W6 Strumline Assets: Pixel Note splashes
2025-03-10 20:40:08 -04:00
Cameron Taylor 93e6d0685b reimplement my notesplash stuff i accidentally deleted derp 2025-03-10 20:39:38 -04:00
Cameron Taylor ea3f1be425 NoteSplash animation cleanup 2025-03-10 20:39:38 -04:00
Cameron Taylor f9a40a2bf7 notesplash notestyle implementation 2025-03-10 20:39:32 -04:00
Cameron Taylor f8c546b82c pico/erect week6 parallax 2025-03-10 20:03:02 -04:00
EliteMasterEric 8d3772fdfb Revamp Lit Up (BF Mix), plus other chart tweaks 2025-03-10 19:56:42 -04:00
EliteMasterEric 436b735d48 Use the correct chart for Ugh (Pico Mix) 2025-03-10 19:52:13 -04:00
fabs fc7e518373 nene hair blowing assets submod 2025-03-10 19:41:09 -04:00
Eric 3fcb8ec3f2
Merge pull request #888 from FunkinCrew/spirit-fix
fix: spirit trail fix
2025-03-10 18:21:56 -04:00
Cameron Taylor fccfe3432b fix: revert FlxAnimate version 2025-03-10 16:14:39 -04:00
Hyper_ 9708e20dd4 Minor adjustments
Some reformatting and shortening
2025-03-10 12:56:42 -04:00
Hyper_ df353a1ee8 docs: Some Linux troubleshooting 2025-03-10 12:56:42 -04:00
Hundrec 6c9c3e418a Add more rejected features to Contributing Guide 2025-03-10 12:54:48 -04:00
EliteMasterEric 2a1766fd7b Update charts via Cory 2025-03-07 22:34:54 -05:00
EliteMasterEric 63a8403e7b add bloody tankman song event 2025-03-07 21:56:44 -05:00
EliteMasterEric 7231b3f645 New chart event: Set the character's health icon. 2025-03-07 21:56:44 -05:00
Cameron Taylor 96bdb0d4b2 fix: spirit trail fix 2025-03-06 20:24:22 -05:00
Cameron Taylor 7c9f048776 fix: add null checks to fix crash when creating charts via templates 2025-03-06 18:17:32 -05:00
Cameron Taylor 6b835931c5 fix: changing variations in chart editor properly updates the display / BPM 2025-03-06 18:17:32 -05:00
Cameron Taylor f4da1ced3a fix for loading variations in fnfc files 2025-03-06 18:17:32 -05:00
Cameron Taylor 2633538596 fix for loading variations in fnfc files 2025-03-06 18:09:13 -05:00
Cameron Taylor 6e55bcfc77 fixing for loading .fnfc files 2025-03-06 18:09:13 -05:00
Cameron Taylor 9bf83f9159 fix performance when using selection in Chart Editor 2025-03-06 18:09:00 -05:00
Cameron Taylor 9e7b43ef4f fix: On MacOS, properly use Command key instead of Control key in Chart Editor 2025-03-05 16:57:54 -05:00
Cameron Taylor 3370e0186d redo the dropshadowshader's for loop for proper glsl version 100 crud... 2025-03-05 16:57:39 -05:00
fabs 85b225eeb7 assets submod 2025-03-05 16:57:39 -05:00
fabs 9121e98428 tweaks to drop shadow shader + editable antialias amount 2025-03-05 16:57:39 -05:00
EliteMasterEric 47dda7041d Update assets submodule 2025-03-03 10:55:22 -05:00
EliteMasterEric 2983c7b5bc Fix error spam when Nene tries to use hair blow. 2025-03-03 10:53:21 -05:00
Cameron Taylor 6e7d511faa remove flxtracker from nene/otis 2025-03-02 21:47:27 -05:00
JVN-Pixels edb270d15e Update ResultState.hx 2025-02-28 17:21:27 -05:00
EliteMasterEric 17bf4924bc Update assets submodule 2025-02-28 16:03:43 -05:00
Cameron Taylor 7a624bc3a3 revert the freeplay lag fix since it was causing crashes 2025-02-28 15:02:34 -05:00
EliteMasterEric 869726fc6b Additional chart fixes 2025-02-27 19:45:44 -05:00
fabs 66ed3f2644 assets submod 2025-02-27 16:41:36 -05:00
Cameron Taylor 3168814328 Merge branch 'feature/final-pico-dialogue' into rewrite/master 2025-02-27 16:22:56 -05:00
Cameron Taylor e077603806 assets submod 2025-02-27 16:22:08 -05:00
Cameron Taylor 99337a7123 assets submod 2025-02-27 16:21:31 -05:00
EliteMasterEric be0ad00913 Update assets submodule to include more chart tweaks 2025-02-27 16:19:00 -05:00
EliteMasterEric c61a943f80 Dialogue fixes. 2025-02-26 00:12:14 -05:00
EliteMasterEric 29dcf4f59a Update assets submodule (Roses Pico Mix + dialogue) 2025-02-25 23:43:48 -05:00
EliteMasterEric b35abffd1b Fix a crash with the chart editor. 2025-02-25 23:42:20 -05:00
Lasercar 07c872c775 A fix for a thing 2025-02-26 01:02:42 +10:00
ember / mint 4891e54586
hotfix: missing https in Dockerfile build (caused by #870) (#871) 2025-02-24 18:52:17 +01:00
ana a31257f10f is this a fastly problem? 2025-02-24 12:40:27 -05:00
ana 5329a17439 hardcode download urls for now? 2025-02-24 12:40:27 -05:00
ana 3975c4fa78 chore: enable curl debug logs 2025-02-24 12:40:27 -05:00
ana 04185e150c chore: update build deps 2025-02-24 12:40:27 -05:00
ana 5e02db372d fix: build_defines not being read by CI task 2025-02-24 12:40:27 -05:00
Hundrec bd3acc319c Remove issue reopening action 2025-02-22 23:28:23 -05:00
Cameron Taylor cde7382713 tidy up settings.json via lime.buildTypes 2025-02-21 22:53:48 -05:00
EliteMasterEric 44337a6b81 Make the game more lenient with loading older data from mods, as long it's compatible. 2025-02-21 16:58:51 -05:00
EliteMasterEric e610b7624c Fix a build issue with DiscordClient 2025-02-21 16:58:50 -05:00
Cameron Taylor e6aadf9a31 Merge branch 'bugfix/chart-issues-fixes' into rewrite/master 2025-02-21 16:45:16 -05:00
Cameron Taylor f6caa9b67b update FlxPartialSound w/ better ogg streaming 2025-02-20 19:38:46 -05:00
EliteMasterEric 838f7b0125 Make several tweaks to existing charts 2025-02-18 15:51:14 -05:00
EliteMasterEric a411ce13c1 Update flixel haxelib 2025-02-18 13:38:20 -05:00
EliteMasterEric e07c4487b9 Removed commented code snippet 2025-02-18 13:38:20 -05:00
EliteMasterEric 6061c7762e Resolve issues caused by updating Flixel to latest 2025-02-18 13:38:20 -05:00
Cameron Taylor bda3ab1192 update to latest upstream flixel + flixel-addon + flxanimate 2025-02-18 13:38:20 -05:00
Abnormal 5054c58dca set the default to 1 2025-02-18 13:24:25 -05:00
Abnormal de02137d7c Add the ability to flip the character in the Animation Editor 2025-02-17 23:32:49 -05:00
Abnormal 128afcaad1 quick fixin 2025-02-17 23:28:38 -05:00
Abnormal f6d9d29181 add angle too bc why not 2025-02-17 23:28:38 -05:00
Abnormal ff56b1948a add scrollfactor and alpha + grammatical fix in StageData 2025-02-17 23:28:38 -05:00
EliteMasterEric 87b1fc92f8 Renamed the new controls (I had to edit the margins to make the name fit) 2025-02-17 23:25:09 -05:00
Abnormal bb974c2642 home and end can now jump to the beginning and end of freeplay 2025-02-17 23:25:09 -05:00
Abnormal 0e0c4aeb77 fix: Fix the instrumental selector still allowing inputs after a song is selected 2025-02-17 22:36:49 -05:00
Abnormal 3492d412c6 Blacklist SharedObject 2025-02-17 22:00:08 -05:00
Abnormal b13bf05d16 fix: Fix the difficulty graphic in the Result Screen cutting off 2025-02-17 21:56:22 -05:00
Abnormal 36df61ba9e the checkbox is now grouped together with the rest 2025-02-17 21:29:18 -05:00
Abnormal ee53ccd327 feat: Add a setting that automatically launches the game in fullscreen 2025-02-17 21:29:18 -05:00
Abnormal 7058126e99 fix: Actually check if the Playable Character is unlocked 2025-02-17 21:26:16 -05:00
Abnormal 06c12e36c6 Revert "blacklist one additional class"
This reverts commit 3267c61258.
2025-02-17 20:36:36 -05:00
Abnormal c06d79441d Add comments to 3 functions in funkin.Assets 2025-02-17 20:33:40 -05:00
Cameron Taylor 0a911ae607 remove a buncho unused imports 2025-02-17 19:25:33 -05:00
Cameron Taylor 13fb02599b Merge branch 'nene-abot-sync' into rewrite/master 2025-02-17 19:25:00 -05:00
Cameron Taylor 2a3cf4a211 assets submod 2025-02-17 19:22:43 -05:00
Cameron Taylor 2a2e36a713 Merge branch 'feature/week-6-pico-dialogue' into rewrite/master 2025-02-17 19:12:08 -05:00
EliteMasterEric 43d109df55 Implement Pico and Nene portraits 2025-02-17 19:11:19 -05:00
Cameron Taylor 4223b1d5ec Merge branch 'week6-pico-death' into rewrite/master 2025-02-17 11:42:02 -05:00
fabs 72730b67f1 assets submod 2025-02-17 11:38:55 -05:00
EliteMasterEric 3cdaf2c543 First draft of changelog. 2025-02-17 11:08:35 -05:00
EliteMasterEric eaff62baf5 Update to latestest haxeui-core and haxeui-flixel 2025-02-17 10:29:41 -05:00
EliteMasterEric 103a705e24 Update hxvlc to the latest version 2025-02-17 10:24:50 -05:00
Hundrec 894d0743c9 Table of Contents for CONTRIBUTING.md 2025-02-16 21:36:59 -05:00
EliteMasterEric 482530c569 Update flixel-addons to include changes from main 2025-02-16 18:36:39 -05:00
Abnormal 6795c33980 remove leftover legacy code 2025-02-16 04:08:15 -05:00
Abnormal 6466b88d88 a -> an 2025-02-14 18:15:59 -05:00
Abnormal 9b774e3264 format a few files 2025-02-14 18:13:05 -05:00
MidyGamy 33f943a672 More dump save info + force crash now accurate 2025-02-14 18:10:01 -05:00
MidyGamy f5efc16611 Rewording missing Funkin' Debug Hotkeys.md (thx Hundrec) 2025-02-14 18:10:01 -05:00
MidyGamy 7e820f9497 Added missing debug hotkeys 2025-02-14 18:10:01 -05:00
MrScottyPieey f3ea19ec31 Update Main.hx 2025-02-14 18:05:41 -05:00
Hundrec 40d2a892a9 adjust link in PR Template 2025-02-13 21:23:29 -05:00
Hundrec b4a477e800 PR Template 2025-02-13 21:23:29 -05:00
Hundrec 54ddb652b6 Enhancement Template 2025-02-13 21:23:29 -05:00
Hundrec 7cb9eb797a Crash Template 2025-02-13 21:23:29 -05:00
Hundrec 422feb2c6d Compiling Help Template 2025-02-13 21:23:29 -05:00
Hundrec f7df118b7b Charting Template 2025-02-13 21:23:29 -05:00
Hundrec 02a1af6fd9 Revert spacing 2025-02-13 21:23:29 -05:00
Hundrec 87fe63af5e A lil spacing 2025-02-13 21:23:29 -05:00
Hundrec 7ebf4a4558 Fix Contributing link 2025-02-13 21:23:29 -05:00
Hundrec 74cd7c3353 quote 2025-02-13 21:23:29 -05:00
Hundrec 5f80641d5f Contributing Guide in Minor Bug Template 2025-02-13 21:23:29 -05:00
Hundrec ba6461e249 Link CONTRIBUTING.md in README 2025-02-13 21:23:29 -05:00
Hundrec 24a97524ac Add more console outputs to Troubleshooting Guide
Includes a line about warnings and deprecated functions, as well as a line about the hxcpp prompt.
2025-02-13 21:23:29 -05:00
Abnormal 09c2d21111 Contributor's guide
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-02-13 21:23:29 -05:00
Hundrec 07b6d8f86f adjust link in PR Template 2025-02-13 21:23:18 -05:00
Hundrec 8126cca29b PR Template 2025-02-13 21:23:18 -05:00
Hundrec ba78ded457 Enhancement Template 2025-02-13 21:23:18 -05:00
Hundrec bda5d90bbc Crash Template 2025-02-13 21:23:18 -05:00
Hundrec a9d0c1cb88 Compiling Help Template 2025-02-13 21:23:18 -05:00
Hundrec f8f533ad37 Charting Template 2025-02-13 21:23:18 -05:00
Hundrec 0bc0ab4eec Revert spacing 2025-02-13 21:23:18 -05:00
Hundrec d11027fb08 A lil spacing 2025-02-13 21:23:18 -05:00
Hundrec 7b9e375fea Fix Contributing link 2025-02-13 21:23:18 -05:00
Hundrec dd215687d4 quote 2025-02-13 21:23:18 -05:00
Hundrec e3eddc892d Contributing Guide in Minor Bug Template 2025-02-13 21:23:18 -05:00
Hundrec 36fd05b1f9 Link CONTRIBUTING.md in README 2025-02-13 21:23:18 -05:00
Hundrec c6ef9b17a2 Add more console outputs to Troubleshooting Guide
Includes a line about warnings and deprecated functions, as well as a line about the hxcpp prompt.
2025-02-13 19:04:07 -05:00
Abnormal 943c38767b Contributor's guide
Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-02-13 19:01:55 -05:00
Cameron Taylor c83d2bbc69 Merge branch 'bugfix/week7-shaders-web' into rewrite/master 2025-02-12 14:31:32 -05:00
fabs cbcf3e2754 assets submod 2025-02-12 14:21:46 -05:00
Cameron Taylor 34c67fdb54 fix(debug): pressing H on pause screen removes the 'background' sprite properly as well now 2025-02-12 14:11:18 -05:00
EliteMasterEric 731f38a2bb Fix a bug with strum backgrounds when setting strumline.alpha (thanks QT:RW!) 2025-02-12 14:10:38 -05:00
EliteMasterEric a8b854a807 Fix looping death animation for Stress Pico 2025-02-12 14:02:05 -05:00
fabs 9bc217d3f5 add web support for altMaskImage 2025-02-12 01:51:19 +00:00
fabs 11d6c0bc88 add web support to swappedImage 2025-02-12 01:51:09 +00:00
fabs 072264dce5 assets submod
fixup! assets submod

Merge branch 'senpai-angry-icon' into rewrite/master

assets submod

update assets submod
2025-02-07 19:41:35 -05:00
Cameron Taylor 265d3808e5 fixup! assets submod 2025-02-07 14:29:38 -05:00
Cameron Taylor 609812a4a1 assets submod 2025-02-07 14:26:06 -05:00
fabs f48deb1ade update assets submod 2025-02-07 12:51:05 -05:00
EliteMasterEric 06f6a4a42c Update asset submodule 2025-02-07 12:51:05 -05:00
EliteMasterEric da4af6198d Set the damn version number already! 2025-02-07 12:51:05 -05:00
fabs 557f9800f2 add tankman-bloody to the valid pixel icons 2025-02-07 12:51:05 -05:00
fabs 0a7a73388e assets submod 2025-02-07 12:51:05 -05:00
fabs 9923e29901 wip drop shadow/rimlight shader 2025-02-07 12:51:05 -05:00
EliteMasterEric 58758b1d6a Remove new labels from older songs 2025-02-07 08:33:16 -05:00
fabs a07cb7ba32 assets submod 2025-02-07 08:33:16 -05:00
fabs 58ea0287d3 disable pixel perfect rendering on sprites 2025-02-07 08:33:16 -05:00
fabs 60b1b9aa1f fixed pixel vis positions 2025-02-07 08:33:16 -05:00
Eric 6f40aeac1c
Merge pull request #4106 from FunkinCrew/main
Merge from main into develop
2025-02-05 05:51:43 -05:00
Eric ca16d41592
Merge pull request #4100 from Lasercar/update-art-submodule
Update art submodule commit version
2025-02-04 05:23:10 -05:00
Lasercar 72b06b4a81 update art submodule 2025-02-04 19:43:47 +10:00
Cameron Taylor e59ca3080c assets submod 2025-02-03 18:37:54 -05:00
EliteMasterEric 4f12cc4efa Rebalance song difficulty rankings 2025-02-03 18:37:54 -05:00
Eric 796cbb3812
Merge pull request #4095 from AbnormalPoof/main-to-develop
Move changes from `main` to `develop`
2025-02-03 18:24:40 -05:00
Abnormal 246de95e46
Merge branch 'develop' into main-to-develop 2025-02-03 23:22:56 +00:00
Cameron Taylor fdb4ad11ab fixup! fixup! Implement Week 6 characters, and pixel A-Bot visualizer. 2025-02-03 18:21:07 -05:00
Cameron Taylor d1c87febae fixup! Implement Week 6 characters, and pixel A-Bot visualizer. 2025-02-03 18:21:07 -05:00
EliteMasterEric 7100ff0ba3 Implement Week 6 characters, and pixel A-Bot visualizer. 2025-02-03 18:21:07 -05:00
EliteMasterEric b5bb09a2f7 Add .git folders to Polymod ignore list. 2025-02-03 18:21:07 -05:00
EliteMasterEric ea2d45e6c9 Fix some warnings/crashes in Week 6
assets submod
2025-01-28 16:39:00 -05:00
EliteMasterEric d9fd814645 Disable swapping out freeplay graphics until we get it fixed up. 2025-01-28 16:39:00 -05:00
fabs 019a6ed25b Merge pull request #841 from FunkinCrew/public-develop
More public contributions
2025-01-28 16:39:00 -05:00
fabs db39b19e79 resolved merge conflicts with ReflectUtil 2025-01-27 22:36:43 +00:00
fabs a6388962dd Merge branch 'public-develop' into rewrite/master 2025-01-27 22:31:38 +00:00
Hundrec df142a9144
[GITHUB] Add Links to Guides in Issue Templates (#4053)
* Issues Guide in bug template

* Issues Guide in charting template

* Guide links in compiling template

* Issues Guide in crash template

* Issues Guide in enhancement template
2025-01-27 13:37:42 -05:00
Hundrec 47e320e96f
[GITHUB] Add status: pending triage to all PRs (#4035)
* Add `status: pending triage` to all PRs

* Update label-pull-request.yml

* now size and pr labels can be updated every commit!

* remove this

* move the pending triage thing to a new workflow

* Rename label-pr-on-create.yml to label-pull-request-on-create.yml

* fix the identation on this

* almost forgot to remove this

---------

Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
2025-01-27 13:37:27 -05:00
Hundrec 0c06ba942e
Add needs r&d label to unlabel list (#4034) 2025-01-24 18:21:34 -05:00
EliteMasterEric 5e939bd769 Fix more build issues. 2025-01-23 19:19:05 -05:00
EliteMasterEric 0b309403e0 Fix compile error 2025-01-23 18:22:58 -05:00
EliteMasterEric c232224f04 Added more functions to ReflectUtil, and made it so importing Reflect imports it instead of throwing an error. 2025-01-23 18:16:30 -05:00
EliteMasterEric 526f326323 Use the bound BACK key to quit the game from Title rather than hardcoding to ESC. 2025-01-23 17:29:02 -05:00
EliteMasterEric 0b0556a8b0 Merge remote-tracking branch 'public/main' into public-develop 2025-01-23 17:27:32 -05:00
Abnormal 62166554e7
Add 6 more functions to ReflectUtil (#4019) 2025-01-23 17:21:46 -05:00
lemz a01bcc3da8
change ui controls order (#3027)
a lot of squashed stuff
2025-01-23 16:32:35 -05:00
Kolo dfe02ec668
check if the vocal files actually exist (#3861)
Co-authored-by: Kolo <67389779+JustKolosaki@users.noreply.github.com>
2025-01-17 15:52:02 -05:00
Abnormal a3e23733db
fix early return in hasbeatensong and hasbeatenlevel (#3820) 2025-01-17 15:49:21 -05:00
Sinco 1c12b8467e
Mouse cursor is no longer visible outside of the ingame editors (#3881) 2025-01-17 15:48:06 -05:00
Abnormal ad45b72b1a
Update Constants.hx (#3853) 2025-01-17 15:45:01 -05:00
Kade 785c4be88b
[ENHANCEMENT] [MODDING] Several QOL modding changes (#4009)
* Custom render distance strumline

* Custom note positions

* Custom vertices for holds

* Song Retry Event

Song retry event for pausesubstate.hx
Song retry event for playstate.hx
Song retry event for stage.hx
Song retry event for bopper.hx
Song retry event for song.hx
Scripted class event
Module event

* this should be cast

* Show notesplash toggle

* Formatting and EOF
2025-01-17 15:37:00 -05:00
Til 22d41d21b8
i think this does it (#3955) 2025-01-17 15:33:16 -05:00
Abnormal 69d8570a9e
[ENHANCEMENT] Add offsets support for Album titles (#3618)
* add album title offsets

* cleanup

* cleanup

* fix inconsistency
2025-01-17 15:32:03 -05:00
anysad a17b0e8b3c
[ENHANCEMENT] Preference Descriptions + Other Tweaks (#3872)
* updated preference menu

* update comment
2025-01-17 14:47:47 -05:00
Abnormal e73be4a2b3
Update ReflectUtil.hx (#4008) 2025-01-17 14:46:53 -05:00
Abnormal c38967b501 [ENHANCEMENT] Add Script Events for losing/gaining focus (#3721)
* add events for focus gain/lost

* add callbacks

* move the events to a new interface

* Ok NOW it works

* the event can now longer be canceled
2025-01-17 12:17:48 -05:00
MrMadera 95f46d01ce added gamepad binds (#3934) 2025-01-17 12:17:48 -05:00
Abnormal 8188b19622 more reflectutil additions (#3809) 2025-01-17 12:17:48 -05:00
Abnormal 250f01f207 add setField (#3622) 2025-01-17 12:17:48 -05:00
Eric 8014302d58 Move changes made in main to develop (#4006)
* Rewrite CHANGELOG.md for v0.5.2

* [docs] Add missing changes and links to Changelog (#3655)

* changelog sweep

* Resolve a few conflicts

* Resolve more conflicts

* DadBattle

* Re-add @ianharrigan

* Add links to 0.5.0

* Add links and contributors to 0.4.1 and 0.4.0

* Add links to 0.3.3 and finishing touches

* Add and polish 0.5.3 changes

* Make spacing consistent

* Make label actions more convenient (#3771)

* fixed a plethora of dead links (#3831)

* Add `status: planned` label to label actions (#3910)

* Make label actions more convenient

* chore: Add status: planned to label actions

* Bump the Stage data version to indicate that new values were added.

* Updated Save data version to indicate new values.

* Only display the Stage Editor in builds that enable it, and enable it by default (this re-enables the Stage Editor keybind).

* Enable log messages on all builds by default after we got too many complaints.

* Remove unused custom type resolver.

* Update save data format and error handling.

* Fix a typo.

* proj hxp version bump

* changelog yoink

* Remove duplicate issue detector. (#3944)

---------

Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
Co-authored-by: Cameron Taylor <cameron.taylor.ninja@gmail.com>
2025-01-17 12:17:48 -05:00
Til 19023645df use event.isComboBreak instead of isComboBreak (#3936) 2025-01-17 12:17:48 -05:00
Abnormal a98f680f8f Update PolymodHandler.hx (#3993) 2025-01-17 12:17:48 -05:00
Abnormal 4b127b6413
[ENHANCEMENT] Add Script Events for losing/gaining focus (#3721)
* add events for focus gain/lost

* add callbacks

* move the events to a new interface

* Ok NOW it works

* the event can now longer be canceled
2025-01-16 20:25:19 -05:00
MrMadera 2b7f62edd3
added gamepad binds (#3934) 2025-01-16 20:23:29 -05:00
Abnormal b5d95d59ff
more reflectutil additions (#3809) 2025-01-16 20:13:59 -05:00
Abnormal 9f23a7c54c
add setField (#3622) 2025-01-16 20:13:40 -05:00
Eric a08da8793b
Move changes made in main to develop (#4006)
* Rewrite CHANGELOG.md for v0.5.2

* [docs] Add missing changes and links to Changelog (#3655)

* changelog sweep

* Resolve a few conflicts

* Resolve more conflicts

* DadBattle

* Re-add @ianharrigan

* Add links to 0.5.0

* Add links and contributors to 0.4.1 and 0.4.0

* Add links to 0.3.3 and finishing touches

* Add and polish 0.5.3 changes

* Make spacing consistent

* Make label actions more convenient (#3771)

* fixed a plethora of dead links (#3831)

* Add `status: planned` label to label actions (#3910)

* Make label actions more convenient

* chore: Add status: planned to label actions

* Bump the Stage data version to indicate that new values were added.

* Updated Save data version to indicate new values.

* Only display the Stage Editor in builds that enable it, and enable it by default (this re-enables the Stage Editor keybind).

* Enable log messages on all builds by default after we got too many complaints.

* Remove unused custom type resolver.

* Update save data format and error handling.

* Fix a typo.

* proj hxp version bump

* changelog yoink

* Remove duplicate issue detector. (#3944)

---------

Co-authored-by: Hundrec <hundrecard@gmail.com>
Co-authored-by: Abnormal <86753001+AbnormalPoof@users.noreply.github.com>
Co-authored-by: Cameron Taylor <cameron.taylor.ninja@gmail.com>
2025-01-16 19:50:07 -05:00
mint 3305e3099b [docker rebuild] update ci change detector to trigger on force-push & manual requests using commit message 2025-01-16 14:37:18 -05:00
EliteMasterEric 4554487ded Fix a build issue with HTML5 2025-01-16 14:37:18 -05:00
EliteMasterEric a0ce19f1e0 Update Lime commit again 2025-01-15 17:46:11 -05:00
EliteMasterEric 12ed07b074 Update commit hash again. 2025-01-15 17:46:11 -05:00
EliteMasterEric 6aa57a22de Update lime commit. 2025-01-15 17:46:11 -05:00
Cameron Taylor d294eb170d point towards big lime merge crap 2025-01-15 17:46:11 -05:00
EliteMasterEric 04a7007f6e Move Tracy debug message into trace() 2025-01-13 14:33:21 -05:00
Cameron Taylor bdcd7b8a91 Merge branch 'feature/swap-freeplay-graphic' into rewrite/master 2025-01-10 22:46:06 -05:00
Cameron Taylor 1f5b1ad025 assets submod 2025-01-10 22:45:58 -05:00
EliteMasterEric c4749636d3 Fix some variable naming issues caused by HaxeUI (Ideally revert this in the future) 2025-01-06 22:32:12 -08:00
EliteMasterEric 533876680b Update HaxeUI to the latest commits. 2025-01-06 22:32:12 -08:00
EliteMasterEric 43e55ccee0 Use full commit ID for Newgrounds 2025-01-06 22:32:12 -08:00
EliteMasterEric 17bb2d23ba Update flxanimate 2025-01-06 22:32:12 -08:00
Eric f3ff8279c0 Update additional haxelibs 2025-01-06 22:29:31 -08:00
EliteMasterEric 1dd97ff9e2 Replace hxCodec with hxVLC 2025-01-06 22:29:31 -08:00
EliteMasterEric 9863206fad Fix medal bug, and add v0.6 songs for web. 2025-01-06 15:54:45 -08:00
EliteMasterEric 4813e6f476 Fix crash when medal data fails to load. 2025-01-06 15:54:45 -08:00
EliteMasterEric 69cca7e97b Add four new songs. 2025-01-06 15:54:44 -08:00
Cameron Taylor f4d4b67df4 fix: remove controls on results screen that allowed moving the results text 2024-12-19 18:33:22 -05:00
Cameron Taylor a5a5382a60 fix: fix A-Bot bars to display no volume, rather than 1 single bar, on no input 2024-12-18 12:08:14 -05:00
Cameron Taylor 69b7bcb58b fix: tweaks to A-Bot to fine tune his visuals 2024-12-18 12:08:14 -05:00
Cameron Taylor e0738e0674 chore: create a dedicated tracy build directory when compiling with tracy 2024-12-18 11:20:48 -05:00
Cameron Taylor 8e7fc52712 fix: pico/nene have proper positions on xmas stages 2024-12-18 11:12:44 -05:00
Eric 57870bf8c5
Merge pull request #828 from FunkinCrew/ninjamuffin99/funk-1158
fix: remove the input delay on pause menu, allowing for inputs immedi…
2024-12-18 10:32:26 -05:00
Eric 1274986f7d
Merge branch 'rewrite/master' into ninjamuffin99/funk-1158 2024-12-18 10:26:33 -05:00
Eric 6e1eb2c8dd
Merge pull request #831 from FunkinCrew/high-dpi
fix: explicitly allow high DPI
2024-12-18 10:26:09 -05:00
Eric e69d58d0fd
Merge branch 'rewrite/master' into high-dpi 2024-12-18 10:14:14 -05:00
EliteMasterEric 0ea4320dfb Update assets submodule to add additional freeplay backgrounds. 2024-12-17 12:54:44 -05:00
EliteMasterEric eafa3db1b5 Fix asset fallback. 2024-12-17 12:54:31 -05:00
EliteMasterEric e0911b2861 Implemented hot swapping the backing image. 2024-12-17 10:41:01 -05:00
EliteMasterEric 6efd8b122f Fix an issue with the medal entry sound 2024-12-17 10:38:00 -05:00
Cameron Taylor f8cf32e0a9 feat: MERCH link on main menu is now fetched via NG api 2024-12-13 14:53:50 -05:00
Cameron Taylor 02de1c43e2 fix: explicitly allow high DPI 2024-12-10 18:02:53 -05:00
mint 5df14f76fe rework the game build as a multijob workflow 2024-12-10 17:29:50 -05:00
mint 0513ac60cf compare against current branch not master 2024-12-10 17:29:50 -05:00
mint 83b1333191 typo in docker workflow file 2024-12-10 17:29:50 -05:00
mint 56c94bee31 always run docker rebuild task check 2024-12-10 17:29:50 -05:00
mint 0eb1223202 task dependencies test 2024-12-10 17:29:50 -05:00
mint da558ddaa2 move ubuntu 23.10 -> 24.04 2024-12-10 17:29:50 -05:00
Cameron Taylor be3fe9028a fix: remove the input delay on pause menu, allowing for inputs immediately when opening the pause menu 2024-12-08 20:37:46 -05:00
Kolo 71ed154b81 fix that one annoying ass bug for events 2024-12-05 22:24:49 +01:00
EliteMasterEric c0c5fa4617 Update assets submodule 2024-12-02 15:07:56 -05:00
Cameron Taylor 769707e54a remove trace() call when getting song scores 2024-11-26 16:09:39 -05:00
Cameron Taylor 76bedb8079 some random hxformat crap fixes in Stage.hx 2024-11-26 16:08:45 -05:00
Cameron Taylor 1612005656 fix: volume properly muted when at 0 2024-11-26 15:56:22 -05:00
Cameron Taylor a5cee7c5ad update/merge latest changes from upstream openfl (and update our hmm.json here) 2024-11-26 15:49:22 -05:00
Victor G c6d5bda802
feat: Added non-naughty Perfect results screen animation for Boyfriend (#821)
* change result state stuff

* add more fields

* change testing

* assets submod

---------

Co-authored-by: Cameron Taylor <cameron.taylor.ninja@gmail.com>
2024-11-26 15:39:12 -05:00
Cameron Taylor a9f6521b0e fuck it turn on compilation server? 2024-11-24 21:29:27 -05:00
EliteMasterEric e3b1a7d850 Update assets submodule 2024-11-24 21:07:20 -05:00
EliteMasterEric 2143792369 Fix an issue with setting music.asset to "" 2024-11-24 21:07:00 -05:00
Cameron Taylor 7456b5c4fd assets submod rebase/merge 2024-11-23 15:22:38 -05:00
CheemsAndFriends cba2caa78b fix idle easter egg freeplay 2024-11-23 15:21:28 -05:00
CheemsAndFriends 490760caa0 fix the ignore in the ignore 2024-11-23 15:21:28 -05:00
CheemsAndFriends b28b1d8810 Fix middle click funky stuff 2024-11-23 15:21:28 -05:00
CheemsAndFriends ef44bda9da fix album popping prematurely 2024-11-23 15:21:28 -05:00
CheemsAndFriends 90f6eac3fa add -hold animations 2024-11-23 15:21:28 -05:00
CheemsAndFriends 6851cfc8aa fix album random issue 2024-11-23 15:21:28 -05:00
CheemsAndFriends a1cf76e89c Fix easter egg idle and cartoon to play as intended 2024-11-23 15:21:28 -05:00
CheemsAndFriends 1ac91b35ca Bump funkin.vis version 2024-11-23 15:21:28 -05:00
CheemsAndFriends 6d48de2107 Readd blood extension 2024-11-23 15:21:28 -05:00
CheemsAndFriends fcb48ea52f Remove traces 2024-11-23 15:20:30 -05:00
CheemsAndFriends 3d5e91f455 Fix blazin issue and holds not playing properly 2024-11-23 15:20:30 -05:00
CheemsAndFriends 61639e5b51 fix isAnimationFinished 2024-11-23 15:19:59 -05:00
CheemsAndFriends d3c001c673 Trying to fix blazin issues 2024-11-23 15:19:57 -05:00
CheemsAndFriends 65dc9d487d conditional for release with debug functions 2024-11-23 15:19:48 -05:00
EliteMasterEric 1212c694e8 Add a new option to put a transparent background on the strumline 2024-11-23 14:42:46 -05:00
EliteMasterEric b7f2112c60 feat: Add alternate sticker set, and sticker pack swapping. 2024-11-14 22:25:44 -05:00
Cameron Taylor a356e6e520 properly persist medal icons across states 2024-11-14 17:24:39 -05:00
Cameron Taylor 71d0d38190 unlock the NG medal only once you've pressed ENTER on title screen, rather than when game boots, so that it feels like a player unlocks a medal from input, rather than random automatically 2024-11-14 17:24:39 -05:00
CheemsAndFriends 673b4f8a6b Implement StartGame and FridayNight 2024-11-14 17:24:39 -05:00
EliteMasterEric 2ade41f152 assets submod update for community PRs 2024-11-11 18:47:46 -05:00
Cameron Taylor d64cf595d6 secret repo gitmodules 2024-11-04 15:05:33 -05:00
EliteMasterEric e974718947 Disallow scripts from messing with medals.
Some cleanup and readd support for fetching URLs on web builds.

Link the missing medals

base64 medal stuff, and some debug crap

remove trace crap

update assets stuff

assets stuff

newgrounds username on titlescreen and replace things with NG.core instead of our own client singleton
2024-11-04 15:05:33 -05:00
CheemsAndFriends 97da5f0122 bump flxanimate
NewgroundsCredentials.hx add to gitignore

hardcode images
2024-11-04 15:05:33 -05:00
EliteMasterEric 00be427794 Display medal popup only if medal isn't unlocked.
change art stuff
2024-11-04 15:05:33 -05:00
EliteMasterEric 775904a7c0 Use public medal IDs on release builds. 2024-11-04 15:05:33 -05:00
EliteMasterEric aa08dcfbbc Specify credentials via -DAPI_NG_APP_ID=value and -DAPI_NG_ENC_KEY=value at build time 2024-11-04 15:05:33 -05:00
EliteMasterEric b75a550c5b Nice little login prompt for desktop users. Scores/medals work nicely 2024-11-04 15:05:33 -05:00
CheemsAndFriends df094f15cf Medal stuff 2024-11-04 15:05:33 -05:00
EliteMasterEric e9e639500a Newly revamped Newgrounds integration, with working medals and leaderboards 2024-11-04 15:05:33 -05:00
Eric 8cad041035
Merge pull request #812 from FunkinCrew/hmm-macos15-fix
openfl, lime, and hxcpp hmm update
2024-11-01 18:18:48 -04:00
Cameron Taylor 0fd8624483 fix: fix the edges of sprites appearing darker with the adjustColor shader 2024-11-01 16:29:38 -04:00
Cameron Taylor 9cf808b5d3 lime commit fixie 2024-11-01 16:19:04 -04:00
Cameron Taylor 3362f0bdd0 openfl, lime, and hxcpp hmm update 2024-11-01 15:28:14 -04:00
Cameron Taylor 97c3114200
Merge pull request #811 from FunkinCrew/public-release/develop
fix: re-enable precise chart editor scrolling, and also fix smooth sc…
2024-10-30 13:15:04 -04:00
462 changed files with 32285 additions and 12703 deletions

View file

@ -3,24 +3,30 @@ 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](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 properly named my issue
- 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
- type: dropdown
attributes:
label: Platform
description: Which platform are you playing on?
options:
- Android
- iOS/iPadOS
- Newgrounds (Web/HTML5)
- Itch.io (Web/HTML5)
- Itch.io (Downloadable Build) - Windows
- Itch.io (Downloadable Build) - MacOS
- Itch.io (Downloadable Build) - Linux
- Windows (Downloadable Build)
- MacOS (Downloadable Build)
- Linux (Downloadable Build)
- Compiled from GitHub Source Code
validations:
required: true
@ -37,14 +43,26 @@ body:
- Safari
- Other (Specify in Description field)
- type: input
attributes:
label: Mobile Device Model
description: (Mobile users only) What mobile device are you playing on?
placeholder: ex. iPhone 16, Galaxy S25, iPad 11th Gen
- type: input
attributes:
label: Mobile OS Version
description: (Mobile users only) What version is your Operating System?
placeholder: ex. iOS 18.5, Android 15, iPadOS 18.5
- type: input
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
description: Which version are you playing on? The game version is in the bottom left corner of the main menu.
placeholder: ex. 0.7.4
validations:
required: true
- type: markdown
attributes:
value: "## Describe your bug."
@ -56,11 +74,11 @@ body:
- type: textarea
attributes:
label: Description (include any images, videos, errors, or crash logs)
description: Provide as much detail as you can. The better others understand your issue, the more they can help you!
description: Provide as much detail as you can. The better others understand your issue, the more they can help you!
placeholder: Describe your issue here...
validations:
required: true
- type: textarea
attributes:
label: Steps to Reproduce

View file

@ -3,48 +3,43 @@ 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 properly named my issue
- 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
- type: dropdown
attributes:
label: Platform
description: Which platform are you playing on?
options:
- Android
- iOS/iPadOS
- Newgrounds (Web/HTML5)
- Itch.io (Web/HTML5)
- Itch.io (Downloadable Build) - Windows
- Itch.io (Downloadable Build) - MacOS
- Itch.io (Downloadable Build) - Linux
- Windows (Downloadable Build)
- MacOS (Downloadable Build)
- Linux (Downloadable Build)
- Compiled from GitHub Source Code
validations:
required: true
- type: dropdown
attributes:
label: Browser
description: (Web/HTML5 users only) Which browser are you playing on?
options:
- Google Chrome
- Microsoft Edge
- Firefox
- Opera
- Safari
- Other (Specify in Description field)
- type: input
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
description: Which version are you playing on? The game version is in the bottom left corner of the main menu.
placeholder: ex. 0.7.4
validations:
required: true
- type: markdown
attributes:
value: "## Describe the charting issue(s)."

View file

@ -1,23 +1,33 @@
name: Compiling Report
name: Compiling Help
description: Report an issue with compiling the game.
labels: ["type: compilation help", "status: pending triage"]
title: "Compiling Report: "
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 properly named my issue
- 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 titled my issue
- type: dropdown
attributes:
label: Platform
description: Which platform are you compiling to/for?
description: Which platform are you compiling for?
options:
- Android
- iOS/iPadOS
- Web/HTML5
- Desktop
- Desktop (Windows)
- Desktop (Mac)
- Desktop (Linux)
- Other
validations:
required: true
@ -25,14 +35,14 @@ body:
- type: input
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
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.7.4
validations:
required: true
- type: markdown
attributes:
value: "## Describe your compiling error."
value: "## Describe your compiling issue."
- type: markdown
attributes:
@ -40,8 +50,16 @@ body:
- type: textarea
attributes:
label: Description (include any images, videos, errors of terminal or console, error logs)
description: Provide as much detail as you can. The better others understand your issue, the more they can help you!
placeholder: Describe your issue here...
label: Console Output
description: Paste any errors or warnings from the console here.
placeholder: Paste output here...
validations:
required: true
- type: textarea
attributes:
label: Context
description: Provide as much detail as you can. Did you modify any code? Provide any relevant images or videos.
placeholder: Describe the context here...
validations:
required: true

View file

@ -3,24 +3,31 @@ 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 properly named my issue
- 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
- type: dropdown
attributes:
label: Platform
description: Which platform are you playing on?
options:
- Android
- iOS/iPadOS
- Newgrounds (Web/HTML5)
- Itch.io (Web/HTML5)
- Itch.io (Downloadable Build) - Windows
- Itch.io (Downloadable Build) - MacOS
- Itch.io (Downloadable Build) - Linux
- Windows (Downloadable Build)
- MacOS (Downloadable Build)
- Linux (Downloadable Build)
- Compiled from GitHub Source Code
validations:
required: true
@ -37,11 +44,23 @@ body:
- Safari
- Other (Specify in Description field)
- type: input
attributes:
label: Mobile Device Model
description: (Mobile users only) What mobile device are you playing on?
placeholder: ex. iPhone 16, Galaxy S25, iPad 11th Gen
- type: input
attributes:
label: Mobile OS Version
description: (Mobile users only) What version is your Operating System?
placeholder: ex. iOS 18.5, Android 15, iPadOS 18.5
- type: input
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
description: Which version are you playing on? The game version is in the bottom left corner of the main menu.
placeholder: ex. 0.7.4
validations:
required: true
@ -56,7 +75,7 @@ body:
- type: textarea
attributes:
label: Description
description: Include screenshots or videos of the crash happening. Provide as much detail as you can.
description: Include screenshots or videos of the crash happening. Provide as much detail as you can.
placeholder: Describe the crash here...
validations:
required: true
@ -72,7 +91,7 @@ body:
- type: textarea
attributes:
label: Crash logs
description: These can be found in the logs folder where Funkin.exe is.
description: These can be found in the logs folder where Funkin.exe is, or in your mobile device's file explorer.
placeholder: Upload your logs here...
validations:
required: true

View file

@ -3,13 +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 properly named my enhancement
- 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 titled my enhancement
- type: textarea
attributes:

View file

@ -5,7 +5,7 @@ inputs:
haxe:
description: 'Version of haxe to install'
required: true
default: '4.3.4'
default: '4.3.6'
hxcpp-cache:
description: 'Whether to use a shared hxcpp compile cache'
required: true
@ -30,7 +30,7 @@ runs:
echo "TIMER_HAXE=$(date +%s)" >> "$GITHUB_ENV"
- name: Install Haxe
uses: funkincrew/ci-haxe@v3.1.0
uses: funkincrew/ci-haxe@v3.2.7
with:
haxe-version: ${{ inputs.haxe }}

View file

@ -1,12 +1,22 @@
# Add 'size: small' to any changes below 10 lines
# Add 'size: tiny' to any changes of at most 4 lines
'size: tiny':
max: 4
# Add 'size: small' to any changes between 5 and 10 lines
'size: small':
max: 9
min: 5
max: 10
# Add 'size: medium' to any changes between 10 and 100 lines
# Add 'size: medium' to any changes between 11 and 100 lines
'size: medium':
min: 10
max: 99
min: 11
max: 100
# Add 'size: large' to any changes of at least 100 lines
# Add 'size: large' to any changes between 101 and 500 lines
'size: large':
min: 100
min: 101
max: 500
# Add 'size: huge' to any changes of more than 500 lines
'size: huge':
min: 501

View file

@ -16,6 +16,7 @@
- 'status: bug reproduced'
- 'status: cannot reproduce'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -31,14 +32,13 @@
This pull request is a duplicate. Please direct all discussion to the original pull request.
# Close the pull request
close: false
# Set a close reason
# close-reason: 'not planned'
# Remove other status labels
unlabel:
- 'status: accepted'
- 'status: bug reproduced'
- 'status: cannot reproduce'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -62,6 +62,7 @@
- 'status: cannot reproduce'
- 'status: duplicate'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -73,8 +74,6 @@
prs:
# Close the pull request
close: true
# Set a close reason
close-reason: 'not planned'
# Remove other status labels
unlabel:
- 'status: accepted'
@ -82,6 +81,7 @@
- 'status: cannot reproduce'
- 'status: duplicate'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -104,6 +104,7 @@
- 'status: cannot reproduce'
- 'status: duplicate'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -115,8 +116,6 @@
prs:
# Close the pull request
close: true
# Set a close reason
close-reason: 'not planned'
# Remove other status labels
unlabel:
- 'status: accepted'
@ -124,6 +123,7 @@
- 'status: cannot reproduce'
- 'status: duplicate'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'
@ -146,6 +146,7 @@
- 'status: cannot reproduce'
- 'status: duplicate'
- 'status: needs clarification'
- 'status: needs r&d'
- 'status: needs revision'
- 'status: pending pull request'
- 'status: pending triage'

View file

@ -1,6 +1,10 @@
<!-- Please check for duplicates or similar PRs before submitting this PR. -->
## Does this PR close any issues? If so, link them below.
<!-- Please read the Contributing Guide (https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md) before submitting this PR. -->
## Briefly describe the issue(s) fixed.
<!-- Does this PR close any issues? If so, link them below. -->
## Linked Issues
## Include any relevant screenshots or videos.
<!-- Briefly describe the issue(s) fixed. -->
## Description
<!-- Include any relevant screenshots or videos. -->
## Screenshots/Videos

View file

@ -1,53 +0,0 @@
name: Create and publish Docker image
on:
workflow_dispatch:
push:
paths:
- '**/Dockerfile'
- '.github/workflows/build-docker-image.yml'
jobs:
build-and-push-image:
runs-on: build-set
permissions:
contents: read
packages: write
steps:
- name: Get checkout token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: Checkout repo
uses: funkincrew/ci-checkout@v6
with:
submodules: false
token: ${{ steps.app_token.outputs.token }}
- name: Log into GitHub Container Registry
uses: docker/login-action@v3.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v5.3.0
with:
context: ./build
push: true
tags: |
ghcr.io/funkincrew/build-dependencies:latest
ghcr.io/funkincrew/build-dependencies:${{ github.sha }}
labels: |
org.opencontainers.image.description=precooked haxe build-dependencies
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.source=https://github.com/${{ github.repository }}
org.opencontainers.image.title=${{ github.repository_owner }}/build-dependencies
org.opencontainers.image.url=https://github.com/${{ github.repository }}
org.opencontainers.image.version=${{ github.sha }}

View file

@ -1,3 +1,6 @@
# Builds the game on all platforms, to ensure it compiles on all target platforms.
# This helps to ensure workers focus on the master branch.
name: Build and Upload nightly game builds
on:
@ -12,146 +15,249 @@ on:
description: Save the build artifact to Github Actions (sends to itch otherwise)
default: false
push:
paths-ignore:
- '**/Dockerfile'
- '.github/workflows/build-docker-image.yml'
jobs:
gather-changes:
runs-on: build-set
outputs:
trigger-build: ${{ steps.should-trigger.outputs.result }}
steps:
- name: Checkout repo
uses: funkincrew/ci-checkout@v7.3.3
with:
submodules: false
- uses: dorny/paths-filter@v3
id: filter
with:
base: ${{ github.ref }}
filters: |
docker:
- '.github/workflows/build-game.yml'
- '**/Dockerfile'
- uses: actions/github-script@v7
id: should-trigger
with:
result-encoding: string
script: |
const { payload } = context
const changes = ${{ steps.filter.outputs.changes }}
const manual = payload.commits
.some(c => c.message.toLowerCase().replace(/\W/g, " ").includes("docker rebuild"))
console.log({ payload, changes, manual, commits: payload.commits })
return payload.created
|| payload.forced
|| changes.includes("docker")
|| manual
gather-tags:
runs-on: build-set
outputs:
primary: ${{ steps.build-tags.outputs.primary }}
list: ${{ steps.build-tags.outputs.list }}
steps:
- name: Gather build tags
uses: actions/github-script@v7
id: build-tags
with:
script: |
const base = "ghcr.io/funkincrew/build-dependencies"
const default_branch = "rewrite/master"
const ref_path = context.ref.split("/").slice(2)
const ref = ref_path.join("/")
const ref_tag = ref_path.join("-")
const tags = [ref_tag, context.sha]
if (ref === default_branch) tags.push("latest")
console.log([
`ref: ${ref}`,
`default_branch: ${default_branch}`,
`tags: ${tags.join(", ")}`
].join('\n'))
const tag_list = tags
.map(tag => `${base}:${tag}`)
.join("\n")
core.setOutput("primary", ref_tag)
core.setOutput("list", tag_list)
docker-image:
needs: [gather-changes, gather-tags]
if: needs.gather-changes.outputs.trigger-build == 'true'
runs-on: build-set
permissions:
contents: read
packages: write
steps:
- name: Checkout repo
uses: funkincrew/ci-checkout@v7.3.3
with:
submodules: false
- name: Log into GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: ./build
push: true
tags: ${{ needs.gather-tags.outputs.list }}
labels: |
org.opencontainers.image.description=precooked haxe build dependencies
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.source=https://github.com/${{ github.repository }}
org.opencontainers.image.title=${{ github.repository_owner }}/build-dependencies
org.opencontainers.image.url=https://github.com/${{ github.repository }}
org.opencontainers.image.version=${{ github.sha }}
build-game-on-host:
strategy:
fail-fast: false
matrix:
include:
- target: windows
- target: macos
- target: windows
runs-on: windows
- target: macos
runs-on: macos
# TODO: Install XCode to build iOS
# - target: ios
# runs-on: macos
runs-on:
- ${{ matrix.target }}
- ${{ matrix.runs-on }}
defaults:
run:
shell: bash
env:
BUILD_DEFINES: ${{ github.event.inputs.build-defines || '-DGITHUB_BUILD' }}
steps:
- name: Make git happy
run: |
git config --global --replace-all safe.directory $GITHUB_WORKSPACE
- name: Get checkout token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: Checkout repo
uses: funkincrew/ci-checkout@v6
with:
submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }}
persist-credentials: false
- name: Setup build environment
uses: ./.github/actions/setup-haxe
with:
gh-token: ${{ steps.app_token.outputs.token }}
- name: Setup HXCPP dev commit
run: |
cd .haxelib/hxcpp/git/tools/hxcpp
haxe compile.hxml
cd ../../../../..
- name: Build game
if: ${{ matrix.target == 'windows' }}
run: |
haxelib run lime build windows -v -release ${{ github.event.inputs.build-defines }}
timeout-minutes: 120
- name: Build game
if: ${{ matrix.target != 'windows' }}
run: |
haxelib run lime build ${{ matrix.target }} -v -release --times ${{ github.event.inputs.build-defines }}
timeout-minutes: 120
- name: Save build artifact to Github Actions
if: ${{ github.event.inputs.save-artifact }}
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.target }}
path: export/release/${{matrix.target}}/bin/
- name: Upload build artifacts
uses: ./.github/actions/upload-itch
with:
butler-key: ${{ secrets.BUTLER_API_KEY}}
target: ${{ matrix.target }}
- name: Make git happy
run: |
git config --global --replace-all safe.directory $GITHUB_WORKSPACE
- name: Get checkout token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: Checkout repo
uses: funkincrew/ci-checkout@v7.3.3
with:
submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }}
persist-credentials: false
submodule-aliases: |
https://github.com/FunkinCrew/Funkin.assets > https://github.com/FunkinCrew/Funkin-assets-secret
https://github.com/FunkinCrew/Funkin.art > https://github.com/FunkinCrew/Funkin-art-secret
- name: Setup build environment
uses: ./.github/actions/setup-haxe
with:
gh-token: ${{ steps.app_token.outputs.token }}
- name: Setup HXCPP dev commit
run: |
cd .haxelib/hxcpp/git/tools/hxcpp
haxe compile.hxml
cd ../../../../..
- name: Build game (windows)
if: ${{ matrix.target == 'windows' }}
run: |
haxelib run lime build windows -v -release $BUILD_DEFINES
timeout-minutes: 120
- name: Build game (unix)
if: ${{ matrix.target != 'windows' }}
run: |
haxelib run lime build ${{ matrix.target }} -v -release --times $BUILD_DEFINES
timeout-minutes: 120
- name: Save build artifact to Github Actions
if: ${{ github.event.inputs.save-artifact }}
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.target }}
path: export/release/${{matrix.target}}/bin/
- name: Upload build artifacts
uses: ./.github/actions/upload-itch
with:
butler-key: ${{ secrets.BUTLER_API_KEY}}
target: ${{ matrix.target }}
build-game-in-container:
needs: [gather-tags, docker-image]
if: ${{ ! cancelled() }}
runs-on: build-set
container: ghcr.io/funkincrew/build-dependencies:latest
container: ghcr.io/funkincrew/build-dependencies:${{ needs.gather-tags.outputs.primary }}
strategy:
matrix:
include:
- target: linux
- target: html5
- target: linux
- target: html5
# - target: android
defaults:
run:
shell: bash
env:
BUILD_DEFINES: ${{ github.event.inputs.build-defines || '-DGITHUB_BUILD' }}
steps:
- name: Get checkout token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: Checkout repo
uses: funkincrew/ci-checkout@v6
with:
submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }}
persist-credentials: false
- name: Config haxelib
run: |
haxelib --never newrepo
echo "HAXEPATH=$(haxelib config)" >> "$GITHUB_ENV"
- name: Restore cached dependencies
id: cache-hmm
uses: actions/cache@v4
with:
path: .haxelib
key: haxe-hmm-${{ runner.os }}-${{ hashFiles('**/hmm.json') }}
- if: ${{ steps.cache-hmm.outputs.cache-hit != 'true' }}
name: Install dependencies
run: |
git config --global 'url.https://x-access-token:${{ steps.app_token.outputs.token }}@github.com/.insteadOf' https://github.com/
git config --global advice.detachedHead false
haxelib --global run hmm install -q
cd .haxelib/hxcpp/git/tools/hxcpp && haxe compile.hxml
- if: ${{ matrix.target != 'html5' }}
name: Restore hxcpp cache
uses: actions/cache@v4
with:
path: /usr/share/hxcpp
key: haxe-hxcpp-${{ runner.os }}-${{ github.ref_name }}-${{ github.sha }}
restore-keys: haxe-hxcpp-${{ runner.os }}-${{ github.ref_name }}
- name: Build game
run: |
haxelib run lime build ${{ matrix.target }} -v -release --times ${{ github.event.inputs.build-defines }}
timeout-minutes: 120
- name: Save build artifact to Github Actions
if: ${{ github.event.inputs.save-artifact }}
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.target }}
path: export/release/${{matrix.target}}/bin/
- name: Upload build artifacts
uses: ./.github/actions/upload-itch
with:
butler-key: ${{ secrets.BUTLER_API_KEY}}
target: ${{ matrix.target }}
- name: Get checkout token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PEM }}
owner: ${{ github.repository_owner }}
- name: Checkout repo
uses: funkincrew/ci-checkout@v7.3.3
with:
submodules: 'recursive'
token: ${{ steps.app_token.outputs.token }}
persist-credentials: false
submodule-aliases: |
https://github.com/FunkinCrew/Funkin.assets > https://github.com/FunkinCrew/Funkin-assets-secret
https://github.com/FunkinCrew/Funkin.art > https://github.com/FunkinCrew/Funkin-art-secret
- name: Config haxelib
run: |
haxelib --never newrepo
echo "HAXEPATH=$(haxelib config)" >> "$GITHUB_ENV"
- name: Restore cached dependencies
id: cache-hmm
uses: actions/cache@v4
with:
path: .haxelib
key: haxe-hmm-${{ runner.os }}-${{ hashFiles('**/hmm.json') }}
- if: ${{ steps.cache-hmm.outputs.cache-hit != 'true' }}
name: Install dependencies
run: |
git config --global 'url.https://x-access-token:${{ steps.app_token.outputs.token }}@github.com/.insteadOf' https://github.com/
git config --global advice.detachedHead false
haxelib --global run hmm install -q
cd .haxelib/hxcpp/git/tools/hxcpp && haxe compile.hxml
- if: ${{ matrix.target != 'html5' }}
name: Restore hxcpp cache
uses: actions/cache@v4
with:
path: /usr/share/hxcpp
key: haxe-hxcpp-${{ runner.os }}-${{ github.ref_name }}-${{ github.sha }}
restore-keys: haxe-hxcpp-${{ runner.os }}-${{ github.ref_name }}
- name: Build game
run: |
haxelib run lime build ${{ matrix.target }} -v -release --times $BUILD_DEFINES
timeout-minutes: 120
- name: Save build artifact to Github Actions
if: ${{ github.event.inputs.save-artifact }}
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.target }}
path: export/release/${{matrix.target}}/bin/
- name: Upload build artifacts
uses: ./.github/actions/upload-itch
with:
butler-key: ${{ secrets.BUTLER_API_KEY}}
target: ${{ matrix.target }}

View file

@ -1,3 +1,6 @@
# When a pull request is merged, cancel all queued workflows for that branch
# This helps to ensure workers focus on the master branch.
name: Cancel queued workflows on PR merge
on:
@ -23,7 +26,7 @@ jobs:
let branch_workflows = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: "build-shit.yml",
workflow_id: "build-game.yml",
status: "queued",
branch: "${{ github.event.pull_request.head.ref }}"
});

View file

@ -1,5 +1,6 @@
# Perform actions when labels are applied to issues, discussions, or pull requests
# See .github/label-actions.yml
name: 'Label Actions'
on:

View file

@ -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.

View file

@ -0,0 +1,23 @@
# Applies the following labels to pull requests when created:
# - status: pending triage
name: "Pull Request Labeler 2 (Runs on PR creation)"
on:
pull_request_target:
types:
- opened
jobs:
# Apply `status: pending triage` to newly created pull requests
apply-pending-triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- name: Apply "status pending triage" to new pull requests
uses: actions-ecosystem/action-add-labels@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
labels: "status: pending triage"

View file

@ -1,7 +1,19 @@
# Applies the following labels to pull requests whenver they are created or modified:
# - pr: documentation
# - pr: haxe
# - pr: github
# - size: tiny
# - size: small
# - size: medium
# - size: large
# - size: huge
# see .github/labeler.yml and .github/changed-lines-count-labeler.yml
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
# Apply labels to pull requests based on which files were edited
labeler:

9
.gitignore vendored
View file

@ -3,11 +3,20 @@
.vs/
APIStuff.hx
dump/
temp/
docs/temp/
export/
astc-textures/
RECOVER_*.fla
shitAudio/
.build_time
.swp
NewgroundsCredentials.hx
# Mobile signing stuff
.apple/
.env
key.keystore
# Exclude JS stuff
node_modules/

View file

@ -6,7 +6,6 @@
"vshaxe.hxcpp-debugger", // CPP debugging
"openfl.lime-vscode-extension", // Lime integration
"esbenp.prettier-vscode", // JSON formatting
"redhat.vscode-xml", // XML formatting
"ryanluker.vscode-coverage-gutters" // Highlight code coverage
"redhat.vscode-xml" // XML formatting
]
}

66
.vscode/schema/hmm.json vendored Normal file
View file

@ -0,0 +1,66 @@
{
"type": "object",
"properties": {
"dependencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"title": "Name",
"type": "string",
"description": "The name of the Haxe library"
},
"type": {
"title": "Type",
"type": "string",
"description": "one of haxelib, git, hg, or dev",
"enum": ["haxelib", "git", "hg", "dev"]
},
"ref": {
"type": "string",
"description": "the git/hg ref (branch, commit, tag, etc.)"
},
"url": {
"title": "URL",
"type": "string",
"description": "the git/hg URL"
},
"version": {
"title": "Version",
"type": "string",
"description": "the haxelib library version. Must be in SemVer format (MAJOR.MINOR.PATCH)",
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"
}
},
"required": ["name", "type"],
"dependentSchemas": {
"type": {
"if": {
"properties": {
"type": {
"const": "git"
}
}
},
"then": {
"required": ["url"]
},
"else": {
"if": {
"properties": {
"type": {
"const": "haxelib"
}
}
},
"then": {
"required": ["version"]
}
}
}
}
}
}
}
}

80
.vscode/settings.json vendored
View file

@ -70,7 +70,7 @@
"files.eol": "\n",
"haxe.displayPort": "auto",
"haxe.enableCompilationServer": false,
"haxe.enableCompilationServer": true,
"haxe.enableServerView": true,
"haxe.displayServer": {
"arguments": ["-v"]
@ -90,27 +90,9 @@
"haxecheckstyle.configurationFile": "checkstyle.json",
"haxecheckstyle.codeSimilarityBufferSize": 100,
"lime.projectFile": "project.hxp",
"lime.targetConfigurations": [
{
"label": "Windows / Debug",
"target": "windows",
"args": ["-debug", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Windows / Debug (Tracy)",
"target": "windows",
"args": ["-debug", "-DFEATURE_DEBUG_TRACY", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Linux / Debug",
"target": "linux",
"args": ["-debug", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "HashLink / Debug",
"target": "hl",
"args": ["-debug"]
},
{
"label": "Windows / Debug (Discord)",
"target": "windows",
@ -171,14 +153,14 @@
"args": ["-debug", "-DRESULTS"]
},
{
"label": "Windows / Debug (Straight to Chart Editor)",
"label": "Windows / Debug (Straight to Stage Editor)",
"target": "windows",
"args": ["-debug", "-DCHARTING", "-DFEATURE_DEBUG_FUNCTIONS"]
"args": ["-debug", "-DSTAGING", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "HashLink / Debug (Straight to Chart Editor)",
"target": "hl",
"args": ["-debug", "-DCHARTING"]
"label": "Windows / Debug (Straight to Stage Builder)",
"target": "windows",
"args": ["-debug", "-DSTAGEBUILD", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Windows / Debug (Straight to Animation Editor)",
@ -186,9 +168,9 @@
"args": ["-debug", "-DANIMDEBUG", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Windows / Debug (Debug hxCodec)",
"label": "Windows / Debug (Debug hxvlc)",
"target": "windows",
"args": ["-debug", "-DHXC_LIBVLC_LOGGING", "-DFEATURE_DEBUG_FUNCTIONS"]
"args": ["-debug", "-DHXVLC_LOGGING", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "HashLink / Debug (Straight to Animation Editor)",
@ -210,11 +192,6 @@
"target": "windows",
"args": ["-debug", "-DWAVEFORM", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Windows / Release",
"target": "windows",
"args": ["-release"]
},
{
"label": "Windows / Release (GitHub Actions)",
"target": "windows",
@ -225,29 +202,35 @@
"target": "hl",
"args": ["-debug", "-DWAVEFORM"]
},
{
"label": "HTML5 / Debug",
"target": "html5",
"args": ["-debug", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "HTML5 / Debug (Watch)",
"target": "html5",
"args": ["-debug", "-watch", "-DFEATURE_DEBUG_FUNCTIONS"]
},
}
],
"lime.buildTypes": [
{
"label": "macOS / Debug",
"target": "mac",
"label": "Debug",
"args": ["-debug", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "macOS / Release",
"target": "mac",
"label": "Debug (Unlock Everything)",
"args": ["-debug", "-DUNLOCK_EVERYTHING"]
},
{
"label": "Debug (Tracy)",
"args": ["-debug", "-DFEATURE_DEBUG_TRACY", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Debug (Straight to Chart Editor)",
"args": ["-debug", "-DCHARTING", "-DFEATURE_DEBUG_FUNCTIONS"]
},
{
"label": "Release",
"args": ["-release"]
},
{
"label": "macOS / Release (GitHub Actions)",
"target": "mac",
"label": "Release (GitHub Actions)",
"args": ["-release", "-DGITHUB_BUILD"]
}
],
@ -258,5 +241,12 @@
"coverage.xml",
"jacoco.xml",
"coverage.cobertura.xml"
],
"vscord.app.privacyMode.enable": true,
"json.schemas": [
{
"fileMatch": ["/hmm.json"],
"url": "./.vscode/schema/hmm.json"
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -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.

28
LaunchScreen.storyboard Normal file
View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<simulatedScreenMetrics key="simulatedMetrics" type="freeform" size="375x667"/>
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0" green="0" blue="0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>

114
README.md
View file

@ -1,48 +1,66 @@
# Friday Night Funkin'
Friday Night Funkin' is a rhythm game. Built using HaxeFlixel for Ludum Dare 47.
This game was made with love to Newgrounds and its community. Extra love to Tom Fulp.
- [Playable web demo on Newgrounds!](https://www.newgrounds.com/portal/view/770371)
- [Demo download builds for Windows, Mac, and Linux from Itch.io!](https://ninja-muffin24.itch.io/funkin)
# Getting Started
**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.
# 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)!
# Modding
Feel free to start learning to mod the game by reading our [documentation](https://funkincrew.github.io/funkin-modding-docs/) and guide to modding.
# Credits and Special Thanks
Full credits can be found in-game, or in the `credits.json` file which is located [here](https://github.com/FunkinCrew/funkin.assets/blob/main/exclude/data/credits.json).
## Programming
- [ninjamuffin99](https://twitter.com/ninja_muffin99) - Lead Programmer
- [EliteMasterEric](https://twitter.com/EliteMasterEric) - Programmer
- [MtH](https://twitter.com/emmnyaa) - Charting and Additional Programming
- [GeoKureli](https://twitter.com/Geokureli/) - Additional Programming
- Our contributors on GitHub
## Art / Animation / UI
- [PhantomArcade3K](https://twitter.com/phantomarcade3k) - Artist and Animator
- [Evilsk8r](https://twitter.com/evilsk8r) - Art
- [Moawling](https://twitter.com/moawko) - Week 6 Pixel Art
- [IvanAlmighty](https://twitter.com/IvanA1mighty) - Misc UI Design
## Music
- [Kawaisprite](https://twitter.com/kawaisprite) - Musician
- [BassetFilms](https://twitter.com/Bassetfilms) - Music for "Monster", Additional Character Design
## Special Thanks
- [Tom Fulp](https://twitter.com/tomfulp) - For being a great guy and for Newgrounds
- [JohnnyUtah](https://twitter.com/JohnnyUtahNG/) - Voice of Tankman
- [L0Litsmonica](https://twitter.com/L0Litsmonica) - Voice of Mommy Mearest
<div align='center'><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Friday_Night_Funkin%27_logo.svg/2560px-Friday_Night_Funkin%27_logo.svg.png" width="800">
<h2>Friday Night Funkin' is a rhythm game. Built using HaxeFlixel for <a href="https://ldjam.com/events/ludum-dare/47">Ludum Dare 47.</a></h2>
This game was made with love to Newgrounds and its community. Extra love to Tom Fulp.
</div>
- [Playable web demo on Newgrounds!](https://www.newgrounds.com/portal/view/770371)
- [Demo download builds for Windows, Mac, and Linux from Itch.io!](https://ninja-muffin24.itch.io/funkin)
- [Download Android builds from Google Play!](https://play.google.com/store/apps/details?id=me.funkin.fnf)
- [Download iOS builds from the App Store!](https://apps.apple.com/app/id6740428530)
<div align='center'>
<table>
<tr>
<td><img src="https://fridaynightfunkin.wiki.gg/images/d/d7/Title_Card.gif" alt="Title Screen" width="350"/></td>
<td><img src="https://fridaynightfunkin.wiki.gg/images/9/99/Menu.png" alt="Main Menu" width="350"/></td>
</tr>
</table>
</div>
# Getting Started
**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 follow our [Compiling Guide](/docs/COMPILING.md).
# Contributing
Check out our [Contributing Guide](/docs/CONTRIBUTING.md) to learn how you can actively contribute to the development of Friday Night Funkin'!
# Modding
Feel free to start learning to mod the game by reading our [documentation](https://funkincrew.github.io/funkin-modding-docs/) and guide to modding.
# Credits and Special Thanks
Full credits can be found in-game, or in the `credits.json` file which is located [here](https://github.com/FunkinCrew/funkin.assets/blob/main/exclude/data/credits.json).
## Programming
- [ninjamuffin99](https://twitter.com/ninja_muffin99) - Lead Programmer
- [EliteMasterEric](https://twitter.com/EliteMasterEric) - Programmer
- [MtH](https://twitter.com/emmnyaa) - Charting and Additional Programming
- [GeoKureli](https://twitter.com/Geokureli/) - Additional Programming
- [ZackDroid](https://x.com/ZackDroidCoder) - Lead Mobile Programmer
- [MAJigsaw77](https://github.com/MAJigsaw77) - Mobile Programmer
- [Karim-Akra](https://x.com/KarimAkra_0) - Mobile Programmer
- [Sector_5](https://github.com/sector-a) - Mobile Programmer
- [Luckydog7](https://github.com/luckydog7) - Mobile Programmer
- Our contributors on GitHub
## Art / Animation / UI
- [PhantomArcade3K](https://twitter.com/phantomarcade3k) - Artist and Animator
- [Evilsk8r](https://twitter.com/evilsk8r) - Art
- [Moawling](https://twitter.com/moawko) - Week 6 Pixel Art
- [IvanAlmighty](https://twitter.com/IvanA1mighty) - Misc UI Design
## Music
- [Kawaisprite](https://twitter.com/kawaisprite) - Musician
- [BassetFilms](https://twitter.com/Bassetfilms) - Music for "Monster", Additional Character Design
## Special Thanks
- [Tom Fulp](https://twitter.com/tomfulp) - For being a great guy and for Newgrounds
- [JohnnyUtah](https://twitter.com/JohnnyUtahNG/) - Voice of Tankman
- [L0Litsmonica](https://twitter.com/L0Litsmonica) - Voice of Mommy Mearest

2
art

@ -1 +1 @@
Subproject commit 66572f85d826ce2ec1d45468c12733b161237ffa
Subproject commit 094ff109197e35d21342bdf2d51132be23948d3f

2
assets

@ -1 +1 @@
Subproject commit c1899ffbefb9a7c98b030c75a33623431d7ea6ba
Subproject commit 562cc34c473c6999ea26f13a3f83ccebf6e15a9b

View file

@ -0,0 +1,64 @@
{
"input": "./assets",
"output": "./astc-textures/",
"quality": "medium",
"blocksize": "10x10",
"colorprofile": "cl",
"custom": [
{
"asset": "assets/week1/images/erect/server.png",
"blocksize": "8x8"
},
{
"asset": "assets/week1/images/erect/crowd.png",
"blocksize": "8x8"
},
{
"asset": "assets/week1/image/erect/bg.png",
"blocksize": "8x8"
},
{
"asset": "assets/week1/image/erect/lights.png",
"blocksize": "6x6"
},
{
"asset": "assets/week2/images/erect/stairsDark.png",
"blocksize": "6x6"
},
{
"asset": "assets/week2/images/erect/stairsLight.png",
"blocksize": "6x6"
}
],
"excludes": [
"assets/preload/images/cursor/",
"assets/preload/images/freeplay/",
"assets/preload/images/icons/",
"assets/preload/images/fonts/",
"assets/preload/images/titleEnter.png",
"assets/preload/images/titleEnter_mobile.png",
"assets/preload/images/soundtray/",
"assets/preload/images/stageBuild/",
"assets/preload/images/ui/popup/pixel/*",
"assets/shared/images/characters/abotPixel/*",
"assets/shared/images/characters/bfPixel.png",
"assets/shared/images/characters/bfPixelsDEAD.png",
"assets/shared/images/characters/gfPixel.png",
"assets/shared/images/characters/nenePixel/*",
"assets/shared/images/characters/picoPixel/*",
"assets/shared/images/characters/senpai.png",
"assets/shared/images/characters/spirit.png",
"assets/shared/images/ui/chart-editor/",
"assets/shared/images/ui/countdown/pixel/*",
"assets/shared/images/resultScreen/*",
"assets/shared/images/resultScreen/clearPercent/",
"assets/shared/images/resultScreen/rankText/",
"assets/week1/*",
"assets/week1/images/erect/brightLightSmall.png",
"assets/week1/images/erect/lightAbove.png",
"assets/week1/images/erect/lightgreen.png",
"assets/week1/images/erect/lightred.png",
"assets/week1/images/erect/orangeLight.png",
"assets/week6/"
]
}

View file

@ -1,8 +1,8 @@
FROM ubuntu:mantic
FROM ubuntu:noble
ARG haxe_version=4.3.4
ARG haxe_version=4.3.6
ARG haxelib_version=4.1.0
ARG neko_version=2.3.0
ARG neko_version=2.4.0
# prepare runner
ENV GITHUB_HOME="/github/home"
@ -98,11 +98,12 @@ EOF
# neko
# https://github.com/HaxeFoundation/neko/releases/download/v2-3-0/neko-2.3.0-linux64.tar.gz
RUN <<EOF
neko_url=$(curl https://api.github.com/repos/HaxeFoundation/neko/releases -sfL \
| jq '.[] | select(.name == "'"$neko_version"'")' \
| jq '.assets[] | select(.name | endswith("linux64.tar.gz"))' \
| jq -r '.browser_download_url')
curl -sfL "$neko_url" | tar -xz -C /usr/local
#neko_url=$(curl https://api.github.com/repos/HaxeFoundation/neko/releases -fL \
# | jq '.[] | select(.name == "'"$neko_version"'")' \
# | jq '.assets[] | select(.name | endswith("linux64.tar.gz"))' \
# | jq -r '.browser_download_url')
neko_url="https://geo.thei.rs/funkin/neko-2.4.1-linux64.tar.gz"
curl -fL "$neko_url" | tar -xz -C /usr/local
EOF
RUN <<EOF
@ -117,11 +118,12 @@ ENV PATH="$NEKOPATH:$PATH"
# haxe
# https://github.com/HaxeFoundation/haxe/releases/download/4.0.5/haxe-4.0.5-linux64.tar.gz
RUN <<EOF
haxe_url=$(curl https://api.github.com/repos/HaxeFoundation/haxe/releases -sfL \
| jq '.[] | select(.name == "'"$haxe_version"'")' \
| jq '.assets[] | select(.name | endswith("linux64.tar.gz"))' \
| jq -r '.browser_download_url')
curl -sfL "$haxe_url" | tar -xz -C /usr/local
#haxe_url=$(curl https://api.github.com/repos/HaxeFoundation/haxe/releases -fL \
# | jq '.[] | select(.name == "'"$haxe_version"'")' \
# | jq '.assets[] | select(.name | endswith("linux64.tar.gz"))' \
# | jq -r '.browser_download_url')
haxe_url="https://geo.thei.rs/funkin/haxe-4.3.6-linux64.tar.gz"
curl -fL "$haxe_url" | tar -xz -C /usr/local
EOF
RUN <<EOF

View file

@ -70,16 +70,17 @@
},
{
"props": {
"severity": "IGNORE",
"policy": "aligned",
"allowSingleline": true,
"severity": "INFO"
"allowSingleline": true
},
"type": "ConditionalCompilation"
},
{
"props": {
"ignoreExtern": true,
"format": "^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*$",
"format": "^?:_[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)*$",
"tokens": ["INLINE", "NOTINLINE"]
},
"type": "ConstantName"
@ -347,7 +348,7 @@
{
"props": {
"allowSingleLineStatement": true,
"tokens": ["FOR", "IF", "ELSE_IF", "WHILE", "DO_WHILE"]
"tokens": ["FOR", "ELSE_IF", "WHILE", "DO_WHILE"]
},
"type": "NeedBraces"
},

View file

@ -87,4 +87,3 @@ filter_commits = false
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "newest"

View file

@ -13,17 +13,20 @@
- 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
8. Perform additional platform setup
- If you have issues installing Lime, try utilizing Funkin's patched libraries for hmm and haxelib: `haxelib --global git haxelib https://github.com/FunkinCrew/haxelib.git` and `haxelib --global git hmm https://github.com/FunkinCrew/hmm.git`
8. Run `haxelib run lime setup` to set up Lime
9. 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:
- MSVC v143 VS 2022 C++ x64/x86 build tools
- 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/)
- One of Funkin's dependencies uses libVLC, which requires you to install some development packages to be able to compile.
Command for Ubuntu/Debian based systems: `sudo apt install libvlc-dev libvlccore-dev libvlccore9`, and for other distros, please refer to [hxvlc's documentation](https://github.com/MAJigsaw77/hxvlc?tab=readme-ov-file#dependencies)
- HTML5: Compiles without any extra setup
9. If you are targeting for native, you may need to run `lime rebuild <PLATFORM>` and `lime rebuild <PLATFORM> -debug`
10. `lime test <PLATFORM>` to build and launch the game for your platform (for example, `lime test windows`)
10. If you are targeting for native, you may need to run `lime rebuild <PLATFORM>` and `lime rebuild <PLATFORM> -debug`
11. `lime test <PLATFORM>` to build and launch the game for your platform (for example, `lime test windows`)
## Build Flags
@ -37,8 +40,8 @@ There are several useful build flags you can add to a build to affect how it wor
- This feature causes the game to load exported assets from the project's assets folder rather than the exported one. Great for fast iteration, but the game will break if you try to zip it up and send it to someone, so it's disabled for release builds.
- `-DFEATURE_DISCORD_RPC` or `-DNO_FEATURE_DISCORD_RPC` to forcibly enable or disable support for Discord Rich Presence.
- `-DFEATURE_VIDEO_PLAYBACK` or `-DNO_FEATURE_VIDEO_PLAYBACK` to forcibly enable or disable video cutscene support.
- `-DFEATURE_CHART_EDITOR` or `-DNO_FEATURE_CHART_EDITOR` to forcibly enable or disable the chart editor in the Debug menu.
- `-DFEATURE_SCREENSHOTS` or `-DNO_FEATURE_SCREENSHOTS` to forcibly enable or disable the screenshots feature.
- `-DFEATURE_CHART_EDITOR` or `-DNO_FEATURE_CHART_EDITOR` to forcibly enable or disable the chart editor in the Debug menu.
- `-DFEATURE_STAGE_EDITOR` to forcibly enable the experimental stage editor.
- `-DFEATURE_GHOST_TAPPING` to forcibly enable an experimental gameplay change to the anti-mash system.

10
docs/COMPILING_MAC.md Normal file
View file

@ -0,0 +1,10 @@
# Mac Compiling Guide + Considerations
There's a few extra considerations when compiling FNF for Mac that *we* have to handle when creating a wider release.
- [Creating a Universal Binary](#creating-a-universal-binary)
- Code-signing
- Notarizing
## Creating a Universal Binary
Run the `art/macos-universal.sh` script, which automatically compiles release versions of both arm64 and x86 of Funkin. You can also see there for reference of how it's done.

98
docs/COMPILING_MOBILE.md Normal file
View file

@ -0,0 +1,98 @@
# Compiling Friday Night Funkin' for Mobile Devices
Before starting, **make sure your game builds on desktop.**
Check [COMPILING.md](./COMPILING.md) if you havent done that yet.
## Android
0. **Create a new folder** this will store Android tools (remember where you put it!).
1. **Open a terminal as Administrator.**
2. Run this in the terminal (replace the path with your actual folder):
```bash
setx ANDROID_HOME "C:\path\to\your\folder" /M
```
3. Download [Android Studio Command-line Tools](https://developer.android.com/studio#command-line-tools-only).
4. Extract the ZIP into your folder from step 1.
5. (Optional) Close and reopen the terminal if needed.
6. Run:
```bash
sdkmanager --install "build-tools;35.0.0" "ndk;29.0.13113456" "platforms;android-29" "platforms;android-35"
```
- The latest NDK is not compatible with Lime you have to use the old one.
7. Download and install [JDK 17 (MSI)](https://adoptium.net/temurin/releases/?version=17&os=windows).
8. Run:
```bash
lime setup android
```
Use these when asked:
- **Android SDK:** `C:\path\to\your\folder`
- **Android NDK:** `C:\path\to\your\folder\ndk\29.0.13113456`
- **JDK:** `C:\Program Files\Java\jdk-17`
9. Now build your game:
```bash
lime test android
```
### macOS
0. **Create a new folder** this will store Android tools (remember where you put it!).
1. Open **Terminal** (Command ⌘ + Space → type “terminal” → Enter).
2. In Terminal:
```bash
cd /path/to/your/folder
export ANDROID_HOME=/path/to/your/folder
export PATH=$PATH:$ANDROID_HOME/cmdline-tools:$ANDROID_HOME/cmdline-tools/bin:$ANDROID_HOME/platform-tools
```
3. Download [Android Studio Command-line Tools](https://developer.android.com/studio#command-line-tools-only).
4. Extract the ZIP into your folder from step 1.
5. (Optional) Restart Terminal if needed.
6. Run:
```bash
sdkmanager --install "build-tools;35.0.0" "ndk;29.0.13113456" "platforms;android-29" "platforms;android-35"
```
7. Download and install [JDK 17 for macOS](https://adoptium.net/temurin/releases/?os=mac&version=17).
8. Run:
```bash
lime setup android
```
Use these when asked:
- **Android SDK:** `/path/to/your/folder`
- **Android NDK:** `/path/to/your/folder/ndk/28.0.13004108`
- **JDK:** `/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home`
_(If not asked for JDK, dont worry — just skip it.)_
9. Build your game:
```bash
lime test android
```
## iOS
Note that you can only build the game for iOS on a computer running MacOS.
0. Build the game for desktop to make sure everything works. Check [COMPILING.md](./COMPILING.md).
1. Get Xcode from the app store on your MacOS Machine.
2. Download the iPhone SDK (First thing that pops up in Xcode)
3. Open up a terminal tab and run `lime test ios -xcode`
4. You will need to sign your own copy in order to run the game with a real iOS device! That requires an Apple Developer account, sorry!
- To run with an iOS simulator instead of `-xcode` use `-simulator`
### iOS Troubleshooting
- **A required plugin failed to load. Please ensure system content is up-to-date — try running 'xcodebuild -runFirstLaunch'.**
Make sure you have the iOS SDK isntalled, see Step 2.
- **error: No Accounts: Add a new account in Accounts settings. (in target 'Funkin' from project 'Funkin')**
Open XCode, press CMD+, to open Settings, select Accounts, add an Apple ID.
- error: No Account for Team "Z7G7AVNGSH". Add a new account in Accounts settings or verify that your accounts have valid credentials.
Open `project.hxp` and change `IOS_TEAM_ID` to your personal team's ID.
- error: Failed Registering Bundle Identifier: The app identifier "me.funkin.fnf" cannot be registered to your development team because it is not available.
The Funkin' Crew are the only ones that can build an iOS app with the identifier `me.funkin.fnf`. Open `project.hxp` and change `PACKAGE_NAME` to a unique value.
- error: No profiles for 'me.funkin.fnf' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'me.funkin.fnf'

418
docs/CONTRIBUTING.md Normal file
View file

@ -0,0 +1,418 @@
# 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.
# Table of Contents
<details open>
<summary><b>Contents</b></summary>
[Part 1: Etiquette](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#part-1-etiquette)
<details>
<summary><a href="https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#part-2-issues">Part 2: Issues</a></summary>
* [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)
</details>
<details>
<summary><a href="https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#part-3-pull-requests">Part 3: Pull Requests</a></summary>
* [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)
* [Charting PRs](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#charting-prs)
</details>
[Closing](https://github.com/FunkinCrew/Funkin/blob/main/docs/CONTRIBUTING.md#closing)
</details>
# 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.7.4)
- 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^_ |
| MultiKey, 9k, More than 4 keys, etc. | https://github.com/FunkinCrew/Funkin/issues/4243#issuecomment-2692371969 |
| Flashy Combo Milestones | https://github.com/FunkinCrew/Funkin/pull/4700#issuecomment-2798916579 |
| 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 |
| New Intro Text Lines | https://github.com/FunkinCrew/Funkin/issues/5031#issuecomment-2855593376 |
| Fresh (Chill Mix) as Title Screen Music | https://github.com/FunkinCrew/Funkin/pull/4282#issuecomment-2709334718 |
| Difficulty Ratings above 20 | https://github.com/FunkinCrew/Funkin/issues/3075#issuecomment-2368984497 |
| 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 |
| "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 |
## 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.
> [!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
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!
> 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)
- 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 youre satisfied with the changes youve made, open a PR and base it on the same branch you previously chose.
## Maintaining your pull request
Keeping your pull request clean and easy to review increases the chance that it will be accepted!
Our maintenance policy is as follows:
- If we require changes to your PR, we will label your PR `status: needs revision`.
- We may also leave a comment under your PR specifying what changes you should make.
- If you receive a comment, you have 90 days to implement the requested changes.
- After this period, your PR will be closed due to inactivity and labeled `status: stale`.
- Even after your PR is closed, you may request for us to reopen it. Just be sure to address the issues!
This policy ensures that PRs awaiting review are up to date and ready to merge.
### 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 be a total 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 repositorys `.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). 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. 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 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
{
// Pause the music, as you probably guessed
// FlxG.sound.music.pause();
// Set the target time in steps, I dont 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
{
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
{
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();
}
```
```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.
This involves modifying one or several of the repositorys `.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 repositorys workflows**.
This involves modifying one or several of the repositorys `.yml` files, or any other file in the `.github` folder.
Please test these changes on your forks 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.
### Charting PRs
Charting PRs make changes such as **adjusting chart metadata**.
This involves modifying one or several of the `funkin.assets` repository's `*-metadata.json` files, found in the `preload/data/songs/` directory.
> [!CAUTION]
> We **do not** accept changes to the chart `.json` file itself.
> If you find an error in the game's charts, please open an issue in the `Funkin` repo, and the Funkin' Crew will review it and make tweaks themselves as necessary.
These PRs should only be opened in the `funkin.assets` repository.
# Closing
Thank you for reading the Contributing Guide.
We look forward to seeing your contributions to the game!

View file

@ -3,10 +3,13 @@
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!
- `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**
@ -17,15 +20,27 @@ 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***: Open the Chart Editor with the current song loaded.
- `STAGE Hotkey`: ***OPEN STAGE EDITOR***: Open the old Stage Editor overlay.
## **Freeplay State**
- `F` (Freeplay Menu) - Move to Favorites
- `Q` (Freeplay Menu) - Back one category
- `E` (Freeplay Menu) - Forward one category
- `P`: ***SWITCH TO PICO/BF***: Switch to Pico or BF (reopens Freeplay as the other character).
- `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.
## **Title State**
- `Y` - WOAH
- `ESCAPE`: ***QUIT***: Quit the game.
- `D`: COOL
- `UI LEFT`/`UI RIGHT Hotkey`: 2COOL
- `Y`: WOAH
## **Main Menu**
- `~`: ***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.
- `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.

32
docs/INSTALLING_MODS.md Normal file
View file

@ -0,0 +1,32 @@
# HTML5/Web
1. Nope
# Windows
1. Start the game at least once. This will create a `mods` folder if it doesn't already exist, alongside the executable.
2. Extract the mod you downloaded from its ZIP file, and place the mod folder into the game's `mods` folder.
3. Restart the game. The game should detect the mod and start with it.
# Linux
1. Start the game at least once. This will create a `mods` folder if it doesn't already exist, alongside the executable.
2. Extract the mod you downloaded from its ZIP file, and place the mod folder into the game's `mods` folder.
3. Restart the game. The game should detect the mod and start with it.
# MacOS
1. Start the game at least once. This will create a `mods` folder if it doesn't already exist in the game's system files.
2. Right click `Funkin.app` and select `Show Package Contents`.
3. Navigate to `Contents/Resources/mods`.
4. Extract the mod you downloaded from its ZIP file, and place the mod folder into the game's `mods` folder.
5. Restart the game. The game should detect the mod and start with it.
# Android
1. Start the game at least once. This will create a `mods` folder deep in your system files.
2. Get an Android file browser that lets you view the app data files, or use Android Studio and open up the Device Explorer.
3. Locate the `/sdcard/Android/obb/me.funkin.fnf/mods` folder.
4. Extract the mod you downloaded from its ZIP file, and place the mod folder into the game's `mods` folder.
5. Restart the game (you may have to [force close](https://support.google.com/android/answer/9079646?hl=en) the app first). The game should detect the mod and start with it.
# iOS
1. Start the game at least once. This will create a `mods` folder in your system files.
2. Open the Files app, and navigate to `On My iPhone` -> `Friday Night Funkin` -> `mods`.
3. Extract the mod you downloaded from its ZIP file, and place the mod folder into the game's `mods` folder.
4. Restart the game (you may have to [force close](https://support.apple.com/en-us/109359) the app first). The game should detect the mod and start with it.

12
docs/TRACY.md Normal file
View file

@ -0,0 +1,12 @@
# Tracy Performance Profiling
In v0.5.1, Funkin' gained support for a powerful instrumentation-based profiler known as Tracy. This development tool allows you to see exactly what the game is doing at any given moment, how long each function is taking to call, and even how memory is allocated and deallocated. This is the most powerful tool in your toolbox for diagnosing and resolving performance issues.
## How to Use Tracy
1. Download [Tracy](https://github.com/wolfpld/tracy)
2. Build the game with the `FEATURE_DEBUG_TRACY` flag. For example, `lime build windows -debug -DFEATURE_DEBUG_TRACY`
3. Start Tracy, click Connect. Tracy will start waiting for Funkin' to start.
4. Start the game with Tracy enabled.
![Image](https://github.com/user-attachments/assets/2a394ca7-bc21-4fe3-ae55-347768fb5b87)

View file

@ -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,9 +23,31 @@
- 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**.
- 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 `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.` ... `Advanced users may run "lime rebuild cpp" instead.`
- If on Linux:
- The binaries GLibC version might more recent than the one your system supports. Running the commands below should fix it.
```
cd .haxelib/lime/git
git submodule init
git submodule sync
git submodule update
cd ../../..
# 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
```
- The binaries are missing for some reason. You can download pre-built binaries from [Funkin's Lime](https://github.com/FunkinCrew/lime/tree/dev-funkin/ndll).
You should copy them to `.haxelib/lime/git/ndll/<PLATFORM>64/`, where `<PLATFORM>` is the current platform you're on, which can be either Windows, Linux or MacOS.

View file

@ -0,0 +1,66 @@
@echo off
set ZIP_FILE="./temp/_temp_jdk.zip"
set OUTPUT_DIR="./temp/"
set SIX_LINK="https://drive.usercontent.google.com/download?id=1GqFpIk_bkxFb0tNN3x9LxnN-Zh_oDUX5&export=download&authuser=0&confirm=t&uuid=43108c0a-bd53-4465-86f3-80aaceaa7a38&at=APZUnTVNS_BV9cNyC_iicDInosmz%3A1718921284514"
set EIGHT_LINK="https://drive.usercontent.google.com/download?id=1X8jjtYYos8aDfZKwehGS9B3zFQa-sCb-&export=download&authuser=0&confirm=t&uuid=07b24a6c-5352-4ba5-9fb8-cff151a6d91e&at=APZUnTUfw26NBAl0nCMn6HBKgHwK%3A1718922303598"
echo MAKING TEMP
mkdir %OUTPUT_DIR%
echo MADE TEMP
echo INSTALLING ANDROID BUILD TOOLS
call .\asclt\bin\sdkmanager "build-tools;32.0.0" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
call .\asclt\bin\sdkmanager "build-tools;32.1.0-rc1" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo INSTALLED ANDROID BUILD TOOLS
echo INSTALLING ANDROID SDK
REM First install the sdks
call .\asclt\bin\sdkmanager "platforms;android-29" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo ANDROID SDK INSTALLED
echo INSTALLING ANDROID NDK
REM then the ndks
call ./asclt/bin/sdkmanager "ndk;21.4.7075529" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo ANDROID NDK INSTALLED
echo DOWNLOADING JDK
call curl -o %ZIP_FILE% %SIX_LINK%
echo DOWNLOADED JDK
echo UNZIPPING JDK
call powershell -Command "Expand-Archive -Path '%ZIP_FILE%' -DestinationPath '%OUTPUT_DIR%' -Force"
echo UNZIPPED JDK
echo MAKING JDK PATH
mkdir "%LOCALAPPDATA%/Android/jdk"
echo MADE JDK PATH
echo MOVING JDK TO PROPER PATH
call move "%OUTPUT_DIR%/jdk-17.0.11+9" "%LOCALAPPDATA%/Android/jdk/"
echo MOVED JDK
echo LIME SETTING UP
haxelib run lime config ANDROID_SDK %LOCALAPPDATA%\Android\Sdk
haxelib run lime config ANDROID_NDK_ROOT %LOCALAPPDATA%\Android\Sdk\ndk\21.4.7075529
haxelib run lime config JAVA_HOME %LOCALAPPDATA%\Android\Sdk\jdk\jdk-17.0.11+9
haxelib run lime config ANDROID_SETUP true
echo DONE
pause

View file

@ -0,0 +1,66 @@
@echo off
set ZIP_FILE="./temp/_temp_jdk.zip"
set OUTPUT_DIR="./temp/"
set SIX_LINK="https://drive.usercontent.google.com/download?id=1GqFpIk_bkxFb0tNN3x9LxnN-Zh_oDUX5&export=download&authuser=0&confirm=t&uuid=43108c0a-bd53-4465-86f3-80aaceaa7a38&at=APZUnTVNS_BV9cNyC_iicDInosmz%3A1718921284514"
set EIGHT_LINK="https://drive.usercontent.google.com/download?id=1X8jjtYYos8aDfZKwehGS9B3zFQa-sCb-&export=download&authuser=0&confirm=t&uuid=07b24a6c-5352-4ba5-9fb8-cff151a6d91e&at=APZUnTUfw26NBAl0nCMn6HBKgHwK%3A1718922303598"
echo MAKING TEMP
mkdir %OUTPUT_DIR%
echo MADE TEMP
echo INSTALLING ANDROID BUILD TOOLS
call .\asclt\bin\sdkmanager "build-tools;32.0.0" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
call .\asclt\bin\sdkmanager "build-tools;32.1.0-rc1" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo INSTALLED ANDROID BUILD TOOLS
echo INSTALLING ANDROID SDK
REM First install the sdks
call .\asclt\bin\sdkmanager "platforms;android-29" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo ANDROID SDK INSTALLED
echo INSTALLING ANDROID NDK
REM then the ndks
call ./asclt/bin/sdkmanager "ndk;21.4.7075529" --sdk_root="%LOCALAPPDATA%/Android/Sdk/"
echo ANDROID NDK INSTALLED
echo DOWNLOADING JDK
call curl -o %ZIP_FILE% %EIGHT_LINK%
echo DOWNLOADED JDK
echo UNZIPPING JDK
call powershell -Command "Expand-Archive -Path '%ZIP_FILE%' -DestinationPath '%OUTPUT_DIR%' -Force"
echo UNZIPPED JDK
echo MAKING JDK PATH
mkdir "%LOCALAPPDATA%/Android/jdk"
echo MADE JDK PATH
echo MOVING JDK TO PROPER PATH
call move "%OUTPUT_DIR%/jdk-17.0.11+9" "%LOCALAPPDATA%/Android/jdk/"
echo MOVED JDK
echo LIME SETTING UP
haxelib run lime config ANDROID_SDK %LOCALAPPDATA%\Android\Sdk
haxelib run lime config ANDROID_NDK_ROOT %LOCALAPPDATA%\Android\Sdk\ndk\21.4.7075529
haxelib run lime config JAVA_HOME %LOCALAPPDATA%\Android\Sdk\jdk\jdk-17.0.11+9
haxelib run lime config ANDROID_SETUP true
echo DONE
pause

View file

@ -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.

View file

@ -6,7 +6,7 @@
"name": "EliteMasterEric"
}
],
"api_version": "0.5.0",
"api_version": "0.7.0",
"mod_version": "1.0.0",
"license": "Apache-2.0"
}

View file

@ -6,7 +6,7 @@
"name": "EliteMasterEric"
}
],
"api_version": "0.5.0",
"api_version": "0.7.0",
"mod_version": "1.0.0",
"license": "Apache-2.0"
}

View file

@ -4,36 +4,63 @@
"name": "FlxPartialSound",
"type": "git",
"dir": null,
"ref": "a1eab7b9bf507b87200a3341719054fe427f3b15",
"url": "https://github.com/FunkinCrew/FlxPartialSound.git"
"ref": "3c9f63e3501c20c0b60442089dc05306f5a87968",
"url": "https://github.com/FunkinDroidTeam/FlxPartialSound.git"
},
{
"name": "astc-compressor",
"type": "git",
"dir": null,
"ref": "9b0819150b67bf0d49145f250099b75d21be5839",
"url": "https://github.com/KarimAkra/astc-compressor"
},
{
"name": "extension-admob",
"type": "git",
"dir": null,
"ref": "02334589ff9603a5f483077a44395009644f6274",
"url": "https://github.com/FunkinCrew/extension-admob"
},
{
"name": "extension-androidtools",
"type": "haxelib",
"version": "2.2.2"
},
{
"name": "extension-haptics",
"type": "haxelib",
"version": "1.0.4"
},
{
"name": "extension-iapcore",
"type": "haxelib",
"version": "1.0.4"
},
{
"name": "extension-iarcore",
"type": "haxelib",
"version": "1.0.3"
},
{
"name": "flixel",
"type": "git",
"dir": null,
"ref": "ffa691cb2d2d81de35b900a4411e4062ac84ab58",
"ref": "ac2a34fe4b3400bc04218f46320a65af0f337fc0",
"url": "https://github.com/FunkinCrew/flixel"
},
{
"name": "flixel-addons",
"type": "git",
"dir": null,
"ref": "7424db4e9164ff46f224a7c47de1b732d2542dd7",
"ref": "b9118f47f43a66bc0e5fbfcfd9903f0425e918ee",
"url": "https://github.com/FunkinCrew/flixel-addons"
},
{
"name": "flixel-text-input",
"type": "git",
"dir": null,
"ref": "951a0103a17bfa55eed86703ce50b4fb0d7590bc",
"url": "https://github.com/FunkinCrew/flixel-text-input"
},
{
"name": "flxanimate",
"type": "git",
"dir": null,
"ref": "0654797e5eb7cd7de0c1b2dbaa1efe5a1e1d9412",
"url": "https://github.com/Dot-Stuff/flxanimate"
"ref": "49214278b9124823582cdcecd94f4a1de9a4b36b",
"url": "https://github.com/FunkinCrew/flxanimate"
},
{
"name": "format",
@ -44,15 +71,15 @@
"name": "funkin.vis",
"type": "git",
"dir": null,
"ref": "22b1ce089dd924f15cdc4632397ef3504d464e90",
"ref": "1966f8fbbbc509ed90d4b520f3c49c084fc92fd6",
"url": "https://github.com/FunkinCrew/funkVis"
},
{
"name": "grig.audio",
"type": "git",
"dir": "src",
"ref": "57f5d47f2533fd0c3dcd025a86cb86c0dfa0b6d2",
"url": "https://gitlab.com/haxe-grig/grig.audio.git"
"ref": "8567c4dad34cfeaf2ff23fe12c3796f5db80685e",
"url": "https://github.com/FunkinCrew/grig.audio"
},
{
"name": "hamcrest",
@ -63,36 +90,29 @@
"name": "haxeui-core",
"type": "git",
"dir": null,
"ref": "51c23588614397089a5ce182cddea729f0be6fa0",
"ref": "47ee9f5fa02d422e186e844f87e68220cabfcc5b",
"url": "https://github.com/haxeui/haxeui-core"
},
{
"name": "haxeui-flixel",
"type": "git",
"dir": null,
"ref": "da27e833947f32ef007ed11f523aa5524f5a5d54",
"ref": "100f2c96beab619cfe72c567a058c41c71e3e998",
"url": "https://github.com/haxeui/haxeui-flixel"
},
{
"name": "hscript",
"type": "git",
"dir": null,
"ref": "12785398e2f07082f05034cb580682e5671442a2",
"ref": "8c1d238b069ef97cec13f5121b29d2afe2b8985d",
"url": "https://github.com/FunkinCrew/hscript"
},
{
"name": "hxCodec",
"type": "git",
"dir": null,
"ref": "61b98a7a353b7f529a8fec84ed9afc919a2dffdd",
"url": "https://github.com/FunkinCrew/hxCodec"
},
{
"name": "hxcpp",
"type": "git",
"dir": null,
"ref": "c6bac3d6c7d683f25104296b2f4c50f8c90b8349",
"url": "https://github.com/cortex-engine/hxcpp"
"ref": "5a0dc3f644dc676a4a092b7e6c8edc8be941f024",
"url": "https://github.com/FunkinCrew/hxcpp"
},
{
"name": "hxcpp-debug-server",
@ -120,6 +140,11 @@
"type": "haxelib",
"version": "1.3.0"
},
{
"name": "hxvlc",
"type": "haxelib",
"version": "2.2.2"
},
{
"name": "json2object",
"type": "git",
@ -145,7 +170,7 @@
"name": "lime",
"type": "git",
"dir": null,
"ref": "fe3368f611a84a19afc03011353945ae4da8fffd",
"ref": "e5f8c27124598505917a001588b560244731adfb",
"url": "https://github.com/FunkinCrew/lime"
},
{
@ -176,25 +201,32 @@
"ref": "f61be7f7ba796595f45023ca65164a485aba0e7e",
"url": "https://github.com/FunkinCrew/MassiveUnit"
},
{
"name": "newgrounds",
"type": "git",
"dir": null,
"ref": "c8b30832027fa04f48fe6a45fa7903d5b265d56e",
"url": "https://github.com/Geokureli/Newgrounds/"
},
{
"name": "openfl",
"type": "git",
"dir": null,
"ref": "8306425c497766739510ab29e876059c96f77bd2",
"ref": "a0df7c3afe360c9af59a76e45007dbf4e53b5131",
"url": "https://github.com/FunkinCrew/openfl"
},
{
"name": "polymod",
"type": "git",
"dir": null,
"ref": "0fbdf27fe124549730accd540cec8a183f8652c0",
"ref": "db5dcf3ac4cb59197188a4442d75d4e76b350f40",
"url": "https://github.com/larsiusprime/polymod"
},
{
"name": "thx.core",
"type": "git",
"dir": null,
"ref": "76d87418fadd92eb8e1b61f004cff27d656e53dd",
"ref": "2bf2b992e06159510f595554e6b952e47922f128",
"url": "https://github.com/fponticelli/thx.core"
},
{

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,24 @@
package;
import flixel.FlxG;
import flixel.FlxGame;
import flixel.FlxState;
import funkin.ui.FullScreenScaleMode;
import funkin.Preferences;
import funkin.util.logging.CrashHandler;
import funkin.ui.debug.MemoryCounter;
import funkin.save.Save;
import haxe.ui.Toolkit;
#if hxvlc
import hxvlc.util.Handle;
#end
import openfl.display.FPS;
import openfl.display.Sprite;
import openfl.events.Event;
import openfl.Lib;
import openfl.media.Video;
import openfl.net.NetStream;
import funkin.util.WindowUtil;
/**
* The main class which initializes HaxeFlixel and starts the game in its initial state.
@ -30,6 +36,15 @@ class Main extends Sprite
public static function main():Void
{
// Set the current working directory for Android and iOS devices
#if android
// On Android use External Files Dir.
Sys.setCwd(haxe.io.Path.addTrailingSlash(extension.androidtools.content.Context.getExternalFilesDir()));
#elseif ios
// On iOS use Documents Dir.
Sys.setCwd(haxe.io.Path.addTrailingSlash(lime.system.System.documentsDirectory));
#end
// We need to make the crash handler LITERALLY FIRST so nothing EVER gets past it.
CrashHandler.initialize();
CrashHandler.queryStatus();
@ -61,12 +76,6 @@ class Main extends Sprite
function init(?event:Event):Void
{
#if web
// set this variable (which is a function) from the lime version at lime/_internal/backend/html5/HTML5Application.hx
// The framerate cap will more thoroughly initialize via Preferences in InitState.hx
funkin.Preferences.lockedFramerateFunction = untyped js.Syntax.code("window.requestAnimationFrame");
#end
if (hasEventListener(Event.ADDED_TO_STAGE))
{
removeEventListener(Event.ADDED_TO_STAGE, init);
@ -102,12 +111,32 @@ class Main extends Sprite
memoryCounter = new MemoryCounter(10, 13, 0xFFFFFF);
#end
#if mobile
// Add this signal so we can reposition and resize the memory and fps counter.
FlxG.signals.preUpdate.add(repositionCounters.bind(true));
#end
// George recommends binding the save before FlxGame is created.
Save.load();
#if hxvlc
// Initialize hxvlc's Handle here so the videos are loading faster.
Handle.init();
#end
// Don't call anything from the preferences until the save is loaded!
#if web
// set this variable (which is a function) from the lime version at lime/_internal/backend/html5/HTML5Application.hx
// The framerate cap will more thoroughly initialize via Preferences in InitState.hx
funkin.Preferences.lockedFramerateFunction = untyped js.Syntax.code("window.requestAnimationFrame");
#end
WindowUtil.setVSyncMode(funkin.Preferences.vsyncMode);
var game:FlxGame = new FlxGame(gameWidth, gameHeight, initialState, Preferences.framerate, Preferences.framerate, skipSplash, startFullscreen);
// FlxG.game._customSoundTray wants just the class, it calls new from
// create() in there, which gets called when it's added to stage
// create() in there, which gets called when it's added to the stage
// which is why it needs to be added before addChild(game) here
@:privateAccess
game._customSoundTray = funkin.ui.options.FunkinSoundTray;
@ -118,6 +147,15 @@ class Main extends Sprite
game.debugger.interaction.addTool(new funkin.util.TrackerToolButtonUtil());
#end
#if !html5
FlxG.scaleMode = new FullScreenScaleMode();
#end
#if mobile
// Reposition and resize the memory and fps counter without lerping.
repositionCounters(false);
#end
#if hxcpp_debug_server
trace('hxcpp_debug_server is enabled! You can now connect to the game with a debugger.');
#else
@ -139,4 +177,56 @@ class Main extends Sprite
funkin.input.Cursor.registerHaxeUICursors();
haxe.ui.tooltips.ToolTipManager.defaultDelay = 200;
}
#if mobile
function repositionCounters(lerp:Bool):Void
{
// Calling this so it gets scaled based on the resolution of the game and device's resolution.
var scale:Float = Math.min(FlxG.stage.stageWidth / FlxG.width, FlxG.stage.stageHeight / FlxG.height);
#if android
scale = Math.max(scale, 1);
#else
scale = Math.min(scale, 1);
#end
final thypos:Float = Math.max(FullScreenScaleMode.notchSize.x, 10);
if (fpsCounter != null)
{
fpsCounter.scaleX = fpsCounter.scaleY = scale;
if (FlxG.game != null)
{
if (lerp)
{
fpsCounter.x = flixel.math.FlxMath.lerp(fpsCounter.x, FlxG.game.x + thypos, FlxG.elapsed * 3);
}
else
{
fpsCounter.x = FlxG.game.x + FullScreenScaleMode.notchSize.x + 10;
}
fpsCounter.y = FlxG.game.y + (3 * scale);
}
}
if (memoryCounter != null)
{
memoryCounter.scaleX = memoryCounter.scaleY = scale;
if (FlxG.game != null)
{
if (lerp)
{
memoryCounter.x = flixel.math.FlxMath.lerp(memoryCounter.x, FlxG.game.x + thypos, FlxG.elapsed * 3);
}
else
{
memoryCounter.x = FlxG.game.x + FullScreenScaleMode.notchSize.x + 10;
}
memoryCounter.y = FlxG.game.y + (13 * scale);
}
}
}
#end
}

View file

@ -29,7 +29,7 @@ class Postbuild
var buildTime:Float = roundToTwoDecimals(end - start);
trace('Build took: ${buildTime} seconds');
Sys.println('[INFO] Build took: ${buildTime} seconds');
}
}

View file

@ -11,12 +11,19 @@ class Prebuild
static function main():Void
{
var start:Float = Sys.time();
// Sys.println('[INFO] Performing pre-build tasks...');
saveBuildTime();
trace('Building...');
var end:Float = Sys.time();
var duration:Float = end - start;
// Sys.println('[INFO] Finished pre-build tasks in $duration seconds.');
}
static function saveBuildTime():Void
{
// PostBuild.hx reads this file and computes the total build duration.
var fo:sys.io.FileOutput = File.write(BUILD_TIME_FILE);
var now:Float = Sys.time();
fo.writeDouble(now);

View file

@ -24,6 +24,27 @@ extern class Native_TracyProfiler
@:native('::__hxcpp_tracy_framemark')
public static function frameMark():Void;
/**
Mark a named frame. Allows creating multiple frame sets for different timing categories.
Each unique name creates a separate frame set in the Tracy timeline.
**/
@:native('::__hxcpp_tracy_framemark_named')
public static function frameMarkNamed(_name:String):Void;
/**
Mark the start of a discontinuous frame. Use for periodic work with gaps.
Must be paired with frameMarkEnd() using the same name.
**/
@:native('::__hxcpp_tracy_framemark_start')
public static function frameMarkStart(_name:String):Void;
/**
Mark the end of a discontinuous frame. Use for periodic work with gaps.
Must be paired with frameMarkStart() using the same name.
**/
@:native('::__hxcpp_tracy_framemark_end')
public static function frameMarkEnd(_name:String):Void;
/**
Print a message into Tracy's log.
**/
@ -71,6 +92,18 @@ class Cppia_TracyProfiler
public static function frameMark()
Native_TracyProfiler.frameMark();
@:inheritDoc(cpp.vm.tracy.Native_TracyProfiler.frameMarkNamed)
public static function frameMarkNamed(_name:String)
Native_TracyProfiler.frameMarkNamed(_name);
@:inheritDoc(cpp.vm.tracy.Native_TracyProfiler.frameMarkStart)
public static function frameMarkStart(_name:String)
Native_TracyProfiler.frameMarkStart(_name);
@:inheritDoc(cpp.vm.tracy.Native_TracyProfiler.frameMarkEnd)
public static function frameMarkEnd(_name:String)
Native_TracyProfiler.frameMarkEnd(_name);
@:inheritDoc(cpp.vm.tracy.Native_TracyProfiler.message)
public static function message(_msg:String, ?_color:Int = 0x000000)
Native_TracyProfiler.message(_msg, _color);

View file

@ -6,8 +6,14 @@ 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
{
/**
* The assets cache.
*/
public static var cache:openfl.utils.IAssetCache = openfl.utils.Assets.cache;
/**
* Get the file system path for an asset
* @param path The asset path to load from, relative to the assets folder
@ -144,16 +150,31 @@ class Assets
return openfl.utils.Assets.list(type);
}
/**
* Checks if a library with the given name exists.
* @param name The name to check.
* @return Whether or not the library exists.
*/
public static function hasLibrary(name:String):Bool
{
return openfl.utils.Assets.hasLibrary(name);
}
/**
* Retrieves a library with the given name.
* @param name The name of the library to get.
* @return The library with the given name.
*/
public static function getLibrary(name:String):lime.utils.AssetLibrary
{
return openfl.utils.Assets.getLibrary(name);
}
/**
* Loads a library with the given name.
* @param name The name of the library to load.
* @return An `AssetLibary` object.
*/
public static function loadLibrary(name:String):Future<openfl.utils.AssetLibrary>
{
return openfl.utils.Assets.loadLibrary(name);

View file

@ -6,6 +6,7 @@ import flixel.math.FlxMath;
import funkin.data.song.SongData.SongTimeChange;
import funkin.data.song.SongDataUtils;
import funkin.save.Save;
import funkin.util.TimerUtil.SongSequence;
import haxe.Timer;
import flixel.sound.FlxSound;
@ -92,6 +93,12 @@ class Conductor
*/
public var songPosition(default, null):Float = 0;
/**
* The offset between frame time and music time.
* Used in `getTimeWithDelta()` to get a more accurate music time when on higher framerates.
*/
var songPositionDelta(default, null):Float = 0;
var prevTimestamp:Float = 0;
var prevTime:Float = 0;
@ -242,25 +249,18 @@ class Conductor
* No matter if you're using a local conductor or not, this always loads
* to/from the save file
*/
public var inputOffset(get, set):Int;
public var globalOffset(get, never):Int;
/**
* An offset set by the user to compensate for audio/visual lag
* No matter if you're using a local conductor or not, this always loads
* to/from the save file
*/
public var audioVisualOffset(get, set):Int;
public var audioVisualOffset(get, never):Int;
function get_inputOffset():Int
function get_globalOffset():Int
{
return Save?.instance?.options?.inputOffset ?? 0;
}
function set_inputOffset(value:Int):Int
{
Save.instance.options.inputOffset = value;
Save.instance.flush();
return Save.instance.options.inputOffset;
return Preferences.globalOffset;
}
function get_audioVisualOffset():Int
@ -268,18 +268,11 @@ class Conductor
return Save?.instance?.options?.audioVisualOffset ?? 0;
}
function set_audioVisualOffset(value:Int):Int
{
Save.instance.options.audioVisualOffset = value;
Save.instance.flush();
return Save.instance.options.audioVisualOffset;
}
public var combinedOffset(get, never):Float;
function get_combinedOffset():Float
{
return instrumentalOffset + audioVisualOffset + inputOffset;
return instrumentalOffset + formatOffset + globalOffset;
}
/**
@ -401,8 +394,10 @@ class Conductor
* @param songPosition The current position in the song in milliseconds.
* Leave blank to use the FlxG.sound.music position.
* @param applyOffsets If it should apply the instrumentalOffset + formatOffset + audioVisualOffset
* @param forceDispatch If it should force the dispatch of onStepHit, onBeatHit, and onMeasureHit
* even if the current step, beat, or measure hasn't changed.
*/
public function update(?songPos:Float, applyOffsets:Bool = true, forceDispatch:Bool = false)
public function update(?songPos:Float, applyOffsets:Bool = true, forceDispatch:Bool = false):Void
{
var currentTime:Float = (FlxG.sound.music != null) ? FlxG.sound.music.time : 0.0;
var currentLength:Float = (FlxG.sound.music != null) ? FlxG.sound.music.length : 0.0;
@ -422,7 +417,8 @@ class Conductor
// If the song is playing, limit the song position to the length of the song or beginning of the song.
if (FlxG.sound.music != null && FlxG.sound.music.playing)
{
this.songPosition = Math.min(currentLength, Math.max(0, songPos));
this.songPosition = Math.min(this.combinedOffset, 0).clamp(songPos, currentLength);
this.songPositionDelta += FlxG.elapsed * 1000 * FlxG.sound.music.pitch;
}
else
{
@ -488,10 +484,23 @@ class Conductor
// which it doesn't do every frame!
if (prevTime != this.songPosition)
{
this.songPositionDelta = 0;
// Update the timestamp for use in-between frames
prevTime = this.songPosition;
prevTimestamp = Std.int(Timer.stamp() * 1000);
}
if (this == Conductor.instance) @:privateAccess SongSequence.update.dispatch();
}
/**
* Returns a more accurate music time for higher framerates.
* @return Float
*/
public function getTimeWithDelta():Float
{
return this.songPosition + this.songPositionDelta;
}
/**

View file

@ -0,0 +1,453 @@
package funkin;
import flixel.graphics.FlxGraphic;
import flixel.FlxG;
import funkin.play.notes.notestyle.NoteStyle;
import openfl.utils.AssetType;
import openfl.Assets;
import openfl.system.System;
import openfl.media.Sound;
import lime.app.Future;
import lime.app.Promise;
/**
* Handles caching of textures and sounds for the game.
* TODO: Remove this once Eric finishes the memory system.
*/
@:nullSafety
class FunkinMemory
{
static var permanentCachedTextures:Map<String, FlxGraphic> = [];
static var currentCachedTextures:Map<String, FlxGraphic> = [];
static var previousCachedTextures:Map<String, FlxGraphic> = [];
// waow
static var permanentCachedSounds:Map<String, Sound> = [];
static var currentCachedSounds:Map<String, Sound> = [];
static var previousCachedSounds:Map<String, Sound> = [];
static var purgeFilter:Array<String> = ["/week", "/characters", "/charSelect", "/results"];
/**
* Caches textures that are always required.
*/
public static inline function initialCache():Void
{
var allImages:Array<String> = Assets.list();
for (file in allImages)
{
if (!(file.endsWith(".png") #if FEATURE_COMPRESSED_TEXTURES || file.endsWith(".astc") #end)
|| file.contains("chart-editor")
|| !file.contains("ui/"))
{
continue;
}
file = file.replace(" ", ""); // Handle stray spaces.
if (file.contains("shared") || Assets.exists('shared:$file', AssetType.IMAGE))
{
file = 'shared:$file';
}
permanentCacheTexture(file);
}
permanentCacheTexture(Paths.image("healthBar"));
permanentCacheTexture(Paths.image("menuDesat"));
permanentCacheTexture(Paths.image("notes", "shared"));
permanentCacheTexture(Paths.image("noteSplashes", "shared"));
permanentCacheTexture(Paths.image("noteStrumline", "shared"));
permanentCacheTexture(Paths.image("NOTE_hold_assets"));
// dude
permanentCacheTexture(Paths.image("fonts/bold", null));
permanentCacheTexture(Paths.image("fonts/default", null));
permanentCacheTexture(Paths.image("fonts/freeplay-clear", null));
var allSounds:Array<String> = Assets.list(AssetType.SOUND);
for (file in allSounds)
{
if (!file.endsWith(".ogg") || !file.contains("countdown/")) continue;
file = file.replace(" ", "");
if (file.contains("shared") || Assets.exists('shared:$file', AssetType.SOUND))
{
file = 'shared:$file';
}
permanentCacheSound(file);
}
permanentCacheSound(Paths.sound("cancelMenu"));
permanentCacheSound(Paths.sound("confirmMenu"));
permanentCacheSound(Paths.sound("screenshot"));
permanentCacheSound(Paths.sound("scrollMenu"));
permanentCacheSound(Paths.sound("soundtray/Voldown"));
permanentCacheSound(Paths.sound("soundtray/VolMAX"));
permanentCacheSound(Paths.sound("soundtray/Volup"));
permanentCacheSound(Paths.music("freakyMenu/freakyMenu"));
permanentCacheSound(Paths.music("offsetsLoop/offsetsLoop"));
permanentCacheSound(Paths.music("offsetsLoop/drumsLoop"));
permanentCacheSound(Paths.sound("missnote1", "shared"));
permanentCacheSound(Paths.sound("missnote2", "shared"));
permanentCacheSound(Paths.sound("missnote3", "shared"));
}
/**
* Clears the current texture and sound caches.
*/
public static inline function purgeCache(callGarbageCollector:Bool = false):Void
{
preparePurgeTextureCache();
purgeTextureCache();
preparePurgeSoundCache();
purgeSoundCache();
#if (cpp || neko || hl)
if (callGarbageCollector) funkin.util.MemoryUtil.collect(true);
#end
}
///// TEXTURES /////
/**
* Ensures a texture with the given key is cached.
* @param key The key of the texture to cache.
*/
public static function cacheTexture(key:String):Void
{
if (currentCachedTextures.exists(key)) return;
if (previousCachedTextures.exists(key))
{
// Move the texture from the previous cache to the current cache.
var graphic:Null<FlxGraphic> = previousCachedTextures.get(key);
previousCachedTextures.remove(key);
if (graphic != null) currentCachedTextures.set(key, graphic);
return;
}
var graphic:Null<FlxGraphic> = FlxGraphic.fromAssetKey(key, false, null, true);
if (graphic == null)
{
FlxG.log.warn('Failed to cache graphic: $key');
return;
}
trace('Successfully cached graphic: $key');
graphic.persist = true;
currentCachedTextures.set(key, graphic);
forceRender(graphic);
}
/**
* Permanently caches a texture with the given key.
* @param key The key of the texture to cache.
*/
static function permanentCacheTexture(key:String):Void
{
if (permanentCachedTextures.exists(key)) return;
var graphic:Null<FlxGraphic> = FlxGraphic.fromAssetKey(key, false, null, true);
if (graphic == null)
{
FlxG.log.warn('Failed to cache graphic: $key');
return;
}
trace('Successfully cached graphic: $key');
graphic.persist = true;
permanentCachedTextures.set(key, graphic);
forceRender(graphic);
currentCachedTextures = permanentCachedTextures;
}
/**
* Forces the GPU to load and upload a FlxGraphic.
*/
private static function forceRender(graphic:FlxGraphic):Void
{
if (graphic == null) return;
var bmp:Null<FlxGraphic> = FlxG.bitmap.get(graphic.key);
if (bmp != null && bmp.bitmap != null) var _:Int = bmp.bitmap.width; // Trigger
// Draws sprite and actually caches it.
var sprite = new flixel.FlxSprite();
sprite.loadGraphic(graphic);
sprite.draw(); // Draw sprite and load it into game's memory.
sprite.destroy();
}
/**
* Checks, if graphic with given path cached in memory.
*/
public static inline function isGraphicCached(path:String):Bool
return permanentCachedTextures.exists(path) || currentCachedTextures.exists(path) || previousCachedTextures.exists(path);
public static function getCachedGraphic(path:String):Null<FlxGraphic>
{
if (permanentCachedTextures.exists(path)) return permanentCachedTextures.get(path);
if (currentCachedTextures.exists(path)) return currentCachedTextures.get(path);
if (previousCachedTextures.exists(path)) return previousCachedTextures.get(path); // just in case
return null;
}
/**
* Prepares the cache for purging unused textures.
*/
public inline static function preparePurgeTextureCache():Void
{
previousCachedTextures = currentCachedTextures;
for (graphicKey in previousCachedTextures.keys())
{
if (permanentCachedTextures.exists(graphicKey))
{
previousCachedTextures.remove(graphicKey);
}
}
currentCachedTextures = permanentCachedTextures;
}
/**
* Purges unused textures from the cache.
*/
public static function purgeTextureCache():Void
{
for (graphicKey in previousCachedTextures.keys())
{
if (permanentCachedTextures.exists(graphicKey))
{
previousCachedTextures.remove(graphicKey);
continue;
}
if (graphicKey.contains("fonts")) continue;
var graphic:Null<FlxGraphic> = previousCachedTextures.get(graphicKey);
if (graphic != null)
{
FlxG.bitmap.remove(graphic);
graphic.destroy();
previousCachedTextures.remove(graphicKey);
Assets.cache.clear(graphicKey);
}
}
@:privateAccess
if (FlxG.bitmap._cache == null)
{
@:privateAccess
FlxG.bitmap._cache = new Map();
}
@:privateAccess
for (key in FlxG.bitmap._cache.keys())
{
var obj:Null<FlxGraphic> = FlxG.bitmap.get(key);
if (obj == null || obj.persist || permanentCachedTextures.exists(key) || key.contains("fonts"))
{
continue;
}
if (obj.useCount > 0)
{
for (purgeEntry in purgeFilter)
{
if (key.contains(purgeEntry))
{
FlxG.bitmap.removeKey(key);
obj.destroy();
}
}
}
}
}
///// NOTE STYLE //////
public static function cacheNoteStyle(style:NoteStyle):Void
{
// TODO: Texture paths should fall back to the default values.
cacheTexture(Paths.image(style.getNoteAssetPath() ?? "note"));
cacheTexture(style.getHoldNoteAssetPath() ?? "noteHold");
cacheTexture(Paths.image(style.getStrumlineAssetPath() ?? "strumline"));
cacheTexture(Paths.image(style.getSplashAssetPath() ?? "noteSplash"));
cacheTexture(Paths.image(style.getHoldCoverDirectionAssetPath(LEFT) ?? "LEFT"));
cacheTexture(Paths.image(style.getHoldCoverDirectionAssetPath(RIGHT) ?? "RIGHT"));
cacheTexture(Paths.image(style.getHoldCoverDirectionAssetPath(UP) ?? "UP"));
cacheTexture(Paths.image(style.getHoldCoverDirectionAssetPath(DOWN) ?? "DOWN"));
// cacheTexture(Paths.image(style.buildCountdownSpritePath(THREE) ?? "THREE"));
cacheTexture(Paths.image(style.buildCountdownSpritePath(TWO) ?? "TWO"));
cacheTexture(Paths.image(style.buildCountdownSpritePath(ONE) ?? "ONE"));
cacheTexture(Paths.image(style.buildCountdownSpritePath(GO) ?? "GO"));
cacheSound(style.getCountdownSoundPath(THREE) ?? "THREE");
cacheSound(style.getCountdownSoundPath(TWO) ?? "TWO");
cacheSound(style.getCountdownSoundPath(ONE) ?? "ONE");
cacheSound(style.getCountdownSoundPath(GO) ?? "GO");
cacheTexture(Paths.image(style.buildJudgementSpritePath("sick") ?? 'sick'));
cacheTexture(Paths.image(style.buildJudgementSpritePath("good") ?? 'good'));
cacheTexture(Paths.image(style.buildJudgementSpritePath("bad") ?? 'bad'));
cacheTexture(Paths.image(style.buildJudgementSpritePath("shit") ?? 'shit'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(0) ?? '0'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(1) ?? '1'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(2) ?? '2'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(3) ?? '3'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(4) ?? '4'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(5) ?? '5'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(6) ?? '6'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(7) ?? '7'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(8) ?? '8'));
cacheTexture(Paths.image(style.buildComboNumSpritePath(9) ?? '9'));
}
///// SOUND //////
public static function cacheSound(key:String):Void
{
if (currentCachedSounds.exists(key)) return;
if (previousCachedSounds.exists(key))
{
// Move the texture from the previous cache to the current cache.
var sound:Null<Sound> = previousCachedSounds.get(key);
previousCachedSounds.remove(key);
if (sound != null) currentCachedSounds.set(key, sound);
return;
}
var sound:Null<Sound> = Assets.getSound(key, true);
if (sound == null) return;
else
currentCachedSounds.set(key, sound);
}
public static function permanentCacheSound(key:String):Void
{
if (permanentCachedSounds.exists(key)) return;
var sound:Null<Sound> = Assets.getSound(key, true);
if (sound == null) return;
else
permanentCachedSounds.set(key, sound);
if (sound != null) currentCachedSounds.set(key, sound);
}
public static function preparePurgeSoundCache():Void
{
previousCachedSounds = currentCachedSounds;
for (key in previousCachedSounds.keys())
{
if (permanentCachedSounds.exists(key))
{
previousCachedSounds.remove(key);
}
}
currentCachedSounds = permanentCachedSounds;
}
/**
* Purges unused sounds from the cache.
*/
public static inline function purgeSoundCache():Void
{
for (key in previousCachedSounds.keys())
{
if (permanentCachedSounds.exists(key))
{
previousCachedSounds.remove(key);
continue;
}
var sound:Null<Sound> = previousCachedSounds.get(key);
if (sound != null)
{
Assets.cache.removeSound(key);
previousCachedSounds.remove(key);
}
}
Assets.cache.clear("songs");
Assets.cache.clear("music");
// Felt lazy.
var key = Paths.music("freakyMenu/freakyMenu");
var sound:Null<Sound> = Assets.getSound(key, true);
if (sound != null)
{
permanentCachedSounds.set(key, sound);
currentCachedSounds.set(key, sound);
}
}
///// MISC /////
public static inline function clearFreeplay():Void
{
var keysToRemove:Array<String> = [];
@:privateAccess
for (key in FlxG.bitmap._cache.keys())
{
if (!key.contains("freeplay")) continue;
if (permanentCachedTextures.exists(key) || key.contains("fonts")) continue;
keysToRemove.push(key);
}
@:privateAccess
for (key in keysToRemove)
{
trace('Cleaning up $key');
var obj:Null<FlxGraphic> = FlxG.bitmap.get(key);
if (obj != null)
{
obj.destroy();
}
FlxG.bitmap.removeKey(key);
if (currentCachedTextures.exists(key)) currentCachedTextures.remove(key);
Assets.cache.clear(key);
}
preparePurgeSoundCache();
purgeSoundCache();
}
public static inline function clearStickers():Void
{
var keysToRemove:Array<String> = [];
@:privateAccess
for (key in FlxG.bitmap._cache.keys())
{
if (!key.contains("stickers")) continue;
if (permanentCachedTextures.exists(key) || key.contains("fonts")) continue;
keysToRemove.push(key);
}
@:privateAccess
for (key in keysToRemove)
{
trace('Cleaning up $key');
var obj:Null<FlxGraphic> = FlxG.bitmap.get(key);
if (obj != null)
{
obj.destroy();
}
FlxG.bitmap.removeKey(key);
if (currentCachedTextures.exists(key)) currentCachedTextures.remove(key);
Assets.cache.clear(key);
}
}
}

View file

@ -3,6 +3,7 @@ package funkin;
/**
* A core class which handles tracking score and combo for the current song.
*/
@:nullSafety
class Highscore
{
/**

View file

@ -10,6 +10,7 @@ import flixel.math.FlxPoint;
import flixel.math.FlxRect;
import flixel.system.debug.log.LogStyle;
import flixel.util.FlxColor;
import funkin.graphics.FunkinSprite;
import funkin.data.dialogue.conversation.ConversationRegistry;
import funkin.data.dialogue.dialoguebox.DialogueBoxRegistry;
import funkin.data.dialogue.speaker.SpeakerRegistry;
@ -18,6 +19,7 @@ import funkin.data.freeplay.player.PlayerRegistry;
import funkin.data.freeplay.style.FreeplayStyleRegistry;
import funkin.data.notestyle.NoteStyleRegistry;
import funkin.data.song.SongRegistry;
import funkin.data.stickers.StickerRegistry;
import funkin.data.event.SongEventRegistry;
import funkin.data.stage.StageRegistry;
import funkin.data.story.level.LevelRegistry;
@ -26,18 +28,21 @@ import funkin.play.character.CharacterData.CharacterDataParser;
import funkin.play.notes.notekind.NoteKindManager;
import funkin.play.PlayStatePlaylist;
import funkin.ui.debug.charting.ChartEditorState;
import funkin.ui.debug.stageeditor.StageEditorState;
import funkin.ui.title.TitleState;
import funkin.ui.transition.LoadingState;
import funkin.util.CLIUtil;
import funkin.util.CLIUtil.CLIParams;
import funkin.util.macro.MacroUtil;
import funkin.util.TimerUtil;
import funkin.util.TrackerUtil;
import funkin.util.WindowUtil;
import openfl.display.BitmapData;
#if FEATURE_DISCORD_RPC
import funkin.api.discord.DiscordClient;
#end
#if FEATURE_NEWGROUNDS
import funkin.api.newgrounds.NewgroundsClient;
#end
/**
* A core class which performs initialization of the game.
@ -47,6 +52,7 @@ import funkin.api.discord.DiscordClient;
*
* It should not contain any sprites or rendering.
*/
@:nullSafety
class InitState extends FlxState
{
/**
@ -76,11 +82,37 @@ class InitState extends FlxState
// GAME SETUP
//
// Setup window events (like callbacks for onWindowClose)
// and fullscreen keybind setup
// Setup window events (like callbacks for onWindowClose) and fullscreen keybind setup
WindowUtil.initWindowEvents();
// Disable the thing on Windows where it tries to send a bug report to Microsoft because why do they care?
WindowUtil.disableCrashHandler();
#if FEATURE_DEBUG_TRACY
funkin.util.WindowUtil.initTracy();
#end
#if FEATURE_HAPTICS
// Setup Haptic feedback
extension.haptics.Haptic.initialize();
#end
#if FEATURE_MOBILE_ADVERTISEMENTS
// Setup Admob
funkin.mobile.util.AdMobUtil.init();
#end
#if FEATURE_MOBILE_IAP
// Setup In-App purchases
funkin.mobile.util.InAppPurchasesUtil.init();
#end
#if FEATURE_MOBILE_IAR
// Setup In-App purchases
funkin.mobile.util.InAppReviewUtil.init();
#end
#if ios
// Setup Audio session
funkin.external.ios.AudioSession.initialize();
#end
// This ain't a pixel art game! (most of the time)
FlxSprite.defaultAntialiasing = true;
@ -90,9 +122,20 @@ class InitState extends FlxState
FlxG.sound.volumeDownKeys = [];
FlxG.sound.muteKeys = [];
// A small jumpstart to the soundtray, it usually sets itself to inactive (somewhere...)
// but that makes our soundtray not show up on init if we have the game muted.
// We set it to active so it at least calls it's update function once (see FlxGame.onEnterFrame(), it's called there)
// and also see FunkinSoundTray.update() to see what we do and how we check if we are muted or not
#if !mobile
FlxG.game.soundTray.active = true;
#end
// 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();
//
@ -114,11 +157,30 @@ class InitState extends FlxState
// Don't play transition in when entering the title state.
FlxTransitionableState.skipNextTransIn = true;
FlxG.signals.gameResized.add(function(width:Int, height:Int) {
FlxTransitionableState.defaultTransIn = new TransitionData(FADE, FlxColor.BLACK, 1, new FlxPoint(0, -1), tileData,
new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
FlxTransitionableState.defaultTransOut = new TransitionData(FADE, FlxColor.BLACK, 0.7, new FlxPoint(0, 1), tileData,
new FlxRect(-200, -200, FlxG.width * 1.4, FlxG.height * 1.4));
});
// SDL for some reason enables VSync on focus lost/gained in Android
// Since we don't really need VSync on Android we're gonna forcefully disable it on these signals for now
// This is fixed on SDL3 from what I've heared but that doodoo isn't working poperly for Android
#if android
FlxG.signals.focusLost.add(function() {
WindowUtil.setVSyncMode(lime.ui.WindowVSyncMode.OFF);
});
FlxG.signals.focusGained.add(function() {
WindowUtil.setVSyncMode(lime.ui.WindowVSyncMode.OFF);
});
#end
//
// NEWGROUNDS API SETUP
//
#if newgrounds
NGio.init();
#if FEATURE_NEWGROUNDS
NewgroundsClient.instance.init();
#end
//
@ -137,6 +199,7 @@ class InitState extends FlxState
//
#if android
FlxG.android.preventDefaultKeys = [flixel.input.android.FlxAndroidKey.BACK];
funkin.external.android.CallbackUtil.init();
#end
//
@ -151,11 +214,20 @@ class InitState extends FlxState
#if FEATURE_SCREENSHOTS
funkin.util.plugins.ScreenshotPlugin.initialize();
#end
#if FEATURE_NEWGROUNDS
funkin.util.plugins.NewgroundsMedalPlugin.initialize();
#end
funkin.util.plugins.EvacuateDebugPlugin.initialize();
funkin.util.plugins.ForceCrashPlugin.initialize();
funkin.util.plugins.ReloadAssetsDebugPlugin.initialize();
#if !mobile
funkin.util.plugins.VolumePlugin.initialize();
#end
funkin.util.plugins.WatchPlugin.initialize();
#if mobile
funkin.util.plugins.TouchPointerPlugin.initialize();
funkin.mobile.input.ControlsHandler.initInputTrackers();
#end
//
// GAME DATA PARSING
@ -164,7 +236,6 @@ class InitState extends FlxState
// NOTE: Registries must be imported and not referenced with fully qualified names,
// to ensure build macros work properly.
trace('Parsing game data...');
var perfStart:Float = TimerUtil.start();
SongEventRegistry.loadEventCache(); // SongEventRegistry is structured differently so it's not a BaseRegistry.
SongRegistry.instance.loadEntries();
LevelRegistry.instance.loadEntries();
@ -176,6 +247,7 @@ class InitState extends FlxState
FreeplayStyleRegistry.instance.loadEntries();
AlbumRegistry.instance.loadEntries();
StageRegistry.instance.loadEntries();
StickerRegistry.instance.loadEntries();
// TODO: CharacterDataParser doesn't use json2object, so it's way slower than the other parsers and more prone to syntax errors.
// Move it to use a BaseRegistry.
@ -187,7 +259,12 @@ class InitState extends FlxState
ModuleHandler.loadModuleCache();
ModuleHandler.callOnCreate();
trace('Parsing game data took: ${TimerUtil.ms(perfStart)}');
funkin.input.Cursor.hide();
#if !html5
// This fucking breaks on HTML5 builds because the "shared" library isn't loaded yet.
funkin.FunkinMemory.initialCache();
#end
}
/**
@ -220,6 +297,9 @@ class InitState extends FlxState
#elseif CHARTING
// -DCHARTING
FlxG.switchState(() -> new funkin.ui.debug.charting.ChartEditorState());
#elseif STAGING
// -DSTAGING
FlxG.switchState(() -> new funkin.ui.debug.stageeditor.StageEditorState());
#elseif STAGEBUILD
// -DSTAGEBUILD
FlxG.switchState(() -> new funkin.ui.debug.stage.StageBuilderState());
@ -230,8 +310,8 @@ class InitState extends FlxState
storyMode: true,
title: "Cum Song Erect by Kawai Sprite",
songId: "cum",
characterId: "pico-playable",
difficultyId: "nightmare",
characterId: "pico",
difficultyId: "hard",
isNewHighscore: true,
scoreData:
{
@ -246,9 +326,10 @@ class InitState extends FlxState
combo: 69,
maxCombo: 69,
totalNotesHit: 140,
totalNotes: 190
totalNotes: 240
}
// 2400 total notes = 7% = LOSS
// 275 total notes = 69% = NICE
// 240 total notes = 79% = GOOD
// 230 total notes = 82% = GREAT
// 210 total notes = 91% = EXCELLENT
@ -281,9 +362,16 @@ class InitState extends FlxState
fnfcTargetPath: params.chart.chartPath,
}));
}
else if (params.stage.shouldLoadStage)
{
FlxG.switchState(() -> new StageEditorState(
{
fnfsTargetPath: params.stage.stagePath,
}));
}
else
{
FlxG.sound.cache(Paths.music('freakyMenu/freakyMenu'));
// FlxG.sound.cache(Paths.music('freakyMenu/freakyMenu'));
FlxG.switchState(() -> new TitleState());
}
}
@ -295,7 +383,7 @@ class InitState extends FlxState
*/
function startSong(songId:String, difficultyId:String = 'normal'):Void
{
var songData:funkin.play.song.Song = funkin.data.song.SongRegistry.instance.fetchEntry(songId);
var songData:Null<funkin.play.song.Song> = funkin.data.song.SongRegistry.instance.fetchEntry(songId);
if (songData == null)
{
@ -332,6 +420,7 @@ class InitState extends FlxState
PlayStatePlaylist.campaignId = 'weekend1';
}
@:nullSafety(Off) // Cannot unify?
LoadingState.loadPlayState(
{
targetSong: songData,
@ -346,7 +435,7 @@ class InitState extends FlxState
*/
function startLevel(levelId:String, difficultyId:String = 'normal'):Void
{
var currentLevel:funkin.ui.story.Level = funkin.data.story.level.LevelRegistry.instance.fetchEntry(levelId);
var currentLevel:Null<funkin.ui.story.Level> = funkin.data.story.level.LevelRegistry.instance.fetchEntry(levelId);
if (currentLevel == null)
{
@ -362,10 +451,19 @@ class InitState extends FlxState
PlayStatePlaylist.isStoryMode = true;
PlayStatePlaylist.campaignScore = 0;
var targetSongId:String = PlayStatePlaylist.playlistSongIds.shift();
var targetSongId:Null<String> = PlayStatePlaylist.playlistSongIds.shift();
var targetSong:funkin.play.song.Song = SongRegistry.instance.fetchEntry(targetSongId);
var targetSong:Null<funkin.play.song.Song> = null;
if (targetSongId != null) targetSong = SongRegistry.instance.fetchEntry(targetSongId);
if (targetSongId == null)
{
startGameNormally();
return;
}
@:nullSafety(Off)
LoadingState.loadPlayState(
{
targetSong: targetSong,
@ -373,6 +471,7 @@ class InitState extends FlxState
});
}
@:nullSafety(Off) // Meh, remove when flixel.system.debug.log.LogStyle is null safe
function setupFlixelDebug():Void
{
//
@ -452,17 +551,17 @@ class InitState extends FlxState
#end
}
function defineSong():String
function defineSong():Null<String>
{
return MacroUtil.getDefine('SONG');
}
function defineLevel():String
function defineLevel():Null<String>
{
return MacroUtil.getDefine('LEVEL');
}
function defineDifficulty():String
function defineDifficulty():Null<String>
{
return MacroUtil.getDefine('DIFFICULTY');
}

View file

@ -6,6 +6,7 @@ import openfl.utils.AssetType;
/**
* A core class which handles determining asset paths.
*/
@:nullSafety
class Paths
{
static var currentLevel:Null<String> = null;
@ -136,7 +137,7 @@ class Paths
* @param withExtension if it should return with the audio file extension `.mp3` or `.ogg`.
* @return String
*/
public static function inst(song:String, ?suffix:String = '', ?withExtension:Bool = true):String
public static function inst(song:String, ?suffix:String = '', withExtension:Bool = true):String
{
var ext:String = withExtension ? '.${Constants.EXT_SOUND}' : '';
return 'songs:assets/songs/${song.toLowerCase()}/Inst$suffix$ext';

View file

@ -2,21 +2,24 @@ package funkin;
import funkin.save.Save;
import funkin.input.Controls;
import flixel.FlxCamera;
import funkin.input.PreciseInputManager;
import flixel.input.actions.FlxActionInput;
import flixel.input.gamepad.FlxGamepad;
import flixel.util.FlxSignal;
import flixel.util.FlxSignal.FlxTypedSignal;
/**
* A core class which represents the current player(s) and their controls and other configuration.
*/
@:nullSafety
class PlayerSettings
{
// TODO: Finish implementation of second player.
public static var numPlayers(default, null) = 0;
public static var numAvatars(default, null) = 0;
// TODO: Making both of these null makes a lot of errors with the controls.
// That'd explain why unplugging input devices can cause the game to crash?
@:nullSafety(Off)
public static var player1(default, null):PlayerSettings;
@:nullSafety(Off)
public static var player2(default, null):PlayerSettings;
public static var onAvatarAdd(default, null) = new FlxTypedSignal<PlayerSettings->Void>();
@ -72,6 +75,7 @@ class PlayerSettings
/**
* Forcibly destroy the PlayerSettings singletons for each player.
*/
@:nullSafety(Off)
public static function reset():Void
{
player1 = null;

View file

@ -1,14 +1,22 @@
package funkin;
#if mobile
import funkin.mobile.ui.FunkinHitbox;
import funkin.mobile.util.InAppPurchasesUtil;
#end
import funkin.save.Save;
import funkin.util.WindowUtil;
import funkin.util.HapticUtil.HapticsMode;
/**
* A core class which provides a store of user-configurable, globally relevant values.
*/
@:nullSafety
class Preferences
{
/**
* FPS
* Always the refresh rate of the display on mobile, or 60 on web.
* @default `60`
*/
public static var framerate(get, set):Int;
@ -17,6 +25,12 @@ class Preferences
{
#if web
return 60;
#elseif mobile
var refreshRate:Int = FlxG.stage.window.displayMode.refreshRate;
if (refreshRate < 60) refreshRate = 60;
return refreshRate;
#else
return Save?.instance?.options?.framerate ?? 60;
#end
@ -44,11 +58,19 @@ class Preferences
static function get_naughtyness():Bool
{
return Save?.instance?.options?.naughtyness;
#if NO_FEATURE_NAUGHTYNESS
return false;
#else
return Save?.instance?.options?.naughtyness ?? true;
#end
}
static function set_naughtyness(value:Bool):Bool
{
#if NO_FEATURE_NAUGHTYNESS
value = false;
#end
var save:Save = Save.instance;
save.options.naughtyness = value;
save.flush();
@ -63,7 +85,7 @@ class Preferences
static function get_downscroll():Bool
{
return Save?.instance?.options?.downscroll;
return Save?.instance?.options?.downscroll #if mobile ?? true #else ?? false #end;
}
static function set_downscroll(value:Bool):Bool
@ -101,7 +123,7 @@ class Preferences
static function get_zoomCamera():Bool
{
return Save?.instance?.options?.zoomCamera;
return Save?.instance?.options?.zoomCamera ?? true;
}
static function set_zoomCamera(value:Bool):Bool
@ -114,13 +136,17 @@ class Preferences
/**
* If enabled, an FPS and memory counter will be displayed even if this is not a debug build.
* Always disabled on mobile.
* @default `false`
*/
public static var debugDisplay(get, set):Bool;
static function get_debugDisplay():Bool
{
return Save?.instance?.options?.debugDisplay;
#if mobile
return false;
#end
return Save?.instance?.options?.debugDisplay ?? false;
}
static function set_debugDisplay(value:Bool):Bool
@ -136,14 +162,78 @@ class Preferences
return value;
}
/**
* If enabled, haptic feedback will be enabled.
* @default `All`
*/
public static var hapticsMode(get, set):HapticsMode;
static function get_hapticsMode():HapticsMode
{
var value = Save?.instance?.options?.hapticsMode ?? "All";
return switch (value)
{
case "None":
HapticsMode.NONE;
case "Notes Only":
HapticsMode.NOTES_ONLY;
default:
HapticsMode.ALL;
};
}
static function set_hapticsMode(value:HapticsMode):HapticsMode
{
var string;
switch (value)
{
case HapticsMode.NONE:
string = "None";
case HapticsMode.NOTES_ONLY:
string = "Notes Only";
default:
string = "All";
};
var save:Save = Save.instance;
save.options.hapticsMode = string;
save.flush();
return value;
}
/**
* Multiplier of intensity for all the haptic feedback effects.
* @default `2.5`
*/
public static var hapticsIntensityMultiplier(get, set):Float;
static function get_hapticsIntensityMultiplier():Float
{
return Save?.instance?.options?.hapticsIntensityMultiplier ?? 1;
}
static function set_hapticsIntensityMultiplier(value:Float):Float
{
var save:Save = Save.instance;
save.options.hapticsIntensityMultiplier = value;
save.flush();
return value;
}
/**
* If enabled, the game will automatically pause when tabbing out.
* Always enabled on mobile.
* @default `true`
*/
public static var autoPause(get, set):Bool;
static function get_autoPause():Bool
{
#if mobile
return true;
#end
return Save?.instance?.options?.autoPause ?? true;
}
@ -157,11 +247,97 @@ class Preferences
return value;
}
/**
* If enabled, the game will automatically launch in fullscreen on startup.
* @default `true`
*/
public static var autoFullscreen(get, set):Bool;
static function get_autoFullscreen():Bool
{
return Save?.instance?.options?.autoFullscreen ?? true;
}
static function set_autoFullscreen(value:Bool):Bool
{
var save:Save = Save.instance;
save.options.autoFullscreen = value;
save.flush();
return value;
}
/**
* A global audio offset in milliseconds.
* This is used to sync the audio.
* @default `0`
*/
public static var globalOffset(get, set):Int;
static function get_globalOffset():Int
{
return Save?.instance?.options?.globalOffset ?? 0;
}
static function set_globalOffset(value:Int):Int
{
var save:Save = Save.instance;
save.options.globalOffset = value;
save.flush();
return value;
}
/**
* If enabled, the game will utilize VSync (or adaptive VSync) on startup.
* @default `OFF`
*/
public static var vsyncMode(get, set):lime.ui.WindowVSyncMode;
static function get_vsyncMode():lime.ui.WindowVSyncMode
{
var value = Save?.instance?.options?.vsyncMode ?? "Off";
return switch (value)
{
case "Off":
lime.ui.WindowVSyncMode.OFF;
case "On":
lime.ui.WindowVSyncMode.ON;
case "Adaptive":
lime.ui.WindowVSyncMode.ADAPTIVE;
default:
lime.ui.WindowVSyncMode.OFF;
};
}
static function set_vsyncMode(value:lime.ui.WindowVSyncMode):lime.ui.WindowVSyncMode
{
var string;
switch (value)
{
case lime.ui.WindowVSyncMode.OFF:
string = "Off";
case lime.ui.WindowVSyncMode.ON:
string = "On";
case lime.ui.WindowVSyncMode.ADAPTIVE:
string = "Adaptive";
default:
string = "Off";
};
WindowUtil.setVSyncMode(value);
var save:Save = Save.instance;
save.options.vsyncMode = string;
save.flush();
return value;
}
public static var unlockedFramerate(get, set):Bool;
static function get_unlockedFramerate():Bool
{
return Save?.instance?.options?.unlockedFramerate;
return Save?.instance?.options?.unlockedFramerate ?? false;
}
static function set_unlockedFramerate(value:Bool):Bool
@ -199,6 +375,83 @@ class Preferences
public static var lockedFramerateFunction = untyped js.Syntax.code("window.requestAnimationFrame");
#end
/**
* If >0, the game will display a semi-opaque background under the notes.
* `0` for no background, `100` for solid black if you're freaky like that
* @default `0`
*/
public static var strumlineBackgroundOpacity(get, set):Int;
static function get_strumlineBackgroundOpacity():Int
{
return (Save?.instance?.options?.strumlineBackgroundOpacity ?? 0);
}
static function set_strumlineBackgroundOpacity(value:Int):Int
{
var save:Save = Save.instance;
save.options.strumlineBackgroundOpacity = value;
save.flush();
return value;
}
/**
* If enabled, the game will hide the mouse when taking a screenshot.
* @default `true`
*/
public static var shouldHideMouse(get, set):Bool;
static function get_shouldHideMouse():Bool
{
return Save?.instance?.options?.screenshot?.shouldHideMouse ?? true;
}
static function set_shouldHideMouse(value:Bool):Bool
{
var save:Save = Save.instance;
save.options.screenshot.shouldHideMouse = value;
save.flush();
return value;
}
/**
* If enabled, the game will show a preview after taking a screenshot.
* @default `true`
*/
public static var fancyPreview(get, set):Bool;
static function get_fancyPreview():Bool
{
return Save?.instance?.options?.screenshot?.fancyPreview ?? true;
}
static function set_fancyPreview(value:Bool):Bool
{
var save:Save = Save.instance;
save.options.screenshot.fancyPreview = value;
save.flush();
return value;
}
/**
* If enabled, the game will show the preview only after a screenshot is saved.
* @default `true`
*/
public static var previewOnSave(get, set):Bool;
static function get_previewOnSave():Bool
{
return Save?.instance?.options?.screenshot?.previewOnSave ?? true;
}
static function set_previewOnSave(value:Bool):Bool
{
var save:Save = Save.instance;
save.options.screenshot.previewOnSave = value;
save.flush();
return value;
}
/**
* Loads the user's preferences from the save data and apply them.
*/
@ -206,11 +459,22 @@ class Preferences
{
// Apply the autoPause setting (enables automatic pausing on focus lost).
FlxG.autoPause = Preferences.autoPause;
// WindowUtil.setVSyncMode(Preferences.vsyncMode);
// Apply the debugDisplay setting (enables the FPS and RAM display).
toggleDebugDisplay(Preferences.debugDisplay);
#if web
toggleFramerateCap(Preferences.unlockedFramerate);
#end
#if desktop
// Apply the autoFullscreen setting (launches the game in fullscreen automatically)
FlxG.fullscreen = Preferences.autoFullscreen;
#end
#if mobile
// Apply the allowScreenTimeout setting.
lime.system.System.allowScreenTimeout = Preferences.screenTimeout;
#end
}
static function toggleFramerateCap(unlocked:Bool):Void
@ -226,18 +490,88 @@ class Preferences
if (show)
{
// Enable the debug display.
FlxG.stage.addChild(Main.fpsCounter);
FlxG.game.parent.addChild(Main.fpsCounter);
#if !html5
FlxG.stage.addChild(Main.memoryCounter);
FlxG.game.parent.addChild(Main.memoryCounter);
#end
}
else
{
// Disable the debug display.
FlxG.stage.removeChild(Main.fpsCounter);
FlxG.game.parent.removeChild(Main.fpsCounter);
#if !html5
FlxG.stage.removeChild(Main.memoryCounter);
FlxG.game.parent.removeChild(Main.memoryCounter);
#end
}
}
#if mobile
/**
* If enabled, device will be able to sleep on its own.
* @default `false`
*/
public static var screenTimeout(get, set):Bool;
static function get_screenTimeout():Bool
{
return Save?.instance?.mobileOptions?.screenTimeout ?? false;
}
static function set_screenTimeout(value:Bool):Bool
{
if (value != Save.instance.mobileOptions.screenTimeout) lime.system.System.allowScreenTimeout = value;
var save:Save = Save.instance;
save.mobileOptions.screenTimeout = value;
save.flush();
return value;
}
/**
* Controls Scheme for the hitbox.
* @default `4 Lanes`
*/
public static var controlsScheme(get, set):String;
static function get_controlsScheme():String
{
return Save?.instance?.mobileOptions?.controlsScheme ?? FunkinHitboxControlSchemes.Arrows;
}
static function set_controlsScheme(value:String):String
{
var save:Save = Save.instance;
save.mobileOptions.controlsScheme = value;
save.flush();
return value;
}
#if FEATURE_MOBILE_IAP
/**
* If bought, the game will not show any ads.
* @default `false`
*/
@:unreflective
public static var noAds(get, set):Bool;
@:unreflective
static function get_noAds():Bool
{
if (InAppPurchasesUtil.hasInitialized) noAds = InAppPurchasesUtil.isPurchased(InAppPurchasesUtil.UPGRADE_PRODUCT_ID);
var returnedValue = Save?.instance?.mobileOptions?.noAds ?? false;
return returnedValue;
}
@:unreflective
static function set_noAds(value:Bool):Bool
{
var save:Save = Save.instance;
save.mobileOptions.noAds = value;
save.flush();
return value;
}
#end
#end
}

View file

@ -1,13 +1,18 @@
package funkin.api.discord;
import funkin.util.macro.EnvironmentConfigMacro;
#if FEATURE_DISCORD_RPC
import hxdiscord_rpc.Discord;
import hxdiscord_rpc.Types;
import hxdiscord_rpc.Types.DiscordButton;
import hxdiscord_rpc.Types.DiscordEventHandlers;
import hxdiscord_rpc.Types.DiscordRichPresence;
import hxdiscord_rpc.Types.DiscordUser;
import sys.thread.Thread;
@:nullSafety
class DiscordClient
{
static final CLIENT_ID:String = "816168432860790794";
static final CLIENT_ID:Null<String> = EnvironmentConfigMacro.environmentConfig?.get("DESKTOP_DISCORD_CLIENT_ID");
public static var instance(get, never):DiscordClient;
static var _instance:Null<DiscordClient> = null;
@ -36,13 +41,29 @@ class DiscordClient
{
trace('[DISCORD] Initializing connection...');
// Discord.initialize(CLIENT_ID, handlers, true, null);
Discord.Initialize(CLIENT_ID, cpp.RawPointer.addressOf(handlers), 1, null);
if (!hasValidCredentials())
{
FlxG.log.warn("Tried to initialize Discord connection, but credentials are invalid!");
return;
}
@:nullSafety(Off)
{
Discord.Initialize(CLIENT_ID, cpp.RawPointer.addressOf(handlers), 1, "");
}
createDaemon();
}
var daemon:Thread = null;
/**
* @returns `false` if the client ID is invalid.
*/
static function hasValidCredentials():Bool
{
return !(CLIENT_ID == null || CLIENT_ID == "" || (CLIENT_ID != null && CLIENT_ID.contains(" ")));
}
var daemon:Null<Thread> = null;
function createDaemon():Void
{
@ -53,8 +74,6 @@ class DiscordClient
{
while (true)
{
trace('[DISCORD] Performing client update...');
#if DISCORD_DISABLE_IO_THREAD
Discord.updateConnection();
#end
@ -73,8 +92,6 @@ class DiscordClient
public function setPresence(params:DiscordClientPresenceParams):Void
{
trace('[DISCORD] Updating presence... (${params})');
Discord.updatePresence(buildPresence(params));
}
@ -89,17 +106,15 @@ class DiscordClient
presence.largeImageText = "Friday Night Funkin'";
// State should be generally what the person is doing, like "In the Menus" or "Pico (Pico Mix) [Freeplay Hard]"
presence.state = cast(params.state, Null<String>);
presence.state = cast(params.state, Null<String>) ?? "";
// Details should be what the person is specifically doing, including stuff like timestamps (maybe something like "03:24 elapsed").
presence.details = cast(params.details, Null<String>);
presence.details = cast(params.details, Null<String>) ?? "";
// The large image displaying what the user is doing.
// This should probably be album art.
// IMPORTANT NOTE: This can be an asset key uploaded to Discord's developer panel OR any URL you like.
presence.largeImageKey = cast(params.largeImageKey, Null<String>) ?? "album-volume1";
trace('[DISCORD] largeImageKey: ${presence.largeImageKey}');
// TODO: Make this use the song's album art.
// presence.largeImageKey = "icon";
// presence.largeImageKey = "https://f4.bcbits.com/img/a0746694746_16.jpg";
@ -107,7 +122,7 @@ class DiscordClient
// The small inset image for what the user is doing.
// This can be the opponent's health icon?
// NOTE: Like largeImageKey, this can be a URL, or an asset key.
presence.smallImageKey = cast(params.smallImageKey, Null<String>);
presence.smallImageKey = cast(params.smallImageKey, Null<String>) ?? "";
// NOTE: In previous versions, this showed as "Elapsed", but now shows as playtime and doesn't look good
// presence.startTimestamp = time - 10;
@ -133,9 +148,9 @@ class DiscordClient
final username:String = request[0].username;
final globalName:String = request[0].username;
final discriminator:Int = Std.parseInt(request[0].discriminator);
final discriminator:Null<Int> = Std.parseInt(request[0].discriminator);
if (discriminator != 0)
if (discriminator != null && discriminator != 0)
{
trace('[DISCORD] User: ${username}#${discriminator} (${globalName})');
}
@ -201,4 +216,30 @@ typedef DiscordClientPresenceParams =
*/
var ?smallImageKey:String;
}
class DiscordClientSandboxed
{
public static function setPresence(params:DiscordClientPresenceParams):Void
{
DiscordClient.instance.setPresence(params);
}
public static function shutdown():Void
{
DiscordClient.instance.shutdown();
}
}
#else
class DiscordClientSandboxed
{
public static function setPresence(params:Dynamic):Void
{
// Do nothing.
}
public static function shutdown():Void
{
// Do nothing.
}
}
#end

View file

@ -0,0 +1,110 @@
package funkin.api.newgrounds;
#if FEATURE_NEWGROUNDS_EVENTS
import io.newgrounds.Call.CallOutcome;
import io.newgrounds.NG;
import io.newgrounds.objects.events.Outcome;
import io.newgrounds.objects.events.Result;
#end
/**
* Use Newgrounds to perform basic telemetry. Ignore if not logged in to Newgrounds.
*/
@:nullSafety
class Events
{
// Only allow letters, numbers, spaces, dashes, and underscores.
static final EVENT_NAME_REGEX:EReg = ~/[^a-zA-Z0-9 -_]/g;
public static function logEvent(eventName:String):Void
{
#if (FEATURE_NEWGROUNDS && FEATURE_NEWGROUNDS_EVENTS)
if (NewgroundsClient.instance.isLoggedIn())
{
var eventHandler = NG.core.calls.event;
if (eventHandler != null)
{
var sanitizedEventName = EVENT_NAME_REGEX.replace(eventName, '');
var outcomeHandler = onEventLogged.bind(sanitizedEventName, _);
eventHandler.logEvent(sanitizedEventName).addOutcomeHandler(outcomeHandler).send();
}
}
#end
}
#if FEATURE_NEWGROUNDS_EVENTS
static function onEventLogged(eventName:String, outcome:CallOutcome<LogEventData>)
{
switch (outcome)
{
case SUCCESS(data):
trace('[NEWGROUNDS] Logged event: ${data.eventName}');
case FAIL(outcome):
switch (outcome)
{
case HTTP(error):
trace('[NEWGROUNDS] HTTP error while logging event: ${error}');
case RESPONSE(error):
trace('[NEWGROUNDS] Response error (${error.code}) while logging event: ${error.message}');
case RESULT(error):
switch (error.code)
{
case 103: // Invalid custom event name
trace('[NEWGROUNDS] Invalid custom event name: ${eventName}');
default:
trace('[NEWGROUNDS] Result error (${error.code}) while logging event: ${error.message}');
}
}
}
}
#end
public static inline function logStartGame():Void
{
logEvent('start-game');
}
public static inline function logStartSong(songId:String, variation:String):Void
{
logEvent('start-song_${songId}-${variation}');
}
public static inline function logFailSong(songId:String, variation:String):Void
{
logEvent('blueballs_${songId}-${variation}');
}
public static inline function logCompleteSong(songId:String, variation:String):Void
{
logEvent('complete-song_${songId}-${variation}');
}
public static inline function logStartLevel(levelId:String):Void
{
logEvent('start-level_${levelId}');
}
public static inline function logCompleteLevel(levelId:String):Void
{
logEvent('complete-level_${levelId}');
}
public static inline function logEarnRank(rankName:String):Void
{
logEvent('earn-rank_${rankName}');
}
public static inline function logWatchCartoon():Void
{
logEvent('watch-cartoon');
}
// Note there is already a loadReferral call for the merch link
// and that gets logged as an event!
public static inline function logOpenCredits():Void
{
logEvent('open-credits');
}
}

View file

@ -0,0 +1,489 @@
package funkin.api.newgrounds;
#if FEATURE_NEWGROUNDS
import io.newgrounds.Call.CallError;
import io.newgrounds.components.ScoreBoardComponent;
import io.newgrounds.objects.Score;
import io.newgrounds.objects.ScoreBoard as LeaderboardData;
import io.newgrounds.objects.User;
import io.newgrounds.objects.events.Outcome;
import io.newgrounds.utils.ScoreBoardList;
@:nullSafety
class Leaderboards
{
public static function listLeaderboardData():Map<Leaderboard, LeaderboardData>
{
var leaderboardList:Null<ScoreBoardList> = NewgroundsClient.instance.leaderboards;
if (leaderboardList == null)
{
trace('[NEWGROUNDS] Not logged in, cannot fetch medal data!');
return [];
}
return @:privateAccess leaderboardList._map?.copy() ?? [];
}
/**
* Submit a score to Newgrounds.
* @param leaderboard The leaderboard to submit to.
* @param score The score to submit.
* @param tag An optional tag to attach to the score.
*/
public static function submitScore(leaderboard:Leaderboard, score:Int, ?tag:String):Void
{
// Silently reject submissions for unknown leaderboards.
if (leaderboard == Leaderboard.Unknown) return;
if (NewgroundsClient.instance.isLoggedIn())
{
var leaderboardList = NewgroundsClient.instance.leaderboards;
if (leaderboardList == null) return;
var leaderboardData:Null<LeaderboardData> = leaderboardList.get(leaderboard.getId());
if (leaderboardData != null)
{
leaderboardData.postScore(score, function(outcome:Outcome<CallError>):Void {
switch (outcome)
{
case SUCCESS:
trace('[NEWGROUNDS] Submitted score!');
case FAIL(error):
trace('[NEWGROUNDS] Failed to submit score!');
trace(error);
}
});
}
}
}
/**
* Request to receive scores from Newgrounds.
* @param leaderboard The leaderboard to fetch scores from.
* @param params Additional parameters for fetching the score.
*/
public static function requestScores(leaderboard:Leaderboard, ?params:RequestScoresParams)
{
// Silently reject retrieving scores from unknown leaderboards.
if (leaderboard == Leaderboard.Unknown) return;
var leaderboardList = NewgroundsClient.instance.leaderboards;
if (leaderboardList == null) return;
var leaderboardData:Null<LeaderboardData> = leaderboardList.get(leaderboard.getId());
if (leaderboardData == null) return;
var user:Null<User> = null;
if ((params?.useCurrentUser ?? false) && NewgroundsClient.instance.isLoggedIn()) user = NewgroundsClient.instance.user;
leaderboardData.requestScores(params?.limit ?? 10, params?.skip ?? 0, params?.period ?? ALL, params?.social ?? false, params?.tag, user,
function(outcome:Outcome<CallError>):Void {
switch (outcome)
{
case SUCCESS:
trace('[NEWGROUNDS] Fetched scores!');
if (params != null && params.onComplete != null) params.onComplete(leaderboardData.scores);
case FAIL(error):
trace('[NEWGROUNDS] Failed to fetch scores!');
trace(error);
if (params != null && params.onFail != null) params.onFail();
}
});
}
/**
* Submit a score for a Story Level to Newgrounds.
*/
public static function submitLevelScore(levelId:String, difficultyId:String, score:Int):Void
{
var tag = '${difficultyId}';
Leaderboards.submitScore(Leaderboard.getLeaderboardByLevel(levelId), score, tag);
}
/**
* Submit a score for a song to Newgrounds.
*/
public static function submitSongScore(songId:String, difficultyId:String, score:Int):Void
{
var tag = '${difficultyId}';
Leaderboards.submitScore(Leaderboard.getLeaderboardBySong(songId, difficultyId), score, tag);
}
}
/**
* Wrapper for `Leaderboards` that prevents submitting scores.
*/
@:nullSafety
class LeaderboardsSandboxed
{
public static function getLeaderboardBySong(songId:String, difficultyId:String)
{
return Leaderboard.getLeaderboardBySong(songId, difficultyId);
}
public static function getLeaderboardByLevel(levelId:String)
{
return Leaderboard.getLeaderboardByLevel(levelId);
}
public function requestScores(leaderboard:Leaderboard, params:RequestScoresParams)
{
Leaderboards.requestScores(leaderboard, params);
}
}
/**
* Additional parameters for `Leaderboards.requestScores()`
*/
typedef RequestScoresParams =
{
/**
* How many scores to include in a list.
* @default `10`
*/
var ?limit:Int;
/**
* How many scores to skip before starting the list.
* @default `0`
*/
var ?skip:Int;
/**
* The time-frame to pull the scores from.
* @default `Period.ALL`
*/
var ?period:Period;
/**
* If true, only scores by the user and their friends will be loaded. Ignored if no user is set.
* @default `false`
*/
var ?social:Bool;
/**
* An optional tag to filter the results by.
* @default `null`
*/
var ?tag:String;
/**
* If true, only the scores from the currently logged in user will be loaded.
* Additionally, if `social` is set to true, the scores of the user's friend will be loaded.
* @default `false`
*/
var ?useCurrentUser:Bool;
var ?onComplete:Array<Score>->Void;
var ?onFail:Void->Void;
}
#end
enum abstract Leaderboard(Int) from Int to Int
{
/**
* Represents an undefined or invalid leaderboard.
*/
var Unknown = -1;
//
// STORY LEVELS
//
var StoryWeek1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14239 #else 9615 #end;
var StoryWeek2 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14240 #else 9616 #end;
var StoryWeek3 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14242 #else 9767 #end;
var StoryWeek4 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14241 #else 9866 #end;
var StoryWeek5 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14243 #else 9956 #end;
var StoryWeek6 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14244 #else 9957 #end;
var StoryWeek7 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14245 #else 14682 #end;
var StoryWeekend1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14237 #else 14683 #end;
//
// SONGS
//
// Tutorial
var Tutorial = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14249 #else 14684 #end;
// Week 1
var Bopeebo = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14246 #else 9603 #end;
var BopeeboErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14685 #end;
var BopeeboPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14686 #end;
var Fresh = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14247 #else 9602 #end;
var FreshErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14687 #end;
var FreshPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14688 #end;
var DadBattle = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 14248 #else 9605 #end;
var DadBattleErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14689 #end;
var DadBattlePicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14690 #end;
// Week 2
var Spookeez = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9604 #end;
var SpookeezErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14691 #end;
var SpookeezPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14692 #end;
var South = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9606 #end;
var SouthErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14693 #end;
var SouthPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14694 #end;
var Monster = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14703 #end;
// Week 3
var Pico = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9766 #end;
var PicoErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14695 #end;
var PicoPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14696 #end;
var PhillyNice = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9769 #end;
var PhillyNiceErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14697 #end;
var PhillyNicePicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14698 #end;
var Blammed = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9768 #end;
var BlammedErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14704 #end;
var BlammedPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14705 #end;
// Week 4
var SatinPanties = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9869 #end;
var SatinPantiesErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14701 #end;
var High = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9867 #end;
var HighErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14699 #end;
var MILF = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9868 #end;
// Week 5
var Cocoa = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14706 #end;
var CocoaErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14707 #end;
var CocoaPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14708 #end;
var Eggnog = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14709 #end;
var EggnogErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14711 #end;
var EggnogPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14710 #end;
var WinterHorrorland = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14712 #end;
// Week 6
var Senpai = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9958 #end;
var SenpaiErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14713 #end;
var SenpaiPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14716 #end;
var Roses = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9959 #end;
var RosesErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14714 #end;
var RosesPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14717 #end;
var Thorns = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 9960 #end;
var ThornsErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14715 #end;
// Week 7
var Ugh = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14718 #end;
var UghErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14722 #end;
var UghPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14721 #end;
var Guns = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14719 #end;
var GunsPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14723 #end;
var Stress = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14720 #end;
var StressPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14724 #end;
// Weekend 1
var Darnell = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14725 #end;
var DarnellErect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14727 #end;
var DarnellBFMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14726 #end;
var LitUp = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14728 #end;
var LitUpBFMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14729 #end;
var TwoHot = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14730 #end; // Variable names can't start with a number!
var Blazin = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 1000000 #else 14731 #end;
public function getId():Int
{
return this;
}
/**
* Get the leaderboard for a given level and difficulty.
* @param levelId The ID for the story level.
* @param difficulty The current difficulty.
* @return The Leaderboard ID for the given level and difficulty.
*/
public static function getLeaderboardByLevel(levelId:String):Leaderboard
{
switch (levelId)
{
case "week1":
return StoryWeek1;
case "week2":
return StoryWeek2;
case "week3":
return StoryWeek3;
case "week4":
return StoryWeek4;
case "week5":
return StoryWeek5;
case "week6":
return StoryWeek6;
case "week7":
return StoryWeek7;
case "weekend1":
return StoryWeekend1;
default:
return Unknown;
}
}
/**
* Get the leaderboard for a given level and difficulty.
* @param levelId The ID for the story level.
* @param difficulty The current difficulty, suffixed with the variation, like `easy-pico` or `nightmare`.
* @return The Leaderboard ID for the given level and difficulty.
*/
public static function getLeaderboardBySong(songId:String, difficulty:String):Leaderboard
{
var variation = Constants.DEFAULT_VARIATION;
var difficultyParts = difficulty.split('-');
if (difficultyParts.length >= 2)
{
variation = difficultyParts[difficultyParts.length - 1];
}
else if (Constants.DEFAULT_DIFFICULTY_LIST_ERECT.contains(difficulty))
{
variation = "erect";
}
switch (variation)
{
case "pico":
switch (songId)
{
case "bopeebo":
return BopeeboPicoMix;
case "fresh":
return FreshPicoMix;
case "dadbattle":
return DadBattlePicoMix;
case "spookeez":
return SpookeezPicoMix;
case "south":
return SouthPicoMix;
case "pico":
return PicoPicoMix;
case "philly-nice":
return PhillyNicePicoMix;
case "blammed":
return BlammedPicoMix;
case "cocoa":
return CocoaPicoMix;
case "eggnog":
return EggnogPicoMix;
case "senpai":
return SenpaiPicoMix;
case "roses":
return RosesPicoMix;
case "ugh":
return UghPicoMix;
case "guns":
return GunsPicoMix;
case "stress":
return StressPicoMix;
default:
return Unknown;
}
case "bf":
switch (songId)
{
case "darnell":
return DarnellBFMix;
case "lit-up":
return LitUpBFMix;
default:
return Unknown;
}
case "erect":
switch (songId)
{
case "bopeebo":
return BopeeboErect;
case "fresh":
return FreshErect;
case "dadbattle":
return DadBattleErect;
case "spookeez":
return SpookeezErect;
case "south":
return SouthErect;
case "pico":
return PicoErect;
case "philly-nice":
return PhillyNiceErect;
case "blammed":
return BlammedErect;
case "satin-panties":
return SatinPantiesErect;
case "high":
return HighErect;
case "cocoa":
return CocoaErect;
case "eggnog":
return EggnogErect;
case "senpai":
return SenpaiErect;
case "roses":
return RosesErect;
case "thorns":
return ThornsErect;
case "ugh":
return UghErect;
case "darnell":
return DarnellErect;
default:
return Unknown;
}
case "default":
switch (songId)
{
case "tutorial":
return Tutorial;
case "bopeebo":
return Bopeebo;
case "fresh":
return Fresh;
case "dadbattle":
return DadBattle;
case "spookeez":
return Spookeez;
case "south":
return South;
case "monster":
return Monster;
case "pico":
return Pico;
case "philly-nice":
return PhillyNice;
case "blammed":
return Blammed;
case "satin-panties":
return SatinPanties;
case "high":
return High;
case "milf":
return MILF;
case "cocoa":
return Cocoa;
case "eggnog":
return Eggnog;
case "winter-horrorland":
return WinterHorrorland;
case "senpai":
return Senpai;
case "roses":
return Roses;
case "thorns":
return Thorns;
case "ugh":
return Ugh;
case "guns":
return Guns;
case "stress":
return Stress;
case "darnell":
return Darnell;
case "lit-up":
return LitUp;
case "2hot":
return TwoHot;
case "blazin":
return Blazin;
default:
return Unknown;
}
default:
return Unknown;
}
}
}

View file

@ -0,0 +1,411 @@
package funkin.api.newgrounds;
#if FEATURE_NEWGROUNDS
import io.newgrounds.objects.Medal as MedalData;
import funkin.util.plugins.NewgroundsMedalPlugin;
import flixel.graphics.FlxGraphic;
import openfl.display.BitmapData;
import io.newgrounds.utils.MedalList;
import haxe.Json;
@:nullSafety
class Medals
{
public static var medalJSON:Array<MedalJSON> = [];
public static function listMedalData():Map<Medal, MedalData>
{
var medalList = NewgroundsClient.instance.medals;
if (medalList == null)
{
trace('[NEWGROUNDS] Not logged in, cannot fetch medal data!');
return [];
}
return @:privateAccess medalList._map?.copy() ?? [];
}
public static function award(medal:Medal):Void
{
if (NewgroundsClient.instance.isLoggedIn())
{
var medalList = NewgroundsClient.instance.medals;
@:privateAccess
if (medalList == null || medalList._map == null) return;
var medalData:Null<MedalData> = medalList.get(medal.getId());
@:privateAccess
if (medalData == null || medalData._data == null)
{
trace('[NEWGROUNDS] Could not retrieve data for medal: ${medal}');
return;
}
else if (!medalData.unlocked)
{
trace('[NEWGROUNDS] Awarding medal (${medal}).');
medalData.sendUnlock();
// Play the medal unlock animation, but only if the user has not already unlocked it.
#if html5
// Web builds support parsing the bitmap data from the URL directly.
BitmapData.loadFromFile("https:" + medalData.icon).onComplete(function(bmp:BitmapData) {
var medalGraphic = FlxGraphic.fromBitmapData(bmp);
medalGraphic.persist = true;
NewgroundsMedalPlugin.play(medalData.value, medalData.name, medalGraphic);
});
#else
if ((medalJSON?.length ?? 0) == 0) loadMedalJSON();
// We have to use a medal image from the game files. We use a Base64 encoded image that NG spits out.
// TODO: Wait, don't they give us the medal icon?
var localMedalData:Null<MedalJSON> = medalJSON.filter(function(jsonMedal) {
#if FEATURE_NEWGROUNDS_TESTING_MEDALS
return medal == jsonMedal.idTest;
#else
return medal == jsonMedal.id;
#end
})[0];
if (localMedalData == null) throw "You forgot to encode a Base64 image for medal: " + medal;
var str:String = localMedalData.icon;
// Lime/OpenFL parses it without the included prefix stuff, so we remove it.
str = str.replace("data:image/png;base64,", "").trim();
var bitmapData = BitmapData.fromBase64(str, "image/png");
var medalGraphic:Null<FlxGraphic> = null;
if (str != null)
{
medalGraphic = FlxGraphic.fromBitmapData(bitmapData);
medalGraphic.persist = true;
}
NewgroundsMedalPlugin.play(medalData.value, medalData.name, medalGraphic);
#end
}
else
{
trace('[NEWGROUNDS] User already has medal (${medal}).');
}
}
else
{
trace('[NEWGROUNDS] Attempted to award medal (${medal}), but not logged into Newgrounds.');
}
}
public static function loadMedalJSON():Void
{
var jsonPath = Paths.json('medals');
var jsonString = Assets.getText(jsonPath);
var parser = new json2object.JsonParser<Array<MedalJSON>>();
parser.ignoreUnknownVariables = false;
trace('[NEWGROUNDS] Parsing local medal data...');
parser.fromJson(jsonString, jsonPath);
if (parser.errors.length > 0)
{
trace('[NEWGROUNDS] Failed to parse local medal data!');
for (error in parser.errors)
funkin.data.DataError.printError(error);
medalJSON = [];
}
else
{
medalJSON = parser.value;
}
}
public static function fetchMedalData(medal:Medal):Null<FetchedMedalData>
{
var medalList = NewgroundsClient.instance.medals;
@:privateAccess
if (medalList == null || medalList._map == null) return null;
var medalData:Null<MedalData> = medalList.get(medal.getId());
@:privateAccess
if (medalData == null || medalData._data == null)
{
trace('[NEWGROUNDS] Could not retrieve data for medal: ${medal}');
return null;
}
return {
id: medalData.id,
name: medalData.name,
description: medalData.description,
icon: medalData.icon,
value: medalData.value,
difficulty: medalData.difficulty,
secret: medalData.secret,
unlocked: medalData.unlocked
}
}
public static function awardStoryLevel(id:String):Void
{
var medal:Medal = Medal.getMedalByStoryLevel(id);
if (medal == Medal.Unknown)
{
trace('[NEWGROUNDS] Story level does not have a medal! (${id}).');
return;
}
Medals.award(medal);
}
}
/**
* Wrapper for `Medals` that prevents awarding medals.
*/
class MedalsSandboxed
{
public static function fetchMedalData(medal:Medal):Null<FetchedMedalData>
{
return Medals.fetchMedalData(medal);
}
public static function getMedalByStoryLevel(id:String):Medal
{
return Medal.getMedalByStoryLevel(id);
}
public static function getAllMedals():Array<Medal>
{
return Medal.getAllMedals();
}
}
/**
* Contains data for a Medal, but excludes functions like `sendUnlock()`.
*/
typedef FetchedMedalData =
{
var id:Int;
var name:String;
var description:String;
var icon:String;
var value:Int;
var difficulty:Int;
var secret:Bool;
var unlocked:Bool;
}
#end
/**
* Represents NG Medal data in a JSON format.
*/
typedef MedalJSON =
{
/**
* Medal ID to use for release builds
*/
var id:Int;
/**
* Medal ID to use for testing builds
*/
var idTest:Int;
/**
* The English name for the medal
*/
var name:String;
/**
* The English name for the medal
*/
var icon:String;
}
enum abstract Medal(Int) from Int to Int
{
/**
* Represents an undefined or invalid medal.
*/
var Unknown = -1;
/**
* I Said Funkin'!
* Start the game for the first time.
*/
var StartGame = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80894 #else 60960 #end;
/**
* That's How You Do It!
* Beat Tutoria l in Story Mode (on any difficulty).
*/
var StoryTutorial = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80906 #else 83647 #end;
/**
* More Like Daddy Queerest
* Beat Week 1 in Story Mode (on any difficulty).
*/
var StoryWeek1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80899 #else 60961 #end;
/**
* IT IS THE SPOOKY MONTH
* Beat Week 2 in Story Mode (on any difficulty).
*/
var StoryWeek2 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80900 #else 83648 #end;
/**
* Pico Funny
* Beat Week 3 in Story Mode (on any difficulty).
*/
var StoryWeek3 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80901 #else 83649 #end;
/**
* Mommy Must Murder
* Beat Week 4 in Story Mode (on any difficulty).
*/
var StoryWeek4 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80902 #else 83650 #end;
/**
* Yule Tide Joy
* Beat Week 5 in Story Mode (on any difficulty).
*/
var StoryWeek5 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80903 #else 83651 #end;
/**
* A Visual Novelty
* Beat Week 6 in Story Mode (on any difficulty).
*/
var StoryWeek6 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80904 #else 83652 #end;
/**
* I <3 JohnnyUtah
* Beat Week 7 in Story Mode (on any difficulty).
*/
var StoryWeek7 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80905 #else 83653 #end;
/**
* Yo, Really Think So?
* Beat Weekend 1 in Story Mode (on any difficulty).
*/
var StoryWeekend1 = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80907 #else 83654 #end;
/**
* Stay Funky
* Press TAB in Freeplay and unlock your first character.
*/
var CharSelect = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 83633 #else 83655 #end;
/**
* A Challenger Appears
* Beat any Pico remix in Freeplay (on any difficulty).
*/
var FreeplayPicoMix = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80910 #else 83656 #end;
/**
* De-Stressing
* Beat Stress (Pico Mix) in Freeplay (on Normal difficulty or higher).
*/
var FreeplayStressPico = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 83629 #else 83657 #end;
/**
* L
* Earn a Loss rating on any song (on any difficulty).
*/
var LossRating = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80915 #else 83658 #end;
/**
* Getting Freaky
* Earn a Perfect rating on any song on Hard difficulty or higher.
* NOTE: Should also be awarded for a Gold Perfect because otherwise that would be annoying.
*/
var PerfectRatingHard = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80908 #else 83659 #end;
/**
* You Should Drink More Water
* Earn a Golden Perfect rating on any song on Hard difficulty or higher.
*/
var GoldPerfectRatingHard = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80909 #else 83660 #end;
/**
* Harder Than Hard
* Beat any Erect remix in Freeplay on Erect or Nightmare difficulty.
*/
var ErectDifficulty = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80911 #else 83661 #end;
/**
* The Rap God
* Earn a Gold Perfect rating on any song on Nightmare difficulty.
*/
var GoldPerfectRatingNightmare = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80912 #else 83662 #end;
/**
* Just like the game!
* Get freaky on a Friday.
* NOTE: You must beat at least one song on any difficulty.
*/
var FridayNight = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80913 #else 61034 #end;
/**
* Nice
* Earn a rating of EXACTLY 69% (good luck).
*/
var Nice = #if FEATURE_NEWGROUNDS_TESTING_MEDALS 80914 #else 83646 #end;
public function getId():Int
{
return this;
}
public static function getMedalByStoryLevel(levelId:String):Medal
{
switch (levelId)
{
case "tutorial":
return StoryTutorial;
case "week1":
return StoryWeek1;
case "week2":
return StoryWeek2;
case "week3":
return StoryWeek3;
case "week4":
return StoryWeek4;
case "week5":
return StoryWeek5;
case "week6":
return StoryWeek6;
case "week7":
return StoryWeek7;
case "weekend1":
return StoryWeekend1;
default:
return Unknown;
}
}
/**
* Lists all medals aside from the `Unknown` one.
*/
public static function getAllMedals()
{
return [
StartGame,
StoryTutorial,
StoryWeek1,
StoryWeek2,
StoryWeek3,
StoryWeek4,
StoryWeek5,
StoryWeek6,
StoryWeek7,
StoryWeekend1,
CharSelect,
FreeplayPicoMix,
FreeplayStressPico,
LossRating,
PerfectRatingHard,
GoldPerfectRatingHard,
ErectDifficulty,
GoldPerfectRatingNightmare,
FridayNight,
Nice
];
}
}

View file

@ -0,0 +1,156 @@
package funkin.api.newgrounds;
#if FEATURE_NEWGROUNDS
import io.newgrounds.utils.SaveSlotList;
import io.newgrounds.objects.SaveSlot;
import io.newgrounds.Call.CallError;
import io.newgrounds.objects.events.Outcome;
import funkin.save.Save;
@:nullSafety
@:access(funkin.save.Save)
class NGSaveSlot
{
public static var instance(get, never):NGSaveSlot;
static var _instance:Null<NGSaveSlot> = null;
static function get_instance():NGSaveSlot
{
if (_instance == null)
{
return loadInstance();
}
return _instance;
}
public static function loadInstance():NGSaveSlot
{
var loadedSave:NGSaveSlot = loadSlot(Save.BASE_SAVE_SLOT);
if (_instance == null) _instance = loadedSave;
return loadedSave;
}
static function loadSlot(slot:Int):NGSaveSlot
{
trace('[NEWGROUNDS] Getting save slot from ID $slot');
var saveSlot:Null<SaveSlot> = NewgroundsClient.instance.saveSlots?.getById(slot);
var saveSlotObj:NGSaveSlot = new NGSaveSlot(saveSlot);
return saveSlotObj;
}
public var ngSaveSlot:Null<SaveSlot> = null;
public function new(?ngSaveSlot:Null<SaveSlot>)
{
this.ngSaveSlot = ngSaveSlot;
#if FLX_DEBUG
FlxG.console.registerClass(NGSaveSlot);
FlxG.console.registerClass(Save);
#end
}
/**
* Saves `data` to the newgrounds save slot.
* @param data The raw save data.
*/
public function save(data:RawSaveData):Void
{
var encodedData:String = haxe.Serializer.run(data);
try
{
ngSaveSlot?.save(encodedData, function(outcome:Outcome<CallError>) {
switch (outcome)
{
case SUCCESS:
trace('[NEWGROUNDS] Successfully saved save data to save slot!');
case FAIL(error):
trace('[NEWGROUNDS] Failed to save data to save slot!');
trace(error);
}
});
}
catch (error:String)
{
trace('[NEWGROUNDS] Failed to save data to save slot!');
trace(error);
}
}
public function load(?onComplete:Null<Dynamic->Void>, ?onError:Null<CallError->Void>):Void
{
try
{
ngSaveSlot?.load(function(outcome:SaveSlotOutcome):Void {
switch (outcome)
{
case SUCCESS(value):
trace('[NEWGROUNDS] Loaded save slot with the ID of ${ngSaveSlot?.id}!');
#if FEATURE_DEBUG_FUNCTIONS
trace('Save Slot Data:');
trace(value);
#end
if (onComplete != null && value != null)
{
var decodedData:Dynamic = haxe.Unserializer.run(value);
onComplete(decodedData);
}
case FAIL(error):
trace('[NEWGROUNDS] Failed to load save slot with the ID of ${ngSaveSlot?.id}!');
trace(error);
if (onError != null)
{
onError(error);
}
}
});
}
catch (error:String)
{
trace('[NEWGROUNDS] Failed to load save slot with the ID of ${ngSaveSlot?.id}!');
trace(error);
if (onError != null)
{
onError(RESPONSE({message: error, code: 500}));
}
}
}
public function clear():Void
{
try
{
ngSaveSlot?.clear(function(outcome:Outcome<CallError>) {
switch (outcome)
{
case SUCCESS:
trace('[NEWGROUNDS] Successfully cleared save slot!');
case FAIL(error):
trace('[NEWGROUNDS] Failed to clear save slot!');
trace(error);
}
});
}
catch (error:String)
{
trace('[NEWGROUNDS] Failed to clear save slot!');
trace(error);
}
}
public function checkSlot():Void
{
trace('[NEWGROUNDS] Checking save slot with the ID of ${ngSaveSlot?.id}...');
trace(' Is null? ${ngSaveSlot == null}');
trace(' Is empty? ${ngSaveSlot?.isEmpty() ?? false}');
}
}
#end

View file

@ -1,71 +0,0 @@
package funkin.api.newgrounds;
#if newgrounds
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.components.ScoreBoardComponent.Period;
import io.newgrounds.objects.Error;
import io.newgrounds.objects.Medal;
import io.newgrounds.objects.Score;
import io.newgrounds.objects.ScoreBoard;
import io.newgrounds.objects.events.Response;
import io.newgrounds.objects.events.Result.GetCurrentVersionResult;
import io.newgrounds.objects.events.Result.GetVersionResult;
#end
/**
* Contains any script functions which should be BLOCKED from use by modded scripts.
*/
class NGUnsafe
{
static public function logEvent(event:String)
{
#if newgrounds
NG.core.calls.event.logEvent(event).send();
trace('should have logged: ' + event);
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('event:$event - not logged, missing NG.io lib');
#end
#end
}
static public function unlockMedal(id:Int)
{
#if newgrounds
if (isLoggedIn)
{
var medal = NG.core.medals.get(id);
if (!medal.unlocked) medal.sendUnlock();
}
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('medal:$id - not unlocked, missing NG.io lib');
#end
#end
}
static public function postScore(score:Int = 0, song:String)
{
#if newgrounds
if (isLoggedIn)
{
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
if (song == board.name)
{
board.postScore(score, "Uhh meow?");
}
// trace('loaded scoreboard id:$id, name:${board.name}');
}
}
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('Song:$song, Score:$score - not posted, missing NG.io lib');
#end
#end
}
}

View file

@ -1,243 +0,0 @@
package funkin.api.newgrounds;
import flixel.util.FlxSignal;
import flixel.util.FlxTimer;
import lime.app.Application;
import openfl.display.Stage;
#if newgrounds
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.components.ScoreBoardComponent.Period;
import io.newgrounds.objects.Error;
import io.newgrounds.objects.Medal;
import io.newgrounds.objects.Score;
import io.newgrounds.objects.ScoreBoard;
import io.newgrounds.objects.events.Response;
import io.newgrounds.objects.events.Result.GetCurrentVersionResult;
import io.newgrounds.objects.events.Result.GetVersionResult;
#end
/**
* Contains any script functions which should be ALLOWD for use by modded scripts.
*/
class NGUtil
{
#if newgrounds
/**
* True, if the saved sessionId was used in the initial login, and failed to connect.
* Used in MainMenuState to show a popup to establish a new connection
*/
public static var savedSessionFailed(default, null):Bool = false;
public static var scoreboardsLoaded:Bool = false;
public static var isLoggedIn(get, never):Bool;
inline static function get_isLoggedIn()
{
return NG.core != null && NG.core.loggedIn;
}
public static var scoreboardArray:Array<Score> = [];
public static var ngDataLoaded(default, null):FlxSignal = new FlxSignal();
public static var ngScoresLoaded(default, null):FlxSignal = new FlxSignal();
public static var GAME_VER:String = "";
static public function checkVersion(callback:String->Void)
{
trace('checking NG.io version');
GAME_VER = "v" + Application.current.meta.get('version');
NG.core.calls.app.getCurrentVersion(GAME_VER).addDataHandler(function(response) {
GAME_VER = response.result.data.currentVersion;
trace('CURRENT NG VERSION: ' + GAME_VER);
callback(GAME_VER);
}).send();
}
static public function init()
{
var api = APIStuff.API;
if (api == null || api.length == 0)
{
trace("Missing Newgrounds API key, aborting connection");
return;
}
trace("connecting to newgrounds");
#if NG_FORCE_EXPIRED_SESSION
var sessionId:String = "fake_session_id";
function onSessionFail(error:Error)
{
trace("Forcing an expired saved session. " + "To disable, comment out NG_FORCE_EXPIRED_SESSION in Project.xml");
savedSessionFailed = true;
}
#else
var sessionId:String = NGLite.getSessionId();
if (sessionId != null) trace("found web session id");
#if (debug)
if (sessionId == null && APIStuff.SESSION != null)
{
trace("using debug session id");
sessionId = APIStuff.SESSION;
}
#end
var onSessionFail:Error->Void = null;
if (sessionId == null && Save.instance.ngSessionId != null)
{
trace("using stored session id");
sessionId = Save.instance.ngSessionId;
onSessionFail = function(error) savedSessionFailed = true;
}
#end
NG.create(api, sessionId, #if NG_DEBUG true #else false #end, onSessionFail);
#if NG_VERBOSE
NG.core.verbose = true;
#end
// Set the encryption cipher/format to RC4/Base64. AES128 and Hex are not implemented yet
NG.core.initEncryption(APIStuff.EncKey); // Found in you NG project view
if (NG.core.attemptingLogin)
{
/* a session_id was found in the loadervars, this means the user is playing on newgrounds.com
* and we should login shortly. lets wait for that to happen
*/
trace("attempting login");
NG.core.onLogin.add(onNGLogin);
}
// GK: taking out auto login, adding a login button to the main menu
// else
// {
// /* They are NOT playing on newgrounds.com, no session id was found. We must start one manually, if we want to.
// * Note: This will cause a new browser window to pop up where they can log in to newgrounds
// */
// NG.core.requestLogin(onNGLogin);
// }
}
/**
* Attempts to log in to newgrounds by requesting a new session ID, only call if no session ID was found automatically
* @param popupLauncher The function to call to open the login url, must be inside
* a user input event or the popup blocker will block it.
* @param onComplete A callback with the result of the connection.
*/
static public function login(?popupLauncher:(Void->Void)->Void, onComplete:ConnectionResult->Void)
{
trace("Logging in manually");
var onPending:Void->Void = null;
if (popupLauncher != null)
{
onPending = function() popupLauncher(NG.core.openPassportUrl);
}
var onSuccess:Void->Void = onNGLogin;
var onFail:Error->Void = null;
var onCancel:Void->Void = null;
if (onComplete != null)
{
onSuccess = function() {
onNGLogin();
onComplete(Success);
}
onFail = function(e) onComplete(Fail(e.message));
onCancel = function() onComplete(Cancelled);
}
NG.core.requestLogin(onSuccess, onPending, onFail, onCancel);
}
inline static public function cancelLogin():Void
{
NG.core.cancelLoginRequest();
}
static function onNGLogin():Void
{
trace('logged in! user:${NG.core.user.name}');
Save.instance.ngSessionId = NG.core.sessionId;
Save.instance.flush();
// Load medals then call onNGMedalFetch()
NG.core.requestMedals(onNGMedalFetch);
// Load Scoreboards hten call onNGBoardsFetch()
NG.core.requestScoreBoards(onNGBoardsFetch);
ngDataLoaded.dispatch();
}
static public function logout()
{
NG.core.logOut();
Save.instance.ngSessionId = null;
Save.instance.flush();
}
// --- MEDALS
static function onNGMedalFetch():Void
{
/*
// Reading medal info
for (id in NG.core.medals.keys())
{
var medal = NG.core.medals.get(id);
trace('loaded medal id:$id, name:${medal.name}, description:${medal.description}');
}
// Unlocking medals
var unlockingMedal = NG.core.medals.get(54352);// medal ids are listed in your NG project viewer
if (!unlockingMedal.unlocked)
unlockingMedal.sendUnlock();
*/
}
// --- SCOREBOARDS
static function onNGBoardsFetch():Void
{
/*
// Reading medal info
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
trace('loaded scoreboard id:$id, name:${board.name}');
}
*/
// var board = NG.core.scoreBoards.get(8004);// ID found in NG project view
// Posting a score thats OVER 9000!
// board.postScore(FlxG.random.int(0, 1000));
// --- To view the scores you first need to select the range of scores you want to see ---
// add an update listener so we know when we get the new scores
// board.onUpdate.add(onNGScoresFetch);
trace("shoulda got score by NOW!");
// board.requestScores(20);// get the best 10 scores ever logged
// more info on scores --- http://www.newgrounds.io/help/components/#scoreboard-getscores
}
static function onNGScoresFetch():Void
{
scoreboardsLoaded = true;
ngScoresLoaded.dispatch();
/*
for (score in NG.core.scoreBoards.get(8737).scores)
{
trace('score loaded user:${score.user.name}, score:${score.formatted_value}');
}
*/
// var board = NG.core.scoreBoards.get(8004);// ID found in NG project view
// board.postScore(HighScore.score);
// NGUtil.scoreboardArray = NG.core.scoreBoards.get(8004).scores;
}
#end
}

View file

@ -1,298 +0,0 @@
package funkin.api.newgrounds;
#if newgrounds
import flixel.util.FlxSignal;
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.objects.Error;
import io.newgrounds.objects.Score;
import lime.app.Application;
#end
/**
* MADE BY GEOKURELI THE LEGENED GOD HERO MVP
*/
class NGio
{
#if newgrounds
/**
* True, if the saved sessionId was used in the initial login, and failed to connect.
* Used in MainMenuState to show a popup to establish a new connection
*/
public static var savedSessionFailed(default, null):Bool = false;
public static var scoreboardsLoaded:Bool = false;
public static var isLoggedIn(get, never):Bool;
inline static function get_isLoggedIn()
{
return NG.core != null && NG.core.loggedIn;
}
public static var scoreboardArray:Array<Score> = [];
public static var ngDataLoaded(default, null):FlxSignal = new FlxSignal();
public static var ngScoresLoaded(default, null):FlxSignal = new FlxSignal();
public static var GAME_VER:String = "";
static public function checkVersion(callback:String->Void)
{
trace('checking NG.io version');
GAME_VER = "v" + Application.current.meta.get('version');
NG.core.calls.app.getCurrentVersion(GAME_VER).addDataHandler(function(response) {
GAME_VER = response.result.data.currentVersion;
trace('CURRENT NG VERSION: ' + GAME_VER);
callback(GAME_VER);
}).send();
}
static public function init()
{
var api = APIStuff.API;
if (api == null || api.length == 0)
{
trace("Missing Newgrounds API key, aborting connection");
return;
}
trace("connecting to newgrounds");
#if NG_FORCE_EXPIRED_SESSION
var sessionId:String = "fake_session_id";
function onSessionFail(error:Error)
{
trace("Forcing an expired saved session. " + "To disable, comment out NG_FORCE_EXPIRED_SESSION in Project.xml");
savedSessionFailed = true;
}
#else
var sessionId:String = NGLite.getSessionId();
if (sessionId != null) trace("found web session id");
#if (debug)
if (sessionId == null && APIStuff.SESSION != null)
{
trace("using debug session id");
sessionId = APIStuff.SESSION;
}
#end
var onSessionFail:Error->Void = null;
if (sessionId == null && Save.instance.ngSessionId != null)
{
trace("using stored session id");
sessionId = Save.instance.ngSessionId;
onSessionFail = function(error) savedSessionFailed = true;
}
#end
NG.create(api, sessionId, #if NG_DEBUG true #else false #end, onSessionFail);
#if NG_VERBOSE
NG.core.verbose = true;
#end
// Set the encryption cipher/format to RC4/Base64. AES128 and Hex are not implemented yet
NG.core.initEncryption(APIStuff.EncKey); // Found in you NG project view
if (NG.core.attemptingLogin)
{
/* a session_id was found in the loadervars, this means the user is playing on newgrounds.com
* and we should login shortly. lets wait for that to happen
*/
trace("attempting login");
NG.core.onLogin.add(onNGLogin);
}
// GK: taking out auto login, adding a login button to the main menu
// else
// {
// /* They are NOT playing on newgrounds.com, no session id was found. We must start one manually, if we want to.
// * Note: This will cause a new browser window to pop up where they can log in to newgrounds
// */
// NG.core.requestLogin(onNGLogin);
// }
}
/**
* Attempts to log in to newgrounds by requesting a new session ID, only call if no session ID was found automatically
* @param popupLauncher The function to call to open the login url, must be inside
* a user input event or the popup blocker will block it.
* @param onComplete A callback with the result of the connection.
*/
static public function login(?popupLauncher:(Void->Void)->Void, onComplete:ConnectionResult->Void)
{
trace("Logging in manually");
var onPending:Void->Void = null;
if (popupLauncher != null)
{
onPending = function() popupLauncher(NG.core.openPassportUrl);
}
var onSuccess:Void->Void = onNGLogin;
var onFail:Error->Void = null;
var onCancel:Void->Void = null;
if (onComplete != null)
{
onSuccess = function() {
onNGLogin();
onComplete(Success);
}
onFail = function(e) onComplete(Fail(e.message));
onCancel = function() onComplete(Cancelled);
}
NG.core.requestLogin(onSuccess, onPending, onFail, onCancel);
}
inline static public function cancelLogin():Void
{
NG.core.cancelLoginRequest();
}
static function onNGLogin():Void
{
trace('logged in! user:${NG.core.user.name}');
Save.instance.ngSessionId = NG.core.sessionId;
Save.instance.flush();
// Load medals then call onNGMedalFetch()
NG.core.requestMedals(onNGMedalFetch);
// Load Scoreboards hten call onNGBoardsFetch()
NG.core.requestScoreBoards(onNGBoardsFetch);
ngDataLoaded.dispatch();
}
static public function logout()
{
NG.core.logOut();
Save.instance.ngSessionId = null;
Save.instance.flush();
}
// --- MEDALS
static function onNGMedalFetch():Void
{
/*
// Reading medal info
for (id in NG.core.medals.keys())
{
var medal = NG.core.medals.get(id);
trace('loaded medal id:$id, name:${medal.name}, description:${medal.description}');
}
// Unlocking medals
var unlockingMedal = NG.core.medals.get(54352);// medal ids are listed in your NG project viewer
if (!unlockingMedal.unlocked)
unlockingMedal.sendUnlock();
*/
}
// --- SCOREBOARDS
static function onNGBoardsFetch():Void
{
/*
// Reading medal info
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
trace('loaded scoreboard id:$id, name:${board.name}');
}
*/
// var board = NG.core.scoreBoards.get(8004);// ID found in NG project view
// Posting a score thats OVER 9000!
// board.postScore(FlxG.random.int(0, 1000));
// --- To view the scores you first need to select the range of scores you want to see ---
// add an update listener so we know when we get the new scores
// board.onUpdate.add(onNGScoresFetch);
trace("shoulda got score by NOW!");
// board.requestScores(20);// get the best 10 scores ever logged
// more info on scores --- http://www.newgrounds.io/help/components/#scoreboard-getscores
}
static function onNGScoresFetch():Void
{
scoreboardsLoaded = true;
ngScoresLoaded.dispatch();
/*
for (score in NG.core.scoreBoards.get(8737).scores)
{
trace('score loaded user:${score.user.name}, score:${score.formatted_value}');
}
*/
// var board = NG.core.scoreBoards.get(8004);// ID found in NG project view
// board.postScore(HighScore.score);
// NGio.scoreboardArray = NG.core.scoreBoards.get(8004).scores;
}
#end
static public function logEvent(event:String)
{
#if newgrounds
NG.core.calls.event.logEvent(event).send();
trace('should have logged: ' + event);
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('event:$event - not logged, missing NG.io lib');
#end
#end
}
static public function unlockMedal(id:Int)
{
#if newgrounds
if (isLoggedIn)
{
var medal = NG.core.medals.get(id);
if (!medal.unlocked) medal.sendUnlock();
}
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('medal:$id - not unlocked, missing NG.io lib');
#end
#end
}
static public function postScore(score:Int = 0, song:String)
{
#if newgrounds
if (isLoggedIn)
{
for (id in NG.core.scoreBoards.keys())
{
var board = NG.core.scoreBoards.get(id);
if (song == board.name)
{
board.postScore(score, "Uhh meow?");
}
// trace('loaded scoreboard id:$id, name:${board.name}');
}
}
#else
#if FEATURE_DEBUG_FUNCTIONS
trace('Song:$song, Score:$score - not posted, missing NG.io lib');
#end
#end
}
}
enum ConnectionResult
{
/** Log in successful */
Success;
/** Could not login */
Fail(msg:String);
/** User cancelled the login */
Cancelled;
}

View file

@ -0,0 +1,377 @@
package funkin.api.newgrounds;
import funkin.util.macro.EnvironmentConfigMacro;
import funkin.save.Save;
import funkin.api.newgrounds.Medals.Medal;
#if FEATURE_NEWGROUNDS
import io.newgrounds.Call.CallError;
import io.newgrounds.NG;
import io.newgrounds.NGLite;
import io.newgrounds.NGLite.LoginOutcome;
import io.newgrounds.NGLite.LoginFail;
import io.newgrounds.objects.events.Outcome;
import io.newgrounds.utils.MedalList;
import io.newgrounds.utils.SaveSlotList;
import io.newgrounds.utils.ScoreBoardList;
import io.newgrounds.objects.User;
@:nullSafety
class NewgroundsClient
{
static final APP_ID:Null<String> = EnvironmentConfigMacro.environmentConfig?.get("API_NG_APP_ID");
static final ENCRYPTION_KEY:Null<String> = EnvironmentConfigMacro.environmentConfig?.get("API_NG_ENC_KEY");
public static var instance(get, never):NewgroundsClient;
static var _instance:Null<NewgroundsClient> = null;
static function get_instance():NewgroundsClient
{
if (NewgroundsClient._instance == null) _instance = new NewgroundsClient();
if (NewgroundsClient._instance == null) throw "Could not initialize singleton NewgroundsClient!";
return NewgroundsClient._instance;
}
public var user(get, never):Null<User>;
public var medals(get, never):Null<MedalList>;
public var leaderboards(get, never):Null<ScoreBoardList>;
public var saveSlots(get, never):Null<SaveSlotList>;
private function new()
{
trace('[NEWGROUNDS] Initializing client...');
#if FEATURE_NEWGROUNDS_DEBUG
trace('[NEWGROUNDS] App ID: ${APP_ID}');
trace('[NEWGROUNDS] Encryption Key: ${ENCRYPTION_KEY}');
#end
if (!hasValidCredentials())
{
FlxG.log.warn("Tried to initialize Newgrounds client, but credentials are invalid!");
return;
}
@:nullSafety(Off)
{
NG.create(APP_ID, getSessionId(), #if FEATURE_NEWGROUNDS_DEBUG true #else false #end, onLoginResolved);
NG.core.setupEncryption(ENCRYPTION_KEY);
}
}
public function init()
{
if (NG.core == null) return;
trace('[NEWGROUNDS] Setting up connection...');
#if FEATURE_NEWGROUNDS_DEBUG
NG.core.verbose = true;
#end
NG.core.onLogin.add(onLoginSuccessful);
if (NG.core.attemptingLogin)
{
// Session ID was valid and we should be logged in soon.
trace('[NEWGROUNDS] Waiting for existing login!');
}
else
{
#if FEATURE_NEWGROUNDS_AUTOLOGIN
// Attempt an automatic login.
trace('[NEWGROUNDS] Attempting new login immediately!');
this.autoLogin();
#else
trace('[NEWGROUNDS] Not logged in, you have to login manually!');
#end
}
}
/**
* Attempt to log into Newgrounds and create a session ID.
* @param onSuccess An optional callback for when the login is successful.
* @param onError An optional callback for when the login fails.
*/
public function login(?onSuccess:Void->Void, ?onError:Void->Void):Void
{
if (NG.core == null)
{
FlxG.log.warn("No Newgrounds client initialized! Are your credentials invalid?");
return;
}
if (onSuccess != null && onError != null)
{
NG.core.requestLogin(onLoginResolvedWithCallbacks.bind(_, onSuccess, onError));
}
else
{
NG.core.requestLogin(onLoginResolved);
}
}
public function autoLogin(?onSuccess:Void->Void, ?onError:Void->Void):Void
{
if (NG.core == null)
{
FlxG.log.warn("No Newgrounds client initialized! Are your credentials invalid?");
return;
}
var dummyPassport:String->Void = function(_) {
// just a dummy passport, so we don't create a popup
// otherwise `NG.core.requestLogin()` will automatically attempt to open a tab at the beginning of the game
// users should go to the Options Menu to login to NG
// we cancel the request, so we can call it later
NG.core.cancelLoginRequest();
};
if (onSuccess != null && onError != null)
{
NG.core.requestLogin(onLoginResolvedWithCallbacks.bind(_, onSuccess, onError), dummyPassport);
}
else
{
NG.core.requestLogin(onLoginResolved, dummyPassport);
}
}
/**
* Log out of Newgrounds and invalidate the current session.
* @param onSuccess An optional callback for when the logout is successful.
*/
public function logout(?onSuccess:Void->Void, ?onError:Void->Void):Void
{
if (NG.core != null)
{
if (onSuccess != null && onError != null)
{
NG.core.logOut(onLogoutResolvedWithCallbacks.bind(_, onSuccess, onError));
}
else
{
NG.core.logOut(onLogoutResolved);
}
}
Save.instance.ngSessionId = null;
}
/**
* @return `true` if the user is logged in to Newgrounds.
*/
public function isLoggedIn():Bool
{
#if FEATURE_NEWGROUNDS
return NG.core != null && NG.core.loggedIn;
#else
return false;
#end
}
/**
* @returns `false` if either the app ID or the encryption key is invalid.
*/
static function hasValidCredentials():Bool
{
return !(APP_ID == null
|| APP_ID == ""
|| (APP_ID != null && APP_ID.contains(" "))
|| ENCRYPTION_KEY == null
|| ENCRYPTION_KEY == ""
|| (ENCRYPTION_KEY != null && ENCRYPTION_KEY.contains(" ")));
}
function onLoginResolved(outcome:LoginOutcome):Void
{
switch (outcome)
{
case SUCCESS:
onLoginSuccessful();
case FAIL(result):
onLoginFailed(result);
}
}
function onLoginResolvedWithCallbacks(outcome:LoginOutcome, onSuccess:Void->Void, onError:Void->Void):Void
{
onLoginResolved(outcome);
switch (outcome)
{
case SUCCESS:
onSuccess();
case FAIL(result):
onError();
}
}
function onLogoutResolved(outcome:Outcome<CallError>):Void
{
switch (outcome)
{
case SUCCESS:
onLogoutSuccessful();
case FAIL(result):
onLogoutFailed(result);
}
}
function onLogoutResolvedWithCallbacks(outcome:Outcome<CallError>, onSuccess:Void->Void, onError:Void->Void):Void
{
onLogoutResolved(outcome);
switch (outcome)
{
case SUCCESS:
onSuccess();
case FAIL(result):
onError();
}
}
function onLoginSuccessful():Void
{
if (NG.core == null) return;
trace('[NEWGROUNDS] Login successful!');
// Persist the session ID.
Save.instance.ngSessionId = NG.core.sessionId;
trace('[NEWGROUNDS] Submitting medal request...');
NG.core.requestMedals(onFetchedMedals);
trace('[NEWGROUNDS] Submitting leaderboard request...');
NG.core.scoreBoards.loadList(onFetchedLeaderboards);
trace('[NEWGROUNDS] Submitting save slot request...');
NG.core.saveSlots.loadList(onFetchedSaveSlots);
}
function onLoginFailed(result:LoginFail):Void
{
switch (result)
{
case CANCELLED(type):
switch (type)
{
case PASSPORT:
trace('[NEWGROUNDS] Login cancelled by passport website.');
case MANUAL:
trace('[NEWGROUNDS] Login cancelled by application.');
default:
trace('[NEWGROUNDS] Login cancelled by unknown source.');
}
case ERROR(error):
switch (error)
{
case HTTP(error):
trace('[NEWGROUNDS] Login failed due to HTTP error: ${error}');
case RESPONSE(error):
trace('[NEWGROUNDS] Login failed due to response error: ${error.message} (${error.code})');
case RESULT(error):
trace('[NEWGROUNDS] Login failed due to result error: ${error.message} (${error.code})');
default:
trace('[NEWGROUNDS] Login failed due to unknown error: ${error}');
}
default:
trace('[NEWGROUNDS] Login failed due to unknown reason.');
}
}
function onLogoutSuccessful():Void
{
trace('[NEWGROUNDS] Logout successful!');
}
function onLogoutFailed(result:CallError):Void
{
switch (result)
{
case HTTP(error):
trace('[NEWGROUNDS] Logout failed due to HTTP error: ${error}');
case RESPONSE(error):
trace('[NEWGROUNDS] Logout failed due to response error: ${error.message} (${error.code})');
case RESULT(error):
trace('[NEWGROUNDS] Logout failed due to result error: ${error.message} (${error.code})');
default:
trace('[NEWGROUNDS] Logout failed due to unknown error: ${result}');
}
}
function onFetchedMedals(outcome:Outcome<CallError>):Void
{
trace('[NEWGROUNDS] Fetched medals!');
}
function onFetchedLeaderboards(outcome:Outcome<CallError>):Void
{
trace('[NEWGROUNDS] Fetched leaderboards!');
// trace(funkin.api.newgrounds.Leaderboards.listLeaderboardData());
}
function onFetchedSaveSlots(outcome:Outcome<CallError>):Void
{
trace('[NEWGROUNDS] Fetched save slots!');
NGSaveSlot.instance.checkSlot();
}
function get_user():Null<User>
{
if (NG.core == null || !this.isLoggedIn()) return null;
return NG.core.user;
}
function get_medals():Null<MedalList>
{
if (NG.core == null || !this.isLoggedIn()) return null;
return NG.core.medals;
}
function get_leaderboards():Null<ScoreBoardList>
{
if (NG.core == null || !this.isLoggedIn()) return null;
return NG.core.scoreBoards;
}
function get_saveSlots():Null<SaveSlotList>
{
if (NG.core == null || !this.isLoggedIn()) return null;
return NG.core.saveSlots;
}
static function getSessionId():Null<String>
{
#if js
// We can fetch the session ID from the URL.
var result:Null<String> = NGLite.getSessionId();
if (result != null) return result;
#end
// We have to fetch the session ID from the save file.
return Save.instance.ngSessionId;
}
}
/**
* Wrapper for `NewgroundsClient` that prevents submitting cheated data.
*/
class NewgroundsClientSandboxed
{
public static var user(get, never):Null<User>;
static function get_user()
{
return NewgroundsClient.instance.user;
}
public static function isLoggedIn()
{
return NewgroundsClient.instance.isLoggedIn();
}
}
#end

View file

@ -1,101 +0,0 @@
package funkin.api.newgrounds;
#if newgrounds
import funkin.NGio;
import funkin.ui.Prompt;
class NgPrompt extends Prompt
{
public function new(text:String, style:ButtonStyle = Yes_No)
{
super(text, style);
}
static public function showLogin()
{
return showLoginPrompt(true);
}
static public function showSavedSessionFailed()
{
return showLoginPrompt(false);
}
static function showLoginPrompt(fromUi:Bool)
{
var prompt = new NgPrompt("Talking to server...", None);
prompt.openCallback = NGUtil.login.bind(function popupLauncher(openPassportUrl)
{
var choiceMsg = fromUi ? #if web "Log in to Newgrounds?" #else null #end // User-input needed to allow popups
: "Your session has expired.\n Please login again.";
if (choiceMsg != null)
{
prompt.setText(choiceMsg);
prompt.setButtons(Yes_No);
#if web
prompt.buttons.getItem("yes").fireInstantly = true;
#end
prompt.onYes = function() {
prompt.setText("Connecting..." #if web + "\n(check your popup blocker)" #end);
prompt.setButtons(None);
openPassportUrl();
};
prompt.onNo = function() {
prompt.close();
prompt = null;
NGio.cancelLogin();
};
}
else
{
prompt.setText("Connecting...");
openPassportUrl();
}
}, function onLoginComplete(result:ConnectionResult)
{
switch (result)
{
case Success:
{
prompt.setText("Login Successful");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
case Fail(msg):
{
trace("Login Error:" + msg);
prompt.setText("Login failed");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
case Cancelled:
{
if (prompt != null)
{
prompt.setText("Login cancelled by user");
prompt.setButtons(Ok);
prompt.onYes = prompt.close;
}
else
trace("Login cancelled via prompt");
}
}
});
return prompt;
}
static public function showLogout()
{
var user = io.newgrounds.NG.core.user.name;
var prompt = new NgPrompt('Log out of $user?', Yes_No);
prompt.onYes = function() {
NGio.logout();
prompt.close();
};
prompt.onNo = prompt.close;
return prompt;
}
}
#end

View file

@ -1,9 +0,0 @@
# funkin.api.newgrounds
This package contains two main classes:
- `NGUtil` contains utility functions for interacting with the Newgrounds API.
- This includes any functions which scripts should be able to use,
such as retrieving achievement status.
- `NGUnsafe` contains sensitive utility functions for interacting with the Newgrounds API.
- This includes any functions which scripts should not be able to use,
such as writing high scores or posting achievements.

View file

@ -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);
}
}

View file

@ -1,9 +1,6 @@
package funkin.audio;
import flash.media.Sound;
#if flash11
import flash.utils.ByteArray;
#end
import flixel.sound.FlxSound;
import flixel.system.FlxAssets.FlxSoundAsset;
import openfl.Assets;
@ -14,6 +11,7 @@ import openfl.utils.AssetType;
/**
* a FlxSound that just overrides loadEmbedded to allow for "streamed" sounds to load with better performance!
*/
@:nullSafety
class FlxStreamSound extends FlxSound
{
public function new()
@ -21,7 +19,7 @@ class FlxStreamSound extends FlxSound
super();
}
override public function loadEmbedded(EmbeddedSound:FlxSoundAsset, Looped:Bool = false, AutoDestroy:Bool = false, ?OnComplete:Void->Void):FlxSound
override public function loadEmbedded(EmbeddedSound:Null<FlxSoundAsset>, Looped:Bool = false, AutoDestroy:Bool = false, ?OnComplete:Void->Void):FlxSound
{
if (EmbeddedSound == null) return this;

View file

@ -13,14 +13,13 @@ import funkin.data.song.SongRegistry;
import funkin.util.tools.ICloneable;
import funkin.util.flixel.sound.FlxPartialSound;
import funkin.Paths.PathsFunction;
import openfl.Assets;
import lime.app.Future;
import lime.app.Promise;
import lime.media.AudioSource;
import openfl.events.Event;
import openfl.media.Sound;
import openfl.media.SoundChannel;
import openfl.media.SoundMixer;
#if (openfl >= "8.0.0")
#end
/**
* A FlxSound which adds additional functionality:
* - Delayed playback via negative song position.
@ -43,9 +42,9 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
if (_onVolumeChanged == null)
{
_onVolumeChanged = new FlxTypedSignal<Float->Void>();
FlxG.sound.volumeHandler = function(volume:Float) {
FlxG.sound.onVolumeChange.add(function(volume:Float) {
_onVolumeChanged.dispatch(volume);
}
});
}
return _onVolumeChanged;
}
@ -73,7 +72,7 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
override function set_volume(value:Float):Float
{
// Uncap the volume.
_volume = FlxMath.bound(value, 0.0, MAX_VOLUME);
_volume = value.clamp(0.0, MAX_VOLUME);
updateTransform();
return _volume;
}
@ -110,6 +109,11 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
return _waveformData;
}
/**
* If true, the game will forcefully add this sound's channel to the list of playing sounds.
*/
public var important:Bool = false;
/**
* Are we in a state where the song should play but time is negative?
*/
@ -147,6 +151,14 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
else
{
super.update(elapsedSec);
@:privateAccess
{
if (important && _channel != null && !SoundMixer.__soundChannels.contains(_channel))
{
SoundMixer.__soundChannels.push(_channel);
}
}
}
}
@ -433,13 +445,14 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
* @param persist Whether to keep this `FunkinSound` between states, or destroy it.
* @param onComplete Called when the sound finished playing.
* @param onLoad Called when the sound finished loading. Called immediately for succesfully loaded embedded sounds.
* @param important If `true`, the sound channel will forcefully be added onto the channel array, even if full. Use sparingly!
* @return A `FunkinSound` object, or `null` if the sound could not be loaded.
*/
public static function load(embeddedSound:FlxSoundAsset, volume:Float = 1.0, looped:Bool = false, autoDestroy:Bool = false, autoPlay:Bool = false,
persist:Bool = false, ?onComplete:Void->Void, ?onLoad:Void->Void):Null<FunkinSound>
persist:Bool = false, ?onComplete:Void->Void, ?onLoad:Void->Void, important:Bool = false):Null<FunkinSound>
{
@:privateAccess
if (SoundMixer.__soundChannels.length >= SoundMixer.MAX_ACTIVE_CHANNELS)
if (SoundMixer.__soundChannels.length >= SoundMixer.MAX_ACTIVE_CHANNELS && !important)
{
FlxG.log.error('FunkinSound could not play sound, channels exhausted! Found ${SoundMixer.__soundChannels.length} active sound channels.');
return null;
@ -462,8 +475,9 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
if (autoPlay) sound.play();
sound.volume = volume;
sound.group = FlxG.sound.defaultSoundGroup;
FlxG.sound.defaultSoundGroup.add(sound);
sound.persist = persist;
sound.important = important;
// Make sure to add the sound to the list.
// If it's already in, it won't get re-added.
@ -534,6 +548,42 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
}
FlxTween.cancelTweensOf(this);
this._label = 'unknown';
this._waveformData = null;
}
@:access(openfl.media.Sound)
@:access(openfl.media.SoundChannel)
@:access(openfl.media.SoundMixer)
override function startSound(startTime:Float)
{
if (!important)
{
super.startSound(startTime);
return;
}
_time = startTime;
_paused = false;
if (_sound == null) return;
// Create a channel manually if the sound is considered important.
var pan:Float = (SoundMixer.__soundTransform.pan + _transform.pan).clamp(-1, 1);
var volume:Float = (SoundMixer.__soundTransform.volume * _transform.volume).clamp(0, MAX_VOLUME);
var audioSource:AudioSource = new AudioSource(_sound.__buffer);
audioSource.offset = Std.int(startTime);
audioSource.gain = volume;
var position:lime.math.Vector4 = audioSource.position;
position.x = pan;
position.z = -1 * Math.sqrt(1 - Math.pow(pan, 2));
audioSource.position = position;
_channel = new SoundChannel(_sound, audioSource, _transform);
_channel.addEventListener(Event.SOUND_COMPLETE, stopped);
pitch = _pitch;
active = true;
}
/**
@ -542,9 +592,9 @@ class FunkinSound extends FlxSound implements ICloneable<FunkinSound>
* @param volume
* @return A `FunkinSound` object, or `null` if the sound could not be loaded.
*/
public static function playOnce(key:String, volume:Float = 1.0, ?onComplete:Void->Void, ?onLoad:Void->Void):Null<FunkinSound>
public static function playOnce(key:String, volume:Float = 1.0, ?onComplete:Void->Void, ?onLoad:Void->Void, important:Bool = false):Null<FunkinSound>
{
var result:Null<FunkinSound> = FunkinSound.load(key, volume, false, true, true, false, onComplete, onLoad);
var result:Null<FunkinSound> = FunkinSound.load(key, volume, false, true, true, false, onComplete, onLoad, important);
return result;
}

View file

@ -1,13 +1,13 @@
package funkin.audio;
import flixel.group.FlxGroup.FlxTypedGroup;
import funkin.audio.FunkinSound;
import flixel.tweens.FlxTween;
/**
* A group of FunkinSounds that are all synced together.
* Unlike FlxSoundGroup, you can also control their time and pitch.
*/
@:nullSafety
class SoundGroup extends FlxTypedGroup<FunkinSound>
{
public var time(get, set):Float;
@ -37,6 +37,7 @@ class SoundGroup extends FlxTypedGroup<FunkinSound>
return result;
}
@:nullSafety(Off)
for (sndFile in files)
{
var snd:FunkinSound = FunkinSound.load(Paths.voices(song, '$sndFile'));
@ -71,7 +72,7 @@ class SoundGroup extends FlxTypedGroup<FunkinSound>
/**
* Add a sound to the group.
*/
public override function add(sound:FunkinSound):FunkinSound
public override function add(sound:FunkinSound):Null<FunkinSound>
{
var result:FunkinSound = super.add(sound);
@ -135,6 +136,7 @@ class SoundGroup extends FlxTypedGroup<FunkinSound>
/**
* Fade in all the sounds in the group.
*/
@:nullSafety(Off)
public function fadeIn(duration:Float, ?from:Float = 0.0, ?to:Float = 1.0, ?onComplete:FlxTween->Void):Void
{
forEachAlive(function(sound:FunkinSound) {
@ -145,6 +147,7 @@ class SoundGroup extends FlxTypedGroup<FunkinSound>
/**
* Fade out all the sounds in the group.
*/
@:nullSafety(Off)
public function fadeOut(duration:Float, ?to:Float = 0.0, ?onComplete:FlxTween->Void):Void
{
forEachAlive(function(sound:FunkinSound) {
@ -239,7 +242,7 @@ class SoundGroup extends FlxTypedGroup<FunkinSound>
function get_muted():Bool
{
if (getFirstAlive() != null) return getFirstAlive().muted;
if (getFirstAlive() != null) return getFirstAlive()?.muted ?? false;
else
return false;
}

View file

@ -3,10 +3,11 @@ package funkin.audio;
import flixel.group.FlxGroup.FlxTypedGroup;
import funkin.audio.waveform.WaveformData;
@:nullSafety
class VoicesGroup extends SoundGroup
{
var playerVoices:FlxTypedGroup<FunkinSound>;
var opponentVoices:FlxTypedGroup<FunkinSound>;
var playerVoices:Null<FlxTypedGroup<FunkinSound>>;
var opponentVoices:Null<FlxTypedGroup<FunkinSound>>;
/**
* Control the volume of only the sounds in the player group.
@ -41,12 +42,12 @@ class VoicesGroup extends SoundGroup
public function addPlayerVoice(sound:FunkinSound):Void
{
super.add(sound);
playerVoices.add(sound);
playerVoices?.add(sound);
}
function set_playerVolume(volume:Float):Float
{
playerVoices.forEachAlive(function(voice:FunkinSound) {
playerVoices?.forEachAlive(function(voice:FunkinSound) {
voice.volume = volume;
});
return playerVolume = volume;
@ -59,10 +60,10 @@ class VoicesGroup extends SoundGroup
snd.time = time;
});
playerVoices.forEachAlive(function(voice:FunkinSound) {
playerVoices?.forEachAlive(function(voice:FunkinSound) {
voice.time -= playerVoicesOffset;
});
opponentVoices.forEachAlive(function(voice:FunkinSound) {
opponentVoices?.forEachAlive(function(voice:FunkinSound) {
voice.time -= opponentVoicesOffset;
});
@ -71,7 +72,7 @@ class VoicesGroup extends SoundGroup
function set_playerVoicesOffset(offset:Float):Float
{
playerVoices.forEachAlive(function(voice:FunkinSound) {
playerVoices?.forEachAlive(function(voice:FunkinSound) {
voice.time += playerVoicesOffset;
voice.time -= offset;
});
@ -80,7 +81,7 @@ class VoicesGroup extends SoundGroup
function set_opponentVoicesOffset(offset:Float):Float
{
opponentVoices.forEachAlive(function(voice:FunkinSound) {
opponentVoices?.forEachAlive(function(voice:FunkinSound) {
voice.time += opponentVoicesOffset;
voice.time -= offset;
});
@ -93,12 +94,12 @@ class VoicesGroup extends SoundGroup
public function addOpponentVoice(sound:FunkinSound):Void
{
super.add(sound);
opponentVoices.add(sound);
opponentVoices?.add(sound);
}
function set_opponentVolume(volume:Float):Float
{
opponentVoices.forEachAlive(function(voice:FunkinSound) {
opponentVoices?.forEachAlive(function(voice:FunkinSound) {
voice.volume = volume;
});
return opponentVolume = volume;
@ -106,26 +107,26 @@ class VoicesGroup extends SoundGroup
public function getPlayerVoice(index:Int = 0):Null<FunkinSound>
{
return playerVoices.members[index];
return playerVoices?.members[index];
}
public function getOpponentVoice(index:Int = 0):Null<FunkinSound>
{
return opponentVoices.members[index];
return opponentVoices?.members[index];
}
public function getPlayerVoiceWaveform():Null<WaveformData>
{
if (playerVoices.members.length == 0) return null;
if (playerVoices?.members.length == 0) return null;
return playerVoices.members[0].waveformData;
return playerVoices?.members[0].waveformData;
}
public function getOpponentVoiceWaveform():Null<WaveformData>
{
if (opponentVoices.members.length == 0) return null;
if (opponentVoices?.members.length == 0) return null;
return opponentVoices.members[0].waveformData;
return opponentVoices?.members[0].waveformData;
}
/**
@ -133,9 +134,9 @@ class VoicesGroup extends SoundGroup
*/
public function getPlayerVoiceLength():Float
{
if (playerVoices.members.length == 0) return 0.0;
if (playerVoices?.members.length == 0) return 0.0;
return playerVoices.members[0].length;
return playerVoices?.members[0]?.length ?? 0.0;
}
/**
@ -143,15 +144,15 @@ class VoicesGroup extends SoundGroup
*/
public function getOpponentVoiceLength():Float
{
if (opponentVoices.members.length == 0) return 0.0;
if (opponentVoices?.members.length == 0) return 0.0;
return opponentVoices.members[0].length;
return opponentVoices?.members[0]?.length ?? 0.0;
}
public override function clear():Void
{
playerVoices.clear();
opponentVoices.clear();
playerVoices?.clear();
opponentVoices?.clear();
super.clear();
}
@ -159,13 +160,13 @@ class VoicesGroup extends SoundGroup
{
if (playerVoices != null)
{
playerVoices.destroy();
playerVoices?.destroy();
playerVoices = null;
}
if (opponentVoices != null)
{
opponentVoices.destroy();
opponentVoices?.destroy();
opponentVoices = null;
}

View file

@ -3,6 +3,7 @@ package funkin.audio.visualize;
import flixel.FlxSprite;
import flixel.group.FlxSpriteGroup.FlxTypedSpriteGroup;
@:nullSafety
class ABot extends FlxTypedSpriteGroup<FlxSprite>
{
public function new()

View file

@ -1,63 +1,79 @@
package funkin.audio.visualize;
import funkin.graphics.FunkinSprite;
import flixel.FlxSprite;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxSpriteGroup.FlxTypedSpriteGroup;
import flixel.sound.FlxSound;
import funkin.vis.dsp.SpectralAnalyzer;
import funkin.vis.audioclip.frontends.LimeAudioClip;
using Lambda;
@:nullSafety
class ABotVis extends FlxTypedSpriteGroup<FlxSprite>
{
// public var vis:VisShit;
var analyzer:SpectralAnalyzer;
var analyzer:Null<SpectralAnalyzer> = null;
var volumes:Array<Float> = [];
public var snd:FlxSound;
public var snd:Null<FlxSound> = null;
public function new(snd:FlxSound)
static final BAR_COUNT:Int = 7;
// TODO: Make the sprites easier to soft code.
public function new(snd:FlxSound, pixel:Bool)
{
super();
this.snd = snd;
// vis = new VisShit(snd);
// vis.snd = snd;
var visCount = pixel ? (BAR_COUNT + 1) : (BAR_COUNT + 1);
var visScale = pixel ? 6 : 1;
var visFrms:FlxAtlasFrames = Paths.getSparrowAtlas('aBotViz');
var visFrms:FlxAtlasFrames = Paths.getSparrowAtlas(pixel ? 'characters/abotPixel/aBotVizPixel' : 'characters/abot/aBotViz');
// these are the differences in X position, from left to right
var positionX:Array<Float> = [0, 59, 56, 66, 54, 52, 51];
var positionY:Array<Float> = [0, -8, -3.5, -0.4, 0.5, 4.7, 7];
var positionX:Array<Float> = pixel ? [0, 7 * 6, 8 * 6, 9 * 6, 10 * 6, 6 * 6, 7 * 6] : [0, 59, 56, 66, 54, 52, 51];
var positionY:Array<Float> = pixel ? [0, -2 * 6, -1 * 6, 0, 0, 1 * 6, 2 * 6] : [0, -8, -3.5, -0.4, 0.5, 4.7, 7];
for (lol in 1...8)
for (index in 1...visCount)
{
// pushes initial value
volumes.push(0.0);
var sum = function(num:Float, total:Float) return total += num;
var posX:Float = positionX.slice(0, lol).fold(sum, 0);
var posY:Float = positionY.slice(0, lol).fold(sum, 0);
var viz:FlxSprite = new FlxSprite(posX, posY);
// Sum the offsets up to the current index
var sum = function(num:Float, total:Float) return total += num;
var posX:Float = positionX.slice(0, index).fold(sum, 0);
var posY:Float = positionY.slice(0, index).fold(sum, 0);
var viz:FunkinSprite = new FunkinSprite(posX, posY);
viz.frames = visFrms;
viz.antialiasing = pixel ? false : true;
viz.scale.set(visScale, visScale);
add(viz);
var visStr = 'viz';
viz.animation.addByPrefix('VIZ', visStr + lol, 0);
viz.animation.play('VIZ', false, false, 6);
viz.animation.addByPrefix('VIZ', '$visStr${index}0', 0);
viz.animation.play('VIZ', false, false, 1);
}
}
public function initAnalyzer()
public function initAnalyzer():Void
{
@:privateAccess
analyzer = new SpectralAnalyzer(snd._channel.__audioSource, 7, 0.1, 40);
if (snd == null) return;
#if desktop
// On desktop it uses FFT stuff that isn't as optimized as the direct browser stuff we use on HTML5
@:privateAccess
analyzer = new SpectralAnalyzer(snd._channel.__audioSource, BAR_COUNT, 0.1, 40);
// A-Bot tuning...
analyzer.minDb = -65;
analyzer.maxDb = -25;
analyzer.maxFreq = 22000;
// we use a very low minFreq since some songs use low low subbass like a boss
analyzer.minFreq = 10;
#if sys
// On native it uses FFT stuff that isn't as optimized as the direct browser stuff we use on HTML5
// So we want to manually change it!
analyzer.fftN = 256;
#end
@ -66,16 +82,17 @@ class ABotVis extends FlxTypedSpriteGroup<FlxSprite>
// analyzer.fftN = 2048;
}
public function dumpSound():Void
{
snd = null;
analyzer = null;
}
var visTimer:Float = -1;
var visTimeMax:Float = 1 / 30;
override function update(elapsed:Float)
{
// updateViz();
// updateFFT(elapsed);
//
super.update(elapsed);
}
@ -86,8 +103,8 @@ class ABotVis extends FlxTypedSpriteGroup<FlxSprite>
override function draw()
{
if (analyzer != null) drawFFT();
super.draw();
drawFFT();
}
/**
@ -95,17 +112,17 @@ class ABotVis extends FlxTypedSpriteGroup<FlxSprite>
*/
function drawFFT():Void
{
var levels = analyzer.getLevels();
var levels = (analyzer != null) ? analyzer.getLevels() : getDefaultLevels();
for (i in 0...min(group.members.length, levels.length))
{
var animFrame:Int = Math.round(levels[i].value * 5);
var animFrame:Int = (FlxG.sound.volume == 0 || FlxG.sound.muted) ? 0 : Math.round(levels[i].value * 6);
#if desktop
// Web version scales with the Flixel volume level.
// This line brings platform parity but looks worse.
// animFrame = Math.round(animFrame * FlxG.sound.volume);
#end
// don't display if we're at 0 volume from the level
group.members[i].visible = animFrame > 0;
// decrement our animFrame, so we can get a value from 0-5 for animation frames
animFrame -= 1;
animFrame = Math.floor(Math.min(5, animFrame));
animFrame = Math.floor(Math.max(0, animFrame));
@ -116,79 +133,19 @@ class ABotVis extends FlxTypedSpriteGroup<FlxSprite>
}
}
// function updateFFT(elapsed:Float)
// {
// if (vis.snd != null)
// {
// vis.checkAndSetBuffer();
// if (vis.setBuffer)
// {
// var remappedShit:Int = 0;
// if (vis.snd.playing) remappedShit = Std.int(FlxMath.remapToRange(vis.snd.time, 0, vis.snd.length, 0, vis.numSamples));
// else
// remappedShit = Std.int(FlxMath.remapToRange(Conductor.instance.songPosition, 0, vis.snd.length, 0, vis.numSamples));
// var fftSamples:Array<Float> = [];
// var swagBucks = remappedShit;
// for (i in remappedShit...remappedShit + (Std.int((44100 * (1 / 144)))))
// {
// var left = vis.audioData[swagBucks] / 32767;
// var right = vis.audioData[swagBucks + 1] / 32767;
// var balanced = (left + right) / 2;
// swagBucks += 2;
// fftSamples.push(balanced);
// }
// var freqShit = vis.funnyFFT(fftSamples);
// for (i in 0...group.members.length)
// {
// var getSliceShit = function(s:Int) {
// var powShit = FlxMath.remapToRange(s, 0, group.members.length, 0, MathUtil.logBase(10, freqShit[0].length));
// return Math.round(Math.pow(10, powShit));
// };
// // var powShit:Float = getSliceShit(i);
// var hzSliced:Int = getSliceShit(i);
// var sliceLength:Int = Std.int(freqShit[0].length / group.members.length);
// var volSlice = freqShit[0].slice(hzSliced, getSliceShit(i + 1));
// var avgVel:Float = 0;
// for (slice in volSlice)
// {
// avgVel += slice;
// }
// avgVel /= volSlice.length;
// avgVel *= 10000000;
// volumes[i] += avgVel - (elapsed * (volumes[i] * 50));
// var animFrame:Int = Std.int(volumes[i]);
// animFrame = Math.floor(Math.min(5, animFrame));
// animFrame = Math.floor(Math.max(0, animFrame));
// animFrame = Std.int(Math.abs(animFrame - 5)); // shitty dumbass flip, cuz dave got da shit backwards lol!
// group.members[i].animation.curAnim.curFrame = animFrame;
// if (FlxG.keys.justPressed.U)
// {
// trace(avgVel);
// trace(group.members[i].animation.curAnim.curFrame);
// }
// }
// // group.members[0].animation.curAnim.curFrame =
// }
// }
// }
// public function updateViz()
// {
// if (vis.snd != null)
// {
// var remappedShit:Int = 0;
// vis.checkAndSetBuffer();
// if (vis.setBuffer)
// {
// // var startingSample:Int = Std.int(FlxMath.remapToRange)
// if (vis.snd.playing) remappedShit = Std.int(FlxMath.remapToRange(vis.snd.time, 0, vis.snd.length, 0, vis.numSamples));
// for (i in 0...group.members.length)
// {
// var sampleApprox:Int = Std.int(FlxMath.remapToRange(i, 0, group.members.length, remappedShit, remappedShit + 500));
// var left = vis.audioData[sampleApprox] / 32767;
// var animFrame:Int = Std.int(FlxMath.remapToRange(left, -1, 1, 0, 6));
// group.members[i].animation.curAnim.curFrame = animFrame;
// }
// }
// }
// }
/**
* Explicitly define the default levels to draw when the analyzer is not available.
* @return Array<Bar>
*/
static function getDefaultLevels():Array<Bar>
{
var result:Array<Bar> = [];
for (i in 0...BAR_COUNT)
{
result.push({value: 0, peak: 0.0});
}
return result;
}
}

View file

@ -4,7 +4,7 @@ import flixel.math.FlxMath;
import flixel.math.FlxPoint;
import flixel.sound.FlxSound;
import flixel.util.FlxColor;
import funkin.audio.visualize.VisShit;
import funkin.audio.visualize.VisShit.CurAudioInfo;
import funkin.graphics.rendering.MeshRender;
import lime.utils.Int16Array;

View file

@ -3,11 +3,12 @@ package funkin.audio.visualize;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.sound.FlxSound;
@:nullSafety
class PolygonVisGroup extends FlxTypedGroup<PolygonSpectogram>
{
public var playerVis:PolygonSpectogram;
public var opponentVis:PolygonSpectogram;
public var instVis:PolygonSpectogram;
public var playerVis:Null<PolygonSpectogram>;
public var opponentVis:Null<PolygonSpectogram>;
public var instVis:Null<PolygonSpectogram>;
public function new()
{
@ -99,8 +100,14 @@ class PolygonVisGroup extends FlxTypedGroup<PolygonSpectogram>
public override function destroy():Void
{
playerVis.destroy();
opponentVis.destroy();
if (playerVis != null)
{
playerVis.destroy();
}
if (opponentVis != null)
{
opponentVis.destroy();
}
super.destroy();
}
}

View file

@ -4,6 +4,7 @@ package funkin.audio.visualize.dsp;
Complex number representation.
**/
@:forward(real, imag) @:notNull @:pure
@:nullSafety
abstract Complex({
final real:Float;
final imag:Float;

View file

@ -8,6 +8,7 @@ using funkin.audio.visualize.dsp.Signal;
/**
Fast/Finite Fourier Transforms.
**/
@:nullSafety
class FFT
{
/**

View file

@ -6,6 +6,7 @@ package funkin.audio.visualize.dsp;
Usages include 1-indexed sequences or zero-centered buffers with negative indexing.
**/
@:forward(array, offset)
@:nullSafety
abstract OffsetArray<T>({
final array:Array<T>;
final offset:Int;

View file

@ -5,12 +5,13 @@ using Lambda;
/**
Signal processing miscellaneous utilities.
**/
@:nullSafety
class Signal
{
/**
Returns a smoothed version of the input array using a moving average.
**/
public static function smooth(y:Array<Float>, n:Int):Array<Float>
public static function smooth(y:Array<Float>, n:Int):Null<Array<Float>>
{
if (n <= 0)
{

View file

@ -243,9 +243,10 @@ class WaveformDataChannel
}
/**
* Retrieve a given minimum point at an index.
* @param i Index
* @return minimum point at an index.
*/
public function minSample(i:Int)
public function minSample(i:Int):Int
{
var offset = (i * parent.channels + this.channelId) * 2;
return inline parent.get(offset);

View file

@ -1,7 +1,6 @@
package funkin.audio.waveform;
import funkin.util.TimerUtil;
@:nullSafety
class WaveformDataParser
{
static final INT16_MAX:Int = 32767;
@ -10,7 +9,7 @@ class WaveformDataParser
static final INT8_MAX:Int = 127;
static final INT8_MIN:Int = -128;
public static function interpretFlxSound(sound:flixel.sound.FlxSound):Null<WaveformData>
public static function interpretFlxSound(sound:Null<flixel.sound.FlxSound>):Null<WaveformData>
{
if (sound == null) return null;
@ -44,73 +43,58 @@ class WaveformDataParser
public static function interpretAudioBuffer(soundBuffer:lime.media.AudioBuffer):Null<WaveformData>
{
var sampleRate = soundBuffer.sampleRate;
var channels = soundBuffer.channels;
var bitsPerSample = soundBuffer.bitsPerSample;
var samplesPerPoint:Int = 256; // I don't think we need to configure this.
var pointsPerSecond:Float = sampleRate / samplesPerPoint; // 172 samples per second for most songs is plenty precise while still being performant..
// TODO: Make this work better on HTML5.
var soundData:lime.utils.Int16Array = cast soundBuffer.data;
var soundDataRawLength:Int = soundData.length;
var soundDataSampleCount:Int = Std.int(Math.ceil(soundDataRawLength / channels / (bitsPerSample == 16 ? 2 : 1)));
var soundDataSampleCount:Int = Std.int(Math.ceil(soundData.length / channels / (bitsPerSample == 16 ? 2 : 1)));
var outputPointCount:Int = Std.int(Math.ceil(soundDataSampleCount / samplesPerPoint));
// trace('Interpreting audio buffer:');
// trace(' sampleRate: ${sampleRate}');
// trace(' channels: ${channels}');
// trace(' bitsPerSample: ${bitsPerSample}');
// trace(' samplesPerPoint: ${samplesPerPoint}');
// trace(' pointsPerSecond: ${pointsPerSecond}');
// trace(' soundDataRawLength: ${soundDataRawLength}');
// trace(' soundDataSampleCount: ${soundDataSampleCount}');
// trace(' soundDataRawLength/4: ${soundDataRawLength / 4}');
// trace(' outputPointCount: ${outputPointCount}');
// Pre-allocate Vector with exact final size for better performance and memory efficiency
var outputDataLength:Int = outputPointCount * channels * 2;
var outputData = new haxe.ds.Vector<Int>(outputDataLength);
var minSampleValue:Int = bitsPerSample == 16 ? INT16_MIN : INT8_MIN;
var maxSampleValue:Int = bitsPerSample == 16 ? INT16_MAX : INT8_MAX;
var outputData:Array<Int> = [];
var perfStart:Float = TimerUtil.start();
// Reusable min/max tracking arrays to avoid allocation in the loop
var minValues = new haxe.ds.Vector<Int>(channels);
var maxValues = new haxe.ds.Vector<Int>(channels);
for (pointIndex in 0...outputPointCount)
{
// minChannel1, maxChannel1, minChannel2, maxChannel2, ...
var values:Array<Int> = [];
var rangeStart:Int = pointIndex * samplesPerPoint;
var rangeEnd:Int = Std.int(Math.min(rangeStart + samplesPerPoint, soundDataSampleCount));
// Reset min/max values for this range
for (i in 0...channels)
{
values.push(bitsPerSample == 16 ? INT16_MAX : INT8_MAX);
values.push(bitsPerSample == 16 ? INT16_MIN : INT8_MIN);
minValues[i] = bitsPerSample == 16 ? INT16_MAX : INT8_MAX;
maxValues[i] = bitsPerSample == 16 ? INT16_MIN : INT8_MIN;
}
var rangeStart = pointIndex * samplesPerPoint;
var rangeEnd = rangeStart + samplesPerPoint;
if (rangeEnd > soundDataSampleCount) rangeEnd = soundDataSampleCount;
// Process all samples in this range
for (sampleIndex in rangeStart...rangeEnd)
{
for (channelIndex in 0...channels)
{
var sampleIndex:Int = sampleIndex * channels + channelIndex;
var sampleValue = soundData[sampleIndex];
var sampleValue:Int = soundData[sampleIndex * channels + channelIndex];
if (sampleValue < values[channelIndex * 2]) values[(channelIndex * 2)] = sampleValue;
if (sampleValue > values[channelIndex * 2 + 1]) values[(channelIndex * 2) + 1] = sampleValue;
if (sampleValue < minValues[channelIndex]) minValues[channelIndex] = sampleValue;
if (sampleValue > maxValues[channelIndex]) maxValues[channelIndex] = sampleValue;
}
}
// We now have the min and max values for the range.
for (value in values)
outputData.push(value);
// Write directly to final positions in output Vector
var baseIndex:Int = pointIndex * channels * 2;
for (channelIndex in 0...channels)
{
outputData[baseIndex + channelIndex * 2] = minValues[channelIndex];
outputData[baseIndex + channelIndex * 2 + 1] = maxValues[channelIndex];
}
}
var outputDataLength:Int = Std.int(outputData.length / channels / 2);
var result = new WaveformData(null, channels, sampleRate, samplesPerPoint, bitsPerSample, outputPointCount, outputData);
trace('[WAVEFORM] Interpreted audio buffer in ${TimerUtil.seconds(perfStart)}.');
var result = new WaveformData(null, channels, soundBuffer.sampleRate, samplesPerPoint, bitsPerSample, outputPointCount, outputData.toArray());
return result;
}

View file

@ -15,7 +15,9 @@ typedef EntryConstructorFunction = String->Void;
* @param T The type to construct. Must implement `IRegistryEntry`.
* @param J The type of the JSON data used when constructing.
*/
@:nullSafety
@:generic
@:autoBuild(funkin.util.macro.DataRegistryMacro.buildRegistry())
abstract class BaseRegistry<T:(IRegistryEntry<J> & Constructible<EntryConstructorFunction>), J>
{
/**
@ -114,7 +116,7 @@ abstract class BaseRegistry<T:(IRegistryEntry<J> & Constructible<EntryConstructo
{
try
{
var entry:T = createEntry(entryId);
var entry:Null<T> = createEntry(entryId);
if (entry != null)
{
trace(' Loaded entry data: ${entry}');
@ -164,7 +166,7 @@ abstract class BaseRegistry<T:(IRegistryEntry<J> & Constructible<EntryConstructo
* @param id The ID of the entry.
* @return The class name, or `null` if it does not exist.
*/
public function getScriptedEntryClassName(id:String):String
public function getScriptedEntryClassName(id:String):Null<String>
{
return scriptedEntryIds.get(id);
}
@ -189,6 +191,19 @@ abstract class BaseRegistry<T:(IRegistryEntry<J> & Constructible<EntryConstructo
return entries.get(id);
}
/**
* A list of all entries included in the base game.
* The actual function exists and is auto-generated on each registry at build time.
* @return Array<String>
*/
// public function listBaseGameEntryIds():Array<String> {}
/**
* A list of all entries that are not included in the base game.
* @return Array<String>
*/
// public function listModdedEntryIds():Array<String> {}
public function toString():String
{
return 'Registry(' + registryId + ', ${countEntries()} entries)';
@ -202,7 +217,7 @@ abstract class BaseRegistry<T:(IRegistryEntry<J> & Constructible<EntryConstructo
public function fetchEntryVersion(id:String):Null<thx.semver.Version>
{
var entryStr:String = loadEntryFile(id).contents;
var entryVersion:thx.semver.Version = VersionUtil.getVersionFromJSON(entryStr);
var entryVersion:Null<thx.semver.Version> = VersionUtil.getVersionFromJSON(entryStr);
return entryVersion;
}

View file

@ -4,6 +4,7 @@ import json2object.Position;
import json2object.Position.Line;
import json2object.Error;
@:nullSafety
class DataError
{
public static function printError(error:Error):Void

View file

@ -19,6 +19,7 @@ import thx.semver.VersionRule;
*
* Functions must be of the signature `(hxjsonast.Json, String) -> T`, where the String is the property name and `T` is the type of the property.
*/
@:nullSafety
class DataParse
{
/**
@ -146,7 +147,6 @@ class DataParse
throw 'Expected Backdrop property $name to be specify a valid "type", but it was "${backdropType}".';
}
return null;
default:
throw 'Expected property $name to be an object, but it was ${json.value}.';
}
@ -310,6 +310,7 @@ class DataParse
var length:Null<Float> = values[2] == null ? null : Tools.getValue(values[2]);
var alt:Null<Bool> = values[3] == null ? null : Tools.getValue(values[3]);
if (time == null || data == null) throw 'Property $name note is missing time and/or data values.';
return new LegacyNote(time, data, length, alt);
// return null;
default:

View file

@ -12,6 +12,7 @@ import haxe.ds.Either;
*
* NOTE: Result must include quotation marks if the value is a string! json2object will not add them for you!
*/
@:nullSafety
class DataWrite
{
/**

View file

@ -0,0 +1,9 @@
package funkin.data;
/**
* An interface which automatically implements essential fields for a class extending `BaseRegistry`.
*
* @see `funkin.data.BaseRegistry`
*/
@:autoBuild(funkin.util.macro.RegistryMacro.buildRegistry())
interface DefaultRegistryImpl {}

View file

@ -5,6 +5,7 @@ package funkin.data;
* A `String->Void` constructor is also mandatory, but enforced elsewhere.
* @param T The JSON data type of the registry entry.
*/
@:autoBuild(funkin.util.macro.RegistryMacro.buildEntry())
interface IRegistryEntry<T>
{
public final id:String;

View file

@ -1,8 +1,9 @@
package funkin.data.animation;
@:nullSafety
class AnimationDataUtil
{
public static function toNamed(data:UnnamedAnimationData, ?name:String = ""):AnimationData
public static function toNamed(data:UnnamedAnimationData, name:String = ""):AnimationData
{
return {
name: name,
@ -17,6 +18,16 @@ class AnimationDataUtil
};
}
/**
* @param data
* @param name (adds index to name)
* @return Array<AnimationData>
*/
public static function toNamedArray(data:Array<UnnamedAnimationData>, name:String = ""):Array<AnimationData>
{
return data.mapi(function(animItem, ind) return toNamed(animItem, '$name$ind'));
}
public static function toUnnamed(data:AnimationData):UnnamedAnimationData
{
return {
@ -30,6 +41,11 @@ class AnimationDataUtil
frameIndices: data.frameIndices
};
}
public static function toUnnamedArray(data:Array<AnimationData>):Array<UnnamedAnimationData>
{
return data.map(toUnnamed);
}
}
/**

View file

@ -2,8 +2,11 @@ package funkin.data.dialogue.conversation;
import funkin.play.cutscene.dialogue.Conversation;
import funkin.play.cutscene.dialogue.ScriptedConversation;
import funkin.util.tools.ISingleton;
import funkin.data.DefaultRegistryImpl;
class ConversationRegistry extends BaseRegistry<Conversation, ConversationData>
@:nullSafety
class ConversationRegistry extends BaseRegistry<Conversation, ConversationData> implements ISingleton implements DefaultRegistryImpl
{
/**
* The current version string for the dialogue box data format.
@ -14,74 +17,8 @@ class ConversationRegistry extends BaseRegistry<Conversation, ConversationData>
public static final CONVERSATION_DATA_VERSION_RULE:thx.semver.VersionRule = "1.0.x";
public static var instance(get, never):ConversationRegistry;
static var _instance:Null<ConversationRegistry> = null;
static function get_instance():ConversationRegistry
{
if (_instance == null) _instance = new ConversationRegistry();
return _instance;
}
public function new()
{
super('CONVERSATION', 'dialogue/conversations', CONVERSATION_DATA_VERSION_RULE);
}
/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<ConversationData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<ConversationData>();
parser.ignoreUnknownVariables = false;
switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}
if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}
/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<ConversationData>
{
var parser = new json2object.JsonParser<ConversationData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);
if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}
function createScriptedEntry(clsName:String):Conversation
{
return ScriptedConversation.init(clsName, "unknown");
}
function getScriptedClassNames():Array<String>
{
return ScriptedConversation.listScriptClasses();
}
}

View file

@ -3,8 +3,11 @@ package funkin.data.dialogue.dialoguebox;
import funkin.play.cutscene.dialogue.DialogueBox;
import funkin.data.dialogue.dialoguebox.DialogueBoxData;
import funkin.play.cutscene.dialogue.ScriptedDialogueBox;
import funkin.util.tools.ISingleton;
import funkin.data.DefaultRegistryImpl;
class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData>
@:nullSafety
class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData> implements ISingleton implements DefaultRegistryImpl
{
/**
* The current version string for the dialogue box data format.
@ -13,76 +16,10 @@ class DialogueBoxRegistry extends BaseRegistry<DialogueBox, DialogueBoxData>
*/
public static final DIALOGUEBOX_DATA_VERSION:thx.semver.Version = "1.1.0";
public static final DIALOGUEBOX_DATA_VERSION_RULE:thx.semver.VersionRule = "1.1.x";
public static var instance(get, never):DialogueBoxRegistry;
static var _instance:Null<DialogueBoxRegistry> = null;
static function get_instance():DialogueBoxRegistry
{
if (_instance == null) _instance = new DialogueBoxRegistry();
return _instance;
}
public static final DIALOGUEBOX_DATA_VERSION_RULE:thx.semver.VersionRule = ">=1.0.0 <1.2.0";
public function new()
{
super('DIALOGUEBOX', 'dialogue/boxes', DIALOGUEBOX_DATA_VERSION_RULE);
}
/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<DialogueBoxData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<DialogueBoxData>();
parser.ignoreUnknownVariables = false;
switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}
if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}
/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<DialogueBoxData>
{
var parser = new json2object.JsonParser<DialogueBoxData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);
if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}
function createScriptedEntry(clsName:String):DialogueBox
{
return ScriptedDialogueBox.init(clsName, "unknown");
}
function getScriptedClassNames():Array<String>
{
return ScriptedDialogueBox.listScriptClasses();
}
}

View file

@ -1,10 +1,12 @@
package funkin.data.dialogue.speaker;
import funkin.play.cutscene.dialogue.Speaker;
import funkin.data.dialogue.speaker.SpeakerData;
import funkin.play.cutscene.dialogue.ScriptedSpeaker;
import funkin.util.tools.ISingleton;
import funkin.data.DefaultRegistryImpl;
class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData>
@:nullSafety
class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData> implements ISingleton implements DefaultRegistryImpl
{
/**
* The current version string for the speaker data format.
@ -15,74 +17,8 @@ class SpeakerRegistry extends BaseRegistry<Speaker, SpeakerData>
public static final SPEAKER_DATA_VERSION_RULE:thx.semver.VersionRule = "1.0.x";
public static var instance(get, never):SpeakerRegistry;
static var _instance:Null<SpeakerRegistry> = null;
static function get_instance():SpeakerRegistry
{
if (_instance == null) _instance = new SpeakerRegistry();
return _instance;
}
public function new()
{
super('SPEAKER', 'dialogue/speakers', SPEAKER_DATA_VERSION_RULE);
}
/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
*/
public function parseEntryData(id:String):Null<SpeakerData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser = new json2object.JsonParser<SpeakerData>();
parser.ignoreUnknownVariables = false;
switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}
if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}
/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<SpeakerData>
{
var parser = new json2object.JsonParser<SpeakerData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);
if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}
function createScriptedEntry(clsName:String):Speaker
{
return ScriptedSpeaker.init(clsName, "unknown");
}
function getScriptedClassNames():Array<String>
{
return ScriptedSpeaker.listScriptClasses();
}
}

View file

@ -1,7 +1,6 @@
package funkin.data.event;
import funkin.play.event.SongEvent;
import funkin.data.event.SongEventSchema;
import funkin.data.song.SongData.SongEventData;
import funkin.util.macro.ClassMacro;
import funkin.play.event.ScriptedSongEvent;
@ -9,6 +8,7 @@ import funkin.play.event.ScriptedSongEvent;
/**
* This class statically handles the parsing of internal and scripted song event handlers.
*/
@:nullSafety
class SongEventRegistry
{
/**
@ -88,14 +88,14 @@ class SongEventRegistry
return eventCache.values();
}
public static function getEvent(id:String):SongEvent
public static function getEvent(id:String):Null<SongEvent>
{
return eventCache.get(id);
}
public static function getEventSchema(id:String):SongEventSchema
public static function getEventSchema(id:String):Null<SongEventSchema>
{
var event:SongEvent = getEvent(id);
var event:Null<SongEvent> = getEvent(id);
if (event == null) return null;
return event.getEventSchema();
@ -109,7 +109,7 @@ class SongEventRegistry
public static function handleEvent(data:SongEventData):Void
{
var eventKind:String = data.eventKind;
var eventHandler:SongEvent = eventCache.get(eventKind);
var eventHandler:Null<SongEvent> = eventCache.get(eventKind);
if (eventHandler != null)
{

View file

@ -1,11 +1,5 @@
package funkin.data.event;
import funkin.play.event.SongEvent;
import funkin.data.event.SongEventSchema;
import funkin.data.song.SongData.SongEventData;
import funkin.util.macro.ClassMacro;
import funkin.play.event.ScriptedSongEvent;
@:forward(name, title, type, keys, min, max, step, units, defaultValue, iterator)
abstract SongEventSchema(SongEventSchemaRaw)
{

View file

@ -36,6 +36,13 @@ typedef AlbumData =
*/
public var albumTitleAsset:String;
/**
* Offsets for the album title.
*/
@:optional
@:default([0, 0])
public var albumTitleOffsets:Null<Array<Float>>;
/**
* An optional array of animations for the album title.
*/

View file

@ -3,8 +3,11 @@ package funkin.data.freeplay.album;
import funkin.ui.freeplay.Album;
import funkin.data.freeplay.album.AlbumData;
import funkin.ui.freeplay.ScriptedAlbum;
import funkin.util.tools.ISingleton;
import funkin.data.DefaultRegistryImpl;
class AlbumRegistry extends BaseRegistry<Album, AlbumData>
@:nullSafety
class AlbumRegistry extends BaseRegistry<Album, AlbumData> implements ISingleton implements DefaultRegistryImpl
{
/**
* The current version string for the album data format.
@ -15,70 +18,8 @@ class AlbumRegistry extends BaseRegistry<Album, AlbumData>
public static final ALBUM_DATA_VERSION_RULE:thx.semver.VersionRule = '1.0.x';
public static final instance:AlbumRegistry = new AlbumRegistry();
public function new()
{
super('ALBUM', 'ui/freeplay/albums', ALBUM_DATA_VERSION_RULE);
}
/**
* Read, parse, and validate the JSON data and produce the corresponding data object.
* @param id The ID of the entry to load.
* @return The parsed data object.
*/
public function parseEntryData(id:String):Null<AlbumData>
{
// JsonParser does not take type parameters,
// otherwise this function would be in BaseRegistry.
var parser:json2object.JsonParser<AlbumData> = new json2object.JsonParser<AlbumData>();
parser.ignoreUnknownVariables = false;
switch (loadEntryFile(id))
{
case {fileName: fileName, contents: contents}:
parser.fromJson(contents, fileName);
default:
return null;
}
if (parser.errors.length > 0)
{
printErrors(parser.errors, id);
return null;
}
return parser.value;
}
/**
* Parse and validate the JSON data and produce the corresponding data object.
*
* NOTE: Must be implemented on the implementation class.
* @param contents The JSON as a string.
* @param fileName An optional file name for error reporting.
* @return The parsed data object.
*/
public function parseEntryDataRaw(contents:String, ?fileName:String):Null<AlbumData>
{
var parser:json2object.JsonParser<AlbumData> = new json2object.JsonParser<AlbumData>();
parser.ignoreUnknownVariables = false;
parser.fromJson(contents, fileName);
if (parser.errors.length > 0)
{
printErrors(parser.errors, fileName);
return null;
}
return parser.value;
}
function createScriptedEntry(clsName:String):Album
{
return ScriptedAlbum.init(clsName, 'unknown');
}
function getScriptedClassNames():Array<String>
{
return ScriptedAlbum.listScriptClasses();
}
}

View file

@ -5,5 +5,10 @@ All notable changes to this project 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).
## [1.0.1]
### Added
- Added `stickerPack` to specify which sticker pack to use when transitioning into and out of song featuring this character.
- If the value isn't present, it will use a default sticker pack instead.
## [1.0.0]
Initial release.

View file

@ -31,6 +31,15 @@ class PlayerData
@:default(false)
public var showUnownedChars:Bool = false;
/**
* The default sticker pack to use for songs featuring this playable character.
* Can be overridden by specific songs.
* @default `default`
*/
@:optional
@:default(funkin.util.Constants.DEFAULT_STICKER_PACK)
public var stickerPack:String = Constants.DEFAULT_STICKER_PACK;
/**
* Which freeplay style to use for this character.
*/
@ -325,12 +334,20 @@ typedef PlayerResultsAnimationData =
*/
var renderType:String;
var assetPath:String;
@:optional
var assetPath:Null<String>;
@:optional
var scriptClass:Null<String>;
@:optional
@:default([0, 0])
var offsets:Array<Float>;
@:optional
@:default("both")
var filter:String;
@:optional
@:default(500)
var zIndex:Int;
@ -347,6 +364,10 @@ typedef PlayerResultsAnimationData =
@:default('')
var startFrameLabel:Null<String>;
@:optional
@:default('')
var sound:Null<String>;
@:optional
@:default(true)
var looped:Bool;

Some files were not shown because too many files have changed in this diff Show more