local gfx = playdate.graphics local controlY = 0 local controlX = 0 local sidebar = gfx.image.new("gfx/sidebar") local small = gfx.font.new("gfx/small") local barpos = 0 local barposLerp = 160 local logopos = 0 local logposLerp = -122 local index = 0 local menuitems = {} local menu = null page = 0 local imgCursor = gfx.image.new("gfx/cursor") local imgBytes = gfx.image.new("gfx/bytes") local imgQRs = gfx.image.new("gfx/links") assert(imgCursor) assert(imgBytes) assert(imgQRs) local sfxAccept = playdate.sound.sampleplayer.new("sfx/accept") local sfxSelect = playdate.sound.sampleplayer.new("sfx/select") sfxAccept:setVolume(0.5) sfxSelect:setVolume(0.5) local function setLogoPos() logopos = -130 end mainmenu = {} function mainMenuCreation() barposLerp = 160 logposLerp = -122 mainmenu = {} mainmenu[4],mainmenu[3],mainmenu[2], mainmenu[1], mainmenu[0] = "START NEW GAME", "USER LEVELS", "LEVEL EDITOR", "EXTRAS", "mainNoPlay" local g = playdate.datastore.read("savegame") if g then map = g.savedLevel deaths = g.savedDeaths mainmenu[5], mainmenu[0] = "CONTINUE", "mainPlay" end end function createMenu(items, invert) song:setRate(1.0) killBlades() killPlayer() if invert ~= true then playdate.display.setInverted(false) end controlX = -80 index = 0.5 menuitems = {} local _y =220 menu = items[0] for i=1, #items, 1 do menuitems[i] = {name=items[i],y=_y} _y -= 20 end if mode == "game" or mode == "play" or mode == "hgame" then song:stop() song:load("sfx/song1") song:play(0) end mode = "menu" end function updateMenu() gfx.clear(gfx.kColorBlack) processStars(-10,-10) -- input local change, aChange = playdate.getCrankChange() if playdate.buttonJustPressed(playdate.kButtonUp) then sfxSelect:play() index -= 1 elseif playdate.buttonJustPressed(playdate.kButtonDown) then index += 1 sfxSelect:play() end if menuitems[1].name == "NO GRAVITY" then local str = {[true]="TRUE",[false]="FALSE"} page = -1 gfx.drawText("INVERTED: ".."\nGRAVITY: "..getGrav(),0,0) else sidebar:draw(barposLerp,0) imgBytes:draw(logposLerp,0) end index += change * 0.01 if math.floor(index) < 0 then index = #menuitems -0.01 end if math.floor(index) > #menuitems - 1 then index = 0 end controlX = playdate.math.lerp(controlX, 20, 0.3) controlY = playdate.math.lerp(controlY, (20 * math.floor(index)) - 1, 0.5) barposLerp = playdate.math.lerp(barposLerp, barpos, 0.2) logposLerp = playdate.math.lerp(logposLerp, logopos, 0.3) for i = 1, #menuitems, 1 do local item = menuitems[i] if item.name:match("(.+)%..+$") then gfx.drawText(item.name:match("(.+)%..+$"),controlX,item.y) else gfx.drawText(item.name,controlX,item.y) end end imgCursor:draw(controlX - 17,controlY + (243 - (20 * #menuitems))) if playdate.buttonJustPressed(playdate.kButtonA) or playdate.buttonJustPressed(playdate.kButtonRight) then menuButtonPress(menuitems[#menuitems - math.floor(index)].name,#menuitems - math.floor(index)) sfxAccept:play() elseif playdate.buttonJustPressed(playdate.kButtonB) or playdate.buttonJustPressed(playdate.kButtonLeft) then menuButtonPress("BACK") sfxAccept:play() end if menu == "qrs" then imgQRs:draw(controlX-20,0) small:drawText("BY POSSIBLYAXOLOTL :)".."\nV."..playdate.metadata.version,0,0) end end local function dataLoad() barpos = 160 setLogoPos() local lvls = {"1. HOOK.json","2. ROCKET.json","3. HUT.json","4. SPINNER.json","5. SHUTTLE.json","6. SHELL.json","7. PYRAMID.json","8. KITCHEN.json","9. LADDER.json","10. CITY.json","11. FLOWER.json", "12. BOXES.json","13. SNAKE.json","14. TOWER.json","15. ESCAPE.json","H1. CAVEYARD.json", "H2. PUMPKIN.json", "H3. HAUNTED HOUS.json", "H4. TRICK OR TREAT.json", "H5. CANDY CORN.json","H6. COFFIN.json"} local m = {} m[0], m[1] = "data", "EXTRAS" if #lvls - ((10*page)) <= 0 then page = 0 end if #lvls <= 11 then for i = 1, #lvls, 1 do m[i+1] = lvls[i]:upper() end elseif lvls[1 + (10*page)] then m[2] = "NEXT PAGE" for i = 1, 10, 1 do if lvls[i+(10*page)] then m[i+2] = lvls[i+(10*page)]:upper() end end end createMenu(m) end local function customLoad() barpos = 160 setLogoPos() local lvls = playdate.file.listFiles("levels") local m = {} m[0], m[1] = "customs", "BACK" if #lvls - ((10*page)) <= 0 then page = 0 end if #lvls <= 11 then for i = 1, #lvls, 1 do m[i+1] = lvls[i]:upper() end elseif lvls[1 + (10*page)] then m[2] = "NEXT PAGE" for i = 1, 10, 1 do if lvls[i+(10*page)] then m[i+2] = lvls[i+(10*page)]:upper() end end end createMenu(m) end function editLoad() setLogoPos() barpos = 160 local lvls = playdate.file.listFiles("levels") local m = {} m[0], m[1], m[2] = "edits", "BACK", "CREATE NEW" if #lvls - (1 + (9*page)) <= 0 then page = 0 end if #lvls <= 10 then for i = 1, #lvls, 1 do m[i+2] = lvls[i]:upper() end elseif lvls[1 + (9*page)] then m[3] = "NEXT PAGE" for i = 1, 9, 1 do if lvls[i+(9*page)] then m[i+3] = lvls[i+(9*page)]:upper() end end end createMenu(m) end songlist = {"BACK","POV: YOU ARE A ROCKET","A LONELY, LOST SHIP", "LEVEL COMPLETE", "GAME COMPLETE", "CHIPVIBE2", "ORANGER CHIP","WACKMAN","HAUNTED HOUS", "SPOOKY ZONE","A HAPPY, FOUND SHIP", "AS WE ROCKET AWAY"} songlist[0] = "musicbox" function menuButtonPress(name, index) logopos = 0 barpos = 0 miniExplode(controlX - 17 --[[+ (playdate.graphics.getTextSize(name) / 2)]] ,controlY + (243 - (20 * #menuitems))) if name == "START NEW GAME" then local m = {} m[0], m[1], m[2] = "newgame", "CANCEL", "CONFIRM" createMenu(m) elseif name == "START HALLOWEEN GAME" then local m = {} m[0], m[1], m[2] = "halgame", "CANCEL", "CONFIRM" createMenu(m) elseif name == "START NEW GAME" or name == "CONFIRM" then if menu ~= "halgame" then deaths = 0 beginStartCutscene(true) else mode = "hgame" map = "data/H1. CAVEYARD.json" addMapSave("data/H1. CAVEYARD.json") end elseif name == "CONTINUE" then addMap(map) dat = playdate.datastore.read("savegame") dat.mode = dat.mode or "game" mode = dat.mode elseif name == "NO GRAVITY" then setGrav(0) barpos = 160 setLogoPos() elseif name == "NEGATIVE GRAVITY" then setGrav(-0.2) barpos = 160 setLogoPos() elseif name == "REGULAR GRAVITY" then setGrav(0.2) barpos = 160 setLogoPos() elseif name == "CHANGE MUSIC" then setEditor("music") mode = "editor" elseif name == "START CUTSCENE" then local m = {"BACK","WATCH START CUTSCENE"} m[0] = "dat" createMenu(m) elseif name == "END CUTSCENE" then local m = {"BACK","WATCH END CUTSCENE"} m[0] = "dat" createMenu(m) elseif name == "WATCH START CUTSCENE" then beginStartCutscene(false) elseif name == "WATCH END CUTSCENE" then beginEndCutscene() elseif name == "RESUME" then mode = "editor" elseif name == "INVERT COLOURS" then barpos = 160 setLogoPos() playdate.display.setInverted(not playdate.display.getInverted()) elseif name == "EXTRAS" then local m = {} barpos = 160 setLogoPos() --m[0],m[1], m[2], m[3], m[4], m[5], m[6] = "extras", "BACK", "MUSIC BOX", "LINKS", "END CUTSCENE", "START CUTSCENE", "LEVEL SELECT" m[0],m[1], m[2], m[3], m[4], m[5], m[6],m[7], m[8] = "extras", "BACK","LINKS","END CUTSCENE", "START CUTSCENE", "MUSIC BOX", "LEVEL SELECT", "START HALLOWEEN GAME", "START PLUS GAME" if playdate.file.exists("bonusLevels.rocketbytes") then m[6] = "EXTRA LEVELS" end createMenu(m) elseif name == "LINKS" then local m = {} m[0],m[1] = "qrs", "BACK" createMenu(m) setLogoPos() barpos = 160 elseif name == "USER LEVELS" then page = 0 customLoad() elseif name == "LEVEL EDITOR" then page = 0 editLoad() elseif name == "LEVEL SELECT" then dataLoad() elseif name == "CREATE NEW" then newProject() elseif name == "NEXT PAGE" then page += 1 if menu == "customs" then customLoad() elseif menu =="data" then dataLoad() else editLoad() end elseif name == "BACK" or name == "CANCEL" then if menu == "musicbox" then local m = {} m[0],m[1], m[2], m[3], m[4], m[5], m[6],m[7], m[8] = "extras", "BACK","LINKS","END CUTSCENE", "START CUTSCENE", "MUSIC BOX", "LEVEL SELECT", "START HALLOWEEN GAME", "START PLUS GAME" if playdate.file.exists("bonusLevels.rocketbytes") then m[6] = "EXTRA LEVELS" barpos = 160 setLogoPos() end song:stop() song:load("sfx/song1") song:play(0) local m = {} barpos = 160 setLogoPos() m[0],m[1], m[2], m[3], m[4], m[5], m[6],m[7], m[8] = "extras", "BACK","LINKS","END CUTSCENE", "START CUTSCENE", "MUSIC BOX", "LEVEL SELECT", "START HALLOWEEN GAME", "START PLUS GAME" createMenu(m) elseif menu == "qrs" or menu == "data" or menu == "dat" then local m = {} m[0],m[1], m[2], m[3], m[4], m[5], m[6],m[7], m[8] = "extras", "BACK","LINKS","END CUTSCENE", "START CUTSCENE", "MUSIC BOX", "LEVEL SELECT", "START HALLOWEEN GAME", "START PLUS GAME" createMenu(m) barpos = 160 setLogoPos() elseif menu == nil then else createMenu(mainmenu) end elseif name == "MUSIC BOX" then setLogoPos() barpos = 160 song:stop() createMenu(songlist) elseif menu == "edits" then mode = "editor" menu = nil editLoadName(name) elseif menu == "musicbox" then setLogoPos() barpos = 160 mode = "music" songTitle = songlist[index] song:stop() song:load("sfx/song"..index - 1) song:play(0) elseif menu == "customs" then addMap("levels/"..name, true) mode = "play" elseif menu == "data" then addMap("data/"..name, true) mode = "play" end end