From 4e3a29943a7027659b66d751e6791051fcf24309 Mon Sep 17 00:00:00 2001
From: Lotusotho <69006987+lotusotho@users.noreply.github.com>
Date: Thu, 4 Feb 2021 22:36:01 +0100
Subject: [PATCH 1/9] Fixed bug at the start of the dialogue

---
 source/DialogueBox.hx | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/source/DialogueBox.hx b/source/DialogueBox.hx
index f9c443952..ca3a5282f 100644
--- a/source/DialogueBox.hx
+++ b/source/DialogueBox.hx
@@ -33,6 +33,8 @@ class DialogueBox extends FlxSpriteGroup
 
 	var handSelect:FlxSprite;
 	var bgFade:FlxSprite;
+	
+	var firstDialogue:Bool = true;
 
 	public function new(talkingRight:Bool = true, ?dialogueList:Array<String>)
 	{
@@ -171,13 +173,13 @@ class DialogueBox extends FlxSpriteGroup
 			dialogueStarted = true;
 		}
 
-		if (FlxG.keys.justPressed.ANY)
+		if (FlxG.keys.justPressed.ANY  && dialogueStarted == true)
 		{
 			remove(dialogue);
-
+				
 			FlxG.sound.play('assets/sounds/clickText' + TitleState.soundExt, 0.8);
 
-			if (dialogueList[1] == null)
+			if (dialogueList[1] == null && dialogueList[0] != null)
 			{
 				if (!isEnding)
 				{
@@ -209,7 +211,7 @@ class DialogueBox extends FlxSpriteGroup
 				startDialogue();
 			}
 		}
-
+		
 		super.update(elapsed);
 	}
 
@@ -218,7 +220,6 @@ class DialogueBox extends FlxSpriteGroup
 	function startDialogue():Void
 	{
 		cleanDialog();
-
 		// var theDialog:Alphabet = new Alphabet(0, 70, dialogueList[0], false, true);
 		// dialogue = theDialog;
 		// add(theDialog);

From 823acd7a603df19a31c6e3451a8176097b14c4dd Mon Sep 17 00:00:00 2001
From: Lotusotho <69006987+lotusotho@users.noreply.github.com>
Date: Thu, 4 Feb 2021 22:40:02 +0100
Subject: [PATCH 2/9] Deleted bool I created before

---
 source/DialogueBox.hx | 2 --
 1 file changed, 2 deletions(-)

diff --git a/source/DialogueBox.hx b/source/DialogueBox.hx
index ca3a5282f..184ad4dbd 100644
--- a/source/DialogueBox.hx
+++ b/source/DialogueBox.hx
@@ -33,8 +33,6 @@ class DialogueBox extends FlxSpriteGroup
 
 	var handSelect:FlxSprite;
 	var bgFade:FlxSprite;
-	
-	var firstDialogue:Bool = true;
 
 	public function new(talkingRight:Bool = true, ?dialogueList:Array<String>)
 	{

From 7a701826974693c17946fc49ca7b14c1b576c91a Mon Sep 17 00:00:00 2001
From: MtH <mth@mth.moe>
Date: Sat, 13 Feb 2021 23:39:31 +0100
Subject: [PATCH 3/9] better sustain notes & organizing

---
 source/Note.hx      |  40 +++---------
 source/PlayState.hx | 150 +++++++++++++++++++++++++-------------------
 2 files changed, 94 insertions(+), 96 deletions(-)

diff --git a/source/Note.hx b/source/Note.hx
index 32e1b5c18..2b04b5985 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -51,33 +51,7 @@ class Note extends FlxSprite
 
 		switch (daStage)
 		{
-			case 'school':
-				loadGraphic('assets/images/weeb/pixelUI/arrows-pixels.png', true, 17, 17);
-
-				animation.add('greenScroll', [6]);
-				animation.add('redScroll', [7]);
-				animation.add('blueScroll', [5]);
-				animation.add('purpleScroll', [4]);
-
-				if (isSustainNote)
-				{
-					loadGraphic('assets/images/weeb/pixelUI/arrowEnds.png', true, 7, 6);
-
-					animation.add('purpleholdend', [4]);
-					animation.add('greenholdend', [6]);
-					animation.add('redholdend', [7]);
-					animation.add('blueholdend', [5]);
-
-					animation.add('purplehold', [0]);
-					animation.add('greenhold', [2]);
-					animation.add('redhold', [3]);
-					animation.add('bluehold', [1]);
-				}
-
-				setGraphicSize(Std.int(width * PlayState.daPixelZoom));
-				updateHitbox();
-
-			case 'schoolEvil': // COPY PASTED CUZ I AM LAZY
+			case 'school' | 'schoolEvil':
 				loadGraphic('assets/images/weeb/pixelUI/arrows-pixels.png', true, 17, 17);
 
 				animation.add('greenScroll', [6]);
@@ -174,18 +148,18 @@ class Note extends FlxSprite
 			{
 				switch (prevNote.noteData)
 				{
+					case 0:
+						prevNote.animation.play('purplehold');
+					case 1:
+						prevNote.animation.play('bluehold');
 					case 2:
 						prevNote.animation.play('greenhold');
 					case 3:
 						prevNote.animation.play('redhold');
-					case 1:
-						prevNote.animation.play('bluehold');
-					case 0:
-						prevNote.animation.play('purplehold');
 				}
 
-				prevNote.offset.y = -19;
-				prevNote.scale.y *= (2.25 * FlxMath.roundDecimal(PlayState.SONG.speed, 1));
+				prevNote.scale.y *= Conductor.stepCrochet / 100 * 1.5 * PlayState.SONG.speed;
+				prevNote.updateHitbox();
 				// prevNote.setGraphicSize();
 			}
 		}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index cb4f4876b..89efc8bd3 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -1096,6 +1096,16 @@ class PlayState extends MusicBeatState
 
 					switch (Math.abs(i))
 					{
+						case 0:
+							babyArrow.x += Note.swagWidth * 0;
+							babyArrow.animation.add('static', [0]);
+							babyArrow.animation.add('pressed', [4, 8], 12, false);
+							babyArrow.animation.add('confirm', [12, 16], 24, false);
+						case 1:
+							babyArrow.x += Note.swagWidth * 1;
+							babyArrow.animation.add('static', [1]);
+							babyArrow.animation.add('pressed', [5, 9], 12, false);
+							babyArrow.animation.add('confirm', [13, 17], 24, false);
 						case 2:
 							babyArrow.x += Note.swagWidth * 2;
 							babyArrow.animation.add('static', [2]);
@@ -1106,16 +1116,6 @@ class PlayState extends MusicBeatState
 							babyArrow.animation.add('static', [3]);
 							babyArrow.animation.add('pressed', [7, 11], 12, false);
 							babyArrow.animation.add('confirm', [15, 19], 24, false);
-						case 1:
-							babyArrow.x += Note.swagWidth * 1;
-							babyArrow.animation.add('static', [1]);
-							babyArrow.animation.add('pressed', [5, 9], 12, false);
-							babyArrow.animation.add('confirm', [13, 17], 24, false);
-						case 0:
-							babyArrow.x += Note.swagWidth * 0;
-							babyArrow.animation.add('static', [0]);
-							babyArrow.animation.add('pressed', [4, 8], 12, false);
-							babyArrow.animation.add('confirm', [12, 16], 24, false);
 					}
 
 				default:
@@ -1130,6 +1130,16 @@ class PlayState extends MusicBeatState
 
 					switch (Math.abs(i))
 					{
+						case 0:
+							babyArrow.x += Note.swagWidth * 0;
+							babyArrow.animation.addByPrefix('static', 'arrowLEFT');
+							babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
+							babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
+						case 1:
+							babyArrow.x += Note.swagWidth * 1;
+							babyArrow.animation.addByPrefix('static', 'arrowDOWN');
+							babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
+							babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
 						case 2:
 							babyArrow.x += Note.swagWidth * 2;
 							babyArrow.animation.addByPrefix('static', 'arrowUP');
@@ -1140,16 +1150,6 @@ class PlayState extends MusicBeatState
 							babyArrow.animation.addByPrefix('static', 'arrowRIGHT');
 							babyArrow.animation.addByPrefix('pressed', 'right press', 24, false);
 							babyArrow.animation.addByPrefix('confirm', 'right confirm', 24, false);
-						case 1:
-							babyArrow.x += Note.swagWidth * 1;
-							babyArrow.animation.addByPrefix('static', 'arrowDOWN');
-							babyArrow.animation.addByPrefix('pressed', 'down press', 24, false);
-							babyArrow.animation.addByPrefix('confirm', 'down confirm', 24, false);
-						case 0:
-							babyArrow.x += Note.swagWidth * 0;
-							babyArrow.animation.addByPrefix('static', 'arrowLEFT');
-							babyArrow.animation.addByPrefix('pressed', 'left press', 24, false);
-							babyArrow.animation.addByPrefix('confirm', 'left confirm', 24, false);
 					}
 			}
 
@@ -1501,6 +1501,20 @@ class PlayState extends MusicBeatState
 					daNote.active = true;
 				}
 
+				daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SONG.speed, 2)));
+
+				// i am so fucking sorry for this if condition
+				if (daNote.isSustainNote && daNote.y + daNote.offset.y <= strumLine.y + Note.swagWidth/2
+					&& (!daNote.mustPress || (daNote.wasGoodHit || 
+						(daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
+				{
+					var swagRect = new FlxRect(0, strumLine.y + Note.swagWidth/2 - daNote.y, daNote.width * 2, daNote.height * 2);
+					swagRect.y /= daNote.scale.y;
+					swagRect.height -= swagRect.y;
+
+					daNote.clipRect = swagRect;
+				}
+
 				if (!daNote.mustPress && daNote.wasGoodHit)
 				{
 					if (SONG.song != 'Tutorial')
@@ -1516,14 +1530,14 @@ class PlayState extends MusicBeatState
 
 					switch (Math.abs(daNote.noteData))
 					{
+						case 0:
+							dad.playAnim('singLEFT' + altAnim, true);
+						case 1:
+							dad.playAnim('singDOWN' + altAnim, true);
 						case 2:
 							dad.playAnim('singUP' + altAnim, true);
 						case 3:
 							dad.playAnim('singRIGHT' + altAnim, true);
-						case 1:
-							dad.playAnim('singDOWN' + altAnim, true);
-						case 0:
-							dad.playAnim('singLEFT' + altAnim, true);
 					}
 
 					dad.holdTimer = 0;
@@ -1536,25 +1550,32 @@ class PlayState extends MusicBeatState
 					daNote.destroy();
 				}
 
-				daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(PlayState.SONG.speed, 2)));
-
 				// WIP interpolation shit? Need to fix the pause issue
 				// daNote.y = (strumLine.y - (songTime - daNote.strumTime) * (0.45 * PlayState.SONG.speed));
 
 				if (daNote.y < -daNote.height)
 				{
-					if (daNote.tooLate || !daNote.wasGoodHit)
+					if (daNote.isSustainNote && daNote.wasGoodHit)
 					{
-						health -= 0.0475;
-						vocals.volume = 0;
+						daNote.kill();
+						notes.remove(daNote, true);
+						daNote.destroy();
 					}
+					else
+					{
+						if (daNote.tooLate || !daNote.wasGoodHit)
+						{
+							health -= 0.0475;
+							vocals.volume = 0;
+						}
 
-					daNote.active = false;
-					daNote.visible = false;
+						daNote.active = false;
+						daNote.visible = false;
 
-					daNote.kill();
-					notes.remove(daNote, true);
-					daNote.destroy();
+						daNote.kill();
+						notes.remove(daNote, true);
+						daNote.destroy();
+					}
 				}
 			});
 		}
@@ -1934,18 +1955,18 @@ class PlayState extends MusicBeatState
 					switch (daNote.noteData)
 					{
 						// NOTES YOU ARE HOLDING
+						case 0:
+							if (left)
+								goodNoteHit(daNote);
+						case 1:
+							if (down)
+								goodNoteHit(daNote);
 						case 2:
 							if (up)
 								goodNoteHit(daNote);
 						case 3:
 							if (right)
 								goodNoteHit(daNote);
-						case 1:
-							if (down)
-								goodNoteHit(daNote);
-						case 0:
-							if (left)
-								goodNoteHit(daNote);
 					}
 				}
 			});
@@ -1963,6 +1984,16 @@ class PlayState extends MusicBeatState
 		{
 			switch (spr.ID)
 			{
+				case 0:
+					if (leftP && spr.animation.curAnim.name != 'confirm')
+						spr.animation.play('pressed');
+					if (leftR)
+						spr.animation.play('static');
+				case 1:
+					if (downP && spr.animation.curAnim.name != 'confirm')
+						spr.animation.play('pressed');
+					if (downR)
+						spr.animation.play('static');
 				case 2:
 					if (upP && spr.animation.curAnim.name != 'confirm')
 						spr.animation.play('pressed');
@@ -1973,16 +2004,6 @@ class PlayState extends MusicBeatState
 						spr.animation.play('pressed');
 					if (rightR)
 						spr.animation.play('static');
-				case 1:
-					if (downP && spr.animation.curAnim.name != 'confirm')
-						spr.animation.play('pressed');
-					if (downR)
-						spr.animation.play('static');
-				case 0:
-					if (leftP && spr.animation.curAnim.name != 'confirm')
-						spr.animation.play('pressed');
-					if (leftR)
-						spr.animation.play('static');
 			}
 
 			if (spr.animation.curAnim.name == 'confirm' && !curStage.startsWith('school'))
@@ -2023,14 +2044,14 @@ class PlayState extends MusicBeatState
 
 			switch (direction)
 			{
+				case 0:
+					boyfriend.playAnim('singLEFTmiss', true);
+				case 1:
+					boyfriend.playAnim('singDOWNmiss', true);
 				case 2:
 					boyfriend.playAnim('singUPmiss', true);
 				case 3:
 					boyfriend.playAnim('singRIGHTmiss', true);
-				case 1:
-					boyfriend.playAnim('singDOWNmiss', true);
-				case 0:
-					boyfriend.playAnim('singLEFTmiss', true);
 			}
 		}
 	}
@@ -2046,12 +2067,12 @@ class PlayState extends MusicBeatState
 
 		if (leftP)
 			noteMiss(0);
+		if (downP)
+			noteMiss(1);
 		if (upP)
 			noteMiss(2);
 		if (rightP)
 			noteMiss(3);
-		if (downP)
-			noteMiss(1);
 	}
 
 	function noteCheck(keyP:Bool, note:Note):Void
@@ -2081,14 +2102,14 @@ class PlayState extends MusicBeatState
 
 			switch (note.noteData)
 			{
+				case 0:
+					boyfriend.playAnim('singLEFT', true);
+				case 1:
+					boyfriend.playAnim('singDOWN', true);
 				case 2:
 					boyfriend.playAnim('singUP', true);
 				case 3:
 					boyfriend.playAnim('singRIGHT', true);
-				case 1:
-					boyfriend.playAnim('singDOWN', true);
-				case 0:
-					boyfriend.playAnim('singLEFT', true);
 			}
 
 			playerStrums.forEach(function(spr:FlxSprite)
@@ -2102,9 +2123,12 @@ class PlayState extends MusicBeatState
 			note.wasGoodHit = true;
 			vocals.volume = 1;
 
-			note.kill();
-			notes.remove(note, true);
-			note.destroy();
+			if (!note.isSustainNote)
+			{
+				note.kill();
+				notes.remove(note, true);
+				note.destroy();
+			}
 		}
 	}
 

From 76a3bd9b0e232c2d2b88f8a072622579acea200c Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sat, 13 Feb 2021 18:10:52 -0500
Subject: [PATCH 4/9] Update CHANGELOG.md

---
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85f61e9a0..0cf2241d1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Made the transitions between the story mode levels more seamless.
 ### Fixed
 - Chart's and chart editor now support changeBPM, GOD BLESS MTH FOR THIS ONE I BEEN STRUGGLIN WIT THAT SINCE OCTOBER LMAO ([GOD BLESS MTH](https://github.com/ninjamuffin99/Funkin/pull/382))
+- Fixed sustain note trails ALSO THANKS TO MTH U A REAL ONE ([MTH VERY POWERFUL](https://github.com/ninjamuffin99/Funkin/pull/415))
 - Antialiasing on the skyscraper lights
 
 ## [0.2.7] - 2021-02-02

From a41e14ecdfd3e0eb6a23fb6d7f62ef9ad50a18a5 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sun, 14 Feb 2021 03:32:24 -0500
Subject: [PATCH 5/9] icons and cleanin

---
 CHANGELOG.md        |  4 +++-
 Project.xml         |  5 ++++-
 source/Note.hx      | 28 +---------------------------
 source/PlayState.hx |  9 +++++----
 4 files changed, 13 insertions(+), 33 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85f61e9a0..5a7f47e6a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,10 +4,12 @@ All notable changes will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## [unreleased] 
+## [unreleased]
 ### Changed
+- New icons, old one was placeholder since October woops!
 - Made the transitions between the story mode levels more seamless.
 ### Fixed
+- Layering on Week 4 songs with GF and the LIMO LOL HOW TF I MISS THIS
 - Chart's and chart editor now support changeBPM, GOD BLESS MTH FOR THIS ONE I BEEN STRUGGLIN WIT THAT SINCE OCTOBER LMAO ([GOD BLESS MTH](https://github.com/ninjamuffin99/Funkin/pull/382))
 - Antialiasing on the skyscraper lights
 
diff --git a/Project.xml b/Project.xml
index 498368897..9a04d2611 100644
--- a/Project.xml
+++ b/Project.xml
@@ -116,7 +116,10 @@
 	<!-- _________________________________ Custom _______________________________ -->
 
 	<!--Place custom nodes like icons here (higher priority to override the HaxeFlixel icon)-->
-	<icon path="art/icon.png" />
+	
+	<icon path="art/icon16.png" size='16'/>
+	<icon path="art/icon32.png" size='32'/>
+	<icon path="art/icon64.png" size='64'/>
 
 
 	<!-- <haxedef name="SKIP_TO_PLAYSTATE" if="debug" /> -->
diff --git a/source/Note.hx b/source/Note.hx
index 32e1b5c18..954bbb64c 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -51,33 +51,7 @@ class Note extends FlxSprite
 
 		switch (daStage)
 		{
-			case 'school':
-				loadGraphic('assets/images/weeb/pixelUI/arrows-pixels.png', true, 17, 17);
-
-				animation.add('greenScroll', [6]);
-				animation.add('redScroll', [7]);
-				animation.add('blueScroll', [5]);
-				animation.add('purpleScroll', [4]);
-
-				if (isSustainNote)
-				{
-					loadGraphic('assets/images/weeb/pixelUI/arrowEnds.png', true, 7, 6);
-
-					animation.add('purpleholdend', [4]);
-					animation.add('greenholdend', [6]);
-					animation.add('redholdend', [7]);
-					animation.add('blueholdend', [5]);
-
-					animation.add('purplehold', [0]);
-					animation.add('greenhold', [2]);
-					animation.add('redhold', [3]);
-					animation.add('bluehold', [1]);
-				}
-
-				setGraphicSize(Std.int(width * PlayState.daPixelZoom));
-				updateHitbox();
-
-			case 'schoolEvil': // COPY PASTED CUZ I AM LAZY
+			case 'school' | 'schoolEvil':
 				loadGraphic('assets/images/weeb/pixelUI/arrows-pixels.png', true, 17, 17);
 
 				animation.add('greenScroll', [6]);
diff --git a/source/PlayState.hx b/source/PlayState.hx
index cb4f4876b..69d37283c 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -529,10 +529,6 @@ class PlayState extends MusicBeatState
 		gf = new Character(400, 130, gfVersion);
 		gf.scrollFactor.set(0.95, 0.95);
 
-		// Shitty layering but whatev it works LOL
-		if (curStage == 'limo')
-			add(limo);
-
 		dad = new Character(100, 100, SONG.player2);
 
 		var camPos:FlxPoint = new FlxPoint(dad.getGraphicMidpoint().x, dad.getGraphicMidpoint().y);
@@ -614,6 +610,11 @@ class PlayState extends MusicBeatState
 		}
 
 		add(gf);
+
+		// Shitty layering but whatev it works LOL
+		if (curStage == 'limo')
+			add(limo);
+
 		add(dad);
 		add(boyfriend);
 

From 3d8a3a8f98e7f27e6fe9816cb290dceb840f7c57 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sun, 14 Feb 2021 19:03:02 -0500
Subject: [PATCH 6/9] Gitaroo easter egg

---
 source/GitarooPause.hx | 88 ++++++++++++++++++++++++++++++++++++++++++
 source/PlayState.hx    | 17 +++++---
 2 files changed, 100 insertions(+), 5 deletions(-)
 create mode 100644 source/GitarooPause.hx

diff --git a/source/GitarooPause.hx b/source/GitarooPause.hx
new file mode 100644
index 000000000..b444fbf18
--- /dev/null
+++ b/source/GitarooPause.hx
@@ -0,0 +1,88 @@
+package;
+
+import flixel.FlxG;
+import flixel.FlxSprite;
+import flixel.graphics.frames.FlxAtlasFrames;
+
+class GitarooPause extends MusicBeatState
+{
+	var replayButton:FlxSprite;
+	var cancelButton:FlxSprite;
+
+	var replaySelect:Bool = false;
+
+	public function new():Void
+	{
+		super();
+	}
+
+	override function create()
+	{
+		if (FlxG.sound.music != null)
+			FlxG.sound.music.stop();
+
+		var bg:FlxSprite = new FlxSprite().loadGraphic('assets/images/pauseAlt/pauseBG.png');
+		add(bg);
+
+		var bf:FlxSprite = new FlxSprite(0, 30);
+		bf.frames = FlxAtlasFrames.fromSparrow('assets/images/pauseAlt/bfLol.png', 'assets/images/pauseAlt/bfLol.xml');
+		bf.animation.addByPrefix('lol', "funnyThing", 13);
+		bf.animation.play('lol');
+		add(bf);
+		bf.screenCenter(X);
+
+		replayButton = new FlxSprite(FlxG.width * 0.28, FlxG.height * 0.7);
+		replayButton.frames = FlxAtlasFrames.fromSparrow('assets/images/pauseAlt/pauseUI.png', 'assets/images/pauseAlt/pauseUI.xml');
+		replayButton.animation.addByPrefix('selected', 'bluereplay', 0, false);
+		replayButton.animation.appendByPrefix('selected', 'yellowreplay');
+		replayButton.animation.play('selected');
+		add(replayButton);
+
+		cancelButton = new FlxSprite(FlxG.width * 0.58, replayButton.y);
+		cancelButton.frames = FlxAtlasFrames.fromSparrow('assets/images/pauseAlt/pauseUI.png', 'assets/images/pauseAlt/pauseUI.xml');
+		cancelButton.animation.addByPrefix('selected', 'bluecancel', 0, false);
+		cancelButton.animation.appendByPrefix('selected', 'cancelyellow');
+		cancelButton.animation.play('selected');
+		add(cancelButton);
+
+		changeThing();
+
+		super.create();
+	}
+
+	override function update(elapsed:Float)
+	{
+		if (controls.LEFT_P || controls.RIGHT_P)
+			changeThing();
+
+		if (controls.ACCEPT)
+		{
+			if (replaySelect)
+			{
+				FlxG.switchState(new PlayState());
+			}
+			else
+			{
+				FlxG.switchState(new MainMenuState());
+			}
+		}
+
+		super.update(elapsed);
+	}
+
+	function changeThing():Void
+	{
+		replaySelect = !replaySelect;
+
+		if (replaySelect)
+		{
+			cancelButton.animation.curAnim.curFrame = 0;
+			replayButton.animation.curAnim.curFrame = 1;
+		}
+		else
+		{
+			cancelButton.animation.curAnim.curFrame = 1;
+			replayButton.animation.curAnim.curFrame = 0;
+		}
+	}
+}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index 64ce3b70a..0af1b0341 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -1470,7 +1470,14 @@ class PlayState extends MusicBeatState
 			vocals.stop();
 			FlxG.sound.music.stop();
 
-			openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
+			// 1 / 1000 chance for Gitaroo Man easter egg
+			if (FlxG.random.bool(0.1))
+			{
+				// gitaroo man easter egg
+				FlxG.switchState(new GitarooPause());
+			}
+			else
+				openSubState(new GameOverSubstate(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
 
 			// FlxG.switchState(new GameOverState(boyfriend.getScreenPosition().x, boyfriend.getScreenPosition().y));
 		}
@@ -1505,11 +1512,11 @@ class PlayState extends MusicBeatState
 				daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SONG.speed, 2)));
 
 				// i am so fucking sorry for this if condition
-				if (daNote.isSustainNote && daNote.y + daNote.offset.y <= strumLine.y + Note.swagWidth/2
-					&& (!daNote.mustPress || (daNote.wasGoodHit || 
-						(daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
+				if (daNote.isSustainNote
+					&& daNote.y + daNote.offset.y <= strumLine.y + Note.swagWidth / 2
+					&& (!daNote.mustPress || (daNote.wasGoodHit || (daNote.prevNote.wasGoodHit && !daNote.canBeHit))))
 				{
-					var swagRect = new FlxRect(0, strumLine.y + Note.swagWidth/2 - daNote.y, daNote.width * 2, daNote.height * 2);
+					var swagRect = new FlxRect(0, strumLine.y + Note.swagWidth / 2 - daNote.y, daNote.width * 2, daNote.height * 2);
 					swagRect.y /= daNote.scale.y;
 					swagRect.height -= swagRect.y;
 

From 86955d6670d4d5af035a3c11de32dd5aefc3f8e2 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sun, 14 Feb 2021 19:45:18 -0500
Subject: [PATCH 7/9] icons and changelog and newgrounds

---
 CHANGELOG.md         |  4 ++++
 Project.xml          |  2 +-
 source/NGio.hx       |  6 +++++-
 source/TitleState.hx | 10 +++++++---
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6ce02987..865d1a9f7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,10 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [unreleased]
+### Added
+- Easter eggs
 ### Changed
 - New icons, old one was placeholder since October woops!
 - Made the transitions between the story mode levels more seamless.
+- Offset of the Newgrounds logo on boot screen.
 ### Fixed
+- Should show intro credits on desktop versions of the game more consistently
 - Layering on Week 4 songs with GF and the LIMO LOL HOW TF I MISS THIS
 - Chart's and chart editor now support changeBPM, GOD BLESS MTH FOR THIS ONE I BEEN STRUGGLIN WIT THAT SINCE OCTOBER LMAO ([GOD BLESS MTH](https://github.com/ninjamuffin99/Funkin/pull/382))
 - Fixed sustain note trails ALSO THANKS TO MTH U A REAL ONE ([MTH VERY POWERFUL](https://github.com/ninjamuffin99/Funkin/pull/415))
diff --git a/Project.xml b/Project.xml
index 9a04d2611..4957653de 100644
--- a/Project.xml
+++ b/Project.xml
@@ -2,7 +2,7 @@
 <project>
 	<!-- _________________________ Application Settings _________________________ -->
 
-	<app title="Friday Night Funkin'" file="Funkin" packageName="com.ninjamuffin99.funkin" main="Main" version="0.2.7" company="ninjamuffin99" />
+	<app title="Friday Night Funkin'" file="Funkin" packageName="com.ninjamuffin99.funkin" main="Main" version="0.2.7.1" company="ninjamuffin99" />
 
 	<!--Switch Export with Unique ApplicationID and Icon-->
 	<set name="APP_ID" value="0x0100f6c013bbc000" />
diff --git a/source/NGio.hx b/source/NGio.hx
index 0c2631b86..c799c4bd2 100644
--- a/source/NGio.hx
+++ b/source/NGio.hx
@@ -14,6 +14,8 @@ import io.newgrounds.objects.events.Result.GetVersionResult;
 import lime.app.Application;
 import openfl.display.Stage;
 
+using StringTools;
+
 /**
  * MADE BY GEOKURELI THE LEGENED GOD HERO MVP
  */
@@ -28,6 +30,7 @@ class NGio
 	public static var ngScoresLoaded(default, null):FlxSignal = new FlxSignal();
 
 	public static var GAME_VER:String = "";
+	public static var GAME_VER_NUMS:String = '';
 	public static var gotOnlineVer:Bool = false;
 
 	public static function noLogin(api:String)
@@ -43,7 +46,8 @@ class NGio
 			{
 				var call = NG.core.calls.app.getCurrentVersion(GAME_VER).addDataHandler(function(response:Response<GetCurrentVersionResult>)
 				{
-					GAME_VER = response.result.data.current_version;
+					GAME_VER = response.result.data.currentVersion;
+					GAME_VER_NUMS = GAME_VER.split(" ")[0].trim();
 					trace('CURRENT NG VERSION: ' + GAME_VER);
 					gotOnlineVer = true;
 				});
diff --git a/source/TitleState.hx b/source/TitleState.hx
index 53452e45c..6defd5b78 100644
--- a/source/TitleState.hx
+++ b/source/TitleState.hx
@@ -88,7 +88,10 @@ class TitleState extends MusicBeatState
 		#elseif CHARTING
 		FlxG.switchState(new ChartingState());
 		#else
-		startIntro();
+		new FlxTimer().start(1, function(tmr:FlxTimer)
+		{
+			startIntro();
+		});
 		#end
 	}
 
@@ -223,7 +226,8 @@ class TitleState extends MusicBeatState
 
 	override function update(elapsed:Float)
 	{
-		Conductor.songPosition = FlxG.sound.music.time;
+		if (FlxG.sound.music != null)
+			Conductor.songPosition = FlxG.sound.music.time;
 		// FlxG.watch.addQuick('amp', FlxG.sound.music.amplitude);
 
 		if (FlxG.keys.justPressed.F)
@@ -270,7 +274,7 @@ class TitleState extends MusicBeatState
 
 				var version:String = "v" + Application.current.meta.get('version');
 
-				if (version.trim() != NGio.GAME_VER.trim() && !OutdatedSubState.leftState)
+				if (version.trim() != NGio.GAME_VER_NUMS && !OutdatedSubState.leftState)
 				{
 					trace('OLD VERSION!');
 					FlxG.switchState(new OutdatedSubState());

From a5e3e2be41e9a7a41b6b34d70fd8c421789cfc0b Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sun, 14 Feb 2021 20:15:22 -0500
Subject: [PATCH 8/9] readme stuff

---
 CHANGELOG.md | 2 ++
 Project.xml  | 1 +
 2 files changed, 3 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 865d1a9f7..672084022 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,11 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## [unreleased]
 ### Added
 - Easter eggs
+- readme's in desktop versions of the game
 ### Changed
 - New icons, old one was placeholder since October woops!
 - Made the transitions between the story mode levels more seamless.
 - Offset of the Newgrounds logo on boot screen.
 ### Fixed
+- Fixed crashes on Week 6 story mode dialogue if spam too fast ([Thanks to Lotusotho for the Pull Request!](https://github.com/ninjamuffin99/Funkin/pull/357))
 - Should show intro credits on desktop versions of the game more consistently
 - Layering on Week 4 songs with GF and the LIMO LOL HOW TF I MISS THIS
 - Chart's and chart editor now support changeBPM, GOD BLESS MTH FOR THIS ONE I BEEN STRUGGLIN WIT THAT SINCE OCTOBER LMAO ([GOD BLESS MTH](https://github.com/ninjamuffin99/Funkin/pull/382))
diff --git a/Project.xml b/Project.xml
index 4957653de..2c46a5380 100644
--- a/Project.xml
+++ b/Project.xml
@@ -43,6 +43,7 @@
 	<assets path="assets/images" />
 	<assets path="assets/data" />
 	<assets path='example_mods' rename='mods' embed='false'/>
+	<assets path='art/readme.txt' rename='do NOT readme.txt' />
 	<!-- <template path='mods' /> -->
 	
 	<!-- <library name="noPreload" preload='false'/> -->

From 0804f1a709f3f2811d86e755da3ed8454ddf0369 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Sun, 14 Feb 2021 20:21:34 -0500
Subject: [PATCH 9/9] changelog good to go

---
 CHANGELOG.md | 3 ++-
 Project.xml  | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 672084022..c650752ab 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## [unreleased]
+## [0.2.7.1] - 2021-02-14
 ### Added
 - Easter eggs
 - readme's in desktop versions of the game
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - New icons, old one was placeholder since October woops!
 - Made the transitions between the story mode levels more seamless.
 - Offset of the Newgrounds logo on boot screen.
+- Made the changelog txt so it can be opened easier by normal people who don't have a markdown reader (most normal people);
 ### Fixed
 - Fixed crashes on Week 6 story mode dialogue if spam too fast ([Thanks to Lotusotho for the Pull Request!](https://github.com/ninjamuffin99/Funkin/pull/357))
 - Should show intro credits on desktop versions of the game more consistently
diff --git a/Project.xml b/Project.xml
index 2c46a5380..a99a8b40d 100644
--- a/Project.xml
+++ b/Project.xml
@@ -53,7 +53,7 @@
 	<assets path="assets/sounds" include="*.mp3" if="web" />
 	<assets path="assets/sounds" include="*.ogg" unless="web" />
 
-	<assets path="CHANGELOG.md"/>
+	<assets path="CHANGELOG.md" rename='changelog.txt'/>
 
 	<!-- NOTE FOR FUTURE SELF SINCE FONTS ARE ALWAYS FUCKY 
 		TO FIX ONE OF THEM, I CONVERTED IT TO OTF. DUNNO IF YOU NEED TO