Merge pull request #590 from FunkinCrew/bugfix/may-31st-fixes

May 31st chart fixes
This commit is contained in:
Cameron Taylor 2024-06-01 16:25:08 -04:00 committed by GitHub
commit 26d19abaab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 98 additions and 17 deletions

View file

@ -6,31 +6,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [0.4.0] - 2024-05-?? ## [0.4.0] - 2024-05-??
### Added ### Added
- 2 new Erect remixes, Eggnog and Satin Panties. Check them out from - 2 new Erect remixes, Eggnog and Satin Panties. Check them out from the Freeplay menu!
- Improvements to the Freeplay screen, with song difficulty ratings and player rank displays. - Major visual improvements to the Results screen, with additional animations and audio based on your performance.
- Reworked the Results screen, with additional animations and audio based on your performance. - Major visual improvements to the Freeplay screen, with song difficulty ratings and player rank displays.
- Freeplay now plays a preview of songs when you hover over them.
- Added a Charter field to the chart format, to allow for crediting the creator of a level's chart. - Added a Charter field to the chart format, to allow for crediting the creator of a level's chart.
- You can see who charted a song from the Pause menu. - You can see who charted a song from the Pause menu.
- Added a new Scroll Speed chart event to change the note speed mid-song (thanks )
### Changed ### Changed
- Tweaked the charts for several songs: - Tweaked the charts for several songs:
- Monster
- Winter Horrorland - Winter Horrorland
- Stress - Stress
- Lit Up - Lit Up
- Tutorial (increased the note speed slightly)
- Senpai (increased the note speed)
- Thorns (increased the note speed slightly)
- Favorite songs marked in Freeplay are now stored between sessions.
- Custom note styles are now properly supported for songs; add new notestyles via JSON, then select it for use from the Chart Editor Metadata toolbox. (thanks Keoiki!) - Custom note styles are now properly supported for songs; add new notestyles via JSON, then select it for use from the Chart Editor Metadata toolbox. (thanks Keoiki!)
- Improved logic for NoteHitScriptEvents, allowing you to view the hit diff and modify whether a note hit is a combo break (thanks nebulazorua!)
- Health icons now support a Winning frame without requiring a spritesheet, simply include a third frame in the icon file. (thanks gamerbross!) - Health icons now support a Winning frame without requiring a spritesheet, simply include a third frame in the icon file. (thanks gamerbross!)
- Remember that for more complex behaviors such as animations or transitions, you should use an XML file to define each frame. - Remember that for more complex behaviors such as animations or transitions, you should use an XML file to define each frame.
### Fixed ### Fixed
- Fixed a bug where the game would silently fail to load saves on HTML5
- Fixed some bugs with the props on the Story Menu not bopping properly
- Additional fixes to the Loading bar on HTML5 (thanks lemz1!)
- Fixed several bugs with the TitleState, including missing music when returning from the Main Menu (thanks gamerbross!)
- Fixed a camera bug in the Main Menu (thanks richTrash21!)
- Fixed a bug where changing difficulties in Story mode wouldn't update the score (thanks sectorA!)
- Fixed a crash in Freeplay caused by a level referencing an invalid song (thanks gamerbross!)
- Fixed a bug where pressing the volume keys would stop the Toy commercial (thanks gamerbross!) - Fixed a bug where pressing the volume keys would stop the Toy commercial (thanks gamerbross!)
- Fixed a bug where the Chart Editor would crash when losing (thanks gamerbross!) - Fixed a bug where the Chart Editor Playtest would crash when losing (thanks gamerbross!)
- Fixed a bug where hold notes would display improperly in the Chart Editor when downscroll was enabled for gameplay (thanks gamerbross!)
- Fixed a bug where hold notes would be positioned wrong on downscroll (thanks MaybeMaru!)
- Removed a large number of unused imports to optimize builds (thanks Ethan-makes-music!)
- Improved debug logging for unscripted stages (thanks gamerbross!)
- Made improvements to compiling documentation (thanks gedehari!) - Made improvements to compiling documentation (thanks gedehari!)
- Fixed a crash on Linux caused by an old version of hxCodec (thanks Noobz4Life!) - Fixed a crash on Linux caused by an old version of hxCodec (thanks Noobz4Life!)
- Optimized animation handling for characters (thanks richTrash21!) - Optimized animation handling for characters (thanks richTrash21!)
- Additional bug fixes and optimizations.
## [0.3.3] - 2024-05-14 ## [0.3.3] - 2024-05-14
### Changed ### Changed
- Cleaned up some code in `PlayAnimationSongEvent.hx` (thanks BurgerBalls!) - Cleaned up some code in `PlayAnimationSongEvent.hx` (thanks BurgerBalls!)
### Fixed ### Fixed
- Fix Web Loading Bar (thanks lemz1!) - Fixes to the Loading bar on HTML5 (thanks lemz1!)
- Don't allow any more inputs when exiting freeplay (thanks gamerbros!) - Don't allow any more inputs when exiting freeplay (thanks gamerbros!)
- Fixed using mouse wheel to scroll on freeplay (thanks JugieNoob!) - Fixed using mouse wheel to scroll on freeplay (thanks JugieNoob!)
- Fixed the reset's of the health icons, score, and notes when re-entering gameplay from gameover (thanks ImCodist!) - Fixed the reset's of the health icons, score, and notes when re-entering gameplay from gameover (thanks ImCodist!)
@ -38,11 +58,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fixed camera stutter once a wipe transition to the Main Menu completes (thanks ImCodist!) - Fixed camera stutter once a wipe transition to the Main Menu completes (thanks ImCodist!)
- Fixed an issue where hold note would be invisible for a single frame (thanks ImCodist!) - Fixed an issue where hold note would be invisible for a single frame (thanks ImCodist!)
- Fix tween accumulation on title screen when pressing Y multiple times (thanks TheGaloXx!) - Fix tween accumulation on title screen when pressing Y multiple times (thanks TheGaloXx!)
- Fix for a game over easter egg so you don't accidentally exit it when viewing
- Fix a crash when querying FlxG.state in the crash handler - Fix a crash when querying FlxG.state in the crash handler
- Fix for a game over easter egg so you don't accidentally exit it when viewing
- Fix an issue where the Freeplay menu never displays 100% clear - Fix an issue where the Freeplay menu never displays 100% clear
- Fix an issue where Weekend 1 Pico attempted to retrieve a missing asset.
- Fix an issue where duplicate keybinds would be stoed, potentially causing a crash
- Chart debug key now properly returns you to the previous chart editor session if you were playtesting a chart (thanks nebulazorua!) - Chart debug key now properly returns you to the previous chart editor session if you were playtesting a chart (thanks nebulazorua!)
- Hopefully fixed Freeplay crashes on AMD gpu's - Fix a crash on Freeplay found on AMD graphics cards
## [0.3.2] - 2024-05-03 ## [0.3.2] - 2024-05-03
### Added ### Added

2
assets

@ -1 +1 @@
Subproject commit 7a0d92d3007de42c452b2ea97a917d8c8d114ee7 Subproject commit 3bfa4e3da87713ea651f60d4f898c283e5d86093

View file

@ -56,6 +56,8 @@ class SongMetadata implements ICloneable<SongMetadata>
@:default(funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY) @:default(funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY)
public var generatedBy:String; public var generatedBy:String;
@:optional
@:default(funkin.data.song.SongData.SongTimeFormat.MILLISECONDS)
public var timeFormat:SongTimeFormat; public var timeFormat:SongTimeFormat;
public var timeChanges:Array<SongTimeChange>; public var timeChanges:Array<SongTimeChange>;
@ -115,14 +117,23 @@ class SongMetadata implements ICloneable<SongMetadata>
*/ */
public function serialize(pretty:Bool = true):String public function serialize(pretty:Bool = true):String
{ {
// Update generatedBy and version before writing.
updateVersionToLatest();
var ignoreNullOptionals = true; var ignoreNullOptionals = true;
var writer = new json2object.JsonWriter<SongMetadata>(ignoreNullOptionals); var writer = new json2object.JsonWriter<SongMetadata>(ignoreNullOptionals);
// I believe @:jignored should be iggnored by the writer? // I believe @:jignored should be ignored by the writer?
// var output = this.clone(); // var output = this.clone();
// output.variation = null; // Not sure how to make a field optional on the reader and ignored on the writer. // output.variation = null; // Not sure how to make a field optional on the reader and ignored on the writer.
return writer.write(this, pretty ? ' ' : null); return writer.write(this, pretty ? ' ' : null);
} }
public function updateVersionToLatest():Void
{
this.version = SongRegistry.SONG_METADATA_VERSION;
this.generatedBy = SongRegistry.DEFAULT_GENERATEDBY;
}
/** /**
* Produces a string representation suitable for debugging. * Produces a string representation suitable for debugging.
*/ */
@ -371,6 +382,12 @@ class SongMusicData implements ICloneable<SongMusicData>
this.variation = variation == null ? Constants.DEFAULT_VARIATION : variation; this.variation = variation == null ? Constants.DEFAULT_VARIATION : variation;
} }
public function updateVersionToLatest():Void
{
this.version = SongRegistry.SONG_MUSIC_DATA_VERSION;
this.generatedBy = SongRegistry.DEFAULT_GENERATEDBY;
}
public function clone():SongMusicData public function clone():SongMusicData
{ {
var result:SongMusicData = new SongMusicData(this.songName, this.artist, this.variation); var result:SongMusicData = new SongMusicData(this.songName, this.artist, this.variation);
@ -603,11 +620,20 @@ class SongChartData implements ICloneable<SongChartData>
*/ */
public function serialize(pretty:Bool = true):String public function serialize(pretty:Bool = true):String
{ {
// Update generatedBy and version before writing.
updateVersionToLatest();
var ignoreNullOptionals = true; var ignoreNullOptionals = true;
var writer = new json2object.JsonWriter<SongChartData>(ignoreNullOptionals); var writer = new json2object.JsonWriter<SongChartData>(ignoreNullOptionals);
return writer.write(this, pretty ? ' ' : null); return writer.write(this, pretty ? ' ' : null);
} }
public function updateVersionToLatest():Void
{
this.version = SongRegistry.SONG_CHART_DATA_VERSION;
this.generatedBy = SongRegistry.DEFAULT_GENERATEDBY;
}
public function clone():SongChartData public function clone():SongChartData
{ {
// We have to manually perform the deep clone here because Map.deepClone() doesn't work. // We have to manually perform the deep clone here because Map.deepClone() doesn't work.

View file

@ -61,10 +61,18 @@ class ChartManifestData
*/ */
public function serialize(pretty:Bool = true):String public function serialize(pretty:Bool = true):String
{ {
// Update generatedBy and version before writing.
updateVersionToLatest();
var writer = new json2object.JsonWriter<ChartManifestData>(); var writer = new json2object.JsonWriter<ChartManifestData>();
return writer.write(this, pretty ? ' ' : null); return writer.write(this, pretty ? ' ' : null);
} }
public function updateVersionToLatest():Void
{
this.version = CHART_MANIFEST_DATA_VERSION;
}
public static function deserialize(contents:String):Null<ChartManifestData> public static function deserialize(contents:String):Null<ChartManifestData>
{ {
var parser = new json2object.JsonParser<ChartManifestData>(); var parser = new json2object.JsonParser<ChartManifestData>();

View file

@ -58,9 +58,17 @@ class StageData
*/ */
public function serialize(pretty:Bool = true):String public function serialize(pretty:Bool = true):String
{ {
// Update generatedBy and version before writing.
updateVersionToLatest();
var writer = new json2object.JsonWriter<StageData>(); var writer = new json2object.JsonWriter<StageData>();
return writer.write(this, pretty ? ' ' : null); return writer.write(this, pretty ? ' ' : null);
} }
public function updateVersionToLatest():Void
{
this.version = StageRegistry.STAGE_DATA_VERSION;
}
} }
typedef StageDataCharacters = typedef StageDataCharacters =

View file

@ -384,17 +384,34 @@ class ChartEditorImportExportHandler
if (variationId == '') if (variationId == '')
{ {
var variationMetadata:Null<SongMetadata> = state.songMetadata.get(variation); var variationMetadata:Null<SongMetadata> = state.songMetadata.get(variation);
if (variationMetadata != null) zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-metadata.json', variationMetadata.serialize())); if (variationMetadata != null)
{
variationMetadata.version = funkin.data.song.SongRegistry.SONG_METADATA_VERSION;
variationMetadata.generatedBy = funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY;
zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-metadata.json', variationMetadata.serialize()));
}
var variationChart:Null<SongChartData> = state.songChartData.get(variation); var variationChart:Null<SongChartData> = state.songChartData.get(variation);
if (variationChart != null) zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-chart.json', variationChart.serialize())); if (variationChart != null)
{
variationChart.version = funkin.data.song.SongRegistry.SONG_CHART_DATA_VERSION;
variationChart.generatedBy = funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY;
zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-chart.json', variationChart.serialize()));
}
} }
else else
{ {
var variationMetadata:Null<SongMetadata> = state.songMetadata.get(variation); var variationMetadata:Null<SongMetadata> = state.songMetadata.get(variation);
if (variationMetadata != null) zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-metadata-$variationId.json', if (variationMetadata != null)
variationMetadata.serialize())); {
zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-metadata-$variationId.json', variationMetadata.serialize()));
}
var variationChart:Null<SongChartData> = state.songChartData.get(variation); var variationChart:Null<SongChartData> = state.songChartData.get(variation);
if (variationChart != null) zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-chart-$variationId.json', variationChart.serialize())); if (variationChart != null)
{
variationChart.version = funkin.data.song.SongRegistry.SONG_CHART_DATA_VERSION;
variationChart.generatedBy = funkin.data.song.SongRegistry.DEFAULT_GENERATEDBY;
zipEntries.push(FileUtil.makeZIPEntry('${state.currentSongId}-chart-$variationId.json', variationChart.serialize()));
}
} }
} }

View file

@ -868,7 +868,7 @@ class FreeplayState extends MusicBeatSubState
FlxTween.tween(grpCapsules.members[curSelected].ranking, {"scale.x": 1, "scale.y": 1}, 0.1); FlxTween.tween(grpCapsules.members[curSelected].ranking, {"scale.x": 1, "scale.y": 1}, 0.1);
grpCapsules.members[curSelected].blurredRanking.animation.play(grpCapsules.members[curSelected].blurredRanking.animation.curAnim.name, true); grpCapsules.members[curSelected].blurredRanking.animation.play(fromResults.newRank.getFreeplayRankIconAsset(), true);
FlxTween.tween(grpCapsules.members[curSelected].blurredRanking, {"scale.x": 1, "scale.y": 1}, 0.1); FlxTween.tween(grpCapsules.members[curSelected].blurredRanking, {"scale.x": 1, "scale.y": 1}, 0.1);
new FlxTimer().start(0.1, _ -> { new FlxTimer().start(0.1, _ -> {

View file

@ -467,7 +467,7 @@ class Constants
// % Hit // % Hit
public static final RANK_PERFECT_THRESHOLD:Float = 1.00; public static final RANK_PERFECT_THRESHOLD:Float = 1.00;
public static final RANK_EXCELLENT_THRESHOLD:Float = 0.90; public static final RANK_EXCELLENT_THRESHOLD:Float = 0.90;
public static final RANK_GREAT_THRESHOLD:Float = 0.75; public static final RANK_GREAT_THRESHOLD:Float = 0.80;
public static final RANK_GOOD_THRESHOLD:Float = 0.60; public static final RANK_GOOD_THRESHOLD:Float = 0.60;
// public static final RANK_SHIT_THRESHOLD:Float = 0.00; // public static final RANK_SHIT_THRESHOLD:Float = 0.00;