/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 100;
	self.maxHealth = 100;
	self.shootCooldown = 0;
	self.shootDelay = 90; // 1.5 seconds at 60fps
	self.update = function () {
		// Look towards Spider-Man
		var dx = spiderMan.x - self.x;
		var dy = spiderMan.y - self.y;
		var angle = Math.atan2(dy, dx);
		enemyGraphics.rotation = angle;
		// Shooting behavior
		self.shootCooldown--;
		if (self.shootCooldown <= 0) {
			self.shoot();
			self.shootCooldown = self.shootDelay + Math.random() * 60; // Add randomness
		}
	};
	self.shoot = function () {
		var bullet = new EnemyBullet();
		bullet.x = self.x;
		bullet.y = self.y;
		var dx = spiderMan.x - self.x;
		var dy = spiderMan.y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		bullet.velocityX = dx / distance * 6;
		bullet.velocityY = dy / distance * 6;
		enemyBullets.push(bullet);
		game.addChild(bullet);
	};
	self.takeDamage = function (damage) {
		self.health -= damage;
		LK.effects.flashObject(self, 0xffffff, 200);
		LK.getSound('enemyHit').play();
		if (self.health <= 0) {
			self.destroy();
			return true; // Enemy died
		}
		return false;
	};
	return self;
});
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.damage = 25;
	self.velocityX = 0;
	self.velocityY = 0;
	self.update = function () {
		self.x += self.velocityX;
		self.y += self.velocityY;
		// Check bounds
		if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
			self.destroy();
		}
	};
	return self;
});
var SpiderMan = Container.expand(function () {
	var self = Container.call(this);
	var spiderGraphics = self.attachAsset('spiderMan', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 200;
	self.maxHealth = 200;
	self.speed = 8;
	self.isSwinging = false;
	self.swingAnchor = null;
	self.swingRadius = 0;
	self.swingAngle = 0;
	self.velocityX = 0;
	self.velocityY = 0;
	self.webLine = null;
	self.update = function () {
		if (self.isSwinging && self.swingAnchor) {
			// Web swinging physics
			var dx = self.x - self.swingAnchor.x;
			var dy = self.y - self.swingAnchor.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > self.swingRadius) {
				// Constrain to swing radius
				var angle = Math.atan2(dy, dx);
				self.x = self.swingAnchor.x + Math.cos(angle) * self.swingRadius;
				self.y = self.swingAnchor.y + Math.sin(angle) * self.swingRadius;
				// Apply swing momentum
				self.velocityX += Math.cos(angle + Math.PI / 2) * 0.3;
				self.velocityY += 2; // Gravity
			}
			// Update web line position
			if (self.webLine) {
				self.webLine.x = (self.x + self.swingAnchor.x) / 2;
				self.webLine.y = (self.y + self.swingAnchor.y) / 2;
				var lineAngle = Math.atan2(self.swingAnchor.y - self.y, self.swingAnchor.x - self.x);
				self.webLine.rotation = lineAngle + Math.PI / 2;
				self.webLine.height = Math.sqrt(dx * dx + dy * dy);
			}
		} else {
			// Free fall physics
			self.velocityY += 0.5; // Gravity
			self.x += self.velocityX;
			self.y += self.velocityY;
			// Air resistance
			self.velocityX *= 0.98;
			self.velocityY *= 0.99;
		}
		// Keep Spider-Man on screen
		if (self.x < 40) {
			self.x = 40;
			self.velocityX = 0;
		}
		if (self.x > 2008) {
			self.x = 2008;
			self.velocityX = 0;
		}
		if (self.y > 2600) {
			self.y = 2600;
			self.velocityY = 0;
		}
		if (self.y < 40) {
			self.y = 40;
			self.velocityY = 0;
		}
	};
	self.takeDamage = function (damage) {
		self.health -= damage;
		LK.effects.flashObject(self, 0xff0000, 300);
		LK.getSound('playerHit').play();
		if (self.health <= 0) {
			LK.showGameOver();
		}
	};
	self.startSwinging = function (attachPoint) {
		self.isSwinging = true;
		self.swingAnchor = attachPoint;
		var dx = self.x - attachPoint.x;
		var dy = self.y - attachPoint.y;
		self.swingRadius = Math.sqrt(dx * dx + dy * dy);
		// Create web line
		self.webLine = game.addChild(LK.getAsset('webLine', {
			anchorX: 0.5,
			anchorY: 0
		}));
	};
	self.stopSwinging = function () {
		self.isSwinging = false;
		self.swingAnchor = null;
		if (self.webLine) {
			self.webLine.destroy();
			self.webLine = null;
		}
	};
	return self;
});
var WebProjectile = Container.expand(function () {
	var self = Container.call(this);
	var webGraphics = self.attachAsset('webProjectile', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 12;
	self.damage = 50;
	self.velocityX = 0;
	self.velocityY = 0;
	self.update = function () {
		self.x += self.velocityX;
		self.y += self.velocityY;
		// Check bounds
		if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
			self.destroy();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Game variables
var spiderMan;
var enemies = [];
var webProjectiles = [];
var enemyBullets = [];
var attachPoints = [];
var spiderButton;
var healthBar;
var waveNumber = 1;
var enemiesDefeated = 0;
var spawnTimer = 0;
// Create Spider-Man
spiderMan = game.addChild(new SpiderMan());
spiderMan.x = 1024;
spiderMan.y = 1800;
// Create attachment points for web swinging
for (var i = 0; i < 8; i++) {
	var attachPoint = game.addChild(LK.getAsset('attachPoint', {
		anchorX: 0.5,
		anchorY: 0.5
	}));
	attachPoint.x = 200 + i * 250;
	attachPoint.y = 200 + Math.random() * 300;
	attachPoints.push(attachPoint);
}
// Create Spider button
spiderButton = LK.gui.right.addChild(new Text2('SPIDER', {
	size: 60,
	fill: 0xFF0000
}));
spiderButton.anchor.set(0.5, 0.5);
spiderButton.x = -150;
// Create health display
healthBar = LK.gui.topLeft.addChild(new Text2('Health: 200', {
	size: 50,
	fill: 0xFFFFFF
}));
healthBar.x = 150;
healthBar.y = 50;
// Spawn initial enemies
function spawnEnemies(count) {
	for (var i = 0; i < count; i++) {
		var enemy = new Enemy();
		enemy.x = Math.random() * 1800 + 100;
		enemy.y = Math.random() * 400 + 300;
		enemies.push(enemy);
		game.addChild(enemy);
	}
}
spawnEnemies(3);
// Touch handlers
spiderButton.down = function (x, y, obj) {
	// Shoot web projectile
	var webShot = new WebProjectile();
	webShot.x = spiderMan.x;
	webShot.y = spiderMan.y;
	// Find nearest enemy
	var nearestEnemy = null;
	var nearestDistance = Infinity;
	for (var i = 0; i < enemies.length; i++) {
		var enemy = enemies[i];
		var dx = enemy.x - spiderMan.x;
		var dy = enemy.y - spiderMan.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < nearestDistance) {
			nearestDistance = distance;
			nearestEnemy = enemy;
		}
	}
	if (nearestEnemy) {
		var dx = nearestEnemy.x - spiderMan.x;
		var dy = nearestEnemy.y - spiderMan.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		webShot.velocityX = dx / distance * webShot.speed;
		webShot.velocityY = dy / distance * webShot.speed;
	} else {
		webShot.velocityY = -webShot.speed;
	}
	webProjectiles.push(webShot);
	game.addChild(webShot);
	LK.getSound('webShoot').play();
};
game.down = function (x, y, obj) {
	// Move Spider-Man to touched location
	spiderMan.x = x;
	spiderMan.y = y;
	// Stop any current swinging
	spiderMan.stopSwinging();
};
game.up = function (x, y, obj) {
	// No longer needed for direct movement
};
// Main game loop
game.update = function () {
	// Update health display
	healthBar.setText('Health: ' + spiderMan.health);
	// Handle web projectile collisions
	for (var i = webProjectiles.length - 1; i >= 0; i--) {
		var web = webProjectiles[i];
		var webHit = false;
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (web.intersects(enemy)) {
				if (enemy.takeDamage(web.damage)) {
					// Enemy died
					enemies.splice(j, 1);
					enemiesDefeated++;
					LK.setScore(LK.getScore() + 100);
				}
				web.destroy();
				webProjectiles.splice(i, 1);
				webHit = true;
				break;
			}
		}
	}
	// Handle enemy bullet collisions
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		if (bullet.intersects(spiderMan)) {
			spiderMan.takeDamage(bullet.damage);
			bullet.destroy();
			enemyBullets.splice(i, 1);
		}
	}
	// Remove destroyed objects from arrays
	webProjectiles = webProjectiles.filter(function (web) {
		return web.parent !== null;
	});
	enemyBullets = enemyBullets.filter(function (bullet) {
		return bullet.parent !== null;
	});
	// Spawn new wave when all enemies defeated
	if (enemies.length === 0) {
		spawnTimer++;
		if (spawnTimer > 180) {
			// 3 seconds
			waveNumber++;
			spawnEnemies(Math.min(2 + waveNumber, 6));
			spawnTimer = 0;
		}
	}
	// Win condition
	if (enemiesDefeated >= 20) {
		LK.showYouWin();
	}
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 100;
	self.maxHealth = 100;
	self.shootCooldown = 0;
	self.shootDelay = 90; // 1.5 seconds at 60fps
	self.update = function () {
		// Look towards Spider-Man
		var dx = spiderMan.x - self.x;
		var dy = spiderMan.y - self.y;
		var angle = Math.atan2(dy, dx);
		enemyGraphics.rotation = angle;
		// Shooting behavior
		self.shootCooldown--;
		if (self.shootCooldown <= 0) {
			self.shoot();
			self.shootCooldown = self.shootDelay + Math.random() * 60; // Add randomness
		}
	};
	self.shoot = function () {
		var bullet = new EnemyBullet();
		bullet.x = self.x;
		bullet.y = self.y;
		var dx = spiderMan.x - self.x;
		var dy = spiderMan.y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		bullet.velocityX = dx / distance * 6;
		bullet.velocityY = dy / distance * 6;
		enemyBullets.push(bullet);
		game.addChild(bullet);
	};
	self.takeDamage = function (damage) {
		self.health -= damage;
		LK.effects.flashObject(self, 0xffffff, 200);
		LK.getSound('enemyHit').play();
		if (self.health <= 0) {
			self.destroy();
			return true; // Enemy died
		}
		return false;
	};
	return self;
});
var EnemyBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('enemyBullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.damage = 25;
	self.velocityX = 0;
	self.velocityY = 0;
	self.update = function () {
		self.x += self.velocityX;
		self.y += self.velocityY;
		// Check bounds
		if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
			self.destroy();
		}
	};
	return self;
});
var SpiderMan = Container.expand(function () {
	var self = Container.call(this);
	var spiderGraphics = self.attachAsset('spiderMan', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 200;
	self.maxHealth = 200;
	self.speed = 8;
	self.isSwinging = false;
	self.swingAnchor = null;
	self.swingRadius = 0;
	self.swingAngle = 0;
	self.velocityX = 0;
	self.velocityY = 0;
	self.webLine = null;
	self.update = function () {
		if (self.isSwinging && self.swingAnchor) {
			// Web swinging physics
			var dx = self.x - self.swingAnchor.x;
			var dy = self.y - self.swingAnchor.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > self.swingRadius) {
				// Constrain to swing radius
				var angle = Math.atan2(dy, dx);
				self.x = self.swingAnchor.x + Math.cos(angle) * self.swingRadius;
				self.y = self.swingAnchor.y + Math.sin(angle) * self.swingRadius;
				// Apply swing momentum
				self.velocityX += Math.cos(angle + Math.PI / 2) * 0.3;
				self.velocityY += 2; // Gravity
			}
			// Update web line position
			if (self.webLine) {
				self.webLine.x = (self.x + self.swingAnchor.x) / 2;
				self.webLine.y = (self.y + self.swingAnchor.y) / 2;
				var lineAngle = Math.atan2(self.swingAnchor.y - self.y, self.swingAnchor.x - self.x);
				self.webLine.rotation = lineAngle + Math.PI / 2;
				self.webLine.height = Math.sqrt(dx * dx + dy * dy);
			}
		} else {
			// Free fall physics
			self.velocityY += 0.5; // Gravity
			self.x += self.velocityX;
			self.y += self.velocityY;
			// Air resistance
			self.velocityX *= 0.98;
			self.velocityY *= 0.99;
		}
		// Keep Spider-Man on screen
		if (self.x < 40) {
			self.x = 40;
			self.velocityX = 0;
		}
		if (self.x > 2008) {
			self.x = 2008;
			self.velocityX = 0;
		}
		if (self.y > 2600) {
			self.y = 2600;
			self.velocityY = 0;
		}
		if (self.y < 40) {
			self.y = 40;
			self.velocityY = 0;
		}
	};
	self.takeDamage = function (damage) {
		self.health -= damage;
		LK.effects.flashObject(self, 0xff0000, 300);
		LK.getSound('playerHit').play();
		if (self.health <= 0) {
			LK.showGameOver();
		}
	};
	self.startSwinging = function (attachPoint) {
		self.isSwinging = true;
		self.swingAnchor = attachPoint;
		var dx = self.x - attachPoint.x;
		var dy = self.y - attachPoint.y;
		self.swingRadius = Math.sqrt(dx * dx + dy * dy);
		// Create web line
		self.webLine = game.addChild(LK.getAsset('webLine', {
			anchorX: 0.5,
			anchorY: 0
		}));
	};
	self.stopSwinging = function () {
		self.isSwinging = false;
		self.swingAnchor = null;
		if (self.webLine) {
			self.webLine.destroy();
			self.webLine = null;
		}
	};
	return self;
});
var WebProjectile = Container.expand(function () {
	var self = Container.call(this);
	var webGraphics = self.attachAsset('webProjectile', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 12;
	self.damage = 50;
	self.velocityX = 0;
	self.velocityY = 0;
	self.update = function () {
		self.x += self.velocityX;
		self.y += self.velocityY;
		// Check bounds
		if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
			self.destroy();
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
// Game variables
var spiderMan;
var enemies = [];
var webProjectiles = [];
var enemyBullets = [];
var attachPoints = [];
var spiderButton;
var healthBar;
var waveNumber = 1;
var enemiesDefeated = 0;
var spawnTimer = 0;
// Create Spider-Man
spiderMan = game.addChild(new SpiderMan());
spiderMan.x = 1024;
spiderMan.y = 1800;
// Create attachment points for web swinging
for (var i = 0; i < 8; i++) {
	var attachPoint = game.addChild(LK.getAsset('attachPoint', {
		anchorX: 0.5,
		anchorY: 0.5
	}));
	attachPoint.x = 200 + i * 250;
	attachPoint.y = 200 + Math.random() * 300;
	attachPoints.push(attachPoint);
}
// Create Spider button
spiderButton = LK.gui.right.addChild(new Text2('SPIDER', {
	size: 60,
	fill: 0xFF0000
}));
spiderButton.anchor.set(0.5, 0.5);
spiderButton.x = -150;
// Create health display
healthBar = LK.gui.topLeft.addChild(new Text2('Health: 200', {
	size: 50,
	fill: 0xFFFFFF
}));
healthBar.x = 150;
healthBar.y = 50;
// Spawn initial enemies
function spawnEnemies(count) {
	for (var i = 0; i < count; i++) {
		var enemy = new Enemy();
		enemy.x = Math.random() * 1800 + 100;
		enemy.y = Math.random() * 400 + 300;
		enemies.push(enemy);
		game.addChild(enemy);
	}
}
spawnEnemies(3);
// Touch handlers
spiderButton.down = function (x, y, obj) {
	// Shoot web projectile
	var webShot = new WebProjectile();
	webShot.x = spiderMan.x;
	webShot.y = spiderMan.y;
	// Find nearest enemy
	var nearestEnemy = null;
	var nearestDistance = Infinity;
	for (var i = 0; i < enemies.length; i++) {
		var enemy = enemies[i];
		var dx = enemy.x - spiderMan.x;
		var dy = enemy.y - spiderMan.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < nearestDistance) {
			nearestDistance = distance;
			nearestEnemy = enemy;
		}
	}
	if (nearestEnemy) {
		var dx = nearestEnemy.x - spiderMan.x;
		var dy = nearestEnemy.y - spiderMan.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		webShot.velocityX = dx / distance * webShot.speed;
		webShot.velocityY = dy / distance * webShot.speed;
	} else {
		webShot.velocityY = -webShot.speed;
	}
	webProjectiles.push(webShot);
	game.addChild(webShot);
	LK.getSound('webShoot').play();
};
game.down = function (x, y, obj) {
	// Move Spider-Man to touched location
	spiderMan.x = x;
	spiderMan.y = y;
	// Stop any current swinging
	spiderMan.stopSwinging();
};
game.up = function (x, y, obj) {
	// No longer needed for direct movement
};
// Main game loop
game.update = function () {
	// Update health display
	healthBar.setText('Health: ' + spiderMan.health);
	// Handle web projectile collisions
	for (var i = webProjectiles.length - 1; i >= 0; i--) {
		var web = webProjectiles[i];
		var webHit = false;
		for (var j = enemies.length - 1; j >= 0; j--) {
			var enemy = enemies[j];
			if (web.intersects(enemy)) {
				if (enemy.takeDamage(web.damage)) {
					// Enemy died
					enemies.splice(j, 1);
					enemiesDefeated++;
					LK.setScore(LK.getScore() + 100);
				}
				web.destroy();
				webProjectiles.splice(i, 1);
				webHit = true;
				break;
			}
		}
	}
	// Handle enemy bullet collisions
	for (var i = enemyBullets.length - 1; i >= 0; i--) {
		var bullet = enemyBullets[i];
		if (bullet.intersects(spiderMan)) {
			spiderMan.takeDamage(bullet.damage);
			bullet.destroy();
			enemyBullets.splice(i, 1);
		}
	}
	// Remove destroyed objects from arrays
	webProjectiles = webProjectiles.filter(function (web) {
		return web.parent !== null;
	});
	enemyBullets = enemyBullets.filter(function (bullet) {
		return bullet.parent !== null;
	});
	// Spawn new wave when all enemies defeated
	if (enemies.length === 0) {
		spawnTimer++;
		if (spawnTimer > 180) {
			// 3 seconds
			waveNumber++;
			spawnEnemies(Math.min(2 + waveNumber, 6));
			spawnTimer = 0;
		}
	}
	// Win condition
	if (enemiesDefeated >= 20) {
		LK.showYouWin();
	}
};