Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4e52df156 | ||
|
|
cf70bf2c6c | ||
|
|
fb6d1b36d3 | ||
|
|
0c0c63bc03 | ||
|
|
01620fda9b | ||
|
|
3bcd6813c1 | ||
|
|
d44966efd2 | ||
|
|
79c3e2de11 | ||
|
|
8372d47d11 | ||
|
|
d89ebdf58f | ||
|
|
1e8c472084 | ||
|
|
17cef6f897 | ||
|
|
2cc43ee1f6 | ||
|
|
2277acccfa |
@@ -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
@@ -219,7 +219,7 @@
|
||||
"name": "polymod",
|
||||
"type": "git",
|
||||
"dir": null,
|
||||
"ref": "3e030c81de99ca84acde681431f806d8103bcf6e",
|
||||
"ref": "866f19edbcd872b3358f9a41f2f6a24c71c191d1",
|
||||
"url": "https://github.com/larsiusprime/polymod"
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user