diff --git a/apps/stacker/ChangeLog b/apps/stacker/ChangeLog new file mode 100644 index 000000000..2286a7f70 --- /dev/null +++ b/apps/stacker/ChangeLog @@ -0,0 +1 @@ +0.01: New App! \ No newline at end of file diff --git a/apps/stacker/README.md b/apps/stacker/README.md new file mode 100644 index 000000000..5be5b7bee --- /dev/null +++ b/apps/stacker/README.md @@ -0,0 +1,12 @@ +# Stacker + +A simple game of stacking cubes. + + +## Usage + +Press the button to stack! + +## Creator + +NovaDawn999 diff --git a/apps/stacker/app-icon.js b/apps/stacker/app-icon.js new file mode 100644 index 000000000..37130b23f --- /dev/null +++ b/apps/stacker/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIcZh////AAoMIAQNAAq8D//IDrQFFn//DrcH/+IDqx9DAQIADwEAggOBkAF/AuJ9FA==")) \ No newline at end of file diff --git a/apps/stacker/app.js b/apps/stacker/app.js new file mode 100644 index 000000000..bf3be0907 --- /dev/null +++ b/apps/stacker/app.js @@ -0,0 +1,140 @@ +const TICKRATE = 80; +const BLOCK_SIZE = 16; +const BLOCK_COLOR_PRIMARY = "#ff0000"; +const BLOCK_COLOR_SECONDARY = "#ffff00"; +const GAMEBOARD_X = 16; +const GAMEBOARD_WIDTH = g.getWidth() - 16 - BLOCK_SIZE; +const START_X = GAMEBOARD_X; +const START_Y = g.getHeight() - BLOCK_SIZE - 1; +const START_LENGTH = 5; +var startTime = 0; +var length = 5; +var updateTimeout; +var rows = []; +var playing = true; + +class Block { + constructor(x, y, match) { + this.x = x; + this.y = y; + this.match = match; + this.show = true; + } +} + +class Row { + constructor(x, y, size, direction, match) { + this.y = y; + this.size = size; + this.blocks = []; + if (Math.random() > 0.49) { + this.direction = 1; + this.x = BLOCK_SIZE; + } + else { + this.direction = -1; + this.x = g.getWidth() - this.size * BLOCK_SIZE; + } + this.match = match; + for (var i = 0; i < size; i++) { + var b = new Block(this.x + (BLOCK_SIZE * i), this.y, this.match); + this.blocks.push(b); + } + } + update() { + this.x += BLOCK_SIZE * this.direction; + if (this.x + (this.size * BLOCK_SIZE) > GAMEBOARD_X + GAMEBOARD_WIDTH || this.x < GAMEBOARD_X) { + this.direction = -this.direction; + } + for (var i = 0; i < this.size; i++) { + this.blocks[i].x = this.x + BLOCK_SIZE * i; + } + } + draw() { + for (var i = 0; i < this.size; i++) { + if (this.blocks[i].show) { + g.drawRect({x: this.blocks[i].x, y: this.y, w: BLOCK_SIZE, h: BLOCK_SIZE}); + } + } + } +} + +function init() { + Bangle.setLCDPower(1); + g.setTheme({bg:"#000", fg:"#fff", dark:true}).clear(); + setInterval(update, TICKRATE); + setWatch(input_pressed, BTN); + var test = new Row(START_X, START_Y, length, 1, true); + rows.push(test); +} + +function update() { + "ram" + if (playing) { + g.clear(reset); + rows[rows.length - 1].update(); + rows.forEach(row => row.draw()); + } +} + +function resetGame() { + playing = true; + rows = []; + length = START_LENGTH; + var test = new Row(START_X, START_Y, length, 1, true); + rows.push(test); + update(); +} + +function lose() { + print("lose"); + g.clear(reset); + E.showMessage("YOU LOSE!"); + playing = false; + setWatch(resetGame, BTN, {repeat:0,debounce:50,edge:"rising"}); +} + +function win() { + playing = false; + setWatch(resetGame, BTN, {repeat:0,debounce:50,edge:"rising"}); + g.clear(reset); + E.showMessage("YOU WIN!"); +} + +function collapse() { + for (var i = 0; i < rows[rows.length - 1].blocks.length; i++) { + for (var j = 0; j < rows[rows.length -2].blocks.length; j++) { + if (rows[rows.length - 1].blocks[i].x === rows[rows.length - 2].blocks[j].x) { + if (rows[rows.length - 2].blocks[j].match === true) + rows[rows.length - 1].blocks[i].match = true; + } + } + } + for (var y = 0; y < rows[rows.length - 1].blocks.length; y++) { + if (rows[rows.length - 1].blocks[y].match === false) { + length -= 1; + if (length < 1) { + lose(); + playing = false; + } + rows[rows.length - 1].blocks[y].show = false; + } + } +} + +function input_pressed() { + setWatch(input_pressed, BTN); + if (playing) { + if (rows.length > 1) { + collapse(); + if (rows[rows.length - 1].y === -1) { + win(); + } + } + var r = new Row(GAMEBOARD_X + Math.round(length/2) * BLOCK_SIZE, rows[rows.length - 1].y - BLOCK_SIZE, length, 1, false); + rows.push(r); + } +} + +init(); +update(); \ No newline at end of file diff --git a/apps/stacker/app.png b/apps/stacker/app.png new file mode 100644 index 000000000..35683688a Binary files /dev/null and b/apps/stacker/app.png differ diff --git a/apps/stacker/metadata.json b/apps/stacker/metadata.json new file mode 100644 index 000000000..e19ef5e11 --- /dev/null +++ b/apps/stacker/metadata.json @@ -0,0 +1,14 @@ +{ "id": "stacker", + "name": "Stacker", + "shortName":"Stacker", + "version":"0.01", + "description": "Game of Stacking", + "icon": "app.png", + "tags": "game", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"stacker.app.js","url":"app.js"}, + {"name":"stacker.img","url":"app-icon.js","evaluate":true} + ] +}