From 7e8df5593e450e0742c182a844d7313cbc9f0173 Mon Sep 17 00:00:00 2001 From: The Dod Date: Thu, 13 Jan 2022 17:53:42 +0200 Subject: [PATCH] Add AccelaMaze game app --- apps.json | 15 ++ apps/acmaze/ChangeLog | 1 + apps/acmaze/README.md | 17 +++ apps/acmaze/app-icon.js | 1 + apps/acmaze/app.js | 276 +++++++++++++++++++++++++++++++++++++ apps/acmaze/app.png | Bin 0 -> 8863 bytes apps/acmaze/screenshot.png | Bin 0 -> 10082 bytes 7 files changed, 310 insertions(+) create mode 100644 apps/acmaze/ChangeLog create mode 100644 apps/acmaze/README.md create mode 100644 apps/acmaze/app-icon.js create mode 100644 apps/acmaze/app.js create mode 100644 apps/acmaze/app.png create mode 100644 apps/acmaze/screenshot.png diff --git a/apps.json b/apps.json index f28766ab5..bf887cabc 100644 --- a/apps.json +++ b/apps.json @@ -5660,5 +5660,20 @@ {"name":"timeandlife.app.js","url":"app.js"}, {"name":"timeandlife.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "acmaze", + "name": "AccelaMaze", + "shortName":"AccelaMaze", + "version":"0.01", + "description": "Tilt the watch to roll a ball through a maze", + "icon": "app.png", + "tags": "game", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "screenshots": [{"url":"screenshot.png"}], + "storage": [ + {"name":"acmaze.app.js","url":"app.js"}, + {"name":"acmaze.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/acmaze/ChangeLog b/apps/acmaze/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/acmaze/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/acmaze/README.md b/apps/acmaze/README.md new file mode 100644 index 000000000..4724eea3e --- /dev/null +++ b/apps/acmaze/README.md @@ -0,0 +1,17 @@ +# AccelaMaze + +Tilt the watch to roll a ball through a maze. + +![Screenshot](screenshot.png) + +## Usage + +* Use the menu to select difficulty level (or exit). +* Wait until the maze gets generated and a red ball appears. +* Tilt the watch to get the ball into the green cell. + +At any time you can click the button to return to the menu. + +## Creator + +[Nimrod Kerrett](https://zzzen.com) diff --git a/apps/acmaze/app-icon.js b/apps/acmaze/app-icon.js new file mode 100644 index 000000000..8bd043b8b --- /dev/null +++ b/apps/acmaze/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwggaXh3M53/AA3yl4IHn//+EM5nMAoIX/C4RfCC4szmcxC4QFBAAUxC4UPAwIOB+YCCiMRkAFCkIGBAAQfBC4IUEAQhHIAAQX/C5EDmcyCgUTAoYXDR4kzC4UBPoKVB+YFFAQSPBiAKBiCnDGoZECABDUCa4YX/C5qPBQwoXGkczmC/FQYSSCVQSSCEwQOCC4hKFX4QXCd5YX/C4qMEmQXITAinDPoIADTwSPFkKMBX47RGI47XIC/4XCgZ9DQYYABmKYBmIXFkczmEBRIK/CQYQIBkECSoiSCA4MQa5pEFd6IX/RgMyC6H/QASVCRIS/EAQrXFJQoX/C6kDRQIXCiYFD+QFBmIUCkYFD+CJBiSPCRwIFFSoQFCiF3u9wI4gAO+wXW+IXygAAW")) diff --git a/apps/acmaze/app.js b/apps/acmaze/app.js new file mode 100644 index 000000000..53a851b5e --- /dev/null +++ b/apps/acmaze/app.js @@ -0,0 +1,276 @@ +const MARGIN = 25; +const WALL_RIGHT = 1, WALL_DOWN = 2; +const STATUS_GENERATING = 0, STATUS_PLAYING = 1, + STATUS_SOLVED = 2, STATUS_ABORTED = -1; + +function Maze(n) { + this.n = n; + this.status = STATUS_GENERATING; + this.wall_length = Math.floor((g.getHeight()-2*MARGIN)/n); + this.total_length = this.wall_length*n; + this.margin = Math.floor((g.getHeight()-this.total_length)/2); + this.ball_x = 0; + this.ball_y = 0; + this.clearScreen = function() { + g.clearRect( + 0, this.margin, + g.getWidth(), this.margin+this.total_length + ); + }; + this.clearScreen(); + g.setColor(g.theme.fg); + for (let i=0; i<=n; i++) { + g.drawRect( + this.margin, this.margin+i*this.wall_length, + g.getWidth()-this.margin, this.margin+i*this.wall_length + ); + g.drawRect( + this.margin+i*this.wall_length, this.margin, + this.margin+i*this.wall_length, g.getHeight() - this.margin + ); + } + this.walls = new Uint8Array(n*n); + this.groups = new Uint8Array(n*n); + for (let cell = 0; cell0 && !(this.walls[n*(ball_r-1)+ball_c]&WALL_DOWN)) { + next_y--; + } else if (dy>0 && ball_r<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_DOWN)) { + next_y++; + } else if (dx<0 && ball_c>0 && !(this.walls[n*ball_r+ball_c-1]&WALL_RIGHT)) { + next_x--; + } else if (dx>0 && ball_c<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_RIGHT)) { + next_x++; + } else { + return false; + } + } + this.clearCell(ball_r, ball_c); + if (this.ball_x%this.wall_length) { + this.clearCell(ball_r, ball_c+1); + } + if (this.ball_y%this.wall_length) { + this.clearCell(ball_r+1, ball_c); + } + this.ball_x = next_x; + this.ball_y = next_y; + this.drawBall(this.ball_x, this.ball_y); + if (this.ball_x==(n-1)*this.wall_length && this.ball_y==(n-1)*this.wall_length) { + this.status = STATUS_SOLVED; + } + return true; + }; + this.try_move_horizontally = function(accel_x) { + if (accel_x>0.15) { + return this.move(-1, 0); + } else if (accel_x<-0.15) { + return this.move(1, 0); + } + return false; + }; + this.try_move_vertically = function(accel_y) { + if (accel_y<-0.15) { + return this.move(0,1); + } else if (accel_y>0.15) { + return this.move(0,-1); + } + return false; + }; + this.tick = function() { + accel = Bangle.getAccel(); + if (this.ball_x%this.wall_length) { + this.try_move_horizontally(accel.x); + } else if (this.ball_y%this.wall_length) { + this.try_move_vertically(accel.y); + } else { + if (Math.abs(accel.x)>Math.abs(accel.y)) { // prefer horizontally + if (!this.try_move_horizontally(accel.x)) { + this.try_move_vertically(accel.y); + } + } else { // prefer vertically + if (!this.try_move_vertically(accel.y)) { + this.try_move_horizontally(accel.x); + } + } + } + }; + this.clearCell(0,0); + this.clearCell(n-1,n-1); + this.drawBall(0,0); + this.status = STATUS_PLAYING; +} + +function timeToText(t) { // Courtesy of stopwatch app + let hrs = Math.floor(t/3600000); + let mins = Math.floor(t/60000)%60; + let secs = Math.floor(t/1000)%60; + let tnth = Math.floor(t/100)%10; + let text; + + if (hrs === 0) + text = ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2) + "." + tnth; + else + text = ("0"+hrs) + ":" + ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2); + return text; +} + +let aborting = false; +let start_time = 0; +let duration = 0; +let maze=null; +let mazeMenu = { + "": { "title": "Maze size", "selected": 1 }, + "Easy (8x8)": function() { E.showMenu(); maze = new Maze(8); }, + "Medium (10x10)": function() { E.showMenu(); maze = new Maze(10); }, + "Hard (14x14)": function() { E.showMenu(); maze = new Maze(14); }, + "< Exit": function() { setTimeout(load, 100); } // timeout voodoo prevents deadlock +}; + +g.clear(true); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setLocked(false); +Bangle.setLCDTimeout(0); +E.showMenu(mazeMenu); +let maze_interval = setInterval( + function() { + if (maze) { + if (digitalRead(BTN1) || maze.status==STATUS_ABORTED) { + console.log(`aborting ${start_time}`); + maze = null; + start_time = duration = 0; + aborting = false; + setTimeout(function() {E.showMenu(mazeMenu); }, 100); + return; + } + if (!start_time) { + start_time = Date.now(); + } + if (maze.status==STATUS_PLAYING) { + maze.tick(); + } + if (maze.status==STATUS_SOLVED && !duration) { + duration = Date.now()-start_time; + g.setFontAlign(0,0).setColor(g.theme.fg); + g.setFont("Vector",18); + g.drawString(`Solved in\n ${timeToText(duration)} \nClick to play again`, g.getWidth()/2, g.getHeight()/2, true); + } + } + }, 25); diff --git a/apps/acmaze/app.png b/apps/acmaze/app.png new file mode 100644 index 0000000000000000000000000000000000000000..0d96448b11888295d626c0eb3a81c031b105f177 GIT binary patch literal 8863 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