June.lua
From Pocket Rumble Wiki
june.lua[edit]
June = { moves = { standA = { attackbox = {pushback=189 * gameLogicMult, hitStun=12, width=17 * gameLogicMult, height=11 * gameLogicMult, dmg=1, relativeY=10 * gameLogicMult, explosionX = 4 *gameLogicMult, explosionY = 2 * gameLogicMult, priority = 4}; { frames = {1,2}; custom = function(self) self:executeSound('lightWhiff', {"sfx", "whiff"}) end }; { frames = {1,2}; custom = function(self) -- self:recordMove() end }; { type ="active"; frames = {2,2,3,2}; }; { type ="recovery"; frames = {4,3}; }; }; standB = { attackbox = {pushback=60 * gameLogicMult, pushUp = 225 * gameLogicMult, hitStun=16, width=47 * gameLogicMult, height=14 * gameLogicMult, relativeY = 15 * gameLogicMult, dmg=1, priority = 3}; { --hitStun=16 pushback=220 pushUp = 240 frames = {1,2}; --1,7 custom = function(self) self:executeSound('saw', {"sfx", "whiff"}) end }; { frames = {2,2,3,2,4,1}; --1,7 custom = function(self) -- self:recordMove() end }; { type = "active"; frames = {5,2,6,2,7,2,8,2}; --2,2,3,2,4,2,5,4 }; -- { -- type = "active"; -- frames = {7,2,8,2,8,2,8,2}; -- custom = function(self) -- self.attacking = true -- self.attackbox.exists = true -- -- self.attackbox.relativeY = self.attackbox.relativeY - 10 -- -- self.attackbox.height = self.attackbox.height + 10 -- self.attackbox.pushUp = 530 -- self.attackbox.pushback = 150 -- self.attackbox.hitStun = 12 -- end -- }; { type = "recovery"; frames = {12,1,12,2,13,3,14,5,15,5}; --12,1,12,2,13,3,14,3,15,4 }; }; lowA = { attackbox = {pushback=133 * gameLogicMult, hitStun=16, width=30 * gameLogicMult, height=16 * gameLogicMult, dmg=1, relativeY=20 * gameLogicMult, explosionX = 20, explosionY = 2, priority = 4}; { frames = {1,7}; custom = function(self) self:executeSound('mediumWhiff', {"sfx", "whiff"}) end }; { type = "active"; frames = {2,2}; }; { type = "active"; frames = {3,2}; custom = function(self) self.attackbox.width = self.attackbox.width + 30 end }; { type = "active"; frames = {4,1}; custom = function(self) self.attackbox.width = self.attackbox.width + 30 end }; { type = "active"; frames = {5,6}; custom = function(self) self.attackbox.width = self.attackbox.width + 30 end }; { type = "recovery"; frames = {6,3,7,3,8,3,9,2,10,1}; --6,3,7,3,8,3 }; }; lowB = { attackbox = {pushUp = 300, pushback=100 * gameLogicMult, hitStun=12, width= 18 * gameLogicMult, height = 28 * gameLogicMult, dmg=1, relativeX = 10 * gameLogicMult, relativeY= 8 * gameLogicMult, explosionX = -10 - (4 * gameLogicMult), explosionY = -20, priority = 3, ignoreCornerPush = true}; { frames = {1,4,2,2,3,2}; --1,6,2,2 custom = function(self) self:executeSound('saw', {"sfx", "whiff"}) end }; { type = "active"; frames = {4,2,5,3}; --3,1,4,1,5,2 custom = function(self) self:executeEffect("drillSmall") end }; { frames = {4,2,5,3,4,2}; --6,1,7,1,8,2,9,2 custom = function(self) self:executeSound('saw', {"sfx", "whiff"}) self.attacking = true self.attackbox.exists = true local effect = self:executeEffect("drillBig") if self.flip == 1 and ((self.x + self.width) > stageWidth - (40 * gameLogicMult) - self.width) then self.attackbox.x = stageWidth - (40 * gameLogicMult) + self.width self.attackbox.relativeX = nil effect.x = stageWidth - (40 * gameLogicMult) + self.width - 10 effect.followPlayer = false -- self.attackbox.relativeX = self.attackbox.relativeX + elseif self.flip == -1 and self.x < (40 * gameLogicMult) + self.width then self.attackbox.x = 40 * gameLogicMult - self.width*2 self.attackbox.relativeX = nil effect.x = 40 * gameLogicMult - self.width + 10 effect.followPlayer = false else self.attackbox.relativeX = self.attackbox.relativeX + 54 effect.relativeX = effect.relativeX + 60 -- effect.x = effect.x + 60 end self.attackbox.relativeY = self.attackbox.relativeY - 38 self.attackbox.height = self.attackbox.height + 38 self.attackbox.pushUp = 375 --400 self.attackbox.pushback = 55 * gameLogicMult end }; { type = "recovery"; frames = {3,2,3,2,3,2,2,2,1,2,1,2,1,2,1,2}; --10,3,11,3,12,3,13,4,13,3 }; }; jumpA = { attackbox = {pushback=130 * gameLogicMult, hitStun=15, width=20 * gameLogicMult, height=15 * gameLogicMult, dmg=1, relativeY=22 * gameLogicMult, explosionX = -10 + (5 * gameLogicMult), explosionY = 5 * gameLogicMult, priority = 4, ignoreCornerPush=true}; --hitstun=16,pushback=145 { frames = {1,9}; --{1,3,2,3,3,1} custom = function(self) self:executeSound('mediumWhiff', {"sfx", "whiff"}) end }; { type = "active"; frames = {2,2}; }; { frames = {3,1}; custom = function(self) self.attackbox.relativeY = self.attackbox.relativeY + 26 self.attackbox.relativeX = self.attackbox.relativeX + 30 end }; { frames = {4,1,5,6}; custom = function(self) self.attackbox.relativeY = self.attackbox.relativeY + 26 self.attackbox.relativeX = self.attackbox.relativeX + 70 end }; { type = "recovery"; frames = {6,1,7,2,8,2,9,2}; --2,4,1,16 }; endWith = function(self) self:executeAnimation("jumpUp", { frames={8,3,9,3,10,24}; }); end }; jumpB = { attackbox = {pushback=44 * gameLogicMult, hitStun=18, width=40 * gameLogicMult, height=60 * gameLogicMult, dmg=1, relativeX= (-30 * gameLogicMult), relativeY=-22 * gameLogicMult, explosionX = -20 * gameLogicMult,explosionY = 60, priority = 3, ignoreCornerPush=true}; --pushback=66 * gameLogicMult hitstun=23 { --hitstun=22 frames = {1,2,2,4,3,2,4,2}; custom = function(self) self:executeSound('mediumWhiff', {"sfx", "whiff"}) end }; { type = "active"; frames = {5,6}; --4,5,5,5,4,5,5,5,4,5 }; { type = "recovery"; frames = {6,3,7,2,8,2}; }; endWith = function(self) self:executeAnimation("jumpUp", { frames={8,3,9,3,10,24}; }); end }; downForwardA = { { frames = {1,2,2,4,3,2,4,2,5,2,6,2,7,2,8,2,9,1,10,1,11,1}; custom = function(self) self:killProjectileViaTag("medusa") self:executeSound('parryWhiff', {"sfx", "whiff"}) end }; { type = "recovery"; frames = {12,5,13,5,14,5,15,5}; --12,5,13,3,14,5,15,5 custom = function(self) self:recordMove() self:executeProjectile("medusa") end }; }; -- downForwardB = { -- { -- frames = {1,2,2,3,3,2,4,1,5,1,4,1,5,1,6,1,7,1,8,1,9,1}; -- custom = function(self) -- self:killProjectileViaTag("cannon") -- end -- }; -- { -- type = "recovery"; -- frames = {10,3,11,3,12,7,13,2,14,2,15,1,16,1,17,1,18,5}; --18,1 -- custom = function(self) -- self:executeProjectile("cannonball") -- end -- }; -- }; -- downBackB = { -- { -- frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2}; -- custom = function(self) -- self:executeEffect("downBackBStartupHead") -- self.invulnerability = true -- end -- }; -- { -- type = "recovery"; -- frames = {13,2,14,2,15,2,16,2,17,2,18,2,19,5}; -- custom = function(self) -- self.invulnerability = false -- end -- }; -- }; downForwardB = { spriteName = "downBackB"; { frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2}; --5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2 custom = function(self) self:executeSound('orbDelay', {"sfx", "turd"}) end }; { type = "recovery"; frames = {15,2,16,2,17,2,18,2,19,5}; custom = function(self) TEsound.stop("turd") self:recordMove() self:executeProjectile("downBackBHeadNoAttackbox") self:executeSound('launch', {"sfx"}) end }; }; downBackB = { spriteName = "downForwardB"; { frames = {1,1,2,1,3,1,4,1,5,1,6,1,9,1}; custom = function(self) self.invulnerability = true self:killProjectileViaTag("cannon") end }; { type = "recovery"; frames = {10,3,11,5}; --18,1 custom = function(self) self:recordMove() self:executeProjectile("cannonballTwo") self:executeSound('cannon', {"sfx"}) end }; { frames = {12,7,13,3,14,3,15,2,16,2,17,2,18,5}; --18,1 custom = function(self) self.invulnerability = false end }; }; neutralAB = { frameData = Template:Type="recovery", frameCount=5; -- { -- frames = {1,40}; -- custom = function(self) -- self:startTrails("super") -- -- self:executeSound("tenchiSuperRumble", {"sfx", "whiff"}) -- self.invulnerability = true -- self.ignoreInvulnOutline = true -- self.requestSS = true -- -- self:addFrameTime(6,0,37) -- -- self:flushBar() -- -- self:setFrameBar(Template:Type="recovery", frameCount=3) -- self:emptyMeter() -- end; -- }; { spriteName = "idle"; frames = {1,5}; custom = function(self) self:setFlicker(self.colors["alt" .. self.colorNum].meterIcon[1][1]*255,self.colors["alt" .. self.colorNum].meterIcon[1][2]*255,self.colors["alt" .. self.colorNum].meterIcon[1][3]*255,4, true) self:emptyMeter() self:superStopContinue() self.invulnerability = false self.ignoreInvulnOutline = false self.clone.x = self.previousX self.clone.y = self.previousY self.clone.flip = self.previousFlip self.clone.exists = true self.clone.ySpeed = self.previousYSpeed self.clone.xSpeed = self.previousXSpeed self.clone:executeMove(self.previousMove) self.previousX = nil self:killProjectileViaTag("wisp") self:stopTrails() -- local effect = self:findEffect("wisp") -- if effect then effect.exists = false end end; }; -- frames = {} }; downBackA = { { frames = {1,2,2,2,3,1,4,1,5,1,6,2,7,2,8,2,10,1,12,2}; --1,9 custom = function(self) self:executeSound('jump', {"sfx", "whiff"}) end }; { type = "recovery"; frames = {13,3,14,4,15,4,16,3,17,3,18,3}; --13,4,14,4,15,4,16,4,17,4,18,4 custom = function(self) self:executeProjectile("floorchomp") self:recordMove() -- if self.enemy.flip == 1 then -- self:executeProjectile("floorchomp", self.enemy.x + self.enemy.width - 40) -- else -- local projectile = self:executeProjectile("floorchomp", self.enemy.x + 40) -- projectile.x = projectile.x - projectile.width -- end end }; }; dashForward = { spriteName = "dashForward"; endWith = function(self) self:executeAnimation("teleporting") self.runCancel = true self.attacking = false end; { frames = {1,2,2,2,3,2,4,1}; custom = function(self) self.attacking = false self:executeProjectile("teleportBody") end; }; }; teleportRecovery = { spriteName = "dashRecovery"; endWith = function(self) self:changeSpeed(0) self:endAttack() self.noInput = false end; { type="recovery"; frames = {1,2,2,2,3,3,4,3,5,3}; --1,2,2,2,3,2,4,2,5,2 custom = function(self) self:executeSound('jump', {"sfx"}) end; }; }; dashBack = { endWith = function(self) self:executeAnimation("teleportingBack") self.runCancel = true self.attacking = false end; { frames = {1,2,2,2,3,2,4,1}; custom = function(self) self.attacking = false self:executeProjectile("teleportBackBody") -- self.flip = -self.flip end; }; }; }; animations = { idle = { { frames = {9,7}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {10,7}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {11,7,12,5,1,7}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {2,7}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {3,7}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {4,7}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {5,7,6,7,7,5}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {8,7}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {20,5,21,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {22,7}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {23,7}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {24,7,13,5,14,7}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {15,7}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {16,5,17,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {18,7}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {19,7}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {20,7}; custom = function(self) self.yOffset = self.yOffset -1 end }; }; walkForward = { { frames = {1,3,2,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {3,3,4,3}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {5,3,6,3}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {7,3,8,3}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {1,3,2,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {3,3,4,3}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {5,3,6,3}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {7,3,8,3}; custom = function(self) self.yOffset = self.yOffset -3 end }; }; walkBack = { { frames = {1,3,2,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {3,3,4,3}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {5,3,6,3}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {7,3,8,3}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {1,3,2,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {3,3,4,3}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {5,3,6,3}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {7,3,8,3}; custom = function(self) self.yOffset = self.yOffset -3 end }; }; teleporting = { spriteName = "dashForward"; frames = {4,1,5,2,6,2,1,2,2,2,3,2,4,1}; endWith = "loop"; }; teleportingBack = { spriteName = "dashBack"; frames = {4,1,5,2,6,2,1,2,2,2,3,2,4,1}; endWith = "loop"; }; crouchTransition = { frames = {1,3,2,2,3,2}; }; standTransition = { spriteName = "crouchTransition"; frames = {4,3}; custom = function(self) self.yOffset = self.yOffset +16 end }; crouch = { { frames = {10,8}; custom = function(self) self.yOffset = self.yOffset -2 self:executeEffect("crouchEffect") end }; { frames = {1,8}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {2,8}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {3,8}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {4,3}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {5,5}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {6,8}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {7,8}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {8,3}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {9,5}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {11,8}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {12,8}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {13,8}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {14,8}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {15,8}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {16,8}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {17,8}; custom = function(self) self.yOffset = self.yOffset -3 end }; }; jumpUp = { frames={2,3,3,3,4,5,5,3,6,3,7,3,8,3,9,3,10,3,11,5,12,8}; }; jumpForward = { spriteName = "jumpUp"; frames={2,3,3,3,4,3,5,3,6,3,7,3,8,5,9,3,10,3,11,3,12,8}; }; jumpBack = { spriteName = "jumpUp"; frames={2,3,3,3,4,3,5,3,6,3,7,3,8,5,9,3,10,3,11,3,12,8}; }; land = { spriteName = "jumpUp"; frames = {13,3,14,5,15,4}; }; airHurt = { endWith = "nothing"; { frames = {1,1,2,2,3,2,4,2}; }; { spriteName = "jumpUp"; frames = {3,2,4,3,5,3,6,3,7,3,8,4,9,4,10,3,11,3}; }; }; turn = { frames = {1,2,2,2,3,3}; }; crouchTurn = { frames = {1,2,2,2,3,3}; }; tech = { frames={1,4,2,4,3,4,4,4,5,4}; }; preBlock={ spriteName="blockStand"; endWith = "nothing"; frames = {1,1,2,1,3,1}; }; preBlockReverse={ spriteName="blockStand"; frames = {2,1,1,2}; }; preBlockCrouch={ endWith = "nothing"; spriteName="blockCrouch"; frames={1,2,2,1}; }; preBlockCrouchReverse={ spriteName="blockCrouch"; frames={1,2}; }; knockdown = { endWith = "nothing"; frames = {1,6,2,3,3,3,4,3,5,3,6,3}; --1,6,2,3,3,2,4,2,5,2,6,2,7,2,8,2 }; chipDeath = { endWith = "nothing"; { frames={1,3,2,3}; custom=function(self) self.enemy:drawFirst() end }; { frames={3,3,4,3,5,3,6,3}; custom = function(self) self:executeSound("chipDeath", {"sfx"}) end }; { frames={7,3}; custom = function(self) self:executeSound("chipDeath", {"sfx"}) end }; { frames={8,1}; custom = function(self) koFinish = true end }; }; impact = { spriteName = "knockdown"; frames = {7,3} }; startGroundBounce = { spriteName = "knockdown"; frames = {7,3,8,5,9,5} }; stopGroundBounce = { spriteName = "knockdown"; frames = {9,2,10,3,11,7} }; wakeup = { spriteName = "knockdown"; frames = {12,1,13,2,14,1,15,2,16,1,17,1,18,2} }; death = { spriteName = "knockdown"; endWith = "nothing"; frames = {11,1} }; zombie = { endWith = "nothing"; frames={1,3,2,3,3,3,4,3,5,6,6,3,7,3,8,3,9,3,10,6,11,3,12,3,13,3,14,6,15,3,16,3,17,3,18,3,19,6,20,3,21,3,22,3,23,3,24,3,25,3,26,99}; }; yay = { { spriteName = "dashRecovery"; frames = {2,1,3,1}; }; { spriteName = "turn"; frames = {2,3,3,3}; }; { spriteName = "idle"; frames = {21,2,22,2,23,2,24,2,20,4}; custom = function(self) self.yOffset = self.yOffset -2 if love.math.random(1,4) > 3 then self.yayTimer = 210 elseif love.math.random(1,4) > 3 then self.yayTimer = 30 else self.yayTimer = 90 end end }; { frames = {10,7}; custom = function(self) self.yOffset = self.yOffset -3 end }; { spriteName = "turn"; frames = {3,3,2,3}; }; { spriteName = "dashRecovery"; frames = {2,1,3,1}; }; { custom = function(self) if self.enemy.identity == "june" then self:executeAnimation("yay") self.storedSprites = self.sprites self.storedMoves = self.moves self.storedShader = self.shaders.sprite self.sprites = self.sprites self.moves = self.moves self.shaders.sprite = self.shaders.sprite self.glitchImage = true else self.storedSprites = self.sprites self.storedMoves = self.moves self.storedShader = self.shaders.sprite self.sprites = self.enemy.sprites self.moves = self.enemy.moves self.shaders.sprite = self.enemy.shaders.sprite self.glitchImage = true end end }; }; boo = { frames = {1,18,2,4,3,8,4,4,5,4,6,4,7,8,8,4,9,4,10,4,11,2,12,2,13,2,14,2,15,2,16,2}; endWith = function(self) self:executeAnimation("booLoop") end }; booLoop = { { frames = {1,4,2,3}; custom = function(self) self.yOffset = self.yOffset - 0 end }; { frames = {2,1,3,4,4,2}; custom = function(self) self.yOffset = self.yOffset - 1 end }; { frames = {5,2,6,5}; custom = function(self) self.yOffset = self.yOffset - 2 end }; { frames = {6,7}; custom = function(self) self.yOffset = self.yOffset - 3 end }; { frames = {6,7}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {6,7}; custom = function(self) self.yOffset = self.yOffset -5 end }; { frames = {6,4,7,2,8,1}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {8,1,9,4,10,2}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {10,2,11,4,12,1}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {12,3,13,4}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {14,4}; custom = function(self) self.yOffset = self.yOffset -0 end } }; win = { { frames = {1,4,2,4,3,4,4,4}; custom = function(self) self:drawFirst() self:executeSound("teleporting", {"sfx", "turd"}) end }; { frames = {5,4,6,4,7,4,8,4}; custom = function(self) TEsound.stop("turd") self:executeSound("jump", {"sfx"}) self:drawFirst() self.ignoreCollision = true self:executeEffect('dashDisappear') if self.flip == 1 then self.x = self.enemy.x - 40 - self.width else self.x = self.enemy.x + 40 + self.enemy.width end self:changeSpeed(320) end }; { frames = {9,4,10,4,11,4}; custom = function(self) self:changeSpeed(0) end }; { frames = {-1,300}; custom = function(self) self.enemy:executeAnimation("zombie") end }; }; }; throw = { enemyFrames = { {20,7,-11}, --f1 {20,0,-11}, --f2 {20,-8,-11}, --f3 {20,-15,-11}, --f4 {21,-16,-12}, --f5 {22,-16,-12}, --f6 {23,-15,-16}, --f7 {23,-19,-24}, --f8 {24,-17,-37}, --f9 {25,-17,-47}, --f10 {25,-17,-52}, --f11 {26,-17,-34}, --f12 {26,-17,-17}, --f13 {26,-17,-7}, --f14 {27,-15,-4}, --f15 {26,-17,-7}, --f16 {28,-17,-19}, --f17 {25,-18,-36}, --f18 {24,-18,-45}, --f19 {25,-18,-36}, --f20 {28,-17,-19}, --f21 {26,-17,-7}, --f22 {27,-15,-4}, --f23 {30,-15,-7}, --f24 {26,-18,-13}, --f25 {28,-16,-19}, --f26 {25,-18,-24}, --f27 {24,-20,-30}, --f28 {23,-15,-36}, --f29 {29,-18,-38}, --f30 {29,-19,-39}, --f31 {23,-18,-39}, --f32 {24,-13,-36}, --f33 {26,-17,-25}, --f34 {26,-17,-7}, --f35 {27,-18,-4}, --f36 {30,-18,-7}, --f37 {0,0,0}, --f38 {0,0,0}, --f39 {0,0,0}, --f40 {0,0,0}, --f41 {0,0,0}, --f42 {0,0,0}, --f43 }; start = { {frames = {1,3}}; { frames = {2,3}; custom = function(self) --June moves 7 pixels to the right self:changeLocation(7 * gameLogicMult) end }; { frames = {3,3}; custom = function(self) --June moves 8 pixels to the right self:changeLocation(8 * gameLogicMult) end }; { frames = {4,2,5,1,6,3,7,2,8,2}; custom = function(self) --June moves 7 pixels to the right self:changeLocation(7 * gameLogicMult) end }; { frames = {8,2}; custom = function(self) --June moves 5 pixels to the right self:changeLocation(5 * gameLogicMult) self:executeSound("grab", {"sfx", "whiff"}) end }; { frames = {9,2,10,2,11,3}; custom = function(self) --June moves 5 pixels to the right self:changeLocation(5 * gameLogicMult) end }; { frames = {12,1,13,1,14,1}; custom = function(self) --June moves 4 pixels to the right self:changeLocation(4 * gameLogicMult) end }; { frames = {15,1,16,3}; custom = function(self) self:throwHitstop(8, 38, -300) cameraJitterY = 4 self.combo = self.combo + 1 self.enemy:changeHealth(1) self:executeSound(self.hitSpecialSFX, "sfx") self.enemy:executeKnockdownEffect(70) end }; }; forward = { { frames = {17,1,18,1,19,8,20,1,21,1,22,1}; custom = function(self) self:executeSound("grab", {"sfx", "whiff"}) end }; { frames = {23,1,24,1}; custom = function(self) self.combo = self.combo + 1 self.enemy:changeHealth(1) self:executeSound(self.hitSpecialSFX, "sfx") self:throwHitstop(8, 38, -300) cameraJitterY = 4 self.enemy:executeKnockdownEffect(70) end }; { frames = {38,2,39,2,40,2,41,2,42,2}; custom = function(self) --June moves 3 pixels to the right + thrown person should do their knockdown with some x momentum self.enemy:changeLocation(50) self.enemy:changeSpeed(300) self.enemy.ySpeed = -200 self.enemy.y = self.enemy.y + 10 self.enemy.ignoreGravity = false self.enemy:knockFall(true) self:changeLocation(-3) self.ignoreFloor = false self.enemy.ignoreFloor = false end }; }; backward = { --FROM THE MOMENT THINGS FLIP ONWARD, everything might be a little weird by like 1 pixel? --I don't know if it's the offsets that will be weird or June's location --It might not do anything noticeable at all since it's one pixel --But June's throw sheet goes 10 pixels past her box one one side and 11 pixels on the other --And when she flips, in my PSD with offsets I didn't assume the sprite's bounds would move as a result --But does it like move one pixel or something because the flip is relative to the hurtbox? idk { frames = {25,1}; }; { frames = {26,1}; custom = function(self) --June moves 8 pixels to the left self:changeLocation(-8 * gameLogicMult) end }; { frames = {27,1,28,1}; custom = function(self) --June moves 2 pixels to the left self:changeLocation(-2 * gameLogicMult) end }; { frames = {29,1,30,1}; custom = function(self)--June moves 10 pixels to the left self:changeLocation(-10 * gameLogicMult) end }; { frames = {31,3}; custom = function(self) --EVERYTHING'S FLIPPED FROM HERE ON, June moves 3 pixels to the left self.flip = -self.flip self.faceRight = not self.faceRight self.enemy.flip = -self.enemy.flip self:changeLocation(3 * gameLogicMult) self:executeSound("grab", {"sfx", "whiff"}) end }; { frames = {32,1}; custom = function(self) --June moves 6 pixels to the left self:changeLocation(6 * gameLogicMult) end }; { frames = {33,1}; custom = function(self) --June moves 9 pixels to the left self:changeLocation(9 * gameLogicMult) end }; { frames = {34,1,35,1}; custom = function(self) --June moves 2 pixels to the left self:changeLocation(2 * gameLogicMult) end }; { frames = {36,1,37,1}; --this is where the hit happens custom = function(self) self.combo = self.combo + 1 self.enemy:changeHealth(1) self:executeSound(self.hitSpecialSFX, "sfx") self:throwHitstop(8, 38, -300) self.enemy:executeKnockdownEffect(70) cameraJitterY = 4 end }; { frames = {38,1,39,2,40,2,41,2,42,2}; custom = function(self) --June moves 2 pixels to the left self.enemy:changeSpeed(-300) -- self.enemy.flip = -self.enemy.flip self:changeLocation(-2 * gameLogicMult) self.enemy:changeLocation(25 * gameLogicMult) self.enemy.ySpeed = -200 self.enemy.y = self.enemy.y + 17 self.enemy.ignoreGravity = false self.ignoreCollision = false self.enemy:knockFall(true) self.ignoreFloor = false self.enemy.ignoreFloor = false end }; }; }; effects = { hitEffect = { frames = {1,2,2,2,3,1,4,1,5,1,6,2,7,2,8,1,9,1}; --1,1,2,1,3,2,4,3,5,2 }; dashDisappear = { frames = {1,1,2,1,3,1,4,1}; relativeX = -20; relativeY = -2; }; teleportBody = { spriteName = "dashForwardEffect"; frames = {1,2,2,2,-1,2,1,2,2,2,-1,2,3,2,4,2,-1,2}; -- xSpeed = 400; relativeX = -standWidth/2; relativeY = -2; endWith = "loop"; layer = "top"; destroyWhenPlayerHurt = true; -- onUpdate = function(self, host) -- if host.move.name ~= "teleporting" and host.move.name ~= "dashForward" then -- self.exists = false -- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip) -- end -- end; }; teleportBackBody = { spriteName = "dashBackEffect"; frames = {1,2,2,2,-1,2,1,2,2,2,-1,2,3,2,4,2,-1,2}; -- xSpeed = -400; relativeX = -standWidth/2 + 6; relativeY = -2; endWith = "loop"; layer = "top"; destroyWhenPlayerHurt = true; -- onUpdate = function(self, host) -- if host.move.name ~= "dashBack" and host.move.name ~= "teleportingBack" then -- self.exists = false -- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip) -- end -- end; }; teleportBodyDeath = { spriteName = "turn"; frames = {2,4}; }; drillSmall = { frames = {1,2,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1}; relativeX = 29 * gameLogicMult; relativeY = 5 * gameLogicMult; ignoreHitstop = false; followPlayer = true; ignoreFollowY = true; onUpdate = function(self, host) if host.move.name ~= "lowB" then self.exists = false host:executeEffect("drillSmallDeath", self.x, self.y, self.flip) end end; endWith = function(self, host) self.exists = false host:executeEffect("drillSmallDeath", self.x, self.y, self.flip) end }; drillSmallDeath = { spriteName = "drillSmall"; relativeX = 4 * gameLogicMult; frames = {6,3}; }; drillSmallHitstop = { spriteName = "drillSmall"; -- ignoreHitstop = true; frames = {2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3}; }; drillBigHitstop = { spriteName = "drillBig"; -- ignoreHitstop = true; frames = {2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3}; }; floorchomp = { spriteName = "downBackAEffect"; frames = {1,1,2,1,3,2,4,2,5,10,6,2,7,2,8,2}; relativeX = -14; -- -14 relativeY = -38; -- -38 }; drillBig = { frames = {1,2,2,1,3,1,4,1,5,1,2,1,3,1,4,1,5,1,6,3}; relativeX = 51 * gameLogicMult - 60; relativeY = -15 * gameLogicMult; ignoreHitstop = false; followPlayer = true; ignoreFollowY = true; onUpdate = function(self, host) if host.move.name ~= "lowB" then self.exists = false host:executeEffect("drillBigDeath", self.x, self.y, self.flip) end end; }; drillBigDeath = { spriteName = "drillBig"; frames = {6,3}; }; medusa = { frames = {1,3,2,3,3,3,4,3}; relativeX = -11 * gameLogicMult; relativeY = -8 * gameLogicMult; }; medusaDestroy = { frames = {1,2,2,2,3,2}; relativeX = -11 * gameLogicMult; relativeY = -8 * gameLogicMult; }; cannonball = { relativeX = -11 * gameLogicMult; -- -11 4 relativeY = -6 * gameLogicMult; -- -6 ignoreHitstop = false; { frames = {1,2,2,2,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2}; }; -- { -- frames = {3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2}; -- }; -- { -- frames = {11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2}; -- }; }; cannonballTwo = { spriteName="cannonball"; relativeX = -10 * gameLogicMult; -- -11 4 relativeY = -6 * gameLogicMult; -- -6 ignoreHitstop = false; { frames = {1,2,2,2,1,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2}; }; -- { -- frames = {3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,3,2,4,2,5,2,6,2}; -- }; -- { -- frames = {11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2,11,2,12,2}; -- }; }; crouchEffect = { relativeX = -11 * gameLogicMult; relativeY = 35 * gameLogicMult; frames = {1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8}; layer = "top"; endWith = "loop"; followPlayer = true; onUpdate = function(self, host) if host.move.name ~= "crouch" then self.exists = false end end; }; cannonballSplat = { frames = {1,2,2,1,3,1,4,1,5,2,6,2,7,2,8,2}; relativeX = -9 * gameLogicMult; relativeY = -1 * gameLogicMult; }; cannonballDestroyUp = { spriteName = "cannonballDestroy"; frames = {1,2,2,2,3,2}; relativeX = -11 * gameLogicMult; relativeY = -6 * gameLogicMult; }; cannonballDestroySpin = { spriteName = "cannonballDestroy"; frames = {4,2,5,2,6,2}; relativeX = -11 * gameLogicMult; relativeY = -6 * gameLogicMult; }; cannonballDestroyDown = { spriteName = "cannonballDestroy"; frames = {7,2,8,2,9,2}; relativeX = -11 * gameLogicMult; relativeY = -6 * gameLogicMult; }; downBackBStartupHead = { relativeX = -11 * gameLogicMult; relativeY = -13 * gameLogicMult; layer = "bottom"; ignoreHitstop = false; followPlayer = true; { frames = {5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2}; }; { spriteName = "downBackBHead"; frames = {1,3}; custom = function(self) self.followPlayer = false; self.y = self.y - 20 * gameLogicMult; end }; { -- spriteName = "downBackBHead"; -- frames = {2,3,3,3,4,3,5,3,6,3,7,3,8,3}; custom = function(self, host) if self.flip == 1 then host:executeProjectile("downBackBHeadNoAttackbox", self.x + 6, self.y+68) else host:executeProjectile("downBackBHeadNoAttackbox", self.x - 6 - (50*gameLogicMult), self.y+68, -1) end self.exists = false -- host:executeProjectile("downBackBHeadNoAttackbox") -- self.layer = "top"; -- self.xSpeed = 190; -- self.ySpeed = -180 * gameLogicMult; -- self.gravity = 10 * gameLogicMult; end }; -- { -- custom = function(self, host) -- if self.flip == 1 then -- host:executeProjectile("downBackBHead", self.x + 6, self.y+70) -- else -- host:executeProjectile("downBackBHead", self.x - 6 - (50*gameLogicMult), self.y+70, -1) -- -- host:executeProjectile("downBackBHead", host.x + host.width - (50*gameLogicMult), self.y, -1) example of making it work properly if it's host.x -- end -- self.exists = false -- end -- }; }; downBackBHeadNoAttackbox = { relativeX = -3 * gameLogicMult; relativeY = -37 * gameLogicMult; ignoreHitstop = false; spriteName = "downBackBHead"; endWith = "destroy"; -- { frames = {2,3,3,3,4,3,5,3,6,3,7,3,8,5}; -- }; -- { -- custom = function(self, host) -- if self.flip == 1 then -- host:executeProjectile("downBackBHead", self.x + 6, self.y+70) -- else -- host:executeProjectile("downBackBHead", self.x - 6 - (50*gameLogicMult), self.y+70, -1) -- end -- self.exists = false -- end -- }; }; downBackBHead = { relativeX = -3 * gameLogicMult; relativeY = -37 * gameLogicMult; ignoreHitstop = false; { frames = {9,2,10,2,11,2,12,2}; }; }; downBackBHeadDestroy = { relativeX = -3 * gameLogicMult; relativeY = -37 * gameLogicMult; spriteName = "downBackBHead"; frames = {13,2,14,2}; }; soul = { frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10,2,11,2,12,2,13,2}; -- frames = {1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,3}; }; soulDestroy = { spriteName = "soul"; frames = {10,3,11,3,12,3,13,3}; }; soulObsorb = { spriteName = "soul"; frames = {10,9}; }; -- idleHair = { -- frames = {4,14,1,26,2,14,3,27}; --3,81 -- relativeX = -24; -- relativeY = -2; -- followPlayer = true; -- layer = "bottom"; -- }; wisp = { layer = "bottom"; relativeX = -11 * gameLogicMult; relativeY = -2 * gameLogicMult; endWith = "loop"; { frames = {9,2,21,2,33,2,9,1}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {10,1,22,2,34,2,10,2}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {23,2,35,2,11,2,23,1,24,1,36,2,12,2,13,2,25,2,1,2,13,1}; custom = function(self) self.yOffset = self.yOffset -4 end }; { frames = {14,1,26,2,2,2,14,2}; custom = function(self) self.yOffset = self.yOffset -3 end }; { frames = {27,2,3,2,15,2,27,1}; custom = function(self) self.yOffset = self.yOffset -2 end }; { frames = {28,1,4,2,16,2,28,2}; custom = function(self) self.yOffset = self.yOffset -1 end }; { frames = {5,2,17,2,29,2,5,1,6,1,18,2,30,2,6,2,19,2,31,2,7,1}; custom = function(self) self.yOffset = self.yOffset -0 end }; { frames = {8,1,20,2,32,2,8,2}; custom = function(self) self.yOffset = self.yOffset -1 end }; }; nameplateLoop = { spriteName = "nameplate"; frames = {83,6,84,1,85,1,86,1,87,1,88,1,89,1,90,6,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,5,99,1,98,6,101,1,102,1,101,1,98,13,102,1,98,12,99,1,98,1,99,1,98,8,99,1,98,8,99,1,98,4,99,1,100,1,101,1,102,1}; endWith = "loop"; }; nameplate = { frames = {1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39,1,40,1,41,1,43,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1}; custom = function(self, host) if host.player1 == true then host:executeSound("nameplate", {"sfx", "nameplate1"}, -1) else host:executeSound("nameplate", {"sfx", "nameplate2"}, 1) end end; endWith = function(self, host) --replace "wisp" with your looping nameplate thing if host.player1 == true then host:executeEffect("nameplateLoop", 7 * gameLogicMult, 78 * gameLogicMult) else host:executeEffect("nameplateLoop", 152 *gameLogicMult, 17 *gameLogicMult, 1) end self.exists = false end; }; }; projectiles = { wisp = { width = 8 * gameLogicMult; height = 5 * gameLogicMult; deathTag = "wisp"; noAttackbox = true; onLeaveScreen = function(self) self.host.neutralABRequirement = false self.host.previousMove = nil self.host.previousFlip = nil self.host.previousX = nil self.host.previousY = nil self.host.previousYSpeed = nil self.host.previousXSpeed = nil self:destroy() end; }; soul = { destroyEffect = "soulDestroy"; relativeX = 0 * gameLogicMult; relativeY = -9 * gameLogicMult; -- explosionX = -12 * gameLogicMult; width = 17 * gameLogicMult; height = 20 * gameLogicMult; ySpeed = -300; decay = 20; hitstop = 10; lifetime = 90; noAttackbox = true; onHostCollide = function(self) self.host:changeMeter(1) self.host:executeSound("soulGet", "sfx") self:destroy("soulObsorb") end; }; medusa = { destroyEffect = "medusaDestroy"; sfx = "medusa"; xSpeed = 200; --default 350 relativeX = 0*gameLogicMult; relativeY = -9*gameLogicMult; hitStun = 20; --22 pushback = 250; explosionX = 2 * gameLogicMult; width = 17 * gameLogicMult; height = 20 * gameLogicMult; hitstop = 10; priority = 2; shape = "sin"; deathTag = "medusa"; -- ifMultiple = function(self, host, otherProjectile) -- otherProjectile:destroy() -- end; }; floorchomp = { sfx = "rush"; dontKillSFX = true; relativeX = 24 * gameLogicMult; relativeY = 40 * gameLogicMult; -- 40 width = 50 * gameLogicMult; height = 12 * gameLogicMult; -- 12 explosionX = -25 * gameLogicMult; explosionY = -20 * gameLogicMult; -- knockFall = 200; pushUp = 540; --600 hitStun = 19; pushback = 40; lifetime = 5; dontKillEffect = true; stayOnScreen = true; attacktype = attackTypes.low; }; downBackBHead = { -- relativeX = 0 * gameLogicMult; -- relativeY = 70 * gameLogicMult; sfx = "heavyWhiff"; dontKillSFX = true; destroyEffect = "downBackBHeadDestroy"; width = 50 * gameLogicMult; height = 15 * gameLogicMult; explosionX = -22 * gameLogicMult; -- explosionY = -20 * gameLogicMult; pushUp = -800; hitStun = 20; pushback = 40; lifetime = 10; lifetimeIgnoreHitstop = true; cornerStop = true; xSpeed = 0; ySpeed = 700; ignoreHitstop = false; attacktype = attackTypes.high; -- decay = 20; }; downBackBHeadNoAttackbox = { relativeX = -11 * gameLogicMult + 6; relativeY = 0; width = 50 * gameLogicMult; height = 12 * gameLogicMult; xSpeed = 180 * gameLogicMult; --190 * gamelogicMult ySpeed = -180 * gameLogicMult; -- gravity = 10 * gameLogicMult; decay = 10 * gameLogicMult; lifetime = 22; noAttackbox = true; cornerStop = true; onDestroy = function(self, host) if self.flip == 1 then host:executeProjectile("downBackBHead", self.x, self.y) --70 else host:executeProjectile("downBackBHead", self.x, self.y, -1) --70 --+ (50*gameLogicMult) end self.exists = false self.liveEffect.exists = false -- self.liveEffect.endWith = "destroy" end }; cannonball = { -- destroyEffect = "cannonballSplat"; xSpeed = 150 * gameLogicMult; -- 120 * gameLogicMult --170 ySpeed = -220 * gameLogicMult; -- -250 * gameLogicMult gravity = 500 * gameLogicMult; --450 * gameLogicMult relativeX = 30*gameLogicMult; relativeY = -13*gameLogicMult; decay = 20; hitStun = 25; pushback = 200; --150 pushUp = 300; lifetime = 40; --75 49 lifetimeIgnoreHitstop = true; explosionX = 2 * gameLogicMult; explosionY = 8 * gameLogicMult; width = 17 * gameLogicMult; height = 20 * gameLogicMult; hitstop = 10; priority = 2; cornerStop = true; deathTag = "cannon"; onLifetimeEnd = function(self, host) self:placeProjectileEffect("cannonballDestroySpin") self.liveEffect.endWith = "destroy" self:removeSFX() self.exists = false end; onDestroy = function(self, host) if self.liveEffect.animation.position < 6 then self:placeProjectileEffect("cannonballDestroyUp") elseif self.liveEffect.animation.position < 56 then self:placeProjectileEffect("cannonballDestroySpin") else self:placeProjectileEffect("cannonballDestroyDown") end self.liveEffect.endWith = "destroy" self:removeSFX() self.exists = false end; -- ifMultiple = function(self, host, otherProjectile) -- otherProjectile:destroy() -- end; }; cannonballTwo = { -- destroyEffect = "cannonballSplat"; sfx = 'cannonball'; xSpeed = 150 * gameLogicMult; -- 120 * gameLogicMult --170 ySpeed = -220 * gameLogicMult; -- -250 * gameLogicMult gravity = 500 * gameLogicMult; --450 * gameLogicMult relativeX = 25*gameLogicMult; relativeY = -13*gameLogicMult; decay = 20; hitStun = 25; pushback = 200; --150 pushUp = 300; lifetime = 40; --75 49 lifetimeIgnoreHitstop = true; explosionX = 2 * gameLogicMult; explosionY = 8 * gameLogicMult; width = 17 * gameLogicMult; height = 20 * gameLogicMult; hitstop = 10; priority = 2; cornerStop = true; deathTag = "cannon"; onLifetimeEnd = function(self, host) self:placeProjectileEffect("cannonballDestroySpin") self.liveEffect.endWith = "destroy" self:removeSFX() self.exists = false end; onDestroy = function(self, host) if self.liveEffect.animation.position < 6 then self:placeProjectileEffect("cannonballDestroyUp") elseif self.liveEffect.animation.position < 56 then self:placeProjectileEffect("cannonballDestroySpin") else self:placeProjectileEffect("cannonballDestroyDown") end self.liveEffect.endWith = "destroy" self:removeSFX() self.exists = false end; -- ifMultiple = function(self, host, otherProjectile) -- otherProjectile:destroy() -- end; }; teleportBody = { sfx = "teleporting"; xSpeed = 400; relativeX = 0; relativeY = 0; width = standWidth; height = standHeight; noAttackbox = true; deathTag = "teleportTag"; -- stayOnScreen = true; onEdgeTouch = function(self, host) host:endTeleport() end; onUpdate = function(self) if self.host.move.name ~= "teleporting" and self.host.move.name ~= "dashForward" then self:destroy() -- self.exists = false -- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip) end end; }; teleportBackBody = { sfx = "teleporting"; xSpeed = -400; relativeX = 0; relativeY = 0; width = standWidth; height = standHeight; noAttackbox = true; deathTag = "teleportTag"; -- stayOnScreen = true; onEdgeTouch = function(self, host) host:endTeleport() end; onUpdate = function(self) if self.host.move.name ~= "dashBack" and self.host.move.name ~= "teleportingBack" then self:destroy() -- -- self.exists = false -- -- host:executeEffect("teleportBodyDeath", self.x, self.y, self.flip) end end; }; }; colors = { default = { --blue --colors self-identified sprite = { {128,183,192}; --blue {240,255,255}; --white {213,248,255}; --skin {0,13,13}; --hair darkest {0,23,34}; {0,35,51}; {0,51,62}; {0,75,88}; {0,110,125}; {0,162,166}; {0,216,255};--hair brightest }; effects = { {128,183,192}; --blue {240,255,255}; --white {213,248,255}; --skin {0,13,13}; --hair darkest {0,23,34}; {0,35,51}; {0,51,62}; {0,75,88}; {0,110,125}; {0,162,166}; {0,216,255};--hair brightest {255,0,0}; --soul red {255,149,161}; --soul pink {128,0,0}; --wisp red }; meterIcon = { {255,0,0}; -- red {255,165,164}; --pink }; hit = {255,0,0}; --generalAssets dust = {128,183,192}; mainUI = {0,75,88}; --UIcolor health = {0,216,255}; meterChunk = { --meterOne {255,0,0}; --dark {255,69,69}; --medium {255,121,121}; --light --meterTwo {255,121,121}; --darkGreen {255,180,180}; --mediumGreen {255,228,228}; --lightestGreen }; trailSuper = { {255,0,0}; --medium hand outline {255,255,255}; --white {255,255,255}; --hand trails }; }; alt1 = { --red --colors self-identified sprite = { {247,0,0}; --blue {255,242,242}; --white {255,216,213}; --skin {25,0,0}; --hair darkest {48,0,0}; {75,0,0}; {111,0,0}; {165,0,0}; {235,0,0}; {249,38,38}; {255,70,87};--hair brightest }; effects = { {247,0,0}; --blue {255,242,242}; --white {255,216,213}; --skin {33,0,0}; --hair darkest {55,0,0}; {75,0,0}; {111,0,0}; {165,0,0}; {235,0,0}; {249,38,38}; {255,70,87};--hair brightest {67,214,247}; --soul red {117,255,239}; --soul pink {34,107,124}; --wisp red }; meterIcon = { {67,214,247}; -- red {117,255,239}; --pink }; hit = {67,214,247}; --generalAssets dust = {255,64,64}; mainUI = {113, 0, 0}; health = {255,0,0}; meterChunk = { --meterOne {16,143,255}; --darkBlue {64,174,255}; --medium blue {131,221,251}; --lightest blue --meterTwo {99,187,255}; --darkblue {164,216,255}; --medium blue {233,236,255}; --lightest blue }; trailSuper = { {67,214,247}; --medium hand outline {255,255,255}; --white {255,255,255}; --hand trails }; }; alt2 = { --orange --colors self-identified sprite = { {255,132,21}; --blue {255,251,240}; --white {255,255,179}; --skin {17,8,0}; --hair darkest {33,14,0}; {49,22,0}; {72,33,0}; {101,52,0}; {185,111,0}; {248,167,0}; {255,219,49};--hair brightest }; effects = { {255,132,21}; --blue {255,251,240}; --white {255,255,179}; --skin {17,8,0}; --hair darkest {33,14,0}; {49,22,0}; {72,33,0}; {101,52,0}; {185,111,0}; {248,167,0}; {255,219,49};--hair brightest {255,255,0}; --soul red {255,255,158}; --soul pink {127,128,0}; --wisp red }; meterIcon = { {255,255,0}; -- red {255,255,158}; --pink }; hit = {255,255,0}; --generalAssets dust = {255,164,42}; mainUI = {187, 72, 0}; health = {255,102,7}; -- trailSuper = {255, 255, 0}; -- trailDash = {255,122,0}; trailSuper = { {255,255,0}; --black {255,255,255}; --white {255,255,255}; --other }; meterChunk = { --meterOne {215,191,0}; --darkGreen {246,255,109}; --mediumGreen {255,255,255}; --lightestGreen --meterTwo {254,255,96}; --darkGreen {249,255,174}; --mediumGreen {255,255,255}; --lightestGreen }; }; alt3 = { --colors self-identified sprite = { {248,244,64}; --blue {255,255,240}; --white {253,255,205}; --skin {18,18,5}; --hair darkest {34,33,0}; {47,51,0}; {61,62,0}; {88,79,0}; {140,134,30}; {190,196,0}; {255,255,0};--hair brightest }; effects = { {248,244,64}; --blue {255,255,240}; --white {253,255,205}; --skin {18,18,5}; --hair darkest {34,33,0}; {47,51,0}; {61,62,0}; {88,79,0}; {140,134,30}; {190,196,0}; {255,255,0};--hair brightest {255,30,106}; --soul red {255,154,182}; --soul pink {128,15,53}; --wisp red }; meterIcon = { {255,30,106}; -- red {255,154,182}; --pink }; hit = {255,30,106}; --generalAssets dust = {255,255,0}; mainUI = {113, 113, 0}; health = {215,215,0}; meterChunk = { --meterOne {255,16,83}; --darkBlue {255,64,126}; --medium blue {251,131,191}; --lightest blue --meterTwo {255,100,146}; --darkblue {255,164,178}; --medium blue {255,239,233}; --lightest blue }; trailSuper = { {255,30,106}; --black {255,255,255}; --white {255,255,255}; --other }; }; alt4 = { --colors self-identified sprite = { {130,198,0}; --blue {244,255,244}; --white {214,255,182}; --skin {5,23,0}; --hair darkest {9,38,0}; {0,51,10}; {0,66,10}; {44,88,0}; {54,128,0}; {53,196,0}; {0,255,0};--hair brightest }; effects = { {130,198,0}; --blue {244,255,244}; --white {214,255,182}; --skin {5,23,0}; --hair darkest {9,38,0}; {0,51,10}; {0,66,10}; {44,88,0}; {54,128,0}; {53,196,0}; {0,255,0};--hair brightest {212,0,211}; --soul red {235,117,255}; --soul pink {106,0,106}; --wisp red }; meterIcon = { {212,0,211}; -- red {235,117,255}; --pink }; hit = {212,0,211}; --generalAssets dust = {0,255,0}; mainUI = {0, 113, 0}; health = {0,255,0}; meterChunk = { --meterOne {148,0,247}; --darkGreen {191,87,199}; --mediumGreen {240,128,240}; --lightestGreen --meterTwo {240,128,240}; --darkGreen {255,175,255}; --mediumGreen {255,228,242}; --lightestGreen }; trailSuper = { {212,0,211}; --black {255,255,255}; --white {255,255,255}; --other }; }; alt6 = { --gray --colors self-identified sprite = { {155,155,167}; --blue {247,247,247}; --white {223,223,223}; --skin {13,13,13}; --hair darkest {21,21,21}; {30,30,30}; {43,43,43}; {65,65,65}; {108,108,108}; {177,177,177}; {255,255,255};--hair brightest }; effects = { {155,155,167}; --blue {247,247,247}; --white {223,223,223}; --skin {13,13,13}; --hair darkest {21,21,21}; {30,30,30}; {43,43,43}; {65,65,65}; {108,108,108}; {177,177,177}; {255,255,255};--hair brightest {148,0,247}; --soul red {240,128,240}; --soul pink {74,0,124}; --wisp red }; meterIcon = { {148,0,247}; --soul red {240,128,240}; --soul pink }; hit = {148,0,247}; --generalAssets dust = {155,155,167}; mainUI = {64,64,64}; --UIcolor health = {155,155,167}; meterChunk = { --meterOne {148,0,247}; --darkGreen {191,87,199}; --mediumGreen {240,128,240}; --lightestGreen --meterTwo {240,128,240}; --darkGreen {255,175,255}; --mediumGreen {255,228,242}; --lightestGreen }; trailSuper = { {148,0,247}; --black {255,255,255}; --white {255,255,255}; --other }; }; alt7 = { --colors self-identified sprite = { {158,94,161}; --blue {243,221,255}; --white {225,191,255}; --skin {32,0,31}; --hair darkest {40,0,47}; {52,0,64}; {69,0,80}; {95,0,105}; {135,0,170}; {161,0,206}; {235,34,255};--hair brightest }; effects = { {158,94,161}; --blue {243,221,255}; --white {225,191,255}; --skin {32,0,31}; --hair darkest {40,0,47}; {52,0,64}; {69,0,80}; {95,0,105}; {135,0,170}; {161,0,206}; {235,34,255};--hair brightest {0,255,0}; --soul red {178,255,171}; --soul pink {0,128,0}; --wisp red }; meterIcon = { {0,255,0}; -- red {178,255,171}; --pink }; hit = {0,255,0}; --generalAssets dust = {171,43,200}; block = {171,43,200}; mainUI = {71,42,69}; health = {171,43,200}; meterChunk = { --meterOne {19,176,11}; --darkBlue {0,255,0}; --medium blue {144,255,96}; --lightest blue --meterTwo {108,255,94}; --darkblue {192,255,162}; --medium blue {240,255,236}; --lightest blue }; trailSuper = { {0,255,0}; --black {255,255,255}; --white {255,255,255}; --other }; }; alt8 = { --colors self-identified sprite = { {255,165,255}; --blue {255,240,255}; --white {255,237,237}; --skin {23,0,10}; --hair darkest {38,0,18}; {55,0,31}; {80,0,35}; {116,0,45}; {151,0,47}; {196,0,63}; {255,43,106};--hair brightest }; effects = { {255,165,255}; --blue {255,240,255}; --white {255,237,237}; --skin {23,0,10}; --hair darkest {38,0,18}; {55,0,31}; {80,0,35}; {116,0,45}; {151,0,47}; {196,0,63}; {255,43,106};--hair brightest {0,220,161}; --soul red {149,235,255}; --soul pink {0,91,66}; --wisp red }; meterIcon = { {0,220,161}; -- red {149,235,255}; --pink }; hit = {0,220,161}; --generalAssets dust = {255,100,146}; mainUI = {149,0,52}; health = {255,100,146}; meterChunk = { --meterOne {0,151,155}; --darkBlue {0,221,180}; --medium blue {169,255,183}; --lightest blue --meterTwo {99,232,255}; --darkblue {164,251,255}; --medium blue {234,246,255}; --lightest blue }; trailSuper = { {0,220,161}; --black {255,255,255}; --white {255,255,255}; --other }; }; }; }; --disabled for the trailer function June:onEnemyHit(blocked) if self.enemy.flip == 1 then self:executeProjectile("soul", math.floor(self.enemy.x + self.enemy.width/2), math.floor(self.enemy.y + self.enemy.height/2 - 30), self.enemy.flip) else self:executeProjectile("soul", math.floor(self.enemy.x + self.enemy.width/2) - 17 * gameLogicMult, math.floor(self.enemy.y + self.enemy.height/2 - 30), self.enemy.flip) end end function June:endTeleport() if not self:findEffect("teleportBody") and not self:findEffect("teleportBackBody") then return end self.runCancel = false self.noInput = true self.moves.teleportRecovery.endWith = nil self:executeEffect('dashDisappear') local effect = self:findEffect("teleportBody") if not effect or not effect.exists then effect = self:findEffect("teleportBackBody") effect.x = effect.x - (20 * self.flip) end if effect then if self.flip == 1 then self.x = effect.x + 30 self.requestX = self.x else self.x = effect.x - (19 * gameLogicMult) - 30 self.requestX = self.x end end self:executeMove('teleportRecovery') end function June:update(dt) if self.yayTimer >= 0 and resultScreen then self.yayTimer = self.yayTimer - 1 if self.yayTimer == -1 then if self.storedSprites and self.storedMoves then self.sprites = self.storedSprites self.moves = self.storedMoves self.shaders.sprite = self.storedShader self.glitchImage = false self:executeMove("yay") end end end if self:cloneExists() then self.clone:update(frameTime) if self.clone.move.name == "idle" or self.clone.move.name == "crouch" then self.clone.exists = false local effect = self.clone:findEffect("crouchEffect") if effect then effect.exists = false end end end self:_update(dt) end function June:controlUpdate(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB) self.blockHigh = false self.blockLow = false if tapA then buttonA = true end if tapB then buttonB = true end if self.runCancel and hitstop <= 0 and self.freezeTime == 0 then --don't forget to make this false on normalhit if not buttonA and self.lastFrameA then self.repeatA = false end if not buttonB and self.lastFrameB then self.repeatB = false end self.lastFrameA = buttonA self.lastFrameB = buttonB -- if up then -- self:endTeleport() -- self.move.endWith = function() -- self.move.endWith = nil -- self:endAttack() -- self:jump() -- end -- return if buttonA and not self.repeatA then self:endTeleport() self.repeatA = true self.lastFrameA = true if buttonB and not self.repeatB and self.neutralABRequirement then self.move.endWith = function() self.moves.teleportRecovery.endWith = nil self:endAttack() local oldrepeat = self.repeatA local oldrepeat2 = self.repeatB self:checkTurn() self:executeMove("neutralAB") self.repeatA = oldrepeat self.repeatB = oldrepeat2 end elseif down then self.move.endWith = function() self.moves.teleportRecovery.endWith = nil self:endAttack() local oldrepeat = self.repeatA self:checkTurn() if oldrepeat and ((right and self.flip == 1) or (left and self.flip == -1)) then self:executeMove("downForwardA") elseif oldrepeat and ((right and self.flip == -1) or (left and self.flip == 1)) then self:executeMove("downBackA") else self:executeMove("lowA") end self.ABTimer = 0 self.repeatA = oldrepeat end else self.move.endWith = function() self.moves.teleportRecovery.endWith = nil self:endAttack() local oldrepeat = self.repeatA self:checkTurn() self:executeMove("standA") self.ABTimer = 0 self.repeatA = oldrepeat end end return elseif buttonB and not self.repeatB then self:endTeleport() self.repeatB = true self.lastFrameB = true if down then self.move.endWith = function() self.moves.teleportRecovery.endWith = nil self:endAttack() local oldrepeat = self.repeatB self:checkTurn() if oldrepeat and ((right and self.flip == 1) or (left and self.flip == -1)) then self:executeMove("downForwardB") elseif oldrepeat and ((right and self.flip == -1) or (left and self.flip == 1)) then self:executeMove("downBackB") else self:executeMove("lowB") end self.ABTimer = 0 self.repeatB = oldrepeat end else self.move.endWith = function() self.moves.teleportRecovery.endWith = nil self:endAttack() local oldrepeat = self.repeatB self:checkTurn() self:executeMove("standB") self.ABTimer = 0 self.throwTimer = 0 self.repeatB = oldrepeat end end return elseif (self.move.name == "teleporting" and ((not right and self.flip == 1) or (not left and self.flip == -1))) or (self.move.name == "teleportingBack" and ((not right and self.flip == -1) or (not left and self.flip == 1))) then self:endTeleport() return end else local isLastFrameCheck = (self.ABTimer == 1) self:_controlUpdate(left, right, up, down, buttonA, buttonB, tapA, tapB, specialA, specialB) if isLastFrameCheck and self.move.name ~= "neutralAB" then -- self:recordMove() end end end function June:hitResponse(alsoHit, delayHurt, hurtboxHit) if self.move.name == "lowB" then local effect = self:findEffect("drillBig") if effect then effect.exists = false self:executeEffect("drillBigHitstop", effect.x, effect.y, effect.flip) --KILLS SMALL EFFECT IF IT EXISTS -- effect = self:findEffect("drillSmall") -- if effect then -- effect.exists = false -- self:executeEffect("drillSmallDeath", effect.x, effect.y, effect.flip) -- end else effect = self:findEffect("drillSmall") if effect then effect.exists = false self:executeEffect("drillSmallHitstop", effect.x, effect.y, effect.flip) end end end self:_hitResponse(alsoHit, delayHurt, hurtboxHit) end function June:recordMove() if not self.isClone and self.meterAmount == 5 and not self.clone.exists then self.previousMove = self.move.name self.previousFlip = self.flip self.previousX = self.x self.previousY = self.y self.previousYSpeed = self.ySpeed self.previousXSpeed = self.xSpeed self:killProjectileViaTag("wisp") -- local effect = self:findEffect("wisp") -- if effect then -- effect.exists = false -- end if self.previousFlip == -1 then self:executeProjectile("wisp", self.previousX + 22, self.previousY, self.previousFlip) else self:executeProjectile("wisp", self.previousX, self.previousY, self.previousFlip) end -- self:executeEffect("wisp") if self.meterAmount == 5 then self.neutralABRequirement = true end end end function June:executeMove(moveName) self:_executeMove(moveName) -- if moveName == "downForwardB" or moveName == "downBackB" or moveName == "downForwardA" or moveName == "downBackA" then -- self:recordMove() -- end end function June:hitReset() self:killProjectileViaTag("teleportTag") -- local effect = self:findEffect("teleportBody") -- if not effect then -- effect = self:findEffect("teleportBackBody") -- end -- if effect then -- effect.exists = false -- end self:_hitReset() end function June:initiate(isClone) self:_initiate() -- self.projectiles[1] = Fireball() if isClone then self.isClone = true -- self.exists = false else self.clone = characterLoad(self.playerNum, "june", self.colorNum, true) end -- constants self.pushbackDustOffset = -10 self.yayTimer = -1 self.hitLightSFX = "lightAttack" self.hitHeavySFX = "heavyAttack" self.hitLowSFX = "lowAttack" self.hitSpecialSFX = "special" end function June:changeColor(colorChange) if self.clone then self.clone:_changeColor(colorChange) end self:_changeColor(colorChange) end function June:reset() self:_reset() self.previousMove = nil self.previousFlip = nil self.previousX = nil self.previousY = nil self.previousYSpeed = nil self.previousXSpeed = nil end function June:resetMeter() self.meterChunkArray = {} for i=1, 5 do self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(1,1,4,2,2,2,4,2,2,2,4,2,2,2)), frameTime, 'pauseAtEnd') --6,1,1,2,2,2,3,2,4,2,5,1 end self:_resetMeter() end function June:meterAnimation() love.graphics.setShader(self.shaders.meterIcon) if self.player1 then self.meterAnimate:draw(self.sprites.meter.sheet, self.meterX, self.meterY + self.meterJitter, 0, gameLogicMult, gameLogicMult, 0, 0) love.graphics.setShader(self.shaders.meterChunk) for i=1, 5 do local d = i-1 self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX + 122 - 18) - (d * 16), self.meterY + 12 + self.meterJitter, 0, gameLogicMult, gameLogicMult, 0, 0) end else self.meterAnimate:draw(self.sprites.meter.sheet, self.meterX, self.meterY + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0) love.graphics.setShader(self.shaders.meterChunk) for i=1, 5 do local d = i-1 self.meterChunkArray[i]:draw(self.sprites.meterChunk.sheet, (self.meterX - 122 + 18) + (d * 16), self.meterY + 12 + self.meterJitter, 0, -gameLogicMult, gameLogicMult, 0, 0) end end love.graphics.setShader() end function June:changeMeter(amount) if amount ~= 5 then self:setFlicker(self.colors["alt" .. self.colorNum].meterIcon[1][1]*255,self.colors["alt" .. self.colorNum].meterIcon[1][2]*255,self.colors["alt" .. self.colorNum].meterIcon[1][3]*255,3, true) --165,0,255 end if self.meterAmount < 5 then self.meterAmount = self.meterAmount + amount if self.meterAmount == 5 then self.meterJitter = 5 if self.playerNum == 1 then self:executeSound('fullMeter', "sfx", -1) else self:executeSound('fullMeter', "sfx", 1) end if self.previousX then self.neutralABRequirement = true end self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(5,4)), frameTime) self.meterAnimate.onLoop = function() self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(repeatNum(4,4,3,4,4,4,3,60)), frameTime) for i=1, 5 do self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,4,3,4,4,4,3,60)), frameTime) end end else self.meterJitter = 2 end end end function June:emptyMeter() self.neutralABRequirement = false self.meterAnimate = anim8.newAnimation(self.sprites.meter.grid(1,1), frameTime) self:cascadeMeter(5) end function June:fullMeter() if self.meterAmount < 5 then self.meterAmount = 0 self:changeMeter(5) end end function June:cascadeMeter(meterNum) if meterNum == 5 then -- self:executeSound("tenchiSuper", "sfx") for i=1, 5 do self.meterChunkArray[i] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(3,1)), frameTime) end end self.meterChunkArray[meterNum] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,2,1,2,4,2,1,2)), frameTime) self.meterChunkArray[meterNum].onLoop = function() self.meterChunkArray[meterNum] = anim8.newAnimation(self.sprites.meterChunk.grid(repeatNum(4,2,1,2)), frameTime, 'pauseAtEnd') if meterNum > 1 then self:cascadeMeter(meterNum - 1) else self.meterAmount = 0 self.continueMeterJitter = 0 self.meterJitter = 5 self:resetMeter() end end if meterNum == 3 then self.continueMeterJitter = 2 end end function June:normalHit(attackInfo, delayHurt, hurtboxHit) self.moves.teleportRecovery.endWith = nil self:_normalHit(attackInfo, delayHurt, hurtboxHit) end function June:onTimeout() self.enemy.noInput = true self.enemy:executeAnimation("chipDeath") end