From ce2dc758393e8629b3a25e0c1aae76896439a79e Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Tue, 10 Nov 2020 19:09:48 -0800
Subject: [PATCH] some animation touchups

---
 CHANGELOG.md         |  1 +
 source/Boyfriend.hx  |  8 ++++++++
 source/Character.hx  | 27 +++++++++++++++++++++++++++
 source/PlayState.hx  |  8 ++++++--
 source/TitleState.hx |  2 +-
 5 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 767060dc7..2944f1b8c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## [Unreleased]
 ### Fixed
 - Cleaned up some charting on South on hard mode
+- Fixed some animation timings, should feel both better to play, and watch.
 
 ## [0.2.1.2] - 2020-11-06
 ### Fixed
diff --git a/source/Boyfriend.hx b/source/Boyfriend.hx
index 1a8c6cf07..5efc70987 100644
--- a/source/Boyfriend.hx
+++ b/source/Boyfriend.hx
@@ -3,6 +3,7 @@ package;
 import flixel.FlxG;
 import flixel.FlxSprite;
 import flixel.graphics.frames.FlxAtlasFrames;
+import flixel.util.FlxTimer;
 
 using StringTools;
 
@@ -54,6 +55,13 @@ class Boyfriend extends Character
 
 	override function update(elapsed:Float)
 	{
+		if (animation.curAnim.name.startsWith('sing'))
+		{
+			holdTimer += elapsed;
+		}
+		else
+			holdTimer = 0;
+
 		if (animation.curAnim.name.endsWith('miss') && animation.curAnim.finished && !debugMode)
 		{
 			playAnim('idle', true, false, 10);
diff --git a/source/Character.hx b/source/Character.hx
index 937fd310c..0a4efb038 100644
--- a/source/Character.hx
+++ b/source/Character.hx
@@ -3,6 +3,8 @@ package;
 import flixel.FlxSprite;
 import flixel.graphics.frames.FlxAtlasFrames;
 
+using StringTools;
+
 class Character extends FlxSprite
 {
 	public var animOffsets:Map<String, Array<Dynamic>>;
@@ -11,6 +13,8 @@ class Character extends FlxSprite
 	public var isPlayer:Bool = false;
 	public var curCharacter:String = 'bf';
 
+	public var holdTimer:Float = 0;
+
 	public function new(x:Float, y:Float, ?character:String = "bf", ?isPlayer:Bool = false)
 	{
 		animOffsets = new Map<String, Array<Dynamic>>();
@@ -106,6 +110,29 @@ class Character extends FlxSprite
 		}
 	}
 
+	override function update(elapsed:Float)
+	{
+		if (curCharacter != 'bf')
+		{
+			if (animation.curAnim.name.startsWith('sing'))
+			{
+				holdTimer += elapsed;
+			}
+
+			var dadVar:Float = 4;
+
+			if (curCharacter == 'dad')
+				dadVar = 6.1;
+			if (holdTimer >= Conductor.stepCrochet * dadVar * 0.001)
+			{
+				dance();
+				holdTimer = 0;
+			}
+		}
+
+		super.update(elapsed);
+	}
+
 	private var danced:Bool = false;
 
 	/**
diff --git a/source/PlayState.hx b/source/PlayState.hx
index 1eebd82f6..7d561b7e1 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -783,6 +783,8 @@ class PlayState extends MusicBeatState
 							dad.playAnim('singLEFT', true);
 					}
 
+					dad.holdTimer = 0;
+
 					if (SONG.needsVoices)
 						vocals.volume = 1;
 
@@ -1012,6 +1014,8 @@ class PlayState extends MusicBeatState
 		// FlxG.watch.addQuick('asdfa', upP);
 		if ((upP || rightP || downP || leftP) && !boyfriend.stunned && generatedMusic)
 		{
+			boyfriend.holdTimer = 0;
+
 			var possibleNotes:Array<Note> = [];
 
 			notes.forEachAlive(function(daNote:Note)
@@ -1082,9 +1086,9 @@ class PlayState extends MusicBeatState
 			});
 		}
 
-		if (upR || leftR || rightR || downR)
+		if (boyfriend.holdTimer > Conductor.stepCrochet * 4 * 0.001 && !up && !down && !right && !left)
 		{
-			if (boyfriend.animation.curAnim.name.startsWith('sing'))
+			if (boyfriend.animation.curAnim.name.startsWith('sing') && !boyfriend.animation.curAnim.name.endsWith('miss'))
 			{
 				boyfriend.playAnim('idle');
 			}
diff --git a/source/TitleState.hx b/source/TitleState.hx
index a9b93c05c..f783a9b18 100644
--- a/source/TitleState.hx
+++ b/source/TitleState.hx
@@ -38,7 +38,7 @@ class TitleState extends MusicBeatState
 		['Ritz dx', 'rest in peace'], ['rate five', 'pls no blam'], ['rhythm gaming', 'ultimate'], ['game of the year', 'forever'],
 		['you already know', 'we really out here'], ['rise and grind', 'love to luis'], ['like parappa', 'but cooler'],
 		['album of the year', 'chuckie finster'], ["free gitaroo man", "with love to wandaboy"], ['better than geometry dash', 'fight me robtop'],
-		['kiddbrute for president', 'vote now'], ['play dead estate', 'on newgrounds'], ['this is a god damn prototype', 'we workin on it okay'],
+		['kiddbrute for president', 'vote now'], ['play dead estate', 'on newgrounds'], ['this a god damn prototype', 'we workin on it okay'],
 		['WOMEN ARE real', 'this is official']];
 
 	var curWacky:Array<String> = [];