2022-04-19 21:22:15 +00:00
|
|
|
local velocity = {x=0,y=0}
|
|
|
|
local lerpmnt <const> = 0.5
|
2022-08-01 05:40:47 +00:00
|
|
|
grav = 0.2
|
2022-04-23 23:54:00 +00:00
|
|
|
scale = 1
|
2022-04-24 18:15:38 +00:00
|
|
|
local dead = false
|
2022-04-19 21:22:15 +00:00
|
|
|
|
2022-05-31 23:10:00 +00:00
|
|
|
local rocketfly = nil
|
|
|
|
|
2022-04-22 18:02:47 +00:00
|
|
|
local exists = false
|
|
|
|
local active = false
|
|
|
|
local gfx <const> = playdate.graphics
|
2022-04-19 21:22:15 +00:00
|
|
|
local imgRocket = gfx.image.new("gfx/rocket")
|
2022-05-14 16:34:53 +00:00
|
|
|
local imgFire = gfx.imagetable.new("gfx/fire")
|
2022-04-19 21:22:15 +00:00
|
|
|
assert(imgRocket)
|
2022-05-15 00:31:57 +00:00
|
|
|
sprRocket = gfx.sprite.new(imgRocket)
|
2022-05-14 16:34:53 +00:00
|
|
|
local loopFire = gfx.animation.loop.new(200,imgFire)
|
2022-05-18 05:09:02 +00:00
|
|
|
sprRocket:setCollideRect(9, 9, 10, 10)
|
2022-04-22 18:02:47 +00:00
|
|
|
local startpos = {x=0,y=0}
|
2022-05-29 05:53:46 +00:00
|
|
|
sprRocket:setGroups({1,2,3})
|
2022-04-19 21:22:15 +00:00
|
|
|
|
2022-04-23 23:54:00 +00:00
|
|
|
local imgBigRocket = gfx.image.new("gfx/bigrocket")
|
2022-05-18 05:09:02 +00:00
|
|
|
local imgBigFire = gfx.imagetable.new("gfx/bigrocketfire")
|
2022-08-14 00:49:06 +00:00
|
|
|
local imgSpawn = gfx.image.new("gfx/spawn")
|
2022-04-23 23:54:00 +00:00
|
|
|
assert(imgBigRocket)
|
2022-05-18 05:09:02 +00:00
|
|
|
assert(imgBigFire)
|
2022-08-14 00:49:06 +00:00
|
|
|
assert(imgSpawn)
|
2022-05-18 05:09:02 +00:00
|
|
|
local loopBigFire = gfx.animation.loop.new(200,imgBigFire)
|
2022-04-23 23:54:00 +00:00
|
|
|
local sprBigRocket = gfx.sprite.new(imgBigRocket)
|
2022-08-14 00:49:06 +00:00
|
|
|
local sprSpawn = gfx.sprite.new(imgSpawn)
|
2022-05-29 05:53:46 +00:00
|
|
|
sprBigRocket:setCollideRect(0,0,64,64)
|
2022-04-23 23:54:00 +00:00
|
|
|
sprBigRocket:setGroups({2})
|
2022-05-29 05:53:46 +00:00
|
|
|
sprBigRocket:setCollidesWithGroups({2})
|
|
|
|
|
|
|
|
local resetButton = nil
|
|
|
|
|
2022-07-03 19:44:11 +00:00
|
|
|
local sfxDie = playdate.sound.sampleplayer.new("sfx/die")
|
|
|
|
|
2022-08-09 19:51:07 +00:00
|
|
|
function setSpawn(_x,_y)
|
|
|
|
startpos = {x=_x,y=_y}
|
2022-08-14 00:49:06 +00:00
|
|
|
miniExplode(sprSpawn.x,sprSpawn.y)
|
|
|
|
sprSpawn:moveTo(_x,_y)
|
2022-08-09 19:51:07 +00:00
|
|
|
end
|
|
|
|
|
2022-05-29 05:53:46 +00:00
|
|
|
local function die()
|
|
|
|
deaths +=1
|
2022-07-01 00:27:18 +00:00
|
|
|
explode(sprRocket.x,sprRocket.y)
|
2022-05-29 05:53:46 +00:00
|
|
|
active = false
|
|
|
|
velocity = {x=0,y=0}
|
|
|
|
sprRocket:moveTo(startpos.x, startpos.y)
|
2022-07-02 05:03:59 +00:00
|
|
|
miniExplode(startpos.x,startpos.y)
|
2022-07-03 19:44:11 +00:00
|
|
|
sfxDie:play()
|
2022-05-29 05:53:46 +00:00
|
|
|
end
|
2022-04-23 23:54:00 +00:00
|
|
|
|
|
|
|
function addPlayer(_x,_y,__x,__y)
|
2022-04-22 18:02:47 +00:00
|
|
|
exists = true
|
2022-04-24 18:15:38 +00:00
|
|
|
dead = false
|
2022-04-23 23:54:00 +00:00
|
|
|
scale = 1
|
2022-04-22 18:02:47 +00:00
|
|
|
active = false
|
2022-08-14 00:49:06 +00:00
|
|
|
sprSpawn:add()
|
|
|
|
sprSpawn:moveTo(_x,_y)
|
|
|
|
|
2022-04-22 18:02:47 +00:00
|
|
|
velocity = {x=0,y=0}
|
|
|
|
startpos = {x= _x,y=_y}
|
2022-04-23 23:54:00 +00:00
|
|
|
sprBigRocket:moveTo(__x,__y)
|
2022-05-31 23:10:00 +00:00
|
|
|
sprBigRocket:removeAnimator()
|
2022-05-18 05:09:02 +00:00
|
|
|
sprBigRocket:setImage(imgBigRocket)
|
2022-04-23 23:54:00 +00:00
|
|
|
sprBigRocket:add()
|
2022-04-22 18:02:47 +00:00
|
|
|
sprRocket:moveTo(_x,_y)
|
2022-04-19 21:22:15 +00:00
|
|
|
sprRocket:add()
|
2022-05-07 20:31:34 +00:00
|
|
|
sprRocket:setVisible(true)
|
2022-05-29 05:53:46 +00:00
|
|
|
resetButton = playdate.getSystemMenu():addMenuItem("respawn", function()
|
|
|
|
die()
|
|
|
|
end)
|
2022-04-19 21:22:15 +00:00
|
|
|
end
|
|
|
|
|
2022-04-22 18:02:47 +00:00
|
|
|
function killPlayer()
|
2022-07-18 07:11:02 +00:00
|
|
|
tutorial = nil
|
2022-06-12 07:40:12 +00:00
|
|
|
song:setFinishCallback(nil)
|
2022-04-22 18:02:47 +00:00
|
|
|
exists = false
|
|
|
|
active = false
|
|
|
|
sprRocket:remove()
|
2022-05-31 23:10:00 +00:00
|
|
|
sprRocket:removeAnimator()
|
2022-05-22 02:06:58 +00:00
|
|
|
sprBigRocket:remove()
|
2022-05-31 23:10:00 +00:00
|
|
|
sprBigRocket:removeAnimator()
|
2022-04-23 06:54:45 +00:00
|
|
|
gfx.setDrawOffset(0,0)
|
2022-05-29 05:53:46 +00:00
|
|
|
if resetButton ~= nil then playdate.getSystemMenu():removeMenuItem(resetButton) end
|
2022-05-31 23:10:00 +00:00
|
|
|
resetButton = nil
|
2022-04-22 18:02:47 +00:00
|
|
|
end
|
|
|
|
|
2022-04-23 23:54:00 +00:00
|
|
|
local function playerWin()
|
2022-05-14 16:34:53 +00:00
|
|
|
if active then
|
2022-05-29 05:53:46 +00:00
|
|
|
playdate.getSystemMenu():removeMenuItem(resetButton)
|
2022-05-14 16:34:53 +00:00
|
|
|
song:stop()
|
|
|
|
song:load("sfx/song3")
|
|
|
|
song:play(1)
|
2022-05-15 05:42:52 +00:00
|
|
|
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)
|
2022-05-31 23:10:00 +00:00
|
|
|
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
|
2022-05-15 05:42:52 +00:00
|
|
|
end)
|
|
|
|
|
|
|
|
song:setFinishCallback(function()
|
2022-06-12 07:40:12 +00:00
|
|
|
song:setFinishCallback(nil)
|
2022-05-15 05:42:52 +00:00
|
|
|
if next then
|
2022-05-18 05:09:02 +00:00
|
|
|
map = next
|
2022-05-15 05:42:52 +00:00
|
|
|
end
|
|
|
|
totalEnergy = 0
|
|
|
|
showEnergy = false
|
|
|
|
energy = 0
|
2022-06-12 03:08:20 +00:00
|
|
|
killPlayer()
|
|
|
|
removeMap()
|
2022-06-12 07:40:12 +00:00
|
|
|
killBlades()
|
2022-09-26 05:14:41 +00:00
|
|
|
if (mode == "game" or mode == "hgame") and next then
|
2022-05-22 02:06:58 +00:00
|
|
|
playdate.datastore.delete("savegame")
|
|
|
|
playdate.datastore.write({savedLevel=map,savedDeaths=deaths},"savegame")
|
2022-05-15 05:42:52 +00:00
|
|
|
next = nil
|
2022-05-31 23:10:00 +00:00
|
|
|
addMapSave(map)
|
2022-07-23 20:42:51 +00:00
|
|
|
elseif mode == "game" then
|
|
|
|
beginEndCutscene()
|
|
|
|
next = nil
|
2022-05-22 02:06:58 +00:00
|
|
|
else
|
2022-06-12 07:40:12 +00:00
|
|
|
next = nil
|
2022-05-22 02:06:58 +00:00
|
|
|
mainMenuCreation()
|
|
|
|
createMenu(mainmenu)
|
2022-05-15 05:42:52 +00:00
|
|
|
end
|
2022-07-01 22:15:02 +00:00
|
|
|
|
2022-05-15 05:42:52 +00:00
|
|
|
end)
|
|
|
|
|
2022-05-14 16:34:53 +00:00
|
|
|
end
|
2022-04-23 23:54:00 +00:00
|
|
|
active = false
|
|
|
|
exists = false
|
2022-04-24 18:15:38 +00:00
|
|
|
dead = true
|
2022-05-15 05:42:52 +00:00
|
|
|
|
2022-08-14 00:49:06 +00:00
|
|
|
if playdate.buttonJustPressed(playdate.kButtonA) then
|
2022-08-03 21:04:14 +00:00
|
|
|
song:setFinishCallback(nil)
|
|
|
|
if next then
|
|
|
|
map = next
|
|
|
|
end
|
|
|
|
|
|
|
|
local ts = playdate.timer.allTimers()
|
|
|
|
for i = 1, #ts, 1 do
|
|
|
|
ts[i]:remove()
|
|
|
|
end
|
|
|
|
|
|
|
|
totalEnergy = 0
|
|
|
|
showEnergy = false
|
|
|
|
energy = 0
|
|
|
|
killPlayer()
|
|
|
|
removeMap()
|
|
|
|
killBlades()
|
2023-01-23 05:48:23 +00:00
|
|
|
if (mode == "game" or mode == "hgame") and next then
|
2022-08-03 21:04:14 +00:00
|
|
|
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
|
|
|
|
|
2022-04-23 23:54:00 +00:00
|
|
|
end
|
|
|
|
|
2022-04-19 21:22:15 +00:00
|
|
|
function updatePlayer()
|
2022-05-15 05:42:52 +00:00
|
|
|
playdate.timer.updateTimers()
|
2022-05-14 16:40:45 +00:00
|
|
|
sprRocket:setImage(imgRocket)
|
2022-08-09 17:14:16 +00:00
|
|
|
|
|
|
|
local inp = (playdate.buttonIsPressed(playdate.kButtonUp) or playdate.buttonIsPressed(playdate.kButtonDown) or playdate.buttonIsPressed(playdate.kButtonLeft) or playdate.buttonIsPressed(playdate.kButtonRight) or playdate.buttonIsPressed(playdate.kButtonA) or playdate.buttonIsPressed(playdate.kButtonB))
|
|
|
|
|
2022-04-22 18:02:47 +00:00
|
|
|
if active == true then
|
2022-08-09 17:14:16 +00:00
|
|
|
if inp then
|
2022-04-23 06:54:45 +00:00
|
|
|
velocity.x = velocity.x + math.sin(math.rad(playdate.getCrankPosition())) /2
|
|
|
|
velocity.y = velocity.y - math.cos(math.rad(playdate.getCrankPosition())) /2
|
2022-04-19 21:22:15 +00:00
|
|
|
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
|
2022-04-22 18:02:47 +00:00
|
|
|
|
|
|
|
if #sprRocket:overlappingSprites() > 0 then
|
|
|
|
die()
|
|
|
|
end
|
|
|
|
|
|
|
|
elseif exists == true then
|
2022-08-14 00:49:06 +00:00
|
|
|
if (playdate.buttonJustPressed(playdate.kButtonUp) or playdate.buttonJustPressed(playdate.kButtonDown) or playdate.buttonJustPressed(playdate.kButtonLeft) or playdate.buttonJustPressed(playdate.kButtonRight) or playdate.buttonJustPressed(playdate.kButtonA) or playdate.buttonJustPressed(playdate.kButtonB)) and playdate.isCrankDocked() == false then
|
2022-04-22 18:02:47 +00:00
|
|
|
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))
|
2022-04-24 18:15:38 +00:00
|
|
|
elseif dead == true then
|
2022-05-18 05:09:02 +00:00
|
|
|
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())
|
2022-04-24 18:15:38 +00:00
|
|
|
if scale > 0.1 then
|
|
|
|
scale -= 0.05
|
2022-05-03 01:59:37 +00:00
|
|
|
else
|
|
|
|
sprRocket:setVisible(false)
|
2022-04-24 18:15:38 +00:00
|
|
|
end
|
2022-04-19 21:22:15 +00:00
|
|
|
end
|
2022-07-18 07:11:02 +00:00
|
|
|
|
2022-04-23 23:54:00 +00:00
|
|
|
updateExit()
|
|
|
|
|
|
|
|
sprRocket:setScale(scale,scale)
|
|
|
|
|
2022-05-14 16:34:53 +00:00
|
|
|
|
2022-04-22 18:02:47 +00:00
|
|
|
sprRocket:setRotation(playdate.getCrankPosition())
|
2022-05-18 05:09:02 +00:00
|
|
|
|
2022-08-09 17:14:16 +00:00
|
|
|
if active and inp then
|
2022-05-18 05:09:02 +00:00
|
|
|
sprRocket:setImage(loopFire:image())
|
|
|
|
end
|
2022-04-23 23:54:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function updateExit()
|
2022-05-29 05:53:46 +00:00
|
|
|
if #sprBigRocket:overlappingSprites() > 0 and energy == totalEnergy then
|
2022-04-23 23:54:00 +00:00
|
|
|
playerWin()
|
|
|
|
end
|
2022-05-15 05:42:52 +00:00
|
|
|
end
|
|
|
|
|