Compare commits

...
14 Commits
Author SHA1 Message Date
Hundrec b4e52df156 3
Build and Upload nightly game builds / gather-changes (push) Canceled after 0s
Build and Upload nightly game builds / gather-tags (push) Canceled after 0s
Build and Upload nightly game builds / build-game-on-host (macos, macos) (push) Canceled after 0s
Build and Upload nightly game builds / build-game-on-host (windows, windows) (push) Canceled after 0s
Build and Upload nightly game builds / docker-image (push) Canceled after 0s
Build and Upload nightly game builds / build-game-in-container (html5) (push) Canceled after 0s
Build and Upload nightly game builds / build-game-in-container (linux) (push) Canceled after 0s
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_andHundrec fb6d1b36d3 lasercar................................................................................................................................................................................................. 2025-07-22 07:43:15 +08:00
MoonDroidandCameron Taylor 0c0c63bc03 fix: Move hasInitialized to onPurchasesUpdate instead. 2025-07-21 19:08:14 -04:00
Hyper_andHundrec 01620fda9b The most deranged line loss of all time 2025-07-22 06:41:46 +08:00
cherryandHundrec 3bcd6813c1 Clear key from correct map 2025-07-22 06:12:56 +08:00
sector-aandCameron Taylor d44966efd2 Prevent AA calculations if AA_STAGES are 0 in DropShadow shaders 2025-07-21 18:02:18 -04:00
79c3e2de11 assets ref
Co-authored-by: MoonDroid <81515012+moondroidcoder@users.noreply.github.com>
2025-07-22 04:50:15 +07:00
Karim AkraandHundrec 8372d47d11 Fixed the menu item getting disabled if you hit back during the transition 2025-07-22 05:21:40 +08:00
MoonDroidandHundrec d89ebdf58f Attempt to fix the soft lock issue for Main Menu. 2025-07-22 05:21:40 +08:00
kade-githubandsector-a 1e8c472084 holy shit 2025-07-21 23:16:43 +03:00
kade-githubandsector-a 17cef6f897 fix for winblows 2025-07-21 23:16:43 +03:00
kade-githubandsector-a 2cc43ee1f6 text fix for my mobile fellas 2025-07-21 23:16:43 +03:00
EricandHundrec 2277acccfa Update hmm.json 2025-07-22 04:00:29 +08:00
15 changed files with 83 additions and 26 deletions
+20
View File
@@ -4,6 +4,26 @@ All notable changes will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.7.3] - 2025-07-21
### Fixed
- Fixed stuttering throughout the game caused by the Polymod upgrade. (Thanks NotHyper-474!)
- [MOBILE] Fixed buttons in the Main Menu not working.
- [iOS] The Upgrade button no longer appears if you have already purchased it (actually this time).
- Fixed the countdown overlapping itself when restarting the song. (Thanks NotHyper-474!)
- Optimized the Week 6 Erect stage.
- Fixed an oversight when clearing the cache. (Thanks cherrythecool!)
- The Input Offset Test menu text now displays in the correct position.
- Fixed script errors appearing in the Week 3 Erect stage.
- Fixed adding variations in the Chart Editor erasing difficulties. (Thanks NotHyper-474!)
## New Contributors for 0.7.3
* @cherrythecool made their first contribution in [#5458](https://github.com/FunkinCrew/Funkin/pull/5458)
## [0.7.2] - 2025-07-18
### Added
+1 -1
Submodule assets updated: 2546f94b8d...69c02fa501
+1 -1
View File
@@ -219,7 +219,7 @@
"name": "polymod",
"type": "git",
"dir": null,
"ref": "3e030c81de99ca84acde681431f806d8103bcf6e",
"ref": "866f19edbcd872b3358f9a41f2f6a24c71c191d1",
"url": "https://github.com/larsiusprime/polymod"
},
{
+1 -1
View File
@@ -29,7 +29,7 @@ class Project extends HXProject
* REMEMBER TO CHANGE THIS WHEN THE GAME UPDATES!
* You only have to change it here, the rest of the game will query this value.
*/
static final VERSION:String = "0.7.2";
static final VERSION:String = "0.7.3";
/**
* The build's number and version code.
+1 -1
View File
@@ -350,7 +350,7 @@ class FunkinMemory
if (sound != null)
{
Assets.cache.removeSound(key);
previousCachedTextures.remove(key);
previousCachedSounds.remove(key);
}
}
Assets.cache.clear("songs");
@@ -37,7 +37,7 @@ class FNFLegacyImporter
{
trace('Migrating song metadata from FNF Legacy.');
var songMetadata:SongMetadata = new SongMetadata('Import', Constants.DEFAULT_ARTIST, 'default');
var songMetadata:SongMetadata = new SongMetadata('Import', Constants.DEFAULT_ARTIST, Constants.DEFAULT_CHARTER, Constants.DEFAULT_VARIATION);
// Set generatedBy string for debugging.
songMetadata.generatedBy = 'Chart Editor Import (FNF Legacy)';
@@ -24,7 +24,7 @@ class SongDataMigrator
public static function migrate_SongMetadata_v2_1_0(input:SongData_v2_1_0.SongMetadata_v2_1_0):SongMetadata
{
var result:SongMetadata = new SongMetadata(input.songName, input.artist, input.variation);
var result:SongMetadata = new SongMetadata(input.songName, input.artist, Constants.DEFAULT_CHARTER, input.variation);
result.version = SongRegistry.SONG_METADATA_VERSION;
result.timeFormat = input.timeFormat;
result.divisions = input.divisions;
@@ -66,7 +66,7 @@ class SongDataMigrator
public static function migrate_SongMetadata_v2_0_0(input:SongData_v2_0_0.SongMetadata_v2_0_0):SongMetadata
{
var result:SongMetadata = new SongMetadata(input.songName, input.artist, input.variation);
var result:SongMetadata = new SongMetadata(input.songName, input.artist, Constants.DEFAULT_CHARTER, input.variation);
result.version = SongRegistry.SONG_METADATA_VERSION;
result.timeFormat = input.timeFormat;
result.divisions = input.divisions;
@@ -136,6 +136,9 @@ class DropShadowScreenspace extends DropShadowShader
// essentially just stole this from the AngleMask shader but repurposed it to smooth
// the threshold because without any sort of smoothing it produces horrible edges
float antialias(vec2 fragCoord, float curThreshold, bool useMask) {
if (AA_STAGES == 0.0) {
return intensityPass(fragCoord, curThreshold, useMask);
}
// In GLSL 100, we need to use constant loop bounds
// Well assume a reasonable maximum for AA_STAGES and use a fixed loop
@@ -362,6 +362,9 @@ class DropShadowShader extends FlxShader
// essentially just stole this from the AngleMask shader but repurposed it to smooth
// the threshold because without any sort of smoothing it produces horrible edges
float antialias(vec2 fragCoord, float curThreshold, bool useMask) {
if (AA_STAGES == 0.0) {
return intensityPass(fragCoord, curThreshold, useMask);
}
// In GLSL 100, we need to use constant loop bounds
// Well assume a reasonable maximum for AA_STAGES and use a fixed loop
@@ -108,17 +108,21 @@ class InAppPurchasesUtil
IAPAndroid.startConnection();
#else
IAPIOS.onProductDetailsReceived.add(function(productDetails:Array<IAPProductDetails>):Void {
if (productDetails != null) currentProductDetails = productDetails;
hasInitialized = true;
if (productDetails != null)
{
currentProductDetails = productDetails;
}
});
IAPIOS.onProductDetailsFailed.add(function(error:IAPError):Void {
trace('Failed to request product details: "$error"');
hasInitialized = false;
});
IAPIOS.onPurchasesUpdated.add(function(purchases:Array<IAPPurchase>):Void {
handlePurchases(purchases);
trace("iOS purchases updated: " + purchases.length);
hasInitialized = true;
trace("hasInitialized: " + hasInitialized);
});
IAPIOS.init();
+2
View File
@@ -1447,6 +1447,8 @@ class PlayState extends MusicBeatSubState
}
}
if (!vwooshTimer.finished) vwooshTimer.active = false;
// Pause camera tweening, and keep track of which tweens we pause.
if (cameraFollowTween != null && cameraFollowTween.active)
{
@@ -1306,7 +1306,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
var result:Null<SongMetadata> = songMetadata.get(selectedVariation);
if (result == null)
{
result = new SongMetadata('Default Song Name', Constants.DEFAULT_ARTIST, selectedVariation);
result = new SongMetadata('Default Song Name', Constants.DEFAULT_ARTIST, Constants.DEFAULT_CHARTER, selectedVariation);
songMetadata.set(selectedVariation, result);
}
return result;
@@ -580,7 +580,7 @@ class ChartEditorDialogHandler
dialog.hideDialog(DialogButton.CANCEL);
}
var newSongMetadata:SongMetadata = new SongMetadata('', '', Constants.DEFAULT_VARIATION);
var newSongMetadata:SongMetadata = new SongMetadata('', '', '', Constants.DEFAULT_VARIATION);
newSongMetadata.variation = targetVariation;
newSongMetadata.playData.difficulties = (erect) ? ['erect', 'nightmare'] : ['easy', 'normal', 'hard'];
@@ -1219,7 +1219,8 @@ class ChartEditorDialogHandler
var dialogVariationName:Null<TextField> = dialog.findComponent('dialogVariationName', TextField);
if (dialogVariationName == null) throw 'Could not locate dialogVariationName TextField in Add Variation dialog';
var pendingVariation:SongMetadata = new SongMetadata(dialogSongName.text, dialogSongArtist.text, dialogVariationName.text.toLowerCase());
var pendingVariation:SongMetadata = new SongMetadata(dialogSongName.text, dialogSongArtist.text, dialogSongCharter.text,
dialogVariationName.text.toLowerCase());
pendingVariation.playData.stage = dialogStage.value.id;
pendingVariation.playData.noteStyle = dialogNoteStyle.value.id;
+29 -9
View File
@@ -58,7 +58,20 @@ class MainMenuState extends MusicBeatState
var overrideMusic:Bool = false;
var goingToOptions:Bool = false;
var goingBack:Bool = false;
var canInteract:Bool = false;
var canInteract(get, set):Bool;
var _canInteract:Bool = false;
function get_canInteract():Bool
{
return _canInteract;
}
function set_canInteract(value:Bool):Bool
{
_canInteract = value;
trace('canInteract set to: ' + value);
return value;
}
static var rememberedSelectedIndex:Int = 0;
@@ -88,6 +101,7 @@ class MainMenuState extends MusicBeatState
transOut = FlxTransitionableState.defaultTransOut;
#if FEATURE_MOBILE_IAP
trace("hasInitialized: " + InAppPurchasesUtil.hasInitialized);
if (InAppPurchasesUtil.hasInitialized) Preferences.noAds = InAppPurchasesUtil.isPurchased(InAppPurchasesUtil.UPGRADE_PRODUCT_ID);
// If the user is faster than their shit wifi, it gets the saved noAds instead.
hasUpgraded = Preferences.noAds;
@@ -128,7 +142,7 @@ class MainMenuState extends MusicBeatState
add(menuItems);
menuItems.onChange.add(onMenuItemChange);
menuItems.onAcceptPress.add(function(_) {
canInteract = false;
// canInteract = false;
FlxFlicker.flicker(magenta, 1.1, 0.15, false, true);
});
@@ -278,7 +292,7 @@ class MainMenuState extends MusicBeatState
if (!ControlsHandler.usingExternalInputDevice)
{
addOptionsButton(35, FlxG.height - 210, function() {
if (!canInteract) return;
if (!canInteract || menuItems != null && menuItems.busy) return;
trace("OPTIONS: Interact complete.");
startExitState(() -> new funkin.ui.options.OptionsState());
@@ -384,12 +398,18 @@ class MainMenuState extends MusicBeatState
}
#end
super.closeSubState();
canInteract = true;
}
override function finishTransIn():Void
{
super.finishTransIn();
canInteract = true;
if (menuItems != null)
{
menuItems.busy = false;
menuItems.enabled = true;
}
}
function onMenuItemChange(selected:MenuListItem)
@@ -427,6 +447,7 @@ class MainMenuState extends MusicBeatState
function startExitState(state:NextState):Void
{
#if mobile
// This just softlocks the menu items and prevents any further interaction.. needs testing with keyboard.
if (!canInteract && !ControlsHandler.usingExternalInputDevice) return;
#end
@@ -456,6 +477,7 @@ class MainMenuState extends MusicBeatState
new FlxTimer().start(duration, function(_) {
trace('Exiting MainMenuState...');
FlxG.switchState(state);
canInteract = true;
});
}
}
@@ -619,15 +641,13 @@ class MainMenuState extends MusicBeatState
public function goBack():Void
{
if (canInteract)
if (menuItems == null) return;
if (canInteract && !menuItems.busy)
{
trace("BACK: Interact complete.");
canInteract = false;
if (menuItems != null)
{
menuItems.busy = true;
rememberedSelectedIndex = menuItems.selectedIndex;
}
menuItems.busy = true;
rememberedSelectedIndex = menuItems.selectedIndex;
FlxG.switchState(() -> new TitleState());
FunkinSound.playOnce(Paths.sound('cancelMenu'));
}
+8 -4
View File
@@ -353,7 +353,7 @@ class OffsetMenu extends Page<OptionsState.OptionsMenuPageName>
jumpInText.text = 'Hit the notes as they come in!';
#if mobile
if (OptionsState.instance.hitbox != null) OptionsState.instance.hitbox.visible = true;
if (Preferences.controlsScheme == FunkinHitboxControlSchemes.Arrows && !ControlsHandler.usingExternalInputDevice)
if (!ControlsHandler.usingExternalInputDevice)
{
final amplification:Float = (FlxG.width / FlxG.height) / (FlxG.initialWidth / FlxG.initialHeight);
final playerStrumlineScale:Float = ((FlxG.height / FlxG.width) * 1.95) * amplification;
@@ -388,18 +388,22 @@ class OffsetMenu extends Page<OptionsState.OptionsMenuPageName>
canExit = false;
differences = [];
jumpInText.y = testStrumline.y + 175;
jumpInText.y = 350;
#if mobile
if (Preferences.controlsScheme != FunkinHitboxControlSchemes.Arrows || ControlsHandler.usingExternalInputDevice)
if (ControlsHandler.usingExternalInputDevice)
{
#end
testStrumline.y = Preferences.downscroll ? FlxG.height - (testStrumline.height + 45) - Constants.STRUMLINE_Y_OFFSET : (testStrumline.height / 2)
- Constants.STRUMLINE_Y_OFFSET;
if (Preferences.downscroll) jumpInText.y = testStrumline.y - 175;
if (Preferences.downscroll) jumpInText.y = FlxG.height - 425;
testStrumline.isDownscroll = Preferences.downscroll;
#if mobile
}
else
{
jumpInText.y = FlxG.height - 425;
}
#end
});
PreciseInputManager.instance.onInputPressed.add(onKeyPress);