local velocity = {x=0,y=0} local lerpmnt = 0.5 local grav = 0.2 scale = 1 local dead = false local rocketfly = nil local exists = false local active = false local gfx = playdate.graphics local imgRocket = gfx.image.new("gfx/rocket") local imgFire = gfx.imagetable.new("gfx/fire") assert(imgRocket) sprRocket = gfx.sprite.new(imgRocket) local loopFire = gfx.animation.loop.new(200,imgFire) sprRocket:setCollideRect(9, 9, 10, 10) local startpos = {x=0,y=0} sprRocket:setGroups({1,2,3}) local imgBigRocket = gfx.image.new("gfx/bigrocket") local imgBigFire = gfx.imagetable.new("gfx/bigrocketfire") assert(imgBigRocket) assert(imgBigFire) local loopBigFire = gfx.animation.loop.new(200,imgBigFire) local sprBigRocket = gfx.sprite.new(imgBigRocket) sprBigRocket:setCollideRect(0,0,64,64) sprBigRocket:setGroups({2}) sprBigRocket:setCollidesWithGroups({2}) local resetButton = nil local sfxDie = playdate.sound.sampleplayer.new("sfx/die") local function die() deaths +=1 explode(sprRocket.x,sprRocket.y) active = false velocity = {x=0,y=0} sprRocket:moveTo(startpos.x, startpos.y) miniExplode(startpos.x,startpos.y) sfxDie:play() end function addPlayer(_x,_y,__x,__y) exists = true dead = false scale = 1 active = false velocity = {x=0,y=0} startpos = {x= _x,y=_y} sprBigRocket:moveTo(__x,__y) sprBigRocket:removeAnimator() sprBigRocket:setImage(imgBigRocket) sprBigRocket:add() sprRocket:moveTo(_x,_y) sprRocket:add() sprRocket:setVisible(true) resetButton = playdate.getSystemMenu():addMenuItem("respawn", function() die() end) end function killPlayer() tutorial = nil song:setFinishCallback(nil) exists = false active = false sprRocket:remove() sprRocket:removeAnimator() sprBigRocket:remove() sprBigRocket:removeAnimator() gfx.setDrawOffset(0,0) if resetButton ~= nil then playdate.getSystemMenu():removeMenuItem(resetButton) end resetButton = nil end local function playerWin() if active then playdate.getSystemMenu():removeMenuItem(resetButton) song:stop() song:load("sfx/song3") song:play(1) local startPos = playdate.geometry.point.new(sprRocket.x, sprRocket.y) local endPos = playdate.geometry.point.new(sprBigRocket.x, sprBigRocket.y) sprRocket:setAnimator(gfx.animator.new(800, startPos, endPos)) rocketfly = playdate.timer.new(6000, function(timer) if dead then local stPos = playdate.geometry.point.new(sprBigRocket.x, sprBigRocket.y) local ndPos = playdate.geometry.point.new(sprBigRocket.x, sprBigRocket.y - 1000) sprBigRocket:setAnimator(gfx.animator.new(3000,stPos,ndPos, playdate.easingFunctions.inCubic)) end end) song:setFinishCallback(function() song:setFinishCallback(nil) if next then map = next end totalEnergy = 0 showEnergy = false energy = 0 killPlayer() removeMap() killBlades() if mode == "game" and next then playdate.datastore.delete("savegame") playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame") next = nil addMapSave(map) elseif mode == "game" then beginEndCutscene() next = nil else next = nil mainMenuCreation() createMenu(mainmenu) end end) end active = false exists = false dead = true end function updatePlayer() playdate.timer.updateTimers() sprRocket:setImage(imgRocket) if active == true then if playdate.buttonIsPressed(playdate.kButtonUp) or playdate.buttonIsPressed(playdate.kButtonA) then velocity.x = velocity.x + math.sin(math.rad(playdate.getCrankPosition())) /2 velocity.y = velocity.y - math.cos(math.rad(playdate.getCrankPosition())) /2 end sprRocket:moveBy(velocity.x,velocity.y) local cx, cy = gfx.getDrawOffset() gfx.setDrawOffset(playdate.math.lerp(cx,(-sprRocket.x + 200), lerpmnt), playdate.math.lerp(cy,(-sprRocket.y + 120), lerpmnt)) sprRocket:setRotation(0) sprRocket:update() --print(#sprRocket:overlappingSprites()) velocity.y += grav if #sprRocket:overlappingSprites() > 0 then die() end elseif exists == true then if (playdate.buttonJustPressed(playdate.kButtonUp) or playdate.buttonJustPressed(playdate.kButtonA)) and playdate.isCrankDocked() == false then active = true end local cx, cy = gfx.getDrawOffset() gfx.setDrawOffset(playdate.math.lerp(cx,(-sprRocket.x + 200), lerpmnt), playdate.math.lerp(cy,(-sprRocket.y + 120), lerpmnt)) elseif dead == true then local cx, cy = gfx.getDrawOffset() gfx.setDrawOffset(playdate.math.lerp(cx,(-sprRocket.x + 200), 0.1), playdate.math.lerp(cy,(-sprRocket.y + 120), 0.1)) sprBigRocket:setImage(loopBigFire:image()) if scale > 0.1 then scale -= 0.05 else sprRocket:setVisible(false) end end updateExit() sprRocket:setScale(scale,scale) sprRocket:setRotation(playdate.getCrankPosition()) if active and (playdate.buttonIsPressed(playdate.kButtonA) or playdate.buttonIsPressed(playdate.kButtonUp)) then sprRocket:setImage(loopFire:image()) end end function updateExit() if #sprBigRocket:overlappingSprites() > 0 and energy == totalEnergy then playerWin() end end