Code edit (4 edits merged)
Please save this source code
Code edit (19 edits merged)
Please save this source code
User prompt
Please fix the bug: 'l6i is not defined' in or related to this line: 'var levels10 = [l6a, l6b, l6c, l6d, l6e, l6f, l6g, l6h, l6i];' Line Number: 1252
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Arrow = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('arrow', { anchorX: 0.5, anchorY: 0.5, alpha: 0 //0.75 }); }); //<Assets used in the game will automatically appear here> //<Write imports for supported plugins here> var Board = Container.expand(function () { var self = Container.call(this); self.boxGraphics = self.attachAsset('board', { anchorX: 0.5, anchorY: 0.5 }); self.paint = function () { //self.boxGraphics.width = boardSize; //self.boxGraphics.height = boardSize; var startX = -boardSize / 2; //-self.width / 2; var startY = -boardSize / 2; //-self.height / 2; var boxSize = calculateTileSize(); var boxSpacing = boxSize * spacingRatio; var offset = boxSize / 2 + boxSpacing; for (var i = 0; i < gridSize; i++) { for (var j = 0; j < gridSize; j++) { var box = self.addChild(new Box()); box.width = box.height = boxSize; box.x = offset + startX + i * (boxSize + boxSpacing); box.y = offset + startY + j * (boxSize + boxSpacing); box.setAlpha(0.075); } } // Paint arrows at edges of board. for (var i = 0; i < gridSize; i++) { for (var j = 0; j < gridSize; j++) { if (i == 0) { var arrow = new Arrow(); arrow.rotation = Math.PI / 2; arrow.scale.x = arrow.scale.y = boxSize / 100; arrow.x = offset + startX + j * (boxSize + boxSpacing); arrow.y = startY - 2 * boxSpacing; self.addChild(arrow); } else if (i == gridSize - 1) { var arrow = new Arrow(); arrow.rotation = -Math.PI / 2; arrow.scale.x = arrow.scale.y = boxSize / 100; arrow.x = offset + startX + j * (boxSize + boxSpacing); arrow.y = -startY + 2 * boxSpacing; self.addChild(arrow); } if (j == 0) { var arrow = new Arrow(); arrow.scale.x = arrow.scale.y = boxSize / 100; arrow.x = startX - 2 * boxSpacing; arrow.y = offset + startY + i * (boxSize + boxSpacing); self.addChild(arrow); } else if (j == gridSize - 1) { var arrow = new Arrow(); arrow.rotation = Math.PI; arrow.scale.x = arrow.scale.y = boxSize / 100; arrow.x = -startX + 2 * boxSpacing; arrow.y = offset + startY + i * (boxSize + boxSpacing); self.addChild(arrow); } } } }; self.paint(); self.paintArrows = function () {}; self.paintArrows(); }); var Box = Container.expand(function () { var self = Container.call(this); var boxGraphics = self.attachAsset('box', { anchorX: 0.5, anchorY: 0.5 }); self.setAlpha = function (i) { self.alpha = i; }; }); var CloseButton = Container.expand(function () { var self = Container.call(this); var closeButtonGraphics = self.attachAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 }); self.instructions = false, self.progress = false; self.down = function () { // Define what happens when the close button is pressed if (self.instructions) { showInstructions(); } if (self.progress) { showProgress(); } }; }); var ColorBox = Container.expand(function (colorIndex) { var self = Container.call(this); self.colorIndex = colorIndex; /*var boxGraphics = self.attachAsset('box', { anchorX: 0.5, anchorY: 0.5, tint: colors[colorIndex] });*/ var boxGraphics = self.attachAsset(tileTypes[colorIndex], { anchorX: 0.5, anchorY: 0.5 //tint: colors[colorIndex] }); self.gridX = 0; self.gridY = 0; self.speed = 10; self.outlier = false; self.down = function (x, y, obj) { if (GAME_IS_CLICKABLE) { if (!self.outlier) { if (progressScreen.alpha == 0 && instructionsScreen.alpha == 0) { GAME_IS_CLICKABLE = false; colorBoxClicked(self); } } } }; self.mouseover = function () { if (!self.outlier) { self.width = self.height = tileSize * 1.05; } }; self.mouseout = function () { if (!self.outlier) { self.width = self.height = tileSize; } }; self.remove = function (delay) { numRunningTweens++; currentLevel.d[self.gridY][self.gridX] = 0; tween(self, { scaleX: 0.5, scaleY: 0.5, rotation: Math.PI, alpha: 0 }, { duration: BASE_TWEEN_SPEED, delay: delay, easing: tween.easeInOut, onFinish: function onFinish() { //console.log("Animation complete!"); //console.log('currentLevel:', currentLevel); //console.log('levelContainer:', levelContainer); //playerScore++; playerScore += latestRemoveCount; var t = new Star(levelContainer.x + self.x, levelContainer.y + self.y, 1900, 50, 0, colors[self.colorIndex]); //console.log('startx and y:', t.x, t.y); game.addChild(t); stars.push(t); updateScoreLabels(); numRunningTweens--; self.destroy(); } }); //self.destroy(); }; self.fadeIn = function () { var delayBy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; numRunningTweens++; self.alpha = 0; tween(self, { alpha: 1 }, { duration: BASE_TWEEN_SPEED, delay: delayBy, easing: tween.easeInOut, onFinish: function onFinish() { numRunningTweens--; //console.log('faded in:', self); } }); }; self.flyOut = function () { numRunningTweens++; //console.log(self, self.gridX, self.gridY); var destY, destX = 0; if (self.gridX == 999) { destY = self.y; destX = self.x > 0 ? -1500 : 1500; } else if (self.gridY == 999) { destY = self.y > 0 ? -1500 : 1500; destX = self.x; } tween(self, { x: destX, y: destY }, { duration: BASE_TWEEN_SPEED * 2.5, delay: 0, easing: tween.easeInOut, onFinish: function onFinish() { numRunningTweens--; //console.log('faded out:', self); self.destroy(); } }); }; self.blinkRed = function () { tween(self, { width: tileSize * 1.5, height: tileSize * 1.5 }, { duration: 150, easing: tween.easeInOut, onFinish: function onFinish() { //self.width = tileSize; //self.height = tileSize; tween(self, { width: tileSize, height: tileSize }, { duration: 150, easing: tween.easeInOut }); } }); }; self.enterBoard = function (destX, destY, delayFactor) { numRunningTweens++; self.width = 0; self.height = 0; self.x = destX; self.y = destY; tween(self, { width: tileSize, height: tileSize }, { duration: BASE_TWEEN_SPEED, delay: delayFactor, easing: tween.easeInOut, onFinish: function onFinish() { numRunningTweens--; } }); /* tween(self, { x: destX, y: destY }, { duration: BASE_TWEEN_SPEED, delay: delayFactor, easing: tween.easeInOut, onFinish: function onFinish() { numRunningTweens--; } });*/ }; self.moveInPosition = function () { var startX = -boardSize / 2; var startY = -boardSize / 2; var boxSize = tileSize; var boxSpacing = boxSize * spacingRatio; var offset = boxSize / 2 + boxSpacing; var destX = offset + startX + self.gridX * (boxSize + boxSpacing); var destY = offset + startY + self.gridY * (boxSize + boxSpacing); numRunningTweens++; tween(self, { x: destX, y: destY }, { duration: BASE_TWEEN_SPEED, delay: 0, easing: tween.easeInOut, onFinish: function onFinish() { numRunningTweens--; currentLevel.d[self.gridY][self.gridX] = self.colorIndex; self.outlier = false; //console.log('done moving into position'); } }); }; }); var Firework = Container.expand(function () { var self = Container.call(this); //var starGraphics = self.attachAsset('star', { var starGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5, tint: Math.random() * 0xffffff }); starGraphics.scale.set(2, 2); self.addChild(starGraphics); self.x = 0; self.y = 0; self.dx = 15 - Math.random() * 30; self.dy = 2 + Math.random() * 40; self.drot = 0.11 - Math.random() * 0.22; self.isDead = false; self.counter = 0; self._move_migrated = function () { self.rotation += self.drot; self.x += self.dx; self.y -= self.dy; self.dy -= 1; if (++self.counter > 500) { self.destroy(); self.isDead = true; } }; }); var GameComplete = Container.expand(function () { var self = Container.call(this); var bgGraphics = self.attachAsset('levelCompleteBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.75 }); var levelsDisc = storage.levelsDiscovered.length; var levelsTotal = levelsAll.length; var s = "Congratulations!\n\nYou completed 12 levels in a row!\n\n"; if (levelsDisc < levelsTotal) { s += "Play again to discover more levels.\n\nLevels discovered: "; s += levelsDisc + "/" + levelsTotal; } else { s += "You've discovered all " + levelsTotal + " levels\n\nPlay again to beat your best score."; } var label = new Text2(s, { size: 75, fill: 0xdddddd, align: 'center', font: 'Georgia' }); label.anchor.set(0.5, 0.5); label.x = 0; label.y = -100; self.addChild(label); // Add fireworks explosion effect for (var i = 0; i < 40; i++) { var firework = new Firework(); self.addChild(firework); stars.push(firework); } }); var HelpButton = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('helpButton', { anchorX: 0.5, anchorY: 0.5 }); self.blinkers = []; var radius = 50; // Distance from the center of the button for (var i = 0; i < 12; i++) { var angle = i / 12 * Math.PI * 2; // Calculate angle for each blinker var t = self.attachAsset('blinker', { anchorX: 0.5, anchorY: 0.5, x: Math.cos(angle) * 1.65 * radius, y: Math.sin(angle) * 1.65 * radius, rotation: angle + Math.PI / 2, alpha: 0 }); self.blinkers.push(t); } self.down = function () { showInstructions(); }; self.blink = function () { var blinkCount = 0; var maxBlinks = 8; var blinkInterval = 250; // Time in milliseconds for each blink function toggleBlinkers() { blinkCount++; var newAlpha = blinkCount % 2 === 0 ? 0 : 1; // Toggle between 0 and 1 for (var i = 0; i < self.blinkers.length; i++) { self.blinkers[i].alpha = newAlpha; } if (blinkCount < maxBlinks * 2) { LK.setTimeout(toggleBlinkers, blinkInterval); } } toggleBlinkers(); }; }); var InstructionsScreen = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('levelCompleteBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.87 }); var closeButton = new CloseButton(); closeButton.x = self.width / 2 - 75; // Position close button at the top right corner closeButton.y = -self.height / 2 + 75; closeButton.instructions = true; self.addChild(closeButton); var label = new Text2('HOW TO PLAY\n\n\n1. Tap a tile to remove all similar\n connected tiles\n\n2. New tiles will enter from the sides.\n\n3. Clear the board to complete the level.\n\n\nHint: Clear more blocks in one click\n for combo bonuses.', { size: 60, fill: 0xdddddd, align: 'center', font: 'Georgia' }); label.anchor.set(0.5, 0.5); label.x = 0; label.y = -100; self.addChild(label); }); var LevelComplete = Container.expand(function () { var self = Container.call(this); var bgGraphics = self.attachAsset('levelCompleteBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.75 }); var label = new Text2('Level Cleared!', { size: 100, fill: 0xdddddd, align: 'center', font: 'Georgia' }); label.anchor.set(0.5, 0.5); label.x = 0; label.y = -100; self.addChild(label); // Add fireworks explosion effect for (var i = 0; i < 40; i++) { var firework = new Firework(); self.addChild(firework); stars.push(firework); } }); var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 + Math.random() * 0.5 //tint: Math.random() * 0xffffff }); var sc = 1 + Math.random() * 1; particleGraphics.scale.set(sc, sc); self.addChild(particleGraphics); var amplitude = 50 + Math.random() * 100; var speedY = 2 + Math.random() * 5; self.update = function () { if (self.y > 0) { self.y -= speedY; self.x += Math.sin(self.y / amplitude) * 10; // Wavy movement if (self.parent) { self.x -= self.parent.wind; } } else { self.x = Math.random() * 2048; self.y = 2732; amplitude = 50 + Math.random() * 100; } }; }); var ParticleContainer = Container.expand(function () { var self = Container.call(this); self.particles = []; self.particlesMax = 50; self.wind = 0; self.update = function () { self.wind += Math.sin(LK.ticks) * 1; if (self.particles.length < self.particlesMax) { for (var i = 0; i < self.particlesMax; i++) { if (Math.random() < 0.12) { // Ensure Math.random() is used correctly var p = new Particle(); p.x = Math.random() * 2048; p.y = 2732; self.particles.push(p); self.addChild(p); } } } }; }); var ProgressButton = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('progressButton', { anchorX: 0.5, anchorY: 0.5 }); self.down = function () { showProgress(); progressScreen.paint(); }; }); var ProgressMiniature = Container.expand(function (minLevel, discovered) { var self = Container.call(this); self.discovered = discovered; if (discovered) { var t = self.attachAsset('checkMark', { anchorX: 0.5, anchorY: 0.5 }); } else { var t = self.attachAsset('questionMark', { anchorX: 0.5, anchorY: 0.5 }); } t.x = 0; //i % 7 * 150; t.y = 0; //Math.floor(i / 7) * 175; //var index = levelsAll.indexOf(minLevel); self.la = new Text2(minLevel.name, { size: 40, fill: 0xffffff, align: 'center', font: 'Georgia', alpha: 0 }); self.la.anchor.set(0.5, 0.5); self.la.x = 0; self.la.y = 80; self.la.alpha = 0; self.addChild(self.la); self.down = function () { if (self.la.alpha == 0) { if (self.discovered) { self.la.alpha = 1; LK.setTimeout(function () { self.la.alpha = 0; }, 2000); } } else { self.la.alpha = 0; } }; /*self.mouseout = function () { self.la.alpha = 0; };*/ }); var ProgressScreen = Container.expand(function () { var self = Container.call(this); var arrowGraphics = self.attachAsset('levelCompleteBg', { //var arrowGraphics = self.attachAsset('board', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); var closeButton = new CloseButton(); closeButton.x = self.width / 2 - 75; // Position close button at the top right corner closeButton.y = -self.height / 2 + 75; closeButton.progress = true; self.addChild(closeButton); self.paint = function () { // Remove existing labels, checkmarks, and question marks self.children.forEach(function (child) { if (child instanceof Text2 || child.assetId === 'checkMark' || child.assetId === 'questionMark' || _typeof(child) == ProgressMiniature) { child.destroy(); } }); var label = new Text2("Levels Discovered: (x/42)", { size: 60, fill: 0xdddddd, align: 'center', font: 'Georgia' }); label.anchor.set(0.5, 0.5); label.x = 0; label.y = -self.height / 2 + 220; // +220; self.addChild(label); // Setup grid of all levels for (var i = 0; i < levelsAll.length; i++) { if (storage.levelsDiscovered.includes(levelsAll[i].uid)) { // show check mark var t = new ProgressMiniature(levelsAll[i], true); /*var t = self.attachAsset('checkMark', { anchorX: 0.5, anchorY: 0.5 });*/ } else { var t = new ProgressMiniature(levelsAll[i], false); // show question mark /*var t = self.attachAsset('questionMark', { anchorX: 0.5, anchorY: 0.5 });*/ } t.x = i % 7 * 150; t.y = Math.floor(i / 7) * 175; t.x -= 450; t.y -= 400; self.addChild(t); /* var la = new Text2(levelsAll[i].name, { size: 20, fill: 0xffffff, align: 'center', font: 'Georgia' }); la.anchor.set(0.5, 0.5); la.x = 0; la.y = 100; t.addChild(la); */ } }; self.paint(); }); var Star = Container.expand(function (startX, startY, endX, endY, delay, boxTint) { var self = Container.call(this); //GoldCoin.delayIncrement = 0; //self.game = this; /*var starGraphics = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5, tint: boxTint }); self.addChild(starGraphics); */ var plusLabel = new Text2('+' + latestRemoveCount, { size: 120, fill: 0xFFFFFF, align: 'center', font: 'Georgia' }); plusLabel.anchor.set(0.5, 0.5); // Anchor to the right plusLabel.x = 0; plusLabel.y = 0; self.addChild(plusLabel); self.x = startX; self.y = startY; self.isDead = false; var distance = Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2)); self.delayCounter = delay * 2; var duration = 40 + delay; //30 + delay; self.alpha = 0; //self.path = createQuadraticBezierArcPoints(startX, startY, endX, startY - 100, endX, endY, 60); //self.path = createQuadraticBezierArcPoints(startX, startY, endX, startY + 200, endX, endY, 30); self._move_migrated = function () { if (self.delayCounter > 0) { self.delayCounter--; } else { self.alpha = 1; self.y -= 4; /* self.rotation += 0.11; if (self.path[duration]) { self.x = self.path[duration - self.delayCounter][0]; self.y = self.path[duration - self.delayCounter][1]; }*/ } if (--duration <= 0) { self.destroy(); self.isDead = true; } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ //LK.init.music('backgroundMusic') //LK.init.sound('testmusic', {volume:1, start:0, end:0.995, id:'676c4b01fd1ad619bb4ea263'}) function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var lerp = function lerp(start, end, t) { return start * (1 - t) + end * t; }; // Play test music in a loop /*LK.playMusic('testmusic', { loop: true });*/ var createQuadraticBezierArcPoints = function createQuadraticBezierArcPoints(p0x, p0y, p1x, p1y, p2x, p2y, numberOfSteps) { var points_along_axis = new Array(numberOfSteps).fill(null).map(function () { return [0, 0]; }); var stepping_constant = 1 / numberOfSteps; for (var i = 0; i < numberOfSteps; i++) { var i_p0_p1x = lerp(p0x, p1x, i * stepping_constant); var i_p0_p1y = lerp(p0y, p1y, i * stepping_constant); var i_p1_p2x = lerp(p1x, p2x, i * stepping_constant); var i_p1_p2y = lerp(p1y, p2y, i * stepping_constant); if (false) { points_along_axis.push(lerp(i_p0_p1x, i_p1_p2x, i * stepping_constant), lerp(i_p0_p1y, i_p1_p2y, i * stepping_constant)); } points_along_axis[i][0] = lerp(i_p0_p1x, i_p1_p2x, i * stepping_constant); points_along_axis[i][1] = lerp(i_p0_p1y, i_p1_p2y, i * stepping_constant); } if (false) { console.log('path: ' + points_along_axis); console.log('path[2]: ' + points_along_axis[2]); } return points_along_axis.reverse(); }; function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) { return; } f = !1; } else { for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0) { ; } } } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) { return; } } finally { if (o) { throw n; } } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) { return r; } } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) { throw o; } } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) { return _arrayLikeToArray(r, a); } var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) { n[e] = r[e]; } return n; } function drawMiniature(mLevel) { var c = new Container(); return c; } ; var BASE_TWEEN_SPEED = 200; var GAME_IS_CLICKABLE = true; // flag for when board is clickable and when not. var numRunningTweens = 0; // input is blocked while tweens running, so increment this when a tween starts, nd decrement when tween ends. var outlierDirectionCounter = 0; //0; // increment to allow outliers spawning on different side each turn. var playerScore = 0; // TODO: Uncomment to reset storage variable //storage.highScore = 0; //storage.levelsDiscovered = []; // END optional uncomment var highScore = storage.highScore || 0; storage.levelsDiscovered = storage.levelsDiscovered || []; // Initialize levelsDiscovered as an array if not already defined // Add background image var backgroundImage = LK.getAsset('backgroundImage', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7, x: 1024, y: 1366 }); game.addChild(backgroundImage); // Add game logo to the center top of the screen var gameLogo = LK.getAsset('gameLogo', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 300, tint: 0x55eeff }); game.addChild(gameLogo); var helpButton = new HelpButton(); helpButton.x = 2048 - 150; helpButton.y = 2732 - 150; game.addChild(helpButton); helpButton.blink(); /* var progressButton = new ProgressButton(); progressButton.x = 150; progressButton.y = 2732 - 150; game.addChild(progressButton); */ var levelLabel = new Text2('Level 1', { size: 60, //120, fill: 0xFFFFFF, align: 'center', font: 'Georgia' }); levelLabel.anchor.set(0.5, 0.5); levelLabel.x = 2048 - 350; // - 30; // Position near the right edge levelLabel.y = 90; //300; game.addChild(levelLabel); var levelNameLabel = new Text2('', { size: 56, fill: 0xFFFFFF, align: 'center', font: 'Georgia' }); levelNameLabel.anchor.set(0.5, 0.5); levelNameLabel.x = 2048 - 350; levelNameLabel.y = 170; //2732 - 200; game.addChild(levelNameLabel); // Create and position the score label var scoreLabel = new Text2('Score\n0', { size: 55, fill: 0xFFFFFF, align: 'center', font: 'Georgia' }); scoreLabel.anchor.set(0.5, 0.5); // Anchor to the right scoreLabel.x = 2048 - 350; // - 50; // Position near the right edge scoreLabel.y = 290; //140; //50; // Position at the top //LK.gui.topRight.addChild(scoreLabel); game.addChild(scoreLabel); // Create and position the high score label var highScoreLabel = new Text2('Best\n0', { size: 50, fill: 0xdddddd, align: 'center', font: 'Georgia' }); highScoreLabel.anchor.set(0.5, 0.5); // Anchor to the right highScoreLabel.x = 2048 - 350; //- 75; // Position near the right edge highScoreLabel.y = 440; //300; //220; // Position below the score label //LK.gui.topRight.addChild(highScoreLabel); game.addChild(highScoreLabel); var gridSize = 5; var spacingRatio = 0.2; //0.2; var boardSize = 1300; var boardCenterY = 2732 / 2 + 250; function calculateTileSize() { // Example of getting desired tileSize depending on gridSize (for different size grids) // maintaining 1300px board size and 0.2 gutter between tiles. var tileSize = boardSize / ((gridSize + 1) * spacingRatio + gridSize); return tileSize; //console.log(tileSize); } var tileSize = calculateTileSize(); var particleContainer = new ParticleContainer(); game.addChild(particleContainer); var board = new Board(); board.x = 1024; board.y = boardCenterY; //2732 / 2 + 200; game.addChild(board); // 0 black 1 white 2 yellow 3 red 4 blue 5 green 6 purple 7 grey 8 brown 9 skin var colors = ['0x000000', '0xffffff', '0xffff00', '0xff0000', '0x0000dd', '0x00ff00', '0xff00ff', '0xbbbbbb', '0x827364', '0xecbcb4']; var tileSprites = ['box', 'tileWhite', 'tileYellow', 'tileRed', 'tileBlue', 'tileGreen', 'tilePurple', 'tileGray', 'tileBrown', 'tileBeige']; var tileTypes = tileSprites; // Define tileTypes to fix the error // 5x5 levels. var l1a = { name: 'Jasmine Blossom', uid: 101, d: [[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 2, 1, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] }; var l1b = { name: 'Rocket Science', uid: 102, d: [[0, 0, 0, 0, 0], [0, 0, 4, 0, 0], [0, 5, 4, 5, 0], [0, 5, 0, 5, 0], [0, 0, 0, 0, 0]] }; var l1c = { name: "Dahlia's Maze", uid: 103, d: [[0, 0, 0, 0, 0], [0, 3, 0, 3, 0], [0, 0, 2, 0, 0], [0, 3, 0, 3, 0], [0, 0, 0, 0, 0]] }; var l1d = { name: 'Cornflower Field', uid: 104, d: [[0, 0, 0, 0, 0], [0, 6, 4, 6, 0], [0, 4, 0, 4, 0], [0, 6, 4, 6, 0], [0, 0, 0, 0, 0]] }; var l1e = { name: 'Ruby Summit', uid: 105, d: [[0, 0, 0, 0, 0], [0, 0, 0, 5, 0], [0, 0, 5, 3, 0], [0, 5, 3, 3, 0], [0, 0, 0, 0, 0]] }; var l1f = { name: "The Archer's Mark", uid: 106, d: [[0, 0, 7, 7, 7], [0, 0, 0, 8, 7], [0, 0, 8, 0, 7], [0, 8, 0, 0, 0], [0, 0, 0, 0, 0]] }; var l1g = { name: "Santa's Topper", uid: 107, d: [[0, 0, 1, 0, 0], [0, 0, 3, 0, 0], [0, 3, 3, 3, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]] }; var l1h = { name: "The Stacked Bite", uid: 108, d: [[0, 0, 0, 0, 0], [0, 8, 8, 8, 0], [0, 2, 2, 2, 0], [0, 8, 8, 8, 0], [0, 0, 0, 0, 0]] }; var l1i = { name: "Flame Carrier", uid: 109, d: [[0, 0, 0, 0, 0], [0, 0, 3, 0, 0], [0, 3, 2, 3, 0], [0, 0, 8, 0, 0], [0, 0, 8, 0, 0]] }; // 6x6 levels var l2a = { name: 'Duck Dive', uid: 201, d: [[0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0], [0, 4, 1, 1, 4, 0], [0, 0, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] }; var l2b = { name: 'Critter Crawl', uid: 202, d: [[0, 0, 0, 0, 0, 0], [0, 0, 8, 8, 0, 0], [0, 8, 8, 8, 6, 0], [0, 8, 8, 8, 8, 0], [0, 9, 0, 0, 9, 0], [0, 0, 0, 0, 0, 0]] }; var l2c = { name: 'The Little Oinker', uid: 203, d: [[0, 0, 0, 0, 0, 0], [0, 9, 9, 9, 9, 0], [0, 4, 9, 9, 4, 0], [0, 9, 6, 6, 9, 0], [0, 9, 9, 9, 9, 0], [0, 0, 0, 0, 0, 0]] }; var l2d = { name: 'Mellow Crawl', uid: 204, d: [[0, 0, 0, 0, 0, 0], [0, 4, 2, 2, 4, 0], [0, 0, 3, 2, 0, 0], [0, 2, 2, 2, 2, 0], [0, 2, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0]] }; var l2e = { name: 'Berry Hunt', uid: 205, d: [[0, 0, 0, 0, 0, 0], [0, 5, 5, 6, 0, 0], [0, 5, 6, 3, 6, 0], [0, 6, 3, 6, 3, 0], [0, 0, 6, 3, 6, 0], [0, 0, 0, 0, 0, 0]] }; var l2f = { name: 'Koala Nap', uid: 206, d: [[0, 0, 0, 0, 0, 0], [0, 7, 0, 7, 0, 0], [0, 7, 4, 7, 4, 0], [0, 7, 7, 3, 7, 0], [0, 0, 7, 7, 0, 0], [0, 0, 0, 0, 0, 0]] }; var l2g = { name: 'Monkey Business', uid: 207, d: [[0, 0, 0, 0, 0, 0], [0, 3, 0, 3, 2, 0], [0, 3, 3, 2, 9, 0], [0, 3, 3, 2, 0, 0], [0, 3, 0, 3, 0, 0], [0, 0, 0, 0, 0, 0]] }; var l2h = { name: 'Steak Boy', uid: 208, d: [[0, 0, 0, 0, 0, 0], [0, 4, 3, 3, 4, 0], [0, 3, 1, 1, 3, 0], [0, 3, 3, 3, 3, 0], [0, 3, 0, 0, 3, 0], [0, 0, 0, 0, 0, 0]] }; var l2i = { name: 'Dimensional Leap', uid: 209, d: [[0, 0, 0, 0, 0, 0], [0, 0, 2, 2, 0, 0], [0, 2, 4, 7, 2, 0], [0, 2, 8, 8, 2, 0], [0, 0, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0]] }; // 7x7 levels var l3a = { name: "Rudolph's Glow", uid: 301, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 8, 0, 8, 0, 0], [0, 8, 8, 0, 8, 8, 0], [0, 0, 7, 7, 7, 0, 0], [0, 0, 4, 7, 4, 0, 0], [0, 0, 0, 3, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3b = { name: 'Fiery Redhead', uid: 302, d: [[0, 0, 0, 0, 0, 0, 0], [0, 3, 3, 3, 3, 3, 0], [0, 3, 3, 9, 9, 3, 0], [0, 3, 4, 9, 4, 3, 0], [0, 3, 9, 9, 9, 3, 0], [0, 3, 9, 9, 9, 3, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3c = { name: "Grump's Gambit", uid: 303, d: [[0, 0, 0, 0, 0, 0, 0], [0, 7, 9, 9, 9, 7, 0], [0, 7, 5, 9, 5, 7, 0], [0, 9, 9, 9, 9, 9, 0], [0, 9, 6, 6, 6, 9, 0], [0, 0, 9, 9, 9, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3d = { name: 'The Crown Jewels', uid: 304, d: [[0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 2, 0], [0, 2, 1, 0, 2, 2, 0], [0, 2, 2, 2, 2, 2, 0], [0, 3, 8, 3, 8, 3, 0], [0, 8, 2, 2, 2, 8, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3e = { name: 'Petal Puzzle', uid: 305, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 6, 6, 6, 0, 0], [0, 6, 3, 2, 3, 6, 0], [0, 6, 2, 2, 2, 6, 0], [0, 6, 3, 2, 3, 6, 0], [0, 0, 6, 6, 6, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3f = { name: 'Forest Guardian', uid: 306, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 9, 8, 9, 0, 0], [0, 0, 2, 9, 2, 0, 0], [0, 9, 8, 8, 8, 9, 0], [0, 0, 8, 8, 8, 0, 0], [0, 0, 7, 0, 7, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3g = { name: 'The Apple Orchard', uid: 307, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 5, 5, 0, 0], [0, 5, 3, 5, 3, 5, 0], [0, 5, 5, 3, 5, 5, 0], [0, 0, 0, 8, 0, 0, 0], [0, 0, 0, 8, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3h = { name: 'The Grid Riddle', uid: 308, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 0, 7, 0, 0], [0, 2, 2, 7, 5, 7, 0], [0, 0, 7, 0, 2, 0, 0], [0, 7, 5, 2, 5, 7, 0], [0, 0, 5, 0, 5, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; var l3i = { name: 'Honey Chase', uid: 309, d: [[0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 8, 4, 0], [0, 2, 8, 2, 8, 2, 0], [0, 0, 8, 2, 8, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]] }; // 8x8 levels //var l4 = [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0, 0], [0, 0, 2, 2, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 2, 2, 0, 0, 0, 0], [0, 2, 2, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]; var l4a = { name: 'UFO Spotting', uid: 401, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 4, 0, 0, 0], [0, 0, 4, 4, 4, 4, 0, 0], [0, 2, 7, 2, 7, 2, 7, 0], [0, 0, 4, 4, 4, 4, 0, 0], [0, 4, 0, 0, 0, 0, 4, 0], [0, 4, 0, 0, 0, 0, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4b = { name: 'Holy Grail', uid: 402, d: [[0, 2, 2, 2, 2, 2, 2, 0], [0, 2, 1, 3, 3, 3, 2, 0], [0, 2, 1, 3, 3, 3, 2, 0], [0, 0, 2, 2, 2, 2, 0, 0], [0, 0, 0, 1, 2, 0, 0, 0], [0, 0, 0, 1, 2, 0, 0, 0], [0, 0, 1, 2, 1, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4c = { name: 'Dino Discovery', uid: 403, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 5, 0, 0, 0, 0], [0, 5, 4, 4, 5, 5, 5, 0], [0, 5, 5, 5, 1, 3, 1, 0], [0, 5, 5, 3, 3, 1, 3, 0], [0, 5, 5, 5, 5, 5, 5, 0], [0, 0, 5, 5, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4d = { name: "Santa's Smile", uid: 404, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 9, 1, 1, 9, 1, 0], [0, 9, 4, 9, 9, 4, 9, 0], [0, 1, 1, 9, 9, 1, 1, 0], [0, 9, 1, 1, 1, 1, 9, 0], [0, 1, 1, 3, 3, 1, 1, 0], [0, 0, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0, 0]] }; var l4e = { name: "Salamander's Flame", uid: 405, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 4, 3, 2, 4, 0, 0], [0, 3, 0, 3, 2, 0, 3, 0], [0, 0, 2, 3, 3, 2, 0, 0], [0, 0, 0, 3, 3, 0, 0, 0], [0, 0, 0, 3, 2, 0, 0, 0], [0, 0, 3, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4f = { name: 'The Birthday Cake', uid: 406, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 2, 0, 2, 0], [0, 1, 1, 1, 1, 1, 1, 0], [0, 6, 6, 6, 6, 6, 6, 0], [0, 2, 2, 2, 2, 2, 2, 0], [0, 6, 6, 6, 6, 6, 6, 0], [0, 3, 3, 3, 3, 3, 3, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4g = { name: 'Home Sweet Home', uid: 407, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 3, 3, 0, 0, 0], [0, 0, 3, 4, 4, 3, 0, 0], [0, 3, 4, 2, 2, 4, 3, 0], [0, 4, 4, 4, 4, 4, 4, 0], [0, 2, 4, 6, 6, 4, 2, 0], [0, 4, 4, 6, 6, 4, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4h = { name: 'The Lander', uid: 408, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 7, 7, 0, 0, 0], [0, 0, 7, 4, 4, 7, 0, 0], [0, 0, 7, 7, 7, 7, 0, 0], [0, 0, 7, 7, 7, 7, 0, 0], [0, 7, 0, 2, 2, 0, 7, 0], [0, 3, 0, 0, 0, 0, 3, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; var l4i = { name: 'Crimson Gem', uid: 409, d: [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 3, 3, 0, 0, 0], [0, 0, 3, 1, 9, 3, 0, 0], [0, 3, 1, 9, 1, 9, 3, 0], [0, 3, 9, 1, 9, 6, 3, 0], [0, 0, 3, 9, 6, 3, 0, 0], [0, 0, 0, 3, 3, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] }; // 9x9 levels var l5a = { name: 'Bag of Tricks', uid: 501, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2, 8, 8, 0, 0, 0], [0, 0, 2, 0, 0, 0, 8, 0, 0], [0, 8, 8, 8, 8, 8, 8, 8, 0], [0, 3, 3, 3, 8, 3, 3, 3, 0], [0, 8, 8, 8, 2, 8, 8, 4, 0], [0, 8, 8, 8, 8, 8, 8, 4, 0], [0, 4, 4, 4, 4, 4, 4, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5b = { name: 'Trophy Case', uid: 502, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 2, 8, 8, 8, 0, 0], [0, 2, 8, 2, 4, 8, 8, 2, 0], [0, 2, 0, 2, 4, 8, 0, 2, 0], [0, 0, 8, 2, 4, 8, 2, 0, 0], [0, 0, 0, 8, 2, 8, 0, 0, 0], [0, 0, 0, 0, 8, 0, 0, 0, 0], [0, 0, 0, 8, 8, 8, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5c = { name: 'Monitor Watch', uid: 503, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7, 7, 7, 7, 7, 7, 7, 0], [0, 7, 4, 4, 4, 4, 4, 7, 0], [0, 7, 4, 4, 3, 3, 4, 7, 0], [0, 7, 3, 3, 3, 3, 3, 7, 0], [0, 7, 7, 7, 7, 7, 2, 7, 0], [0, 0, 0, 4, 4, 4, 0, 0, 0], [0, 0, 7, 7, 7, 7, 7, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5d = { name: 'The Melty Bite', uid: 504, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 8, 8, 8, 8, 8, 0, 0], [0, 8, 8, 8, 8, 8, 8, 8, 0], [0, 0, 5, 5, 3, 3, 5, 0, 0], [0, 2, 2, 5, 2, 3, 2, 0, 0], [0, 0, 3, 2, 5, 2, 5, 5, 0], [0, 8, 8, 8, 8, 2, 8, 8, 0], [0, 0, 8, 8, 8, 8, 8, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5e = { name: 'Flag of Denmark', uid: 505, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 0, 0, 0, 0, 0], [0, 3, 3, 1, 3, 3, 3, 3, 0], [0, 3, 3, 1, 3, 3, 3, 0, 0], [0, 1, 1, 1, 1, 1, 1, 0, 0], [0, 3, 3, 1, 3, 3, 3, 0, 0], [0, 3, 3, 1, 3, 3, 3, 3, 0], [0, 8, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5f = { name: 'Global Explorer', uid: 506, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 4, 1, 1, 4, 0, 0], [0, 5, 5, 4, 4, 4, 5, 4, 0], [0, 8, 5, 5, 4, 4, 5, 5, 0], [0, 5, 8, 4, 4, 5, 5, 2, 0], [0, 4, 5, 4, 4, 4, 5, 8, 0], [0, 4, 4, 5, 4, 4, 4, 4, 0], [0, 0, 4, 4, 4, 1, 4, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5g = { name: "Cheshire Cat", uid: 507, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 7, 7, 0, 0, 0, 7, 7, 0], [0, 8, 7, 7, 8, 7, 7, 8, 0], [0, 7, 2, 4, 7, 2, 4, 7, 0], [0, 7, 2, 4, 7, 2, 4, 7, 0], [0, 8, 7, 7, 8, 7, 7, 8, 0], [0, 7, 7, 8, 8, 8, 7, 7, 0], [0, 0, 8, 7, 7, 7, 8, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5h = { name: "Ice Slider", uid: 508, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 7, 4, 0, 0, 0], [0, 0, 0, 7, 2, 7, 0, 0, 0], [0, 0, 0, 7, 1, 7, 0, 0, 0], [0, 0, 7, 1, 1, 1, 7, 0, 0], [0, 0, 7, 1, 1, 1, 7, 0, 0], [0, 0, 7, 1, 1, 1, 7, 0, 0], [0, 0, 2, 2, 0, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l5i = { name: "Emperor Crab", uid: 509, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 3, 0, 3, 0, 3, 0, 3, 0], [0, 3, 3, 8, 0, 8, 3, 3, 0], [0, 0, 3, 0, 0, 0, 3, 0, 0], [0, 0, 8, 1, 3, 1, 8, 0, 0], [0, 0, 0, 3, 3, 3, 0, 0, 0], [0, 3, 3, 8, 3, 8, 3, 3, 0], [0, 0, 3, 0, 0, 0, 3, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]] }; // 10x10 levels var l6a = { name: 'Orb of Wisdom', uid: 601, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 4, 5, 6, 0, 0, 0], [0, 0, 8, 4, 5, 6, 7, 8, 0, 0], [0, 2, 8, 4, 4, 5, 6, 7, 8, 0], [0, 8, 4, 4, 5, 5, 6, 7, 8, 0], [0, 4, 4, 5, 6, 7, 8, 2, 2, 0], [0, 4, 5, 6, 7, 8, 2, 2, 8, 0], [0, 0, 6, 7, 8, 2, 2, 8, 0, 0], [0, 0, 0, 7, 8, 2, 2, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6b = { name: "Donald's Quack", uid: 602, d: [[0, 0, 4, 4, 4, 4, 4, 4, 0, 0], [0, 4, 4, 4, 4, 4, 4, 4, 4, 0], [0, 0, 8, 8, 8, 8, 8, 8, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 4, 1, 1, 4, 1, 1, 0], [0, 2, 2, 2, 2, 2, 2, 2, 2, 0], [0, 0, 0, 4, 3, 3, 4, 0, 0, 0], [0, 0, 0, 4, 4, 4, 4, 0, 0, 0], [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 1, 0, 0, 0]] }; var l6c = { name: 'Block Party', uid: 603, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 5, 0, 0, 0, 0, 0, 0, 0, 0], [0, 5, 5, 0, 0, 0, 0, 0, 0, 0], [0, 5, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 6, 6, 0, 0, 0], [0, 0, 0, 1, 2, 2, 6, 6, 3, 0], [0, 4, 0, 0, 2, 2, 5, 0, 3, 0], [0, 4, 0, 0, 3, 5, 5, 0, 3, 0], [0, 4, 4, 3, 3, 3, 5, 0, 3, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6d = { name: 'Chomp Champ', uid: 604, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 8, 8, 8, 8, 0, 0, 0], [0, 0, 8, 2, 2, 2, 2, 8, 0, 0], [0, 8, 2, 2, 4, 2, 0, 0, 0, 0], [0, 8, 2, 2, 2, 0, 0, 0, 0, 0], [0, 8, 2, 2, 2, 2, 2, 2, 8, 0], [0, 0, 8, 2, 2, 2, 2, 8, 0, 0], [0, 0, 0, 8, 8, 8, 8, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6e = { name: 'Elven Sharpshot', uid: 605, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 5, 5, 5, 0, 8, 0, 0], [0, 5, 0, 5, 5, 5, 5, 0, 8, 0], [0, 0, 0, 5, 4, 9, 4, 0, 8, 0], [0, 0, 0, 5, 9, 3, 9, 0, 9, 0], [0, 0, 5, 5, 5, 5, 5, 5, 8, 0], [0, 0, 9, 8, 8, 8, 8, 0, 8, 0], [0, 0, 0, 5, 5, 5, 5, 0, 8, 0], [0, 0, 0, 5, 0, 0, 5, 8, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6f = { name: "The Cat's Purr", uid: 606, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 2, 0, 0, 0, 2, 0], [0, 2, 0, 0, 8, 2, 2, 2, 8, 0], [0, 2, 0, 0, 2, 5, 2, 5, 2, 0], [0, 2, 2, 2, 8, 2, 8, 2, 2, 0], [0, 8, 2, 2, 2, 8, 8, 8, 0, 0], [0, 2, 8, 8, 2, 2, 2, 2, 0, 0], [0, 8, 0, 8, 0, 8, 0, 8, 0, 0], [0, 6, 0, 6, 0, 6, 0, 6, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6g = { name: "Serpent's Trail", uid: 607, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 5, 0, 5, 0, 0, 0, 0, 0], [0, 5, 2, 5, 2, 5, 0, 0, 0, 0], [0, 5, 5, 5, 5, 5, 0, 0, 5, 0], [0, 0, 1, 0, 1, 0, 0, 5, 0, 0], [0, 0, 0, 5, 0, 0, 0, 5, 0, 0], [0, 0, 4, 5, 5, 5, 5, 4, 0, 0], [0, 0, 0, 4, 4, 4, 4, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6h = { name: "Zak's Dream", uid: 608, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 4, 4, 0, 0, 4, 4, 0, 0], [0, 4, 4, 4, 4, 4, 4, 4, 4, 0], [0, 4, 5, 5, 4, 4, 5, 5, 4, 0], [0, 4, 1, 1, 4, 4, 1, 1, 4, 0], [0, 0, 4, 4, 9, 9, 4, 4, 0, 0], [0, 0, 0, 9, 9, 9, 9, 0, 0, 0], [0, 0, 4, 4, 9, 9, 4, 4, 0, 0], [0, 4, 4, 0, 4, 4, 0, 4, 4, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; var l6i = { name: "Another Castle", uid: 609, d: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 8, 0, 8, 0, 0], [0, 0, 0, 0, 2, 2, 2, 2, 0, 0], [0, 0, 0, 2, 2, 2, 4, 1, 2, 0], [0, 0, 0, 2, 2, 1, 1, 1, 0, 0], [0, 0, 2, 2, 9, 1, 9, 0, 0, 0], [0, 0, 0, 1, 9, 9, 9, 1, 0, 0], [0, 0, 0, 0, 9, 9, 9, 0, 0, 0], [0, 0, 0, 9, 3, 9, 3, 9, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] }; // Levels ordered by grid size, for shuffling while maintining difficulty ramping. var levels5 = [l1a, l1b, l1c, l1d, l1e, l1f, l1g, l1h, l1i]; var levels6 = [l2a, l2b, l2c, l2d, l2e, l2f, l2g, l2h, l2i]; var levels7 = [l3a, l3b, l3c, l3d, l3e, l3f, l3g, l3h, l3i]; var levels8 = [l4a, l4b, l4c, l4d, l4e, l4f, l4g, l4h, l4i]; var levels9 = [l5a, l5b, l5c, l5d, l5e, l5f, l5g, l5h, l5i]; var levels10 = [l6a, l6b, l6c, l6d, l6e, l6f, l6g, l6h, l6i]; // All levels in one array. var levelsAll = levels5.concat(levels6, levels7, levels8, levels9, levels10); //var levelAll = levelsAll; // Define levelAll as a reference to levelsAll //var levelAll = levelsAll; // Define levelAll as a reference to levelsAll //console.log(levelsAll); //console.log(storage.levelsDiscovered); //var levels = [l1a, l6g, l6b, l6c, l6d, l1b, l1c, l1d, l1e, l1f, l1g, l2a, l2b, l2c, l2d, l2e, l2f, l2g, l3a, l3b, l3c, l3d, l3e, l3f, l3g, l4a, l4b, l4c, l4d, l4e, l4f, l4g, l5a, l5b, l5c, l5d, l5e, l5f, l5g, l6a, l6b, l6c, l6d, l6e, l6f, l6g]; //var levels = [l1h]; //, l6h, l6i, l4f, l5b, l5d, l5f, l5g, l6f]; var levels = randomLevelSelection(); var currentLevelID = 0; // Copy without reference, so we have original for retry/level reset. //var currentLevel = levels[currentLevelID].map(function (arr) { // return Array.isArray(arr) ? arr.slice() : []; //}); var currentLevel = levels[currentLevelID]; var stars = []; var latestRemoveCount = 0; var levelContainer = new Container(); levelContainer.x = 1024; levelContainer.y = boardCenterY; //2732 / 2 + 200; game.addChild(levelContainer); function randomLevelSelection() { var levelsPerGridSize = 2; // how many levels do we want with each size grid in the final levels array? var t = [levels5, levels6, levels7, levels8, levels9, levels10]; var c = []; for (var i = 0; i < t.length; i++) { for (var j = 0; j < levelsPerGridSize; j++) { var id = Math.floor(Math.random() * t[i].length); c.push(t[i][id]); t[i].splice(id, 1); } } return c; } function paintLevel(a) { var startX = -boardSize / 2; var startY = -boardSize / 2; var boxSize = tileSize; var boxSpacing = boxSize * spacingRatio; var offset = boxSize / 2 + boxSpacing; var delayCounter = 0; for (var i = 0; i < a.d.length; i++) { for (var j = 0; j < a.d[0].length; j++) { if (a.d[j][i] != 0) { var cBox = levelContainer.addChild(new ColorBox(a.d[j][i])); cBox.width = cBox.height = boxSize; //cBox.x = offset + startX + i * (boxSize + boxSpacing); //cBox.y = offset + startY + j * (boxSize + boxSpacing); cBox.gridX = i; cBox.gridY = j; var destX = offset + startX + i * (boxSize + boxSpacing); var destY = offset + startY + j * (boxSize + boxSpacing); var delayFactor = delayCounter; delayCounter += 60; //cBox.x = -1500; //cBox.y = destY; cBox.enterBoard(destX, destY, delayFactor); } } } //levelNameLabel.setText(a.name + ' ' + a.uid); levelNameLabel.setText('"' + a.name + '"'); if (!storage.levelsDiscovered.includes(currentLevel.uid)) { storage.levelsDiscovered.push(currentLevel.uid); //console.log('uids:' + storage.levelsDiscovered); } return delayCounter; } var initDelay = paintLevel(currentLevel); /*if (!storage.instructionsShown) { storage.instructionsShown = true; showInstructions(); } ;*/ var instructionsScreen = new InstructionsScreen(); instructionsScreen.x = 3000; instructionsScreen.alpha = 0; instructionsScreen.scale.set(1.2, 1.2); game.addChild(instructionsScreen); function showInstructions() { if (instructionsScreen.alpha == 0) { instructionsScreen.x = 1024; instructionsScreen.y = boardCenterY; instructionsScreen.alpha = 1; game.addChild(instructionsScreen); } else { instructionsScreen.alpha = 0; instructionsScreen.x = 3000; } } ; var progressScreen = new ProgressScreen(); progressScreen.x = 3000; progressScreen.alpha = 0; progressScreen.scale.set(1.2, 1.2); function showProgress() { if (progressScreen.alpha == 0) { progressScreen.x = 1024; progressScreen.y = boardCenterY; progressScreen.alpha = 1; game.addChild(progressScreen); } else { progressScreen.alpha = 0; progressScreen.x = 3000; } } ; function findConnectedSameColorTiles(startBox) { var connectedTiles = []; var visited = []; var queue = [startBox]; var targetColor = startBox.colorIndex; while (queue.length > 0) { var currentBox = queue.shift(); // Use pop() for DFS var _currentBox = currentBox, x = _currentBox.gridX; //x, y = _currentBox.gridY; //y; // Assuming each box has x, y properties if (visited.indexOf(currentBox) === -1) { visited.push(currentBox); connectedTiles.push(currentBox); // Check all adjacent tiles var neighbors = getAdjacentTiles(x, y); //console.log("neighbors:", neighbors); var _iterator = _createForOfIteratorHelper(neighbors), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var neighbor = _step.value; //if (neighbor.colorIndex === targetColor && !visited.has(neighbor)) { if (neighbor.colorIndex === targetColor && !visited.includes(neighbor)) { queue.push(neighbor); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } return connectedTiles; } function getAdjacentTiles(x, y) { var adjacentTiles = []; var directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]; // left, right, up, down for (var _i = 0, _directions = directions; _i < _directions.length; _i++) { var _directions$_i = _slicedToArray(_directions[_i], 2), dx = _directions$_i[0], dy = _directions$_i[1]; var newX = x + dx; var newY = y + dy; // Check if the new position is within the grid boundaries if (newX >= 0 && newX < currentLevel.d.length && newY >= 0 && newY < currentLevel.d[0].length) { var colorBox = levelContainer.children.find(function (child) { return !child.outlier && child.gridX === newX && child.gridY === newY; }); if (colorBox) { adjacentTiles.push(colorBox); } } } return adjacentTiles; } function colorBoxClicked(b) { //console.log('colorbox clicked:', b); var t = findConnectedSameColorTiles(b); //console.log(t); latestRemoveCount = t.length; for (var i = 0; i < t.length; i++) { t[i].remove(i * 30); } } function placeOutliers(delayBy) { // Determine colors left on the board to choose from. var colorsPresent = []; var gridSize = currentLevel.d.length; for (var i = 0; i < gridSize; i++) { for (var j = 0; j < gridSize; j++) { var t = currentLevel.d[i][j]; if (t != 0 && !colorsPresent.includes(t)) { colorsPresent.push(t); } } } //console.log('Game still includes these colors:', colorsPresent); // Determine what rows and cols contain colorboxes. // Horizontal rows var availableRows = []; for (var i = 0; i < gridSize; i++) { if (currentLevel.d[i].some(checkNonZero)) { //console.log('there are non-zero values in row:', i); availableRows.push(i); } } // Vertical columns var availableCols = []; var cols = rotateMatrix90C(currentLevel.d); for (var i = 0; i < gridSize; i++) { if (cols[i].some(checkNonZero)) { //console.log('there are non-zero values in col:', i); availableCols.push(i); } } // If no available rows or cols left, level cleared! var n = availableRows.length + availableCols.length; //console.log(n); if (n === 0) { //console.log('level cleared!'); return false; } else { var startX = -boardSize / 2; var startY = -boardSize / 2; var boxSize = tileSize; var boxSpacing = boxSize * spacingRatio; var offset = boxSize / 2 + boxSpacing; // Place an outlier tile at 50% (and minimum one) of the available positions. var placedAtLeastOne = false; var placedCounter = 0; var maxPlaced = 2; //console.log('ac:', availableCols); availableCols = shuffleArray(availableCols); availableRows = shuffleArray(availableRows); //console.log('ac:', availableCols); var currentDirection = outlierDirectionCounter % 4; outlierDirectionCounter++; // increment, so we get a new direction next turn. if (currentDirection == 1 || currentDirection == 3) { for (var i = 0; i < availableRows.length; i++) { //if (Math.random() < 0.5 || !placedAtLeastOne) { //if (true || !placedAtLeastOne) { //if (!placedAtLeastOne) { if (placedCounter < maxPlaced) { // place it, either side will do. var cIndex = colorsPresent[Math.floor(Math.random() * colorsPresent.length)]; var b = new ColorBox(cIndex); b.outlier = true; b.width = b.height = tileSize; if (currentDirection == 3) { b.x = -900; b.y = offset + startY + availableRows[i] * (boxSize + boxSpacing); b.gridX = -1; b.gridY = availableRows[i]; } else { b.x = 900; b.y = offset + startY + availableRows[i] * (boxSize + boxSpacing); b.gridX = 99; b.gridY = availableRows[i]; } b.fadeIn(delayBy); //console.log('b is:', b); levelContainer.addChild(b); //console.log('levelContainer is now:', levelContainer); placedAtLeastOne = true; placedCounter++; } } } else { for (var i = 0; i < availableCols.length; i++) { //if (Math.random() < 0.5 || !placedAtLeastOne) { //if (true || !placedAtLeastOne) { //if (!placedAtLeastOne) { if (placedCounter < maxPlaced) { // place it, either side will do var cIndex = colorsPresent[Math.floor(Math.random() * colorsPresent.length)]; var b = new ColorBox(cIndex); b.outlier = true; b.width = b.height = tileSize; if (currentDirection == 0) { b.x = offset + startX + availableCols[i] * (boxSize + boxSpacing); b.y = -900; b.gridX = availableCols[i]; //console.log(availableCols[i]); b.gridY = -1; } else { b.x = offset + startX + availableCols[i] * (boxSize + boxSpacing); b.y = 900; b.gridX = availableCols[i]; b.gridY = 99; } b.fadeIn(delayBy); //console.log('b is:', b); levelContainer.addChild(b); //console.log('levelContainer is now:', levelContainer); placedAtLeastOne = true; placedCounter++; } } } } // And place them. (Animate them in from sides.) return true; } function shuffleArray(arr) { var j, x, index; for (index = arr.length - 1; index > 0; index--) { j = Math.floor(Math.random() * (index + 1)); x = arr[index]; arr[index] = arr[j]; arr[j] = x; } return arr; } function checkNonZero(i) { return i != 0; } function rotateMatrix90C(source) { // get the dimensions of the source matrix var m = source.length; var n = source[0].length; // create a new NxM destination array var destination = new Array(n); for (var i = 0; i < n; i++) { destination[i] = new Array(m); } // start copying from source into destination for (var i = 0; i < n; i++) { for (var j = 0; j < m; j++) { destination[i][j] = source[m - j - 1][i]; } } // return the destination matrix return destination; } placeOutliers(initDelay); updateScoreLabels(); function moveIn() { // Move all outliers onto stage var outliers = levelContainer.children.filter(function (child) { return child.outlier; }); //console.log('there are ', outliers.length, 'outliers'); var isGameOver = false; for (var i = 0; i < outliers.length; i++) { var t = outliers[i]; //console.log(t); var newPos = 999; // Determine direction the outlier is moving in, in order to determine position to tween to. if (t.gridX == -1) { for (var j = gridSize - 1; j >= 0; j--) { //console.log('j entry is', currentLevel[t.gridY][j]); if (currentLevel.d[t.gridY][j] != 0) { newPos = j - 1; } } //console.log(t, 'would move to position', newPos); t.gridX = newPos; } else if (t.gridX == 99) { for (var j = 0; j < gridSize; j++) { //console.log('j entry is', currentLevel[t.gridY][j]); if (currentLevel.d[t.gridY][j] != 0) { newPos = j + 1; } } //console.log(t, 'would move to position', newPos); t.gridX = newPos; } else if (t.gridY == -1) { for (var j = gridSize - 1; j >= 0; j--) { //console.log('j entry is', currentLevel[j][t.gridX]); if (currentLevel.d[j][t.gridX] != 0) { newPos = j - 1; } } //console.log(t, 'would move to position', newPos); t.gridY = newPos; } else if (t.gridY == 99) { // do something, fix this for (var j = 0; j < gridSize; j++) { //console.log('j entry is', currentLevel[j][t.gridX]); if (currentLevel.d[j][t.gridX] != 0) { newPos = j + 1; } } t.gridY = newPos; } //console.log(t, 'would move to position', newPos); if (newPos == -1 || newPos == gridSize) { // Game Over, lost var highScore = storage.highScore || 0; if (playerScore > highScore) { storage.highScore = playerScore; } //console.log('highscore is now:', storage.highScore); t.tint = 0xFF0000; isGameOver = true; t.blinkRed(); /* tween(t, { width: tileSize * 1.5, height: tileSize * 1.5 }, { duration: 150, easing: tween.easeInOut, onFinish: function onFinish() { //t.width = tileSize; //t.height = tileSize; tween(t, { width: tileSize, height: tileSize }, { duration: 150, easing: tween.easeInOut }); } });*/ LK.setScore(playerScore); //LK.showGameOver(); } else if (newPos != 999) { t.moveInPosition(); } else { t.flyOut(); } } if (isGameOver) { GAME_STATE = 5; } } function updateScoreLabels() { scoreLabel.setText('Score\n' + playerScore); if (playerScore > highScore) { highScore = playerScore; } highScoreLabel.setText('Best\n' + highScore); } //moveIn(); var showingLevelCompleteCounter = 0; var showingLevelCompleteCounterMax = 120; var levelCompleteScreen = new LevelComplete(); var GAME_STATE = -1; // -1: INIT // 0: Waiting for input // 1: Removing tiles // 2: Moving outliers in // 3: Generating new outliers. // 4: level cleared // 5: Game over game.update = function () { if (GAME_STATE == -1) { if (numRunningTweens == 0) { GAME_STATE = 0; GAME_IS_CLICKABLE = true; } } else if (GAME_STATE == 0) { // awaiting user input if (numRunningTweens > 0) { GAME_STATE = 1; } } else if (GAME_STATE == 1) { // removing tiles if (numRunningTweens == 0) { GAME_STATE = 2; moveIn(); } } else if (GAME_STATE == 2) { // moving outliers in if (numRunningTweens == 0) { if (placeOutliers()) { GAME_STATE = 3; } else { GAME_STATE = 4; showingLevelCompleteCounter = 0; } } } else if (GAME_STATE == 3) { // generating new outliers if (numRunningTweens == 0) { GAME_IS_CLICKABLE = true; GAME_STATE = 0; } } else if (GAME_STATE == 4) { // go to next level or game completed. // If we haven't run out of levels, fo to the next one. //if (currentLevelID != levels.length - 1) { if (currentLevelID != levels.length - 1) { if (showingLevelCompleteCounter == 0) { showingLevelCompleteCounter++; // show level complete screen. levelCompleteScreen = new LevelComplete(); levelCompleteScreen.x = 1024; levelCompleteScreen.y = boardCenterY; game.addChild(levelCompleteScreen); } else if (showingLevelCompleteCounter < showingLevelCompleteCounterMax) { showingLevelCompleteCounter++; } else { // Remove levelcomplete screen and stat next level. levelCompleteScreen.destroy(); currentLevelID++; //currentLevel = levels[currentLevelID].slice(0); //currentLevel = levels[currentLevelID].map(function (arr) { // return arr.slice(); //}); currentLevel = levels[currentLevelID]; //console.log('new level is', currentLevel); gridSize = currentLevel.d.length; tileSize = calculateTileSize(); board.destroy(); board = new Board(); board.x = 1024; board.y = boardCenterY; //2732 / 2; game.addChild(board); levelContainer.destroy(); levelContainer = new Container(); levelContainer.x = 1024; levelContainer.y = boardCenterY; //2732 / 2; game.addChild(levelContainer); //levelContainer = new Container(); var entranceDelay = paintLevel(currentLevel); levelLabel.setText('Level ' + (currentLevelID + 1)); placeOutliers(entranceDelay); GAME_STATE = -1; } } else { // Show game over - all levels completed! if (showingLevelCompleteCounter == 0) { showingLevelCompleteCounter++; var gcs = new GameComplete(); gcs.x = 1024; gcs.y = boardCenterY; game.addChild(gcs); } else if (showingLevelCompleteCounter < showingLevelCompleteCounterMax) { showingLevelCompleteCounter++; } else { var highScore = storage.highScore || 0; if (playerScore > highScore) { storage.highScore = playerScore; } LK.setScore(playerScore); LK.setTimeout(function () { //LK.showGameOver(); LK.showYouWin(); }, 2000); } } } else if (GAME_STATE == 5) { LK.setTimeout(function () { LK.showGameOver(); }, 1300); } for (var l = stars.length - 1; l >= 0; l--) { if (stars[l].isDead) { stars[l].destroy(); stars.splice(l, 1); } else { stars[l]._move_migrated(); } } };
===================================================================
--- original.js
+++ change.js
@@ -667,10 +667,10 @@
/****
* Game Code
****/
-//LK.init.sound('testmusic', {volume:1, start:0, end:0.995, id:'676c4b01fd1ad619bb4ea263'})
//LK.init.music('backgroundMusic')
+//LK.init.sound('testmusic', {volume:1, start:0, end:0.995, id:'676c4b01fd1ad619bb4ea263'})
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
@@ -1223,10 +1223,10 @@
//var levelAll = levelsAll; // Define levelAll as a reference to levelsAll
//console.log(levelsAll);
//console.log(storage.levelsDiscovered);
//var levels = [l1a, l6g, l6b, l6c, l6d, l1b, l1c, l1d, l1e, l1f, l1g, l2a, l2b, l2c, l2d, l2e, l2f, l2g, l3a, l3b, l3c, l3d, l3e, l3f, l3g, l4a, l4b, l4c, l4d, l4e, l4f, l4g, l5a, l5b, l5c, l5d, l5e, l5f, l5g, l6a, l6b, l6c, l6d, l6e, l6f, l6g];
-var levels = [l1h, l6h, l6i, l4f, l5b, l5d, l5f, l5g, l6f];
-//var levels = randomLevelSelection();
+//var levels = [l1h]; //, l6h, l6i, l4f, l5b, l5d, l5f, l5g, l6f];
+var levels = randomLevelSelection();
var currentLevelID = 0;
// Copy without reference, so we have original for retry/level reset.
//var currentLevel = levels[currentLevelID].map(function (arr) {
// return Array.isArray(arr) ? arr.slice() : [];
@@ -1742,9 +1742,10 @@
storage.highScore = playerScore;
}
LK.setScore(playerScore);
LK.setTimeout(function () {
- LK.showGameOver();
+ //LK.showGameOver();
+ LK.showYouWin();
}, 2000);
}
}
} else if (GAME_STATE == 5) {
A large calm background drawing for a puzzle game, in dark calm blueish colors and non-confusing content. High definition. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A quadratic polished dark blue marble slate. Front perspective with right angles. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A white question mark in a circle, like for a help button in a game.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A white X in a circle, like for a close window button in a game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A white questionmark on a black background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A green check mark on a dark background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.