From 983466c0feb080bb591799fb6649ba82592786ee Mon Sep 17 00:00:00 2001 From: EliteMasterEric Date: Tue, 27 Jun 2023 15:21:09 -0400 Subject: [PATCH] Visual fixes for story menu --- source/funkin/ui/story/Level.hx | 35 ++++++++-- source/funkin/ui/story/StoryMenuState.hx | 89 +++++++++++++++++------- 2 files changed, 90 insertions(+), 34 deletions(-) diff --git a/source/funkin/ui/story/Level.hx b/source/funkin/ui/story/Level.hx index 83682fec9..b936ab513 100644 --- a/source/funkin/ui/story/Level.hx +++ b/source/funkin/ui/story/Level.hx @@ -93,19 +93,40 @@ class Level implements IRegistryEntry return true; } + /** + * Build a sprite for the background of the level. + * Can be overriden by ScriptedLevel. Not used if `isBackgroundSimple` returns true. + */ public function buildBackground():FlxSprite { - if (_data.background.startsWith('#')) - { - // Color specified - var color:FlxColor = FlxColor.fromString(_data.background); - return new FlxSprite().makeGraphic(FlxG.width, 400, color); - } - else + if (!_data.background.startsWith('#')) { // Image specified return new FlxSprite().loadGraphic(Paths.image(_data.background)); } + + // Color specified + var result:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 400, FlxColor.WHITE); + result.color = getBackgroundColor(); + return result; + } + + /** + * Returns true if the background is a solid color. + * If you have a ScriptedLevel with a fancy background, you may want to override this to false. + */ + public function isBackgroundSimple():Bool + { + return _data.background.startsWith('#'); + } + + /** + * Returns true if the background is a solid color. + * If you have a ScriptedLevel with a fancy background, you may want to override this to false. + */ + public function getBackgroundColor():FlxColor + { + return FlxColor.fromString(_data.background); } public function getDifficulties():Array diff --git a/source/funkin/ui/story/StoryMenuState.hx b/source/funkin/ui/story/StoryMenuState.hx index 1dc59f3ec..853d5ecc0 100644 --- a/source/funkin/ui/story/StoryMenuState.hx +++ b/source/funkin/ui/story/StoryMenuState.hx @@ -145,6 +145,10 @@ class StoryMenuState extends MusicBeatState updateBackground(); + var black:FlxSprite = new FlxSprite(levelBackground.x, 0).makeGraphic(FlxG.width, Std.int(400 + levelBackground.y), FlxColor.BLACK); + black.zIndex = levelBackground.zIndex - 1; + add(black); + levelProps = new FlxTypedGroup(); levelProps.zIndex = 1000; add(levelProps); @@ -378,6 +382,7 @@ class StoryMenuState extends MusicBeatState if (currentIndex < 0) currentIndex = levelList.length - 1; if (currentIndex >= levelList.length) currentIndex = 0; + var previousLevelId:String = currentLevelId; currentLevelId = levelList[currentIndex]; updateData(); @@ -393,18 +398,14 @@ class StoryMenuState extends MusicBeatState currentLevelTitle = item; item.alpha = 1.0; } - else if (index > currentIndex) - { - item.alpha = 0.6; - } else { - item.alpha = 0.0; + item.alpha = 0.6; } } updateText(); - updateBackground(); + updateBackground(previousLevelId); updateProps(); refresh(); } @@ -517,32 +518,66 @@ class StoryMenuState extends MusicBeatState }); } - function updateBackground():Void + function updateBackground(?previousLevelId:String = ''):Void { - if (levelBackground != null) + if (levelBackground == null || previousLevelId == '') { - var oldBackground:FlxSprite = levelBackground; - - FlxTween.tween(oldBackground, {alpha: 0.0}, 0.6, - { - ease: FlxEase.linear, - onComplete: function(_) { - remove(oldBackground); - } - }); + // Build a new background and display it immediately. + levelBackground = currentLevel.buildBackground(); + levelBackground.x = 0; + levelBackground.y = 56; + levelBackground.zIndex = 100; + levelBackground.alpha = 1.0; // Not hidden. + add(levelBackground); } + else + { + var previousLevel = LevelRegistry.instance.fetchEntry(previousLevelId); - levelBackground = currentLevel.buildBackground(); - levelBackground.x = 0; - levelBackground.y = 56; - levelBackground.alpha = 0.0; - levelBackground.zIndex = 100; - add(levelBackground); - - FlxTween.tween(levelBackground, {alpha: 1.0}, 0.6, + if (currentLevel.isBackgroundSimple() && previousLevel.isBackgroundSimple()) { - ease: FlxEase.linear - }); + var previousColor:FlxColor = previousLevel.getBackgroundColor(); + var currentColor:FlxColor = currentLevel.getBackgroundColor(); + if (previousColor != currentColor) + { + // Both the previous and current level were simple backgrounds. + // Fade between colors directly, rather than fading one background out and another in. + FlxTween.color(levelBackground, 0.4, previousColor, currentColor); + } + else + { + // Do no fade at all if the colors aren't different. + } + } + else + { + // Either the previous or current level has a complex background. + // We need to fade the old background out and the new one in. + + // Reference the old background and fade it out. + var oldBackground:FlxSprite = levelBackground; + FlxTween.tween(oldBackground, {alpha: 0.0}, 0.6, + { + ease: FlxEase.linear, + onComplete: function(_) { + remove(oldBackground); + } + }); + + // Build a new background and fade it in. + levelBackground = currentLevel.buildBackground(); + levelBackground.x = 0; + levelBackground.y = 56; + levelBackground.alpha = 0.0; // Hidden to start. + levelBackground.zIndex = 100; + add(levelBackground); + + FlxTween.tween(levelBackground, {alpha: 1.0}, 0.6, + { + ease: FlxEase.linear + }); + } + } } function updateProps():Void