From ddce09c3e982bf442a57a39eb453fa9fd499aa01 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 10:53:20 -0500 Subject: [PATCH 01/11] SS State and Build flag --- src/Main.hx | 4 ++++ src/lt/states/SongSelectState.hx | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 src/lt/states/SongSelectState.hx diff --git a/src/Main.hx b/src/Main.hx index 8e06ac2..14b96e9 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -17,6 +17,10 @@ class Main extends Sprite { super(); + #if SONG_SELECT + STARTING_STATE = lt.states.SongSelectState; + #end + init(); addChild(new FlxGame(0, 0, STARTING_STATE, 120,120,true,false)); FlxG.fixedTimestep = FlxG.autoPause = false; diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx new file mode 100644 index 0000000..e2078bd --- /dev/null +++ b/src/lt/states/SongSelectState.hx @@ -0,0 +1,3 @@ +package lt.states; + +class SongSelectState extends State {} From 68293b6497a6bb3558e885c3bc6dd8fcb2fb715f Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 10:57:57 -0500 Subject: [PATCH 02/11] Fix build flag and add a text --- src/Main.hx | 4 - src/lt/states/IntroState.hx | 286 +++++++++++++++++-------------- src/lt/states/SongSelectState.hx | 14 +- 3 files changed, 167 insertions(+), 137 deletions(-) diff --git a/src/Main.hx b/src/Main.hx index 14b96e9..8e06ac2 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -17,10 +17,6 @@ class Main extends Sprite { super(); - #if SONG_SELECT - STARTING_STATE = lt.states.SongSelectState; - #end - init(); addChild(new FlxGame(0, 0, STARTING_STATE, 120,120,true,false)); FlxG.fixedTimestep = FlxG.autoPause = false; diff --git a/src/lt/states/IntroState.hx b/src/lt/states/IntroState.hx index 6743e2f..c8d6fb7 100644 --- a/src/lt/states/IntroState.hx +++ b/src/lt/states/IntroState.hx @@ -4,147 +4,169 @@ package lt.states; * Animation that starts when the game boots up. */ class IntroState extends FlxState { - public static var _boxSize:Int = 72; - public static var _scaleDec:Float = 0.3; + public static var _boxSize:Int = 72; + public static var _scaleDec:Float = 0.3; var playerBox:Sprite; var tileBox:Sprite; var ltText:FlxText; - var currentlyLoading:Bool = false; + var currentlyLoading:Bool = false; - override function create():Void - { - Utils.initialize(); - haxe.Timer.measure(()->{ - loadIntro(); - animateIntro(); - }); + override function create():Void { + Utils.initialize(); + haxe.Timer.measure(() -> { + loadIntro(); + animateIntro(); + }); super.create(); } - function loadIntro():Void { - // Player Box sprite - var _centerOffset:Float = 90; - - playerBox = new Sprite().makeGraphic(_boxSize, _boxSize); - playerBox.x = ((FlxG.width - playerBox.width) * 0.5) - _centerOffset; - playerBox.screenCenter(Y); - add(playerBox); - - // Tile Box sprite - tileBox = new Sprite().loadGraphic(Assets.image("play/tile")); - tileBox.setGraphicSize(playerBox.frameWidth, playerBox.frameHeight); - tileBox.updateHitbox(); - tileBox.x = ((FlxG.width - tileBox.width) * 0.5) + _centerOffset; - tileBox.screenCenter(Y); - add(tileBox); - - // Text underneath it - ltText = new FlxText(0,0,-1,PhraseManager.getPhrase("LINETAPPER").toUpperCase(),20); + function loadIntro():Void { + // Player Box sprite + var _centerOffset:Float = 90; + + playerBox = new Sprite().makeGraphic(_boxSize, _boxSize); + playerBox.x = ((FlxG.width - playerBox.width) * 0.5) - _centerOffset; + playerBox.screenCenter(Y); + add(playerBox); + + // Tile Box sprite + tileBox = new Sprite().loadGraphic(Assets.image("play/tile")); + tileBox.setGraphicSize(playerBox.frameWidth, playerBox.frameHeight); + tileBox.updateHitbox(); + tileBox.x = ((FlxG.width - tileBox.width) * 0.5) + _centerOffset; + tileBox.screenCenter(Y); + add(tileBox); + + // Text underneath it + ltText = new FlxText(0, 0, -1, PhraseManager.getPhrase("LINETAPPER").toUpperCase(), 20); ltText.setFormat(Assets.font("extenro-bold"), 18, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); ltText.screenCenter(X); - ltText.y = playerBox.y + playerBox.height + 20; - - add(ltText); - } - - var _textFlicker:Bool = false; - function animateIntro() { - var _tweenXOffset:Float = 30; - - playerBox.x -= _tweenXOffset; - tileBox.x += _tweenXOffset; - ltText.y += _tweenXOffset; - - ltText.alpha = playerBox.alpha = tileBox.alpha = 0; - - // Actually animating it (yeah this is horrible.) - new FlxTimer().start(1,(_)->{ // Make a little wait here - // LineTapper Sequence - FlxTween.tween(playerBox, {x: playerBox.x+_tweenXOffset, alpha: 1}, 0.5, {ease:FlxEase.expoOut}); - FlxTween.tween(tileBox, {x: tileBox.x-_tweenXOffset, alpha: 1}, 0.5, {ease:FlxEase.expoOut, onComplete: (_)->{ - _textFlicker = true; - FlxTween.tween(ltText, {y: ltText.y-_tweenXOffset}, 0.5, {ease:FlxEase.expoOut, onComplete:(_)->{ - new FlxTimer().start(0.5,(_)->{ - // Loading Sequence - var xTarget:Float = (FlxG.width - playerBox.width) * 0.5; - _textFlicker = true; - FlxTween.tween(ltText, {y: ltText.y+_tweenXOffset}, 0.5, {ease:FlxEase.expoOut, onComplete:(_)->{ - ltText.text = PhraseManager.getPhrase('loading', "LOADING...").toUpperCase(); - ltText.screenCenter(X); - ltText.x += 10; - ltText.alpha = 0; - FlxTween.tween(ltText, {y: ltText.y-_tweenXOffset, alpha:1}, 0.5, {ease:FlxEase.expoOut}); - FlxTween.tween(playerBox.scale, {x: playerBox.scale.x - _scaleDec, y: playerBox.scale.y - _scaleDec}, 0.5, {ease:FlxEase.expoOut}); - }}); - - FlxTween.tween(playerBox, {x: xTarget}, 0.5, {ease:FlxEase.expoOut}); - FlxTween.tween(tileBox, {x: xTarget}, 0.5, {ease:FlxEase.expoOut, onComplete:(_)->{ - tileBox.kill(); - tileBox.destroy(); - remove(tileBox); - currentlyLoading = true; - }}); - }); - }}); - }}); - }); - - } - - override function update(elapsed:Float) { - if (FlxG.keys.justPressed.T) { - Utils.switchState(new TestTransition()); - } - flickerEffectUpdate(elapsed); - loadingSeqUpdate(elapsed); - - if (FlxG.keys.justPressed.SPACE) - FlxG.resetState(); - super.update(elapsed); - } - - var _rotateTime:Float = 0; - function loadingSeqUpdate(elapsed:Float) { - if (!currentlyLoading) return; - - if (_rotateTime > 3) { - playerBox.angle = 0; - FlxTween.tween(ltText, {alpha:0}, 0.5, {ease:FlxEase.linear, onComplete:(_)->{ - ltText.destroy(); - remove(ltText); - Utils.switchState(new MenuState(false, true)); - }}); - } else { - _rotateTime += elapsed; - playerBox.angle = FlxEase.expoInOut(_rotateTime%1)*(-90); - } - - } - - /** - * Flicker effect thing - */ - - var _flickerDelay:Float = 0.03; - var _curFlickTime:Float = 0; - var _curFlickPos:Float = 0; - var _flickerEndTime:Float = 0.3; - function flickerEffectUpdate(elapsed:Float) { - if (!_textFlicker) return; - - _curFlickTime += elapsed; - _curFlickPos += elapsed; - if (_curFlickTime > _flickerDelay){ - ltText.alpha = 1 - ltText.alpha; - _curFlickTime = 0; - } - - if (_curFlickPos > _flickerEndTime) { - _textFlicker = false; - _curFlickPos = 0; - } - } -} \ No newline at end of file + ltText.y = playerBox.y + playerBox.height + 20; + + add(ltText); + } + + var _textFlicker:Bool = false; + + function animateIntro() { + var _tweenXOffset:Float = 30; + + playerBox.x -= _tweenXOffset; + tileBox.x += _tweenXOffset; + ltText.y += _tweenXOffset; + + ltText.alpha = playerBox.alpha = tileBox.alpha = 0; + + // Actually animating it (yeah this is horrible.) + new FlxTimer().start(1, (_) -> { // Make a little wait here + // LineTapper Sequence + FlxTween.tween(playerBox, {x: playerBox.x + _tweenXOffset, alpha: 1}, 0.5, {ease: FlxEase.expoOut}); + FlxTween.tween(tileBox, {x: tileBox.x - _tweenXOffset, alpha: 1}, 0.5, { + ease: FlxEase.expoOut, + onComplete: (_) -> { + _textFlicker = true; + FlxTween.tween(ltText, {y: ltText.y - _tweenXOffset}, 0.5, { + ease: FlxEase.expoOut, + onComplete: (_) -> { + new FlxTimer().start(0.5, (_) -> { + // Loading Sequence + var xTarget:Float = (FlxG.width - playerBox.width) * 0.5; + _textFlicker = true; + FlxTween.tween(ltText, {y: ltText.y + _tweenXOffset}, 0.5, { + ease: FlxEase.expoOut, + onComplete: (_) -> { + ltText.text = PhraseManager.getPhrase('loading', "LOADING...").toUpperCase(); + ltText.screenCenter(X); + ltText.x += 10; + ltText.alpha = 0; + FlxTween.tween(ltText, {y: ltText.y - _tweenXOffset, alpha: 1}, 0.5, {ease: FlxEase.expoOut}); + FlxTween.tween(playerBox.scale, {x: playerBox.scale.x - _scaleDec, y: playerBox.scale.y - _scaleDec}, 0.5, + {ease: FlxEase.expoOut}); + } + }); + + FlxTween.tween(playerBox, {x: xTarget}, 0.5, {ease: FlxEase.expoOut}); + FlxTween.tween(tileBox, {x: xTarget}, 0.5, { + ease: FlxEase.expoOut, + onComplete: (_) -> { + tileBox.kill(); + tileBox.destroy(); + remove(tileBox); + currentlyLoading = true; + } + }); + }); + } + }); + } + }); + }); + } + + override function update(elapsed:Float) { + if (FlxG.keys.justPressed.T) { + Utils.switchState(new TestTransition()); + } + flickerEffectUpdate(elapsed); + loadingSeqUpdate(elapsed); + + if (FlxG.keys.justPressed.SPACE) + FlxG.resetState(); + super.update(elapsed); + } + + var _rotateTime:Float = 0; + + function loadingSeqUpdate(elapsed:Float) { + if (!currentlyLoading) + return; + + if (_rotateTime > 3) { + playerBox.angle = 0; + FlxTween.tween(ltText, {alpha: 0}, 0.5, { + ease: FlxEase.linear, + onComplete: (_) -> { + ltText.destroy(); + remove(ltText); + #if SONG_SELECT + Utils.switchState(() -> new SongSelectState(false, true)); + #else + Utils.switchState(() -> new MenuState(false, true)); + #end + } + }); + } else { + _rotateTime += elapsed; + playerBox.angle = FlxEase.expoInOut(_rotateTime % 1) * (-90); + } + } + + /** + * Flicker effect thing + */ + var _flickerDelay:Float = 0.03; + + var _curFlickTime:Float = 0; + var _curFlickPos:Float = 0; + var _flickerEndTime:Float = 0.3; + + function flickerEffectUpdate(elapsed:Float) { + if (!_textFlicker) + return; + + _curFlickTime += elapsed; + _curFlickPos += elapsed; + if (_curFlickTime > _flickerDelay) { + ltText.alpha = 1 - ltText.alpha; + _curFlickTime = 0; + } + + if (_curFlickPos > _flickerEndTime) { + _textFlicker = false; + _curFlickPos = 0; + } + } +} diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index e2078bd..5321599 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -1,3 +1,15 @@ package lt.states; -class SongSelectState extends State {} +class SongSelectState extends State { + var topText:FlxText; + var topText_phrase:String = 'SELECT A SONG'; + + override function create() { + super.create(); + + topText = new FlxText(20, 180, -1, PhraseManager.getPhrase(topText_phrase, topText_phrase), 20); + topText.setFormat(Assets.font("extenro-extrabold"), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + topText.screenCenter(X); + add(topText); + } +} From 8dac162e65aae233656600e0a13cef7895cdd36a Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:10:31 -0500 Subject: [PATCH 03/11] Song text and song switching --- src/lt/states/SongSelectState.hx | 48 ++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 5321599..60ae0dc 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -1,15 +1,59 @@ package lt.states; +import sys.FileSystem; + class SongSelectState extends State { var topText:FlxText; - var topText_phrase:String = 'SELECT A SONG'; + var topText_phrase:String = 'SELECT A SONG'; + + var centerText:FlxText; + + var song:String = 'Tutorial'; + var songList:Array = ['Tutorial']; + var songIndex:Int = 0; override function create() { super.create(); topText = new FlxText(20, 180, -1, PhraseManager.getPhrase(topText_phrase, topText_phrase), 20); - topText.setFormat(Assets.font("extenro-extrabold"), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + topText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); topText.screenCenter(X); add(topText); + + centerText = new FlxText(20, 180, -1, song, 20); + centerText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + add(centerText); + + songList = FileSystem.readDirectory('assets/data/maps'); + + if (songList.length < 1) { + songList = ['Tutorial']; + } + trace(songList); + + songIndex = songList.indexOf('Tutorial'); + } + + override function update(elapsed:Float) { + super.update(elapsed); + + song = songList[songIndex]; + centerText.text = song.toLowerCase(); + centerText.screenCenter(); + + if (FlxG.keys.justReleased.LEFT) + incrementSongIndex(-1); + if (FlxG.keys.justReleased.RIGHT) + incrementSongIndex(1); + } + + function incrementSongIndex(increment:Int = 0) { + songIndex += increment; + + if (songIndex < 0) + songIndex = 0; + + if (songIndex >= songList.length - 1) + songIndex = songList.length - 1; } } From c53d6e85254db58cb8c1605f58d9fa1d0b878ab2 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:16:06 -0500 Subject: [PATCH 04/11] Song selecting --- src/lt/states/SongSelectState.hx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 60ae0dc..2f64fff 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -8,6 +8,9 @@ class SongSelectState extends State { var centerText:FlxText; + var bottomText:FlxText; + var bottomText_phrase:String = 'INVALID SONG'; + var song:String = 'Tutorial'; var songList:Array = ['Tutorial']; var songIndex:Int = 0; @@ -24,6 +27,13 @@ class SongSelectState extends State { centerText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); add(centerText); + bottomText = new FlxText(20, FlxG.height - 180, -1, PhraseManager.getPhrase(bottomText_phrase, bottomText_phrase), 20); + bottomText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + bottomText.color = FlxColor.RED; + bottomText.screenCenter(X); + bottomText.visible = false; + add(bottomText); + songList = FileSystem.readDirectory('assets/data/maps'); if (songList.length < 1) { @@ -45,6 +55,20 @@ class SongSelectState extends State { incrementSongIndex(-1); if (FlxG.keys.justReleased.RIGHT) incrementSongIndex(1); + + if (FlxG.keys.justPressed.ENTER) { + if (song.length > 0 && FileSystem.exists('${Assets._MAP_PATH}/$song')) { + Utils.switchState(() -> new PlayState(song.trim()), PhraseManager.getPhrase("Gameplay")); + FlxG.sound.play(Assets.sound("menu/press")); + } else { + FlxFlicker.flicker(bottomText, 1, 0.02, false); + FlxG.sound.play(Assets.sound("menu/key_cancel")); + new FlxTimer().start(1, function(tmr:FlxTimer) { + bottomText.color = FlxColor.WHITE; + bottomText.visible = false; + }); + } + } } function incrementSongIndex(increment:Int = 0) { From ee0a70b42a34fecb679ff9dc0c25c4002aa1cd4d Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:22:55 -0500 Subject: [PATCH 05/11] Removed requirement of a build flag to go to the song select --- src/lt/states/MenuState.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lt/states/MenuState.hx b/src/lt/states/MenuState.hx index bad72d5..f626b1e 100644 --- a/src/lt/states/MenuState.hx +++ b/src/lt/states/MenuState.hx @@ -41,7 +41,7 @@ class MenuState extends State { function get_options():Array{ return [ [PhraseManager.getPhrase("settings").toLowerCase(), () -> openSubState(new SettingsSubstate())], - [PhraseManager.getPhrase("play").toLowerCase(), () -> Utils.switchState(new MenuDebugState(), PhraseManager.getPhrase("Song Select"))], + [PhraseManager.getPhrase("play").toLowerCase(), () -> Utils.switchState(() -> new SongSelectState(), PhraseManager.getPhrase("Song Select"))], [PhraseManager.getPhrase("edit").toLowerCase(), () -> Utils.switchState(new LevelEditorState(), PhraseManager.getPhrase("Level Editor"))], [PhraseManager.getPhrase("credits").toLowerCase(), () -> Utils.switchState(new CreditsState(), PhraseManager.getPhrase("Credits"))], ]; From bfaf354ab1efd771d1fcd6576a19670430e82f42 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:32:56 -0500 Subject: [PATCH 06/11] Added left and right text for the next and previous song --- src/lt/states/SongSelectState.hx | 41 ++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 2f64fff..5bab497 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -6,12 +6,16 @@ class SongSelectState extends State { var topText:FlxText; var topText_phrase:String = 'SELECT A SONG'; + var centerLeftText:FlxText; var centerText:FlxText; + var centerRightText:FlxText; var bottomText:FlxText; var bottomText_phrase:String = 'INVALID SONG'; + var songLeft:String = ''; var song:String = 'Tutorial'; + var songRight:String = ''; var songList:Array = ['Tutorial']; var songIndex:Int = 0; @@ -27,6 +31,16 @@ class SongSelectState extends State { centerText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); add(centerText); + centerLeftText = new FlxText(20, 180, -1, songLeft, 20); + centerLeftText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + add(centerLeftText); + centerLeftText.alpha = 0.5; + + centerRightText = new FlxText(20, 180, -1, songRight, 20); + centerRightText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + add(centerRightText); + centerRightText.alpha = 0.5; + bottomText = new FlxText(20, FlxG.height - 180, -1, PhraseManager.getPhrase(bottomText_phrase, bottomText_phrase), 20); bottomText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); bottomText.color = FlxColor.RED; @@ -42,15 +56,13 @@ class SongSelectState extends State { trace(songList); songIndex = songList.indexOf('Tutorial'); + + incrementSongIndex(); } override function update(elapsed:Float) { super.update(elapsed); - song = songList[songIndex]; - centerText.text = song.toLowerCase(); - centerText.screenCenter(); - if (FlxG.keys.justReleased.LEFT) incrementSongIndex(-1); if (FlxG.keys.justReleased.RIGHT) @@ -79,5 +91,26 @@ class SongSelectState extends State { if (songIndex >= songList.length - 1) songIndex = songList.length - 1; + + song = songList[songIndex]; + songLeft = ''; + songRight = ''; + if (songIndex - 1 >= 0) + songLeft = songList[songIndex - 1]; + if (songIndex + 1 <= songList.length - 1) + songRight = songList[songIndex + 1]; + + songSelectionTransition(); + } + + function songSelectionTransition() { + centerText.text = song.toLowerCase(); + centerLeftText.text = songLeft.toLowerCase(); + centerRightText.text = songRight.toLowerCase(); + centerText.screenCenter(); + centerLeftText.screenCenter(); + centerRightText.screenCenter(); + centerLeftText.x -= centerText.width + centerLeftText.width; + centerRightText.x += centerText.width + centerRightText.width; } } From d574929b3a85348e7c8d088adef17c587c36c743 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:39:21 -0500 Subject: [PATCH 07/11] Added another left and right set for short songs so the next or previous song after is atleast partially visable --- src/lt/states/SongSelectState.hx | 44 +++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 5bab497..a8ca917 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -6,16 +6,20 @@ class SongSelectState extends State { var topText:FlxText; var topText_phrase:String = 'SELECT A SONG'; + var centerDoubleLeftText:FlxText; var centerLeftText:FlxText; var centerText:FlxText; var centerRightText:FlxText; + var centerDoubleRightText:FlxText; var bottomText:FlxText; var bottomText_phrase:String = 'INVALID SONG'; + var songDoubleLeft:String = ''; var songLeft:String = ''; var song:String = 'Tutorial'; var songRight:String = ''; + var songDoubleRight:String = ''; var songList:Array = ['Tutorial']; var songIndex:Int = 0; @@ -41,6 +45,16 @@ class SongSelectState extends State { add(centerRightText); centerRightText.alpha = 0.5; + centerDoubleLeftText = new FlxText(20, 180, -1, songDoubleLeft, 20); + centerDoubleLeftText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + add(centerDoubleLeftText); + centerDoubleLeftText.alpha = 0.25; + + centerDoubleRightText = new FlxText(20, 180, -1, songDoubleRight, 20); + centerDoubleRightText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); + add(centerDoubleRightText); + centerDoubleRightText.alpha = 0.25; + bottomText = new FlxText(20, FlxG.height - 180, -1, PhraseManager.getPhrase(bottomText_phrase, bottomText_phrase), 20); bottomText.setFormat(Assets.font('extenro-extrabold'), 22, FlxColor.WHITE, CENTER, OUTLINE, FlxColor.BLACK); bottomText.color = FlxColor.RED; @@ -89,28 +103,46 @@ class SongSelectState extends State { if (songIndex < 0) songIndex = 0; - if (songIndex >= songList.length - 1) - songIndex = songList.length - 1; + var songlistlen = songList.length - 1; + + if (songIndex >= songlistlen) + songIndex = songlistlen; song = songList[songIndex]; songLeft = ''; songRight = ''; + songDoubleLeft = ''; + songDoubleRight = ''; if (songIndex - 1 >= 0) songLeft = songList[songIndex - 1]; - if (songIndex + 1 <= songList.length - 1) + if (songIndex + 1 <= songlistlen) songRight = songList[songIndex + 1]; + if (songIndex - 2 >= 0) + songDoubleLeft = songList[songIndex - 2]; + if (songIndex + 2 <= songlistlen) + songDoubleRight = songList[songIndex + 2]; songSelectionTransition(); } function songSelectionTransition() { centerText.text = song.toLowerCase(); - centerLeftText.text = songLeft.toLowerCase(); - centerRightText.text = songRight.toLowerCase(); centerText.screenCenter(); + + centerLeftText.text = songLeft.toLowerCase(); centerLeftText.screenCenter(); - centerRightText.screenCenter(); centerLeftText.x -= centerText.width + centerLeftText.width; + + centerRightText.text = songRight.toLowerCase(); + centerRightText.screenCenter(); centerRightText.x += centerText.width + centerRightText.width; + + centerDoubleLeftText.text = songDoubleLeft.toLowerCase(); + centerDoubleLeftText.screenCenter(); + centerDoubleLeftText.x = centerLeftText.x - centerLeftText.width - centerDoubleLeftText.width; + + centerDoubleRightText.text = songDoubleRight.toLowerCase(); + centerDoubleRightText.screenCenter(); + centerDoubleRightText.x = centerRightText.x + centerRightText.width + centerDoubleRightText.width; } } From ff1e91f8bab8f7ab827f01bebef738dcd95889b5 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:54:59 -0500 Subject: [PATCH 08/11] Attempt at a transition, ended up just adding scroll sfx --- src/lt/states/SongSelectState.hx | 74 +++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index a8ca917..f29a5e1 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -100,13 +100,15 @@ class SongSelectState extends State { function incrementSongIndex(increment:Int = 0) { songIndex += increment; - if (songIndex < 0) - songIndex = 0; - var songlistlen = songList.length - 1; - - if (songIndex >= songlistlen) + if (songIndex < 0) { + songIndex = 0; + FlxG.sound.play(Assets.sound("menu/key_cancel")); + } else if (songIndex >= songlistlen) { songIndex = songlistlen; + FlxG.sound.play(Assets.sound("menu/key_cancel")); + } else + FlxG.sound.play(Assets.sound("menu/scroll")); song = songList[songIndex]; songLeft = ''; @@ -122,10 +124,62 @@ class SongSelectState extends State { if (songIndex + 2 <= songlistlen) songDoubleRight = songList[songIndex + 2]; - songSelectionTransition(); + songSelectionTransition(0); } - function songSelectionTransition() { + function songSelectionTransition(increment:Int = 0) { + if (increment == 0) { + songSelectionTransitionFinished(); + return; + } + + var positions = { + centerText: centerText.getPosition(), + centerLeftText: centerLeftText.getPosition(), + centerDoubleLeftText: centerDoubleLeftText.getPosition(), + centerRightText: centerRightText.getPosition(), + centerDoubleRightText: centerDoubleRightText.getPosition(), + } + var opacities = { + centerText: centerText.alpha, + centerLeftText: centerLeftText.alpha, + centerDoubleLeftText: centerDoubleLeftText.alpha, + centerRightText: centerRightText.alpha, + centerDoubleRightText: centerDoubleRightText.alpha, + } + + // ! SEVERE WORK IN PROGRESS ! \\ + if (increment < 0) { + FlxTween.tween(centerDoubleLeftText, {x: positions.centerLeftText.x, alpha: opacities.centerLeftText}, 1); + FlxTween.tween(centerLeftText, {x: positions.centerText.x, alpha: opacities.centerText}, 1); + FlxTween.tween(centerText, {x: positions.centerRightText.x, alpha: opacities.centerRightText}, 1); + FlxTween.tween(centerRightText, {x: positions.centerDoubleRightText.x, alpha: opacities.centerDoubleRightText}, 1); + centerDoubleRightText.alpha = 0; + centerDoubleRightText.x = positions.centerDoubleLeftText.x - centerDoubleLeftText.width - centerDoubleRightText.width; + centerDoubleRightText.text = songDoubleLeft; + FlxTween.tween(centerDoubleRightText, {x: positions.centerDoubleLeftText.x, alpha: opacities.centerDoubleLeftText}, 1, { + onComplete: tween -> { + songSelectionTransitionFinished(); + } + }); + } else { + centerDoubleLeftText.alpha = 0; + centerDoubleLeftText.x = positions.centerDoubleRightText.x - centerDoubleRightText.width - centerDoubleLeftText.width; + centerDoubleLeftText.text = songDoubleLeft; + FlxTween.tween(centerDoubleLeftText, {x: positions.centerDoubleRightText.x, alpha: opacities.centerDoubleRightText}, 1, { + onComplete: tween -> { + songSelectionTransitionFinished(); + } + }); + FlxTween.tween(centerLeftText, {x: positions.centerDoubleLeftText.x, alpha: opacities.centerDoubleLeftText}, 1); + FlxTween.tween(centerText, {x: positions.centerLeftText.x, alpha: opacities.centerLeftText}, 1); + FlxTween.tween(centerRightText, {x: positions.centerText.x, alpha: opacities.centerText}, 1); + + FlxTween.tween(centerDoubleRightText, {x: positions.centerRightText.x, alpha: opacities.centerRightText}, 1); + } + } + + function songSelectionTransitionFinished() { centerText.text = song.toLowerCase(); centerText.screenCenter(); @@ -144,5 +198,11 @@ class SongSelectState extends State { centerDoubleRightText.text = songDoubleRight.toLowerCase(); centerDoubleRightText.screenCenter(); centerDoubleRightText.x = centerRightText.x + centerRightText.width + centerDoubleRightText.width; + + centerText.alpha = 1.0; + centerLeftText.alpha = 0.5; + centerRightText.alpha = 0.5; + centerDoubleLeftText.alpha = 0.25; + centerDoubleRightText.alpha = 0.25; } } From a102b52ef48178e5355ac1abb20340261364c9d7 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:56:31 -0500 Subject: [PATCH 09/11] Fixed select sfx --- src/lt/states/SongSelectState.hx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index f29a5e1..0a2dc1b 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -107,8 +107,9 @@ class SongSelectState extends State { } else if (songIndex >= songlistlen) { songIndex = songlistlen; FlxG.sound.play(Assets.sound("menu/key_cancel")); - } else - FlxG.sound.play(Assets.sound("menu/scroll")); + } else { + FlxG.sound.play(Assets.sound("menu/select")); + } song = songList[songIndex]; songLeft = ''; From ae8fbec68cc3bc347aa36f483e94d68e656a8a68 Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 11:57:20 -0500 Subject: [PATCH 10/11] Swapped sfx --- src/lt/states/SongSelectState.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 0a2dc1b..343a79e 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -85,7 +85,7 @@ class SongSelectState extends State { if (FlxG.keys.justPressed.ENTER) { if (song.length > 0 && FileSystem.exists('${Assets._MAP_PATH}/$song')) { Utils.switchState(() -> new PlayState(song.trim()), PhraseManager.getPhrase("Gameplay")); - FlxG.sound.play(Assets.sound("menu/press")); + FlxG.sound.play(Assets.sound("menu/select")); } else { FlxFlicker.flicker(bottomText, 1, 0.02, false); FlxG.sound.play(Assets.sound("menu/key_cancel")); @@ -108,7 +108,7 @@ class SongSelectState extends State { songIndex = songlistlen; FlxG.sound.play(Assets.sound("menu/key_cancel")); } else { - FlxG.sound.play(Assets.sound("menu/select")); + FlxG.sound.play(Assets.sound("menu/press")); } song = songList[songIndex]; From 612d499efc860205ec791be59fbeaa6e6c19e7ac Mon Sep 17 00:00:00 2001 From: Sphis-Sinco Date: Mon, 7 Jul 2025 12:02:11 -0500 Subject: [PATCH 11/11] Flickering --- src/lt/states/SongSelectState.hx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lt/states/SongSelectState.hx b/src/lt/states/SongSelectState.hx index 343a79e..eb15e75 100644 --- a/src/lt/states/SongSelectState.hx +++ b/src/lt/states/SongSelectState.hx @@ -100,14 +100,21 @@ class SongSelectState extends State { function incrementSongIndex(increment:Int = 0) { songIndex += increment; + var noScroll = function() { + FlxG.sound.play(Assets.sound("menu/key_cancel")); + centerText.color = FlxColor.RED; + FlxFlicker.flicker(centerText); + }; var songlistlen = songList.length - 1; if (songIndex < 0) { songIndex = 0; - FlxG.sound.play(Assets.sound("menu/key_cancel")); + noScroll(); } else if (songIndex >= songlistlen) { songIndex = songlistlen; - FlxG.sound.play(Assets.sound("menu/key_cancel")); + noScroll(); } else { + centerText.color = FlxColor.WHITE; + FlxFlicker.stopFlickering(centerText); FlxG.sound.play(Assets.sound("menu/press")); }