From 48b1cab70584b7441dbd9f48c2a814481d84f297 Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Tue, 19 Jan 2021 21:09:47 -0500
Subject: [PATCH] charts and a bunch of christmas stuff

---
 source/Character.hx     | 42 +++++++++++++++++++++++
 source/ChartingState.hx | 12 +++----
 source/FreeplayState.hx |  2 +-
 source/PlayState.hx     | 76 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 124 insertions(+), 8 deletions(-)

diff --git a/source/Character.hx b/source/Character.hx
index b078778e6..eb85b3438 100644
--- a/source/Character.hx
+++ b/source/Character.hx
@@ -61,6 +61,37 @@ class Character extends FlxSprite
 
 				playAnim('danceRight');
 
+			case 'gf-christmas':
+				tex = FlxAtlasFrames.fromSparrow('assets/images/christmas/gfChristmas.png', 'assets/images/christmas/gfChristmas.xml');
+				frames = tex;
+				animation.addByPrefix('cheer', 'GF Cheer', 24, false);
+				animation.addByPrefix('singLEFT', 'GF left note', 24, false);
+				animation.addByPrefix('singRIGHT', 'GF Right Note', 24, false);
+				animation.addByPrefix('singUP', 'GF Up Note', 24, false);
+				animation.addByPrefix('singDOWN', 'GF Down Note', 24, false);
+				animation.addByIndices('sad', 'gf sad', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "", 24, false);
+				animation.addByIndices('danceLeft', 'GF Dancing Beat', [30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "", 24, false);
+				animation.addByIndices('danceRight', 'GF Dancing Beat', [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29], "", 24, false);
+				animation.addByIndices('hairBlow', "GF Dancing Beat Hair blowing", [0, 1, 2, 3], "", 24);
+				animation.addByIndices('hairFall', "GF Dancing Beat Hair Landing", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "", 24, false);
+				animation.addByPrefix('scared', 'GF FEAR', 24);
+
+				addOffset('cheer');
+				addOffset('sad', -2, -2);
+				addOffset('danceLeft', 0, -9);
+				addOffset('danceRight', 0, -9);
+
+				addOffset("singUP", 0, 4);
+				addOffset("singRIGHT", 0, -20);
+				addOffset("singLEFT", 0, -19);
+				addOffset("singDOWN", 0, -20);
+				addOffset('hairBlow', 45, -8);
+				addOffset('hairFall', 0, -9);
+
+				addOffset('scared', -2, -17);
+
+				playAnim('danceRight');
+
 			case 'gf-car':
 				tex = FlxAtlasFrames.fromSparrow('assets/images/gfCar.png', 'assets/images/gfCar.xml');
 				frames = tex;
@@ -392,6 +423,17 @@ class Character extends FlxSprite
 							playAnim('danceLeft');
 					}
 
+				case 'gf-christmas':
+					if (!animation.curAnim.name.startsWith('hair'))
+					{
+						danced = !danced;
+
+						if (danced)
+							playAnim('danceRight');
+						else
+							playAnim('danceLeft');
+					}
+
 				case 'gf-car':
 					if (!animation.curAnim.name.startsWith('hair'))
 					{
diff --git a/source/ChartingState.hx b/source/ChartingState.hx
index 62ed05591..48b693298 100644
--- a/source/ChartingState.hx
+++ b/source/ChartingState.hx
@@ -114,11 +114,11 @@ class ChartingState extends MusicBeatState
 		else
 		{
 			_song = {
-				song: 'Monster',
+				song: 'Test',
 				notes: [],
-				bpm: 95,
+				bpm: 150,
 				sections: 0,
-				needsVoices: false,
+				needsVoices: true,
 				player1: 'bf',
 				player2: 'dad',
 				sectionLengths: [],
@@ -180,8 +180,8 @@ class ChartingState extends MusicBeatState
 		typingShit = UI_songTitle;
 
 		var check_voices = new FlxUICheckBox(10, 25, null, null, "Has voice track", 100);
-		check_voices.checked = true;
-		_song.needsVoices = check_voices.checked;
+		check_voices.checked = _song.needsVoices;
+		// _song.needsVoices = check_voices.checked;
 		check_voices.callback = function()
 		{
 			_song.needsVoices = check_voices.checked;
@@ -360,7 +360,7 @@ class ChartingState extends MusicBeatState
 
 		FlxG.sound.playMusic('assets/music/' + daSong + "_Inst" + TitleState.soundExt, 0.6);
 
-		// WONT WORK FOR TUTORIAL! REDO LATER
+		// WONT WORK FOR TUTORIAL OR TEST SONG!!! REDO LATER
 		vocals = new FlxSound().loadEmbedded("assets/music/" + daSong + "_Voices" + TitleState.soundExt);
 		FlxG.sound.list.add(vocals);
 
diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx
index 95dcd494b..424a7d581 100644
--- a/source/FreeplayState.hx
+++ b/source/FreeplayState.hx
@@ -70,7 +70,7 @@ class FreeplayState extends MusicBeatState
 		{
 			songs.push('Cocoa');
 			songs.push('Eggnog');
-			// songs.push('Milf');
+			songs.push('Winter-Horrorland');
 		}
 
 		// LOAD MUSIC
diff --git a/source/PlayState.hx b/source/PlayState.hx
index f5f4f506b..775d2c15a 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -93,6 +93,9 @@ class PlayState extends MusicBeatState
 	var grpLimoDancers:FlxTypedGroup<BackgroundDancer>;
 	var fastCar:FlxSprite;
 
+	var upperBoppers:FlxSprite;
+	var bottomBoppers:FlxSprite;
+
 	var talking:Bool = true;
 	var songScore:Int = 0;
 	var scoreTxt:FlxText;
@@ -247,6 +250,54 @@ class PlayState extends MusicBeatState
 			fastCar = new FlxSprite(-300, 160).loadGraphic('assets/images/limo/fastCarLol.png');
 			// add(limo);
 		}
+		else if (SONG.song.toLowerCase() == 'cocoa' || SONG.song.toLowerCase() == 'eggnog')
+		{
+			curStage = 'mall';
+
+			var bg:FlxSprite = new FlxSprite(-1000, -400).loadGraphic('assets/images/christmas/bgWalls.png');
+			bg.antialiasing = true;
+			bg.scrollFactor.set(0.2, 0.2);
+			bg.active = false;
+			bg.setGraphicSize(Std.int(bg.width * 0.8));
+			bg.updateHitbox();
+			add(bg);
+
+			upperBoppers = new FlxSprite(-130, 40);
+			upperBoppers.frames = FlxAtlasFrames.fromSparrow('assets/images/christmas/upperBop.png', 'assets/images/christmas/upperBop.xml');
+			upperBoppers.animation.addByPrefix('bop', "Upper Crowd Bob", 24, false);
+			upperBoppers.antialiasing = true;
+			upperBoppers.scrollFactor.set(0.33, 0.33);
+			upperBoppers.setGraphicSize(Std.int(upperBoppers.width * 0.7));
+			upperBoppers.updateHitbox();
+			add(upperBoppers);
+
+			var bgEscalator:FlxSprite = new FlxSprite(-1000, -430).loadGraphic('assets/images/christmas/bgEscalator.png');
+			bgEscalator.antialiasing = true;
+			bgEscalator.scrollFactor.set(0.3, 0.3);
+			bgEscalator.active = false;
+			bgEscalator.setGraphicSize(Std.int(bgEscalator.width * 0.8));
+			bgEscalator.updateHitbox();
+			add(bgEscalator);
+
+			var fgSnow:FlxSprite = new FlxSprite(-400, 700).loadGraphic('assets/images/christmas/fgSnow.png');
+			fgSnow.active = false;
+			fgSnow.antialiasing = true;
+			add(fgSnow);
+
+			var tree:FlxSprite = new FlxSprite(300, -250).loadGraphic('assets/images/christmas/christmasTree.png');
+			tree.antialiasing = true;
+			tree.scrollFactor.set(0.85, 0.85);
+			add(tree);
+
+			bottomBoppers = new FlxSprite(-280, 220);
+			bottomBoppers.frames = FlxAtlasFrames.fromSparrow('assets/images/christmas/bottomBop.png', 'assets/images/christmas/bottomBop.xml');
+			bottomBoppers.animation.addByPrefix('bop', 'Bottom Level Boppers', 24, false);
+			bottomBoppers.antialiasing = true;
+			bottomBoppers.scrollFactor.set(0.9, 0.9);
+			bottomBoppers.setGraphicSize(Std.int(bottomBoppers.width * 0.9));
+			bottomBoppers.updateHitbox();
+			add(bottomBoppers);
+		}
 		else
 		{
 			curStage = 'stage';
@@ -278,6 +329,14 @@ class PlayState extends MusicBeatState
 
 		var gfVersion:String = 'gf';
 
+		switch (curStage)
+		{
+			case 'limo':
+				gfVersion = 'gf-car';
+			case 'mall':
+				gfVersion = 'gf-christmas';
+		}
+
 		if (curStage == 'limo')
 			gfVersion = 'gf-car';
 
@@ -315,6 +374,8 @@ class PlayState extends MusicBeatState
 			case 'pico':
 				camPos.x += 600;
 				dad.y += 300;
+			case 'parents-christmas':
+				dad.x -= 500;
 		}
 
 		boyfriend = new Boyfriend(770, 450, SONG.player1);
@@ -1302,8 +1363,17 @@ class PlayState extends MusicBeatState
 							}
 						}
 					}
-					else
+					else if (possibleNotes[0].noteData == possibleNotes[1].noteData)
+					{
 						noteCheck(controlArray[daNote.noteData], daNote);
+					}
+					else
+					{
+						for (coolNote in possibleNotes)
+						{
+							noteCheck(controlArray[coolNote.noteData], coolNote);
+						}
+					}
 				}
 				else // regular notes?
 				{
@@ -1700,6 +1770,10 @@ class PlayState extends MusicBeatState
 
 		switch (curStage)
 		{
+			case 'mall':
+				upperBoppers.animation.play('bop', true);
+				bottomBoppers.animation.play('bop', true);
+
 			case 'limo':
 				grpLimoDancers.forEach(function(dancer:BackgroundDancer)
 				{