User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 420
User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 410
User prompt
Change the update text to say V0.2
User prompt
Delete the text that says update and new features
User prompt
Make them a tiny bit smaller
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'self.trail.length')' in or related to this line: 'for (var i = 0; i < self.trail.length; i++) {' Line Number: 196
User prompt
For the long ones remove the particles
User prompt
Make some long red obstacles that stick onto the wall which have the same mechanic as the other ones, but make the rarity 40 % chance
User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 414 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 414 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make all of the red squares 0.8 in transparency
User prompt
Make it range from 0 to 0.6
User prompt
Make some of the red squares, a tiny bit transparent
User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 414 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: target is not an Object. (evaluating 'key in target')' in or related to this line: 'tween(eclipseWarningText, {' Line Number: 414 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make them a tiny bit more spread out
User prompt
Make them a tiny bit more bigger
User prompt
Make them rotate in place
User prompt
Make them a tiny bit bigger
User prompt
Add them on the bottom of the player
User prompt
Add 2 little blue cubes behind the player that follow the player
User prompt
When player dies add a red explosion
/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var BlueCube = Container.expand(function () {
	var self = Container.call(this);
	var cubeGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 0.5,
		scaleY: 0.5,
		tint: 0x0000FF // Blue color
	});
	return self;
});
var Boss = Container.expand(function () {
	var self = Container.call(this);
	var bossGraphics = self.attachAsset('circle', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.laser = new Container();
	self.laserGraphics = self.laser.attachAsset('square', {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: 0.4
	});
	self.laserGraphics.scaleY = 10; // Make the laser long
	self.laserGraphics.scaleX = 0.1; // Make the laser thin
	self.addChild(self.laser);
	self.laserDirection = {
		x: 0,
		y: 0
	};
	self.laserCooldown = 180; // 3 seconds cooldown
	self.laserActive = false;
	self.laserTimer = 0;
	self.update = function () {
		if (self.laserActive) {
			self.laserTimer++;
			if (self.laserTimer >= self.laserCooldown) {
				self.laserActive = false;
				self.laserTimer = 0;
				self.laserGraphics.alpha = 0.4;
			}
		} else {
			// Aim laser at player
			if (player) {
				var dx = player.x - self.x;
				var dy = player.y - self.y;
				var angle = Math.atan2(dy, dx);
				self.laser.rotation = angle;
				self.laserDirection.x = Math.cos(angle);
				self.laserDirection.y = Math.sin(angle);
			}
			self.laserGraphics.alpha = 0;
			self.laserActive = true;
		}
	};
	self.shootLaser = function () {
		if (self.laserActive) {
			// Check if laser hits player
			if (player && self.intersects(player)) {
				// Player hit by laser
				LK.getSound('explosion').play();
				LK.effects.flashScreen(0xFF0000, 500);
				LK.showGameOver();
			}
		}
	};
	return self;
});
var Obstacle = Container.expand(function (type) {
	var self = Container.call(this);
	if (Math.random() < 0.4) {
		// 40% chance to be a long red obstacle
		type = 'longRedObstacle';
	}
	self.type = type || 'hexagon';
	self.speed = type === 'magentaSquare' ? 40 : type === 'longRedObstacle' ? 2 : 3.5 + Math.random() * 2;
	self.rotationSpeed = (Math.random() - 0.5) * 0.05;
	self.trail = []; // Initialize trail as an empty array to prevent undefined errors
	var shapeGraphics = self.attachAsset(self.type, {
		anchorX: 0.5,
		anchorY: 0.5,
		alpha: self.type === 'square' ? 0.8 : 1 // Set red squares to have a transparency of 0.8
	});
	// Add glowing effect to obstacles
	if (typeof filters !== 'undefined' && typeof filters.GlowFilter !== 'undefined') {
		shapeGraphics.filters = [new filters.GlowFilter({
			color: 0xFFFF00,
			// Yellow color for the glow
			distance: 10,
			// Distance of the glow
			outerStrength: 2,
			// Strength of the glow
			innerStrength: 1 // Inner strength of the glow
		})];
	} else {
		console.warn("GlowFilter is not defined. Skipping glow effect.");
	}
	// Special transformations per shape type
	if (self.type === 'triangle') {
		// Make it a triangle by scaling
		shapeGraphics.scaleY = 0.866; // sqrt(3)/2 to make equilateral triangle
	} else if (self.type === 'longRedObstacle') {
		shapeGraphics.scaleY = 1.8; // Make the obstacle slightly smaller
	} else if (self.type === 'hexagon') {
		// Create hexagon effect using rotation and scale
		self.rotationSpeed = (Math.random() - 0.5) * 0.02; // Slower rotation for hexagons
	}
	self.update = function () {
		// Add trail effect (smaller shapes that follow the obstacle) only if not a long red obstacle
		if (self.type !== 'longRedObstacle') {
			if (!self.trail) {
				self.trail = [];
				self.trailMaxLength = 15;
				self.trailDelay = 2;
				self.trailCounter = 0;
			}
			self.trailCounter++;
			if (self.trailCounter >= self.trailDelay) {
				self.trailCounter = 0;
				// Add new trail point
				if (self.trail.length >= self.trailMaxLength) {
					// Recycle oldest trail point
					var oldestPoint = self.trail.shift();
					oldestPoint.x = self.x;
					oldestPoint.y = self.y;
					self.trail.push(oldestPoint);
				} else {
					// Create new trail point
					var trailPoint = LK.getAsset(self.type, {
						anchorX: 0.5,
						anchorY: 0.5,
						scaleX: 0.7,
						scaleY: 0.7,
						alpha: 0.7,
						tint: 0xFF0000 + (Math.floor(Math.random() * 256) << 8) + Math.floor(Math.random() * 256) // Add color variation
					});
					trailPoint.x = self.x;
					trailPoint.y = self.y;
					self.trail.push(trailPoint);
					game.addChild(trailPoint);
				}
				// Update all trail points opacity
				for (var i = 0; i < self.trail.length; i++) {
					var point = self.trail[i];
					point.alpha = 0.5 * (i / self.trail.length);
				}
			}
		}
		// Move shape downward
		self.y += self.speed;
		// Rotate shape
		shapeGraphics.rotation += self.rotationSpeed;
		// Check if the player is close to the bomb
		if (self.type === 'Bomb' && player && !self.expanding) {
			if (Math.abs(self.x - player.x) < 100 && Math.abs(self.y - player.y) < 100) {
				self.expanding = true;
				tween(self, {
					scaleX: 2,
					scaleY: 2
				}, {
					duration: 1000,
					easing: tween.easeOut,
					onFinish: function onFinish() {
						self.markForRemoval = true;
					}
				});
			}
		}
		// Remove if off screen
		if (self.y > 2832) {
			self.markForRemoval = true;
			// Remove trail effect when obstacle hits the bottom
			for (var i = 0; i < self.trail.length; i++) {
				self.trail[i].destroy();
			}
			self.trail = [];
		}
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	// Add blue glowing effect to the player
	if (typeof filters !== 'undefined' && typeof filters.GlowFilter !== 'undefined') {
		playerGraphics.filters = [new filters.GlowFilter({
			color: 0x0000FF,
			// Blue color
			distance: 15,
			// Distance of the glow
			outerStrength: 2,
			// Strength of the glow
			innerStrength: 1 // Inner strength of the glow
		})];
	} else {
		console.warn("GlowFilter is not defined. Skipping glow effect.");
	}
	// Add trail effect (smaller circles that follow the player)
	self.trail = [];
	self.trailMaxLength = 5;
	self.trailDelay = 3;
	self.trailCounter = 0;
	self.createTrailPoint = function () {
		var trailPoint = LK.getAsset('player', {
			anchorX: 0.5,
			anchorY: 0.5,
			scaleX: 0.5,
			scaleY: 0.5,
			alpha: 0.5,
			tint: 0xADD8E6 // Light blue color for the trail effect
		});
		trailPoint.x = self.x;
		trailPoint.y = self.y;
		return trailPoint;
	};
	self.updateTrail = function () {
		self.trailCounter++;
		if (!self.blueCubes) {
			self.blueCubes = [new BlueCube(), new BlueCube()];
			game.addChild(self.blueCubes[0]);
			game.addChild(self.blueCubes[1]);
		}
		self.blueCubes[0].x = self.x - 40;
		self.blueCubes[0].y = self.y + 60;
		self.blueCubes[0].rotation += 0.1; // Rotate the first blue cube
		self.blueCubes[1].x = self.x + 40;
		self.blueCubes[1].y = self.y + 60;
		self.blueCubes[1].rotation += 0.1; // Rotate the second blue cube
		if (self.trailCounter >= self.trailDelay) {
			self.trailCounter = 0;
			// Add new trail point
			if (self.trail.length >= self.trailMaxLength) {
				// Recycle oldest trail point
				var oldestPoint = self.trail.shift();
				oldestPoint.x = self.x;
				oldestPoint.y = self.y;
				self.trail.push(oldestPoint);
			} else {
				// Create new trail point
				var newPoint = self.createTrailPoint();
				self.trail.push(newPoint);
				game.addChild(newPoint);
			}
			// Update all trail points opacity
			for (var i = 0; i < self.trail.length; i++) {
				var point = self.trail[i];
				point.alpha = 0.5 * (i / self.trail.length);
			}
		}
	};
	return self;
});
var TitleText = Container.expand(function () {
	var self = Container.call(this);
	self.title = new Text2('Obstacle Escape', {
		size: 100,
		fill: 0xFFFFFF,
		// Original color
		font: "Montserrat" // Change font to Montserrat
	});
	self.title.anchor.set(0.5, 0.5);
	self.addChild(self.title);
	self.subtitle = new Text2('Press Start', {
		size: 60,
		fill: 0xFFFFFF,
		// Original color
		font: "Montserrat" // Change font to Montserrat
	});
	self.subtitle.anchor.set(0.5, 0.5);
	self.subtitle.y = 100;
	self.addChild(self.subtitle);
	// Pulsing animation for the subtitle
	self.pulseAnimation = function () {
		tween(self.subtitle, {
			scaleX: 1.1,
			scaleY: 1.1
		}, {
			duration: 800,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				tween(self.subtitle, {
					scaleX: 1,
					scaleY: 1
				}, {
					duration: 800,
					easing: tween.easeInOut,
					onFinish: self.pulseAnimation
				});
			}
		});
	};
	self.pulseAnimation();
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000033
});
/**** 
* Game Code
****/ 
// Game state variables
function _typeof3(o) {
	"@babel/helpers - typeof";
	return _typeof3 = "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;
	}, _typeof3(o);
}
function _typeof2(o) {
	"@babel/helpers - typeof";
	return _typeof2 = "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;
	}, _typeof2(o);
}
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 player;
var boss = null;
var obstacles = [];
var isGameStarted = false;
var titleScreen;
var gameTime = 0;
var spawnRate = 60; // Frames between obstacle spawns
var spawnCounter = 0;
var difficulty = 1;
// Setup GUI elements
var backgroundEffectsText; // Define backgroundEffectsText in the global scope
var leaderboardTxt; // Define leaderboardTxt in the global scope
var updateDetailsText; // Define updateDetailsText in the global scope
var scoreTxt = new Text2('0', {
	size: 70,
	fill: 0xFFFFFF,
	font: "Montserrat" // Change font to Montserrat
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
var highScoreTxt = new Text2('Best: 0', {
	size: 40,
	fill: 0xFFFFFF,
	font: "Montserrat" // Change font to Montserrat
});
highScoreTxt.anchor.set(1, 0);
highScoreTxt.x = -20;
highScoreTxt.y = 20;
LK.gui.topRight.addChild(highScoreTxt);
// Create title screen
function setupTitleScreen() {
	titleScreen = new TitleText();
	titleScreen.x = 2048 / 2;
	titleScreen.y = 2732 / 2 - 200;
	game.addChild(titleScreen);
	// Add eclipse warning text
	eclipseWarningText = new Text2('Caution: Intensity!', {
		size: 60,
		fill: 0xFFFFFF,
		// Original color
		font: "Montserrat" // Change font to Montserrat
	});
	eclipseWarningText.anchor.set(0.5, 0.5);
	eclipseWarningText.x = 2048 / 2;
	eclipseWarningText.y = 2732 / 2 + 150; // Position below the title 
	game.addChild(eclipseWarningText);
	// Add update log text
	updateLogText = new Text2('V0.2', {
		size: 50,
		fill: 0xFFFFFF,
		// Original color
		font: "Montserrat" // Change font to Montserrat
	});
	updateLogText.anchor.set(1, 0);
	updateLogText.x = 2048 - 20; // Position on the right of the screen
	updateLogText.y = 150;
	game.addChild(updateLogText);
	// Add flashing effect to eclipse warning text
	function flashWarningText() {
		if (typeof eclipseWarningText !== 'undefined' && eclipseWarningText instanceof Text2) {
			if ((typeof eclipseWarningText === "undefined" ? "undefined" : _typeof3(eclipseWarningText)) === 'object' && eclipseWarningText !== null) {
				tween(eclipseWarningText, {
					alpha: 0
				}, {
					duration: 500,
					easing: tween.easeInOut,
					onFinish: function onFinish() {
						tween(eclipseWarningText, {
							alpha: 1
						}, {
							duration: 500,
							easing: tween.easeInOut,
							onFinish: flashWarningText
						});
					}
				});
			}
		}
	}
	flashWarningText();
	// Load high score
	var highScore = storage.highScore || 0;
	highScoreTxt.setText('Best: ' + highScore);
	var leaderboardTxt = new Text2('Leaderboard: Player1 - ' + highScore, {
		size: 40,
		fill: 0xFFFFFF,
		font: "Montserrat" // Change font to Montserrat
	});
	leaderboardTxt.anchor.set(0.5, 0);
	leaderboardTxt.y = 100;
	game.addChild(leaderboardTxt);
}
// Start the game
function startGame() {
	// Remove title screen if it exists
	if (titleScreen) {
		titleScreen.destroy();
		titleScreen = null;
		if (leaderboardTxt) {
			leaderboardTxt.destroy();
			leaderboardTxt = null;
		}
		if (eclipseWarningText) {
			eclipseWarningText.destroy();
			eclipseWarningText = null;
		}
		if (updateLogText) {
			updateLogText.destroy();
			updateLogText = null;
		}
		if (scoreTxt) {
			scoreTxt.destroy();
			scoreTxt = null;
		}
		if (highScoreTxt) {
			highScoreTxt.destroy();
			highScoreTxt = null;
		}
		if (backgroundEffectsText) {
			backgroundEffectsText.destroy();
			backgroundEffectsText = null;
		}
	}
	// Reset game state
	isGameStarted = true;
	gameTime = 0;
	spawnCounter = 0;
	difficulty = 1;
	LK.setScore(0);
	scoreTxt = new Text2('0', {
		size: 70,
		fill: 0xFFFFFF
	});
	scoreTxt.anchor.set(0.5, 0);
	scoreTxt.y = 20;
	LK.gui.top.addChild(scoreTxt);
	scoreTxt.setText('0');
	// Clear any existing obstacles
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].destroy();
	}
	obstacles = [];
	// Create player
	player = new Player();
	player.x = 2048 / 2;
	player.y = 2732 - 300;
	game.addChild(player);
	// Play dubstep music and loop it
	LK.playMusic('bgMusic', {
		loop: true
	});
}
// Spawn a new obstacle
function spawnObstacle() {
	// Choose a random shape type
	var types = ['circle', 'square', 'triangle', 'hexagon', 'magentaSquare'];
	var type = types[Math.floor(Math.random() * types.length)];
	// Generate random size for the obstacle
	var randomSize = 50 + Math.random() * 100; // Random size between 50 and 150
	// Create obstacle with random size and color variation
	var obstacle = new Obstacle(type);
	var colorVariation = Math.floor(Math.random() * 256); // Random value between 0 and 255
	obstacle.tint = 0xFF0000 + (colorVariation << 8) + colorVariation; // Apply color variation
	obstacle.scaleX = randomSize / 100; // Scale based on random size
	obstacle.scaleY = randomSize / 100; // Scale based on random size
	// Position randomly along the top of the screen
	obstacle.x = Math.random() * 2048;
	obstacle.y = -100;
	game.addChild(obstacle);
	obstacles.push(obstacle);
	LK.getSound('spawn').play();
}
// Check for collisions between player and obstacles
function checkCollisions() {
	if (!player) {
		return;
	}
	for (var i = 0; i < obstacles.length; i++) {
		if (player.intersects(obstacles[i])) {
			// Collision detected - game over
			LK.getSound('collision').play();
			LK.getSound('explosion').play(); // Play explosion sound when player dies
			LK.effects.flashScreen(0xFF0000, 500);
			// Create a red explosion effect at the player's position
			var explosion = LK.getAsset('circle', {
				anchorX: 0.5,
				anchorY: 0.5,
				scaleX: 1,
				scaleY: 1,
				alpha: 1,
				tint: 0xFF0000 // Red color for the explosion
			});
			explosion.x = player.x;
			explosion.y = player.y;
			game.addChild(explosion);
			// Animate the explosion to expand and fade out
			tween(explosion, {
				scaleX: 3,
				scaleY: 3,
				alpha: 0
			}, {
				duration: 500,
				easing: tween.easeOut,
				onFinish: function onFinish() {
					explosion.destroy();
				}
			});
			// Save high score
			var currentScore = LK.getScore();
			var highScore = storage.highScore || 0;
			if (currentScore > highScore) {
				storage.highScore = currentScore;
				highScoreTxt.setText('Best: ' + currentScore);
			}
			// Show game over screen
			LK.showGameOver();
			return;
		}
	}
}
// Update game difficulty
function updateDifficulty() {
	// Increase difficulty over time
	if (gameTime % 600 === 0 && gameTime > 0) {
		// Every 10 seconds
		difficulty += 0.2;
		if (spawnRate > 20) {
			spawnRate -= 5;
		}
	}
	// Increase obstacle speed every 5 points
	if (LK.getScore() % 5 === 0 && LK.getScore() > 0) {
		for (var i = 0; i < obstacles.length; i++) {
			obstacles[i].speed += 0.1;
		}
	}
}
// Handle input events
game.down = function (x, y, obj) {
	if (!isGameStarted) {
		startGame();
	}
};
game.move = function (x, y, obj) {
	if (isGameStarted && player) {
		// Move player to touch position but keep it within game bounds
		player.x = Math.max(50, Math.min(x, 2048 - 50));
		player.y = Math.max(50, Math.min(y, 2732 - 50));
	}
};
// Main game update loop
game.update = function () {
	if (!isGameStarted) {
		// Show title screen if not started
		if (!titleScreen) {
			setupTitleScreen();
		}
		return;
	}
	// Update game time
	gameTime++;
	// Update score (time-based)
	LK.setScore(Math.floor(gameTime / 60)); // Score is in seconds
	scoreTxt.setText(LK.getScore().toString());
	// Update player trail
	if (player) {
		player.updateTrail();
	}
	// Update and spawn obstacles
	spawnCounter++;
	if (spawnCounter >= spawnRate && obstacles.length < 30) {
		spawnCounter = 0;
		spawnObstacle();
	}
	// Make it rain obstacles every 30 points
	if (LK.getScore() % 30 === 0 && LK.getScore() > 0) {
		if (!obstacleRainStartTime) {
			obstacleRainStartTime = gameTime;
			// Show warning text
			var warningText = new Text2('Alert: Incoming Rain!', {
				size: 80,
				fill: 0xFFFFFF,
				// Original color
				font: "Montserrat" // Change font to Montserrat
			});
			warningText.anchor.set(0.5, 0.5);
			warningText.x = 2048 / 2;
			warningText.y = 2732 / 2;
			game.addChild(warningText);
			// Remove warning text after 5 seconds
			LK.setTimeout(function () {
				warningText.destroy();
			}, 5000);
		}
		if (gameTime - obstacleRainStartTime > 300 && gameTime - obstacleRainStartTime <= 600) {
			// 5 seconds at 60 FPS
			for (var i = 0; i < 10; i++) {
				// Spawn 10 obstacles
				var obstacle = new Obstacle();
				obstacle.x = Math.random() * 2048;
				obstacle.y = -100;
				obstacle.speed = 20; // Set speed to 20
				game.addChild(obstacle);
				obstacles.push(obstacle);
			}
		} else if (gameTime - obstacleRainStartTime > 600 && gameTime - obstacleRainStartTime <= 1200) {
			// Additional 10 seconds at 60 FPS
			for (var i = 0; i < 5; i++) {
				// Spawn 5 obstacles
				var obstacle = new Obstacle();
				obstacle.x = Math.random() * 2048;
				obstacle.y = -100;
				obstacle.speed = 15; // Set speed to 15
				game.addChild(obstacle);
				obstacles.push(obstacle);
			}
		} else if (gameTime - obstacleRainStartTime > 600 && gameTime - obstacleRainStartTime <= 660) {
			// Display 'Survived!' text for 1 second
			var survivedText = new Text2('Survived!', {
				size: 80,
				fill: 0xFFFFFF,
				// Original color
				font: "Montserrat" // Change font to Montserrat
			});
			survivedText.anchor.set(0.5, 0.5);
			survivedText.x = 2048 / 2;
			survivedText.y = 2732 / 2;
			game.addChild(survivedText);
			LK.setTimeout(function () {
				survivedText.destroy();
			}, 1000);
		}
	} else {
		obstacleRainStartTime = null;
	}
	// Spawn boss at 60 points
	if (LK.getScore() === 60 && !boss) {
		boss = new Boss();
		boss.x = 2048 / 2;
		boss.y = 200;
		game.addChild(boss);
		LK.getSound('spawn').play();
	}
	// Update boss
	if (boss) {
		boss.update();
		boss.shootLaser();
		if (gameTime % 1200 === 0) {
			// Boss lasts for 20 seconds
			boss.destroy();
			boss = null;
		}
	}
	// Update all obstacles
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].update();
		// Remove obstacles marked for removal
		if (obstacles[i].markForRemoval) {
			obstacles[i].destroy();
			obstacles.splice(i, 1);
		}
	}
	// Check for collisions
	checkCollisions();
	// Update difficulty
	updateDifficulty();
}; ===================================================================
--- original.js
+++ change.js
@@ -315,8 +315,16 @@
 /**** 
 * Game Code
 ****/ 
 // Game state variables
+function _typeof3(o) {
+	"@babel/helpers - typeof";
+	return _typeof3 = "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;
+	}, _typeof3(o);
+}
 function _typeof2(o) {
 	"@babel/helpers - typeof";
 	return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
 		return typeof o;
@@ -392,9 +400,9 @@
 	game.addChild(updateLogText);
 	// Add flashing effect to eclipse warning text
 	function flashWarningText() {
 		if (typeof eclipseWarningText !== 'undefined' && eclipseWarningText instanceof Text2) {
-			if ((typeof eclipseWarningText === "undefined" ? "undefined" : _typeof2(eclipseWarningText)) === 'object' && eclipseWarningText !== null) {
+			if ((typeof eclipseWarningText === "undefined" ? "undefined" : _typeof3(eclipseWarningText)) === 'object' && eclipseWarningText !== null) {
 				tween(eclipseWarningText, {
 					alpha: 0
 				}, {
 					duration: 500,