/**** 
* Classes
****/
var CooldownButton = Container.expand(function () {
	var self = Container.call(this);
	self.attachAsset('button', {
		anchorX: 0.0,
		// Bottom left anchor x-coordinate
		anchorY: 1.0 // Bottom left anchor y-coordinate
	});
	self.x = 0; // Position x-coordinate at bottom left
	self.y = 2732; // Position y-coordinate at bottom left
	self.on('down', function () {
		if (LK.getScore() >= 100) {
			var newScore = LK.getScore() - 100;
			if (newScore >= 0) {
				LK.setScore(newScore);
				hero.shootCooldown = Math.max(0, hero.shootCooldown - 15); // Reduce cooldown by 0.25 seconds (15 frames at 60FPS)
			}
		}
	});
});
// Add CooldownButton to the game
var Button = Container.expand(function () {
	var self = Container.call(this);
	self.attachAsset('button', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.on('down', function () {
		LK.setScore(LK.getScore() - 100);
		hero.shootCooldown = Math.max(0, hero.shootCooldown - 15); // 0.25 seconds at 60FPS
	});
});
var Hero = Container.expand(function () {
	var self = Container.call(this);
	self.update = function () {
		if (self.shootTimer > 0) {
			self.shootTimer--;
		}
	};
	self.destroyMonsters = function () {
		monsters.forEach(function (monster) {
			monster.destroy();
		});
		monsters.length = 0;
		LK.setScore(LK.getScore() + monsters.length);
	};
	var heroGraphics = self.attachAsset('hero', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.move = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		self.x += Math.cos(angle) * self.speed;
		self.y += Math.sin(angle) * self.speed;
	};
	self.shootCooldown = 120; // 2 seconds at 60FPS
	self.shootTimer = 0;
	self.shoot = function () {
		if (self.shootTimer <= 0) {
			var bullet = new Bullet();
			bullet.x = self.x;
			bullet.y = self.y;
			game.addChild(bullet);
			self.shootTimer = self.shootCooldown;
			return bullet;
		}
		return null;
	};
});
var StrongerMonster = Container.expand(function () {
	var self = Container.call(this);
	var monsterGraphics = self.attachAsset('strongMonster', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 5;
	self.speed = 2;
	self.hit = false;
	self.hitTimer = 0;
	self.update = function () {
		if (self.hit) {
			self.hitTimer--;
			if (self.hitTimer <= 0) {
				self.hit = false;
			}
		}
	};
	self.moveTowards = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		var newX = self.x + Math.cos(angle) * self.speed;
		var newY = self.y + Math.sin(angle) * self.speed;
		if (!self.hit) {
			self.x = newX;
			self.y = newY;
		}
	};
});
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 10;
	self.move = function () {
		self.y -= self.speed;
	};
});
var Door = Container.expand(function () {
	var self = Container.call(this);
	var doorGraphics = self.attachAsset('door', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.x = 2048 / 2;
	self.y = 128;
});
var WeakerMonster = Container.expand(function () {
	var self = Container.call(this);
	self.animationFrames = ['monster_walk1', 'monster_walk2', 'monster_walk3', 'monster_walk4'];
	self.currentFrameIndex = 0;
	self.frameCounter = 0;
	self.frameChangeRate = 15; // Change frame every 15 ticks (1/4 second at 60FPS)
	self.monsterGraphics = self.attachAsset(self.animationFrames[self.currentFrameIndex], {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 2;
	self.speed = 2;
	self.hit = false;
	self.hitTimer = 0;
	self.update = function () {
		if (self.hit) {
			self.hitTimer--;
			if (self.hitTimer <= 0) {
				self.hit = false;
			}
		}
		// Handle walking animation
		self.frameCounter++;
		if (self.frameCounter >= self.frameChangeRate) {
			self.currentFrameIndex = (self.currentFrameIndex + 1) % self.animationFrames.length;
			self.monsterGraphics.texture = LK.getAsset(self.animationFrames[self.currentFrameIndex], {}).texture;
			self.frameCounter = 0;
		}
	};
	self.moveTowards = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		var newX = self.x + Math.cos(angle) * self.speed;
		var newY = self.y + Math.sin(angle) * self.speed;
		if (!self.hit) {
			self.x = newX;
			self.y = newY;
		}
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game();
/**** 
* Game Code
****/
// Add CooldownButton to the game
game.on('move', function (obj) {
	var event = obj.event;
	var pos = event.getLocalPosition(game);
	hero.move(pos.x, pos.y);
});
var cooldownButton = game.addChild(new CooldownButton());
var button = game.addChild(new Button());
button.x = 100;
button.y = 2732 - 100;
// Score bar at the top
var scoreBar = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	anchorX: 0.5,
	anchorY: 0
});
LK.gui.top.addChild(scoreBar);
var background = game.attachAsset('stoneBrickFloor', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
});
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
// Add keyboard event listeners for arrow key movement and space for destroying monsters
LK.on('keydown', function (obj) {
	var event = obj.event;
	switch (event.key) {
		case 'ArrowLeft':
			hero.move('left');
			break;
		case 'ArrowRight':
			hero.move('right');
			break;
		case 'ArrowUp':
			hero.move('up');
			break;
		case 'ArrowDown':
			hero.move('down');
			break;
		case ' ':
			// Space key
			hero.destroyMonsters();
			break;
	}
});
var door = game.addChild(new Door());
var monsters = [];
var bullets = [];
game.on('up', function (obj) {
	bullets.push(hero.shoot());
});
LK.on('tick', function () {
	// Increment score every second
	if (LK.ticks % 60 === 0) {
		LK.setScore(LK.getScore() + 1);
		scoreBar.setText(LK.getScore().toString());
	}
	hero.update();
	var spawnRate = LK.getScore() >= 80 ? 300 : LK.getScore() >= 50 ? 360 : 420;
	var spawnWeakCounter = 0;
	var spawnStrong = false;
	var strongMonsterExists = false;
	var spawnDelayTimer = 0;
	var spawnDelayDuration = 300; // 5 seconds at 60FPS
	if (strongMonsterExists) {
		var strongMonster = monsters.find(function (monster) {
			return monster instanceof StrongerMonster;
		});
		if (!strongMonster) {
			strongMonsterExists = false;
			spawnDelayTimer = spawnDelayDuration;
		}
	}
	if (spawnDelayTimer > 0) {
		spawnDelayTimer--;
	} else if (spawnWeakCounter < 4 && LK.ticks % spawnRate === 0) {
		var monster = new WeakerMonster();
		monster.x = door.x;
		monster.y = door.y;
		monsters.push(monster);
		game.addChild(monster);
		spawnWeakCounter++;
	} else if (spawnWeakCounter >= 4 && !strongMonsterExists && spawnDelayTimer === 0) {
		var strongMonster = new StrongerMonster();
		strongMonster.x = door.x;
		strongMonster.y = door.y;
		monsters.push(strongMonster);
		game.addChild(strongMonster);
		strongMonsterExists = true;
		spawnWeakCounter = 0;
	}
	monsters.forEach(function (monster, index) {
		monster.update();
		monster.moveTowards(hero.x, hero.y);
		if (monster.intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
		if (monster instanceof StrongerMonster && monster.health <= 0) {
			strongMonsterExists = false;
		}
	});
	bullets.forEach(function (bullet, index) {
		if (bullet) {
			bullet.move();
		}
		if (bullet && bullet.y < 0) {
			bullet.destroy();
			bullets.splice(index, 1);
		} else {
			monsters.forEach(function (monster, mIndex) {
				if (bullet && bullet.intersects(monster)) {
					monster.health -= 1;
					monster.hit = true;
					monster.hitTimer = 30; // 0.5 seconds at 60FPS
					if (monster.health <= 0) {
						monster.destroy();
						monsters.splice(mIndex, 1);
						LK.setScore(LK.getScore() + 1);
					}
					bullet.destroy();
					bullets.splice(index, 1);
				}
			});
		}
	});
}); /**** 
* Classes
****/
var CooldownButton = Container.expand(function () {
	var self = Container.call(this);
	self.attachAsset('button', {
		anchorX: 0.0,
		// Bottom left anchor x-coordinate
		anchorY: 1.0 // Bottom left anchor y-coordinate
	});
	self.x = 0; // Position x-coordinate at bottom left
	self.y = 2732; // Position y-coordinate at bottom left
	self.on('down', function () {
		if (LK.getScore() >= 100) {
			var newScore = LK.getScore() - 100;
			if (newScore >= 0) {
				LK.setScore(newScore);
				hero.shootCooldown = Math.max(0, hero.shootCooldown - 15); // Reduce cooldown by 0.25 seconds (15 frames at 60FPS)
			}
		}
	});
});
// Add CooldownButton to the game
var Button = Container.expand(function () {
	var self = Container.call(this);
	self.attachAsset('button', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.on('down', function () {
		LK.setScore(LK.getScore() - 100);
		hero.shootCooldown = Math.max(0, hero.shootCooldown - 15); // 0.25 seconds at 60FPS
	});
});
var Hero = Container.expand(function () {
	var self = Container.call(this);
	self.update = function () {
		if (self.shootTimer > 0) {
			self.shootTimer--;
		}
	};
	self.destroyMonsters = function () {
		monsters.forEach(function (monster) {
			monster.destroy();
		});
		monsters.length = 0;
		LK.setScore(LK.getScore() + monsters.length);
	};
	var heroGraphics = self.attachAsset('hero', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 5;
	self.move = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		self.x += Math.cos(angle) * self.speed;
		self.y += Math.sin(angle) * self.speed;
	};
	self.shootCooldown = 120; // 2 seconds at 60FPS
	self.shootTimer = 0;
	self.shoot = function () {
		if (self.shootTimer <= 0) {
			var bullet = new Bullet();
			bullet.x = self.x;
			bullet.y = self.y;
			game.addChild(bullet);
			self.shootTimer = self.shootCooldown;
			return bullet;
		}
		return null;
	};
});
var StrongerMonster = Container.expand(function () {
	var self = Container.call(this);
	var monsterGraphics = self.attachAsset('strongMonster', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 5;
	self.speed = 2;
	self.hit = false;
	self.hitTimer = 0;
	self.update = function () {
		if (self.hit) {
			self.hitTimer--;
			if (self.hitTimer <= 0) {
				self.hit = false;
			}
		}
	};
	self.moveTowards = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		var newX = self.x + Math.cos(angle) * self.speed;
		var newY = self.y + Math.sin(angle) * self.speed;
		if (!self.hit) {
			self.x = newX;
			self.y = newY;
		}
	};
});
var Bullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.attachAsset('bullet', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.speed = 10;
	self.move = function () {
		self.y -= self.speed;
	};
});
var Door = Container.expand(function () {
	var self = Container.call(this);
	var doorGraphics = self.attachAsset('door', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.x = 2048 / 2;
	self.y = 128;
});
var WeakerMonster = Container.expand(function () {
	var self = Container.call(this);
	self.animationFrames = ['monster_walk1', 'monster_walk2', 'monster_walk3', 'monster_walk4'];
	self.currentFrameIndex = 0;
	self.frameCounter = 0;
	self.frameChangeRate = 15; // Change frame every 15 ticks (1/4 second at 60FPS)
	self.monsterGraphics = self.attachAsset(self.animationFrames[self.currentFrameIndex], {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.health = 2;
	self.speed = 2;
	self.hit = false;
	self.hitTimer = 0;
	self.update = function () {
		if (self.hit) {
			self.hitTimer--;
			if (self.hitTimer <= 0) {
				self.hit = false;
			}
		}
		// Handle walking animation
		self.frameCounter++;
		if (self.frameCounter >= self.frameChangeRate) {
			self.currentFrameIndex = (self.currentFrameIndex + 1) % self.animationFrames.length;
			self.monsterGraphics.texture = LK.getAsset(self.animationFrames[self.currentFrameIndex], {}).texture;
			self.frameCounter = 0;
		}
	};
	self.moveTowards = function (targetX, targetY) {
		var dx = targetX - self.x;
		var dy = targetY - self.y;
		var angle = Math.atan2(dy, dx);
		var newX = self.x + Math.cos(angle) * self.speed;
		var newY = self.y + Math.sin(angle) * self.speed;
		if (!self.hit) {
			self.x = newX;
			self.y = newY;
		}
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game();
/**** 
* Game Code
****/
// Add CooldownButton to the game
game.on('move', function (obj) {
	var event = obj.event;
	var pos = event.getLocalPosition(game);
	hero.move(pos.x, pos.y);
});
var cooldownButton = game.addChild(new CooldownButton());
var button = game.addChild(new Button());
button.x = 100;
button.y = 2732 - 100;
// Score bar at the top
var scoreBar = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	anchorX: 0.5,
	anchorY: 0
});
LK.gui.top.addChild(scoreBar);
var background = game.attachAsset('stoneBrickFloor', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: 2048 / 2,
	y: 2732 / 2
});
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
// Add keyboard event listeners for arrow key movement and space for destroying monsters
LK.on('keydown', function (obj) {
	var event = obj.event;
	switch (event.key) {
		case 'ArrowLeft':
			hero.move('left');
			break;
		case 'ArrowRight':
			hero.move('right');
			break;
		case 'ArrowUp':
			hero.move('up');
			break;
		case 'ArrowDown':
			hero.move('down');
			break;
		case ' ':
			// Space key
			hero.destroyMonsters();
			break;
	}
});
var door = game.addChild(new Door());
var monsters = [];
var bullets = [];
game.on('up', function (obj) {
	bullets.push(hero.shoot());
});
LK.on('tick', function () {
	// Increment score every second
	if (LK.ticks % 60 === 0) {
		LK.setScore(LK.getScore() + 1);
		scoreBar.setText(LK.getScore().toString());
	}
	hero.update();
	var spawnRate = LK.getScore() >= 80 ? 300 : LK.getScore() >= 50 ? 360 : 420;
	var spawnWeakCounter = 0;
	var spawnStrong = false;
	var strongMonsterExists = false;
	var spawnDelayTimer = 0;
	var spawnDelayDuration = 300; // 5 seconds at 60FPS
	if (strongMonsterExists) {
		var strongMonster = monsters.find(function (monster) {
			return monster instanceof StrongerMonster;
		});
		if (!strongMonster) {
			strongMonsterExists = false;
			spawnDelayTimer = spawnDelayDuration;
		}
	}
	if (spawnDelayTimer > 0) {
		spawnDelayTimer--;
	} else if (spawnWeakCounter < 4 && LK.ticks % spawnRate === 0) {
		var monster = new WeakerMonster();
		monster.x = door.x;
		monster.y = door.y;
		monsters.push(monster);
		game.addChild(monster);
		spawnWeakCounter++;
	} else if (spawnWeakCounter >= 4 && !strongMonsterExists && spawnDelayTimer === 0) {
		var strongMonster = new StrongerMonster();
		strongMonster.x = door.x;
		strongMonster.y = door.y;
		monsters.push(strongMonster);
		game.addChild(strongMonster);
		strongMonsterExists = true;
		spawnWeakCounter = 0;
	}
	monsters.forEach(function (monster, index) {
		monster.update();
		monster.moveTowards(hero.x, hero.y);
		if (monster.intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
		if (monster instanceof StrongerMonster && monster.health <= 0) {
			strongMonsterExists = false;
		}
	});
	bullets.forEach(function (bullet, index) {
		if (bullet) {
			bullet.move();
		}
		if (bullet && bullet.y < 0) {
			bullet.destroy();
			bullets.splice(index, 1);
		} else {
			monsters.forEach(function (monster, mIndex) {
				if (bullet && bullet.intersects(monster)) {
					monster.health -= 1;
					monster.hit = true;
					monster.hitTimer = 30; // 0.5 seconds at 60FPS
					if (monster.health <= 0) {
						monster.destroy();
						monsters.splice(mIndex, 1);
						LK.setScore(LK.getScore() + 1);
					}
					bullet.destroy();
					bullets.splice(index, 1);
				}
			});
		}
	});
});
:quality(85)/https://cdn.frvr.ai/65c3a996c10ed5ddaec9a45d.png%3F3) 
 wooden door thats round at the top 8 bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/65c3ab10c10ed5ddaec9a473.png%3F3) 
 wisard 8 bit from the top down. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/65c3ab78c10ed5ddaec9a47d.png%3F3) 
 tentacle monster 8 bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/65c4e49ffc3df84f65ed6192.png%3F3) 
 8 bit tentacle monster. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
:quality(85)/https://cdn.frvr.ai/65c4f8d2fc3df84f65ed61e9.png%3F3) 
 8 bit stone brick dungeon floor with a tiny amount of moss with tinny little bricks and very low contrast make it darker to. Single Game Texture. In-Game asset. 2d. Blank background.. No shadows.
:quality(85)/https://cdn.frvr.ai/65c4fa9cfc3df84f65ed61f7.png%3F3) 
 8 bit fireball with a flame trail that goes down. Single Game Texture. In-Game asset. 2d. Blank background.. No shadows.
:quality(85)/https://cdn.frvr.ai/65c4fe1afc3df84f65ed622e.png%3F3) 
 just move the tentacles a tinny litle bit
:quality(85)/https://cdn.frvr.ai/65c5286cfc3df84f65ed6242.png%3F3) 
 make the monster move
:quality(85)/https://cdn.frvr.ai/65ce33c901cc0d9e6d0a2ef3.png%3F3) 
 green button 8 bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.