From c3d30f6711c849c1221fd443e73920e4e74928d0 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Wed, 9 Aug 2023 02:47:22 -0400
Subject: [PATCH] polish / optimize in progress

---
 source/funkin/FreeplayState.hx              | 49 ++++++--------------
 source/funkin/freeplayStuff/LetterSort.hx   |  9 +---
 source/funkin/freeplayStuff/SongMenuItem.hx | 51 ++++++++++++++++++---
 3 files changed, 58 insertions(+), 51 deletions(-)

diff --git a/source/funkin/FreeplayState.hx b/source/funkin/FreeplayState.hx
index 82629dba5..16c4d5233 100644
--- a/source/funkin/FreeplayState.hx
+++ b/source/funkin/FreeplayState.hx
@@ -420,7 +420,7 @@ class FreeplayState extends MusicBeatSubState
       grpTxtScrolls.visible = true;
     });
 
-    generateSongList();
+    generateSongList(null, false);
 
     // FlxG.sound.playMusic(Paths.music('title'), 0);
     // FlxG.sound.music.fadeIn(2, 0, 0.8);
@@ -468,7 +468,10 @@ class FreeplayState extends MusicBeatSubState
   {
     curSelected = 1;
 
-    grpCapsules.clear();
+    for (cap in grpCapsules.members)
+      cap.kill();
+
+    // grpCapsules.clear();
 
     // var regexp:EReg = regexp;
     var tempSongs:Array<FreeplaySongData> = songs;
@@ -499,23 +502,8 @@ class FreeplayState extends MusicBeatSubState
       }
     }
 
-    // if (regexp != null)
-    // 	tempSongs = songs.filter(item -> regexp.match(item.songName));
-
-    // tempSongs.sort(function(a, b):Int
-    // {
-    // 	var tempA = a.songName.toUpperCase();
-    // 	var tempB = b.songName.toUpperCase();
-
-    // 	if (tempA < tempB)
-    // 		return -1;
-    // 	else if (tempA > tempB)
-    // 		return 1;
-    // 	else
-    // 		return 0;
-    // });
-
-    var randomCapsule:SongMenuItem = new SongMenuItem(FlxG.width, 0, "Random");
+    var randomCapsule:SongMenuItem = grpCapsules.recycle(SongMenuItem);
+    randomCapsule.init(FlxG.width, 0, "Random");
     randomCapsule.onConfirm = function() {
       trace("RANDOM SELECTED");
     };
@@ -529,7 +517,8 @@ class FreeplayState extends MusicBeatSubState
 
     for (i in 0...tempSongs.length)
     {
-      var funnyMenu:SongMenuItem = new SongMenuItem(FlxG.width, 0, tempSongs[i].songName);
+      var funnyMenu:SongMenuItem = grpCapsules.recycle(SongMenuItem);
+      funnyMenu.init(FlxG.width, 0, tempSongs[i].songName);
       if (tempSongs[i].songCharacter != null) funnyMenu.setCharacter(tempSongs[i].songCharacter);
       funnyMenu.onConfirm = capsuleOnConfirmDefault;
       funnyMenu.y = funnyMenu.intendedY(i + 1) + 10;
@@ -540,20 +529,12 @@ class FreeplayState extends MusicBeatSubState
       funnyMenu.favIcon.visible = tempSongs[i].isFav;
 
       // fp.updateScore(0);
-      funnyMenu.initJumpIn(Math.min(i, 4), force);
+
+      if (i < 8) funnyMenu.initJumpIn(Math.min(i, 4), force);
+      else
+        funnyMenu.forcePosition();
 
       grpCapsules.add(funnyMenu);
-
-      var songText:Alphabet = new Alphabet(0, (70 * i) + 30, tempSongs[i].songName, true, false);
-      songText.x += 100;
-      songText.isMenuItem = true;
-      songText.targetY = i;
-
-      // grpSongs.add(songText);
-
-      // songText.x += 40;
-      // DONT PUT X IN THE FIRST PARAMETER OF new ALPHABET() !!
-      // songText.screenCenter(X);
     }
 
     changeSelection();
@@ -958,8 +939,6 @@ class FreeplayState extends MusicBeatSubState
   {
     // fp.updateScore(12345);
 
-    NGio.logEvent('Fresh');
-
     // NGio.logEvent('Fresh');
     FlxG.sound.play(Paths.sound('scrollMenu'), 0.4);
 
@@ -979,8 +958,6 @@ class FreeplayState extends MusicBeatSubState
     // FlxG.sound.playMusic(Paths.inst(songs[curSelected].songName), 0);
     #end
 
-    var bullShit:Int = 0;
-
     for (index => capsule in grpCapsules.members)
     {
       index += 1;
diff --git a/source/funkin/freeplayStuff/LetterSort.hx b/source/funkin/freeplayStuff/LetterSort.hx
index 3fbbc12c4..e6d923c90 100644
--- a/source/funkin/freeplayStuff/LetterSort.hx
+++ b/source/funkin/freeplayStuff/LetterSort.hx
@@ -38,16 +38,12 @@ class LetterSort extends FlxTypedSpriteGroup<FlxSprite>
       letter.x += 50;
       letter.y += 50;
       letter.ogY = y;
+      // letter.visible = false;
       add(letter);
 
       letters.push(letter);
 
       if (i != 2) letter.scale.x = letter.scale.y = 0.8;
-      else
-      {
-        // letter.x += 10;
-        // letter.scale.x = letter.scale.y = 1.1;
-      }
 
       var darkness:Float = Math.abs(i - 2) / 6;
 
@@ -242,9 +238,6 @@ class FreeplayLetter extends FlxAtlasSprite
     this.anim.play(animName);
     if (curSelection != curLetter)
     {
-      trace(animName);
-      trace(curLetter);
-      trace(curSelection);
       this.anim.pause();
     }
     // updateHitbox();
diff --git a/source/funkin/freeplayStuff/SongMenuItem.hx b/source/funkin/freeplayStuff/SongMenuItem.hx
index a11538791..3a1dfacbf 100644
--- a/source/funkin/freeplayStuff/SongMenuItem.hx
+++ b/source/funkin/freeplayStuff/SongMenuItem.hx
@@ -50,6 +50,7 @@ class SongMenuItem extends FlxSpriteGroup
     pixelIcon = new FlxSprite(80, 35);
     pixelIcon.makeGraphic(32, 32, 0x00000000);
     pixelIcon.antialiasing = false;
+    pixelIcon.active = false;
     add(pixelIcon);
 
     if (character != null) setCharacter(character);
@@ -64,6 +65,17 @@ class SongMenuItem extends FlxSpriteGroup
     selected = selected; // just to kickstart the set_selected
   }
 
+  public function init(x:Float, y:Float, song:String, ?character:String)
+  {
+    this.x = x;
+    this.y = y;
+    this.songTitle = song;
+    songText.text = this.songTitle;
+    if (character != null) setCharacter(character);
+
+    selected = selected;
+  }
+
   /**
    * [Description]
    * @param char Should be songCharacter, and will get translated to the correct path via switch
@@ -103,6 +115,8 @@ class SongMenuItem extends FlxSpriteGroup
 
   public function initJumpIn(maxTimer:Float, ?force:Bool):Void
   {
+    frameInTypeBeat = 0;
+
     new FlxTimer().start((1 / 24) * maxTimer, function(doShit) {
       doJumpIn = true;
     });
@@ -111,18 +125,41 @@ class SongMenuItem extends FlxSpriteGroup
       doLerp = true;
     });
 
-    if (!force)
+    if (force)
     {
-      new FlxTimer().start(((0.20 * maxTimer) / (1 + maxTimer)) + 0.75, function(swagShi) {
+      alpha = 1;
+      songText.visible = true;
+    }
+    else
+    {
+      new FlxTimer().start((xFrames.length / 24) * 2.5, function(_) {
         songText.visible = true;
         alpha = 1;
       });
     }
-    else
-    {
-      songText.visible = true;
-      alpha = 1;
-    }
+  }
+
+  public function forcePosition()
+  {
+    alpha = 1;
+    doLerp = true;
+    doJumpIn = false;
+    doJumpOut = false;
+
+    frameInTypeBeat = xFrames.length;
+    frameOutTypeBeat = 0;
+
+    capsule.scale.x = xFrames[frameInTypeBeat - 1];
+    capsule.scale.y = 1 / xFrames[frameInTypeBeat - 1];
+    // x = FlxG.width * xPosLerpLol[Std.int(Math.min(frameInTypeBeat - 1, xPosLerpLol.length - 1))];
+
+    x = targetPos.x;
+    y = targetPos.y;
+
+    capsule.scale.x *= realScaled;
+    capsule.scale.y *= realScaled;
+
+    songText.visible = true;
   }
 
   override function update(elapsed:Float)