mirror of
https://github.com/ninjamuffin99/Funkin.git
synced 2024-11-15 11:22:55 +00:00
Merge pull request #590 from FunkinCrew/bugfix/may-31st-fixes
May 31st chart fixes
This commit is contained in:
commit
26d19abaab
36
CHANGELOG.md
36
CHANGELOG.md
|
@ -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
2
assets
|
@ -1 +1 @@
|
||||||
Subproject commit 7a0d92d3007de42c452b2ea97a917d8c8d114ee7
|
Subproject commit 3bfa4e3da87713ea651f60d4f898c283e5d86093
|
|
@ -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.
|
||||||
|
|
|
@ -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>();
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -54,7 +54,7 @@ class CreditsDataHandler
|
||||||
body: [
|
body: [
|
||||||
{line: 'ninjamuffin99'},
|
{line: 'ninjamuffin99'},
|
||||||
{line: 'PhantomArcade'},
|
{line: 'PhantomArcade'},
|
||||||
{line: 'KawaiSprite'},
|
{line: 'Kawai Sprite'},
|
||||||
{line: 'evilsk8r'},
|
{line: 'evilsk8r'},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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, _ -> {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue