From c0660bd0c2f56f3f284c1d2bb9e24a4b3ebfb06f Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Thu, 21 Oct 2021 23:08:48 -0400
Subject: [PATCH] cool shit

---
 source/FreeplayState.hx                 | 94 ++++++++++++++++++++++++-
 source/freeplayStuff/BGScrollingText.hx | 93 ++++++++++++++++++++++++
 source/freeplayStuff/DJBoyfriend.hx     |  6 ++
 source/shaderslmfao/AngleMask.hx        | 43 +++++++++++
 4 files changed, 233 insertions(+), 3 deletions(-)
 create mode 100644 source/freeplayStuff/BGScrollingText.hx
 create mode 100644 source/shaderslmfao/AngleMask.hx

diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx
index e8ec9effe..b3bd97dd0 100644
--- a/source/FreeplayState.hx
+++ b/source/FreeplayState.hx
@@ -6,19 +6,25 @@ import flixel.FlxGame;
 import flixel.FlxSprite;
 import flixel.FlxState;
 import flixel.addons.display.FlxGridOverlay;
+import flixel.addons.transition.FlxTransitionableState;
 import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.group.FlxGroup;
 import flixel.input.touch.FlxTouch;
 import flixel.math.FlxAngle;
 import flixel.math.FlxMath;
 import flixel.math.FlxPoint;
 import flixel.text.FlxText;
+import flixel.tweens.FlxEase;
 import flixel.tweens.FlxTween;
 import flixel.util.FlxColor;
+import flixel.util.FlxSpriteUtil;
 import flixel.util.FlxTimer;
+import freeplayStuff.BGScrollingText;
 import freeplayStuff.DJBoyfriend;
 import freeplayStuff.SongMenuItem;
 import lime.app.Future;
 import lime.utils.Assets;
+import shaderslmfao.AngleMask;
 
 using StringTools;
 
@@ -55,6 +61,8 @@ class FreeplayState extends MusicBeatState
 
 	override function create()
 	{
+		FlxTransitionableState.skipNextTransIn = true;
+
 		#if discord_rpc
 		// Updating Discord Rich Presence
 		DiscordClient.changePresence("In the Menus", null);
@@ -114,12 +122,95 @@ class FreeplayState extends MusicBeatState
 		trace(FlxCamera.defaultZoom);
 		trace(FlxG.initialZoom);
 
+		var pinkBack:FlxSprite = new FlxSprite().loadGraphic(Paths.image('freeplay/pinkBack'));
+		pinkBack.color = 0xFFffd4e9; // sets it to pink!
+		pinkBack.x -= pinkBack.width;
+
+		FlxTween.tween(pinkBack, {x: 0}, 0.6, {ease: FlxEase.quartOut});
+		add(pinkBack);
+
+		var orangeBackShit:FlxSprite = new FlxSprite(84, FlxG.height * 0.68).makeGraphic(Std.int(pinkBack.width), 50, 0xFFffd400);
+		add(orangeBackShit);
+
+		var alsoOrangeLOL:FlxSprite = new FlxSprite(0, orangeBackShit.y).makeGraphic(100, Std.int(orangeBackShit.height), 0xFFffd400);
+		add(alsoOrangeLOL);
+
+		FlxSpriteUtil.alphaMaskFlxSprite(orangeBackShit, pinkBack, orangeBackShit);
+		orangeBackShit.visible = false;
+		alsoOrangeLOL.visible = false;
+
+		var grpTxtScrolls:FlxGroup = new FlxGroup();
+		add(grpTxtScrolls);
+		grpTxtScrolls.visible = false;
+
+		var moreWays:BGScrollingText = new BGScrollingText(0, 200, "HOT BLOODED IN MORE WAYS THAN ONE", FlxG.width);
+		moreWays.funnyColor = 0xFFfff383;
+		moreWays.speed = 2;
+		grpTxtScrolls.add(moreWays);
+
+		var funnyScroll:BGScrollingText = new BGScrollingText(0, 250, "BOYFRIEND", FlxG.width / 2);
+		funnyScroll.funnyColor = 0xFFff9963;
+		funnyScroll.speed = -0.5;
+		grpTxtScrolls.add(funnyScroll);
+
+		var txtNuts:BGScrollingText = new BGScrollingText(0, 300, "PROTECT YO NUTS", FlxG.width / 2);
+		grpTxtScrolls.add(txtNuts);
+
+		var funnyScroll2:BGScrollingText = new BGScrollingText(0, 340, "BOYFRIEND", FlxG.width / 2);
+		funnyScroll2.funnyColor = 0xFFff9963;
+		funnyScroll2.speed = -0.6;
+		grpTxtScrolls.add(funnyScroll2);
+
+		var moreWays2:BGScrollingText = new BGScrollingText(0, 400, "HOT BLOODED IN MORE WAYS THAN ONE", FlxG.width);
+		moreWays2.funnyColor = 0xFFfff383;
+		moreWays2.speed = 2.2;
+		grpTxtScrolls.add(moreWays2);
+
+		var funnyScroll3:BGScrollingText = new BGScrollingText(0, orangeBackShit.y, "BOYFRIEND", FlxG.width / 2);
+		funnyScroll3.funnyColor = 0xFFff9963;
+		funnyScroll3.speed = -0.4;
+		grpTxtScrolls.add(funnyScroll3);
+
+		var dj:DJBoyfriend = new DJBoyfriend(0, -100);
+		add(dj);
+
+		var bgDad:FlxSprite = new FlxSprite(FlxG.width, 0).loadGraphic(Paths.image('freeplay/freeplayBGdad'));
+		bgDad.setGraphicSize(0, FlxG.height);
+		bgDad.updateHitbox();
+		bgDad.shader = new AngleMask();
+
+		var blackOverlayBullshitLOLXD:FlxSprite = new FlxSprite(pinkBack.width * 0.75).makeGraphic(Std.int(bgDad.width), Std.int(bgDad.height),
+			FlxColor.BLACK);
+		add(blackOverlayBullshitLOLXD); // used to mask the text lol!
+		add(bgDad);
+
+		blackOverlayBullshitLOLXD.shader = bgDad.shader;
+
 		grpSongs = new FlxTypedGroup<Alphabet>();
 		add(grpSongs);
 
 		grpCapsules = new FlxTypedGroup<SongMenuItem>();
 		add(grpCapsules);
 
+		var overhangStuff:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 64, FlxColor.BLACK);
+		overhangStuff.y -= overhangStuff.height;
+		add(overhangStuff);
+
+		var fnfFreeplay:FlxText = new FlxText(0, -64, 0, "Freeplay", 48);
+		fnfFreeplay.font = "VCR OSD Mono";
+		add(fnfFreeplay);
+
+		dj.animHITsignal.add(function()
+		{
+			pinkBack.color = 0xFFffd863;
+			FlxTween.tween(overhangStuff, {y: 0}, 0.3, {ease: FlxEase.quartOut});
+			FlxTween.tween(fnfFreeplay, {y: 12}, 0.3, {ease: FlxEase.quartOut, startDelay: 0.5});
+			FlxTween.tween(bgDad, {x: pinkBack.width * 0.75}, 1, {ease: FlxEase.quintOut});
+			orangeBackShit.visible = true;
+			alsoOrangeLOL.visible = true;
+			grpTxtScrolls.visible = true;
+		});
+
 		for (i in 0...songs.length)
 		{
 			var funnyMenu:SongMenuItem = new SongMenuItem(FlxG.width, (i * 150) + 160, songs[i].songName);
@@ -170,9 +261,6 @@ class FreeplayState extends MusicBeatState
 		changeSelection();
 		changeDiff();
 
-		var dj:DJBoyfriend = new DJBoyfriend(0, -100);
-		add(dj);
-
 		// FlxG.sound.playMusic(Paths.music('title'), 0);
 		// FlxG.sound.music.fadeIn(2, 0, 0.8);
 		// selector = new FlxText();
diff --git a/source/freeplayStuff/BGScrollingText.hx b/source/freeplayStuff/BGScrollingText.hx
new file mode 100644
index 000000000..2a4a354cb
--- /dev/null
+++ b/source/freeplayStuff/BGScrollingText.hx
@@ -0,0 +1,93 @@
+package freeplayStuff;
+
+import flixel.FlxObject;
+import flixel.group.FlxGroup.FlxTypedGroup;
+import flixel.group.FlxSpriteGroup;
+import flixel.math.FlxMath;
+import flixel.text.FlxText;
+import flixel.util.FlxColor;
+import flixel.util.FlxSort;
+
+// its kinda like marqeee html lol!
+class BGScrollingText extends FlxSpriteGroup
+{
+	var grpTexts:FlxTypedSpriteGroup<FlxText>;
+
+	public var widthShit:Float = FlxG.width;
+	public var placementOffset:Float = 20;
+	public var speed:Float = 1;
+
+	public var funnyColor(default, set):Int = 0xFFFFFFFF;
+
+	public function new(x:Float, y:Float, text:String, widthShit:Float = 100)
+	{
+		super(x, y);
+
+		this.widthShit = widthShit;
+
+		grpTexts = new FlxTypedSpriteGroup<FlxText>();
+		add(grpTexts);
+
+		var testText:FlxText = new FlxText(0, 0, 0, text, 48);
+		testText.font = "5by7";
+		testText.updateHitbox();
+		grpTexts.add(testText);
+
+		var needed:Int = Math.ceil(widthShit / testText.frameWidth);
+
+		for (i in 0...needed)
+		{
+			var lmfao:Int = i + 1;
+
+			var coolText:FlxText = new FlxText((lmfao * testText.frameWidth) + (lmfao * 20), 0, 0, text, 48);
+			coolText.font = "5by7";
+			coolText.updateHitbox();
+			grpTexts.add(coolText);
+		}
+	}
+
+	function set_funnyColor(col:Int):Int
+	{
+		grpTexts.forEach(function(txt)
+		{
+			txt.color = col;
+		});
+
+		return col;
+	}
+
+	override function update(elapsed:Float)
+	{
+		for (txt in grpTexts.group)
+		{
+			txt.x -= 1 * speed;
+
+			if (speed > 0)
+			{
+				if (txt.x < -txt.frameWidth)
+				{
+					txt.x = grpTexts.group.members[grpTexts.length - 1].x + grpTexts.group.members[grpTexts.length - 1].frameWidth + placementOffset;
+					sortTextShit();
+				}
+			}
+			else
+			{
+				if (txt.x > widthShit)
+				{
+					txt.x = grpTexts.group.members[0].x - grpTexts.group.members[0].frameWidth - placementOffset;
+					sortTextShit();
+				}
+			}
+		}
+
+		super.update(elapsed);
+	}
+
+	function sortTextShit():Void
+	{
+		grpTexts.sort(function(Order:Int, Obj1:FlxObject, Obj2:FlxObject)
+		{
+			return FlxSort.byValues(Order, Obj1.x, Obj2.x);
+		});
+	}
+}
diff --git a/source/freeplayStuff/DJBoyfriend.hx b/source/freeplayStuff/DJBoyfriend.hx
index c1e8428ee..25c725b11 100644
--- a/source/freeplayStuff/DJBoyfriend.hx
+++ b/source/freeplayStuff/DJBoyfriend.hx
@@ -1,13 +1,18 @@
 package freeplayStuff;
 
 import flixel.FlxSprite;
+import flixel.util.FlxSignal;
 
 class DJBoyfriend extends FlxSprite
 {
+	public var animHITsignal:FlxSignal;
+
 	public function new(x:Float, y:Float)
 	{
 		super(x, y);
 
+		animHITsignal = new FlxSignal();
+
 		animOffsets = new Map<String, Array<Dynamic>>();
 
 		frames = Paths.getSparrowAtlas('freeplay/bfFreeplay');
@@ -24,6 +29,7 @@ class DJBoyfriend extends FlxSprite
 			switch (anim)
 			{
 				case "intro":
+					animHITsignal.dispatch();
 					playAnim('idle'); // plays idle anim after playing intro
 			}
 		};
diff --git a/source/shaderslmfao/AngleMask.hx b/source/shaderslmfao/AngleMask.hx
new file mode 100644
index 000000000..2b276de05
--- /dev/null
+++ b/source/shaderslmfao/AngleMask.hx
@@ -0,0 +1,43 @@
+package shaderslmfao;
+
+import flixel.system.FlxAssets.FlxShader;
+
+class AngleMask extends FlxShader
+{
+	@:glFragmentSource('
+		#pragma header
+        uniform vec2 endPosition;
+		void main()
+		{
+			vec4 base = texture2D(bitmap, openfl_TextureCoordv);
+
+            vec2 uv = openfl_TextureCoordv.xy;
+
+            
+
+            vec2 start = vec2(0.0, 0.0);
+            vec2 end = vec2(endPosition.x / openfl_TextureSize.x, 1.0);
+
+            float dx = end.x - start.x;
+            float dy = end.y - start.y;
+
+            float angle = atan(dy, dx);
+
+            uv.x -= start.x;
+            uv.y -= start.y;
+
+            float uvA = atan(uv.y, uv.x);
+
+            if (uvA < angle)
+                gl_FragColor = base;
+            else
+                gl_FragColor = vec4(0.0);
+
+		}')
+	public function new()
+	{
+		super();
+
+		endPosition.value = [90, 100]; // 100 AS DEFAULT WORKS NICELY FOR FREEPLAY?
+	}
+}