June.lua

From Pocket Rumble Wiki
Jump to: navigation, search

june.lua[edit]

June = {
	moves = {
		standA = {
			attackbox = {pushback=189 * gameLogicMult, hitStun=12, width=17 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=10 * gameLogicMult, explosionX = 4 *gameLogicMult, explosionY = 2 * gameLogicMult, priority = 4};
			{
				frames = {1,2};
				custom = function(self)
					self:executeSound('lightWhiff', {"sfx", "whiff"})
				end
			};
			{
				frames = {1,2};
				custom = function(self)
					-- self:recordMove()
				end
			};
			{
				type ="active";
				frames = {2,2,3,2};
			};
			{
				type ="recovery";
				frames = {4,3};
			};
		};

		standB = {
			attackbox = {pushback=60 * gameLogicMult, pushUp = 225 * gameLogicMult, hitStun=16, width=47 * gameLogicMult, height=14 * gameLogicMult, relativeY = 15 * gameLogicMult, dmg=1,  priority = 3};
			{ --hitStun=16 pushback=220 pushUp = 240
				frames = {1,2}; --1,7
				custom = function(self)
					self:executeSound('saw', {"sfx", "whiff"})
				end
			};
			{
				frames = {2,2,3,2,4,1}; --1,7
				custom = function(self)
					-- self:recordMove()
				end
			};
			{
				type = "active";
				frames = {5,2,6,2,7,2,8,2}; --2,2,3,2,4,2,5,4
			};
			-- {
			-- 	type = "active";
			-- 	frames = {7,2,8,2,8,2,8,2};
			-- 	custom = function(self)
			-- 		self.attacking = true
			-- 		self.attackbox.exists = true
			-- 		-- self.attackbox.relativeY = self.attackbox.relativeY - 10
			-- 		-- self.attackbox.height = self.attackbox.height + 10
			-- 		self.attackbox.pushUp = 530
			-- 		self.attackbox.pushback = 150
			-- 		self.attackbox.hitStun = 12
			-- 	end
			-- };
			{
				type = "recovery";
				frames = {12,1,12,2,13,3,14,5,15,5}; --12,1,12,2,13,3,14,3,15,4
			};
		};

		lowA = {
			attackbox = {pushback=133 * gameLogicMult, hitStun=16, width=30 * gameLogicMult, height=16 * gameLogicMult, dmg=1, relativeY=20 * gameLogicMult, explosionX = 20, explosionY = 2, priority = 4};
			{
				frames = {1,7};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {2,2};
			};
			{
				type = "active";
				frames = {3,2};
				custom = function(self)
					self.attackbox.width = self.attackbox.width + 30
				end
			};
			{
				type = "active";
				frames = {4,1};
				custom = function(self)
					self.attackbox.width = self.attackbox.width + 30
				end
			};
			{
				type = "active";
				frames = {5,6};
				custom = function(self)
					self.attackbox.width = self.attackbox.width + 30
				end
			};
			{
				type = "recovery";
				frames = {6,3,7,3,8,3,9,2,10,1}; --6,3,7,3,8,3
			};
		};

		lowB = {
			attackbox = {pushUp = 300, pushback=100 * gameLogicMult, hitStun=12, width= 18 * gameLogicMult, height = 28 * gameLogicMult, dmg=1, relativeX = 10 * gameLogicMult, relativeY= 8 * gameLogicMult, explosionX = -10 - (4 * gameLogicMult), explosionY = -20, priority = 3, ignoreCornerPush = true};
			{
				frames = {1,4,2,2,3,2}; --1,6,2,2
				custom = function(self)
					self:executeSound('saw', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {4,2,5,3}; --3,1,4,1,5,2
				custom = function(self)
					self:executeEffect("drillSmall")
				end
			};
			{
				frames = {4,2,5,3,4,2}; --6,1,7,1,8,2,9,2
				custom = function(self)
					self:executeSound('saw', {"sfx", "whiff"})
					self.attacking = true
					self.attackbox.exists = true
					local effect = self:executeEffect("drillBig")
					if self.flip == 1 and ((self.x + self.width) > stageWidth - (40 * gameLogicMult) - self.width) then
						self.attackbox.x = stageWidth - (40 * gameLogicMult) + self.width
						self.attackbox.relativeX = nil
						effect.x = stageWidth - (40 * gameLogicMult) + self.width - 10
						effect.followPlayer = false
						-- self.attackbox.relativeX = self.attackbox.relativeX +
					elseif self.flip == -1 and self.x < (40 * gameLogicMult) + self.width then
						self.attackbox.x = 40 * gameLogicMult - self.width*2
						self.attackbox.relativeX = nil
						effect.x = 40 * gameLogicMult - self.width + 10
						effect.followPlayer = false
					else
						self.attackbox.relativeX = self.attackbox.relativeX + 54
						effect.relativeX = effect.relativeX + 60
						-- effect.x = effect.x + 60
					end
					self.attackbox.relativeY = self.attackbox.relativeY - 38
					self.attackbox.height = self.attackbox.height + 38
					self.attackbox.pushUp = 375 --400
					self.attackbox.pushback = 55 * gameLogicMult
				end
			};
			{
				type = "recovery";
				frames = {3,2,3,2,3,2,2,2,1,2,1,2,1,2,1,2}; --10,3,11,3,12,3,13,4,13,3
			};
		};

		jumpA = {
			attackbox = {pushback=130 * gameLogicMult, hitStun=15, width=20 * gameLogicMult, height=15 * gameLogicMult, dmg=1, relativeY=22 * gameLogicMult,
			explosionX = -10 + (5 * gameLogicMult), explosionY = 5 * gameLogicMult, priority = 4, ignoreCornerPush=true}; --hitstun=16,pushback=145
			{
				frames = {1,9}; --{1,3,2,3,3,1}
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {2,2};
			};
			{
				frames = {3,1};
				custom = function(self)
					self.attackbox.relativeY = self.attackbox.relativeY + 26
					self.attackbox.relativeX = self.attackbox.relativeX + 30
				end
			};
			{
				frames = {4,1,5,6};
				custom = function(self)
					self.attackbox.relativeY = self.attackbox.relativeY + 26
					self.attackbox.relativeX = self.attackbox.relativeX + 70
				end
			};
			{
				type = "recovery";
				frames = {6,1,7,2,8,2,9,2}; --2,4,1,16
			};
			endWith = function(self)
				self:executeAnimation("jumpUp", {
					frames={8,3,9,3,10,24};
				});
			end
		};

		jumpB = {
			attackbox = {pushback=44 * gameLogicMult, hitStun=18, width=40 * gameLogicMult, height=60 * gameLogicMult, dmg=1, relativeX= (-30 * gameLogicMult),
			relativeY=-22 * gameLogicMult, explosionX = -20 * gameLogicMult,explosionY = 60, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23
			{ --hitstun=22
				frames = {1,2,2,4,3,2,4,2};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {5,6}; --4,5,5,5,4,5,5,5,4,5
			};
			{

				type = "recovery";
				frames = {6,3,7,2,8,2};
			};
			endWith = function(self)
				self:executeAnimation("jumpUp", {
				  frames={8,3,9,3,10,24};
				});
			end
		};

		downForwardA = {
			{
				frames = {1,2,2,4,3,2,4,2,5,2,6,2,7,2,8,2,9,1,10,1,11,1};
				custom = function(self)
					self:killProjectileViaTag("medusa")
					self:executeSound('parryWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "recovery";
				frames = {12,5,13,5,14,5,15,5}; --12,5,13,3,14,5,15,5
				custom = function(self)
					self:recordMove()
					self:executeProjectile("medusa")
				end
			};
		};

		-- downForwardB = {
		-- 	{
		-- 		frames = {1,2,2,3,3,2,4,1,5,1,4,1,5,1,6,1,7,1,8,1,9,1};
		-- 		custom = function(self)
		-- 			self:killProjectileViaTag("cannon")
		-- 		end
		-- 	};
		-- 	{
		-- 		type = "recovery";
		-- 		frames = {10,3,11,3,12,7,13,2,14,2,15,1,16,1,17,1,18,5}; --18,1
		-- 		custom = function(self)
		-- 			self:executeProjectile("cannonball")
		-- 		end
		-- 	};
		-- };

		-- downBackB = {
		-- 	{
		-- 		frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2};
		-- 		custom = function(self)
		-- 			self:executeEffect("downBackBStartupHead")
		-- 			self.invulnerability = true
		-- 		end
		-- 	};
		-- 	{
		-- 		type = "recovery";
		-- 		frames = {13,2,14,2,15,2,16,2,17,2,18,2,19,5};
		-- 		custom = function(self)
		-- 			self.invulnerability = false
		-- 		end
		-- 	};
		-- };

		downForwardB = {
			spriteName = "downBackB";
			{
				frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2}; --5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2
				custom = function(self)
					self:executeSound('orbDelay', {"sfx", "turd"})
				end
			};
			{
				type = "recovery";
				frames = {15,2,16,2,17,2,18,2,19,5};
				custom = function(self)
					TEsound.stop("turd")
					self:recordMove()
					self:executeProjectile("downBackBHeadNoAttackbox")
					self:executeSound('launch', {"sfx"})
				end
			};
		};

		downBackB = {
			spriteName = "downForwardB";
			{
				frames = {1,1,2,1,3,1,4,1,5,1,6,1,9,1};
				custom = function(self)
					self.invulnerability = true
					self:killProjectileViaTag("cannon")
				end
			};
			{
				type = "recovery";
				frames = {10,3,11,5}; --18,1
				custom = function(self)
					self:recordMove()
					self:executeProjectile("cannonballTwo")
					self:executeSound('cannon', {"sfx"})
				end
			};
			{
				frames = {12,7,13,3,14,3,15,2,16,2,17,2,18,5}; --18,1
				custom = function(self)
					self.invulnerability = false
				end
			};
		};

		neutralAB = {
			frameData = Template:Type="recovery", frameCount=5;
			-- {
			-- 	frames = {1,40};
			-- 	custom = function(self)
			-- 		self:startTrails("super")
			-- 		-- self:executeSound("tenchiSuperRumble", {"sfx", "whiff"})
			-- 		self.invulnerability = true
			-- 		self.ignoreInvulnOutline = true
			-- 		self.requestSS = true
			-- 		-- self:addFrameTime(6,0,37)
			-- 		-- self:flushBar()
			-- 		-- self:setFrameBar(Template:Type="recovery", frameCount=3)
			-- 		self:emptyMeter()
			-- 	end;
			-- };
			{
				spriteName =  "idle";
				frames = {1,5};
				custom = function(self)
					self:setFlicker(self.colors["alt" .. self.colorNum].meterIcon[1][1]*255,self.colors["alt" .. self.colorNum].meterIcon[1][2]*255,self.colors["alt" .. self.colorNum].meterIcon[1][3]*255,4, true)
					self:emptyMeter()
					self:superStopContinue()
					self.invulnerability = false
					self.ignoreInvulnOutline = false
					self.clone.x = self.previousX
					self.clone.y = self.previousY
					self.clone.flip = self.previousFlip
					self.clone.exists = true
					self.clone.ySpeed = self.previousYSpeed
					self.clone.xSpeed = self.previousXSpeed
					self.clone:executeMove(self.previousMove)
					self.previousX = nil
					self:killProjectileViaTag("wisp")
					self:stopTrails()
					-- local effect = self:findEffect("wisp")
					-- if effect then effect.exists = false end
				end;
			};
			-- frames = {}
		};

		downBackA = {
			{
				frames = {1,2,2,2,3,1,4,1,5,1,6,2,7,2,8,2,10,1,12,2}; --1,9
				custom = function(self)
					self:executeSound('jump', {"sfx", "whiff"})
				end
			};
			{
				type = "recovery";
				frames = {13,3,14,4,15,4,16,3,17,3,18,3}; --13,4,14,4,15,4,16,4,17,4,18,4
				custom = function(self)
					self:executeProjectile("floorchomp")
					self:recordMove()
					-- if self.enemy.flip == 1 then
						-- self:executeProjectile("floorchomp", self.enemy.x + self.enemy.width - 40)
					-- else
						-- local projectile = self:executeProjectile("floorchomp", self.enemy.x + 40)
						-- projectile.x = projectile.x - projectile.width
					-- end
				end
			};
		};

		dashForward = {
			spriteName = "dashForward";
			endWith = function(self)
				self:executeAnimation("teleporting")
				self.runCancel = true
				self.attacking = false
			end;
			{
				frames = {1,2,2,2,3,2,4,1};
				custom = function(self)
					self.attacking = false
					self:executeProjectile("teleportBody")
				end;
			};
		};

		teleportRecovery = {
			spriteName = "dashRecovery";
			endWith = function(self)
				self:changeSpeed(0)
				self:endAttack()
				self.noInput = false
			end;
			{
				type="recovery";
				frames = {1,2,2,2,3,3,4,3,5,3}; --1,2,2,2,3,2,4,2,5,2
				custom = function(self)
					self:executeSound('jump', {"sfx"})
				end;
			};
		};

		dashBack = {
			endWith = function(self)
				self:executeAnimation("teleportingBack")
				self.runCancel = true
				self.attacking = false
			end;
			{
				frames = {1,2,2,2,3,2,4,1};
				custom = function(self)
					self.attacking = false
					self:executeProjectile("teleportBackBody")
					-- self.flip = -self.flip
				end;
			};
		};
	};

	animations = {
		idle = {
			{
				frames = {9,7};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {10,7};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {11,7,12,5,1,7};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {2,7};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {3,7};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {4,7};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {5,7,6,7,7,5};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {8,7};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};





			{
				frames = {20,5,21,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {22,7};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {23,7};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {24,7,13,5,14,7};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {15,7};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {16,5,17,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {18,7};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {19,7};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {20,7};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
		};

		walkForward = {
			{
				frames = {1,3,2,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {5,3,6,3};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {7,3,8,3};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {1,3,2,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {5,3,6,3};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {7,3,8,3};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
		};

		walkBack = {
			{
				frames = {1,3,2,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {5,3,6,3};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {7,3,8,3};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {1,3,2,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {5,3,6,3};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {7,3,8,3};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
		};

		teleporting = {
			spriteName = "dashForward";
			frames = {4,1,5,2,6,2,1,2,2,2,3,2,4,1};
			endWith = "loop";
		};

		teleportingBack = {
			spriteName = "dashBack";
			frames = {4,1,5,2,6,2,1,2,2,2,3,2,4,1};
			endWith = "loop";
		};

		crouchTransition = {
			frames = {1,3,2,2,3,2};
		};
		standTransition = {
			spriteName = "crouchTransition";
			frames = {4,3};
			custom = function(self)
					self.yOffset = self.yOffset +16
				end
		};

		crouch = {
			{
				frames = {10,8};
				custom = function(self)
					self.yOffset = self.yOffset -2
					self:executeEffect("crouchEffect")
				end
			};
			{
				frames = {1,8};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {2,8};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {3,8};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {4,3};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {5,5};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {6,8};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
				{
				frames = {7,8};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {8,3};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {9,5};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};






			{
				frames = {11,8};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {12,8};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {13,8};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {14,8};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {15,8};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
				{
				frames = {16,8};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {17,8};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
		};
		jumpUp = {
			frames={2,3,3,3,4,5,5,3,6,3,7,3,8,3,9,3,10,3,11,5,12,8};
		};
		jumpForward = {
			spriteName = "jumpUp";
			frames={2,3,3,3,4,3,5,3,6,3,7,3,8,5,9,3,10,3,11,3,12,8};
		};
		jumpBack = {
			spriteName = "jumpUp";
			frames={2,3,3,3,4,3,5,3,6,3,7,3,8,5,9,3,10,3,11,3,12,8};
		};
		land = {
			spriteName = "jumpUp";
			frames = {13,3,14,5,15,4};
		};
		airHurt = {
			endWith = "nothing";
			{
				frames = {1,1,2,2,3,2,4,2};
			};
			{
				spriteName = "jumpUp";
				frames = {3,2,4,3,5,3,6,3,7,3,8,4,9,4,10,3,11,3};
			};
		};
		turn = {
			frames = {1,2,2,2,3,3};
		};
		crouchTurn = {
			frames = {1,2,2,2,3,3};
		};
		tech = {
			frames={1,4,2,4,3,4,4,4,5,4};
		};
		preBlock={
			spriteName="blockStand";
			endWith = "nothing";
			frames = {1,1,2,1,3,1};
		};
		preBlockReverse={
			spriteName="blockStand";
			frames = {2,1,1,2};
		};
		preBlockCrouch={
			endWith = "nothing";
			spriteName="blockCrouch";
			frames={1,2,2,1};
		};
		preBlockCrouchReverse={
			spriteName="blockCrouch";
			frames={1,2};
		};
		knockdown = {
			endWith = "nothing";
			frames = {1,6,2,3,3,3,4,3,5,3,6,3}; --1,6,2,3,3,2,4,2,5,2,6,2,7,2,8,2
		};
		chipDeath = {
			endWith = "nothing";
			{
				frames={1,3,2,3};
				custom=function(self)
					self.enemy:drawFirst()
				end
			};
			{
				frames={3,3,4,3,5,3,6,3};
				custom = function(self)
					self:executeSound("chipDeath", {"sfx"})
				end
			};
			{
				frames={7,3};
				custom = function(self)
					self:executeSound("chipDeath", {"sfx"})
				end
			};
			{
				frames={8,1};
				custom = function(self)
					koFinish = true
				end
			};
		};
		impact = {
			spriteName = "knockdown";
			frames = {7,3}
		};
		startGroundBounce = {
			spriteName = "knockdown";
			frames = {7,3,8,5,9,5}
		};
		stopGroundBounce = {
			spriteName = "knockdown";
			frames = {9,2,10,3,11,7}
		};
		wakeup = {
			spriteName = "knockdown";
			frames = {12,1,13,2,14,1,15,2,16,1,17,1,18,2}
		};
		death = {
			spriteName = "knockdown";
			endWith = "nothing";
			frames = {11,1}
		};
		zombie = {
			endWith = "nothing";
			frames={1,3,2,3,3,3,4,3,5,6,6,3,7,3,8,3,9,3,10,6,11,3,12,3,13,3,14,6,15,3,16,3,17,3,18,3,19,6,20,3,21,3,22,3,23,3,24,3,25,3,26,99};
		};
		yay = {
			{
				spriteName = "dashRecovery";
				frames = {2,1,3,1};
			};
			{
				spriteName = "turn";
				frames = {2,3,3,3};
			};
			{
				spriteName = "idle";
				frames = {21,2,22,2,23,2,24,2,20,4};
				custom = function(self)
					self.yOffset = self.yOffset -2
					if love.math.random(1,4) > 3 then
						self.yayTimer = 210
					elseif love.math.random(1,4) > 3 then
						self.yayTimer = 30
					else
						self.yayTimer = 90
					end
				end
			};
			{
				frames = {10,7};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				spriteName = "turn";
				frames = {3,3,2,3};
			};
			{
				spriteName = "dashRecovery";
				frames = {2,1,3,1};
			};
			{
				custom = function(self)
					if self.enemy.identity == "june" then
						self:executeAnimation("yay")
						self.storedSprites = self.sprites
						self.storedMoves = self.moves
						self.storedShader = self.shaders.sprite
						self.sprites = self.sprites
						self.moves = self.moves
						self.shaders.sprite = self.shaders.sprite
						self.glitchImage = true
					else
						self.storedSprites = self.sprites
						self.storedMoves = self.moves
						self.storedShader = self.shaders.sprite
						self.sprites = self.enemy.sprites
						self.moves = self.enemy.moves
						self.shaders.sprite = self.enemy.shaders.sprite
						self.glitchImage = true
					end
				end
			};
		};
		boo = {
			frames = {1,18,2,4,3,8,4,4,5,4,6,4,7,8,8,4,9,4,10,4,11,2,12,2,13,2,14,2,15,2,16,2};
			endWith = function(self)
				self:executeAnimation("booLoop")
			end
		};
		booLoop = {
			{
				frames = {1,4,2,3};
				custom = function(self)
					self.yOffset = self.yOffset - 0
				end
			};
			{
				frames = {2,1,3,4,4,2};
				custom = function(self)
					self.yOffset = self.yOffset - 1
				end
			};
			{
				frames = {5,2,6,5};
				custom = function(self)
					self.yOffset = self.yOffset - 2
				end
			};
			{
				frames = {6,7};
				custom = function(self)
					self.yOffset = self.yOffset - 3
				end
			};
			{
				frames = {6,7};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {6,7};
				custom = function(self)
					self.yOffset = self.yOffset -5
				end
			};
			{
				frames = {6,4,7,2,8,1};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {8,1,9,4,10,2};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {10,2,11,4,12,1};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {12,3,13,4};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {14,4};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			}
		};
		win = {
			{
				frames = {1,4,2,4,3,4,4,4};
				custom = function(self)
					self:drawFirst()
					self:executeSound("teleporting", {"sfx", "turd"})
				end
			};
			{
				frames = {5,4,6,4,7,4,8,4};
				custom = function(self)
					TEsound.stop("turd")
					self:executeSound("jump", {"sfx"})
					self:drawFirst()
					self.ignoreCollision = true
					self:executeEffect('dashDisappear')
					if self.flip == 1 then
						self.x = self.enemy.x - 40 - self.width
					else
						self.x = self.enemy.x + 40 + self.enemy.width
					end
					self:changeSpeed(320)
				end
			};
			{
				frames = {9,4,10,4,11,4};
				custom = function(self)
					self:changeSpeed(0)
				end
			};
			{
				frames = {-1,300};
				custom = function(self)
					self.enemy:executeAnimation("zombie")
				end
			};
		};
	};
	throw = {
		enemyFrames = {
			{20,7,-11}, --f1
			{20,0,-11}, --f2
			{20,-8,-11}, --f3
			{20,-15,-11}, --f4
			{21,-16,-12}, --f5
			{22,-16,-12}, --f6
			{23,-15,-16}, --f7
			{23,-19,-24}, --f8
			{24,-17,-37}, --f9
			{25,-17,-47}, --f10
			{25,-17,-52}, --f11
			{26,-17,-34}, --f12
			{26,-17,-17}, --f13
			{26,-17,-7}, --f14
			{27,-15,-4}, --f15
			{26,-17,-7}, --f16
			{28,-17,-19}, --f17
			{25,-18,-36}, --f18
			{24,-18,-45}, --f19
			{25,-18,-36}, --f20
			{28,-17,-19}, --f21
			{26,-17,-7}, --f22
			{27,-15,-4}, --f23
			{30,-15,-7}, --f24
			{26,-18,-13}, --f25
			{28,-16,-19}, --f26
			{25,-18,-24}, --f27
			{24,-20,-30}, --f28
			{23,-15,-36}, --f29
			{29,-18,-38}, --f30
			{29,-19,-39}, --f31
			{23,-18,-39}, --f32
			{24,-13,-36}, --f33
			{26,-17,-25}, --f34
			{26,-17,-7}, --f35
			{27,-18,-4}, --f36
			{30,-18,-7}, --f37
			{0,0,0}, --f38
			{0,0,0}, --f39
			{0,0,0}, --f40
			{0,0,0}, --f41
			{0,0,0}, --f42
			{0,0,0}, --f43
		};
		start = {
			{frames = {1,3}};
			{
				frames = {2,3};
				custom = function(self) --June moves 7 pixels to the right
					self:changeLocation(7 * gameLogicMult)
				end
			};
			{
				frames = {3,3};
				custom = function(self) --June moves 8 pixels to the right
					self:changeLocation(8 * gameLogicMult)
				end
			};
			{
				frames = {4,2,5,1,6,3,7,2,8,2};
				custom = function(self) --June moves 7 pixels to the right
					self:changeLocation(7 * gameLogicMult)
				end
			};
			{
				frames = {8,2};
				custom = function(self) --June moves 5 pixels to the right
					self:changeLocation(5 * gameLogicMult)
					self:executeSound("grab", {"sfx", "whiff"})
				end
			};
			{
				frames = {9,2,10,2,11,3};
				custom = function(self) --June moves 5 pixels to the right
					self:changeLocation(5 * gameLogicMult)
				end
			};
			{
				frames = {12,1,13,1,14,1};
				custom = function(self) --June moves 4 pixels to the right
					self:changeLocation(4 * gameLogicMult)
				end
			};
			{
				frames = {15,1,16,3};
				custom = function(self)
					self:throwHitstop(8, 38, -300)
					cameraJitterY = 4
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound(self.hitSpecialSFX, "sfx")
					self.enemy:executeKnockdownEffect(70)
				end
			};
		};
		forward = {
			{
				frames = {17,1,18,1,19,8,20,1,21,1,22,1};
				custom = function(self)
					self:executeSound("grab", {"sfx", "whiff"})
				end
			};
			{
				frames = {23,1,24,1};
				custom = function(self)
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound(self.hitSpecialSFX, "sfx")
					self:throwHitstop(8, 38, -300)
					cameraJitterY = 4
					self.enemy:executeKnockdownEffect(70)
				end
			};
			{
				frames = {38,2,39,2,40,2,41,2,42,2};
				custom = function(self) --June moves 3 pixels to the right + thrown person should do their knockdown with some x momentum
					self.enemy:changeLocation(50)
					self.enemy:changeSpeed(300)
					self.enemy.ySpeed = -200
					self.enemy.y = self.enemy.y + 10
					self.enemy.ignoreGravity = false
					self.enemy:knockFall(true)
					self:changeLocation(-3)
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
		};
		backward = { --FROM THE MOMENT THINGS FLIP ONWARD, everything might be a little weird by like 1 pixel?
						--I don't know if it's the offsets that will be weird or June's location
						--It might not do anything noticeable at all since it's one pixel
						--But June's throw sheet goes 10 pixels past her box one one side and 11 pixels on the other
						--And when she flips, in my PSD with offsets I didn't assume the sprite's bounds would move as a result
						--But does it like move one pixel or something because the flip is relative to the hurtbox? idk
			{
				frames = {25,1};
			};
			{
				frames = {26,1};
				custom = function(self) --June moves 8 pixels to the left
					self:changeLocation(-8 * gameLogicMult)
				end
			};
			{
				frames = {27,1,28,1};
				custom = function(self) --June moves 2 pixels to the left
					self:changeLocation(-2 * gameLogicMult)
				end
			};
			{
				frames = {29,1,30,1};
				custom = function(self)--June moves 10 pixels to the left
					self:changeLocation(-10 * gameLogicMult)
				end
			};
			{
				frames = {31,3};
				custom = function(self) --EVERYTHING'S FLIPPED FROM HERE ON, June moves 3 pixels to the left
					self.flip = -self.flip
					self.faceRight = not self.faceRight
					self.enemy.flip = -self.enemy.flip
					self:changeLocation(3 * gameLogicMult)
					self:executeSound("grab", {"sfx", "whiff"})
				end
			};
			{
				frames = {32,1};
				custom = function(self) --June moves 6 pixels to the left
					self:changeLocation(6 * gameLogicMult)
				end
			};
			{
				frames = {33,1};
				custom = function(self) --June moves 9 pixels to the left
					self:changeLocation(9 * gameLogicMult)
				end
			};
			{
				frames = {34,1,35,1};
				custom = function(self) --June moves 2 pixels to the left
					self:changeLocation(2 * gameLogicMult)
				end
			};

			{
				frames = {36,1,37,1}; --this is where the hit happens
				custom = function(self)
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound(self.hitSpecialSFX, "sfx")
					self:throwHitstop(8, 38, -300)
					self.enemy:executeKnockdownEffect(70)
					cameraJitterY = 4
				end
			};

			{
				frames = {38,1,39,2,40,2,41,2,42,2};
				custom = function(self) --June moves 2 pixels to the left
					self.enemy:changeSpeed(-300)
					-- self.enemy.flip = -self.enemy.flip
					self:changeLocation(-2 * gameLogicMult)
					self.enemy:changeLocation(25 * gameLogicMult)
					self.enemy.ySpeed = -200
					self.enemy.y = self.enemy.y + 17
					self.enemy.ignoreGravity = false
					self.ignoreCollision = false
					self.enemy:knockFall(true)
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};

		};
	};
	effects = {

		hitEffect = {
			frames = {1,2,2,2,3,1,4,1,5,1,6,2,7,2,8,1,9,1}; --1,1,2,1,3,2,4,3,5,2
		};

		dashDisappear = {
			frames = {1,1,2,1,3,1,4,1};
			relativeX = -20;
			relativeY = -2;
		};

		teleportBody = {
			spriteName = "dashForwardEffect";
			frames = {1,2,2,2,-1,2,1,2,2,2,-1,2,3,2,4,2,-1,2};
			-- xSpeed = 400;
			relativeX = -standWidth/2;
			relativeY = -2;
			endWith = "loop";
			layer = "top";
			destroyWhenPlayerHurt = true;
			-- onUpdate = function(self, host)
			-- 	if host.move.name ~= "teleporting" and host.move.name ~= "dashForward" then
			-- 		self.exists = false
			-- 		host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip)
			-- 	end
			-- end;
		};

		teleportBackBody = {
			spriteName = "dashBackEffect";
			frames = {1,2,2,2,-1,2,1,2,2,2,-1,2,3,2,4,2,-1,2};
			-- xSpeed = -400;
			relativeX = -standWidth/2 + 6;
			relativeY = -2;
			endWith = "loop";
			layer = "top";
			destroyWhenPlayerHurt = true;
			-- onUpdate = function(self, host)
			-- 	if host.move.name ~= "dashBack" and host.move.name ~= "teleportingBack" then
			-- 		self.exists = false
			-- 		host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip)
			-- 	end
			-- end;
		};

		teleportBodyDeath = {
			spriteName = "turn";
			frames = {2,4};
		};

		drillSmall = {
			frames = {1,2,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1};
			relativeX = 29 * gameLogicMult;
			relativeY = 5 * gameLogicMult;
			ignoreHitstop = false;
			followPlayer = true;
			ignoreFollowY = true;
			onUpdate = function(self, host)
				if host.move.name ~= "lowB" then
					self.exists = false
					host:executeEffect("drillSmallDeath", self.x, self.y, self.flip)
				end
			end;
			endWith = function(self, host)
				self.exists = false
				host:executeEffect("drillSmallDeath", self.x, self.y, self.flip)
			end
		};

		drillSmallDeath = {
			spriteName = "drillSmall";
			relativeX = 4 * gameLogicMult;
			frames = {6,3};
		};

		drillSmallHitstop = {
			spriteName = "drillSmall";
			-- ignoreHitstop = true;
			frames = {2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3};
		};

		drillBigHitstop = {
			spriteName = "drillBig";
			-- ignoreHitstop = true;
			frames = {2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3};
		};

		floorchomp = {
			spriteName = "downBackAEffect";
			frames = {1,1,2,1,3,2,4,2,5,10,6,2,7,2,8,2};
			relativeX = -14; -- -14
			relativeY = -38; -- -38
		};

		drillBig = {
			frames = {1,2,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3};
			relativeX = 51 * gameLogicMult - 60;
			relativeY = -15 * gameLogicMult;
			ignoreHitstop = false;
			followPlayer = true;
			ignoreFollowY = true;
			onUpdate = function(self, host)
				if host.move.name ~= "lowB" then
					self.exists = false
					host:executeEffect("drillBigDeath", self.x, self.y, self.flip)
				end
			end;
		};

		drillBigDeath = {
			spriteName = "drillBig";
			frames = {6,3};
		};

		medusa = {
			frames = {1,3,2,3,3,3,4,3};
			relativeX = -11 * gameLogicMult;
			relativeY = -8 * gameLogicMult;
		};

		medusaDestroy = {
			frames = {1,2,2,2,3,2};
			relativeX = -11 * gameLogicMult;
			relativeY = -8 * gameLogicMult;
		};

		cannonball = {
			relativeX = -11 * gameLogicMult; -- -11 4
			relativeY = -6 * gameLogicMult; -- -6
			ignoreHitstop = false;
			{
				frames = {1,2,2,2,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2};
			};
			-- {
			-- 	frames = {3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2};
			-- };
			-- {
			-- 	frames = {11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2};
			-- };
		};

		cannonballTwo = {
			spriteName="cannonball";
			relativeX = -10 * gameLogicMult; -- -11 4
			relativeY = -6 * gameLogicMult; -- -6
			ignoreHitstop = false;
			{
				frames = {1,2,2,2,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2};
			};
			-- {
			-- 	frames = {3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2};
			-- };
			-- {
			-- 	frames = {11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2};
			-- };
		};

		crouchEffect = {
			relativeX = -11 * gameLogicMult;
			relativeY = 35 * gameLogicMult;
			frames = {1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8};
			layer = "top";
			endWith = "loop";
			followPlayer = true;
			onUpdate = function(self, host)
				if host.move.name ~= "crouch" then
					self.exists = false
				end
			end;
		};

		cannonballSplat = {
			frames = {1,2,2,1,3,1,4,1,5,2,6,2,7,2,8,2};
			relativeX = -9 * gameLogicMult;
			relativeY = -1 * gameLogicMult;
		};

		cannonballDestroyUp = {
			spriteName = "cannonballDestroy";
			frames = {1,2,2,2,3,2};
			relativeX = -11 * gameLogicMult;
			relativeY = -6 * gameLogicMult;
		};
		cannonballDestroySpin = {
			spriteName = "cannonballDestroy";
			frames = {4,2,5,2,6,2};
			relativeX = -11 * gameLogicMult;
			relativeY = -6 * gameLogicMult;
		};
		cannonballDestroyDown = {
			spriteName = "cannonballDestroy";
			frames = {7,2,8,2,9,2};
			relativeX = -11 * gameLogicMult;
			relativeY = -6 * gameLogicMult;
		};

		downBackBStartupHead = {
			relativeX = -11 * gameLogicMult;
			relativeY = -13 * gameLogicMult;
			layer = "bottom";
			ignoreHitstop = false;
			followPlayer = true;
			{
				frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2};
			};
			{
				spriteName = "downBackBHead";
				frames = {1,3};
				custom = function(self)
					self.followPlayer = false;
					self.y = self.y - 20 * gameLogicMult;
				end
			};
			{
				-- spriteName = "downBackBHead";
				-- frames = {2,3,3,3,4,3,5,3,6,3,7,3,8,3};
				custom = function(self, host)
					if self.flip == 1 then
						host:executeProjectile("downBackBHeadNoAttackbox", self.x + 6, self.y+68)
					else
						host:executeProjectile("downBackBHeadNoAttackbox", self.x - 6 - (50*gameLogicMult), self.y+68, -1)
					end
					self.exists = false
					-- host:executeProjectile("downBackBHeadNoAttackbox")
					-- self.layer = "top";
					-- self.xSpeed = 190;
					-- self.ySpeed = -180 * gameLogicMult;
					-- self.gravity = 10 * gameLogicMult;
				end
			};
			-- {
			-- 	custom = function(self, host)
			-- 		if self.flip == 1 then
			-- 			host:executeProjectile("downBackBHead", self.x + 6, self.y+70)
			-- 		else
			-- 			host:executeProjectile("downBackBHead", self.x - 6 - (50*gameLogicMult), self.y+70, -1)
			-- 			-- host:executeProjectile("downBackBHead", host.x + host.width - (50*gameLogicMult), self.y, -1) example of making it work properly if it's host.x
			-- 		end
			-- 		self.exists = false
			-- 	end
			-- };
		};

		downBackBHeadNoAttackbox = {
			relativeX = -3 * gameLogicMult;
			relativeY = -37 * gameLogicMult;
			ignoreHitstop = false;
			spriteName = "downBackBHead";
			endWith = "destroy";
			-- {
				frames = {2,3,3,3,4,3,5,3,6,3,7,3,8,5};
			-- };
			-- {
			-- 	custom = function(self, host)
			-- 		if self.flip == 1 then
			-- 			host:executeProjectile("downBackBHead", self.x + 6, self.y+70)
			-- 		else
			-- 			host:executeProjectile("downBackBHead", self.x - 6 - (50*gameLogicMult), self.y+70, -1)
			-- 		end
			-- 		self.exists = false
			-- 	end
			-- };
		};

		downBackBHead = {
			relativeX = -3 * gameLogicMult;
			relativeY = -37 * gameLogicMult;
			ignoreHitstop = false;
			{
				frames = {9,2,10,2,11,2,12,2};
			};
		};

		downBackBHeadDestroy = {
			relativeX = -3 * gameLogicMult;
			relativeY = -37 * gameLogicMult;
			spriteName = "downBackBHead";
			frames = {13,2,14,2};
		};

		soul = {
			frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,2,11,2,12,2,13,2};
			-- frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3};
		};

		soulDestroy = {
			spriteName = "soul";
			frames = {10,3,11,3,12,3,13,3};
		};

		soulObsorb = {
			spriteName = "soul";
			frames = {10,9};
		};
		-- idleHair = {
		-- 	frames = {4,14,1,26,2,14,3,27}; --3,81
		-- 	relativeX = -24;
		-- 	relativeY = -2;
		-- 	followPlayer = true;
		-- 	layer = "bottom";
		-- };

		wisp = {
			layer = "bottom";
			relativeX = -11 * gameLogicMult;
			relativeY = -2 * gameLogicMult;
			endWith = "loop";
			{
				frames = {9,2,21,2,33,2,9,1};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {10,1,22,2,34,2,10,2};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {23,2,35,2,11,2,23,1,24,1,36,2,12,2,13,2,25,2,1,2,13,1};
				custom = function(self)
					self.yOffset = self.yOffset -4
				end
			};
			{
				frames = {14,1,26,2,2,2,14,2};
				custom = function(self)
					self.yOffset = self.yOffset -3
				end
			};
			{
				frames = {27,2,3,2,15,2,27,1};
				custom = function(self)
					self.yOffset = self.yOffset -2
				end
			};
			{
				frames = {28,1,4,2,16,2,28,2};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
			{
				frames = {5,2,17,2,29,2,5,1,6,1,18,2,30,2,6,2,19,2,31,2,7,1};
				custom = function(self)
					self.yOffset = self.yOffset -0
				end
			};
			{
				frames = {8,1,20,2,32,2,8,2};
				custom = function(self)
					self.yOffset = self.yOffset -1
				end
			};
		};
		nameplateLoop = {
			spriteName = "nameplate";
			frames = {83,6,84,1,85,1,86,1,87,1,88,1,89,1,90,6,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,5,99,1,98,6,101,1,102,1,101,1,98,13,102,1,98,12,99,1,98,1,99,1,98,8,99,1,98,8,99,1,98,4,99,1,100,1,101,1,102,1};
			endWith = "loop";
		};

		nameplate = {
			frames = {1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,43,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1};
			custom = function(self, host)
				if host.player1 == true then
					host:executeSound("nameplate", {"sfx", "nameplate1"}, -1)
				else
					host:executeSound("nameplate", {"sfx", "nameplate2"}, 1)
				end
			end;
			endWith = function(self, host)
				--replace "wisp" with your looping nameplate thing
				if host.player1 == true then
					host:executeEffect("nameplateLoop", 7 * gameLogicMult, 78 * gameLogicMult)
				else
					host:executeEffect("nameplateLoop", 152 *gameLogicMult, 17 *gameLogicMult, 1)
				end
				self.exists = false
			end;
		};
	};

	projectiles = {
		wisp = {
			width = 8 * gameLogicMult;
			height = 5 * gameLogicMult;
			deathTag = "wisp";
			noAttackbox = true;
			onLeaveScreen = function(self)
				self.host.neutralABRequirement = false
				self.host.previousMove = nil
				self.host.previousFlip = nil
				self.host.previousX = nil
				self.host.previousY = nil
				self.host.previousYSpeed = nil
				self.host.previousXSpeed = nil
				self:destroy()
			end;
		};
		soul = {
			destroyEffect = "soulDestroy";
			relativeX = 0 * gameLogicMult;
			relativeY = -9 * gameLogicMult;
			-- explosionX = -12 * gameLogicMult;
			width = 17 * gameLogicMult;
			height = 20 * gameLogicMult;
			ySpeed = -300;
			decay = 20;
			hitstop = 10;
			lifetime = 90;
			noAttackbox = true;
			onHostCollide = function(self)
				self.host:changeMeter(1)
				self.host:executeSound("soulGet", "sfx")
				self:destroy("soulObsorb")
			end;
		};
		medusa = {
			destroyEffect = "medusaDestroy";
			sfx = "medusa";
			xSpeed = 200; --default 350
			relativeX = 0*gameLogicMult;
			relativeY = -9*gameLogicMult;
			hitStun = 20; --22
			pushback = 250;
			explosionX = 2 * gameLogicMult;
			width = 17 * gameLogicMult;
			height = 20 * gameLogicMult;
			hitstop = 10;
			priority = 2;
			shape = "sin";
			deathTag = "medusa";
			-- ifMultiple = function(self, host, otherProjectile)
			-- 	otherProjectile:destroy()
			-- end;
		};

		floorchomp = {
			sfx = "rush";
			dontKillSFX = true;
			relativeX = 24 * gameLogicMult;
			relativeY = 40 * gameLogicMult; -- 40
			width = 50 * gameLogicMult;
			height = 12 * gameLogicMult; -- 12
			explosionX = -25 * gameLogicMult;
			explosionY = -20 * gameLogicMult;
			-- knockFall = 200;
			pushUp = 540; --600
			hitStun = 19;
			pushback = 40;
			lifetime = 5;
			dontKillEffect = true;
			stayOnScreen = true;
			attacktype = attackTypes.low;
		};

		downBackBHead = {
			-- relativeX = 0 * gameLogicMult;
			-- relativeY = 70 * gameLogicMult;
			sfx = "heavyWhiff";
			dontKillSFX = true;
			destroyEffect = "downBackBHeadDestroy";
			width = 50 * gameLogicMult;
			height = 15 * gameLogicMult;
			explosionX = -22 * gameLogicMult;
			-- explosionY = -20 * gameLogicMult;
			pushUp = -800;
			hitStun = 20;
			pushback = 40;
			lifetime = 10;
			lifetimeIgnoreHitstop = true;
			cornerStop = true;
			xSpeed = 0;
			ySpeed = 700;
			ignoreHitstop = false;
			attacktype = attackTypes.high;
			-- decay = 20;
		};

		downBackBHeadNoAttackbox = {
			relativeX = -11 * gameLogicMult + 6;
			relativeY = 0;

			width = 50 * gameLogicMult;
			height = 12 * gameLogicMult;
			xSpeed = 180 * gameLogicMult; --190 * gamelogicMult
			ySpeed = -180 * gameLogicMult;
			-- gravity = 10 * gameLogicMult;
			decay = 10 * gameLogicMult;
			lifetime = 22;
			noAttackbox = true;
			cornerStop = true;

			onDestroy = function(self, host)
				if self.flip == 1 then
					host:executeProjectile("downBackBHead", self.x, self.y) --70
				else
					host:executeProjectile("downBackBHead", self.x, self.y, -1) --70
					--+ (50*gameLogicMult)
				end
				self.exists = false
				self.liveEffect.exists = false
				-- self.liveEffect.endWith = "destroy"
			end
		};

		cannonball = {
			-- destroyEffect = "cannonballSplat";
			xSpeed = 150 * gameLogicMult; -- 120 * gameLogicMult --170
			ySpeed = -220 * gameLogicMult; -- -250 * gameLogicMult
			gravity = 500 * gameLogicMult; --450 * gameLogicMult
			relativeX = 30*gameLogicMult;
			relativeY = -13*gameLogicMult;
			decay = 20;
			hitStun = 25;
			pushback = 200; --150
			pushUp = 300;
			lifetime = 40; --75  49
			lifetimeIgnoreHitstop = true;
			explosionX = 2 * gameLogicMult;
			explosionY = 8 * gameLogicMult;
			width = 17 * gameLogicMult;
			height = 20 * gameLogicMult;
			hitstop = 10;
			priority = 2;
			cornerStop = true;
			deathTag = "cannon";
			onLifetimeEnd = function(self, host)
				self:placeProjectileEffect("cannonballDestroySpin")
				self.liveEffect.endWith = "destroy"
				self:removeSFX()
				self.exists = false
			end;
			onDestroy = function(self, host)
				if self.liveEffect.animation.position < 6 then
					self:placeProjectileEffect("cannonballDestroyUp")
				elseif self.liveEffect.animation.position < 56 then
					self:placeProjectileEffect("cannonballDestroySpin")
				else
					self:placeProjectileEffect("cannonballDestroyDown")
				end
				self.liveEffect.endWith = "destroy"
				self:removeSFX()
				self.exists = false
			end;
			-- ifMultiple = function(self, host, otherProjectile)
			-- 	otherProjectile:destroy()
			-- end;
		};
		cannonballTwo = {
			-- destroyEffect = "cannonballSplat";
			sfx = 'cannonball';
			xSpeed = 150 * gameLogicMult; -- 120 * gameLogicMult --170
			ySpeed = -220 * gameLogicMult; -- -250 * gameLogicMult
			gravity = 500 * gameLogicMult; --450 * gameLogicMult
			relativeX = 25*gameLogicMult;
			relativeY = -13*gameLogicMult;
			decay = 20;
			hitStun = 25;
			pushback = 200; --150
			pushUp = 300;
			lifetime = 40; --75  49
			lifetimeIgnoreHitstop = true;
			explosionX = 2 * gameLogicMult;
			explosionY = 8 * gameLogicMult;
			width = 17 * gameLogicMult;
			height = 20 * gameLogicMult;
			hitstop = 10;
			priority = 2;
			cornerStop = true;
			deathTag = "cannon";
			onLifetimeEnd = function(self, host)
				self:placeProjectileEffect("cannonballDestroySpin")
				self.liveEffect.endWith = "destroy"
				self:removeSFX()
				self.exists = false
			end;
			onDestroy = function(self, host)
				if self.liveEffect.animation.position < 6 then
					self:placeProjectileEffect("cannonballDestroyUp")
				elseif self.liveEffect.animation.position < 56 then
					self:placeProjectileEffect("cannonballDestroySpin")
				else
					self:placeProjectileEffect("cannonballDestroyDown")
				end
				self.liveEffect.endWith = "destroy"
				self:removeSFX()
				self.exists = false
			end;
			-- ifMultiple = function(self, host, otherProjectile)
			-- 	otherProjectile:destroy()
			-- end;
		};
		teleportBody = {
			sfx = "teleporting";
			xSpeed = 400;
			relativeX = 0;
			relativeY = 0;
			width = standWidth;
			height = standHeight;
			noAttackbox = true;
			deathTag = "teleportTag";
			-- stayOnScreen = true;
			onEdgeTouch = function(self, host)
				host:endTeleport()
			end;
			onUpdate = function(self)
				if self.host.move.name ~= "teleporting" and self.host.move.name ~= "dashForward" then
					self:destroy()
					-- self.exists = false
					-- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip)
				end
			end;
		};

		teleportBackBody = {
			sfx = "teleporting";
			xSpeed = -400;
			relativeX = 0;
			relativeY = 0;
			width = standWidth;
			height = standHeight;
			noAttackbox = true;
			deathTag = "teleportTag";
			-- stayOnScreen = true;
			onEdgeTouch = function(self, host)
				host:endTeleport()
			end;
			onUpdate = function(self)
				if self.host.move.name ~= "dashBack" and self.host.move.name ~= "teleportingBack" then
					self:destroy()
			-- 		-- self.exists = false
			-- 		-- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip)
				end
			end;
		};
	};

	colors = {
		default = { --blue
			--colors self-identified
			sprite = {
				{128,183,192}; --blue
				{240,255,255}; --white
				{213,248,255}; --skin

				{0,13,13}; --hair darkest
				{0,23,34};
				{0,35,51};
				{0,51,62};
				{0,75,88};
				{0,110,125};
				{0,162,166};
				{0,216,255};--hair brightest
			};
			effects = {
				{128,183,192}; --blue
				{240,255,255}; --white
				{213,248,255}; --skin

				{0,13,13}; --hair darkest
				{0,23,34};
				{0,35,51};
				{0,51,62};
				{0,75,88};
				{0,110,125};
				{0,162,166};
				{0,216,255};--hair brightest

				{255,0,0}; --soul red
				{255,149,161}; --soul pink

				{128,0,0}; --wisp red
			};
			meterIcon = {
				{255,0,0}; -- red
				{255,165,164}; --pink
			};

			hit = {255,0,0};

			--generalAssets
			dust = {128,183,192};
			mainUI = {0,75,88}; --UIcolor
			health = {0,216,255};
			meterChunk = {
				--meterOne
				{255,0,0}; --dark
				{255,69,69}; --medium
				{255,121,121}; --light

				--meterTwo
				{255,121,121}; --darkGreen
				{255,180,180}; --mediumGreen
				{255,228,228}; --lightestGreen
			};
			trailSuper = {
				{255,0,0}; --medium hand outline
				{255,255,255}; --white
				{255,255,255}; --hand trails
			};
		};
		alt1 = { --red
			--colors self-identified
			sprite = {
				{247,0,0}; --blue
				{255,242,242}; --white
				{255,216,213}; --skin

				{25,0,0}; --hair darkest
				{48,0,0};
				{75,0,0};
				{111,0,0};
				{165,0,0};
				{235,0,0};
				{249,38,38};
				{255,70,87};--hair brightest
			};
			effects = {
				{247,0,0}; --blue
				{255,242,242}; --white
				{255,216,213}; --skin

				{33,0,0}; --hair darkest
				{55,0,0};
				{75,0,0};
				{111,0,0};
				{165,0,0};
				{235,0,0};
				{249,38,38};
				{255,70,87};--hair brightest

				{67,214,247}; --soul red
				{117,255,239}; --soul pink

				{34,107,124}; --wisp red
			};
			meterIcon = {
				{67,214,247}; -- red
				{117,255,239}; --pink
			};

			hit = {67,214,247};

			--generalAssets
			dust = {255,64,64};
			mainUI = {113, 0, 0};
				health = {255,0,0};
				meterChunk = {
					--meterOne
					{16,143,255}; --darkBlue
					{64,174,255}; --medium blue
					{131,221,251}; --lightest blue

					--meterTwo
					{99,187,255}; --darkblue
					{164,216,255}; --medium blue
					{233,236,255}; --lightest blue
				};
			trailSuper = {
				{67,214,247}; --medium hand outline
				{255,255,255}; --white
				{255,255,255}; --hand trails
			};
		};
		alt2 = { --orange
			--colors self-identified
			sprite = {
				{255,132,21}; --blue
				{255,251,240}; --white
				{255,255,179}; --skin

				{17,8,0}; --hair darkest
				{33,14,0};
				{49,22,0};
				{72,33,0};
				{101,52,0};
				{185,111,0};
				{248,167,0};
				{255,219,49};--hair brightest
			};
			effects = {
				{255,132,21}; --blue
				{255,251,240}; --white
				{255,255,179}; --skin

				{17,8,0}; --hair darkest
				{33,14,0};
				{49,22,0};
				{72,33,0};
				{101,52,0};
				{185,111,0};
				{248,167,0};
				{255,219,49};--hair brightest

				{255,255,0}; --soul red
				{255,255,158}; --soul pink

				{127,128,0}; --wisp red
			};
			meterIcon = {
				{255,255,0}; -- red
				{255,255,158}; --pink
			};

			hit = {255,255,0};

			--generalAssets
			dust = {255,164,42};
			mainUI = {187, 72, 0};
			health = {255,102,7};
			-- trailSuper = {255, 255, 0};
			-- trailDash = {255,122,0};
			trailSuper = {
				{255,255,0}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
				meterChunk = {
				--meterOne
				{215,191,0}; --darkGreen
				{246,255,109}; --mediumGreen
				{255,255,255}; --lightestGreen

				--meterTwo
				{254,255,96}; --darkGreen
				{249,255,174}; --mediumGreen
				{255,255,255}; --lightestGreen
			};
		};
		alt3 = {
			--colors self-identified
			sprite = {
				{248,244,64}; --blue
				{255,255,240}; --white
				{253,255,205}; --skin

				{18,18,5}; --hair darkest
				{34,33,0};
				{47,51,0};
				{61,62,0};
				{88,79,0};
				{140,134,30};
				{190,196,0};
				{255,255,0};--hair brightest
			};
			effects = {
				{248,244,64}; --blue
				{255,255,240}; --white
				{253,255,205}; --skin

				{18,18,5}; --hair darkest
				{34,33,0};
				{47,51,0};
				{61,62,0};
				{88,79,0};
				{140,134,30};
				{190,196,0};
				{255,255,0};--hair brightest

				{255,30,106}; --soul red
				{255,154,182}; --soul pink

				{128,15,53}; --wisp red
			};
			meterIcon = {
				{255,30,106}; -- red
				{255,154,182}; --pink
			};

			hit = {255,30,106};

			--generalAssets
			dust = {255,255,0};
			mainUI = {113, 113, 0};
			health = {215,215,0};
			meterChunk = {
				--meterOne
				{255,16,83}; --darkBlue
				{255,64,126}; --medium blue
				{251,131,191}; --lightest blue

				--meterTwo
				{255,100,146}; --darkblue
				{255,164,178}; --medium blue
				{255,239,233}; --lightest blue
			};
			trailSuper = {
				{255,30,106}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
		};
		alt4 = {
			--colors self-identified
			sprite = {
				{130,198,0}; --blue
				{244,255,244}; --white
				{214,255,182}; --skin

				{5,23,0}; --hair darkest
				{9,38,0};
				{0,51,10};
				{0,66,10};
				{44,88,0};
				{54,128,0};
				{53,196,0};
				{0,255,0};--hair brightest
			};
			effects = {
				{130,198,0}; --blue
				{244,255,244}; --white
				{214,255,182}; --skin

				{5,23,0}; --hair darkest
				{9,38,0};
				{0,51,10};
				{0,66,10};
				{44,88,0};
				{54,128,0};
				{53,196,0};
				{0,255,0};--hair brightest

				{212,0,211}; --soul red
				{235,117,255}; --soul pink

				{106,0,106}; --wisp red
			};
			meterIcon = {
				{212,0,211}; -- red
				{235,117,255}; --pink
			};

			hit = {212,0,211};

			--generalAssets
			dust = {0,255,0};
			mainUI = {0, 113, 0};
			health = {0,255,0};
			meterChunk = {
					--meterOne
				{148,0,247}; --darkGreen
				{191,87,199}; --mediumGreen
				{240,128,240}; --lightestGreen

					--meterTwo
				{240,128,240}; --darkGreen
				{255,175,255}; --mediumGreen
				{255,228,242}; --lightestGreen
			};
			trailSuper = {
				{212,0,211}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
		};
		alt6 = { --gray
			--colors self-identified
			sprite = {
				{155,155,167}; --blue
				{247,247,247}; --white
				{223,223,223}; --skin

				{13,13,13}; --hair darkest
				{21,21,21};
				{30,30,30};
				{43,43,43};
				{65,65,65};
				{108,108,108};
				{177,177,177};
				{255,255,255};--hair brightest
			};
			effects = {
				{155,155,167}; --blue
				{247,247,247}; --white
				{223,223,223}; --skin

				{13,13,13}; --hair darkest
				{21,21,21};
				{30,30,30};
				{43,43,43};
				{65,65,65};
				{108,108,108};
				{177,177,177};
				{255,255,255};--hair brightest

				{148,0,247}; --soul red
				{240,128,240}; --soul pink

				{74,0,124}; --wisp red
			};
			meterIcon = {
				{148,0,247}; --soul red
				{240,128,240}; --soul pink
			};

			hit = {148,0,247};

			--generalAssets
			dust = {155,155,167};
			mainUI = {64,64,64}; --UIcolor
			health = {155,155,167};
			meterChunk = {
				--meterOne
				{148,0,247}; --darkGreen
				{191,87,199}; --mediumGreen
				{240,128,240}; --lightestGreen

				--meterTwo
				{240,128,240}; --darkGreen
				{255,175,255}; --mediumGreen
				{255,228,242}; --lightestGreen
			};
			trailSuper = {
				{148,0,247}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
		};
		alt7 = {
			--colors self-identified
			sprite = {
				{158,94,161}; --blue
				{243,221,255}; --white
				{225,191,255}; --skin

				{32,0,31}; --hair darkest
				{40,0,47};
				{52,0,64};
				{69,0,80};
				{95,0,105};
				{135,0,170};
				{161,0,206};
				{235,34,255};--hair brightest
			};
			effects = {
				{158,94,161}; --blue
				{243,221,255}; --white
				{225,191,255}; --skin

				{32,0,31}; --hair darkest
				{40,0,47};
				{52,0,64};
				{69,0,80};
				{95,0,105};
				{135,0,170};
				{161,0,206};
				{235,34,255};--hair brightest

				{0,255,0}; --soul red
				{178,255,171}; --soul pink

				{0,128,0}; --wisp red
			};
			meterIcon = {
				{0,255,0}; -- red
				{178,255,171}; --pink
			};

			hit = {0,255,0};

			--generalAssets
			dust = {171,43,200};
			block = {171,43,200};
			mainUI = {71,42,69};
			health = {171,43,200};
			meterChunk = {
				--meterOne
				{19,176,11}; --darkBlue
				{0,255,0}; --medium blue
				{144,255,96}; --lightest blue

				--meterTwo
				{108,255,94}; --darkblue
				{192,255,162}; --medium blue
				{240,255,236}; --lightest blue
			};
			trailSuper = {
				{0,255,0}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
		};
		alt8 = {
			--colors self-identified
			sprite = {
				{255,165,255}; --blue
				{255,240,255}; --white
				{255,237,237}; --skin

				{23,0,10}; --hair darkest
				{38,0,18};
				{55,0,31};
				{80,0,35};
				{116,0,45};
				{151,0,47};
				{196,0,63};
				{255,43,106};--hair brightest
			};
			effects = {
				{255,165,255}; --blue
				{255,240,255}; --white
				{255,237,237}; --skin

				{23,0,10}; --hair darkest
				{38,0,18};
				{55,0,31};
				{80,0,35};
				{116,0,45};
				{151,0,47};
				{196,0,63};
				{255,43,106};--hair brightest

				{0,220,161}; --soul red
				{149,235,255}; --soul pink

				{0,91,66}; --wisp red
			};
			meterIcon = {
				{0,220,161}; -- red
				{149,235,255}; --pink
			};

			hit = {0,220,161};

			--generalAssets
			dust = {255,100,146};
			mainUI = {149,0,52};
			health = {255,100,146};
			meterChunk = {
				--meterOne
				{0,151,155}; --darkBlue
				{0,221,180}; --medium blue
				{169,255,183}; --lightest blue

				--meterTwo
				{99,232,255}; --darkblue
				{164,251,255}; --medium blue
				{234,246,255}; --lightest blue
			};
			trailSuper = {
				{0,220,161}; --black
				{255,255,255}; --white
				{255,255,255}; --other
			};
		};

	};
};

--disabled for the trailer
function June:onEnemyHit(blocked)
	if self.enemy.flip == 1 then
		self:executeProjectile("soul", math.floor(self.enemy.x + self.enemy.width/2), math.floor(self.enemy.y + self.enemy.height/2 - 30), self.enemy.flip)
	else
		self:executeProjectile("soul", math.floor(self.enemy.x + self.enemy.width/2) - 17 * gameLogicMult, math.floor(self.enemy.y + self.enemy.height/2 - 30), self.enemy.flip)
	end
end

function June:endTeleport()
	if not self:findEffect("teleportBody") and not self:findEffect("teleportBackBody") then return end
	self.runCancel = false
	self.noInput = true
	self.moves.teleportRecovery.endWith = nil
	self:executeEffect('dashDisappear')
	local effect = self:findEffect("teleportBody")
	if not effect or not effect.exists then
		effect = self:findEffect("teleportBackBody")
		effect.x = effect.x - (20 * self.flip)
	end
	if effect then
		if self.flip == 1 then
			self.x = effect.x + 30
			self.requestX = self.x
		else
			self.x = effect.x - (19 * gameLogicMult) - 30
			self.requestX = self.x
		end
	end
	self:executeMove('teleportRecovery')
end

function June:update(dt)
	if self.yayTimer >= 0 and resultScreen then
		self.yayTimer = self.yayTimer - 1
		if self.yayTimer == -1 then
			if self.storedSprites and self.storedMoves then
				self.sprites = self.storedSprites
				self.moves = self.storedMoves
				self.shaders.sprite = self.storedShader
				self.glitchImage = false
				self:executeMove("yay")
			end
		end
	end
	if self:cloneExists() then
	  self.clone:update(frameTime)
	  if self.clone.move.name == "idle" or self.clone.move.name == "crouch" then
	    self.clone.exists = false
	    local effect = self.clone:findEffect("crouchEffect")
	    if effect then
	    	effect.exists = false
	    end
	  end
	end
	self:_update(dt)
end

function June:controlUpdate(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
	self.blockHigh = false
	self.blockLow = false

	if tapA then
		buttonA = true
	end

	if tapB then
		buttonB = true
	end

	if self.runCancel and hitstop <= 0 and self.freezeTime == 0 then --don't forget to make this false on normalhit
		if not buttonA and self.lastFrameA then
			self.repeatA = false
		end

		if not buttonB and self.lastFrameB then
			self.repeatB = false
		end

		self.lastFrameA = buttonA
		self.lastFrameB = buttonB

		-- if up then
		-- 	self:endTeleport()
		-- 	self.move.endWith = function()
		-- 		self.move.endWith = nil
		-- 		self:endAttack()
		-- 		self:jump()
		-- 	end
		-- 	return
		if buttonA and not self.repeatA then
			self:endTeleport()
			self.repeatA = true
			self.lastFrameA = true
			if buttonB and not self.repeatB and self.neutralABRequirement then
				self.move.endWith = function()
					self.moves.teleportRecovery.endWith = nil
					self:endAttack()
					local oldrepeat = self.repeatA
					local oldrepeat2 = self.repeatB
					self:checkTurn()
					self:executeMove("neutralAB")
					self.repeatA = oldrepeat
					self.repeatB = oldrepeat2
				end
			elseif down then
				self.move.endWith = function()
					self.moves.teleportRecovery.endWith = nil
					self:endAttack()
					local oldrepeat = self.repeatA
					self:checkTurn()
					if oldrepeat and ((right and self.flip == 1) or (left and self.flip == -1)) then
						self:executeMove("downForwardA")
					elseif oldrepeat and ((right and self.flip == -1) or (left and self.flip == 1)) then
						self:executeMove("downBackA")
					else
						self:executeMove("lowA")
					end
					self.ABTimer = 0
					self.repeatA = oldrepeat
				end
			else
				self.move.endWith = function()
					self.moves.teleportRecovery.endWith = nil
					self:endAttack()
					local oldrepeat = self.repeatA
					self:checkTurn()
					self:executeMove("standA")
					self.ABTimer = 0
					self.repeatA = oldrepeat
				end
			end
			return
		elseif buttonB and not self.repeatB then
			self:endTeleport()
			self.repeatB = true
			self.lastFrameB = true
			if down then
				self.move.endWith = function()
					self.moves.teleportRecovery.endWith = nil
					self:endAttack()
					local oldrepeat = self.repeatB
					self:checkTurn()
					if oldrepeat and ((right and self.flip == 1) or (left and self.flip == -1)) then
						self:executeMove("downForwardB")
					elseif oldrepeat and ((right and self.flip == -1) or (left and self.flip == 1)) then
						self:executeMove("downBackB")
					else
						self:executeMove("lowB")
					end
					self.ABTimer = 0
					self.repeatB = oldrepeat
				end
			else
				self.move.endWith = function()
					self.moves.teleportRecovery.endWith = nil
					self:endAttack()
					local oldrepeat = self.repeatB
					self:checkTurn()
					self:executeMove("standB")
					self.ABTimer = 0
					self.throwTimer = 0
					self.repeatB = oldrepeat
				end
			end
			return
		elseif (self.move.name == "teleporting" and ((not right and self.flip == 1) or (not left and self.flip == -1))) or (self.move.name == "teleportingBack" and ((not right and self.flip == -1) or (not left and self.flip == 1))) then
			self:endTeleport()
			return
		end
	else
		local isLastFrameCheck = (self.ABTimer == 1)
		self:_controlUpdate(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
		if isLastFrameCheck and self.move.name ~= "neutralAB" then
			-- self:recordMove()
		end
	end
end

function June:hitResponse(alsoHit, delayHurt, hurtboxHit)
	if self.move.name == "lowB" then
		local effect = self:findEffect("drillBig")
		if effect then
			effect.exists = false
			self:executeEffect("drillBigHitstop", effect.x, effect.y, effect.flip)
			--KILLS SMALL EFFECT IF IT EXISTS
			-- effect = self:findEffect("drillSmall")
			-- if effect then
			-- 	effect.exists = false
			-- 	self:executeEffect("drillSmallDeath", effect.x, effect.y, effect.flip)
			-- end
		else
			effect = self:findEffect("drillSmall")
			if effect then
				effect.exists = false
				self:executeEffect("drillSmallHitstop", effect.x, effect.y, effect.flip)
			end
		end
	end
	self:_hitResponse(alsoHit, delayHurt, hurtboxHit)
end

function June:recordMove()
	if not self.isClone and self.meterAmount == 5 and not self.clone.exists then
		self.previousMove = self.move.name
		self.previousFlip = self.flip
		self.previousX = self.x
		self.previousY = self.y
		self.previousYSpeed = self.ySpeed
		self.previousXSpeed = self.xSpeed
		self:killProjectileViaTag("wisp")
		-- local effect = self:findEffect("wisp")
		-- if effect then
		-- 	effect.exists = false
		-- end
		if self.previousFlip == -1 then
			self:executeProjectile("wisp", self.previousX + 22, self.previousY, self.previousFlip)
		else
			self:executeProjectile("wisp", self.previousX, self.previousY, self.previousFlip)
		end
		-- self:executeEffect("wisp")
		if self.meterAmount == 5 then
			self.neutralABRequirement = true
		end
	end
end

function June:executeMove(moveName)
	self:_executeMove(moveName)
	-- if moveName == "downForwardB" or moveName == "downBackB" or moveName == "downForwardA" or moveName == "downBackA" then
	-- 	self:recordMove()
	-- end
end

function June:hitReset()
	self:killProjectileViaTag("teleportTag")
	-- local effect = self:findEffect("teleportBody")
	-- if not effect then
	-- 	effect = self:findEffect("teleportBackBody")
	-- end
	-- if effect then
	-- 	effect.exists = false
	-- end
	self:_hitReset()
end

function June:initiate(isClone)
	self:_initiate()
	-- self.projectiles[1] = Fireball()
	if isClone then
		self.isClone = true
		-- self.exists = false
	else
		self.clone = characterLoad(self.playerNum, "june", self.colorNum, true)
	end
	-- constants
	self.pushbackDustOffset = -10
	self.yayTimer = -1

	self.hitLightSFX = "lightAttack"
	self.hitHeavySFX = "heavyAttack"
	self.hitLowSFX = "lowAttack"
	self.hitSpecialSFX = "special"
end

function June:changeColor(colorChange)
	if self.clone then
		self.clone:_changeColor(colorChange)
	end
	self:_changeColor(colorChange)
end

function June:reset()
	self:_reset()
	self.previousMove = nil
	self.previousFlip = nil
	self.previousX = nil
	self.previousY = nil
	self.previousYSpeed = nil
	self.previousXSpeed = nil
end

function June:resetMeter()
	self.meterChunkArray = {}
	for i=1, 5 do
		self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(1,1,4,2,2,2,4,2,2,2,4,2,2,2)), frameTime, 'pauseAtEnd') --6,1,1,2,2,2,3,2,4,2,5,1
	end
	self:_resetMeter()
end

function June:meterAnimation()
	love.graphics.setShader(self.shaders.meterIcon)
	if self.player1 then
		self.meterAnimate:draw(self.sprites.meter.sheet, self.meterX, self.meterY + self.meterJitter, 0, gameLogicMult, gameLogicMult, 0, 0)
		love.graphics.setShader(self.shaders.meterChunk)
		for i=1, 5 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX + 122 - 18) - (d * 16), self.meterY + 12 + self.meterJitter, 0, gameLogicMult, gameLogicMult, 0, 0)
		end
	else
		self.meterAnimate:draw(self.sprites.meter.sheet, self.meterX, self.meterY + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0)
		love.graphics.setShader(self.shaders.meterChunk)
		for i=1, 5 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX - 122 + 18) + (d * 16), self.meterY + 12 + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0)
		end
	end
	love.graphics.setShader()
end

function June:changeMeter(amount)
	if amount ~= 5 then
		self:setFlicker(self.colors["alt" .. self.colorNum].meterIcon[1][1]*255,self.colors["alt" .. self.colorNum].meterIcon[1][2]*255,self.colors["alt" .. self.colorNum].meterIcon[1][3]*255,3, true) --165,0,255
	end
	if self.meterAmount < 5 then
		self.meterAmount = self.meterAmount + amount
		if self.meterAmount == 5 then
			self.meterJitter = 5
			if self.playerNum == 1 then
				self:executeSound('fullMeter', "sfx", -1)
			else
				self:executeSound('fullMeter', "sfx", 1)
			end
			if self.previousX then
				self.neutralABRequirement = true
			end
			self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(5,4)), frameTime)
			self.meterAnimate.onLoop = function()
				self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(4,4,3,4,4,4,3,60)), frameTime)
				for i=1, 5 do
					self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,4,3,4,4,4,3,60)), frameTime)
				end
			end
		else
			self.meterJitter = 2
		end
	end
end

function June:emptyMeter()
	self.neutralABRequirement = false
	self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(1,1), frameTime)
	self:cascadeMeter(5)
end

function June:fullMeter()
	if self.meterAmount < 5 then
		self.meterAmount = 0
		self:changeMeter(5)
	end
end

function June:cascadeMeter(meterNum)
	if meterNum == 5 then
		-- self:executeSound("tenchiSuper", "sfx")
		for i=1, 5 do
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(3,1)), frameTime)
		end
	end
	self.meterChunkArray[meterNum] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,2,1,2,4,2,1,2)), frameTime)
	self.meterChunkArray[meterNum].onLoop = function()
		self.meterChunkArray[meterNum] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,2,1,2)), frameTime, 'pauseAtEnd')
		if meterNum > 1 then
			self:cascadeMeter(meterNum - 1)
		else
			self.meterAmount = 0
			self.continueMeterJitter = 0
			self.meterJitter = 5
			self:resetMeter()
		end
	end

	if meterNum == 3 then
		self.continueMeterJitter = 2
	end
end

function June:normalHit(attackInfo, delayHurt, hurtboxHit)
	self.moves.teleportRecovery.endWith = nil
	self:_normalHit(attackInfo, delayHurt, hurtboxHit)
end

function June:onTimeout()
	self.enemy.noInput = true
	self.enemy:executeAnimation("chipDeath")
end