Tenchi.lua

From Pocket Rumble Wiki
Jump to: navigation, search

tenchi.lua[edit]

-- require 'player/tenchi/Fireball'
-- require 'player/AI'

Tenchi = {
	moves = {
		standA = {
			attackbox = {pushback=189 * gameLogicMult, hitStun=12, width=17 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=13 * gameLogicMult, explosionX = 3 * gameLogicMult, priority = 4};
			{
				frames = {1,3,2,1};
				custom = function(self)
					self:executeSound('lightWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {3,2};
			};
			{
				type = "recovery";
				frames = {3,2,4,2,5,1};
			};
		};
		lowA = {
			attackbox = {pushback=133 * gameLogicMult, hitStun=16, width=29 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=25 * gameLogicMult, explosionX = -6, explosionY = 2, priority = 4};
			{
				frames = {1,3,2,2};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {3,3,4,1};
			};
			{
				type = "recovery";
				frames = {5,3,6,2,7,4};
			};
		};
		standB = {
			attackbox = {pushback=190 * gameLogicMult, hitStun=18, width=37 * gameLogicMult, height=14 * gameLogicMult, relativeY = 12 * gameLogicMult, dmg=1, explosionX = -4 * gameLogicMult, explosionY = -1 * gameLogicMult,  priority = 3};
			{ --hitStun=16 pushback=220
				frames = {1,3,2,2,3,2}; --1,4,2,2,3,2  1,3,2,2,3,2
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {4,3,5,1}; --4,3
			};
			{
				type = "recovery";
				frames = {5,1,6,2,7,2,8,2,9,1,10,1,11,3}; --5,1,6,2,7,2,8,2,9,1,10,1,11,3
			};
		};
		lowB = {
			attackbox = {pushUp = -300,pushback=100 * gameLogicMult, hitStun=21, width=40 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=27 * gameLogicMult, explosionX = -8 - (4 * gameLogicMult), explosionY = 2, priority = 3};
			{
				frames = {1,2,2,1,3,1,4,1,5,1}; --1,2,2,2,3,1,4,1,5,1
				custom = function(self)
					self:executeSound('heavyWhiff', {"sfx", "whiff"})
				end
		};
			{
				type = "active";
				frames = {6,3,7,1}; --6,3,7,1
			};
			{
				type = "recovery";
				frames = {8,3,9,3,10,3,11,3,12,2,13,2,14,2,15,1}; --8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3
			};
		};
		jumpA = {
			attackbox = {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
			{
				frames = {1,3,2,3,3,1}; --{1,3,2,3,3,1}
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {3,1,4,3,5,3};
			};
			{
				type = "recovery";
				frames = {2,4,1,3}; --2,4,1,16
			};
			endWith = function(self)
				self:executeAnimation("jumpA", {
				  frames={1,15};
				});
			end
		};
		jumpB = {
			attackbox = {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
			{ --hitstun=22
				frames = {1,3,2,3,3,3};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type = "active";
				frames = {4,5,5,5,4,5}; --4,5,5,5,4,5,5,5,4,5
			};
			{
				type = "recovery";
				frames = {5,5,4,2};
			};
			endWith = function(self)
				self:executeAnimation("jumpB", {
				  frames={4,4,5,5,4,5};
				});
			end
		};
		downForwardA = {
			{
				frames = {1,2,2,2,3,2};
				custom = function(self) self:startTrails("special") end;
			};
			{
				frames = {4,2,5,2};
				custom = function(self)
					self:executeSound('mediumWhiff', {"sfx", "whiff"})
				end
			};
			{
				type="recovery";
				frames = {5,4,6,4,7,4};
				custom = function(self)
					self:stopTrails()
					self:executeProjectile("fireball")
					self:changeMeter(1)
					self:changeWidth(34)
				end
			};
			{
				frames = {8,10,9,4,10,4};
				custom = function(self)
					self.antlerX = math.floor(self.x)
					self.antlerY = self.y - 14
					self.antlerFlip = self.flip
					self.disAntlersFireballAnimate = anim8.newAnimation(self.sprites.disAntlersFireball.grid(repeatNum(1,4,2,4,3,4,4,4,5,4,6,4,7,1)), frameTime, 'pauseAtEnd')
				end
			};
			{
				frames = {11,3,12,3,13,3};
				custom = function(self)
					self:changeWidth(19)
				end
			};
		};
		downBackA = {
			attackbox = {pushUp = 340 * gameLogicMult, pushback=60 * gameLogicMult, hitStun=15, width=33 * gameLogicMult, height=20 * gameLogicMult, dmg=1, relativeY= -13 * gameLogicMult,relativeX = (-19 * gameLogicMult) + (-4 * gameLogicMult), priority=1, explosionOnEnemyX = true,
			explosionX = {-86,7}, explosionY = {-18, -18}, external = true, forceParry = "high"}; --345
			attackType = attackTypes.medium;
			{
				frames = {1,1,2,1,3,1,4,1};
				custom = function(self)
					self:startTrails("special")
					self:executeSound('antlerAir', "sfx")
					self.invulnerability = true
					self:setDust(100, false, true)
					self.lightLaunchEffectAnimate = anim8.newAnimation(self.sprites.hopDust.grid(repeatNum(1,3,2,3,3,3,4,3,5,3,6,3,7,1)), frameTime, 'pauseAtEnd')
				end
			};
			{
				type="active";
				frames = {5,4};
				custom = function(self)
					self:changeSpeed(30 * gameLogicMult, 1)
					self:changeLocation(4 * gameLogicMult)
					self.gravity = 433 * gameLogicMult
					self.ySpeed = -133 * gameLogicMult
					self:changeMeter(1)
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				frames = {6,4};
				custom = function(self)
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				frames = {6,4};
				custom = function(self)
					self.invulnerability = false
					self.throwInvuln = true
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				frames = {7,4};
				custom = function(self)
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				type="recovery";
				frames = {8,4,9,4,10,4,11,4,12,3, 13,1};
				custom = function(self)
					self:stopTrails()
					self.state = "standing"
					self.antlerX = self.x - 30
					self.antlerY = self.y - 33
					self.antlerFlip = self.flip
					self.disAntlersAnimate = anim8.newAnimation(self.sprites.disAntlersAir.grid(repeatNum(1,4,2,4,3,4,4,4,5,4,6,3,7,1)), frameTime, 'pauseAtEnd')
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				frames = {13,1};
				custom = function(self)
					self.throwInvuln = false
					self.xOffset = self.xOffset - (4 * gameLogicMult)
				end
			};
			{
				custom = function(self)
      		self.ySpeed = 0
				end
			}
		};
		downForwardB = {
			attackbox = {forceForward = true, external = true, pushUp = 266 * gameLogicMult,pushback=133 * gameLogicMult, hitStun=22, width=26 * gameLogicMult, height=20 * gameLogicMult, dmg=1, y= 5, priority=2};
			attackType = attackTypes.medium;
			forceStandHurt = true;
			{
				frames = {1,3,2,2};
				custom = function(self) self:startTrails("special") end;
			};
			{
				frames = {3,2};
				custom = function(self)
					self:changeWidth(30)
					self:executeSound('antlerAir', "sfx")
				end
			};
			{
				type="active";
				frames = {4,1,5,3};
				custom = function(self)
					self:changeMeter(1)
					self:executeSound('antlerCharge', "sfx")
					self.height = 34 * gameLogicMult
					self.y = self.y + (11 * gameLogicMult)
					self:changeSpeed(self.runSpeed * 1.9, 13)
					self:changeLocation(10 * gameLogicMult)
					self.xOffset = -(21 * gameLogicMult)
					self.yOffset = -(10 * gameLogicMult)
				end
			};
			{
				frames = {5,12,5,6};
				custom = function(self)
					self:setDust(0) --40
					self.xOffset = -(21 * gameLogicMult)
					self.yOffset = -(10 * gameLogicMult)
				end
			};
			{
				type="recovery";
				frames = {6,7,7,3,8,3,9,1};
				custom = function(self)
					self:stopTrails()
					self.xOffset = -(21 * gameLogicMult)
					self.yOffset = -(10 * gameLogicMult)
					self.antlerX = self.x - 42
					self.antlerY = self.y - 20
					self.antlerFlip = self.flip
					self.disAntlersChargeAnimate = anim8.newAnimation(self.sprites.disAntlersCharge.grid(repeatNum(1,4,2,4,3,4,4,4,5,4,6,4,7,3,8,1)), frameTime, 'pauseAtEnd')
				end
			};
			{
				frames = {9,2};
				custom = function(self)
					self.height = 44 * gameLogicMult
					self:changeWidth(19)
					self:changeLocation(-5 * gameLogicMult)
				end
			};
		};
		downBackB = {
			startWith = "crouch";
			attackbox = {forceForward = true, pushUp=300 * gameLogicMult, pushback=160 * gameLogicMult, hitStun=15, width=30, height=50, dmg=1, priority=1, explosionX=-6, explosionY=4 - 14, relativeY = 10 * gameLogicMult};
			--333
			attackType = attackTypes.medium;
			endWith = function(self)
				self.image = self.jumpForwardSheet
				self:setAnimation(self.jumpForwardSprite, {12, 1})
				self:endAttack()
				self.canJump = false
				self.xOffset = -11 * gameLogicMult
				self.yOffset = 0
				self.width = 57
				self.height = 44 * gameLogicMult
				self.standingHeight = 44 * gameLogicMult
				self.gravity = defaultGravity
			end;
			{
				frames = {1,4};
				custom = function(self)
					self:startTrails("special")
					self.special = true
					self.invulnerability = true
					self:setDust(100, false, true)
					self:executeSound("launch", "sfx")
					self.heavyLaunchEffectAnimate = anim8.newAnimation(self.sprites.bigDust.grid(repeatNum(1,3,2,3,3,3,4,3,5,3,6,3,7,1)), frameTime, 'pauseAtEnd')
				end
			};
			{
				type = "active";
				frames = {2,3};
				custom = function(self)
					self.state = "DPknee"
					self:changeSpeed(275, 3)
					self.ySpeed = self.jumpSpeed + (113 * gameLogicMult)
					self.y = self.y - 30
					self.gravity  = 1500
					self:changeMeter(1)
				end
			};
			{
				frames = {3,2,4,2};
				custom = function(self)
					self.attackbox.exists = false
				end
			};
			{
				frames = {5,2};
				custom = function(self)
					self.attackbox.width = 60
					self.attackbox.height = self.height + 16
					self.attackbox.y = self.y - 49
					self.state = "DP"
					self.attackbox.pushUp = 745
					self.attackbox.pushback = 250
				end
			};
			{
				frames = {6,1,7,1,8,1};
				custom = function(self)
					self.attackbox.exists = false
					self:executeSound("heavyRush", "sfx")
				end
			};
			{
				frames = {9,1};
				custom = function(self)
					self.attacking = true
					self.attackbox.external = true
					self.attackbox.explosionY = -30 -- -30
					self.attackbox.explosionX = -10 -- -10
					self.attackbox.exists = true
					self.attackbox.width = 82
					self.attackbox.height = self.attackbox.height + 20
					self.attackbox.pushUp = 300
					self.attackbox.relativeY = -30
					self.attackbox.relativeX = -11 * gameLogicMult
					self.attackbox.forceParry = "high";
					-- self.attackType = attackTypes.high
				end
			};
			{
				type="recovery";
				frames = {10,2,11,2,12,2};
				custom = function(self)
					self:stopTrails()
					self.invulnerability = false
					self.throwInvuln = true
					self.state = "DP"
				end
			};
			{
				frames = {13,2,14,23};
				custom = function(self)
					self.antlerX = self.x - 19
					self.antlerY = self.y - 44
					self.antlerFlip = self.flip
					self.disAntlersDPAnimate = anim8.newAnimation(self.sprites.disAntlersDP.grid(repeatNum(1,4,2,4,3,4,4,4,5,4,6,4,7,3,8,1)), frameTime, 'pauseAtEnd')
				end
			};
		};
		neutralAB = {
			frameData = {{type="startup", frameCount=7}, {type="recovery", frameCount=40}};
			attackbox = {pushback=183 * gameLogicMult, hitStun=19, width=15 * gameLogicMult, height=30 * gameLogicMult, dmg=2, y=0};
			{
				frames = {1,3,2,3};
				custom = function(self)
					-- flashWhite()
					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({{type="startup", frameCount=7}, {type="recovery", frameCount=40}})
					self:emptyMeter()
				end
			};
			{
				frames = {3,3,4,3};
				custom = function(self)
					-- self:stopTrails()
					continueShakeJitterY = nil
				end
			};
			{
				frames = {5,4};
				custom = function(self)
					continueShakeJitterY = nil
								end
			};
			{
				frames = {6,4};
				custom = function(self)
					continueShakeJitterY = nil
				end
			};
			{
				frames = {7,4};
				custom = function(self)
					continueShakeJitterY = nil
				end
			};
			{
				frames = {8,4};
				custom = function(self)
					continueShakeJitterY = nil
				end
			};
			{
				frames = {9,4};
				custom = function(self)
					continueShakeJitterY = 1
					self:executeEffect("neutralABEffect")
				end
			};
			{
				frames = {23,4,24,4,25,4,26,4};
				custom = function(self)
					continueShakeJitterY = 2
					self:executeSound("superShine", {"sfx", "whiff"})
				end
			};
			{
				frames = {27,7};
				custom = function(self)
					self:startTrails("super")
					self:superStopContinue()
					self.invulnerability = false
					self.ignoreInvulnOutline = false
					continueShakeJitterY = 2
				end
			};
			{
				spriteName = "downForwardA";
				frames = {5,4,6,4,7,4};
				custom = function(self)
					self:executeSound("tenchiSuperRelease", {"sfx", "whiff"})
					self:executeProjectile("superFireball")
					self:changeWidth(34)
					-- self.projectiles[1]:spawn(self.x, self.y, self.flip, true, self)
					continueShakeJitterY = nil
				end
			};
			{
				frames = {8,10,9,4,10,4};
				custom = function(self)
					self.antlerX = math.floor(self.x)
					self.antlerY = self.y - 14
					self.antlerFlip = self.flip
					self.disAntlersFireballAnimate = anim8.newAnimation(self.sprites.disAntlersFireball.grid(repeatNum(1,4,2,4,3,4,4,4,5,4,6,4,7,1)), frameTime, 'pauseAtEnd')
					-- self:stopTrails()
				end
			};
			{
				frames = {11,3,12,3,13,3};
				custom = function(self)
					self:changeWidth(19)
				end
			};
			{
				frames = {13,1};
				custom = function(self)
					self:stopTrails()
				end
			};
		};
		dashForward = {
			spriteName = "dash";
			{
				type = "recovery";
				frames = {1,3,2,9,3,2};
				custom = function(self)
					self:startTrails("dash")
					self:executeSound("dash", "sfx")
					self:setDust(-40) --0
					self:changeSpeed(self.runSpeed * 2.8, 35)
				end
			};
			{
				frames = {3,1};
				custom = function(self)
					self:stopTrails()
				end
			};
		};
		dashBack = {
			spriteName = "dash";
			{
				type = "recovery";
				frames = {1,3,4,9,5,2};
				custom = function(self)
					self:startTrails("dash")
					self:executeSound("dash", "sfx")
					self:setDust(150, true) --140
					self:changeSpeed(-self.runSpeed * 2.8, -35)
				end
			};
			{
				frames = {5,1};
				custom = function(self)
					self:stopTrails()
				end
			};
		};

		winLoopBox = {
			spriteName = "win";
			attackbox = {pushUp = 200 * gameLogicMult, pushback=100 * gameLogicMult, hitStun=19, width=70 * gameLogicMult, height=84 * gameLogicMult, relativeX = -36 * gameLogicMult, relativeY = -10 * gameLogicMult, dmg=1, explosionY = 0 * gameLogicMult,explosionX = -15 * gameLogicMult, priority = 1, ignoreCornerPush=true, external = true};
			endWith = function(self)
				self:executeAnimation("winLoop")
			end;
			type = "active";
			frames = {18,3,19,3,18, 3, 19, 3, 18, 3, 19, 3, 18, 3, 19, 3,18, 3, 19, 3, 18, 3, 19, 3, 18, 3, 19, 3, 20, 3, 21, 3, 22, 3, 23, 3, 22, 3, 23, 3,22, 3, 23, 3, 22, 3, 23, 3,22, 3, 23, 3,22, 3, 23, 3,22, 3, 23, 3, 24, 3, 25, 3};
			custom = function(self)
				self.enemy.invulnerability = false
				self.ignoreCollision = true
			end
		};
	};
	animations = {
		idle = {
			frameTime = .08;
			frames = {4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,3,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,1,1,2,1,3,3};
		};
		crouch = {
			frameTime = .08;
			frames= {1,10,2,1,3,10,2,1,1,10,2,1,3,1,4,1,5,1,4,1,3,6,2,1};
		};
		walkForward = {
			spriteName = "walk";
			frameTime= frameTime * 5;
			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};
		};
		walkBack = {
			spriteName = "walk";
			frameTime= frameTime * 6;
			frames={21,1,20,1,19,1,18,1,17,1,16,1,15,1,14,1,13,1,12,1,11,1,10,1,9,1,8,1,7,1,6,1,5,1,4,1,3,1,2,1,1,1};
		};
		jumpUp = {
			endWith = "nothing";
			frameTime = .081;
			frames={2,2,3,1,4,1,5,1,6,1,11,1,6,1,10,1};
		};
		jumpForward = {
			frameTime = .038;
			endWith = "nothing";
			frames={2,3,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1};
		};
		jumpBack = {
			spriteName = "jumpForward";
			frameTime = .043;
			frames={2,1,10,1,9,1,8,1,7,1,6,1,5,1,4,1,11,1,14,3,13,1};
		};
		crouchTransition = {
			frameTime = frameTime *3;
			frames={1,1,2,1};
		};
		land = {
			spriteName = "jumpUp";
			frameTime = frameTime * 2;
			frames = {12,1,13,1,7,1,7,1,7,1,9,1,9,1};
		};
		standTransition = {
			spriteName = "crouchTransition";
			frameTime = frameTime *3;
			frames={3,1,4,1};
			custom = function(self)
				self.yOffset = 0
			end
		};
		tech = {
			frames = {1,4,2,4,3,8,4,4};
		};
		turn = {
			frames = {1,4};
		};
		crouchTurn = {
			frames = {1,4};
		};
		knockdown = {
			endWith = "nothing";
			frames = {1,4,2,4,3,4,4,2,5,2,6,1};
		};
		airHurt = {
			endWith = function(self)
				self:executeAnimation("jumpBack")
				self.animation:gotoFrame(2)
			end;
			frames = {1,1};
		};
		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};
		};
		impact = {
			spriteName = "knockdown";
			frames = {7,3}
		};
		startGroundBounce = {
			spriteName = "knockdown";
			frames = {8,2,9,1,10,1,11,1,12,8}
		};
		stopGroundBounce = {
			spriteName = "knockdown";
			frames = {13,2, 14, 5, 14,5}
		};
		wakeup = {
			spriteName = "knockdown";
			frames = {15,5,16,5}
		};
		death = {
			spriteName = "knockdown";
			endWith = "nothing";
			frames = {14,1}
		};
		-- local anim1 = {8,2,9,1,10,1,11,1,12,8}
		-- local anim2 = {13,2, 14, 5, 14,5} --13,2, 14, 13, 14,5
		-- local anim3 = {15,5,16,5} --15,5,16,5
		-- self:_wakeUp(7, 14, anim1, anim2, anim3)
		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
			};
		};
		yay = {
			frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,3,11,24,12,4,13,4,14,4};
			endWith = function(self)
				self:executeAnimation("yayLoop")
			end
		};
		yayLoop = {
			frameTime = .08;
			frames = {7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,3,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,1,1,2,1,3,3,4,1,5,1,6,1};
		};
		boo = {
			frames = {1,8,2,4,3,4,4,3,5,3,4,3,5,3,4,3,5,3,4,3,5,3,4,3,5,3,4,3,5,3,4,3,5,3,4,3,5,3,4,5,5,5,6,5,7,5};
			endWith = function(self)
				self:executeAnimation("booLoop")
			end
		};
		booLoop = {
			frameTime = .08;
			frames = {7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,3,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,1,1,2,1,3,3,4,1,5,1,6,1};
		};
		winLoop = {
			spriteName = "win";
			frames = {18, 3, 19,3,18, 3, 19, 3, 18, 3, 19, 3, 18, 3, 19, 3,18, 3, 19, 3, 18, 3, 19, 3, 18, 3, 19, 3, 20, 3, 21, 3, 22, 3, 23, 3, 22, 3, 23, 3,22, 3, 23, 3, 22, 3, 23, 3,22, 3, 23, 3,22, 3, 23, 3,22, 3, 23, 3, 24, 3, 25, 3};
		};
		win = {
			endWith = function(self)
				self:executeMove("winLoopBox")
			end;
			{
				frames = {1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4};
				custom = function(self)
					self:drawFirst()
				end
			};
			{
				frames = {9,4,10,4,11,4,12,4,13,4,14,4,15,4,16,4,17,4};
				custom = function(self)
					self:drawFirst()
					self:executeSound('antlerAir', "sfx")
				end
			};
			{
				custom = function(self)
					self.beamDraw = true
					self:executeSound('beam', "sfx")
					self.ySpeed = -340
					self.beamAnimate = anim8.newAnimation(self.sprites.winBeam.grid(repeatNum(1,3,2,3,3,4)), frameTime)
					self.beamStuffAnimate = anim8.newAnimation(self.sprites.winBeamStuff.grid(repeatNum(1,2,2,2,3,2,4,2,5,2)), frameTime)
					self.beamAnimate.onLoop = function()
						self.beamAnimate = anim8.newAnimation(self.sprites.winBeam.grid(repeatNum(5,3,4,3,5,3,6,3,5,3,4,3,7,3,4,3)), frameTime)
						self.beamStuffAnimate = anim8.newAnimation(self.sprites.winBeamStuff.grid(repeatNum(6,2,7,2,8,2,1,2,2,2,3,2,4,2,5,2)), frameTime)
					end
				end
			};
		};
	};
	throw = {
		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
			{2,51/3,-36/3}, --f8
			{1,48/3,-33/3}, --f9
			{1,39/3,-33/3}, --f10
			{1,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
		};
		start = {
			{frames = {1,3,2,3,3,3,4,2,5,1,6,1}}; --5,2,6,4 --1,4,2,4,3,4,4,2,5,1,6,1
			{
				frames = {8,4,9,4,10,4,11,4}; --8,4,9,4,10,4,11,4
				custom = function(self)
					self:throwHitstop(6, 38, 34)
					cameraJitterX = 2
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound(self.hitSpecialSFX, "sfx")
				end
			};
		};
		forward = {
			{
				frames = {11,2,13,2,14,1,15,1}; --11,4,13,2,14,2,15,2
				-- data = {dmg = 1, hitstop = 9, explosionX= 101, explosionY = 101, changeLocation = 90, changeSpeed = 350, changeYSpeed = -600};
			};
			{
				frames = {16,4,17,4,18,4,19,4,20,4};
				custom = function(self)
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound(self.hitSpecialSFX, "sfx")
					self:throwHitstop(8, 38, 34)
					cameraJitterX = 2
					self.enemy:changeLocation(30)
					self.enemy:changeSpeed(300)
					self.enemy.ySpeed = -250
					self.enemy.y = self.enemy.y + 20
					self.enemy.ignoreGravity = false
					self.enemy:knockFall()
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
		};
		backward = {
			{
				frames = {21,2,22,4,23,4}; --21,4,22,4,23,4
				data = {dmg = 1, changeLocation = 10, changeSpeed = 500, changeYSpeed = -600};
			};
			{
				frames = {24,4,25,4,26,4,27,4,28,4};
				custom = function(self)
					self.combo = self.combo + 1
					self.enemy:changeHealth(1)
					self:executeSound('grab', "sfx")
					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.animation:gotoFrame(5)
					self.faceRight = not self.faceRight
					self.ignoreFloor = false
					self.enemy.ignoreFloor = false
				end
			};
			{
				custom = function(self)
					self:changeLocation(-4)
				end
			};
		};
	};
	effects = {
		hitEffect = {
			frames = {1,3,2,3,3,2,4,2,2,1};
		};
		fireball = {
			relativeX = -23 * gameLogicMult;
			relativeY = -21 * gameLogicMult;
			frames = {1,2,2,2,3,2,4,2,3,2,2,2};
			-- ignoreHitstop = false;
		};
		fireballDestroy = {
			flicker = true;
			relativeX = -20 * gameLogicMult;
			relativeY = -21 * gameLogicMult;

			{
				frames = {5,3,6,3,7,2};
			};
			{
				frames = {8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3};
				custom = function(self, host)
					self.xSpeed = 350 * 1.8
				end;
			};
		};
		neutralABEffect = {
			flicker = true;
			frames = {1,2,2,2,3,1,4,1,5,1,6,1,7,1,8,2,9,2,10,2,11,2};
			-- frames = {1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1};
			relativeX = -218;
			relativeY = 6;
		};
		superFireball = {
			frames = {1,2,2,2,3,2,4,2};
			relativeX = (-25 * gameLogicMult) - 10; --23
			relativeY = (-22 * gameLogicMult) - 30;
		};
		superFireballDestroy = {
			spriteName = "fireballDestroy";
			flicker = true;
			relativeX = -17 * gameLogicMult; -- 18
			relativeY = -21 * gameLogicMult;
			{
				frames = {5,3,6,3,7,2};
			};
			{
				frames = {8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3};
				custom = function(self, host)
					self.xSpeed = 350 * 1.8
				end;
			};
		};
	};
	projectiles = {
		fireball = {
			destroyEffect = "fireballDestroy";
			sfx = "projectile";
			xSpeed = 350; --default 350
			-- priority = 2; --default
			relativeX = 34*gameLogicMult; --29*gameLogicMult
			relativeY = 12*gameLogicMult;
			hitStun = 35;
			pushback = 300;
			explosionX = 6 * gameLogicMult;
			width = 17 * gameLogicMult;
			height = 20 * gameLogicMult;
			hitstop = 10;
			priority = 2;
			-- onPriorityLose = function(self)
			-- 	self:destroy()
			-- 	self.liveEffect.xSpeed = 0
			-- end
		};
		superFireball = {
			destroyEffect = "superFireballDestroy";
			xSpeed = 600;
			relativeX = 29 * gameLogicMult;
			relativeY = 13 * gameLogicMult;
			width = 23 * gameLogicMult;
			height = 19 * gameLogicMult;
			hitStun = 35;
			pushback = 300;
			health = 4;
			priority= 1;
			hitstop = 10; --9
			explosionX = 4 * gameLogicMult;
			onUpdate = function(self, enemy)
				if self.health == 1 then self.pushUp = 600 return end

				if enemy.y < yFloor - standHeight then
					self.pushUp = 120
				else
					self.pushUp = 0
				end
			end;
			-- onDestroy = function(self)
				-- print(enemy.y)
				-- self.liveEffect.relativeX = -18 * gameLogicMult
				-- self.liveEffect.relativeY = -21 * gameLogicMult
			-- end;
		};
	};
	nameplate = {
		frames = {1,1,2,2,3,1,4,2,5,1,6,2,7,1,8,2,9,1,10,2,11,1,12,2,13,1,14,2,15,1,16,2,17,1,18,2,19,1,20,2,21,1,22,2,23,1,24,2,
		25,1,26,2,27,1,28,2,29,1,30,2,31,1,32,2,33,1,34,2};
		custom = function(self, host)
				if host.player1 == true then
					host:executeSound("nameplateLeft", {"sfx", "nameplate1"})
				else
					host:executeSound("nameplateRight", {"sfx", "nameplate2"})
				end
			end
	};
	colors = {
		default = {
			--colors self-identified
				sprite = {
					{247,0,0}; --tenchi red
					{255,255,255}; --antler white
					{67,214,247}; --antler blue
					{194,242,255}; --fireball LIGHTEST blue
					{0,99,231}; --HAND OUTLINE
					{189,41,8}; --super antler shadow
				};
				effects = {
					{67,214,247}; --antler blue
					{255,255,255}; --antler white
					{194,242,255}; --fireball LIGHTEST blue
					{0,99,231}; -- HAND OUTLINE
					{0,0,247}; --fireball DARKEST blue
				};
				meterIcon = {
					{67,214,247}; --antler blue
					{255,255,255}; --antler white
					{194,242,255}; --fireball LIGHTEST blue
					{0,99,231}; --HAND OUTLINE
				};
				hit = {255,0,27};
			--generalAssets
				dust = {255,64,64};
				block = {255,0,0};
				-- trailSuper = {0, 200, 255};
				trailSuper = {
				{0,99,231}; --black
				{255,255,255}; --white
				{67,214,247}; --other
				};
				trailDash = {255,0,0}; --255,0,0

				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 = { --orange
			--colors self-identified
			sprite = {
					{255,132,21}; --tenchi red
					{255,255,255}; --antler white
					{255,255,0}; --antler blue
					{253,255,142}; --fireball light blue
					{255,223,23}; --fireball blue
					{182,111,8}; --super antler shadow
				};
				effects = {
					{255,255,0}; --antler blue
					{255,255,255}; --antler white
					{253,255,142}; --fireball light blue
					{255,223,23}; --fireball blue
					{242,182,0}; --fireball dark blue
				};
			meterIcon = {
					{255,255,0}; --antler blue
					{255,255,255}; --antler white
					{253,255,142}; --fireball light blue
					{242,182,0}; --fireball blue
			};
			hit = {254,125,17};
			--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 = {
			--colors self-identified
				sprite = {
					{235,218,0}; --tenchi red
					{255,255,255}; --antler white
					{255,63,125}; --antler blue
					{255,132,235}; --fireball LIGHTEST blue
					{255,30,106}; --HAND OUTLINE
					{255,253,36}; --super antler shadow
				};
				effects = {
					{255,63,125}; --antler blue
					{255,255,255}; --antler white
					{255,132,235}; --fireball LIGHTEST blue
					{255,30,106}; --HAND OUTLINE
					{213,0,103}; --fireball DARKEST blue
				};
				meterIcon = {
					{255,63,125}; --antler blue
					{255,255,255}; --antler white
					{255,132,235}; --fireball LIGHTEST blue
					{213,0,103}; --HAND OUTLINE
				};
				hit = {255,255,0};
				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
				};
		};
		alt4 = {
			--colors self-identified
				sprite = {
					{73,220,2}; --tenchi red
					{255,255,255}; --antler white
					{153,85,193}; --antler blue
					{204,142,255}; --fireball LIGHTEST blue
					{153,0,193}; --HAND OUTLINE
					{32,234,0}; --super antler shadow
				};
				effects = {
					{153,85,193}; --antler blue
					{255,255,255}; --antler white
					{204,142,255}; --fireball LIGHTEST blue
					{153,0,193}; --HAND OUTLINE
					{89,0,141}; --fireball DARKEST blue
				};
				meterIcon = {
					{153,85,193}; --antler blue
					{255,255,255}; --antler white
					{204,142,255}; --fireball LIGHTEST blue
					{153,0,193}; --HAND OUTLINE
				};
				hit = {0,255,0};
				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 = {
				{153,0,193}; --black
				{255,255,255}; --white
				{204,142,255}; --other
				};
		};

		alt5 = { --blue
			--colors self-identified
			sprite = {
					{128,183,192}; --tie
					{255,255,255}; --antler white
					{255,69,69}; --hand trails
					{255,228,228}; --bright hand fill
					{255,0,0}; --medium hand outline
					{0,216,255}; --medium hand outline
				};
				effects = {
					{255,69,69}; --hand trails
					{255,255,255}; --antler white
					{255,228,228}; --bright hand fill
					{255,69,69}; --hand trails
					{255,0,0}; --medium hand outline
				};
			meterIcon = {
					{255,121,121}; --hand trails
					{255,255,255}; --antler white
					{255,228,228}; --bright hand fill
					{255,0,0}; --medium hand outline
			};
			hit = {0,216,255}; --medium hand outline
			--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 = { --grey
			--colors self-identified
			sprite = {
					{155,155,167}; --tenchi red
					{255,255,255}; --antler white
					{240,128,240}; --antler blue
					{255,228,242}; --fireball light blue
					{148,0,247}; --fireball blue
					{148,0,247}; --super antler shadow
				};
				effects = {
					{240,128,240}; --antler blue
					{255,255,255}; --antler white
					{255,228,242}; --fireball light blue
					{240,128,240}; --fireball blue
					{148,0,247}; --fireball dark blue
				};
			meterIcon = {
					{240,128,240}; --antler blue
					{255,255,255}; --antler white
					{255,228,242}; --fireball light blue
					{148,0,247}; --fireball blue
			};
			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
			{240,128,240}; --other
			};
		};
		alt7 = {
			--colors self-identified
				sprite = {
					{165,0,209}; --tenchi red
					{255,255,255}; --antler white
					{0,255,0}; --antler blue
					{129,255,118}; --fireball LIGHTEST blue
					{33,206,0}; --HAND OUTLINE
					{122,8,189}; --super antler shadow
				};
				effects = {
					{0,255,0}; --antler blue
					{255,255,255}; --antler white
					{129,255,118}; --fireball LIGHTEST blue
					{33,206,0}; --HAND OUTLINE
					{0,147,0}; --fireball DARKEST blue
				};
				meterIcon = {
					{0,255,0}; --antler blue
					{255,255,255}; --antler white
					{129,255,118}; --fireball LIGHTEST blue
					{33,206,0}; --HAND OUTLINE
				};
				hit = {136,17,149};
				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 = {
			--colors self-identified
				sprite = {
					{255,106,254}; --tenchi red
					{255,255,255}; --antler white
					{0,221,155}; --antler blue
					{159,255,180}; --fireball LIGHTEST blue
					{0,178,129}; --HAND OUTLINE
					{251,86,194}; --super antler shadow
				};
				effects = {
					{0,221,155}; --antler blue
					{255,255,255}; --antler white
					{159,255,180}; --fireball LIGHTEST blue
					{0,178,129}; --HAND OUTLINE
					{0,119,115}; --fireball DARKEST blue
				};
				meterIcon = {
					{0,221,155}; --antler blue
					{255,255,255}; --antler white
					{159,255,180}; --fireball LIGHTEST blue
					{0,178,129}; --HAND OUTLINE
				};
				hit = {255,43,106};
				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,178,129}; --black
				{255,255,255}; --white
				{159,255,180}; --other
				};
		};

	-- alt1 = { --red
		-- 	--colors self-identified
		-- 		sprite = {
		-- 			{247,0,0}; --tenchi red
		-- 			{255,255,255}; --antler white
		-- 			{67,214,247}; --antler blue
		-- 		};
		-- 		effects = {
		-- 			{67,214,247}; --antler blue
		-- 			{255,255,255}; --antler white
		-- 			{0,99,231}; --fireball blue
		-- 		};
		-- 		meterIcon = {
		-- 			--dark fireball
		-- 			{0,99,231}; --dark
		-- 			{67,214,247}; --medium

		-- 			--light fireball
		-- 			{67,214,247}; --dark
		-- 			{194,242,255}; --medium
		-- 		};
		-- 		hit = {255,0,27};
		-- 	--generalAssets
		-- 		dust = {255,64,64};
		-- 		block = {255,0,0};

		-- 		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 = { --purple
		-- 	--colors self-identified
		-- 	sprite = {
		-- 		{160, 0, 247}; --tenchi purple
		-- 		{248,248,248}; --antler white
		-- 		{74, 227, 47}; --antler green
		-- 	};
		-- 	effects = {
		-- 		{74, 227, 47}; --antler green
		-- 		{248,248,248}; --antler white
		-- 		{24,243,57}; --fireball green
		-- 	};
		-- 	meterIcon = {
		-- 		--darkFireball
		-- 		{24,243,57}; --darkFireball
		-- 		{155,255,109}; --mediumFireball
		-- 		-- {160,0,240}; --lightestFireball

		-- 		--lightFireball
		-- 		{155,255,109}; --darkFireball
		-- 		{223,255,210}; --mediumFireball
		-- 		--lightestFireball is same
		-- 	};
		-- 	hit = {207,0,255};
		-- 	--generalAssets
		-- 	dust = {207,0,255};
		-- 	block = {207,0,255};
		-- 	mainUI = {73, 0, 113}; --UIcolor
		-- 	health = {165,0,255}; --drainHealth
		-- 	meterChunk = {
		-- 		--meterOne
		-- 		{13,212,36}; --darkGreen
		-- 		{59,233,72}; --mediumGreen
		-- 		{153,255,142}; --lightestGreen

		-- 		--meterTwo
		-- 		{99,255,112}; --darkGreen
		-- 		{164,255,171}; --mediumGreen
		-- 		{233,255,244}; --lightestGreen
		-- 	};
		-- };
	};
	customVars = {
		--override
			pushbackDustOffset = 0;
		--custom
			beamDraw = false; --for win anim
			antlerX = 0;
			antlerY = 0;
			antlerFlip = 1;
	};
};

function Tenchi:initiate()
	self:_initiate()
	-- self.projectiles[1] = Fireball()

	-- constants
	self.pushbackDustOffset = 0

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

	-- character variables
		self.beamDraw = false --for win anim
		self.antlerX = 0
		self.antlerY = 0
		self.antlerFlip = 1

	--effects TODO: put these as real effects not anim8 objects
	self.beamAnimate = anim8.newAnimation(self.sprites.winBeam.grid(repeatNum(5,3,4,3,5,3,6,3,5,3,4,3,7,3,4,3)), frameTime)
	self.beamStuffAnimate = anim8.newAnimation(self.sprites.winBeamStuff.grid(repeatNum(6,2,7,2,8,2,1,2,2,2,3,2,4,2,5,2)), frameTime)
end

function Tenchi:reset()
	self:_reset()
	self.beamDraw = false --for win anim
end

function Tenchi:resetMeter()
	self.meterChunkArray = {}
	for i=1, 6 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 Tenchi:update(dt)
	self:_update(dt)

	if self.beamDraw then --for Tenchi's win pose
		self.beamAnimate:update(dt)
		self.beamStuffAnimate:update(dt)
		if self.ySpeed < -200 then
			self.gravity = 440
		elseif self.ySpeed > 200 then
			self.gravity = -430
		end
	end
end

function Tenchi:alwaysUpdate(dt)
	self.disAntlersAnimate:update(dt) --antler animation
	self.disAntlersDPAnimate:update(dt)
	self.disAntlersChargeAnimate:update(dt)
	self.disAntlersFireballAnimate:update(dt)

	self:_alwaysUpdate(dt)
end

function Tenchi:draw()
	if not GGPO.synctest then
		if self.image == self.sprites.downForwardA.sheet and flicker then self.image = self.sprites.antlerDownForwardA.sheet
		elseif self.image == self.sprites.antlerDownForwardA.sheet and not flicker then self.image = self.sprites.downForwardA.sheet end
	end
	if not KILLSHADERS then
		love.graphics.setShader(self.shaders.effects)
	end
	if self.beamDraw then
		local xOffset = 0
		if self.flip == -1 then
			xOffset = (self.width - (2 * self.xOffset))/ gameLogicMult
		end
		self.beamAnimate:draw(self.sprites.winBeam.sheet,math.floor(self.x + self.xOffset), 203 - 228, 0, self.flip * gameLogicMult,gameLogicMult,xOffset,0)
		self:_draw()
		if not KILLSHADERS then
			love.graphics.setShader(self.shaders.effects)
		end
		self.beamStuffAnimate:draw(self.sprites.winBeamStuff.sheet,math.floor(self.x + self.xOffset), 203 - 228, 0, self.flip * gameLogicMult,gameLogicMult,xOffset,0)
	else self:_draw() end

	if not KILLSHADERS then
		love.graphics.setShader(self.shaders.effects)
	end

   	if flicker then
		if self.antlerFlip == 1 then
			self.disAntlersAnimate:draw(self.sprites.disAntlersAir.sheet, math.floor(self.antlerX), math.floor(self.antlerY),0,gameLogicMult,gameLogicMult)
			self.disAntlersDPAnimate:draw(self.sprites.disAntlersDP.sheet, math.floor(self.antlerX), math.floor(self.antlerY), 0, gameLogicMult, gameLogicMult)
			self.disAntlersChargeAnimate:draw(self.sprites.disAntlersCharge.sheet, math.floor(self.antlerX), math.floor(self.antlerY), 0, gameLogicMult, gameLogicMult)
			self.disAntlersFireballAnimate:draw(self.sprites.disAntlersFireball.sheet, math.floor(self.antlerX), math.floor(self.antlerY), 0, gameLogicMult, gameLogicMult)
		else
			local xOffset = (38 - (2 * -32))/ gameLogicMult --38 is width, -32 is xOffset
			self.disAntlersAnimate:draw(self.sprites.disAntlersAir.sheet, math.floor(self.antlerX-5), math.floor(self.antlerY),0,-gameLogicMult,gameLogicMult, xOffset, 0)
			self.disAntlersDPAnimate:draw(self.sprites.disAntlersDP.sheet, math.floor(self.antlerX-43+16), math.floor(self.antlerY), 0,-gameLogicMult,gameLogicMult, xOffset, 0)
			self.disAntlersChargeAnimate:draw(self.sprites.disAntlersCharge.sheet, math.floor(self.antlerX + 42), math.floor(self.antlerY), 0, -gameLogicMult, gameLogicMult, xOffset, 0)
			self.disAntlersFireballAnimate:draw(self.sprites.disAntlersFireball.sheet, math.floor(self.antlerX - 64 + 30), math.floor(self.antlerY), 0, -gameLogicMult, gameLogicMult, xOffset)
		end
	end

	love.graphics.setColor(255, 255, 255, 255)
	love.graphics.setShader()
	-- end
end

-- TODO: fix heavy DP so we can remove this. need to add custom land to player moves (don't forget to null out custom land when hit during the moves!)
function Tenchi:hitFloor(maxY)
	--if self.state == "jump" or self.state == "jumpRight" or self.state == "jumpLeft" then
	if self.state == "DP" then
		self:setLandDust(56, false, true)
		self.throwInvuln = false
		self.state = "standing"
		self:setAnimation(self.sprites.jumpUp, {12,2,13,2,7,1,7,1,7,1,9,1,9,1})
		--self.image = self.jumpUpSheet
		self.height = 44 * gameLogicMult
		self.y = yFloor - self.standingHeight
		self.standingHeight = 44 * gameLogicMult
		self.xSpeed = 0
		-- self.ySpeed = 0
		self.gravity = defaultGravity
		self.ySpeed = self.gravity * frameTime
		self.animation.onLoop = function()
			self:executeAnimation("idle")
			self.noInput = false
		end
	else
		self:_hitFloor(maxY)
	end
end

-- TODO: put these in the player table
-- function Tenchi:wakeUp()
-- 	local anim1 = {8,2,9,1,10,1,11,1,12,8}
-- 	local anim2 = {13,2, 14, 5, 14,5} --13,2, 14, 13, 14,5
-- 	local anim3 = {15,5,16,5} --15,5,16,5
-- 	self:_wakeUp(7, 14, anim1, anim2, anim3)
-- end

-- TODO: rename to drawMeter or make a drawOverEverything
function Tenchi:meterAnimation()
	if not KILLSHADERS then
		love.graphics.setShader(self.shaders.meterIcon)
	end
	if self.player1 then
		self.meterAnimate:draw(self.sprites.meter.sheet, self.meterX, self.meterY + self.meterJitter, 0, gameLogicMult, gameLogicMult, 0, 0)
		if not KILLSHADERS then
			love.graphics.setShader(self.shaders.meterChunk)
		end
		for i=1, 6 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX + 122) - (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)
		if not KILLSHADERS then
			love.graphics.setShader(self.shaders.meterChunk)
		end
		for i=1, 6 do
			local d = i-1
			self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX - 122) + (d * 16), self.meterY + 12 + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0)
		end
	end
	love.graphics.setShader()
end

-- TODO: dynamic load from folder
function Tenchi:loadSprites(color)
	self:_loadSprites(folder)

	-- self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(1,1), frameTime)

	self.disAntlersAnimate = anim8.newAnimation(self.sprites.disAntlersAir.grid(repeatNum(7,1)), frameTime, 'pauseAtEnd')
	self.disAntlersDPAnimate = anim8.newAnimation(self.sprites.disAntlersDP.grid(repeatNum(8,1)), frameTime, 'pauseAtEnd')
	self.disAntlersFireballAnimate = anim8.newAnimation(self.sprites.disAntlersFireball.grid(7,1), frameTime)
	self.disAntlersChargeAnimate = anim8.newAnimation(self.sprites.disAntlersCharge.grid(8,1), frameTime)
end

function Tenchi:changeMeter(amount)
	if self.meterAmount < 6 then
		self.meterAmount = self.meterAmount + amount
		if self.meterAmount == 6 then
			self.meterJitter = 5
			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(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, 6 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 Tenchi:emptyMeter()
	self.neutralABRequirement = false
	self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(1,1), frameTime)
	self:cascadeMeter(6)
end

function Tenchi:fullMeter()
	if self.meterAmount < 6 then
		self.meterAmount = 0
		self:changeMeter(6)
	end
end

function Tenchi:cascadeMeter(meterNum)
	if meterNum == 6 then
		self:executeSound("tenchiSuper", "sfx")
		for i=1, 6 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