From daef9e07596ca4eac5c7e4c852cad7a67c0f452c Mon Sep 17 00:00:00 2001
From: MtH <mth@mth.moe>
Date: Sat, 20 Mar 2021 17:33:29 +0100
Subject: [PATCH] DECIMAL BPM support for da charters out there, also changes
 to HealthIcon to better work in ChartingState

---
 source/ChartingState.hx | 30 ++++++++++++++++--------------
 source/Conductor.hx     |  8 ++++----
 source/HealthIcon.hx    | 38 +++++++++++++++++---------------------
 source/Section.hx       |  2 +-
 source/Song.hx          |  4 ++--
 5 files changed, 40 insertions(+), 42 deletions(-)

diff --git a/source/ChartingState.hx b/source/ChartingState.hx
index 64a0de8fb..1b6fedbf4 100644
--- a/source/ChartingState.hx
+++ b/source/ChartingState.hx
@@ -76,7 +76,7 @@ class ChartingState extends MusicBeatState
 	**/
 	var curSelectedNote:Array<Dynamic>;
 
-	var tempBpm:Int = 0;
+	var tempBpm:Float = 0;
 
 	var vocals:FlxSound;
 
@@ -171,6 +171,7 @@ class ChartingState extends MusicBeatState
 		add(curRenderedNotes);
 		add(curRenderedSustains);
 
+		changeSection();
 		super.create();
 	}
 
@@ -217,11 +218,11 @@ class ChartingState extends MusicBeatState
 
 		var loadAutosaveBtn:FlxButton = new FlxButton(reloadSongJson.x, reloadSongJson.y + 30, 'load autosave', loadAutosave);
 
-		var stepperSpeed:FlxUINumericStepper = new FlxUINumericStepper(10, 80, 0.1, 1, 0.1, 10, 1);
+		var stepperSpeed:FlxUINumericStepper = new FlxUINumericStepper(10, 80, 0.1, 1, 0.1, 10, 2);
 		stepperSpeed.value = _song.speed;
 		stepperSpeed.name = 'song_speed';
 
-		var stepperBPM:FlxUINumericStepper = new FlxUINumericStepper(10, 65, 1, 1, 1, 339, 0);
+		var stepperBPM:FlxUINumericStepper = new FlxUINumericStepper(10, 65, 1, 100, 1, 999, 3);
 		stepperBPM.value = Conductor.bpm;
 		stepperBPM.name = 'song_bpm';
 
@@ -230,14 +231,15 @@ class ChartingState extends MusicBeatState
 		var player1DropDown = new FlxUIDropDownMenu(10, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String)
 		{
 			_song.player1 = characters[Std.parseInt(character)];
+			updateHeads();
 		});
 		player1DropDown.selectedLabel = _song.player1;
 
 		var player2DropDown = new FlxUIDropDownMenu(140, 100, FlxUIDropDownMenu.makeStrIdLabelArray(characters, true), function(character:String)
 		{
 			_song.player2 = characters[Std.parseInt(character)];
+			updateHeads();
 		});
-
 		player2DropDown.selectedLabel = _song.player2;
 
 		var tab_group_song = new FlxUI(null, UI_box);
@@ -276,7 +278,7 @@ class ChartingState extends MusicBeatState
 		stepperLength.value = _song.notes[curSection].lengthInSteps;
 		stepperLength.name = "section_length";
 
-		stepperSectionBPM = new FlxUINumericStepper(10, 80, 1, Conductor.bpm, 0, 999, 0);
+		stepperSectionBPM = new FlxUINumericStepper(10, 80, 1, Conductor.bpm, 1, 999, 3);
 		stepperSectionBPM.value = Conductor.bpm;
 		stepperSectionBPM.name = 'section_bpm';
 
@@ -425,9 +427,9 @@ class ChartingState extends MusicBeatState
 			}
 			else if (wname == 'song_bpm')
 			{
-				tempBpm = Std.int(nums.value);
+				tempBpm = nums.value;
 				Conductor.mapBPMChanges(_song);
-				Conductor.changeBPM(Std.int(nums.value));
+				Conductor.changeBPM(nums.value);
 			}
 			else if (wname == 'note_susLength')
 			{
@@ -436,7 +438,7 @@ class ChartingState extends MusicBeatState
 			}
 			else if (wname == 'section_bpm')
 			{
-				_song.notes[curSection].bpm = Std.int(nums.value);
+				_song.notes[curSection].bpm = nums.value;
 				updateGrid();
 			}
 		}
@@ -456,7 +458,7 @@ class ChartingState extends MusicBeatState
 	}*/
 	function sectionStartTime():Float
 	{
-		var daBPM:Int = _song.bpm;
+		var daBPM:Float = _song.bpm;
 		var daPos:Float = 0;
 		for (i in 0...curSection)
 		{
@@ -793,13 +795,13 @@ class ChartingState extends MusicBeatState
 	{
 		if (check_mustHitSection.checked)
 		{
-			leftIcon.animation.play('bf');
-			rightIcon.animation.play('dad');
+			leftIcon.changeIcon(_song.player1);
+			rightIcon.changeIcon(_song.player2);
 		}
 		else
 		{
-			leftIcon.animation.play('dad');
-			rightIcon.animation.play('bf');
+			leftIcon.changeIcon(_song.player2);
+			rightIcon.changeIcon(_song.player1);
 		}
 	}
 
@@ -831,7 +833,7 @@ class ChartingState extends MusicBeatState
 		else
 		{
 			// get last bpm
-			var daBPM:Int = _song.bpm;
+			var daBPM:Float = _song.bpm;
 			for (i in 0...curSection)
 				if (_song.notes[i].changeBPM)
 					daBPM = _song.notes[i].bpm;
diff --git a/source/Conductor.hx b/source/Conductor.hx
index a182070b0..9f3f50031 100644
--- a/source/Conductor.hx
+++ b/source/Conductor.hx
@@ -11,12 +11,12 @@ typedef BPMChangeEvent =
 {
 	var stepTime:Int;
 	var songTime:Float;
-	var bpm:Int;
+	var bpm:Float;
 }
 
 class Conductor
 {
-	public static var bpm:Int = 100;
+	public static var bpm:Float = 100;
 	public static var crochet:Float = ((60 / bpm) * 1000); // beats in milliseconds
 	public static var stepCrochet:Float = crochet / 4; // steps in milliseconds
 	public static var songPosition:Float;
@@ -36,7 +36,7 @@ class Conductor
 	{
 		bpmChangeMap = [];
 
-		var curBPM:Int = song.bpm;
+		var curBPM:Float = song.bpm;
 		var totalSteps:Int = 0;
 		var totalPos:Float = 0;
 		for (i in 0...song.notes.length)
@@ -59,7 +59,7 @@ class Conductor
 		trace("new BPM map BUDDY " + bpmChangeMap);
 	}
 
-	public static function changeBPM(newBpm:Int)
+	public static function changeBPM(newBpm:Float)
 	{
 		bpm = newBpm;
 
diff --git a/source/HealthIcon.hx b/source/HealthIcon.hx
index 46adbcec3..883d3525c 100644
--- a/source/HealthIcon.hx
+++ b/source/HealthIcon.hx
@@ -11,7 +11,7 @@ class HealthIcon extends FlxSprite
 	 */
 	public var sprTracker:FlxSprite;
 
-	var char:String = 'bf';
+	var char:String = '';
 	var isPlayer:Bool = false;
 
 	public function new(char:String = 'bf', isPlayer:Bool = false)
@@ -19,9 +19,8 @@ class HealthIcon extends FlxSprite
 		super();
 
 		this.isPlayer = isPlayer;
-		this.char = char;
 
-		loadIcon(char);
+		changeIcon(char);
 		antialiasing = true;
 		scrollFactor.set();
 	}
@@ -33,29 +32,26 @@ class HealthIcon extends FlxSprite
 		isOldIcon = !isOldIcon;
 
 		if (isOldIcon)
-		{
-			loadGraphic(Paths.image('icons/icon-bf-old'), true, 150, 150);
-			animation.add('bf-old', [0, 1], 0, false, isPlayer);
-			animation.play('bf-old');
-		}
+			changeIcon('bf-old');
 		else
-			loadIcon(char);
+			changeIcon('bf');
 	}
 
-	function loadIcon(char:String):Void
+	public function changeIcon(newChar:String):Void
 	{
-		var realChar:String = "";
-		switch (char)
-		{
-			case 'bf-pixel':
-				realChar = char;
-			default:
-				realChar = char.split('-')[0].trim();
-		}
+		if (newChar != 'bf-pixel' && newChar != 'bf-old')
+			newChar = newChar.split('-')[0].trim();
 
-		loadGraphic(Paths.image('icons/icon-' + realChar), true, 150, 150);
-		animation.add(realChar, [0, 1], 0, false, isPlayer);
-		animation.play(realChar);
+		if (newChar != char)
+		{
+			if (animation.getByName(newChar) == null)
+			{
+				loadGraphic(Paths.image('icons/icon-' + newChar), true, 150, 150);
+				animation.add(newChar, [0, 1], 0, false, isPlayer);
+			}
+			animation.play(newChar);
+			char = newChar;
+		}
 	}
 
 	override function update(elapsed:Float)
diff --git a/source/Section.hx b/source/Section.hx
index c859f6f31..f153da54f 100644
--- a/source/Section.hx
+++ b/source/Section.hx
@@ -6,7 +6,7 @@ typedef SwagSection =
 	var lengthInSteps:Int;
 	var typeOfSection:Int;
 	var mustHitSection:Bool;
-	var bpm:Int;
+	var bpm:Float;
 	var changeBPM:Bool;
 	var altAnim:Bool;
 }
diff --git a/source/Song.hx b/source/Song.hx
index 407abb2db..2ea2a2f81 100644
--- a/source/Song.hx
+++ b/source/Song.hx
@@ -11,7 +11,7 @@ typedef SwagSong =
 {
 	var song:String;
 	var notes:Array<SwagSection>;
-	var bpm:Int;
+	var bpm:Float;
 	var needsVoices:Bool;
 	var speed:Float;
 
@@ -24,7 +24,7 @@ class Song
 {
 	public var song:String;
 	public var notes:Array<SwagSection>;
-	public var bpm:Int;
+	public var bpm:Float;
 	public var needsVoices:Bool = true;
 	public var speed:Float = 1;