Quinn.lua

From Pocket Rumble Wiki
Jump to: navigation, search

formatting not fully complete

quinn.lua[edit]

Quinn = {
	moves = {
		standA = {
			attackbox = {pushback=189 * gameLogicMult, hitStun=12, width=17 * gameLogicMult, height=21 * gameLogicMult, dmg=1, relativeY=12 * gameLogicMult, explosionX = 3 * gameLogicMult, priority = 4};
			{
				frames = {1,2,2,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("standAWolf")
					else
						self:executeSound('lightWhiff', {"sfx", "whiff"})
						if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
						  self.flip = 1
						  self.faceRight = true
						else
						  self.flip = -1
						  self.faceRight = false
						end
					end
				end
			};
			{
				type = "active";
				frames = {3,1,4,1};
			};
			{
				type = "recovery";
				frames = {5,2,6,1,7,2};
			};
		};
		standAWolf = {
			attackbox = {pushback=240 * gameLogicMult, hitStun=12, width=50 * gameLogicMult, height=41 * gameLogicMult, dmg=1, relativeY=-8 * gameLogicMult, explosionX = 3 * gameLogicMult, priority = 4};
			{
				frames = {1,1,2,1,3,3,4,2};
				custom = function(self)
					self:executeSound('heavyWhiff', {"sfx", "whiff"})
					if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
					  self.flip = 1
					  self.faceRight = true
					else
					  self.flip = -1
					  self.faceRight = false
					end
				end
			};
			{
				type = "active";
				frames = {5,3,6,3,7,2,8,2};
				custom = function(self)
					self:executeEffect("standAWolfEffect")
				end
			};
			{
				type = "recovery";
				frames = {9,3,10,3,11,3};
			};
		};
		lowA = {
			attackbox = {customEffect = "hitEffect4", pushback=133 * gameLogicMult, hitStun=16, width=29 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=25 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 4};
			{
				frames = {1,3,2,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("lowAWolf")
					else
						self:executeSound('mediumWhiff', {"sfx", "whiff"})
						if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
						  self.flip = 1
						  self.faceRight = true
						else
						  self.flip = -1
						  self.faceRight = false
						end
					end
				end
			};
			{
				type = "active";
				frames = {3,3,4,1};
				custom = function(self)
					self:executeEffect("lowAEffect")
				end
			};
			{
				type = "recovery";
				frames = {4,3,5,3,6,3};
			};
		};
		lowAWolf = {
			attackType = attackTypes.low;
			attackbox = {customEffect = "hitEffect2",pushback=300 * gameLogicMult, hitStun=13, width=60 * gameLogicMult, height=29 * gameLogicMult, dmg=1, relativeY=12 * gameLogicMult, explosionX = 3 * gameLogicMult, priority = 4};
			{
				frames = {2,3,3,2,4,2};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
					if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
					  self.flip = 1
					  self.faceRight = true
					else
					  self.flip = -1
					  self.faceRight = false
					end
				end
			};
			{
				type = "active";
				frames = {5,3,6,3,7,2,8,2};
				custom = function(self)
					self:executeEffect("lowAWolfEffect")
				end
			};
			{
				type = "recovery";
				frames = {9,2,10,2,11,2};
			};
		};
		standB = {
			attackbox = {customEffect = "hitEffect3", pushUp= 190, pushback=180 * gameLogicMult, hitStun=17, width=30 * gameLogicMult, height=30 * gameLogicMult, relativeY = -6 * gameLogicMult, relativeX = 2 * gameLogicMult, dmg=1, explosionX = -5 * gameLogicMult, explosionY = 5 * gameLogicMult,  priority = 3, ignoreCornerPush = true};
			{ --hitStun=16 pushback=220 width=37
				frames = {2,3,3,2,4,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("standBWolf")
					else
						self:executeSound("jump", {"sfx", "whiff"})
						if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
						  self.flip = 1
						  self.faceRight = true
						else
						  self.flip = -1
						  self.faceRight = false
						end
					end
				end
			};
			{
				frames = {5,1,7,2,8,2};
				custom = function(self)
					self.height = self.height - (11 * gameLogicMult) --(11 * gameLogicMult)
					self.y = self.y - 20 -- -20
					self.throwInvuln = true
					if self.meterAmount == 0 then
						self:changeSpeed(600, 25) --600, 30
					else
						self:changeSpeed(750, 35) --600, 30
					end
					self.ySpeed = -70 -- -100
				end
			};
			{
				type = "active";
				frames = {9,2};
				custom = function(self)
					self.throwInvuln = false
				end
			};
			{
				frames = {10,2};
				custom = function(self)
					self.attackbox.customEffect = "hitEffect"
					self.attackbox.width = self.attackbox.width - 10
					self.attackbox.relativeY = self.attackbox.relativeY + 40
					self.attackbox.explosionX = self.attackbox.explosionX - 20
					self.attackbox.explosionY = self.attackbox.explosionY - 4
				end
			};
			{
				type = "recovery";
				frames = {11,1};
			};
			{
				type = "recovery";
				frames = {12,2,13,2,14,2,15,2,16,2,17,2,18,4,19,2};
				custom = function(self)
					self.height = standHeight
				end
			};
		};
		standBWolf = {
			attackbox = {customEffect = "hitEffect5", pushback=133 * gameLogicMult, hitStun=15, width=24 * gameLogicMult, height=42 * gameLogicMult, dmg=1, relativeY=0 * gameLogicMult, explosionX = 4, explosionY = -4, priority = 2};
			{
				frames = {1,2};
				custom = function(self)
					self:executeSound('rush', {"sfx", "whiff"})
					if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
					  self.flip = 1
					  self.faceRight = true
					else
					  self.flip = -1
					  self.faceRight = false
					end
				end
			};
			{
				frames = {2,2,3,2,4,2,5,2,6,2};
				custom = function(self)
					self:changeWidth(34)
				end
			};
			{
				frames = {7,2,8,1};
				custom = function(self)
					self:changeSpeed(900, 41)
				end
			};
			{
				type = "active";
				frames = {9,3,10,3,11,3,12,3};
			};
			{
				type = "recovery";
				frames = {13,2,14,2,15,2,16,2,17,2,18,2};
				custom = function(self)
					self:changeWidth(19)
				end
			};
		};
		lowB = {
			attackbox = {customEffect = "hitEffect4", pushUp = -300,pushback=100 * gameLogicMult, hitStun=20, width=40 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=27 * gameLogicMult, explosionX = -50, explosionY = -10, priority = 3};
			{
				frames = {1,1,2,2,3,2,4,2}; --1,2,2,2,3,1,4,1,5,1
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("lowBWolf")
					else
						self:executeSound('heavyWhiff', {"sfx", "whiff"})
						--self:changeSpeed(390, 21)
						if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
						  self.flip = 1
						  self.faceRight = true
						else
						  self.flip = -1
						  self.faceRight = false
						end
						if self.meterAmount == 0 then
							self:changeSpeed(550, 31)
						else
							self:changeSpeed(800, 41)
						end
					end
				end
			};
			{
				type = "active";
				frames = {5,2,6,2}; --6,3,7,1
				custom = function(self)
					self:executeEffect("lowBEffect")
					self:executeEffect("lowBEffect2")
				end
			};
			{
				type = "recovery";
				frames = {6,15,7,3,8,3,9,3}; --8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3
			};
		};
		lowBWolf = {
			attackbox = {customEffect = "hitEffect5", pushUp = 200 * gameLogicMult, pushback=133 * gameLogicMult, hitStun=8, width=24 * gameLogicMult, height=42 * gameLogicMult, dmg=1, relativeY=0 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 2};
			{
				frames = {1,2};
				custom = function(self)
					self:executeSound('rush', {"sfx", "whiff"})
					self.jumpAttack = false
					if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) then
					  self.flip = 1
					  self.faceRight = true
					else
					  self.flip = -1
					  self.faceRight = false
					end
				end
			};
			{
				frames = {2,2,3,2,4,2};
				custom = function(self)
					self:changeWidth(34)
				end
			};
			{
				frames = {5,2,6,1};
				custom = function(self)
					self.ySpeed = -1000
					self.gravity = 5000
					self:changeSpeed(900, 41)
				end
				-- this is where he should start launching up/forward
			};
			{
				type = "active";
				frames = {7,3,8,3,9,3,10,3};
				custom = function(self)
					self.ySpeed = -500
					self.gravity = defaultGravity
				end
			};
			{
				type = "recovery";
				frames = {11,2,12,2,13,2,14,2,15,2,16,2};
				custom = function(self)
					self.ySpeed = 0
					self.gravity = defaultGravity
					-- self.jumpAttack = false
					self:changeWidth(19)
				end
				--this is probably where his offset and location should teleport to move his hurtbox 21 PR pixels to the right and 5 down
			};
			{
				spriteName = "jumpUpWolf";
				frames={7,2,8,2,9,2,10,2};
				custom = function(self)
					-- self.move.name = "lowBWolf"
					self:changeLocation(21*gameLogicMult)
				end
			};
			-- endWith = function(self)
			-- 	self:executeAnimation("jumpUpWolf", {
			-- 	  frames={7,2,8,2,9,2,10,2,11,2,12,2};
			-- 	});
			-- 	--this is where in my head I picture your horizontal momentum completely stopping so you just fall straight down
			-- end
			--at this point it could also have more recovery on the ground by just playing a version of the land animation, I guess just if it needs a nerf
		};
		jumpA = {
			attackbox = {customEffect = "hitEffect", attackType = attackTypes.high, pushback=44 * gameLogicMult, hitStun=17, width=30 * gameLogicMult, height=20 * gameLogicMult, dmg=1, relativeX= (-5 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = 4 * gameLogicMult, explosionY = -20, priority = 4, ignoreCornerPush=true};
			{
				frames = {1,2,2,2,3,3,4,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("jumpAWolf")
					else
						self.ignoreCollision = false
						self:executeSound('mediumWhiff', {"sfx", "whiff"})
					end
				end
			};
			{
				type = "active";
				frames = {5,17}; --17
				custom = function(self)
					self:executeEffect("jumpAEffect")
				end
			};
			{
				type = "recovery";
				frames = {6,2,7,2,8,3};
			};
			endWith = function(self)
				self:executeAnimation("jumpUp", {
				  frames={10,2,11,2,12,6};
				});
			end
		};
		jumpAWolf = {
			attackbox = {landingCancel = true,customEffect = "hitEffect4", pushback=133 * gameLogicMult, hitStun=16, width=90 * gameLogicMult, height=31 * gameLogicMult, dmg=1, relativeY=5 * gameLogicMult, relativeX=-50 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 4};
			resetY = false;
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			ignoreCornerPush = true;
			{
				frames = {2,1,3,1,4,2,5,1,6,1};
				custom = function(self)
					self.gravity = defaultGravity
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {8,2,9,2,10,2,11,2,12,2};
				custom = function(self)
					self:executeEffect("jumpAWolfEffect")
				end
			};
			{
				type = "recovery";
				frames = {14,3,15,2,16,2};
			};
			endWith = function(self)
				self:executeAnimation("jumpUpWolf", {
				  frames={10,2,11,2,12,6};
				});
			end
		};
		jumpADash = {
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			ignoreCornerPush = true;
			resetY = false;
			onCornerTouch = function(self)
				if self.y < yFloor - 160 and not self.attackbox.exists then
					if (self.flip == 1 and self.xSpeed > 0) or (self.flip == -1 and self.xSpeed < 0) then
						self.flip = -self.flip
					end
					if self.attacking  and not self.attackbox.exists then
						self.repeatA = false
					end
					self:executeMove("connectedOnWallStart")
					self.runCancel = false
				end
			end;
			attackbox = {attackType = attackTypes.high, pushback=44 * gameLogicMult, hitStun=17, width=30 * gameLogicMult, height=20 * gameLogicMult, dmg=1, relativeX= (-5 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 4, ignoreCornerPush=true, landingCancel = true}; --pushback=66 * gameLogicMult hitstun=23
			{
				spriteName = "jumpA";
				frames = {1,2,2,2,3,3,4,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("jumpADashWolf")
						return
					end
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
					self.ignoreCollision = false
				end
			};
			{
				type = "active";
				frames = {5,17};
				custom = function(self)
					self:executeEffect("jumpAEffect")
				end
			};
			{
				type = "recovery";
				frames = {6,2,7,2,8,3}; --2,4,1,16
			};
			endWith = function(self)
				self:executeAnimation("jumpUp", {
				  frames={10,2,11,2,12,6};
				});
			end
		};
		jumpADashWolf = {
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			ignoreCornerPush = true;
			resetY = false;
			spriteName = "jumpAWolf";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 and not self.attackbox.exists then
					if (self.flip == 1 and self.xSpeed > 0) or (self.flip == -1 and self.xSpeed < 0) then
						self.flip = -self.flip
					end
					if self.attacking  and not self.attackbox.exists then
						self.repeatA = false
					end
					self:executeMove("connectedOnWallStartWolf")
					self.runCancel = false
				end
			end;
			attackbox = {landingCancel = true, customEffect = "hitEffect4", pushback=133 * gameLogicMult, hitStun=16, width=90 * gameLogicMult, height=31 * gameLogicMult, dmg=1, relativeY=5 * gameLogicMult, relativeX=-50 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 4};
			{
				frames = {2,1,3,1,4,2,5,1,6,1};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {8,2,9,2,10,2,11,2,12,2};
				custom = function(self)
					self:executeEffect("jumpAWolfEffect")
				end
			};
			{
				type = "recovery";
				frames = {14,3,15,2,16,2};
			};
			endWith = function(self)
				self:executeAnimation("jumpUpWolf", {
				  frames={10,2,11,2,12,6};
				});
			end
		};
		jumpB = {
			attackbox = {customEffect = "hitEffect2", attackType = attackTypes.high, pushback=44 * gameLogicMult, hitStun=19, width=30 * gameLogicMult, height=30 * gameLogicMult, dmg=1, relativeX= (-35 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23
			{
				frames = {1,3,2,3,3,3,4,2};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("jumpBWolf")
					else
						self.ignoreCollision = false
						self:executeSound('mediumWhiff', {"sfx", "whiff"})
					end
				end
			};
			{
				type = "active";
				frames = {5,3,6,3,7,3,8,3,9,3,10,2};
				custom = function(self)
					self:executeEffect("jumpBEffect")
				end
			};
			{
				type = "recovery";
				frames = {10,1,11,3,12,3}; --2,4,1,16
			};
		};
		jumpBWolf = {
			attackbox = {landingCancel = true,customEffect = "hitEffect5", pushback=133 * gameLogicMult, hitStun=16, width=29 * gameLogicMult, height=42 * gameLogicMult, dmg=1, relativeY=25 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 2};
			resetY = false;
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			{
				frames = {2,2,3,1,4,1,5,3,6,1,7,2,8,1,9,1};
				custom = function(self)
					self.ySpeed = 0
					self.ignoreGravity = true
					self:changeSpeed(0)
					self.gravity = defaultGravity
					self:executeSound('rush', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {10,2,11,2,12,2};
				custom = function(self)
					self.ySpeed = 1000
					self:changeSpeed(1200)
					self.ignoreGravity = false
				end
			};
			{
				type = "recovery";
				frames = {4,3,5,3,6,3};
			};
		};
		jumpBDash = {
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			ignoreCornerPush = true;
			resetY = false;
			onCornerTouch = function(self)
				if self.y < yFloor - 160 and not self.attackbox.exists then
					if (self.flip == 1 and self.xSpeed > 0) or (self.flip == -1 and self.xSpeed < 0) then
						self.flip = -self.flip
					end
					if self.attacking and not self.attackbox.exists then
						self.repeatB = false
					end
					self:executeMove("connectedOnWallStart")
					self.runCancel = false
				end
			end;
			attackbox = {attackType = attackTypes.high, pushback=44 * gameLogicMult, hitStun=19, width=30 * gameLogicMult, height=30 * gameLogicMult, dmg=1, relativeX= (-35 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 3, ignoreCornerPush=true, landingCancel = true}; --pushback=66 * gameLogicMult hitstun=23
			{
				frames = {1,3,2,3,3,3,4,2};
				spriteName = "jumpB";
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("jumpBDashWolf")
					end
					self.ignoreCollision = false
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {5,3,6,3,7,3,8,3,9,3,10,2};
				custom = function(self)
					self:executeEffect("jumpBEffect")
				end
			};
			{
				type = "recovery";
				frames = {10,1,11,3,12,3}; --2,4,1,16
			};
		};
		jumpBDashWolf = {
			attackType = attackTypes.high;
			startWith = "air";
			endWith = "air";
			ignoreCornerPush = true;
			resetY = false;
			spriteName = "jumpBWolf";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 and not self.attackbox.exists then
					if (self.flip == 1 and self.xSpeed > 0) or (self.flip == -1 and self.xSpeed < 0) then
						self.flip = -self.flip
					end
					if self.attacking and not self.attackbox.exists then
						self.repeatB = false
					end
					self:executeMove("connectedOnWallStartWolf")
					self.runCancel = false
				end
			end;
			attackbox = {landingCancel = true, customEffect = "hitEffect5", pushback=133 * gameLogicMult, hitStun=16, width=29 * gameLogicMult, height=42 * gameLogicMult, dmg=1, relativeY=25 * gameLogicMult, explosionX = -10, explosionY = -4, priority = 2};
			{
				frames = {2,2,3,1,4,1,5,3,6,1,7,2,8,1,9,1};
				custom = function(self)
					self.ySpeed = 0
					self.ignoreGravity = true
					self:changeSpeed(0)
					self.gravity = defaultGravity
					self:executeSound('rush', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {10,2,11,2,12,2};
				custom = function(self)
					self.ySpeed = 1000
					self:changeSpeed(1200)
					self.ignoreGravity = false
				end
			};
			{
				type = "recovery";
				frames = {4,3,5,3,6,3};
			};
		};
		downBackB = {
			attackbox = {customEffect = "hitEffect3", pushUp = 250 * gameLogicMult, pushback=60 * gameLogicMult, hitStun=15, width=78 * gameLogicMult, height=55 * gameLogicMult, dmg=1, relativeY= -18 * gameLogicMult,relativeX = (-29 * gameLogicMult) - (19 * gameLogicMult), priority=1, explosionOnEnemyX = true,
			explosionX = -14, explosionY = -10, external = true};
			{ --hitstun=22
				frames = {1,1,2,1,3,2,4,2};
				custom = function(self)
					self:executeSound('antlerAir', {"sfx", "whiff"})
					self.invulnerability = true
				end
			};
			{
				type = "active";
				frames = {5,2,6,8}; --1x5
				custom = function(self)
					self:executeEffect("downBackBEffect")
				end
			};
			{
				type = "recovery";
				frames = {6,17,7,3,8,3}; --18
				custom = function(self)
					self.invulnerability = false
				end
			};
		};
		detransform = {
			resetY = false;
			{
				frames = {1,4,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2};
				custom = function(self)
					self.invulnerability = true
					self.ignoreInvulnOutline = true
					self.requestSS = true
					self:executeSound('tenchiSuperRelease', {"sfx"})
					-- self.health = 1
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self:knockFall()
					self:superStopContinue()
					self.invulnerability = false
					self.ignoreInvulnOutline = false
				end
			}
		};
		downForwardB = {
			attackbox = {customEffect = "hitEffect3", pushUp = 210 * gameLogicMult, pushback=60 * gameLogicMult, hitStun=16, width=25 * gameLogicMult, height=40 * gameLogicMult, dmg=1, relativeY= 0 * gameLogicMult, relativeX = 0, priority=1, explosionOnEnemyX = true,
			explosionX = -16, explosionY = -18, external = true}; --hitStun=11
			{
				frames = {1,2,2,2,3,2,4,2,3,2,5,1}; --1,2,2,2,3,2,4,2,3,2,5,2
				custom = function(self)
				self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {6,3,7,3,8,3};
				custom = function(self)
					if self.meterAmount == 0 then
						self:changeSpeed(150,10)
					else
						self:changeSpeed(350,20)
					end
					self:executeEffect("downForwardBEffect")
				end
			};
			{
				type = "recovery";
				frames = {8,6,9,2};
				custom = function(self)
				end
			};
		};
		downForwardA = {
			attackbox = {pushUp = 150 * gameLogicMult, pushback=50 * gameLogicMult, hitStun=11, width=25 * gameLogicMult, height=12 * gameLogicMult, dmg=1, relativeY= -8 * gameLogicMult,relativeX = 0, priority=2, explosionOnEnemyX = true,
			explosionX = 86, explosionY = -18};
			{
				frames = {1,2,2,2,3,2,4,2,5,2,6,2};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
					-- self:changeSpeed(400,15)
					if self.meterAmount == 0 then
						self:changeSpeed(650,15)
					else
						self:changeSpeed(750,25)
					end
					self:changeHeight(26 * gameLogicMult)
				end
			};
			{
				type = "active";
				frames = {7,2,8,2,9,1};
				custom = function(self)
					self.xSpeed = 0
				end
			};
			-- {
			-- 	frames = {7,4};
			-- 	custom = function(self)
			-- 		self.attackbox.exists = false
			-- 		self:changeSpeed(300,10)
			-- 	end
			-- };
			-- {
			-- 	frames = {4,2};
			-- 	custom = function(self)
			-- 		self.attackbox.exists = true
			-- 	end
			-- };
			{
				type = "recovery";
				frames = {9,1,10,2,11,3,12,1,13,1}; --10
			};
		};
		downBackA = {
			attackbox = {customEffect = "hitEffect2", pushUp = 155* gameLogicMult, pushback=60 * gameLogicMult, hitStun=11, width=30 * gameLogicMult, height=25 * gameLogicMult, dmg=1, relativeY= 0 * gameLogicMult,relativeX = 0, priority=2, explosionOnEnemyX = true,
			explosionX = 0, explosionY = 0}; --195
			{
				frames = {1,2,2,2,3,3};
				custom = function(self)
					self:executeSound('dash', {"sfx", "whiff"})
					self:changeSpeed(-600,-20)
				end
			};
			{
				frames = {4,4};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				custom = function(self)
					if self.meterAmount == 0 then
						self:changeSpeed(1000, 45)
					else
						self:changeSpeed(1200, 55)
					end
				end
			};
			{
				type = "active";
				frames = {5,3,6,3};
				custom = function(self)

				end
			};
			-- {
			-- 	frames = {7,4};
			-- 	custom = function(self)
			-- 		self.attackbox.exists = false
			-- 		self:changeSpeed(300,10)
			-- 	end
			-- };
			-- {
			-- 	frames = {4,2};
			-- 	custom = function(self)
			-- 		self.attackbox.exists = true
			-- 	end
			-- };
			{
				type = "recovery";
				frames = {7,3,8,3,9,5};
				custom = function(self)
					self.attackbox.exists = false
					self:changeSpeed(0)
				end
			};
		};
		neutralAB = {
			frameData = {{type="startup", frameCount=10}, {type="recovery", frameCount=8}};
			{
				frames = {2,4};
				custom = function(self)
					self:executeSound('tenchiSuperRumble', {"sfx", "turd"})
				end
			};
			{
				frames = {3,3,4,3};
			}; -- this is the part that can loop for charging variable amounts
			{
				frames = {5,3,6,3,7,3,8,3,9,3,10,3,11,2,12,2};
				custom = function(self)
					self.invulnerability = true
					self.ignoreInvulnOutline = true
					self.requestSS = true
					-- self.health = 1
				end
			};
			{
				frames = {13,2,14,2,15,2};
				custom = function(self)
					TEsound.stop("turd")
					TEsound.pause("music")
					self:executeSound('tenchiSuperRelease', {"sfx"})
					self:overrideBG()
					TEsound.playLooping(self.sounds.werewolf, {"music", "theme", "wolf"})
				end
			};
			endWith = function(self)
				self:executeAnimation("neutralAB2")
			end
		};
		neutralAB2 = {
			{
				frames = {13,1,14,1,15,1,16,1,1,2,17,1,2,2,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,8};
			};
			{
				frames = {11,4,12,4};
				custom = function(self)
					self:startTrails("super")
					self:superStopContinue()
					self.invulnerability = false
					self.ignoreInvulnOutline = false
					self.neutralABRequirement = false
					self.runSpeed = 500
					self:changeMeter(33)
					self.meterTimer = 7
				end
			};
		};
		-- neutralABOld = {
		-- 	attackbox = {throw = "biteThrow", onlyKnockdown = true, width=20 * gameLogicMult, height=20 * gameLogicMult, dmg=1, relativeX=0, relativeY = (12 * gameLogicMult),
		-- 	relativeY=20 * gameLogicMult, priority = 3};
		-- 	{
		-- 		frames = {1,3,2,3,3,3};
		-- 		custom = function(self)
		-- 			-- self:changeMeter(1)
		-- 		end;
		-- 	};
		-- 	{
		-- 		type = "active";
		-- 		frames = {3,5};
		-- 	};
		-- 	{
		-- 		type = "recovery";
		-- 		frames = {4,4};
		-- 	};
		-- };
		dashA = {
			resetY = false;
			attackbox = {attackType = attackTypes.high, pushUp = 100 * gameLogicMult, pushback=44 * gameLogicMult, hitStun=12, width=40 * gameLogicMult, height=20 * gameLogicMult, dmg=1, relativeX= (-5 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23
			onFloorTouch = function(self)
				self:executeMove("dashFloorRecovery")
			end;
			{
				frames = {4,5,5,5,4,7};
				custom = function(self)
					self.flip = -self.flip
					self.ignoreCollision = false
					self.ySpeed = -300
					self:changeSpeed(-200)
				end
			};
			{
				type = "active";
				frames = {4,5,5,5,4,7};
				custom = function(self)
				end
			};
		};
		dashB = {
			resetY = false;
			onFloorTouch = function(self)
				self:executeMove("dashFloorRecovery")
			end;
			attackbox = {attackType = attackTypes.high, pushUp = -600 * gameLogicMult, pushback=44 * gameLogicMult, hitStun=12, width=30 * gameLogicMult, height=30 * gameLogicMult, dmg=1, relativeX= (-25 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23
			{
				frames = {4,5,5,5,4,7};
				custom = function(self)
					self.flip = -self.flip
					self.ignoreGravity = true
					self.ySpeed = 0
				end
			};
			{
				type = "active";
				frames = {4,5,5,5,4,7};
				custom = function(self)
					self.ignoreGravity = false
					self.ySpeed = 1000
				end
			};
		};
		dashFloorRecovery = {
			type = "recovery";
			frames = {4,5,5,5,4,7};
			custom = function(self)
				self.ignoreCollision = false
			end
		};
		diveA = {
			resetY = false;
			special = true;
			-- startWith = "air";
			--self.attackbox.attackType == attackTypes.low
			attackbox = {attackType = attackTypes.high, pushback=44 * gameLogicMult, hitStun=20, width=14 * gameLogicMult, height=30 * gameLogicMult, dmg=1, relativeX= (-16 * gameLogicMult),
			relativeY=22 * gameLogicMult, explosionX = -4 * gameLogicMult,explosionY = 20, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23
			{
				type = "active";
				frames = {4,5,5,5,4,7};
				custom = function(self)
				end
			};
			-- {
			-- 	type = "recovery";
			-- 	frames = {5,5,4,1};
			-- };
		};
		diveB = {
			resetY = false;
			special = true;
			-- startWith = "air";
			attackbox = {attackType = attackTypes.high, pushback=145 * gameLogicMult, hitStun=14, width=29 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=22 * gameLogicMult,
			explosionX = -10 + (5 * gameLogicMult), priority = 4, ignoreCornerPush=true}; --hitstun=16,pushback=145
			{
				type = "active";
				frames = {4,5,5,5,4,7};
				custom = function(self)
				end
			};
			-- {
			-- 	type = "recovery";
			-- 	frames = {5,5,4,1};
			-- };
		};
		biteThrow = {
			enemyFrames = {
				{1,54/3,-24/3}, --f1
				{1,33/3,-24/3}, --f2
				{1,39/3,-24/3}, --f3
				{1,39/3,-24/3}, --f4
				{1,39/3,-24/3}, --f5
				{2,54/3,-42/3}, --f6
				{2,57/3,-45/3}, --f7
				{0,0,0}, --f8
				{0,48/3,-33/3}, --f9
				{0,39/3,-33/3}, --f10
				{0,48/3,-30/3}, --f11
				{1,39/3,-24/3}, --f12
				{1,39/3, -24/3}, --f13
				{1,54/3,-39/3}, --f14
				{1,54/3,-39/3}, --f15
				{0,0,0}, --f16
				{0,0,0}, --f17
				{0,0,0}, --f18
				{0,0,0}, --f19
				{0,0,0}, --f20
				{1,39/3,-24/3}, --f21
				{1,24/3,-27/3}, --f22
				{4,-39/3,-60/3}, --f23
			};
			{
				frames = {21,2,22,4,23,4};
				custom = function(self)
					self:changeMeter(1)
				end
			}; --5,2,6,4 --1,4,2,4,3,4,4,2,5,1,6,1
			{
				frames = {27,1}; --8,4,9,4,10,4,11,4
				custom = function(self)
					self.enemy:changeSpeed(-400)
					self.enemy.ySpeed = -200
					self.enemy.y = self.enemy.y + 30
					self.enemy.ignoreGravity = false
					self.ignoreCollision = false
					self.enemy:knockFall()
					self.enemy.animation:gotoFrame(5)
					self.faceRight = not self.faceRight
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
			{
				frames = {10,21}; --13
				custom = function(self)
					self.enemy:airHurt()
				end
			};
		};
		-- downBackA = {
		-- 	{
		-- 		frames = {1,10};
		-- 	};
		-- 	{
		-- 		frames = {1,1};
		-- 		custom = function(self)
		-- 			self:executeMove("dashJumpBack")
		-- 			-- self:changeSpeed(-1000)
		-- 			-- self.ySpeed = -320 * gameLogicMult
		-- 			-- self.gravity = 1300 * gameLogicMult
		-- 		end
		-- 	};
		-- };
		dashBack = {
			frameData = Template:Type="startup", frameCount=41;
			{
				type = "recovery";
				frames = {1,5};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashBackWolf")
						return
					end
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self.canJump = false
					self.throwInvuln = true
					self:executeMove("dashJumpBack")
					self:executeSound('jump', {"sfx"})
				end
			};
		};
		dashBackWolf = {
			frameData = Template:Type="startup", frameCount=41;
			{
				type = "recovery";
				frames = {1,5};
			};
			{
				frames = {1,1};
				custom = function(self)
					self.canJump = false
					self.throwInvuln = true
					self:executeMove("dashJumpBackWolf")
					self:executeSound('jump', {"sfx"})
				end
			};
		};
		dashForward = {
			frameData = Template:Type="startup", frameCount=41;
			{
				type = "recovery";
				frames = {1,5};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashForwardWolf")
					end
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self.canJump = false
					self.throwInvuln = true
					self:executeMove("dashJumpForward")
					self:executeSound('jump', {"sfx"})
				end
			};
		};
		dashForwardWolf = {
			frameData = Template:Type="startup", frameCount=41;
			{
				type = "recovery";
				frames = {1,5};
			};
			{
				frames = {1,1};
				custom = function(self)
					self.canJump = false
					self.throwInvuln = true
					self:executeMove("dashJumpForward")
					self:executeSound('jump', {"sfx"})
				end
			};
		};
		dashJumpBack = {
			frameData = "nil";
			spriteName = "dashBack";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 then
					-- self.image == self.sprites.jumpUp.sheet then
					-- 	self.flip = -self.flip
					-- end
					self:executeMove("connectedOnWallStart")
					self.runCancel = false
				end
			end;
			{
				type = "recovery";
				frames = {2,3,3,3};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashJumpBackWolf")
						return
					end
					if self.meterAmount == 0 then
						self:changeSpeed(-1100, -40)
					else
						self:changeSpeed(-1600, -50)
						-- self.invulnerability = true
					end
					self.ySpeed = -320 * gameLogicMult
					self.gravity = 1300 * gameLogicMult
					self.ignoreCollision = true
				end
			};
			{
				frames = {4,2,5,2,6,2,7,2,8,2,9,2};
				custom = function(self)
					self.runCancel = true
				end
			};
			{
				spriteName = "jumpUp";
				frames = {7,2,8,2,9,2,10,2,11,2};
				custom = function(self)
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUp";
				frames = {12,2,13,2,14,4,15,2};
				custom = function(self)
					self.runCancel = false
					self.ignoreCollision = false
					self.throwInvuln = false
				end
			};
		};
		dashJumpBackWolf = {
			frameData = "nil";
			spriteName = "dashBackWolf";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 then
					-- self.image == self.sprites.jumpUp.sheet then
					-- 	self.flip = -self.flip
					-- end
					self:executeMove("connectedOnWallStartWolf")
					self.runCancel = false
				end
			end;
			{
				type = "recovery";
				frames = {2,3,3,3};
				custom = function(self)
					if self.meterAmount == 0 then
						self:changeSpeed(-1100, -40)
					else
						self:changeSpeed(-1600, -40)
						-- self.invulnerability = true
					end
					self.ySpeed = -320 * gameLogicMult
					self.gravity = 1300 * gameLogicMult
					self.ignoreCollision = true
					self.height = 31 * gameLogicMult
				end
			};
			{
				frames = {4,2,5,2,6,2,7,2,8,2,9,2};
				custom = function(self)
					self.runCancel = true
				end
			};
			{
				spriteName = "jumpUpWolf";
				frames = {7,2,8,2,9,2,10,2,11,2};
				custom = function(self)
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUpWolf";
				frames = {12,2,13,2,14,4,15,2};
				custom = function(self)
					self.runCancel = false
					self.ignoreCollision = false
					self.throwInvuln = false
				end
			};
		};
		dashJumpOffWall  = {
			resetY = false;
			onFloorTouch = function(self)
				self:executeAnimation("idle")
				self.noInput = false
				self.ignoreCollision = false
				self.attacking = false
				if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) and (self.noInput == false or self.landingTimer > 0) then
				  self.flip = 1
				  self.faceRight = true
				elseif (self.noInput == false or self.landingTimer > 0) then
				  self.flip = -1
				  self.faceRight = false
				end
			end;
			spriteName = "jumpUp";
			{
				type = "recovery";
				frames = {9,3,10,3,11,3,12,8};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashJumpOffWallWolf")
						return
					end
					self.ignoreGravity = false
				end
			};
			{
				frames = {12,3};
				custom = function(self)
					-- self.move.name = "notDashJumpOffWall"
				end
			};
		};
		dashJumpOffWallWolf  = {
			resetY = false;
			onFloorTouch = function(self)
				self:executeAnimation("idle")
				self.noInput = false
				self.ignoreCollision = false
				self.attacking = false
				if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) and (self.noInput == false or self.landingTimer > 0) then
				  self.flip = 1
				  self.faceRight = true
				elseif (self.noInput == false or self.landingTimer > 0) then
				  self.flip = -1
				  self.faceRight = false
				end
			end;
			spriteName = "jumpUpWolf";
			{
				type = "recovery";
				frames = {9,3,10,3,11,3,12,8};
				custom = function(self)
					self.move.name = "dashJumpOffWall"
					self.ignoreGravity = false
				end
			};
			{
				frames = {12,3};
				custom = function(self)
					-- self.move.name = "notDashJumpOffWall"
				end
			};
		};
		dashJumpOffWallFast = {
			resetY = false;
			onFloorTouch = function(self)
				self:executeAnimation("idle")
				self.noInput = false
				self.attacking = false
				self.ignoreCollision = false
				if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) and (self.noInput == false or self.landingTimer > 0) then
				  self.flip = 1
				  self.faceRight = true
				elseif (self.noInput == false or self.landingTimer > 0) then
				  self.flip = -1
				  self.faceRight = false
				end
			end;
			spriteName = "dashForward";
			{
				type = "recovery";
				frames = {3,1};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashJumpOffWallFastWolf")
					end
					self.ignoreGravity = false
				end;
			};
			{
				frames = {3,2,4,3,5,3,6,3,7,3,8,2};
				custom = function(self)
					self.flip = -self.flip
				end
			};
			{
				frames = {8,1,9,2};
				custom = function(self)
					-- self.move.name = "notDashJumpOffWall"
				end
			};
		};
		dashJumpOffWallFastWolf = {
			resetY = false;
			onFloorTouch = function(self)
				self:executeAnimation("idle")
				self.noInput = false
				self.attacking = false
				self.ignoreCollision = false
				if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) and (self.noInput == false or self.landingTimer > 0) then
				  self.flip = 1
				  self.faceRight = true
				elseif (self.noInput == false or self.landingTimer > 0) then
				  self.flip = -1
				  self.faceRight = false
				end
			end;
			spriteName = "dashForwardWolf";
			{
				type = "recovery";
				frames = {3,1};
				custom = function(self)
					self.move.name = "dashJumpOffWallFast"
					self.ignoreGravity = false
				end;
			};
			{
				frames = {3,2,4,3,5,3,6,3,7,3,8,2};
				custom = function(self)
					self.flip = -self.flip
				end
			};
			{
				frames = {8,1,9,2};
				custom = function(self)
					-- self.move.name = "notDashJumpOffWall"
				end
			};
		};
		dashJumpForward = {
			frameData = "nil";
			spriteName = "dashForward";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 then
					if self.image == self.sprites.jumpUp.sheet then
						self.flip = -self.flip
					end
					self:executeMove("connectedOnWallStart")
					self.runCancel = false
				end
			end;
			{
				type = "recovery";
				frames = {2,3,3,3};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("dashJumpForwardWolf")
						return
					end
					if self.meterAmount == 0 then
						self:changeSpeed(1100, 40)
					else
						self:changeSpeed(1600, 50)
						-- self.invulnerability = true
					end

					self.ySpeed = -320 * gameLogicMult
					self.gravity = 1300 * gameLogicMult
					self.flip = -self.flip
					self.ignoreCollision = true
				end
			};
			{
				frames = {4,2,5,2,6,2,7,2,8,2,9,2};
				custom = function(self)
					self.runCancel = true
				end
			};
			{
				spriteName = "jumpUp";
				frames = {7,2,8,2,9,2};
				custom = function(self)
					self.flip = -self.flip
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUp";
				frames = {10,2,11,2};
				custom = function(self)
					self.runCancel = false
					self.throwInvuln = false
					self.ignoreCollision = false
					-- self.flip = -self.flip
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUp";
				frames = {12,2,13,2,14,4,15,2};
				custom = function(self)
				end
			};
		};
		dashJumpForwardWolf = {
			frameData = "nil";
			spriteName = "dashForwardWolf";
			onCornerTouch = function(self)
				if self.y < yFloor - 160 then
					if self.image == self.sprites.jumpUp.sheet then
						self.flip = -self.flip
					end
					self:executeMove("connectedOnWallStartWolf")
					self.runCancel = false
				end
			end;
			{
				type = "recovery";
				frames = {2,3,3,3};
				custom = function(self)
					if self.meterAmount == 0 then
						self:changeSpeed(1100, 40)
					else
						self:changeSpeed(1600, 40)
						-- self.invulnerability = true
					end
					self.height = 31 * gameLogicMult
					self.ySpeed = -320 * gameLogicMult
					self.gravity = 1300 * gameLogicMult
					self.flip = -self.flip
					self.ignoreCollision = true
				end
			};
			{
				frames = {4,2,5,2,6,2,7,2,8,2,9,2};
				custom = function(self)
					self.runCancel = true
				end
			};
			{
				spriteName = "jumpUpWolf";
				frames = {7,2,8,2,9,2};
				custom = function(self)
					self.flip = -self.flip
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUpWolf";
				frames = {10,2,11,2};
				custom = function(self)
					self.runCancel = false
					self.throwInvuln = false
					self.ignoreCollision = false
					-- self.flip = -self.flip
					-- self.ignoreGravity = true
					-- self:executeMove("connectedOnWall")
				end
			};
			{
				spriteName = "jumpUpWolf";
				frames = {12,2,13,2,14,4,15,2};
				custom = function(self)
				end
			};
		};
		connectedOnWallStart = {
			resetY = false;
			{
				spriteName = "wallCling";
				type = "recovery";
				frames = {1,3};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("connectedOnWallStartWolf")
					end
					self.landingCancel = false
					self.xSpeed = 0
					self.ySpeed = 0
					self.ignoreGravity = true
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self:executeMove("connectedOnWall")
				end
			};
		};
		connectedOnWallStartWolf = {
			resetY = false;
			{
				spriteName = "wallClingWolf";
				type = "recovery";
				frames = {1,3};
				custom = function(self)
					self.landingCancel = false
					self.xSpeed = 0
					self.ySpeed = 0
					self.ignoreGravity = true
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self:executeMove("connectedOnWall")
				end
			};
		};
		connectedOnWall = {
			spriteName = "wallCling";
			resetY = false;
			{
				type = "recovery";
				frames = {1,40};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("connectedOnWallWolf")
						return
					end
					self:whiteBar()
					self.xSpeed = 0
					self.ySpeed = 0
					self.ignoreGravity = true
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self:executeMove("fallFromWall")
					self.ignoreGravity = false
				end
			};
		};
		connectedOnWallWolf = {
			spriteName = "wallClingWolf";
			resetY = false;
			{
				type = "recovery";
				frames = {1,40};
				custom = function(self)
					self.move.name = "connectedOnWall";
					self:whiteBar()
					self.xSpeed = 0
					self.ySpeed = 0
					self.ignoreGravity = true
				end
			};
			{
				frames = {1,1};
				custom = function(self)
					self:executeMove("fallFromWall")
					self.ignoreGravity = false
				end
			};
		};
		fallFromWall = {
			resetY = false;
			{
				spriteName = "jumpUp";
				frames = {9,3,10,3,11,3,12,6};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeMove("fallFromWallWolf")
					end
				end
			};
		};
		fallFromWallWolf = {
			resetY = false;
			{
				spriteName = "jumpUpWolf";
				frames = {9,3,10,3,11,3,12,6};
			};
		};
	};
	throw = {
		enemyFrames = {
			{5,34 +21,5}, --f1
			{6,28 +21,5}, --f2
			{7,26 +21,4}, --f3
			{8,27 +21,-2}, --f4
			{8,27 +21,-5}, --f5
			{8,28 +21,-6}, --f6
			{8,28 +21,-6}, --f7
			{8,28 +21,-6}, --f8
			{10,27 +21,-9}, --f9
			{10,27 +21,-9}, --f10
			{9,28 +21,-7}, --f11
			{8,28 +21,-6}, --f12
			{8,28 +21,-6}, --f13
			{8,28 +21,-6}, --f14
			{8,28 +21,-6}, --f15
			{10,29 +21,-8}, --f16
			{10,32 +21,-13}, --f17
			{0,0,0}, --f18
			{0,0,0}, --f19
			{0,0,0}, --f20
			{0,0,0}, --f21
			{0,0,0}, --f22
			{0,0,0}, --f23
			{8,50,-7}, --f24
			{8,50,-8}, --f25
			{8,43,-9}, --f26
			{8,34,-11}, --f27
			{4,28,-16}, --f28
			{4,19,-18}, --f29
			{0,0,0}, --f30 --16,-27,9
			{0,0,0}, --f31
			{0,0,0}, --f32
			{0,0,0}, --f33
			{0,0,0}, --f34
			{0,0,0}, --f35
			{0,0,0}, --f36
		};
		start = {
			{frames = {1,3,2,3,3,3,4,3,5,3,6,2,7,10,8,2,9,2}}; --5,2,6,4 --1,4,2,4,3,4,4,2,5,1,6,1
			{
				frames = {10,1,11,3}; --8,4,9,4,10,4,11,4
				custom = function(self)
					self:executeSound('heavyAttack', "sfx")
					self:throwHitstop(6, 38, 16)
					cameraJitterX = 2
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
				end
			};
		};
		forward = {
			{
				frames = {12,3,13,3,14,3,15,3,16,2,17,2}; --11,4,13,2,14,2,15,2
			};
			{
				frames = {18,12,19,3,20,3,21,3,22,3,23,3};
				custom = function(self)
					self:executeSound('special', "sfx")
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:throwHitstop(8, 38, 16)
					cameraJitterX = 2
					self.enemy:changeLocation(-33)
					self.enemy:changeSpeed(300)
					self.enemy.ySpeed = -250
					self.enemy.y = self.enemy.y
					self.enemy.ignoreGravity = false
					self.enemy:knockFall()
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
		};
		backward = {
			{
				frames = {24,3,25,3,26,3,27,3,28,3,29,3}; --21,4,22,4,23,4
			};
			{
				frames = {30,3,31,3,32,3,33,12,34,3,35,3,36,3};
				custom = function(self)
					self:changeLocation(4)
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound('grab', "sfx")
					self.enemy:changeLocation(-125)
					self.enemy:changeSpeed(-400)
					self.enemy.ySpeed = -200
					self.enemy.y = self.enemy.y + 20
					self.enemy.ignoreGravity = false
					self.ignoreCollision = false
					self.enemy:knockFall()
					self.enemy.ignoreCollision = true
					self.enemy.animation:gotoFrame(5)
					self.faceRight = not self.faceRight
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
			{
				custom = function(self)
					self:changeLocation(-4)
					self.enemy.ignoreCollision = false
				end
			};
		};
	};
	animations = {
		idle = {
			frames = {2,4,3,7,4,4,5,4,6,4,7,4,8,4,9,7,10,4,11,4,12,4,1,4};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("idleWolf")
				end
			end
		};
		idleWolf = {
			frames = {1,4,2,5,3,4,4,4,5,4,6,6,7,4,8,5,9,4,10,4,11,4,12,6};
			custom = function(self)
				self.move.name = "idle";
			end
		};
		jumpForward = {
			endWith = "nothing";
			frames={2,3,3,4,4,1,5,2,6,2,7,2,8,1,9,2,10,1,11,2,12,1,13,2,14,3,15,20};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("jumpForwardWolf")
				end
			end
		};
		jumpBack = {
			spriteName = "jumpForward";
			endWith = "nothing";
			frames={15,3,14,4,13,2,12,2,11,2,10,1,9,2,8,1,7,2,6,1,5,2,4,1,3,3,2,20};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("jumpBackWolf")
				end
			end
		};
		jumpUp = {
			endWith = "nothing";
			frames = {2,7,3,3,4,2,5,2,6,2,7,8,8,2,9,2,10,2,11,2,12,6};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("jumpUpWolf")
				end
			end
		};
		jumpUpWolf = {
			endWith = "nothing";
			frames = {2,7,3,3,4,2,5,2,6,2,7,8,8,2,9,2,10,2,11,2,12,6};
		};
		jumpForwardWolf = {
			spriteName = "jumpUpWolf";
			endWith = "nothing";
			frames = {2,7,3,3,4,2,5,2,6,2,7,8,8,2,9,2,10,2,11,2,12,6};
		};
		jumpBackWolf = {
			spriteName = "jumpUpWolf";
			endWith = "nothing";
			frames = {2,7,3,3,4,2,5,2,6,2,7,8,8,2,9,2,10,2,11,2,12,6};
		};
		landWolf = {
			spriteName = "jumpUpWolf";
			frames = {13,3,14,5,15,3};
		};
		land = {
			spriteName = "jumpForward";
			frames = {16,3,17,5,18,3};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("landWolf")
				end
			end
		};
		turn = {
			frames = {1,4};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("turnWolf")
				end
			end
		};
		turnWolf = {
			frames = {1,4};
			custom = function(self)
				self.move.name = "turn";
			end
		};
		crouchTurn = {
			frames = {1,4};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("crouchTurnWolf")
				end
			end
		};
		crouchTurnWolf = {
			frames = {1,4};
		};
		walkForward = {
			{
				frames = {1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,5,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,5};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeAnimation("walkForwardWolf")
					end
				end
			};
		};
		walkForwardWolf = {
			{
				frames = {2,3};
				custom = function(self)
					self.move.name = "walkForward";
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					self:executeSound("footstep", "sfx")
				end
			};
			{
				frames = {5,3,6,3,7,3,8,3,9,3,10,3,11,3};
				custom = function(self)
					self:executeSound("footstep", "sfx")
				end
			};
		};
		walkBack = {
			spriteName = "walkForward";
			{
				frames = {23,2,22,2,21,2,20,2,19,2,18,2,17,2,16,2,15,2,14,2,13,2,12,5,11,2,10,2,9,2,8,2,7,2,6,2,5,2,4,2,3,2,2,2,1,2,24,5};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeAnimation("walkBackWolf")
					end
				end
			};
		};
		walkBackWolf = {
			{
				frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3};
				custom = function(self)
					self.move.name = "walkBack";
				end
			};
		};
		crouch = {
			{
				frames = {1,3,2,32,3,3,4,3,5,3,6,3,7,28,8,3,9,3,10,3};
				custom = function(self)
					if self.meterAmount > 0 then
						self:executeAnimation("crouchWolf")
					end
				end
			};
		};
		crouchWolf = {
			{
				frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3};
			};
		};
		crouchTransition = {
			frames={1,2};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeAnimation("crouchTransitionWolf")
				end
			end
		};
		standTransition = {
			spriteName = "crouchTransition";
			frames={1,2};
			custom = function(self)
				self.yOffset = -10
				if self.meterAmount > 0 then
					self:executeAnimation("standTransitionWolf")
				end
			end
		};
		crouchTransitionWolf = {
			frames={1,2};
		};
		standTransitionWolf = {
			spriteName = "crouchTransitionWolf";
			frames={1,2};
			custom = function(self)
				self.move.name = "standTransition";
			end
		};
		preBlock={
			spriteName="blockStand";
			endWith = "nothing";
			frames = {1,1,2,1,3,1};
		};
		preBlockReverse={
			spriteName="blockStand";
			frames = {2,1,1,1};
		};
		preBlockCrouch={
			endWith = "nothing";
			spriteName="blockCrouch";
			frames={1,2,2,1};
		};
		preBlockCrouchReverse={
			spriteName="blockCrouch";
			frames={1,2};
		};
		airHurt = {
			endWith = "nothing";
			{
				frames = {1,1,2,3};
			};
			{
				spriteName = "jumpUp";
				frames = {4,2,5,2,6,2,7,8,8,2,9,2,10,2,11,2,12,6};
			};
		};
		knockdown = {
			endWith = "nothing";
			frames = {1,3,2,3,3,3,4,3,5,3,6,3};
		};
		impact = {
			spriteName = "knockdown";
			frames = {7,3}
		};
		startGroundBounce = {
			spriteName = "knockdown";
			frames = {8,3,9,3,10,7}
		};
		stopGroundBounce = {
			spriteName = "knockdown";
			frames = {11,2,12,10}
		};
		wakeup = {
			spriteName = "knockdown";
			frames = {13,5,14,5}
		};
		death = {
			spriteName = "knockdown";
			endWith = "nothing";
			frames = {12,1}
		};
		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
			};
		};
		boo = {
			frames = {1,16,2,2,3,4,4,2,5,2,6,2,7,1,8,6,9,7,10,20,11,5,12,2,13,4,15,2,16,2};
			endWith = function(self)
				self:executeAnimation("booLoop")
			end
		};
		booLoop = {
			spriteName = "boo";
			frames = {17,42,18,7,19,6,20,7,21,6,22,7,23,6,24,7,25,6,26,7,27,15};
		};
		yay = {
			frames = {28,16,1,3,2,6,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26,4,27,4};
			endWith = function(self)
				self:executeAnimation("yayLoop")
			end
		};
		yayLoop = {
			frames = {1,4,2,4,3,4,4,4,5,4,6,4,7,4};
		};
		win = {
			spriteName = "yay";
			frames = {1,3,2,6,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26,4,27,4};
			custom = function(self)
				if self.meterAmount > 0 then
					self:executeMove("winWolf")
				end
			end;
			endWith = function(self)
				self:executeAnimation("yayLoop")
			end
		};
		winWolf = {
			{frames = {1,6,2,3,3,3,4,3,5,3,6,3,7,3,6,3,7,3,6,3,7,3,6,3,8,2,9,2,10,2};};
			endWith = function(self)
				self:executeAnimation("winWolf2")
			end
		};
		winWolf2 = {
			{
				frames = {1,2,2,2,3,2,4,2,5,2,6,12,7,4,8,4,9,4,10,4};
				custom = function(self)
					self:executeSound('tenchiSuperRelease', {"sfx"})
					self:meterTimeEnd(true)
				end
			};
			endWith = function(self)
				self:executeAnimation("yayLoop")
			end
		};
	};
	effects = {
		hitEffect = {
			frames = {1,2,2,2,3,2,4,2,5,1};
		};
		hitEffect2 = {
			layer = "hit";
			frames = {1,2,2,2,3,2,4,2,5,1};
		};
		hitEffect3 = {
			layer = "hit";
			frames = {1,2,2,2,3,2,4,2,5,1};
		};
		hitEffect4 = {
			layer = "hit";
			frames = {1,2,2,2,3,2,4,2,5,1};
		};
		hitEffect5 = {
			layer = "hit";
			frames = {1,3,2,3,3,2,4,2,2,1};
		};
		downBackBEffect = {
			frames = {3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2};
			relativeX = -28 * gameLogicMult;
			relativeY = -26 * gameLogicMult;
			followPlayer = true;
			ignoreParry = true;
		};
		lowBEffect = {
			frames = {1,3,2,2,3,2,4,2};
			relativeX = -42 * gameLogicMult;
			relativeY = 2 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		lowBEffect2 = {
			frames = {1,3,2,2,3,2,4,2};
			relativeX = -42 * gameLogicMult;
			relativeY = 2 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			layer = "bottom";
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		lowAEffect = {
			frames = {1,3};
			relativeX = -13 * gameLogicMult;
			relativeY = -13 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		downForwardBEffect = {
			frames = {1,2,2,2,3,3,4,2};
			relativeX = -18 * gameLogicMult;
			relativeY = -1 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		jumpBEffect = {
			frames = {1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2};
			relativeX = -18 * gameLogicMult;
			relativeY = 8 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		jumpAEffect = {
			frames = {1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2};
			relativeX = -4 * gameLogicMult;
			relativeY = 0 * gameLogicMult;
			followPlayer = true;
			destroyWhenPlayerHurt = true;
			destroyWhenPlayerCancel = true;
			ignoreHitstop = true;
		};
		nameplateBackground = {
			frames = {1,5,2,5,3,5,4,5,5,5,6,5};
			endWith = "loop";
		};
		standAWolfEffect = {
			frames = {1,2,2,2,3,2,4,2,5,2,6,1,7,1};
			relativeX = 1 * gameLogicMult;
			relativeY = -23 * gameLogicMult;
			followPlayer = true;
			ignoreParry = true;
		};
		lowAWolfEffect = {
			frames = {1,2,2,2,3,2,4,2,5,2,6,1,7,1};
			relativeX = 15 * gameLogicMult;
			relativeY = 6 * gameLogicMult;
			followPlayer = true;
			ignoreParry = true;
		};
		jumpAWolfEffect = {
			frames = {1,2,2,2,3,2,4,2,5,2,6,1,7,1};
			relativeX = -39 * gameLogicMult;
			relativeY = -19 * gameLogicMult;
			followPlayer = true;
			ignoreParry = true;
		};
	};

	nameplate = {
		endWith = "nothing";
		frames = {1,1,2,1,3,3,4,1,5,1,6,3,7,1,8,1,9,3,10,1,11,1,12,3,13,1,14,1,15,6,16,1,17,1,18,3,19,1,20,1,21,3,22,1,23,1,24,6,25,1,26,1,27,6,28,1,29,1,30,3,31,1,32,1,33,3,34,1,35,1,36,6,37,1,38,1,39,3,40,1,41,1,42,3,43,3,44,3,45,6}; --1,5,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2}
		custom = function(self, host)
				if host.player1 == true then
					host:executeSound("nameplate", {"sfx", "nameplate1"}, -1)
				else
					host:executeSound("nameplate", {"sfx", "nameplate2"}, 1)
				end
			end;
	};
	colors = {
		default = {
			sprite = {
					{130,198,0}; --pants green
					{0,255,0}; --eye glow green

					{59,25,55}; --claw outline
					{97,77,121}; --claw dark shadow
					{149,137,176}; --claw medium shadow
					{213,191,248}; --claw lightest

					{153,85,193}; --trails main
					{255,0,255}; --trails middle
					{153,0,193}; --trails dithered

					{204,170,240}; --werewolf lighter
					{146,115,191}; --werewolf darker
				};
				effects = {
					{153,85,193}; --trails main
					{255,0,255}; --trails middle
					{153,0,193}; --trails dithered
				};
				meterIcon = {
					{234,212,243}; --lighter color
					{153,85,193}; --darker color
				};
				hit = {0,255,0};
			--generalAssets
				dust = {0,255,0};
				block = {0,255,0};

				mainUI = {0, 113, 0};
				health = {0,255,0};
				meterChunk = {
					--meterOne
					{126,11,176}; --darkGreen
					{190,0,255}; --mediumGreen
					{185,96,255}; --lightestGreen

					--meterTwo
					{180,53,255}; --darkGreen
					{196,101,255}; --mediumGreen
					{215,142,255}; --lightestGreen
			};
				trailSuper = {
				{153,0,193}; --black
				{255,255,255}; --white
				{204,142,255}; --other
				};
		};
		alt1 = {
			sprite = {
					{217,64,64}; --pants green
					{255,0,0}; --eye glow green

					{25,43,59}; --claw outline
					{77,87,121}; --claw dark shadow
					{137,161,176}; --claw medium shadow
					{198,191,255}; --claw lightest

					{0,99,231}; --trails main
					{59,179,255}; --trails middle
					{10,69,195}; --trails dithered

					{170,216,240}; --werewolf lighter
					{115,146,191}; --werewolf darker
				};
				effects = {
					{0,99,231}; --trails main
					{59,179,255}; --trails middle
					{10,69,195}; --trails dithered
				};
				meterIcon = {
					{200,232,255}; --lighter color
					{0,99,231}; --darker color
				};
				hit = {255,0,0};
			--generalAssets
				dust = {255,64,64};
				-- trailSuper = {0, 200, 255};
				trailSuper = {
				{0,99,231}; --black
				{255,255,255}; --white
				{67,214,247}; --other
				};
				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
				};
		};
		alt2 = {
			sprite = {
					{245,115,2}; --pants green
					{255,132,0}; --eye glow green

					{63,63,0}; --claw outline
					{127,135,63}; --claw dark shadow
					{211,205,101}; --claw medium shadow
					{248,245,191}; --claw lightest

					{255,223,24}; --trails main
					{255,255,0}; --trails middle
					{215,191,0}; --trails dithered

					{236,240,170}; --werewolf lighter
					{208,192,44}; --werewolf darker
				};
				effects = {
					{255,223,24}; --trails main
					{255,255,0}; --trails middle
					{215,191,0}; --trails dithered
				};
				meterIcon = {
					{255,254,138}; --lighter color
					{232,198,0}; --darker color
				};
				hit = {255,132,0};
			--generalAssets
				dust = {255,164,42};
				mainUI = {187, 72, 0}; --UIcolor
				health = {255,102,7};
				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
				};

				trailSuper = {
					{215,191,0}; --black
					{255,255,255}; --white
					{255,255,0}; --other
				};
		};
		alt3 = {
			sprite = {
					{223,216,4}; --pants green
					{255,255,0}; --eye glow green

					{69,11,43}; --claw outline
					{140,79,85}; --claw dark shadow
					{246,162,185}; --claw medium shadow
					{245,203,248}; --claw lightest

					{255,30,106}; --trails main
					{255,68,167}; --trails middle
					{226,33,99}; --trails dithered

					{240,172,170}; --werewolf lighter
					{224,82,164}; --werewolf darker
				};
				effects = {
					{255,30,106}; --trails main
					{255,68,167}; --trails middle
					{226,33,99}; --trails dithered
				};
				meterIcon = {
					{255,193,223}; --lighter color
					{255,30,106}; --darker color
				};
				hit = {255,255,0};
			--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,132,235}; --other
				};
		};
		alt5 = {
			sprite = {
					{128,183,192}; --pants green
					{0,216,255}; --eye glow green

					{81,0,0}; --claw outline
					{165,75,67}; --claw dark shadow
					{233,138,138}; --claw medium shadow
					{243,207,207}; --claw lightest

					{239,73,79}; --trails main
					{255,0,0}; --trails middle
					{218,8,0}; --trails dithered

					{240,188,170}; --werewolf lighter
					{221,86,85}; --werewolf darker
				};
				effects = {
					{239,73,79}; --trails main
					{255,0,0}; --trails middle
					{218,8,0}; --trails dithered
				};
				meterIcon = {
					{255,200,200}; --lighter color
					{255,0,0}; --darker color
				};
				hit = {0,216,255};
			--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,121,121}; --hand trails
				};
		};
		alt6 = {
			sprite = {
					{104,104,104}; --pants green
					{155,155,167}; --eye glow green

					{92,48,89}; --claw outline
					{130,76,157}; --claw dark shadow
					{184,126,201}; --claw medium shadow
					{237,202,234}; --claw lightest

					{240,128,240}; --trails main
					{191,87,199}; --trails middle
					{217,71,255}; --trails dithered

					{219,170,240}; --werewolf lighter
					{191,115,188}; --werewolf darker
				};
				effects = {
					{240,128,240}; --trails main
					{191,87,199}; --trails middle
					{217,71,255}; --trails dithered
				};
				meterIcon = {
					{249,222,255}; --lighter color
					{240,128,240}; --darker color
				};
				hit = {155,155,167};
			--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
				{240,128,240}; --other
				};
		};
		alt7 = {
			sprite = {
					{149,70,145}; --pants green
					{136,17,149}; --eye glow green

					{45,59,25}; --claw outline
					{74,104,66}; --claw dark shadow
					{154,197,115}; --claw medium shadow
					{198,248,191}; --claw lightest

					{0,255,0}; --trails main
					{149,255,32}; --trails middle
					{75,195,0}; --trails dithered

					{208,240,170}; --werewolf lighter
					{123,191,115}; --werewolf darker
				};
				effects = {
					{0,255,0}; --trails main
					{149,255,32}; --trails middle
					{75,195,0}; --trails dithered
				};
				meterIcon = {
					{204,255,193}; --lighter color
					{0,255,0}; --darker color
				};
				hit = {136,17,149};
			--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 = {
				{33,206,0}; --black
				{255,255,255}; --white
				{129,255,118}; --other
				};
		};
		alt8 = {
			sprite = {
					{255,127,148}; --pants green
					{255,43,106}; --eye glow green

					{19,35,35}; --claw outline
					{62,97,94}; --claw dark shadow
					{137,176,163}; --claw medium shadow
					{191,237,248}; --claw lightest

					{29,159,165}; --trails main
					{0,255,192}; --trails middle
					{0,123,129}; --trails dithered

					{170,240,176}; --werewolf lighter
					{115,191,173}; --werewolf darker
				};
				effects = {
					{29,159,165}; --trails main
					{0,255,192}; --trails middle
					{0,123,129}; --trails dithered
				};
				meterIcon = {
					{234,212,243}; --lighter color
					{153,85,193}; --darker color
				};
				hit = {255,43,106};
			--generalAssets
				dust = {255,100,146};
				block = {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,178,129}; --black
				{255,255,255}; --white
				{159,255,180}; --other
				};
		};
	};
};

function Quinn:initiate()
	self:_initiate()
	self.hitLightSFX = "lightAttack"
	self.hitHeavySFX = "heavyAttack"
	self.hitLowSFX = "lowAttack"
	self.hitSpecialSFX = "special"
end

function Quinn:update(dt)
	self:_update(dt)
	-- if not self.neutralABRequirement and self.jumpAttack then
	-- 	self.invulnerability = true
	-- end
	if self.move.name == "jumpA" or self.move.name == "jumpB" then
		if self:framesUntilFloor() == 2 then
			self.ignoreCollision = false
		end
	end
	if p.health <= 0 or q.health <= 0 then
		return
	end
	if self.meterTimer > 0 then
		self.throwInvuln = true
	  self.meterTimer = self.meterTimer - 1
	  if self.meterTimer == 0 then
	    -- self.meterAmount = self.meterAmount - 1
	    self:changeMeter(-1)
	    if self.meterAmount == 0 then
	    	self:meterTimeEnd()
	    else
	    	self.meterTimer = 7
	    end
	  end
	end
end

function Quinn:alwaysUpdate(dt)
	self:_alwaysUpdate(dt)
end

function Quinn:controlUpdateHelper(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
	if not buttonB then
		self.repeatB = false
	end
	if not buttonA then
		self.repeatA = false
	end

	self:dashFlagUpdate(left, right)
	if buttonA and not self.repeatA then
		self.gravity = defaultGravity
		if self.move.name == 'dashJumpBack' or self.move.name == 'dashJumpBackWolf' or (self.move.name == 'dashJumpForward' and self.currentStage >= 3) then
			self.flip = -self.flip
		end
		if self.move.name ~= 'dashJumpOffWall' and self.move.name ~= 'dashJumpOffWallFast' then
			self.flip = -self.flip
			self:executeMove("jumpADash")
			self.repeatA = true
			self.lastFrameA = true
		else
			if self.move.name == 'dashJumpOffWallFast' then
				self.flip = -self.flip
			end
			self:executeMove("jumpA")
			-- self.repeatA = true
			-- self.lastFrameA = true
		end
		self.ignoreCollision = true
		self.runCancel = false
		-- if down then
		-- 	self.move.endWith = function()
		-- 		self.moves.teleportRecovery.endWith = nil
		-- 		self:endAttack()
		-- 		local oldrepeat = self.repeatA
		-- 		self:checkTurn()
		-- 		self:executeMove("lowA")
		-- 		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.repeatA = oldrepeat
		-- 	end
		-- end
		-- return
	elseif buttonB and not self.repeatB then
		self.gravity = defaultGravity
		if self.move.name == 'dashJumpBack' or self.move.name == 'dashJumpBackWolf' or (self.move.name == 'dashJumpForward' and self.currentStage >= 3) then
			self.flip = -self.flip
		end
		if self.move.name ~= 'dashJumpOffWall' and self.move.name ~= 'dashJumpOffWallFast' then
			self.flip = -self.flip
			self:executeMove("jumpBDash")
			self.repeatB = true
			self.lastFrameB = true
		else
			if self.move.name == 'dashJumpOffWallFast' then
				self.flip = -self.flip
			end
			self:executeMove("jumpB")
			-- self.repeatB = true
			-- self.lastFrameB = true
		end
		self.ignoreCollision = true
		self.runCancel = false
	end
end

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

	if self.meterAmount > 0 then
		self.inputFrame = 0
	end

	-- if rootState.training and trainingOptions.infiniteMeter and self.meterTimer > 0 then
	-- 	self.meterTimer = 100
	-- end

	if tapA then
		buttonA = true
	end

	if tapB then
		buttonB = true
	end
	if self.move.name == 'connectedOnWall' and hitstop <= 0 and self.freezeTime == 0 then
		-- if buttonA and not self.repeatA then
		-- 	self.ignoreGravity = false
		-- 	self:executeMove("diveA")
		-- 	self.repeatA = true
		-- elseif buttonB and not self.repeatB then
		-- 	self.ignoreGravity = false
		-- 	self:executeMove("diveB")
		-- 	self.repeatB = true
		-- end

			if not buttonB then
				self.repeatB = false
			end
			if not buttonA then
				self.repeatA = false
			end

		-- This is here because I was dashing on accident when tapping forward once after forward dash
			self.dashInputLeft = 0
			self.dashInputRight = 0
			self.flagDashLeft = false
			self.flagDashRight = false

		-- if down and ((left and self.flip == -1) or (right and self.flip == 1)) then self:executeMove('dashJumpOffWall') self:changeSpeed(500)
		-- elseif (left and self.flip == -1) or (right and self.flip == 1) then self:executeMove('dashJumpOffWall') self:changeSpeed(950)
		-- self:changeSpeed(100)
		local forward = (left and self.flip == -1) or (right and self.flip == 1)
		if down then
			self:executeMove('dashJumpOffWall') self:changeSpeed(100) self.gravity = 1000 * gameLogicMult
		elseif forward then
			self:executeMove('dashJumpOffWallFast') self:changeSpeed(925) self.gravity = 1000 * gameLogicMult
		elseif (buttonA and not self.repeatA) or (buttonB and not self.repeatB) then
			if up then
				self:executeMove('dashJumpOffWallFast') self:changeSpeed(925) self.gravity = 1000 * gameLogicMult
				self:controlUpdateHelper(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
			else
				self:executeMove('dashJumpOffWall') self:changeSpeed(500) self.gravity = 1000 * gameLogicMult
				self:controlUpdateHelper(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
			end
		end
	elseif (self.runCancel or self.move.name == 'dashJumpOffWall' or self.move.name == 'dashJumpOffWallFast') and hitstop <= 0 and self.freezeTime == 0 and not (down and right) and not (down and left) then --don't forget to make this false on normalhit
		self:controlUpdateHelper(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
		-- if not buttonB then
		-- 	self.repeatB = false
		-- end
		-- if not buttonA then
		-- 	self.repeatA = false
		-- end

		-- self:dashFlagUpdate(left, right)
		-- if buttonA and not self.repeatA then
		-- 	self.gravity = defaultGravity
		-- 	if self.move.name == 'dashJumpBack' or (self.move.name == 'dashJumpForward' and self.currentStage >= 3) then
		-- 		self.flip = -self.flip
		-- 	end
		-- 	if self.move.name ~= 'dashJumpOffWall' and self.move.name ~= 'dashJumpOffWallFast' then
		-- 		self.flip = -self.flip
		-- 		self:executeMove("jumpADash")
		-- 		self.repeatA = true
		-- 		self.lastFrameA = true
		-- 	else
		-- 		if self.move.name == 'dashJumpOffWallFast' then
		-- 			self.flip = -self.flip
		-- 		end
		-- 		self:executeMove("jumpA")
		-- 		-- self.repeatA = true
		-- 		-- self.lastFrameA = true
		-- 	end
		-- 	self.ignoreCollision = true
		-- 	self.runCancel = false
		-- 	-- if down then
		-- 	-- 	self.move.endWith = function()
		-- 	-- 		self.moves.teleportRecovery.endWith = nil
		-- 	-- 		self:endAttack()
		-- 	-- 		local oldrepeat = self.repeatA
		-- 	-- 		self:checkTurn()
		-- 	-- 		self:executeMove("lowA")
		-- 	-- 		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.repeatA = oldrepeat
		-- 	-- 	end
		-- 	-- end
		-- 	-- return
		-- elseif buttonB and not self.repeatB then
		-- 	self.gravity = defaultGravity
		-- 	if self.move.name == 'dashJumpBack' or (self.move.name == 'dashJumpForward' and self.currentStage >= 3) then
		-- 		self.flip = -self.flip
		-- 	end
		-- 	if self.move.name ~= 'dashJumpOffWall' and self.move.name ~= 'dashJumpOffWallFast' then
		-- 		self.flip = -self.flip
		-- 		self:executeMove("jumpBDash")
		-- 		self.repeatB = true
		-- 		self.lastFrameB = true
		-- 	else
		-- 		if self.move.name == 'dashJumpOffWallFast' then
		-- 			self.flip = -self.flip
		-- 		end
		-- 		self:executeMove("jumpB")
		-- 		-- self.repeatB = true
		-- 		-- self.lastFrameB = true
		-- 	end
		-- 	self.ignoreCollision = true
		-- 	self.runCancel = false
		-- 	-- if down then
		-- 	-- 	self.move.endWith = function()
		-- 	-- 		self.moves.teleportRecovery.endWith = nil
		-- 	-- 		self:endAttack()
		-- 	-- 		local oldrepeat = self.repeatB
		-- 	-- 		self:checkTurn()
		-- 	-- 		self:executeMove("lowB")
		-- 	-- 		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.throwTimer = 0
		-- 	-- 		self.repeatB = oldrepeat
		-- 	-- 	end
		-- 	-- end
		-- 	-- return
		-- end
	else
		self:_controlUpdate(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB)
	end
end

function Quinn:hitFloor(maxY)
	if self.move.name == "fallFromWall" then
		self.throwInvuln = false
		self.attackbox.exists = false
		self.attacking = false
		self.gravity = defaultGravity
		self:executeAnimation("idle")
		self.noInput = false
		self.ySpeed = 0
		self.ignoreCollision = false
		if (self.enemy.x + self.enemy.width/2 > self.x + self.width/2) and (self.noInput == false or self.landingTimer > 0) then
		  self.flip = 1
		  self.faceRight = true
		elseif (self.noInput == false or self.landingTimer > 0) then
		  self.flip = -1
		  self.faceRight = false
		end
	else
		self:_hitFloor(maxY)
	end
end

function Quinn:reset()
	self:_reset()
	self:resetMeter()
	-- self.meterAmount = 33
	self.neutralABRequirement = true
end

function Quinn:resetMeter()
	self.meterChunkArray = {}
	for i=1, 33 do
		if i==1 then
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(6,30)), frameTime)
		elseif i == 33 then
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,30)), frameTime)
		else
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(5,30)), frameTime) --6,1,1,2,2,2,3,2,4,2,5,1
		end
	end
	self:_resetMeter()
end

function Quinn:changeMeter(amount) --1,2,3 empty grey (leftmost, middle, rightmost) 4,5,6 (filled), 7,8,9 (lit up) 10,11,12
	self.meterAmount = self.meterAmount + amount
	if amount > 0 then
		if self.meterAmount == 33 then
			if self.playerNum == 1 then
				self:executeSound('fullMeter', "sfx", -1)
			else
				self:executeSound('fullMeter', "sfx", 1)
			end
			-- self.neutralABRequirement = true
			self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(2,2,3,1)), frameTime, 'pauseAtEnd')
		end
		if self.meterAmount >= 33 then
			self.meterAmount = 33
			self.meterJitter = 5
		else
			self.meterJitter = 2
		end
		for i=1,33 do
			if i==1 then
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(9,1)), frameTime, 'pauseAtEnd')
			elseif i==33 then
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(7,1)), frameTime, 'pauseAtEnd')
			else
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(8,1)), frameTime, 'pauseAtEnd')
			end
		end
	else
		-- if self.meterAmount == 0 then
			-- self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(1,1)), frameTime, 'pauseAtEnd')
			-- if self.meterAmount < 0 then self.meterAmount = 0 end
			-- self.neutralABRequirement = false
		-- end
			-- for i=1,33 do
			if self.meterAmount+1 == 33 then
				self.meterChunkArray[self.meterAmount+1] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(1,1)), frameTime, 'pauseAtEnd')
			else
				self.meterChunkArray[self.meterAmount+1] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(2,1)), frameTime, 'pauseAtEnd')
			end
  		self.meterChunkArray[self.meterAmount] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,1)), frameTime, 'pauseAtEnd')
			-- end
			-- self.meterJitter = 5
	end
end

function Quinn:meterTimeEnd(ignoreAnim)
	if not ignoreAnim then
		self:executeMove("detransform")
	end
	self:overrideBG(true)
	self:hitReset()
	self.gravity = defaultGravity
	self.attacking = false
	self.jumpAttack = false
	self.landingCancel = false
	self.attackbox.exists = false
	self.ySpeed = 0
	self.meterAmount = 0
	self.meterTimer = 0
	self.throwInvuln = false
	for i=1, 33 do
		if i==1 then
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(3,30)), frameTime)
		elseif i == 33 then
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(1,30)), frameTime)
		else
			self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(2,30)), frameTime)
		end
	end
	self.runSpeed = 105 * gameLogicMult
	self:stopTrails()
	-- self:executeAnimation("stopWolfAir")
	-- self:executeAnimation("stopWolfHurt")
end

function Quinn: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, 33 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX + 122 - 16) - (d * 2), 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, 33 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX - 122 + 16) + (d * 2), self.meterY + 12 + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0)
		end
	end
	love.graphics.setShader()
end

function Quinn:hitResponse(alsoHit, delayHurt, hurtboxHit)
	-- if self.ignoreCollision then
	-- 	self.ignoreCollision = false
	-- end
	self:_hitResponse(alsoHit, delayHurt, hurtboxHit)
	if self.meterAmount > 0 then
		if self.move.name == "lowBWolf" then
			self.jumpAttack = true
			self.noInput = true
			self.canJump = false
		elseif self.move.name ~= "jumpAWolf" and self.move.name ~= "jumpBWolf" then
			self.landingCancel = true
		end
	end
end

function Quinn:jump(customXVelocity, customYVelocity, forceDirection)
  self.ignoreFloor = true
  self.invulnerability = false
  self.throwInvuln = true
  self.canJump = false
  self.noInput = true
  self.blockLow = false
  self.blockHigh = false

  self:stopLanding()

  self.height = standHeight
  self.y =  yFloor - self.height

  self.backJump = false
  self.forwardJump = false

  -- self.height = 31 * gameLogicMult
  self.ignoreGravity = true
  --self:checkCrouch()
  self.xSpeed = 0
  self.ySpeed = 0
  self.state = "attack"
  if forceDirection then
    self:setAnimation(self.sprites.jumpUp, {1,1})
  else
  	if self.meterAmount > 0 then
  		self:setAnimation(self.sprites.jumpUpWolf, {1,3})
  	else
  		self:setAnimation(self.sprites.jumpUp, {1,3})
  	end
  end
  self.animation.onLoop = function()
    if self.forwardJumpInput and not self.backJumpInput then
      if self.flip == 1 then
        self.forwardJump = true
      else
        self.backJump = true
      end
    elseif self.backJumpInput and not self.forwardJumpInput then
      if self.flip == 1 then
        self.backJump = true
      else
        self.forwardJump = true
      end
    end
    if forceDirection == 'forward' then self.forwardJump = true self.backJump = false end
    if self.meterAmount > 0 then
    	self:setAnimation(self.sprites.jumpUpWolf, {1,1})
    else
    	self:setAnimation(self.sprites.jumpUp, {1,1})
    end

    self.animation.onLoop = function()
      self.ignoreFloor = false
      self:executeSound('jump', "sfx")
      -- self:setDust(58, false, true)
      -- self.jumpEffectAnimate = anim8.newAnimation(playerEffects.jumpDust.grid(repeatNum(1,3,2,3,7,1)), frameTime, 'pauseAtEnd')
      self.height = 31 * gameLogicMult
      self.ignoreGravity = false
      self.decay = nil
      if not customXVelocity then customXVelocity = 105 * gameLogicMult end
      if self.forwardJump then
        self:executeAnimation("jumpForward")
          -- self.state = "jumpLeft"
          self.xSpeed = customXVelocity * self.flip
          --self:changeWidth(57)
          self.height = 31 * gameLogicMult --94
      elseif self.backJump then
        self:executeAnimation("jumpBack")
          --self.state = "jumpRight"
          self.xSpeed = customXVelocity * -self.flip
          --self:changeWidth(57)
          self.height = 31 * gameLogicMult --94
      else
        self:executeAnimation("jumpUp")
        self.state = "jump"
      end
      self.forwardJump = false
      self.backJump = false
      if customYVelocity then self.ySpeed = customYVelocity else self.ySpeed = self.jumpSpeed end
      self.jumpAttack = true
      self:stopLanding()
    end
  end
end

function Quinn:fullMeter()
	if not self.neutralABRequirement and self.meterAmount == 0 then
		self.neutralABRequirement = true
		self.meterJitter = 5
		self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(2,2,1,1)), frameTime, 'pauseAtEnd')
		for i=1, 33 do
			if i==1 then
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(6,1)), frameTime, 'pauseAtEnd')
			elseif i==33 then
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,1)), frameTime, 'pauseAtEnd')
			else
				self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(5,1)), frameTime, 'pauseAtEnd')
			end
		end
		self:executeSound('fullMeter', "sfx", 1)
	end
end

function Quinn:normalHit(attackInfo, delayHurt, hurtboxHit)
	if self.meterAmount > 0 then
		if self.enemy.attackbox.enemyDragData then return end
		self:meterTimeEnd()
		-- self.enemy:killAllEffects()
	else
		self:_normalHit(attackInfo, delayHurt, hurtboxHit)
	end
end