Tenchi.lua
From Pocket Rumble Wiki
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