/**** 
* 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);
;
 un agujero hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
 un mounstro grande hecho con pixeles con perspectiva de lado y mas aterrador In-Game asset. 2d. High contrast. No shadows
 un suelo de pasto y tierra hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
 una pincho grande hecho con pixeles In-Game asset. 2d. High contrast. No shadows
 una bala de pistola 9 milimetros hecha con pixeles con perspectiva lateral. In-Game asset. 2d. High contrast. No shadows
 un mounstro con alas hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
 un puño agarrando un arma hecho con pixeles y de perspectiva lateral. In-Game asset. 2d. High contrast. No shadows
 un boton rojo que en medio dice shot hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
 un boton cuadrado hecho con pixeles que dice play. In-Game asset. 2d. High contrast. No shadows
 un hombre obrero hecho con pixeles de cuerpo completo sosteniendo un arma
 un policia de cuerpo completo hecho con pixeles con persepectiva lateral apuntando con un arma I
 un hombre de traje hecho con pixeles de cuerpo completo apuntando con un rifle de asalto m4
 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
 homero simpson hecho con pixeles de cuerpo completo con perspectiva lateral apuntando con rifle de asalto m4 I
 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