Funkin/source/funkin/ui/freeplay/LetterSort.hx

251 lines
6.2 KiB
Haxe
Raw Normal View History

package funkin.ui.freeplay;
2022-09-27 04:37:42 -04:00
import flixel.FlxSprite;
import flixel.group.FlxGroup.FlxTypedGroup;
import flixel.group.FlxGroup;
import flixel.group.FlxSpriteGroup.FlxTypedSpriteGroup;
2023-08-06 16:24:34 -04:00
import flixel.tweens.FlxTween;
import flixel.tweens.FlxEase;
2023-08-06 17:02:37 -04:00
import flixel.util.FlxColor;
2023-08-06 22:20:18 -04:00
import flixel.util.FlxTimer;
import funkin.graphics.adobeanimate.FlxAtlasSprite;
2022-09-27 04:37:42 -04:00
2023-08-06 22:54:55 -04:00
class LetterSort extends FlxTypedSpriteGroup<FlxSprite>
2022-09-27 04:37:42 -04:00
{
public var letters:Array<FreeplayLetter> = [];
2022-09-27 04:37:42 -04:00
2023-08-07 17:58:55 -04:00
// starts at 2, cuz that's the middle letter on start (accounting for fav and #, it should begin at ALL filter)
2023-08-07 17:58:06 -04:00
var curSelection:Int = 2;
2022-09-27 04:37:42 -04:00
public var changeSelectionCallback:String->Void;
2022-09-27 04:37:42 -04:00
2023-08-06 22:54:55 -04:00
var leftArrow:FlxSprite;
var rightArrow:FlxSprite;
2023-08-07 17:58:06 -04:00
var grpSeperators:Array<FlxSprite> = [];
2023-08-06 22:20:18 -04:00
public var inputEnabled:Bool = true;
public function new(x, y)
{
super(x, y);
2022-09-27 04:37:42 -04:00
2023-08-06 22:54:55 -04:00
leftArrow = new FlxSprite(-20, 15).loadGraphic(Paths.image("freeplay/miniArrow"));
// leftArrow.animation.play("arrow");
2023-08-04 18:09:40 -04:00
leftArrow.flipX = true;
add(leftArrow);
2022-09-27 04:37:42 -04:00
2023-08-04 18:09:40 -04:00
for (i in 0...5)
{
var letter:FreeplayLetter = new FreeplayLetter(i * 80, 0, i);
2023-08-07 12:33:12 -04:00
letter.x += 50;
letter.y += 50;
2023-08-06 16:24:34 -04:00
letter.ogY = y;
2023-08-09 02:47:22 -04:00
// letter.visible = false;
add(letter);
2022-09-27 04:37:42 -04:00
letters.push(letter);
2022-09-27 04:37:42 -04:00
2023-08-06 17:06:07 -04:00
if (i != 2) letter.scale.x = letter.scale.y = 0.8;
2023-08-06 17:02:37 -04:00
var darkness:Float = Math.abs(i - 2) / 6;
letter.color = letter.color.getDarkened(darkness);
2022-09-27 04:37:42 -04:00
2023-08-04 18:09:40 -04:00
// don't put the last seperator
if (i == 4) continue;
2023-08-06 22:54:55 -04:00
var sep:FlxSprite = new FlxSprite((i * 80) + 55, 20).loadGraphic(Paths.image("freeplay/seperator"));
// sep.animation.play("seperator");
2023-08-06 17:02:37 -04:00
sep.color = letter.color.getDarkened(darkness);
add(sep);
2023-08-07 17:58:06 -04:00
grpSeperators.push(sep);
}
2022-09-27 04:37:42 -04:00
2023-08-06 22:54:55 -04:00
rightArrow = new FlxSprite(380, 15).loadGraphic(Paths.image("freeplay/miniArrow"));
// rightArrow.animation.play("arrow");
2023-08-04 18:09:40 -04:00
add(rightArrow);
2023-08-06 16:24:34 -04:00
changeSelection(0);
}
2022-09-27 04:37:42 -04:00
override function update(elapsed:Float)
{
super.update(elapsed);
2022-09-27 04:37:42 -04:00
if (inputEnabled)
{
if (FlxG.keys.justPressed.E) changeSelection(1);
if (FlxG.keys.justPressed.Q) changeSelection(-1);
}
}
2022-09-27 04:37:42 -04:00
public function changeSelection(diff:Int = 0)
{
2023-08-07 17:58:06 -04:00
var ezTimer:Int->FlxSprite->Float->Void = function(frameNum:Int, spr:FlxSprite, offsetNum:Float) {
2023-08-07 17:26:51 -04:00
new FlxTimer().start(frameNum / 24, function(_) {
2023-08-07 17:58:06 -04:00
spr.offset.x = offsetNum;
2023-08-07 17:26:51 -04:00
});
};
2023-08-07 17:58:06 -04:00
var positions:Array<Float> = [-10, -22, 2, 0];
2023-08-07 17:26:51 -04:00
2023-08-06 22:20:18 -04:00
if (diff < 0)
{
2023-08-07 17:58:06 -04:00
for (sep in grpSeperators)
{
ezTimer(0, sep, positions[0]);
ezTimer(1, sep, positions[1]);
ezTimer(2, sep, positions[2]);
ezTimer(3, sep, positions[3]);
}
2023-08-07 17:26:51 -04:00
for (index => letter in letters)
{
letter.offset.x = positions[0];
new FlxTimer().start(1 / 24, function(_) {
letter.offset.x = positions[1];
if (index == 0) letter.visible = false;
});
new FlxTimer().start(2 / 24, function(_) {
letter.offset.x = positions[2];
2023-08-07 17:58:06 -04:00
if (index == 0.) letter.visible = true;
2023-08-07 17:26:51 -04:00
});
if (index == 2)
{
ezTimer(3, letter, 0);
// letter.offset.x = 0;
continue;
}
ezTimer(3, letter, positions[3]);
}
2023-08-06 22:20:18 -04:00
leftArrow.offset.x = 3;
new FlxTimer().start(2 / 24, function(_) {
leftArrow.offset.x = 0;
});
}
else if (diff > 0)
{
2023-08-07 17:58:06 -04:00
for (sep in grpSeperators)
{
ezTimer(0, sep, -positions[0]);
ezTimer(1, sep, -positions[1]);
ezTimer(2, sep, -positions[2]);
ezTimer(3, sep, -positions[3]);
}
2023-08-07 17:26:51 -04:00
// same timing and functions and shit as the left one... except to the right!!
2023-08-07 17:58:06 -04:00
2023-08-07 17:26:51 -04:00
for (index => letter in letters)
{
letter.offset.x = -positions[0];
new FlxTimer().start(1 / 24, function(_) {
letter.offset.x = -positions[1];
2023-08-07 17:58:06 -04:00
if (index == 0) letter.visible = false;
2023-08-07 17:26:51 -04:00
});
new FlxTimer().start(2 / 24, function(_) {
letter.offset.x = -positions[2];
2023-08-07 17:58:06 -04:00
if (index == 0) letter.visible = true;
2023-08-07 17:26:51 -04:00
});
if (index == 2)
{
ezTimer(3, letter, 0);
// letter.offset.x = 0;
continue;
}
ezTimer(3, letter, -positions[3]);
}
2023-08-06 22:20:18 -04:00
rightArrow.offset.x = -3;
new FlxTimer().start(2 / 24, function(_) {
rightArrow.offset.x = 0;
});
}
2023-08-06 16:24:34 -04:00
curSelection += diff;
2023-08-07 12:33:12 -04:00
if (curSelection < 0) curSelection = letters[0].arr.length - 1;
if (curSelection >= letters[0].arr.length) curSelection = 0;
2023-08-06 16:24:34 -04:00
for (letter in letters)
2023-08-07 17:58:06 -04:00
letter.changeLetter(diff, curSelection);
2022-09-27 04:37:42 -04:00
2023-08-04 18:09:40 -04:00
if (changeSelectionCallback != null) changeSelectionCallback(letters[2].arr[letters[2].curLetter]); // bullshit and long lol!
}
2022-09-27 04:37:42 -04:00
}
2023-08-06 22:20:18 -04:00
class FreeplayLetter extends FlxAtlasSprite
2022-09-27 04:37:42 -04:00
{
public var arr:Array<String> = [];
2022-09-27 04:37:42 -04:00
public var curLetter:Int = 0;
2022-09-27 04:37:42 -04:00
2023-08-06 16:24:34 -04:00
public var ogY:Float = 0;
public function new(x:Float, y:Float, ?letterInd:Int)
{
2023-08-06 22:20:18 -04:00
super(x, y, Paths.animateAtlas("freeplay/sortedLetters"));
// frames = Paths.getSparrowAtlas("freeplay/letterStuff");
// this.anim.play("AB");
// trace(this.anim.symbolDictionary);
2022-09-27 04:37:42 -04:00
2023-08-06 22:20:18 -04:00
var alphabet:String = "AB-CD-EH-I L-MN-OR-s-t-UZ";
arr = alphabet.split("-");
arr.insert(0, "ALL");
arr.insert(0, "fav");
2023-08-06 22:20:18 -04:00
arr.insert(0, "#");
2022-09-27 04:37:42 -04:00
2023-08-06 22:20:18 -04:00
// trace(arr);
// for (str in arr)
// {
// animation.addByPrefix(str, str + " "); // string followed by a space! intentional!
// }
2022-09-27 04:37:42 -04:00
2023-08-06 22:20:18 -04:00
// animation.addByPrefix("arrow", "mini arrow");
// animation.addByPrefix("seperator", "seperator");
2022-09-27 04:37:42 -04:00
if (letterInd != null)
{
2023-08-07 12:33:12 -04:00
this.anim.play(arr[letterInd] + " move");
this.anim.pause();
curLetter = letterInd;
}
}
2022-09-27 04:37:42 -04:00
2023-08-06 16:24:34 -04:00
public function changeLetter(diff:Int = 0, ?curSelection:Int)
{
curLetter += diff;
2022-09-27 04:37:42 -04:00
if (curLetter < 0) curLetter = arr.length - 1;
if (curLetter >= arr.length) curLetter = 0;
2022-09-27 04:37:42 -04:00
2023-08-07 15:42:38 -04:00
var animName:String = arr[curLetter] + " move";
2023-08-07 17:58:06 -04:00
2023-08-07 15:42:38 -04:00
switch (arr[curLetter])
{
case "I L":
animName = "IL move";
case "s":
animName = "S move";
case "t":
animName = "T move";
}
this.anim.play(animName);
2023-08-07 17:58:06 -04:00
if (curSelection != curLetter)
{
this.anim.pause();
}
// updateHitbox();
}
2022-09-27 04:37:42 -04:00
}