diff --git a/Project.xml b/Project.xml
index 4536d8c09..b40d81b5c 100644
--- a/Project.xml
+++ b/Project.xml
@@ -94,5 +94,5 @@
 
 	<!--Place custom nodes like icons here (higher priority to override the HaxeFlixel icon)-->
 	<icon path="art/icon.png"/>
-	<!-- <haxedef name="SKIP_TO_PLAYSTATE" if="debug" /> -->
+	<haxedef name="SKIP_TO_PLAYSTATE" if="debug" />
 </project>
diff --git a/source/Alphabet.hx b/source/Alphabet.hx
index 20556e359..571da27ee 100644
--- a/source/Alphabet.hx
+++ b/source/Alphabet.hx
@@ -34,20 +34,26 @@ class Alphabet extends FlxSpriteGroup
 
 	var splitWords:Array<String> = [];
 
+	var isBold:Bool = false;
+
 	public function new(x:Float, y:Float, text:String = "", ?bold:Bool = false, typed:Bool = false)
 	{
 		super(x, y);
 
 		_finalText = text;
 		this.text = text;
+		isBold = bold;
 
-		if (typed)
+		if (text != "")
 		{
-			startTypedText();
-		}
-		else
-		{
-			addText();
+			if (typed)
+			{
+				startTypedText();
+			}
+			else
+			{
+				addText();
+			}
 		}
 	}
 
@@ -71,7 +77,7 @@ class Alphabet extends FlxSpriteGroup
 				var xPos:Float = 0;
 				if (lastSprite != null)
 				{
-					xPos = lastSprite.x + lastSprite.frameWidth;
+					xPos = lastSprite.x + lastSprite.width - 40;
 				}
 
 				if (lastWasSpace)
@@ -82,7 +88,12 @@ class Alphabet extends FlxSpriteGroup
 
 				// var letter:AlphaCharacter = new AlphaCharacter(30 * loopNum, 0);
 				var letter:AlphaCharacter = new AlphaCharacter(xPos, 0);
-				letter.createBold(character);
+
+				if (isBold)
+					letter.createBold(character);
+				else
+					letter.createLetter(character);
+
 				add(letter);
 
 				lastSprite = letter;
@@ -106,10 +117,10 @@ class Alphabet extends FlxSpriteGroup
 
 		var loopNum:Int = 0;
 
+		var xPos:Float = 0;
+
 		new FlxTimer().start(0.05, function(tmr:FlxTimer)
 		{
-			var xPos:Float = 0;
-
 			// trace(_finalText.fastCodeAt(loopNum) + " " + _finalText.charAt(loopNum));
 			if (_finalText.fastCodeAt(loopNum) == "\n".code)
 			{
@@ -118,22 +129,44 @@ class Alphabet extends FlxSpriteGroup
 				// xPos = 0;
 			}
 
+			if (splitWords[loopNum] == " ")
+			{
+				lastWasSpace = true;
+			}
+
 			if (AlphaCharacter.alphabet.contains(splitWords[loopNum].toLowerCase()))
 			{
 				if (lastSprite != null && !xPosResetted)
 				{
-					xPos = lastSprite.x + lastSprite.frameWidth - 40;
+					lastSprite.updateHitbox();
+					xPos += lastSprite.width + 3;
+					// if (isBold)
+					// xPos -= 80;
 				}
 				else
 				{
 					xPosResetted = false;
 				}
 
+				if (lastWasSpace)
+				{
+					xPos += 20;
+					lastWasSpace = false;
+				}
 				// trace(_finalText.fastCodeAt(loopNum) + " " + _finalText.charAt(loopNum));
 
 				// var letter:AlphaCharacter = new AlphaCharacter(30 * loopNum, 0);
 				var letter:AlphaCharacter = new AlphaCharacter(xPos, 55 * yMulti);
-				letter.createBold(splitWords[loopNum]);
+				if (isBold)
+				{
+					letter.createBold(splitWords[loopNum]);
+				}
+				else
+				{
+					letter.createLetter(splitWords[loopNum]);
+					letter.x += 90;
+				}
+
 				add(letter);
 
 				lastSprite = letter;
@@ -141,7 +174,7 @@ class Alphabet extends FlxSpriteGroup
 
 			loopNum += 1;
 
-			tmr.time = FlxG.random.float(0.03, 0.09);
+			tmr.time = FlxG.random.float(0.05, 0.12);
 		}, splitWords.length);
 	}
 
@@ -184,5 +217,6 @@ class AlphaCharacter extends FlxSprite
 
 		animation.addByPrefix(letter, letter + " " + letterCase, 24);
 		animation.play(letter);
+		updateHitbox();
 	}
 }
diff --git a/source/DialogueBox.hx b/source/DialogueBox.hx
new file mode 100644
index 000000000..488fe35fd
--- /dev/null
+++ b/source/DialogueBox.hx
@@ -0,0 +1,86 @@
+package;
+
+import flixel.FlxG;
+import flixel.FlxSprite;
+import flixel.graphics.frames.FlxAtlasFrames;
+import flixel.group.FlxSpriteGroup;
+import flixel.input.FlxKeyManager;
+
+class DialogueBox extends FlxSpriteGroup
+{
+	var box:FlxSprite;
+
+	var dialogue:Alphabet;
+	var dialogueList:Array<String> = [];
+
+	public var finishThing:Void->Void;
+
+	public function new(talkingRight:Bool = true, ?dialogueList:Array<String>)
+	{
+		super();
+
+		box = new FlxSprite(40);
+		box.frames = FlxAtlasFrames.fromSparrow(AssetPaths.speech_bubble_talking__png, AssetPaths.speech_bubble_talking__xml);
+		box.animation.addByPrefix('normalOpen', 'Speech Bubble Normal Open', 24, false);
+		box.animation.addByPrefix('normal', 'speech bubble normal', 24);
+		box.animation.play('normalOpen');
+		add(box);
+
+		if (!talkingRight)
+		{
+			box.flipX = true;
+		}
+
+		dialogue = new Alphabet(0, 80, "", false, true);
+		// dialogue.x = 90;
+		add(dialogue);
+
+		this.dialogueList = dialogueList;
+	}
+
+	var dialogueOpened:Bool = false;
+	var dialogueStarted:Bool = false;
+
+	override function update(elapsed:Float)
+	{
+		if (box.animation.curAnim != null)
+		{
+			if (box.animation.curAnim.name == 'normalOpen' && box.animation.curAnim.finished)
+			{
+				box.animation.play('normal');
+				dialogueOpened = true;
+			}
+		}
+
+		if (dialogueOpened && !dialogueStarted)
+		{
+			startDialogue();
+			dialogueStarted = true;
+		}
+
+		if (FlxG.keys.justPressed.SPACE)
+		{
+			remove(dialogue);
+
+			if (dialogueList[1] == null)
+			{
+				finishThing();
+				kill();
+			}
+			else
+			{
+				dialogueList.remove(dialogueList[0]);
+				startDialogue();
+			}
+		}
+
+		super.update(elapsed);
+	}
+
+	function startDialogue():Void
+	{
+		var theDialog:Alphabet = new Alphabet(0, 70, dialogueList[0], false, true);
+		dialogue = theDialog;
+		add(theDialog);
+	}
+}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index 8f08c4fa3..1fd7bc477 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -38,6 +38,8 @@ class PlayState extends MusicBeatState
 	public static var isStoryMode:Bool = false;
 	public static var storyPlaylist:Array<String> = [];
 
+	var halloweenLevel:Bool = false;
+
 	private var vocals:FlxSound;
 
 	private var dad:Character;
@@ -71,6 +73,10 @@ class PlayState extends MusicBeatState
 	private var camHUD:FlxCamera;
 	private var camGame:FlxCamera;
 
+	var dialogue:Array<String> = ['blah blah blah', 'coolswag'];
+
+	var halloweenBG:FlxSprite;
+
 	override public function create()
 	{
 		// var gameCam:FlxCamera = FlxG.camera;
@@ -91,28 +97,47 @@ class PlayState extends MusicBeatState
 
 		Conductor.changeBPM(SONG.bpm);
 
-		var bg:FlxSprite = new FlxSprite(-600, -200).loadGraphic(AssetPaths.stageback__png);
-		// bg.setGraphicSize(Std.int(bg.width * 2.5));
-		// bg.updateHitbox();
-		bg.antialiasing = true;
-		bg.scrollFactor.set(0.9, 0.9);
-		bg.active = false;
-		add(bg);
+		if (SONG.song.toLowerCase() == 'spookeez' || SONG.song.toLowerCase() == 'monster' || SONG.song.toLowerCase() == 'south')
+		{
+			halloweenLevel = true;
 
-		var stageFront:FlxSprite = new FlxSprite(-650, 600).loadGraphic(AssetPaths.stagefront__png);
-		stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
-		stageFront.updateHitbox();
-		stageFront.antialiasing = true;
-		stageFront.scrollFactor.set(0.9, 0.9);
-		stageFront.active = false;
-		add(stageFront);
+			var hallowTex = FlxAtlasFrames.fromSparrow(AssetPaths.halloween_bg__png, AssetPaths.halloween_bg__xml);
 
-		var stageCurtains:FlxSprite = new FlxSprite(-500, -300).loadGraphic(AssetPaths.stagecurtains__png);
-		stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
-		stageCurtains.updateHitbox();
-		stageCurtains.antialiasing = true;
-		stageCurtains.scrollFactor.set(1.3, 1.3);
-		stageCurtains.active = false;
+			halloweenBG = new FlxSprite(-200, -100);
+			halloweenBG.frames = hallowTex;
+			halloweenBG.animation.addByPrefix('idle', 'halloweem bg0');
+			halloweenBG.animation.addByPrefix('lightning', 'halloweem bg lightning strike', 24, false);
+			halloweenBG.animation.play('idle');
+			halloweenBG.antialiasing = true;
+			add(halloweenBG);
+		}
+		else
+		{
+			var bg:FlxSprite = new FlxSprite(-600, -200).loadGraphic(AssetPaths.stageback__png);
+			// bg.setGraphicSize(Std.int(bg.width * 2.5));
+			// bg.updateHitbox();
+			bg.antialiasing = true;
+			bg.scrollFactor.set(0.9, 0.9);
+			bg.active = false;
+			add(bg);
+
+			var stageFront:FlxSprite = new FlxSprite(-650, 600).loadGraphic(AssetPaths.stagefront__png);
+			stageFront.setGraphicSize(Std.int(stageFront.width * 1.1));
+			stageFront.updateHitbox();
+			stageFront.antialiasing = true;
+			stageFront.scrollFactor.set(0.9, 0.9);
+			stageFront.active = false;
+			add(stageFront);
+
+			var stageCurtains:FlxSprite = new FlxSprite(-500, -300).loadGraphic(AssetPaths.stagecurtains__png);
+			stageCurtains.setGraphicSize(Std.int(stageCurtains.width * 0.9));
+			stageCurtains.updateHitbox();
+			stageCurtains.antialiasing = true;
+			stageCurtains.scrollFactor.set(1.3, 1.3);
+			stageCurtains.active = false;
+
+			add(stageCurtains);
+		}
 
 		gf = new Character(400, 130, 'gf');
 		gf.scrollFactor.set(0.95, 0.95);
@@ -136,7 +161,14 @@ class PlayState extends MusicBeatState
 		boyfriend = new Boyfriend(770, 450);
 		add(boyfriend);
 
-		add(stageCurtains);
+		var doof:DialogueBox = new DialogueBox(false, dialogue);
+		// doof.x += 70;
+		doof.y = FlxG.height * 0.5;
+		doof.scrollFactor.set();
+		doof.finishThing = startCountdown;
+		add(doof);
+
+		Conductor.songPosition = -5000;
 
 		strumLine = new FlxSprite(0, 50).makeGraphic(FlxG.width, 10);
 		strumLine.scrollFactor.set();
@@ -148,7 +180,7 @@ class PlayState extends MusicBeatState
 
 		startingSong = true;
 
-		startCountdown();
+		// startCountdown();
 
 		generateSong(SONG.song);
 
diff --git a/source/TitleState.hx b/source/TitleState.hx
index 3b4cdd3d0..2a64cfea0 100644
--- a/source/TitleState.hx
+++ b/source/TitleState.hx
@@ -51,7 +51,7 @@ class TitleState extends MusicBeatState
 		super.create();
 
 		#if SKIP_TO_PLAYSTATE
-		FlxG.switchState(new MainMenuState());
+		FlxG.switchState(new PlayState());
 		#else
 		startIntro();
 		#end