From f4387fca64d9a99465522305c716442d63f9ac93 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 21:24:45 +0100 Subject: [PATCH 1/5] First entry of my 1024 Game (v0.5) --- apps/game1024/Changelog | 2 + apps/game1024/app-icon.js | 1 + apps/game1024/app.js | 682 ++++++++++++++++++++++++++++++++ apps/game1024/game1024.app.info | 6 + apps/game1024/game1024.json | 1 + apps/game1024/game1024.png | Bin 0 -> 1768 bytes apps/game1024/metadata.json | 13 + 7 files changed, 705 insertions(+) create mode 100644 apps/game1024/Changelog create mode 100644 apps/game1024/app-icon.js create mode 100644 apps/game1024/app.js create mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/game1024.json create mode 100644 apps/game1024/game1024.png create mode 100644 apps/game1024/metadata.json diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog new file mode 100644 index 000000000..310242d11 --- /dev/null +++ b/apps/game1024/Changelog @@ -0,0 +1,2 @@ +0.01: New App! +0.5: First version in Github \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js new file mode 100644 index 000000000..2a9df2fa3 --- /dev/null +++ b/apps/game1024/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js new file mode 100644 index 000000000..52f82cdeb --- /dev/null +++ b/apps/game1024/app.js @@ -0,0 +1,682 @@ +const debugMode = 'development'; // valid values are: off, test, production, development +const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; +const rows = 4, cols = 4; +const borderWidth = 6; +const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; +const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, + {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, + {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, + {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; +const cellFgColor = '#000000'; +const cellShadowColor = '#f2f2f2'; +const cellFonts = ["12x20", "12x20", "Vector:14"]; +const cellChars = [ + [0,1,2,3,4,5,6,7,8,9,10], + ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] +]; +// const numInitialCells = 2; +const maxUndoLevels = 4; +const noExceptions = true; +let charIndex = 0; // plain numbers on the grid + + + +const scores = { + currentScore: 0, + highScore: 0, + lastScores: [0], + add: function(val) { + this.currentScore = this.currentScore + Math.pow(2, val); + debug(console.log("new score=",this.currentScore)); + }, + addToUndo: function () { + this.lastScores.push(this.currentScore); + if (this.lastScores.length > maxUndoLevels) this.lastScores.shift(); + }, + undo: function () { + this.currentScore = this.lastScores.pop(); + debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + }, + reset: function () { + this.currentScore = 0; + this.lastScores = [0]; + }, + draw: function () { + g.setColor(btnAtribs.fg); + let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; + let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); + g.setFont12x20(1); + g.setFontAlign(0,0,0); + let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); + let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; + g.setColor('#000000'); + g.drawString(this.currentScore, scrX+1, scrY+1); + g.setColor(btnAtribs.bg); + g.drawString(this.currentScore, scrX, scrY); + scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); + g.setFont("6x8:1x2"); + g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + }, + hsContents: function () { + return {"highScore": this.highScore, "lastScore": this.currentScore}; + }, + check: function () { + this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; + debug(console.log('highScore =', this.highScore)); + } +}; + +// snapshot interval is the number of moves after wich a snapshot is wriiten to file +const snInterval = 1; + +const snReadOnInit = true; +// a snapshot contains a json file dump of the last positions of the tiles on the board, including the scores +const snapshot = { + interval: snInterval, + snFileName: 'game1024.json', + counter: 0, + updCounter: function() { + this.counter = ++this.counter > this.interval ? 0 : this.counter; + }, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + write: function() { + require("Storage").writeJSON(this.snFileName, this.dump); + }, + read: function () { + let sn = require("Storage").readJSON(this.snFileName, noExceptions); + if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { + require("Storage").writeJSON(this.snFileName, this.dump); + return false; + } else { + if ((typeof sn !== "undefined") && (sn.gridsize == rows * cols)){ + this.dump = sn; + return true; + } + } + }, + setDump: function () { + this.dump.expVals = []; + allSquares.forEach(sq => { + this.dump.expVals.push(sq.expVal); + }); + this.dump.score = scores.currentScore; + this.dump.highScore = scores.highScore; + this.dump.charIndex = charIndex; + }, + make: function () { + this.updCounter(); + if (this.counter == this.interval) { + this.setDump(); + this.write(); + debug(console.log("D U M P E D!", this.dump)); + } + }, + recover: function () { + if (this.read()) { + this.dump.expVals.forEach((val, idx) => { + allSquares[idx].setExpVal(val); + }); + scores.currentScore = this.dump.score ? this.dump.score : 0; + scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; + charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + } + }, + reset: function () { + this.dump.gridsize = rows * cols; + this.dump.expVals = []; + for (let i = 0; i< this.dump.gridsize; i++) { + this.dump.expVals[i] = 0; + } + this.dump.score = scores.currentScore; + this.dump.charIndex = charIndex; + this.write(); + debug(console.log("reset D U M P E D!", this.dump)); + } +}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const buttons = { + all: [], + draw: function () { + this.all.forEach(btn => { + btn.draw(); + }); + }, + add: function(btn) { + this.all.push(btn); + } +}; +/** + * to the right = -1 + all tiles move to the left, begin with the outer righthand side tiles + moving 0 to max 3 places to the right + + find first tile beginning with bottom row, righthand side + */ + +const mover = { + direction: { + up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + }, + down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + }, + left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + }, + right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + } + }, + anyLeft: function() { + let canContinue = false; + [this.direction.up,this.direction.left].forEach (dir => { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + if (allSquares[idx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + if (nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + canContinue = true; // equal adjacent cells > 0 found + break; + } + if (allSquares[nextIdx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + } + if (canContinue) break; + } + if (canContinue) break; + } + }); + return canContinue; + }, + nonEmptyCells: function (dir) { + debug(console.log("Move: ", dir.name)); + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // let rowStr = '| '; + + // Move a number of iteration with the squares to move them all to one side + for (let iter = 0; iter < dir.iter; iter++) { + + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + // get the array of squares index for current cell + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if (allSquares[idx].expVal == 0 && nextIdx >= 0) { + allSquares[idx].setExpVal(allSquares[nextIdx].expVal); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + }, + // add up the conjacent squares with identical values en set next square to empty in the process + mergeEqlCells: function(dir) { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + let expVal = allSquares[idx].expVal; + allSquares[idx].setExpVal(++expVal); + allSquares[idx].addToScore(); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + } +}; +// Minimum number of pixels to interpret it as drag gesture +const dragThreshold = 10; + +// Maximum number of pixels to interpret a click from a drag event series +const clickThreshold = 3; + +let allSquares = []; +// let buttons = []; + +class Button { + constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + height; + this.name = name; + this.cb = cb; + this.text = text; + this.bg = bg; + this.fg = fg; + this.font = "6x8:3"; + this.enabled = enabled; + } + disable() { + this.enabled = false; + } + enable() { + this.enabled = true; + } + draw() { + g.setColor(this.bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setFont(this.font); + g.setFontAlign(0,0,0); + let strX = Math.floor((this.x0+this.x1)/2); + let strY = Math.floor((this.y0+this.y1)/2); + g.setColor("#000000"); + g.drawString(this.text, strX+2, strY+2); + g.setColor(this.fg); + g.drawString(this.text, strX, strY); + // buttons.push(this); + } + onClick() {if (typeof this.cb === 'function' && this.enabled) { + this.cb(this); + } + } +} + +class Cell { + constructor(x0, y0, width, idx, cb) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + width; + this.expVal = 0; + this.previousExpVals=[]; + this.idx = idx; + this.cb = cb; + } + getColor(i) { + return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; + } + drawBg() { + g.setColor(this.getColor(this.expVal).bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + } + drawNumber() { + if (this.expVal !== 0) { + g.setFont(cellFonts[charIndex]); + g.setFontAlign(0,0,0); + let char = cellChars[charIndex][this.expVal]; + let strX = Math.floor((this.x0 + this.x1)/2); + let strY = Math.floor((this.y0 + this.y1)/2); + // g.setColor(cellShadowColor); + // g.drawString(this.expVal, strX+1, strY+1); + g.setColor(this.getColor(this.expVal).fg); + g.drawString(char, strX, strY); + } + } + setExpVal(val) { + this.expVal = val; + } + getIdx() {return this.idx;} + pushToUndo() { + // remember this new step + this.previousExpVals.push(this.expVal); + // keep the undo list not longer than max undo levels + if (this.previousExpVals.length > maxUndoLevels) this.previousExpVals.shift(); + } + popFromUndo() { + // take one step back + if (this.previousExpVals.length > 0) { + this.expVal = this.previousExpVals.pop(); + } + } + removeUndo() { + this.previousExpVals=[0]; + } + addToScore() {if (typeof this.cb === 'function') { + this.cb(this.expVal); + } + } +} + +function undoGame() { + g.clear(); + if (scores.lastScores.length > 0) { + allSquares.forEach(sq => { + sq.popFromUndo(); + sq.drawBg(); + sq.drawNumber(); + }); + scores.undo(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + snapshot.make(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function addToUndo() { + allSquares.forEach(sq => { + sq.pushToUndo(); + }); + scores.addToUndo(); +} +function addToScore (val) { + scores.add(val); + if (val == 10) messageYouWin(); +} +function createGrid () { + let cn =0; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); + let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); + let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + allSquares.push(cell); + } + } +} +function messageGameOver () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("G A M E", middle.x+13, middle.y-24); + g.drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff"); + g.drawString("G A M E", middle.x+12, middle.y-25); + g.drawString("O V E R !", middle.x+12, middle.y+25); +} +function messageYouWin () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("YOU HAVE", middle.x+18, middle.y-24); + g.drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808"); + g.drawString("YOU HAVE", middle.x+17, middle.y-25); + g.drawString("W O N ! !", middle.x+17, middle.y+25); + Bangle.buzz(200, 1); +} +function makeRandomNumber () { + return Math.ceil(2*Math.random()); +} +function addRandomNumber() { + let emptySquaresIdxs = []; + allSquares.forEach(sq => { + if (sq.expVal == 0) emptySquaresIdxs.push(sq.getIdx()); + }); + if (emptySquaresIdxs.length > 0) { + let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); + allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + } +} +function drawGrid() { + allSquares.forEach(sq => { + sq.drawBg(); + sq.drawNumber(); + }); +} +function initGame() { + g.clear(); + // scores.read(); + createGrid(); + if (snReadOnInit) { + snapshot.recover(); + debug(console.log("R E C O V E R E D !", snapshot.dump)); + let sum = allSquares.reduce((t,v) => { return t + v ;}); + if (!sum) { + addRandomNumber(); + } + } else { + addRandomNumber(); + // addToUndo(); + } + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + // Clock mode allows short-press on button to exit + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function drawPopUp(message,cb) { + g.setColor('#FFFFFF'); + let rDims = Bangle.appRect; + g.fillPoly([rDims.x+10, rDims.y+20, + rDims.x+20, rDims.y+10, + rDims.x2-30, rDims.y+10, + rDims.x2-20, rDims.y+20, + rDims.x2-20, rDims.y2-40, + rDims.x2-30, rDims.y2-30, + rDims.x+20, rDims.y2-30, + rDims.x+10, rDims.y2-40 + ]); + buttons.all.forEach(btn => {btn.disable();}); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + btnYes.draw(); + btnNo.draw(); + g.setColor('#000000'); + g.setFont12x20(1); + g.setFontAlign(-1,-1,0); + g.drawString(message, rDims.x+20, rDims.y+20); + buttons.add(btnYes); + buttons.add(btnNo); +} +function handlePopUpClicks(btn) { + const name = btn.name; + buttons.all.pop(); // remove the no button + buttons.all.pop(); // remove the yes button + buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again + debug(console.log("Button name =", name)); + switch (name) { + case 'yes': + resetGame(); + break; + default: + g.clear(); + drawGrid(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} +function resetGame() { + g.clear(); + scores.reset(); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + addRandomNumber(); + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} + +/** + * Function that can be used in test or development environment, or production. + * Depends on global constant EFTriggerDebugMode + * @param {function} func function to call like console.log() + */ + const debug = (func) => { + switch (debugMode) { + case "development": + // console.log("Development"); + if (typeof func === 'function') { + func(); + } + break; + case "test" : + console.log("--- test ---"); + if (typeof func === 'function') { + func(); + } + break; + case "off": + case "production": // ignore func + default: break; + } +}; +const test = { + drawAllColors: function(i) { + charIndex = i>2 ? 0 : i<0 ? 0 : i; + allSquares.forEach((sq,i) => { + let c = i<11 ? i : i-10; + sq.setExpVal(c); + debug(console.log("c=",c)); + }); + drawGrid(); + }, + youWin: function() { + messageYouWin(); + }, + gameOver: function() { + messageGameOver(); + } +}; + +// Handle a "click" event (only needed for menu button) +function handleclick(e) { + buttons.all.forEach(btn => { + if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { + btn.onClick(); + debug(console.log(btn.name)); + } + }); +} + +// Handle a drag event (moving the stones around) +function handledrag(e) { + /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : + (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); + */ + // [move.right, move.left, move.up, move.down] + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); +} +// Evaluate "drag" events from the UI and call handlers for drags or clicks +// The UI sends a drag as a series of events indicating partial movements +// of the finger. +// This class combines such parts to a long drag from start to end +// If the drag is short, it is interpreted as click, +// otherwise as drag. +// The approprate method is called with the data of the drag. +class Dragger { + + constructor(clickHandler, dragHandler, clickThreshold, dragThreshold) { + this.clickHandler = clickHandler; + this.dragHandler = dragHandler; + this.clickThreshold = (clickThreshold === undefined ? 3 : clickThreshold); + this.dragThreshold = (dragThreshold === undefined ? 10 : dragThreshold); + this.dx = 0; + this.dy = 0; + this.enabled = true; + } + + // Enable or disable the Dragger + setEnabled(b) { + this.enabled = b; + } + + // Handle a raw drag event from the UI + handleRawDrag(e) { + if (!this.enabled) + return; + this.dx += e.dx; // Always accumulate + this.dy += e.dy; + if (e.b === 0) { // Drag event ended: Evaluate full drag + if (Math.abs(this.dx) < this.clickThreshold && Math.abs(this.dy) < this.clickThreshold) + this.clickHandler({ + x: e.x - this.dx, + y: e.y - this.dy + }); // take x and y from the drag start + else if (Math.abs(this.dx) > this.dragThreshold || Math.abs(this.dy) > this.dragThreshold) + this.dragHandler({ + x: e.x - this.dx, + y: e.y - this.dy, + dx: this.dx, + dy: this.dy + }); + this.dx = 0; // Clear the drag accumulator + this.dy = 0; + } + } + + // Attach the drag evaluator to the UI + attach() { + Bangle.on("drag", e => this.handleRawDrag(e)); + } +} + +// Dragger is needed for interaction during the game +var dragger = new Dragger(handleclick, handledrag, clickThreshold, dragThreshold); + +// Disable dragger as board is not yet initialized +dragger.setEnabled(false); + +// Nevertheless attach it so that it is ready once the game starts +dragger.attach(); + +function runGame(dir){ + addToUndo(); + updUndoLvlIndex(); + mover.nonEmptyCells(dir); + mover.mergeEqlCells(dir); + mover.nonEmptyCells(dir); + addRandomNumber(); + drawGrid(); + scores.check(); + scores.draw(); + // scores.write(); + snapshot.make(); + dragger.setEnabled(true); + if (!(mover.anyLeft())) { + debug(console.log("G A M E O V E R !!")); + snapshot.reset(); + messageGameOver(); + } +} + +function updUndoLvlIndex() { + let x = 170; + let y = 60; + g.setColor(btnAtribs.fg); + g.fillRect(x-6,y-6, 176, 67); + if (scores.lastScores.length > 0) { + g.setColor("#000000"); + g.setFont("4x6:2"); + g.drawString(scores.lastScores.length, x, y); + } +} +function incrCharIndex() { + charIndex++; + if (charIndex >= cellChars.length) charIndex = 0; + drawGrid(); +} +buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); +buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); +buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); + +initGame(); + +dragger.setEnabled(true); diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info new file mode 100644 index 000000000..b1c9d84ce --- /dev/null +++ b/apps/game1024/game1024.app.info @@ -0,0 +1,6 @@ +require("Storage").write("timer.info",{ + "id":"game1024", + "name":"1024 Game", + "src":"game1024.app.js", + "icon":"game1024.img" +}); \ No newline at end of file diff --git a/apps/game1024/game1024.json b/apps/game1024/game1024.json new file mode 100644 index 000000000..3749649ee --- /dev/null +++ b/apps/game1024/game1024.json @@ -0,0 +1 @@ +{"gridsize": 16, "expVals": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "score": 0, "highScore": 0, "charIndex": 1} \ No newline at end of file diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dd3ca0de7e48b2944f9bbaae606cf9647d8f GIT binary patch literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ literal 0 HcmV?d00001 diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json new file mode 100644 index 000000000..e4b7c9e6f --- /dev/null +++ b/apps/game1024/metadata.json @@ -0,0 +1,13 @@ +{ "id": "game1024", + "name": "1024 Game", + "shortName" : "1024 Game", + "icon": "game1024.img", + "description": "Join the numbers and get to the 1024 tile!", + "tags": "game puzzle 1024", + "allow_emulator": true, + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file From 8bca10c3c56eafea345de2ba2e600f140b2a55e2 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 23:52:08 +0100 Subject: [PATCH 2/5] Added app iocon game1024.png --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index e4b7c9e6f..80dc59c47 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "icon": "game1024.img", + "icon": "game1024.png", "description": "Join the numbers and get to the 1024 tile!", "tags": "game puzzle 1024", "allow_emulator": true, From 305d9eb5b7ca3c6e36902998e57b4154c2cbfdff Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:25:33 +0100 Subject: [PATCH 3/5] Altered app icon for the correct image --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index a701ef3a9..0bd1418fc 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) +var img = E.toArrayBuffer(atob("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R0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file From 4370d2ef8cc04d3b889d5df25bb1e1abb424c723 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:32:14 +0100 Subject: [PATCH 4/5] wrong edited --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index 0bd1418fc..0cecad73b 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -var img = E.toArrayBuffer(atob("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R0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) \ No newline at end of file From d9a92a5f6ebd9a1bfa311ff928ba08f9f0247570 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 01:14:26 +0100 Subject: [PATCH 5/5] Changed metadata: new screenshiot, tags and data --- apps/game1024/game1024.app.info | 6 ------ apps/game1024/metadata.json | 10 +++++++--- apps/game1024/screenshot.png | Bin 0 -> 5904 bytes 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info deleted file mode 100644 index b1c9d84ce..000000000 --- a/apps/game1024/game1024.app.info +++ /dev/null @@ -1,6 +0,0 @@ -require("Storage").write("timer.info",{ - "id":"game1024", - "name":"1024 Game", - "src":"game1024.app.js", - "icon":"game1024.img" -}); \ No newline at end of file diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 80dc59c47..83a3613f2 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,13 +1,17 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", + "version": "0.5", "icon": "game1024.png", - "description": "Join the numbers and get to the 1024 tile!", - "tags": "game puzzle 1024", + "screenshots": [ {"url":"screenshot.png" } ], + "description": "Join the numbers and get to the 1024(2^10) or J or X tile!", + "type": "app", + "tags": "game,puzzle", "allow_emulator": true, "supports" : ["BANGLEJS2"], "storage": [ {"name":"game1024.app.js","url":"app.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} - ] + ], + "data":[{"name": "game1024.json", "url": "game1024.json"}] } \ No newline at end of file diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..256ecb53bc679984c59b5847219ab9bb4a7097bb GIT binary patch literal 5904 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 literal 0 HcmV?d00001