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) {
:quality(85)/https://cdn.frvr.ai/6762c4139204367665187ef5.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67661b594ce3d4700e55ce56.png%3F3) 
 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.
:quality(85)/https://cdn.frvr.ai/676862ae3b942ba2575f53c1.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/677745d01cda26694cd5e8d2.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774e601cda26694cd5e8d6.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774e8d1cda26694cd5e8da.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774eb21cda26694cd5e8de.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774edd1cda26694cd5e8e2.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774eff1cda26694cd5e8e6.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774f571cda26694cd5e8ec.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774fbc1cda26694cd5e8f0.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/67774ff91cda26694cd5e8f4.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6778403803bfd4151d35b11a.png%3F3) 
 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.
:quality(85)/https://cdn.frvr.ai/677873d103bfd4151d35b175.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/677af8992194494601af3e7e.png%3F3) 
 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.
:quality(85)/https://cdn.frvr.ai/67829fc147855ca8eeb515c4.png%3F3) 
 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.
:quality(85)/https://cdn.frvr.ai/6782c3ed7974b0fd3cf55435.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6782e7197974b0fd3cf5570c.png%3F3) 
 A white questionmark on a black background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/6782f4687974b0fd3cf55820.png%3F3) 
 A green check mark on a dark background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.