From 95b2c825db6e4b0b303838a3ead76e84bfca4764 Mon Sep 17 00:00:00 2001 From: assada Date: Fri, 11 Apr 2025 01:25:01 +0200 Subject: [PATCH] map select --- .luarc.json | 4 +- .vscode/launch.json | 11 +++ .vscode/settings.json | 6 +- .vscode/tasks.json | 32 ++++++ build_and_run_mac.sh | 145 ++++++++++++++++++++++++++++ source/assets/audio/back.wav | Bin 0 -> 37326 bytes source/assets/fonts/Outfoxies.fnt | 47 +++++++++ source/assets/images/maps/map_1.png | Bin 0 -> 12882 bytes source/main.lua | 11 +++ source/scenes/Assemble.lua | 17 +++- source/scenes/DroneCardSelector.lua | 24 +++-- source/scenes/MapSelector.lua | 123 +++++++++++++++++++++++ source/scenes/Menu.lua | 4 +- source/scripts/MapCard.lua | 11 +++ 14 files changed, 416 insertions(+), 19 deletions(-) create mode 100644 .vscode/launch.json create mode 100755 build_and_run_mac.sh create mode 100644 source/assets/audio/back.wav create mode 100644 source/assets/fonts/Outfoxies.fnt create mode 100644 source/assets/images/maps/map_1.png create mode 100644 source/scenes/MapSelector.lua create mode 100644 source/scripts/MapCard.lua diff --git a/.luarc.json b/.luarc.json index 07d83c5..e54d37a 100644 --- a/.luarc.json +++ b/.luarc.json @@ -28,7 +28,7 @@ ], "runtime.version": "Lua 5.4", "workspace.library": [ - "/home/ut3usw/src/playdate-luacats", - "/home/ut3usw/Projects/VSCode-PlaydateTemplate/source/libraries" + "/Users/oleksiiilienko/projects/playdate-luacats", + "/Users/oleksiiilienko/Documents/fpv2/source/libraries" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0e19324 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "playdate", + "request": "launch", + "name": "Playdate: Debug", + "preLaunchTask": "${defaultBuildTask}" + } + ] + } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index b47c477..526d129 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,4 +5,8 @@ "Lua.runtime.nonstandardSymbol": ["+=", "-=", "*=", "/=", "//=", "%=", "<<=", ">>=", "&=", "|=", "^="], "Lua.workspace.library": ["$PLAYDATE_SDK_PATH/CoreLibs"], "Lua.workspace.preloadFileSize": 1000, -} + "playdate-debug.sdkPath": "/Users/oleksiiilienko/Developer/PlaydateSDK", + "playdate-debug.sourcePath": "/Users/oleksiiilienko/Documents/fpv2/source", + "playdate-debug.outputPath": "/Users/oleksiiilienko/Documents/fpv2/builds", + "playdate-debug.productName": "FPV Game" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6399696..762ab3f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -3,6 +3,26 @@ // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ + { + "type": "pdc", + "problemMatcher": ["$pdc-lua", "$pdc-external"], + "label": "Playdate: Build" + }, + { + "type": "playdate-simulator", + "problemMatcher": ["$pdc-external"], + "label": "Playdate: Run" + }, + { + "label": "Playdate: Build and Run", + "dependsOn": ["Playdate: Build", "Playdate: Run"], + "dependsOrder": "sequence", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + }, { "label": "Invoke Build and Run script", "type": "shell", @@ -29,6 +49,12 @@ "build" ] }, + "osx": { + "command": "${workspaceFolder}/build_and_run_mac.sh", + "args": [ + "build" + ] + }, "presentation": { "showReuseMessage": false, "reveal": "always", @@ -62,6 +88,12 @@ "run" ] }, + "osx": { + "command": "${workspaceFolder}/build_and_run_mac.sh", + "args": [ + "run" + ] + }, "presentation": { "showReuseMessage": false, "reveal": "always", diff --git a/build_and_run_mac.sh b/build_and_run_mac.sh new file mode 100755 index 0000000..304e721 --- /dev/null +++ b/build_and_run_mac.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +export PLAYDATE_SDK_PATH="/Users/oleksiiilienko/Developer/PlaydateSDK" + +# Check for color by variable and tput command +if [[ -z $NOCOLOR && -n $(command -v tput) ]]; then + RED=$(tput setaf 1) + CYN=$(tput setaf 6) + YEL=$(tput setaf 3) + RST=$(tput sgr0) +fi + +function display_help() { + printf "%s\n\n" "${0} build|run|-h|--help|" + printf "%-16s\n" "build: Builds the project and runs the Simulator" + printf "%-16s\n" "run : Skips building the project and runs the Simulator" + printf "\n" + printf "%s\n\n" "Set NOCOLOR=1 to disable terminal coloring" + exit 0 +} + +# We don't need fancy flags/operators for two commands +case $1 in + "build") + BUILD=1 + ;; + "run") + BUILD=0 + ;; + *) + display_help + exit 1 + ;; +esac + +# Set some paths +BUILD_DIR="./builds" +SOURCE_DIR="./source" +PDX_PATH="${BUILD_DIR}/$(basename $(pwd)).pdx" + +# Logging functions +function log() { + printf "%s\n" "${CYN}>> $1${RST}" +} +function log_warn() { + printf "%s\n" "${YEL}>! $1${RST}" +} +function log_err() { + printf "%s\n >> %s\n" "${RED}!! ERROR !!" "$1${RST}" +} + +function check_pdxinfo() { + if [[ -f ./source/pdxinfo ]]; then + if grep "com.organization.package" ./source/pdxinfo 2>&1 >/dev/null; then + log_warn "PDXINFO NOTICE:" + log_warn "Don't forget to change your unique project info in 'source/pdxinfo': 'bundleID', 'name', 'author', 'description'." + log_warn "It's critical to change your game bundleID, so there will be no collisions with other games, installed via sideload." + log_warn "Read more about pdxinfo here: https://sdk.play.date/Inside%20Playdate.html#pdxinfo" + fi + fi +} + +function chk_err() { + # Check for errors in last process and bail if needed + if [[ $? > 0 ]]; then + log_err "There was an issue with the previous command; exiting!" + exit 1 + fi +} + +function check_close_sim() { + # Check if we have 'pidof' + PIDOF=$(command -v pidof2) + + # Prefer 'pidof'; use ps if not + if [[ -n $PIDOF ]]; then + SIMPID=$($PIDOF "PlaydateSimulator") + if [[ -n $SIMPID ]]; then + log "Found existing Simulator, closing..." + kill -9 $SIMPID + chk_err + fi + else + SIMPID=$(ps aux | grep PlaydateSimulator | grep -v grep | awk '{print $2}') + if [[ -n $SIMPID ]]; then + log "Found existing Simulator, closing..." + kill -9 $SIMPID + chk_err + fi + fi +} + +# Create build dir +function make_build_dir() { + if [[ ! -d "${BUILD_DIR}" ]]; then + log "Creating build directory..." + mkdir -p "${BUILD_DIR}" + chk_err + fi +} + +# Clean build dir +function clean_build_dir() { + if [[ -d "${BUILD_DIR}" ]]; then + log "Cleaning build directory..." + rm -rfv "${BUILD_DIR}/*" + chk_err + fi +} + +# Compile the PDX +function build_pdx() { + if [[ $BUILD == 1 ]]; then + log "Building PDX with 'pdc'..." + $PLAYDATE_SDK_PATH/bin/pdc -sdkpath "${PLAYDATE_SDK_PATH}" "${SOURCE_DIR}" "${PDX_PATH}" + chk_err + fi +} + +# Run the PDX with Simulator +function run_pdx() { + if [[ -d "${PDX_PATH}" ]]; then + log "Running PDX with Simulator..." + open -a "$PLAYDATE_SDK_PATH/bin/Playdate Simulator.app" "${PDX_PATH}" + else + log_err "PDX doesn't exist! Please 'build' the project first!" + fi +} + + +#### MAIN SCRIPT #### +if [[ $BUILD == 1 ]]; then + log "Attempting a build and run of PDX..." + make_build_dir + clean_build_dir + check_pdxinfo + build_pdx + check_close_sim + run_pdx +else + log "Attempting to run PDX: ${PDX_PATH}..." + check_close_sim + run_pdx +fi + diff --git a/source/assets/audio/back.wav b/source/assets/audio/back.wav new file mode 100644 index 0000000000000000000000000000000000000000..aff8b316a577882445c7dfe39dca5ed4e7613400 GIT binary patch literal 37326 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

d#} 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 G=l=k^RfPfo literal 0 HcmV?d00001 diff --git a/source/assets/fonts/Outfoxies.fnt b/source/assets/fonts/Outfoxies.fnt new file mode 100644 index 0000000..a78f131 --- /dev/null +++ b/source/assets/fonts/Outfoxies.fnt @@ -0,0 +1,47 @@ +--metrics={"baseline":7,"xHeight":0,"capHeight":0,"pairs":{},"left":[],"right":[]} +datalen=1204 +data=iVBORw0KGgoAAAANSUhEUgAAADgAAAAwCAYAAABE1blzAAAAAXNSR0IArs4c6QAAA0BJREFUaEPdWdtyqzAQa/7/o9uBqVMhpNUaCE17njr22uxVknMeHz//PuHv8eeD1tAG99TZ5eiwSfvjM2w3c176zxcop5XNchnbumQs62y/BDQccj7gGXc++f9Ag+EIZ55thnOpghiY647hOAaLa84/7jC+57mvLmDHuhXExLgKuQ5xgY47UwfYfVcddTFnWVW6qhSPuEsk2rnKsH/Kbr0/9bBrV25TlUG06VQAA+Nx6Z7fdUhnjhzCdVASMy1AegNU6juXoaj6+L9YSxlKVZrpgG7CqnZXc4yAtttXIFMNeYWCCUU7ASYhkVCYfd8oDRzsNkp9E75FMRIEVZCVeEj3t1EUCbSiBeY5ViUIGKxwVJCO6CsebKG0kldKWqUMqjlwEo0DTNzpFJHiUW7xJw9yxlW7pBnrnHEtunMMDF0gSSisd6oKYpvuhpY8vBJFXSW5OxxWSJ7tzEcH/a6yUUL71N3dCqjsJo5UgCWz/L1YfSO1sMKA1b+uFu1oQdUNqSIMXgn0+D70S9IME73KlBK+HZ7kCvLsnN1nlJa0pgJUQ8yc4wJkUKqUkso+82m3AywL/HYFZ75fKS2cwU3H3T2DSUi/bAYtCjUQzp11KOqo6aUoeopr3vlwJ5sO/RwPOrqoKnqY51KHVQFWYlZBNK8pRK1oqAIR9VpRL5CdtDwSIPMiU0hF+GjrzrmnU0qA3GcUrQg8IW63gq4zrli3FUzvPSWReAbVrB7lua4AcX495z1VRVWU17jtWFWoVnSasiMV8f6oqHBeuu8xbAPV4mnfzVLiza5/GwxwIPPO1Dbl21UVrNRMxaPYYmd40vLo7AzuUAp+NkTQ4TmsNOgV6Gln+ijKVXTCLdSduW6gXGk+t9mv4Fh9cKaCTn0ovqxQlYWF+hVguoLpUkcfjKDyZwTxX9qJhyuqcepoXXcz2MnoTIXTTCatiSDGyefgZYvOoGCaKcWDTM4OkNT8qrHg8xFFp7jlLxlXYvsoL6Uq3Jqfq2mCnXf8d1uQCmQcDDvkdK8IBRy3BYbtxwCgUCqhWGf/9uAQidwrWqGVI2qscIWktwbancEOj6mXydvNoKqCe3Gkl4gag1urp8j2dgde/cEvnycmPQiDA1YAAAAASUVORK5CYII= +width=8 +height=8 + +tracking=1 + +0 8 +1 8 +2 8 +3 8 +4 8 +5 8 +6 8 +7 8 +8 8 +9 8 +space 8 +� 8 +A 8 +B 8 +C 8 +D 8 +E 8 +F 8 +G 8 +H 8 +I 8 +J 8 +K 8 +L 8 +M 8 +N 8 +O 8 +P 8 +Q 8 +R 8 +S 8 +T 8 +U 8 +V 8 +W 8 +X 8 +Y 8 +Z 8 + diff --git a/source/assets/images/maps/map_1.png b/source/assets/images/maps/map_1.png new file mode 100644 index 0000000000000000000000000000000000000000..80800247b774bb7db96ed10caa7523f783f9d9d5 GIT binary patch literal 12882 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 literal 0 HcmV?d00001 diff --git a/source/main.lua b/source/main.lua index 871bb8e..f71332f 100644 --- a/source/main.lua +++ b/source/main.lua @@ -34,6 +34,15 @@ CollideGroups = { wall = 5 } +Maps = { + { + id = 1, + name = "Vovchansk", + description = "This is a map", + locked = false, + } +} + Drones = { { id = 1, @@ -84,12 +93,14 @@ import "scripts/progressBar" import "scripts/selectionSprite" import "scripts/DroneCard" import "scripts/pageSprite" +import "scripts/MapCard" import "scenes/BaseScene" import 'scenes/Assemble' import 'scenes/DroneCardSelector' import 'scenes/Menu' import 'scenes/Game' +import 'scenes/MapSelector' Difficulty = { Easy = "Easy", diff --git a/source/scenes/Assemble.lua b/source/scenes/Assemble.lua index 43ef422..e9c593a 100644 --- a/source/scenes/Assemble.lua +++ b/source/scenes/Assemble.lua @@ -132,21 +132,24 @@ end function scene:start() scene.super.start(self) + self.optionsMenu:addMenuItem("Main Menu", function() Noble.transition(Menu) end) Noble.showFPS = false + if scene.musicEnabled then + scene.levelAudio:play(0) + end end function scene:enter() scene.super.enter(self) - + local soundTable = playdate.sound.playingSources() + for i=1, #soundTable do + soundTable[i]:stop() + end scene.buttonTimeout = 100 Noble.Input.setHandler(scene.inputHandler) - - if scene.musicEnabled then - scene.levelAudio:play(0) - end local text = [[The drone is assembled and operational. We are ready for the mission. @@ -226,6 +229,10 @@ function scene:update() self.tickTimer:remove() screenShake(100, 5) Noble.Input.setEnabled(false) + playdate.timer.performAfterDelay(2500, function() -- Return to the start after failure + Noble.Input.setEnabled(true) + Noble.transition(DroneCardSelector, nil, Noble.Transition.SpotlightMask); + end) return end diff --git a/source/scenes/DroneCardSelector.lua b/source/scenes/DroneCardSelector.lua index 2b37938..658131e 100644 --- a/source/scenes/DroneCardSelector.lua +++ b/source/scenes/DroneCardSelector.lua @@ -12,7 +12,10 @@ scene.inputHandler = { scene.menuConfirmSound:play(1) Noble.transition(Assemble) end, - BButtonDown = function() end, + BButtonDown = function() + scene.menuBackSound:play(1) + Noble.transition(MapSelector) + end, downButtonDown = function() end, leftButtonDown = function() @@ -41,7 +44,9 @@ function scene:setValues() self.menuIndex = 1 self.aKey = Graphics.image.new("assets/sprites/buttons/A") + self.bKey = Graphics.image.new("assets/sprites/buttons/B") scene.menuConfirmSound = playdate.sound.fileplayer.new("assets/audio/confirm") + scene.menuBackSound = playdate.sound.fileplayer.new("assets/audio/back") scene.menuSelSound = playdate.sound.fileplayer.new("assets/audio/menu_select") scene.menuSelSound:setVolume(0.5) @@ -64,12 +69,10 @@ end function scene:enter() scene.super.enter(self) - scene.cards = { - DroneCard(0, 0, Drones[1]), - DroneCard(0, 0, Drones[2]), - DroneCard(0, 0, Drones[3]), - DroneCard(0, 0, Drones[4]), - } + scene.cards = {} + for i = 1, #Drones do + scene.cards[i] = DroneCard(0, 0, Drones[i]) + end scene.paginator = PageSprite(200, 207) end @@ -91,7 +94,7 @@ function scene:update() end local x = 0 - for i = 1, 4 do + for i = 1, #scene.cards do x = 29 + (339 + 16) * (i - 1) scene.cards[i]:moveTo(x + scene.currentX, 25) end @@ -101,12 +104,15 @@ function scene:update() Noble.Text.draw("Assemble", 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) end + self.bKey:draw(15, 207 + dy) + Noble.Text.draw("Back", 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + scene.paginator:moveTo(200, 207) end function scene:exit() scene.super.exit(self) - for i = 1, 4 do + for i = 1, #scene.cards do scene.cards[i]:remove() end Noble.showFPS = false diff --git a/source/scenes/MapSelector.lua b/source/scenes/MapSelector.lua new file mode 100644 index 0000000..0fa0cb1 --- /dev/null +++ b/source/scenes/MapSelector.lua @@ -0,0 +1,123 @@ +MapSelector = {} +class("MapSelector").extends(BaseScene) +local scene = MapSelector +local fontMed = Graphics.font.new('assets/fonts/onyx_9') +local fontBig = Graphics.font.new('assets/fonts/opal_12') +local elapsedTime = 0 + +function scene:init() + playdate.graphics.setImageDrawMode(playdate.graphics.kDrawModeXOR) + scene.super.init(self) + scene.menuIndex = 1 + + self.aKey = Graphics.image.new("assets/sprites/buttons/A") + self.bKey = Graphics.image.new("assets/sprites/buttons/B") + + scene.menuConfirmSound = playdate.sound.fileplayer.new("assets/audio/confirm") + scene.menuBackSound = playdate.sound.fileplayer.new("assets/audio/back") + + scene.menuSelSound = playdate.sound.fileplayer.new("assets/audio/menu_select") + scene.menuSelSound:setVolume(0.5) + + scene.currentX = 0 + scene.targetX = 0 +end + +function scene:start() + scene.super.start(self) + + Noble.showFPS = false + + self.optionsMenu:addMenuItem("Main Menu", function() Noble.transition(Menu) end) +end + + +function scene:enter() + scene.super.enter(self) + scene.cards = {} + for i = 1, #Maps do + scene.cards[i] = MapCard(0, 0, Maps[i]) + end +end + +function scene:update() + scene.super.update(self) + elapsedTime = elapsedTime + 1 / playdate.display.getRefreshRate() + + local dy = 2 * math.sin(20 * elapsedTime) + + local speed = 40 + if math.abs(scene.targetX - scene.currentX) < speed then + scene.currentX = scene.targetX + else + scene.currentX = scene.currentX + speed * ((scene.targetX > scene.currentX) and 1 or -1) + end + + local x = 0 + for i = 1, #scene.cards do + x = 0 + (339 + 16) * (i - 1) + scene.cards[i]:moveTo(x + scene.currentX, 0) + end + + -- Bottom background + if Maps[scene.menuIndex].locked == false then + self.aKey:draw(315, 207 + dy) + Noble.Text.draw("Select", 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + end + + self.bKey:draw(15, 207 + dy) + Noble.Text.draw("Back", 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + + Noble.Text.draw(string.upper(Maps[scene.menuIndex].name), 200, 210, Noble.Text.ALIGN_CENTER, false, fontBig) + + +end + +function scene:exit() + scene.super.exit(self) + for i = 1, #scene.cards do + scene.cards[i]:remove() + end + Noble.showFPS = false + playdate.graphics.setImageDrawMode(playdate.graphics.kDrawModeXOR) +end + +function scene:finish() + scene.super.finish(self) + for i = 1, #scene.cards do + scene.cards[i]:remove() + end + playdate.display.setScale(1) +end + +scene.inputHandler = { + AButtonDown = function() + if Maps[scene.menuIndex].locked then + return + end + scene.menuConfirmSound:play(1) + Noble.transition(DroneCardSelector) + end, + BButtonDown = function() + scene.menuBackSound:play(1) + Noble.transition(Menu) + end, + leftButtonDown = function() + if scene.menuIndex <= 1 then + return + end + scene.menuSelSound:play(1) + scene.targetX = scene.targetX + 355 + scene.menuIndex = scene.menuIndex - 1 + end, + rightButtonDown = function() + if scene.menuIndex >= #Maps then + return + end + scene.menuSelSound:play(1) + scene.targetX = scene.targetX - 355 + scene.menuIndex = scene.menuIndex + 1 + end, + upButtonDown = function() + end, +} \ No newline at end of file diff --git a/source/scenes/Menu.lua b/source/scenes/Menu.lua index d99b8ee..c213420 100644 --- a/source/scenes/Menu.lua +++ b/source/scenes/Menu.lua @@ -106,13 +106,13 @@ end function scene:exit() scene.super.exit(self) - scene.levelAudio:stop() + -- scene.levelAudio:stop() self.sequence = Sequence.new():from(self.menuY):to(self.menuYTo, 0.5, Ease.inSine) self.sequence:start() end function scene:setupMenu(__menu) - __menu:addItem("Start", function() Noble.transition(DroneCardSelector, nil, Noble.Transition.DipToWhite) end) + __menu:addItem("Start", function() Noble.transition(MapSelector, nil, Noble.Transition.DipToWhite) end) __menu:addItem("Tutorial", function() local debug = Noble.Settings.get("debug") if debug then diff --git a/source/scripts/MapCard.lua b/source/scripts/MapCard.lua new file mode 100644 index 0000000..d69f4f7 --- /dev/null +++ b/source/scripts/MapCard.lua @@ -0,0 +1,11 @@ +local pd = playdate +local gfx = Graphics + +class('MapCard').extends(gfx.sprite) + +function MapCard:init(x, y, map) + self:setImage(gfx.image.new('assets/images/maps/map_' .. map.id .. '.png')) + self:setCenter(0, 0) + self:moveTo(x, y) + self:add() +end