From 2aee6bcab849c6ee797b510bb16ba6c658fc6dbb Mon Sep 17 00:00:00 2001
From: George FunBook <gkurelic@gmail.com>
Date: Wed, 9 Feb 2022 19:31:36 -0600
Subject: [PATCH] dir/color note helpers

---
 source/Note.hx      | 218 ++++++++++++++++++++++++++++++++++----------
 source/PlayState.hx |  49 ++--------
 source/SongLoad.hx  |   7 +-
 3 files changed, 181 insertions(+), 93 deletions(-)

diff --git a/source/Note.hx b/source/Note.hx
index 89cbddfee..17f503210 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -16,12 +16,7 @@ import polymod.format.ParseRules.TargetSignatureElement;
 
 class Note extends FlxSprite
 {
-	public var data:NoteData = {
-		strumTime: 0,
-		noteData: 0,
-		sustainLength: 0,
-		altNote: false
-	};
+	public var data = new NoteData();
 
 	public var mustPress:Bool = false;
 	public var followsTime:Bool = true; // used if you want the note to follow the time shit!
@@ -37,7 +32,29 @@ class Note extends FlxSprite
 	public var isSustainNote:Bool = false;
 
 	public var colorSwap:ColorSwap;
-
+	
+	/** the lowercase name of the note, for anim control, i.e. left right up down */
+	public var dirName(get, never):String;
+	inline function get_dirName() return data.dirName;
+	
+	/** the uppercase name of the note, for anim control, i.e. left right up down */
+	public var dirNameUpper(get, never):String;
+	inline function get_dirNameUpper() return data.dirNameUpper;
+	
+	/** the lowercase name of the note's color, for anim control, i.e. purple blue green red */
+	public var colorName(get, never):String;
+	inline function get_colorName() return data.colorName;
+	
+	/** the lowercase name of the note's color, for anim control, i.e. purple blue green red */
+	public var colorNameUpper(get, never):String;
+	inline function get_colorNameUpper() return data.colorNameUpper;
+	
+	public var highStakes(get, never):Bool;
+	inline function get_highStakes() return data.highStakes;
+	
+	public var lowStakes(get, never):Bool;
+	inline function get_lowStakes() return data.lowStakes;
+	
 	public static var swagWidth:Float = 160 * 0.7;
 	public static var PURP_NOTE:Int = 0;
 	public static var GREEN_NOTE:Int = 2;
@@ -58,7 +75,7 @@ class Note extends FlxSprite
 	// anything below sick threshold is sick
 	public static var arrowColors:Array<Float> = [1, 1, 1, 1];
 
-	public function new(strumTime:Float = 0, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false)
+	public function new(strumTime:Float = 0, noteData:NoteType, ?prevNote:Note, ?sustainNote:Bool = false)
 	{
 		super();
 
@@ -139,21 +156,8 @@ class Note extends FlxSprite
 		shader = colorSwap.shader;
 		updateColors();
 
-		switch (noteData)
-		{
-			case 0:
-				x += swagWidth * 0;
-				animation.play('purpleScroll');
-			case 1:
-				x += swagWidth * 1;
-				animation.play('blueScroll');
-			case 2:
-				x += swagWidth * 2;
-				animation.play('greenScroll');
-			case 3:
-				x += swagWidth * 3;
-				animation.play('redScroll');
-		}
+		x += swagWidth * data.int;
+		animation.play(data.colorName + 'Scroll');
 
 		// trace(prevNote);
 
@@ -166,17 +170,7 @@ class Note extends FlxSprite
 
 			x += width / 2;
 
-			switch (noteData)
-			{
-				case 2:
-					animation.play('greenholdend');
-				case 3:
-					animation.play('redholdend');
-				case 1:
-					animation.play('blueholdend');
-				case 0:
-					animation.play('purpleholdend');
-			}
+			animation.play(data.colorName + 'holdend');
 
 			updateHitbox();
 
@@ -187,18 +181,7 @@ class Note extends FlxSprite
 
 			if (prevNote.isSustainNote)
 			{
-				switch (prevNote.data.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');
-				}
-
+				prevNote.animation.play(prevNote.colorName + 'hold');
 				prevNote.updateHitbox();
 
 				var scaleThing:Float = Math.round((Conductor.stepCrochet) * (0.45 * FlxMath.roundDecimal(SongLoad.getSpeed(), 2)));
@@ -269,12 +252,151 @@ class Note extends FlxSprite
 				alpha = 0.3;
 		}
 	}
+	
+	static public function fromData(data:NoteData, prevNote:Note, isSustainNote = false)
+	{
+		return new Note(data.strumTime, data.noteData, prevNote, isSustainNote);
+	}
 }
 
-typedef NoteData =
+typedef RawNoteData =
 {
 	var strumTime:Float;
-	var noteData:Int;
+	var noteData:NoteType;
 	var sustainLength:Float;
 	var altNote:Bool;
 }
+
+@:forward
+abstract NoteData(RawNoteData)
+{
+	public function new (strumTime = 0.0, noteData:NoteType = 0, sustainLength = 0.0, altNote = false)
+	{
+		this =
+		{ strumTime     : strumTime
+		, noteData      : noteData
+		, sustainLength : sustainLength
+		, altNote       : altNote
+		}
+	}
+	
+	public var note(get, never):NoteType;
+	inline function get_note() return this.noteData.value;
+	
+	public var int(get, never):Int;
+	inline function get_int() return this.noteData.int;
+	
+	public var dir(get, never):NoteDir;
+	inline function get_dir() return this.noteData.value;
+	
+	public var dirName(get, never):String;
+	inline function get_dirName() return dir.name;
+	
+	public var dirNameUpper(get, never):String;
+	inline function get_dirNameUpper() return dir.nameUpper;
+	
+	public var color(get, never):NoteColor;
+	inline function get_color() return this.noteData.value;
+	
+	public var colorName(get, never):String;
+	inline function get_colorName() return color.name;
+	
+	public var colorNameUpper(get, never):String;
+	inline function get_colorNameUpper() return color.nameUpper;
+	
+	public var highStakes(get, never):Bool;
+	inline function get_highStakes() return this.noteData.highStakes;
+	
+	public var lowStakes(get, never):Bool;
+	inline function get_lowStakes() return this.noteData.lowStakes;
+}
+
+enum abstract NoteType(Int) from Int to Int
+{
+	// public var raw(get, never):Int;
+	// inline function get_raw() return this;
+	
+	public var int(get, never):Int;
+	inline function get_int() return this < 0 ? -this : this % 4;
+	
+	public var value(get, never):NoteType;
+	inline function get_value() return int;
+	
+	public var highStakes(get, never):Bool;
+	inline function get_highStakes() return this > 3;
+	
+	public var lowStakes(get, never):Bool;
+	inline function get_lowStakes() return this < 0;
+}
+
+@:forward
+enum abstract NoteDir(NoteType) from Int to Int from NoteType
+{
+	var LEFT  = 0;
+	var DOWN  = 1;
+	var UP    = 2;
+	var RIGHT = 3;
+	
+	var value(get, never):NoteDir;
+	inline function get_value() return this.value;
+	
+	public var name(get, never):String;
+	function get_name()
+	{
+		return switch(value)
+		{
+			case LEFT : "left" ;
+			case DOWN : "down" ;
+			case UP   : "up"   ;
+			case RIGHT: "right";
+		}
+	}
+	
+	public var nameUpper(get, never):String;
+	function get_nameUpper()
+	{
+		return switch(value)
+		{
+			case LEFT : "LEFT" ;
+			case DOWN : "DOWN" ;
+			case UP   : "UP"   ;
+			case RIGHT: "RIGHT";
+		}
+	}
+}
+
+@:forward
+enum abstract NoteColor(NoteType) from Int to Int from NoteType
+{
+	var PURPLE = 0;
+	var BLUE   = 1;
+	var GREEN  = 2;
+	var RED    = 3;
+	
+	var value(get, never):NoteColor;
+	inline function get_value() return this.value;
+	
+	public var name(get, never):String;
+	function get_name()
+	{
+		return switch(value)
+		{
+			case PURPLE: "purple";
+			case BLUE  : "blue"  ;
+			case GREEN : "green" ;
+			case RED   : "red"   ;
+		}
+	}
+	
+	public var nameUpper(get, never):String;
+	function get_nameUpper()
+	{
+		return switch(value)
+		{
+			case PURPLE: "PURPLE";
+			case BLUE  : "BLUE"  ;
+			case GREEN : "GREEN" ;
+			case RED   : "RED"   ;
+		}
+	}
+}
\ No newline at end of file
diff --git a/source/PlayState.hx b/source/PlayState.hx
index 99a87eab9..e248a46c4 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -1,5 +1,6 @@
 package;
 
+import Note;
 import Section.SwagSection;
 import SongLoad.SwagSong;
 import charting.ChartingState;
@@ -1592,7 +1593,7 @@ class PlayState extends MusicBeatState
 
 				var gottaHitNote:Bool = section.mustHitSection;
 
-				if (songNotes.noteData > 3)
+				if (songNotes.highStakes)
 					gottaHitNote = !section.mustHitSection;
 
 				var oldNote:Note;
@@ -2195,17 +2196,7 @@ class PlayState extends MusicBeatState
 
 					if (!daNote.isSustainNote)
 					{
-						switch (Math.abs(daNote.data.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);
-						}
+						dad.playAnim('sing' + daNote.dirNameUpper + altAnim, true);
 					}
 
 					dad.holdTimer = 0;
@@ -2429,10 +2420,10 @@ class PlayState extends MusicBeatState
 
 		var healthMulti:Float = 1;
 
-		if (daNote.data.noteData >= 0)
-			healthMulti *= 0.033;
-		else
+		if (daNote.lowStakes)
 			healthMulti *= 0.002;
+		else
+			healthMulti *= 0.033;
 
 		if (noteDiff > Note.HIT_WINDOW * Note.BAD_THRESHOLD)
 		{
@@ -2852,7 +2843,7 @@ class PlayState extends MusicBeatState
 		return super.switchTo(nextState);
 	}
 
-	function noteMiss(direction:Int = 1):Void
+	function noteMiss(direction:NoteDir = 1):Void
 	{
 		// whole function used to be encased in if (!boyfriend.stunned)
 		health -= 0.07;
@@ -2872,17 +2863,7 @@ class PlayState extends MusicBeatState
 				boyfriend.stunned = false;
 		});*/
 
-		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);
-		}
+		boyfriend.playAnim('sing' + direction.nameUpper + 'miss', true);
 	}
 
 	/* not used anymore lol
@@ -2914,18 +2895,8 @@ class PlayState extends MusicBeatState
 				combo += 1;
 				popUpScore(note.data.strumTime, note);
 			}
-
-			switch (note.data.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);
-			}
+			
+			boyfriend.playAnim('sing' + note.dirNameUpper, true);
 
 			playerStrums.forEach(function(spr:FlxSprite)
 			{
diff --git a/source/SongLoad.hx b/source/SongLoad.hx
index 1fa1aa3fc..9f9bf4238 100644
--- a/source/SongLoad.hx
+++ b/source/SongLoad.hx
@@ -161,12 +161,7 @@ class SongLoad
 
 	public static function getDefaultNoteData():NoteData
 	{
-		return {
-			strumTime: 0,
-			altNote: false,
-			sustainLength: 0,
-			noteData: 0
-		}
+		return new NoteData();
 	}
 
 	/**