/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 15;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var FlyingEnemy = Container.expand(function () {
	var self = Container.call(this);
	var flyingEnemyGraphics = self.attachAsset('flyingEnemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -10;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var GroundSegment = Container.expand(function () {
	var self = Container.call(this);
	var groundGraphics = self.attachAsset('ground', {
		anchorX: 0,
		anchorY: 0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Hole = Container.expand(function () {
	var self = Container.call(this);
	var holeGraphics = self.attachAsset('hole', {
		anchorX: 0,
		anchorY: 0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.isJumping = false;
	self.jumpSpeed = 0;
	self.gravity = 0.8;
	self.jumpPower = -25;
	self.groundY = 0;
	self.customColor = 0x4CAF50;
	self.jumpCount = 0;
	self.maxJumps = 2;
	self.characterType = 'player';
	self.isInvincible = false;
	self.invincibilityTimer = 0;
	self.hasWeapon = false;
	self.weaponGraphics = null;
	self.jump = function () {
		if (self.jumpCount < self.maxJumps) {
			if (!self.isJumping) {
				self.isJumping = true;
			}
			self.jumpSpeed = self.jumpPower;
			self.jumpCount++;
			LK.getSound('jump').play();
		}
	};
	self.setColor = function (color) {
		self.customColor = color;
		playerGraphics.tint = color;
	};
	self.setCharacter = function (characterType) {
		self.characterType = characterType;
		playerGraphics.destroy();
		playerGraphics = self.attachAsset(characterType, {
			anchorX: 0.5,
			anchorY: 1.0
		});
	};
	self.activateInvincibility = function () {
		self.isInvincible = true;
		self.invincibilityTimer = 300; // 5 seconds at 60fps
		// Flash effect
		tween(playerGraphics, {
			alpha: 0.3
		}, {
			duration: 200,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				if (self.isInvincible) {
					tween(playerGraphics, {
						alpha: 1
					}, {
						duration: 200,
						easing: tween.easeInOut,
						onFinish: function onFinish() {
							if (self.isInvincible) {
								self.activateInvincibility();
							}
						}
					});
				}
			}
		});
	};
	self.pickupWeapon = function () {
		self.hasWeapon = true;
		// Create weapon graphics attached to player
		if (self.weaponGraphics) {
			self.weaponGraphics.destroy();
		}
		self.weaponGraphics = self.attachAsset('weapon', {
			anchorX: 0.5,
			anchorY: 0.5
		});
		// Position weapon higher and straight in player's hand pointing forward
		self.weaponGraphics.x = 40;
		self.weaponGraphics.y = -200;
		self.weaponGraphics.scaleX = 3;
		self.weaponGraphics.scaleY = 3;
		self.weaponGraphics.rotation = 0; // Straight forward
	};
	self.update = function () {
		if (self.isJumping) {
			self.jumpSpeed += self.gravity;
			self.y += self.jumpSpeed;
			var landingY = self.groundY;
			if (self.y >= landingY) {
				self.y = landingY;
				self.isJumping = false;
				self.jumpSpeed = 0;
				self.jumpCount = 0;
			}
		}
		// Handle invincibility timer
		if (self.isInvincible) {
			self.invincibilityTimer--;
			if (self.invincibilityTimer <= 0) {
				self.isInvincible = false;
				tween.stop(playerGraphics);
				playerGraphics.alpha = 1;
			}
		}
	};
	return self;
});
var Weapon = Container.expand(function () {
	var self = Container.call(this);
	var weaponGraphics = self.attachAsset('weapon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
		self.y += Math.sin(LK.ticks * 0.1) * 2; // Floating animation
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var gameState = 'ready'; // 'customization', 'ready', 'playing', 'gameOver'
var selectedCharacter = 'player';
var player;
var groundSegments = [];
var holes = [];
var enemies = [];
var obstacles = [];
var bullets = [];
var flyingEnemies = [];
var weapons = [];
var gameSpeed = 8;
var spawnTimer = 0;
var shootTimer = 0;
var distance = 0;
var groundY = 2400;
var invincibilitySpacing = 1;
var lastInvincibilityTime = 0;
var titleImage;
// UI Elements
var character1Button = LK.getAsset('player', {
	anchorX: 0.5,
	anchorY: 0.5
});
character1Button.x = 424;
character1Button.y = 1200;
character1Button.scaleX = 0.8;
character1Button.scaleY = 0.8;
character1Button.visible = true;
var character2Button = LK.getAsset('player2', {
	anchorX: 0.5,
	anchorY: 0.5
});
character2Button.x = 724;
character2Button.y = 1200;
character2Button.scaleX = 0.8;
character2Button.scaleY = 0.8;
character2Button.visible = true;
var character3Button = LK.getAsset('player3', {
	anchorX: 0.5,
	anchorY: 0.5
});
character3Button.x = 1024;
character3Button.y = 1200;
character3Button.scaleX = 0.8;
character3Button.scaleY = 0.8;
character3Button.visible = true;
var character6Button = LK.getAsset('player6', {
	anchorX: 0.5,
	anchorY: 0.5
});
character6Button.x = 1324;
character6Button.y = 1200;
character6Button.scaleX = 0.8;
character6Button.scaleY = 0.8;
character6Button.visible = true;
var character7Button = LK.getAsset('player7', {
	anchorX: 0.5,
	anchorY: 0.5
});
character7Button.x = 1624;
character7Button.y = 1200;
character7Button.scaleX = 0.8;
character7Button.scaleY = 0.8;
character7Button.visible = true;
var playButton = LK.getAsset('startButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
playButton.x = 1024;
playButton.y = 1600;
playButton.scaleX = 1.5;
playButton.scaleY = 1.5;
playButton.visible = true;
// Character selection border
var selectionBorder = LK.getAsset('jumpButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
selectionBorder.x = 724;
selectionBorder.y = 1200;
selectionBorder.scaleX = 2.5;
selectionBorder.scaleY = 2.5;
selectionBorder.alpha = 0.3;
selectionBorder.visible = true;
var distanceText = new Text2('0m', {
	size: 60,
	fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
var fireButton = LK.getAsset('fireButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
fireButton.x = 150;
fireButton.y = 2200;
game.addChild(fireButton);
// Initialize player
player = new Player();
player.x = 400;
player.y = groundY;
player.groundY = groundY;
game.addChild(player);
// Initialize ground segments
for (var i = 0; i < 15; i++) {
	var ground = new GroundSegment();
	ground.x = i * 200;
	ground.y = groundY;
	groundSegments.push(ground);
	game.addChild(ground);
}
function initializeGame() {
	gameState = 'playing';
	distance = 0;
	gameSpeed = 8;
	spawnTimer = 0;
	// Hide character selection and play button
	character1Button.visible = false;
	character2Button.visible = false;
	character3Button.visible = false;
	character6Button.visible = false;
	character7Button.visible = false;
	selectionBorder.visible = false;
	playButton.visible = false;
	titleImage.visible = false;
	// Clear existing obstacles
	clearAllObstacles();
	// Reset player position
	player.x = 400;
	player.y = groundY;
	player.isJumping = false;
	player.jumpSpeed = 0;
	player.jumpCount = 0;
	player.isInvincible = false;
	player.invincibilityTimer = 0;
	// Give player weapon at start
	player.pickupWeapon();
	invincibilitySpacing = 1;
	lastInvincibilityTime = 0;
	// Reset ground segments
	for (var i = 0; i < groundSegments.length; i++) {
		groundSegments[i].x = i * 200;
		groundSegments[i].speed = -gameSpeed;
	}
}
function clearAllObstacles() {
	for (var i = holes.length - 1; i >= 0; i--) {
		holes[i].destroy();
		holes.splice(i, 1);
	}
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].destroy();
		enemies.splice(i, 1);
	}
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].destroy();
		obstacles.splice(i, 1);
	}
	for (var i = bullets.length - 1; i >= 0; i--) {
		bullets[i].destroy();
		bullets.splice(i, 1);
	}
	for (var i = flyingEnemies.length - 1; i >= 0; i--) {
		flyingEnemies[i].destroy();
		flyingEnemies.splice(i, 1);
	}
}
function spawnObstacle() {
	var rand = Math.random();
	var spawnX = 2200;
	var minDistance = 400; // Minimum distance between obstacles
	var canSpawn = true;
	// Check if there's enough distance from existing obstacles
	var allObstacles = obstacles.concat(enemies).concat(holes).concat(flyingEnemies);
	for (var i = 0; i < allObstacles.length; i++) {
		var existingObstacle = allObstacles[i];
		if (Math.abs(existingObstacle.x - spawnX) < minDistance) {
			canSpawn = false;
			break;
		}
	}
	if (!canSpawn) {
		return; // Don't spawn if too close to existing obstacles
	}
	if (rand < 0.15) {
		// Spawn hole
		var hole = new Hole();
		hole.x = spawnX;
		hole.y = groundY;
		hole.speed = -gameSpeed;
		holes.push(hole);
		game.addChild(hole);
	} else if (rand < 0.25) {
		// Spawn enemy
		var enemy = new Enemy();
		enemy.x = spawnX;
		enemy.y = groundY;
		enemy.speed = -gameSpeed;
		enemies.push(enemy);
		game.addChild(enemy);
	} else if (rand < 0.35) {
		// Spawn obstacle
		var obstacle = new Obstacle();
		obstacle.x = spawnX;
		obstacle.y = groundY;
		obstacle.speed = -gameSpeed;
		obstacles.push(obstacle);
		game.addChild(obstacle);
	} else if (rand < 0.45) {
		// Spawn flying enemy
		var flyingEnemy = new FlyingEnemy();
		flyingEnemy.x = spawnX;
		flyingEnemy.y = groundY - 350 - Math.random() * 200;
		flyingEnemy.speed = -gameSpeed;
		flyingEnemies.push(flyingEnemy);
		game.addChild(flyingEnemy);
	}
}
function checkCollisions() {
	// Check bullet vs enemy collisions
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		var bulletHit = false;
		// Check bullet vs ground enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (bullet.intersects(enemy)) {
				// Remove bullet and enemy
				bullet.destroy();
				bullets.splice(i, 1);
				enemy.destroy();
				enemies.splice(j, 1);
				bulletHit = true;
				break;
			}
		}
		// Check bullet vs flying enemies
		if (!bulletHit) {
			for (var j = flyingEnemies.length - 1; j >= 0; j--) {
				var flyingEnemy = flyingEnemies[j];
				if (bullet.intersects(flyingEnemy)) {
					// Remove bullet and flying enemy
					bullet.destroy();
					bullets.splice(i, 1);
					flyingEnemy.destroy();
					flyingEnemies.splice(j, 1);
					break;
				}
			}
		}
	}
	// Skip damage collisions if invincible
	if (!player.isInvincible) {
		// Check hole collisions - reduced collision area for closer detection
		for (var i = 0; i < holes.length; i++) {
			var hole = holes[i];
			// Player needs to be much closer to hole center to fall
			var holeCenterX = hole.x + 200; // Hole center
			var playerCenterX = player.x;
			var collisionDistance = 60; // Much smaller collision area
			if (Math.abs(playerCenterX - holeCenterX) < collisionDistance && !player.isJumping) {
				gameOver();
				return;
			}
		}
		// Check enemy collisions - reduced hitbox for closer collision
		for (var i = 0; i < enemies.length; i++) {
			var enemy = enemies[i];
			// Check if player is much closer to enemy center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var enemyCenterX = enemy.x;
			var enemyCenterY = enemy.y - 200; // Adjust for enemy height
			// Reduce collision area - player needs to be much closer
			var collisionDistanceX = 80; // Much smaller than asset width
			var collisionDistanceY = 100; // Much smaller than asset height
			if (Math.abs(playerCenterX - enemyCenterX) < collisionDistanceX && Math.abs(playerCenterY - enemyCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
		// Check flying enemy collisions - reduced hitbox for closer collision
		for (var i = 0; i < flyingEnemies.length; i++) {
			var flyingEnemy = flyingEnemies[i];
			// Check if player is much closer to flying enemy center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var flyingEnemyCenterX = flyingEnemy.x;
			var flyingEnemyCenterY = flyingEnemy.y;
			// Reduce collision area - player needs to be much closer
			var collisionDistanceX = 70; // Much smaller than asset width
			var collisionDistanceY = 90; // Much smaller than asset height
			if (Math.abs(playerCenterX - flyingEnemyCenterX) < collisionDistanceX && Math.abs(playerCenterY - flyingEnemyCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
		// Check obstacle collisions - expanded hitbox for easier collision
		for (var i = 0; i < obstacles.length; i++) {
			var obstacle = obstacles[i];
			// Check if player is closer to obstacle center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var obstacleCenterX = obstacle.x;
			var obstacleCenterY = obstacle.y - 150; // Adjust for obstacle height
			// Expand collision area - player doesn't need to be as close
			var collisionDistanceX = 120; // Larger collision area than before
			var collisionDistanceY = 160; // Larger collision area than before
			if (Math.abs(playerCenterX - obstacleCenterX) < collisionDistanceX && Math.abs(playerCenterY - obstacleCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
	}
}
function gameOver() {
	gameState = 'gameOver';
	LK.getSound('hit').play();
	LK.getSound('muerte').play();
	LK.showGameOver();
}
function updateSpeed() {
	gameSpeed = 8; // Keep speed constant at 8
	for (var i = 0; i < groundSegments.length; i++) {
		groundSegments[i].speed = -gameSpeed;
	}
	for (var i = 0; i < holes.length; i++) {
		holes[i].speed = -gameSpeed;
	}
	for (var i = 0; i < enemies.length; i++) {
		enemies[i].speed = -gameSpeed;
	}
	for (var i = 0; i < obstacles.length; i++) {
		obstacles[i].speed = -gameSpeed;
	}
	for (var i = 0; i < flyingEnemies.length; i++) {
		flyingEnemies[i].speed = -gameSpeed;
	}
	// Update bullet speeds to match current game speed
	for (var i = 0; i < bullets.length; i++) {
		bullets[i].speed = 15 + gameSpeed; // Base speed + current game speed
	}
}
game.down = function (x, y, obj) {
	if (gameState === 'ready') {
		// Check character selection clicks
		if (x > 344 && x < 504 && y > 1120 && y < 1280) {
			// Character 1 selected
			selectedCharacter = 'player';
			selectionBorder.x = 424;
			player.setCharacter('player');
			return;
		} else if (x > 644 && x < 804 && y > 1120 && y < 1280) {
			// Character 2 selected
			selectedCharacter = 'player2';
			selectionBorder.x = 724;
			player.setCharacter('player2');
			return;
		} else if (x > 944 && x < 1104 && y > 1120 && y < 1280) {
			// Character 3 selected
			selectedCharacter = 'player3';
			selectionBorder.x = 1024;
			player.setCharacter('player3');
			return;
		} else if (x > 1244 && x < 1404 && y > 1120 && y < 1280) {
			// Character 6 selected
			selectedCharacter = 'player6';
			selectionBorder.x = 1324;
			player.setCharacter('player6');
			return;
		} else if (x > 1544 && x < 1704 && y > 1120 && y < 1280) {
			// Character 7 selected
			selectedCharacter = 'player7';
			selectionBorder.x = 1624;
			selectionBorder.y = 1200;
			player.setCharacter('player7');
			return;
		}
		// Check play button click
		if (x > 774 && x < 1274 && y > 1350 && y < 1850) {
			LK.playMusic('musica');
			initializeGame();
			return;
		}
	} else if (gameState === 'playing') {
		// Check fire button click (bottom left corner)
		if (x > 90 && x < 210 && y > 2140 && y < 2260) {
			// Fire button pressed - shoot bullet
			if (shootTimer <= 0) {
				var bullet = new Bullet();
				bullet.x = player.x;
				bullet.y = player.y - 300; // Spawn from top of player
				// Player always has weapon so bullets are always enhanced
				bullet.speed = 20;
				bullet.scaleX = 1.2;
				bullet.scaleY = 1.2;
				bullets.push(bullet);
				game.addChild(bullet);
				LK.getSound('shoot').play();
				shootTimer = 5; // Fast shooting since player always has weapon
			}
		} else {
			// Regular screen tap - jump
			player.jump();
		}
	}
};
game.update = function () {
	if (gameState === 'playing') {
		distance += gameSpeed / 10;
		distanceText.setText(Math.floor(distance) + 'm');
		// Speed remains constant throughout the game
		// Spawn obstacles
		spawnTimer++;
		var spawnRate = (120 - Math.min(distance / 15, 50)) * invincibilitySpacing;
		if (spawnTimer >= spawnRate) {
			spawnObstacle();
			spawnTimer = 0;
		}
		// Reset invincibility spacing after effect wears off
		if (distance - lastInvincibilityTime > 300 && invincibilitySpacing > 1) {
			invincibilitySpacing = 1;
		}
		// Update ground segments - make continuous
		for (var i = 0; i < groundSegments.length; i++) {
			var ground = groundSegments[i];
			if (ground.x < -200) {
				// Find the rightmost ground segment
				var maxX = -1000;
				for (var j = 0; j < groundSegments.length; j++) {
					if (groundSegments[j].x > maxX) {
						maxX = groundSegments[j].x;
					}
				}
				ground.x = maxX + 200;
			}
		}
		// Update and clean up holes
		for (var i = holes.length - 1; i >= 0; i--) {
			var hole = holes[i];
			if (hole.x < -200) {
				hole.destroy();
				holes.splice(i, 1);
			}
		}
		// Update and clean up enemies
		for (var i = enemies.length - 1; i >= 0; i--) {
			var enemy = enemies[i];
			if (enemy.x < -100) {
				enemy.destroy();
				enemies.splice(i, 1);
			}
		}
		// Update and clean up obstacles
		for (var i = obstacles.length - 1; i >= 0; i--) {
			var obstacle = obstacles[i];
			if (obstacle.x < -100) {
				obstacle.destroy();
				obstacles.splice(i, 1);
			}
		}
		// Update and clean up bullets
		for (var i = bullets.length - 1; i >= 0; i--) {
			var bullet = bullets[i];
			if (bullet.x > 2200) {
				bullet.destroy();
				bullets.splice(i, 1);
			}
		}
		// Update and clean up flying enemies
		for (var i = flyingEnemies.length - 1; i >= 0; i--) {
			var flyingEnemy = flyingEnemies[i];
			if (flyingEnemy.x < -100) {
				flyingEnemy.destroy();
				flyingEnemies.splice(i, 1);
			}
		}
		// Update shoot timer
		if (shootTimer > 0) {
			shootTimer--;
		}
		// Check collisions
		checkCollisions();
		// Update score
		LK.setScore(Math.floor(distance));
		// Check win condition
		if (LK.getScore() >= 5000) {
			gameState = 'won';
			LK.getSound('victoria').play();
			LK.showYouWin();
			return;
		}
	}
};
// Add title image at the top of the screen
var titleImage = LK.getAsset('titulo', {
	anchorX: 0.5,
	anchorY: 0.5
});
titleImage.x = 1024; // Center horizontally
titleImage.y = 500; // Position lower on screen
titleImage.scaleX = 5; // Scale up for visibility
titleImage.scaleY = 5; // Scale up for visibility
game.addChild(titleImage);
// Show character selection and play button initially
game.addChild(character1Button);
game.addChild(character2Button);
game.addChild(character3Button);
game.addChild(character6Button);
game.addChild(character7Button);
game.addChild(selectionBorder);
game.addChild(playButton);
; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 15;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var FlyingEnemy = Container.expand(function () {
	var self = Container.call(this);
	var flyingEnemyGraphics = self.attachAsset('flyingEnemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -10;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var GroundSegment = Container.expand(function () {
	var self = Container.call(this);
	var groundGraphics = self.attachAsset('ground', {
		anchorX: 0,
		anchorY: 0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Hole = Container.expand(function () {
	var self = Container.call(this);
	var holeGraphics = self.attachAsset('hole', {
		anchorX: 0,
		anchorY: 0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.attachAsset('obstacle', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
	};
	return self;
});
var Player = Container.expand(function () {
	var self = Container.call(this);
	var playerGraphics = self.attachAsset('player', {
		anchorX: 0.5,
		anchorY: 1.0
	});
	self.isJumping = false;
	self.jumpSpeed = 0;
	self.gravity = 0.8;
	self.jumpPower = -25;
	self.groundY = 0;
	self.customColor = 0x4CAF50;
	self.jumpCount = 0;
	self.maxJumps = 2;
	self.characterType = 'player';
	self.isInvincible = false;
	self.invincibilityTimer = 0;
	self.hasWeapon = false;
	self.weaponGraphics = null;
	self.jump = function () {
		if (self.jumpCount < self.maxJumps) {
			if (!self.isJumping) {
				self.isJumping = true;
			}
			self.jumpSpeed = self.jumpPower;
			self.jumpCount++;
			LK.getSound('jump').play();
		}
	};
	self.setColor = function (color) {
		self.customColor = color;
		playerGraphics.tint = color;
	};
	self.setCharacter = function (characterType) {
		self.characterType = characterType;
		playerGraphics.destroy();
		playerGraphics = self.attachAsset(characterType, {
			anchorX: 0.5,
			anchorY: 1.0
		});
	};
	self.activateInvincibility = function () {
		self.isInvincible = true;
		self.invincibilityTimer = 300; // 5 seconds at 60fps
		// Flash effect
		tween(playerGraphics, {
			alpha: 0.3
		}, {
			duration: 200,
			easing: tween.easeInOut,
			onFinish: function onFinish() {
				if (self.isInvincible) {
					tween(playerGraphics, {
						alpha: 1
					}, {
						duration: 200,
						easing: tween.easeInOut,
						onFinish: function onFinish() {
							if (self.isInvincible) {
								self.activateInvincibility();
							}
						}
					});
				}
			}
		});
	};
	self.pickupWeapon = function () {
		self.hasWeapon = true;
		// Create weapon graphics attached to player
		if (self.weaponGraphics) {
			self.weaponGraphics.destroy();
		}
		self.weaponGraphics = self.attachAsset('weapon', {
			anchorX: 0.5,
			anchorY: 0.5
		});
		// Position weapon higher and straight in player's hand pointing forward
		self.weaponGraphics.x = 40;
		self.weaponGraphics.y = -200;
		self.weaponGraphics.scaleX = 3;
		self.weaponGraphics.scaleY = 3;
		self.weaponGraphics.rotation = 0; // Straight forward
	};
	self.update = function () {
		if (self.isJumping) {
			self.jumpSpeed += self.gravity;
			self.y += self.jumpSpeed;
			var landingY = self.groundY;
			if (self.y >= landingY) {
				self.y = landingY;
				self.isJumping = false;
				self.jumpSpeed = 0;
				self.jumpCount = 0;
			}
		}
		// Handle invincibility timer
		if (self.isInvincible) {
			self.invincibilityTimer--;
			if (self.invincibilityTimer <= 0) {
				self.isInvincible = false;
				tween.stop(playerGraphics);
				playerGraphics.alpha = 1;
			}
		}
	};
	return self;
});
var Weapon = Container.expand(function () {
	var self = Container.call(this);
	var weaponGraphics = self.attachAsset('weapon', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = -8;
	self.update = function () {
		self.x += self.speed;
		self.y += Math.sin(LK.ticks * 0.1) * 2; // Floating animation
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB
});
/**** 
* Game Code
****/ 
var gameState = 'ready'; // 'customization', 'ready', 'playing', 'gameOver'
var selectedCharacter = 'player';
var player;
var groundSegments = [];
var holes = [];
var enemies = [];
var obstacles = [];
var bullets = [];
var flyingEnemies = [];
var weapons = [];
var gameSpeed = 8;
var spawnTimer = 0;
var shootTimer = 0;
var distance = 0;
var groundY = 2400;
var invincibilitySpacing = 1;
var lastInvincibilityTime = 0;
var titleImage;
// UI Elements
var character1Button = LK.getAsset('player', {
	anchorX: 0.5,
	anchorY: 0.5
});
character1Button.x = 424;
character1Button.y = 1200;
character1Button.scaleX = 0.8;
character1Button.scaleY = 0.8;
character1Button.visible = true;
var character2Button = LK.getAsset('player2', {
	anchorX: 0.5,
	anchorY: 0.5
});
character2Button.x = 724;
character2Button.y = 1200;
character2Button.scaleX = 0.8;
character2Button.scaleY = 0.8;
character2Button.visible = true;
var character3Button = LK.getAsset('player3', {
	anchorX: 0.5,
	anchorY: 0.5
});
character3Button.x = 1024;
character3Button.y = 1200;
character3Button.scaleX = 0.8;
character3Button.scaleY = 0.8;
character3Button.visible = true;
var character6Button = LK.getAsset('player6', {
	anchorX: 0.5,
	anchorY: 0.5
});
character6Button.x = 1324;
character6Button.y = 1200;
character6Button.scaleX = 0.8;
character6Button.scaleY = 0.8;
character6Button.visible = true;
var character7Button = LK.getAsset('player7', {
	anchorX: 0.5,
	anchorY: 0.5
});
character7Button.x = 1624;
character7Button.y = 1200;
character7Button.scaleX = 0.8;
character7Button.scaleY = 0.8;
character7Button.visible = true;
var playButton = LK.getAsset('startButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
playButton.x = 1024;
playButton.y = 1600;
playButton.scaleX = 1.5;
playButton.scaleY = 1.5;
playButton.visible = true;
// Character selection border
var selectionBorder = LK.getAsset('jumpButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
selectionBorder.x = 724;
selectionBorder.y = 1200;
selectionBorder.scaleX = 2.5;
selectionBorder.scaleY = 2.5;
selectionBorder.alpha = 0.3;
selectionBorder.visible = true;
var distanceText = new Text2('0m', {
	size: 60,
	fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
var fireButton = LK.getAsset('fireButton', {
	anchorX: 0.5,
	anchorY: 0.5
});
fireButton.x = 150;
fireButton.y = 2200;
game.addChild(fireButton);
// Initialize player
player = new Player();
player.x = 400;
player.y = groundY;
player.groundY = groundY;
game.addChild(player);
// Initialize ground segments
for (var i = 0; i < 15; i++) {
	var ground = new GroundSegment();
	ground.x = i * 200;
	ground.y = groundY;
	groundSegments.push(ground);
	game.addChild(ground);
}
function initializeGame() {
	gameState = 'playing';
	distance = 0;
	gameSpeed = 8;
	spawnTimer = 0;
	// Hide character selection and play button
	character1Button.visible = false;
	character2Button.visible = false;
	character3Button.visible = false;
	character6Button.visible = false;
	character7Button.visible = false;
	selectionBorder.visible = false;
	playButton.visible = false;
	titleImage.visible = false;
	// Clear existing obstacles
	clearAllObstacles();
	// Reset player position
	player.x = 400;
	player.y = groundY;
	player.isJumping = false;
	player.jumpSpeed = 0;
	player.jumpCount = 0;
	player.isInvincible = false;
	player.invincibilityTimer = 0;
	// Give player weapon at start
	player.pickupWeapon();
	invincibilitySpacing = 1;
	lastInvincibilityTime = 0;
	// Reset ground segments
	for (var i = 0; i < groundSegments.length; i++) {
		groundSegments[i].x = i * 200;
		groundSegments[i].speed = -gameSpeed;
	}
}
function clearAllObstacles() {
	for (var i = holes.length - 1; i >= 0; i--) {
		holes[i].destroy();
		holes.splice(i, 1);
	}
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].destroy();
		enemies.splice(i, 1);
	}
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].destroy();
		obstacles.splice(i, 1);
	}
	for (var i = bullets.length - 1; i >= 0; i--) {
		bullets[i].destroy();
		bullets.splice(i, 1);
	}
	for (var i = flyingEnemies.length - 1; i >= 0; i--) {
		flyingEnemies[i].destroy();
		flyingEnemies.splice(i, 1);
	}
}
function spawnObstacle() {
	var rand = Math.random();
	var spawnX = 2200;
	var minDistance = 400; // Minimum distance between obstacles
	var canSpawn = true;
	// Check if there's enough distance from existing obstacles
	var allObstacles = obstacles.concat(enemies).concat(holes).concat(flyingEnemies);
	for (var i = 0; i < allObstacles.length; i++) {
		var existingObstacle = allObstacles[i];
		if (Math.abs(existingObstacle.x - spawnX) < minDistance) {
			canSpawn = false;
			break;
		}
	}
	if (!canSpawn) {
		return; // Don't spawn if too close to existing obstacles
	}
	if (rand < 0.15) {
		// Spawn hole
		var hole = new Hole();
		hole.x = spawnX;
		hole.y = groundY;
		hole.speed = -gameSpeed;
		holes.push(hole);
		game.addChild(hole);
	} else if (rand < 0.25) {
		// Spawn enemy
		var enemy = new Enemy();
		enemy.x = spawnX;
		enemy.y = groundY;
		enemy.speed = -gameSpeed;
		enemies.push(enemy);
		game.addChild(enemy);
	} else if (rand < 0.35) {
		// Spawn obstacle
		var obstacle = new Obstacle();
		obstacle.x = spawnX;
		obstacle.y = groundY;
		obstacle.speed = -gameSpeed;
		obstacles.push(obstacle);
		game.addChild(obstacle);
	} else if (rand < 0.45) {
		// Spawn flying enemy
		var flyingEnemy = new FlyingEnemy();
		flyingEnemy.x = spawnX;
		flyingEnemy.y = groundY - 350 - Math.random() * 200;
		flyingEnemy.speed = -gameSpeed;
		flyingEnemies.push(flyingEnemy);
		game.addChild(flyingEnemy);
	}
}
function checkCollisions() {
	// Check bullet vs enemy collisions
	for (var i = bullets.length - 1; i >= 0; i--) {
		var bullet = bullets[i];
		var bulletHit = false;
		// Check bullet vs ground enemies
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (bullet.intersects(enemy)) {
				// Remove bullet and enemy
				bullet.destroy();
				bullets.splice(i, 1);
				enemy.destroy();
				enemies.splice(j, 1);
				bulletHit = true;
				break;
			}
		}
		// Check bullet vs flying enemies
		if (!bulletHit) {
			for (var j = flyingEnemies.length - 1; j >= 0; j--) {
				var flyingEnemy = flyingEnemies[j];
				if (bullet.intersects(flyingEnemy)) {
					// Remove bullet and flying enemy
					bullet.destroy();
					bullets.splice(i, 1);
					flyingEnemy.destroy();
					flyingEnemies.splice(j, 1);
					break;
				}
			}
		}
	}
	// Skip damage collisions if invincible
	if (!player.isInvincible) {
		// Check hole collisions - reduced collision area for closer detection
		for (var i = 0; i < holes.length; i++) {
			var hole = holes[i];
			// Player needs to be much closer to hole center to fall
			var holeCenterX = hole.x + 200; // Hole center
			var playerCenterX = player.x;
			var collisionDistance = 60; // Much smaller collision area
			if (Math.abs(playerCenterX - holeCenterX) < collisionDistance && !player.isJumping) {
				gameOver();
				return;
			}
		}
		// Check enemy collisions - reduced hitbox for closer collision
		for (var i = 0; i < enemies.length; i++) {
			var enemy = enemies[i];
			// Check if player is much closer to enemy center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var enemyCenterX = enemy.x;
			var enemyCenterY = enemy.y - 200; // Adjust for enemy height
			// Reduce collision area - player needs to be much closer
			var collisionDistanceX = 80; // Much smaller than asset width
			var collisionDistanceY = 100; // Much smaller than asset height
			if (Math.abs(playerCenterX - enemyCenterX) < collisionDistanceX && Math.abs(playerCenterY - enemyCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
		// Check flying enemy collisions - reduced hitbox for closer collision
		for (var i = 0; i < flyingEnemies.length; i++) {
			var flyingEnemy = flyingEnemies[i];
			// Check if player is much closer to flying enemy center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var flyingEnemyCenterX = flyingEnemy.x;
			var flyingEnemyCenterY = flyingEnemy.y;
			// Reduce collision area - player needs to be much closer
			var collisionDistanceX = 70; // Much smaller than asset width
			var collisionDistanceY = 90; // Much smaller than asset height
			if (Math.abs(playerCenterX - flyingEnemyCenterX) < collisionDistanceX && Math.abs(playerCenterY - flyingEnemyCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
		// Check obstacle collisions - expanded hitbox for easier collision
		for (var i = 0; i < obstacles.length; i++) {
			var obstacle = obstacles[i];
			// Check if player is closer to obstacle center
			var playerCenterX = player.x;
			var playerCenterY = player.y - 200; // Adjust for player height
			var obstacleCenterX = obstacle.x;
			var obstacleCenterY = obstacle.y - 150; // Adjust for obstacle height
			// Expand collision area - player doesn't need to be as close
			var collisionDistanceX = 120; // Larger collision area than before
			var collisionDistanceY = 160; // Larger collision area than before
			if (Math.abs(playerCenterX - obstacleCenterX) < collisionDistanceX && Math.abs(playerCenterY - obstacleCenterY) < collisionDistanceY) {
				gameOver();
				return;
			}
		}
	}
}
function gameOver() {
	gameState = 'gameOver';
	LK.getSound('hit').play();
	LK.getSound('muerte').play();
	LK.showGameOver();
}
function updateSpeed() {
	gameSpeed = 8; // Keep speed constant at 8
	for (var i = 0; i < groundSegments.length; i++) {
		groundSegments[i].speed = -gameSpeed;
	}
	for (var i = 0; i < holes.length; i++) {
		holes[i].speed = -gameSpeed;
	}
	for (var i = 0; i < enemies.length; i++) {
		enemies[i].speed = -gameSpeed;
	}
	for (var i = 0; i < obstacles.length; i++) {
		obstacles[i].speed = -gameSpeed;
	}
	for (var i = 0; i < flyingEnemies.length; i++) {
		flyingEnemies[i].speed = -gameSpeed;
	}
	// Update bullet speeds to match current game speed
	for (var i = 0; i < bullets.length; i++) {
		bullets[i].speed = 15 + gameSpeed; // Base speed + current game speed
	}
}
game.down = function (x, y, obj) {
	if (gameState === 'ready') {
		// Check character selection clicks
		if (x > 344 && x < 504 && y > 1120 && y < 1280) {
			// Character 1 selected
			selectedCharacter = 'player';
			selectionBorder.x = 424;
			player.setCharacter('player');
			return;
		} else if (x > 644 && x < 804 && y > 1120 && y < 1280) {
			// Character 2 selected
			selectedCharacter = 'player2';
			selectionBorder.x = 724;
			player.setCharacter('player2');
			return;
		} else if (x > 944 && x < 1104 && y > 1120 && y < 1280) {
			// Character 3 selected
			selectedCharacter = 'player3';
			selectionBorder.x = 1024;
			player.setCharacter('player3');
			return;
		} else if (x > 1244 && x < 1404 && y > 1120 && y < 1280) {
			// Character 6 selected
			selectedCharacter = 'player6';
			selectionBorder.x = 1324;
			player.setCharacter('player6');
			return;
		} else if (x > 1544 && x < 1704 && y > 1120 && y < 1280) {
			// Character 7 selected
			selectedCharacter = 'player7';
			selectionBorder.x = 1624;
			selectionBorder.y = 1200;
			player.setCharacter('player7');
			return;
		}
		// Check play button click
		if (x > 774 && x < 1274 && y > 1350 && y < 1850) {
			LK.playMusic('musica');
			initializeGame();
			return;
		}
	} else if (gameState === 'playing') {
		// Check fire button click (bottom left corner)
		if (x > 90 && x < 210 && y > 2140 && y < 2260) {
			// Fire button pressed - shoot bullet
			if (shootTimer <= 0) {
				var bullet = new Bullet();
				bullet.x = player.x;
				bullet.y = player.y - 300; // Spawn from top of player
				// Player always has weapon so bullets are always enhanced
				bullet.speed = 20;
				bullet.scaleX = 1.2;
				bullet.scaleY = 1.2;
				bullets.push(bullet);
				game.addChild(bullet);
				LK.getSound('shoot').play();
				shootTimer = 5; // Fast shooting since player always has weapon
			}
		} else {
			// Regular screen tap - jump
			player.jump();
		}
	}
};
game.update = function () {
	if (gameState === 'playing') {
		distance += gameSpeed / 10;
		distanceText.setText(Math.floor(distance) + 'm');
		// Speed remains constant throughout the game
		// Spawn obstacles
		spawnTimer++;
		var spawnRate = (120 - Math.min(distance / 15, 50)) * invincibilitySpacing;
		if (spawnTimer >= spawnRate) {
			spawnObstacle();
			spawnTimer = 0;
		}
		// Reset invincibility spacing after effect wears off
		if (distance - lastInvincibilityTime > 300 && invincibilitySpacing > 1) {
			invincibilitySpacing = 1;
		}
		// Update ground segments - make continuous
		for (var i = 0; i < groundSegments.length; i++) {
			var ground = groundSegments[i];
			if (ground.x < -200) {
				// Find the rightmost ground segment
				var maxX = -1000;
				for (var j = 0; j < groundSegments.length; j++) {
					if (groundSegments[j].x > maxX) {
						maxX = groundSegments[j].x;
					}
				}
				ground.x = maxX + 200;
			}
		}
		// Update and clean up holes
		for (var i = holes.length - 1; i >= 0; i--) {
			var hole = holes[i];
			if (hole.x < -200) {
				hole.destroy();
				holes.splice(i, 1);
			}
		}
		// Update and clean up enemies
		for (var i = enemies.length - 1; i >= 0; i--) {
			var enemy = enemies[i];
			if (enemy.x < -100) {
				enemy.destroy();
				enemies.splice(i, 1);
			}
		}
		// Update and clean up obstacles
		for (var i = obstacles.length - 1; i >= 0; i--) {
			var obstacle = obstacles[i];
			if (obstacle.x < -100) {
				obstacle.destroy();
				obstacles.splice(i, 1);
			}
		}
		// Update and clean up bullets
		for (var i = bullets.length - 1; i >= 0; i--) {
			var bullet = bullets[i];
			if (bullet.x > 2200) {
				bullet.destroy();
				bullets.splice(i, 1);
			}
		}
		// Update and clean up flying enemies
		for (var i = flyingEnemies.length - 1; i >= 0; i--) {
			var flyingEnemy = flyingEnemies[i];
			if (flyingEnemy.x < -100) {
				flyingEnemy.destroy();
				flyingEnemies.splice(i, 1);
			}
		}
		// Update shoot timer
		if (shootTimer > 0) {
			shootTimer--;
		}
		// Check collisions
		checkCollisions();
		// Update score
		LK.setScore(Math.floor(distance));
		// Check win condition
		if (LK.getScore() >= 5000) {
			gameState = 'won';
			LK.getSound('victoria').play();
			LK.showYouWin();
			return;
		}
	}
};
// Add title image at the top of the screen
var titleImage = LK.getAsset('titulo', {
	anchorX: 0.5,
	anchorY: 0.5
});
titleImage.x = 1024; // Center horizontally
titleImage.y = 500; // Position lower on screen
titleImage.scaleX = 5; // Scale up for visibility
titleImage.scaleY = 5; // Scale up for visibility
game.addChild(titleImage);
// Show character selection and play button initially
game.addChild(character1Button);
game.addChild(character2Button);
game.addChild(character3Button);
game.addChild(character6Button);
game.addChild(character7Button);
game.addChild(selectionBorder);
game.addChild(playButton);
;
:quality(85)/https://cdn.frvr.ai/6866ebb023d7fcce5d08af47.png%3F3) 
 un agujero hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6866effd23d7fcce5d08af73.png%3F3) 
 un mounstro grande hecho con pixeles con perspectiva de lado y mas aterrador In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6867473af3049fb5566a2072.png%3F3) 
 un suelo de pasto y tierra hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6867490ef3049fb5566a20b5.png%3F3) 
 una pincho grande hecho con pixeles In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68681800e821ce1faf106ae8.png%3F3) 
 una bala de pistola 9 milimetros hecha con pixeles con perspectiva lateral. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6868190ce6459d6ad2b0db90.png%3F3) 
 un mounstro con alas hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68681a76e821ce1faf106b8f.png%3F3) 
 un puño agarrando un arma hecho con pixeles y de perspectiva lateral. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/68681d65e821ce1faf106bbb.png%3F3) 
 un boton rojo que en medio dice shot hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/6868237ce821ce1faf106c50.png%3F3) 
 un boton cuadrado hecho con pixeles que dice play. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/686d6c3dcaec283a2ab11e08.png%3F3) 
 un hombre obrero hecho con pixeles de cuerpo completo sosteniendo un arma
:quality(85)/https://cdn.frvr.ai/686d6c96caec283a2ab11e11.png%3F3) 
 un policia de cuerpo completo hecho con pixeles con persepectiva lateral apuntando con un arma I
:quality(85)/https://cdn.frvr.ai/686e120c7922780728de3f41.png%3F3) 
 un hombre de traje hecho con pixeles de cuerpo completo apuntando con un rifle de asalto m4
:quality(85)/https://cdn.frvr.ai/686e13407922780728de3f51.png%3F3) 
 goku de dragon ball hecho con pixeles de cuepo completo con perspectiva lateral apuntando don un rifle de asalto m4 In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/686e14c97922780728de3f7b.png%3F3) 
 homero simpson hecho con pixeles de cuerpo completo con perspectiva lateral apuntando con rifle de asalto m4 I
:quality(85)/https://cdn.frvr.ai/686e19747922780728de3fb0.png%3F3) 
 letras hechas con pixeles que dicen shot and jump las letras shot tendran un estilo medieval y tendran un color gris,las letras and color blanco con contorno negro y las letras jump de color amarillo con contorno naranja