/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Boss = Container.expand(function (bossType) { var self = Container.call(this); // Determine boss asset and health based on type var assetId = 'boss'; var health = 10; if (bossType === 50) { assetId = 'boss50'; health = 20; } else if (bossType === 75) { assetId = 'boss75'; health = 30; } else if (bossType === 100) { assetId = 'boss100'; health = 50; } var bossGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0.8; self.health = health; self.maxHealth = health; self.bossType = bossType || 25; self.isBoss = true; self.lastPlayerX = 0; self.lastPlayerY = 0; // Create health bar var healthBarWidth = bossGraphics.width * 0.8; var healthBarBackground = LK.getAsset('buttonBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: healthBarWidth / 260, scaleY: 0.3 }); healthBarBackground.y = -bossGraphics.height / 2 - 30; self.addChild(healthBarBackground); var healthBar = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, scaleX: healthBarWidth / 200, scaleY: 0.4 }); healthBar.y = -bossGraphics.height / 2 - 30; healthBar.tint = 0x00ff00; self.addChild(healthBar); self.healthBar = healthBar; self.healthBarBackground = healthBarBackground; self.update = function () { if (player) { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } self.lastPlayerX = player.x; self.lastPlayerY = player.y; } }; self.takeDamage = function (damage) { damage = damage || 1; self.health -= damage; LK.effects.flashObject(self, 0xFF4444, 200); // Update health bar var healthPercent = self.health / self.maxHealth; self.healthBar.scaleX = self.healthBarBackground.width * healthPercent / 200; if (healthPercent > 0.5) { self.healthBar.tint = 0x00ff00; } else if (healthPercent > 0.25) { self.healthBar.tint = 0xffff00; } else { self.healthBar.tint = 0xff0000; } if (self.health <= 0) { LK.effects.flashObject(self, 0xFFFFFF, 500); return true; } return false; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.velocityX = 0; self.velocityY = 0; self.lifeTime = 120; self.age = 0; self.setDirection = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.velocityX = dx / distance * self.speed; self.velocityY = dy / distance * self.speed; } }; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.age++; }; self.isExpired = function () { return self.age >= self.lifeTime || self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1.5; self.health = 1; self.maxHealth = 1; self.lastPlayerX = 0; self.lastPlayerY = 0; // Create health bar for enemy var healthBarWidth = enemyGraphics.width * 0.6; var healthBarBackground = LK.getAsset('buttonBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: healthBarWidth / 260, scaleY: 0.2 }); healthBarBackground.y = -enemyGraphics.height / 2 - 20; self.addChild(healthBarBackground); var healthBar = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, scaleX: healthBarWidth / 200, scaleY: 0.3 }); healthBar.y = -enemyGraphics.height / 2 - 20; healthBar.tint = 0x00ff00; self.addChild(healthBar); self.healthBar = healthBar; self.healthBarBackground = healthBarBackground; self.update = function () { if (player) { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } self.lastPlayerX = player.x; self.lastPlayerY = player.y; } }; self.takeDamage = function (damage) { damage = damage || 1; self.health -= damage; // Update health bar var healthPercent = self.health / self.maxHealth; self.healthBar.scaleX = self.healthBarBackground.width * healthPercent / 200; if (healthPercent > 0.5) { self.healthBar.tint = 0x00ff00; } else if (healthPercent > 0.25) { self.healthBar.tint = 0xffff00; } else { self.healthBar.tint = 0xff0000; } if (self.health <= 0) { LK.effects.flashObject(self, 0xFFFFFF, 200); return true; } return false; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); // Create all directional graphics self.playerGraphicsUp = self.attachAsset('player_up', { anchorX: 0.5, anchorY: 0.5 }); self.playerGraphicsDown = self.attachAsset('player_down', { anchorX: 0.5, anchorY: 0.5, visible: false }); self.playerGraphicsLeft = self.attachAsset('player_left', { anchorX: 0.5, anchorY: 0.5, visible: false }); self.playerGraphicsRight = self.attachAsset('player_right', { anchorX: 0.5, anchorY: 0.5, visible: false }); self.currentDirection = 'up'; self.health = 100; self.maxHealth = 100; self.speed = 4; self.ammunition = 30; self.maxAmmo = 30; self.isReloading = false; self.reloadTime = 2000; self.setDirection = function (direction) { // Hide all graphics first self.playerGraphicsUp.visible = false; self.playerGraphicsDown.visible = false; self.playerGraphicsLeft.visible = false; self.playerGraphicsRight.visible = false; // Show the correct direction switch (direction) { case 'up': self.playerGraphicsUp.visible = true; break; case 'down': self.playerGraphicsDown.visible = true; break; case 'left': self.playerGraphicsLeft.visible = true; break; case 'right': self.playerGraphicsRight.visible = true; break; } self.currentDirection = direction; }; self.takeDamage = function (damage) { if (godModeActive) return; // God mode prevents damage self.health -= damage; if (self.health <= 0) { self.health = 0; LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } else { LK.effects.flashObject(self, 0xFF0000, 300); } }; self.reload = function () { if (!self.isReloading && self.ammunition < self.maxAmmo) { self.isReloading = true; LK.getSound('reload').play(); LK.setTimeout(function () { self.ammunition = self.maxAmmo; self.isReloading = false; }, self.reloadTime); } }; self.canShoot = function () { return self.ammunition > 0 && !self.isReloading; }; self.shoot = function () { if (self.canShoot()) { self.ammunition--; if (self.ammunition === 0) { self.reload(); } return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var player; var enemies = []; var bullets = []; var enemySpawnTimer = 0; var enemySpawnRate = 180; var gameStarted = false; var lastTapTime = 0; var tapCooldown = 150; var mouseX = 2048 / 2; var mouseY = 2732 / 2; var bosses = []; var lastBossScore = 0; var bossActive = false; var currentWeapon = 'shotgun'; var weaponStats = { shotgun: { damage: 2, fireRate: 20, name: 'Shotgun', cost: 20 }, smg: { damage: 1, fireRate: 25, name: 'SMG', cost: 100 }, sniper: { damage: 5, fireRate: 60, name: 'Sniper', cost: 100 } }; var weaponOwned = { shotgun: true, smg: false, sniper: false }; var lastShotTime = 0; var isShooting = false; var shootingInterval = null; var buyConfirmationActive = false; var pendingWeapon = null; var buyConfirmationGUI = null; // UI Elements var healthText = new Text2('Health: 100', { size: 60, fill: 0xFFFFFF }); healthText.anchor.set(0, 0); LK.gui.topLeft.addChild(healthText); healthText.x = 120; healthText.y = 50; var ammoText = new Text2('Ammo: 30/30', { size: 60, fill: 0xFFFFFF }); ammoText.anchor.set(0, 0); LK.gui.topLeft.addChild(ammoText); ammoText.x = 120; ammoText.y = 120; var scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // High Score display in top right var highScore = storage.highScore || 0; var highScoreText = new Text2('High Score: ' + highScore, { size: 60, fill: 0xFFD700 }); highScoreText.anchor.set(1, 0); LK.gui.topRight.addChild(highScoreText); highScoreText.x = -20; highScoreText.y = 20; // Cheats menu variables var cheatsMenuActive = false; var cheatsMenuGUI = null; var godModeActive = false; var gameSpeedMultiplier = 1; // CHEATS button with background var cheatsButtonBackground = LK.getAsset('buttonBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); cheatsButtonBackground.y = 140; LK.gui.top.addChild(cheatsButtonBackground); var cheatsButton = new Text2('CHEATS', { size: 50, fill: 0xFF00FF }); cheatsButton.anchor.set(0.5, 0); LK.gui.top.addChild(cheatsButton); cheatsButton.y = 100; // Add game background var gameBackground = LK.getAsset('gameBackground', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(gameBackground); // Initialize player player = game.addChild(new Player()); player.x = 2048 / 2; player.y = 2732 / 2; // Movement controls var movementKeys = { up: false, down: false, left: false, right: false }; // Create virtual joystick areas for mobile var moveUpArea = LK.getAsset('player_up', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3, scaleX: 2, scaleY: 1 }); moveUpArea.x = 200; moveUpArea.y = 2400; game.addChild(moveUpArea); var moveDownArea = LK.getAsset('player_up', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3, scaleX: 2, scaleY: 1 }); moveDownArea.x = 200; moveDownArea.y = 2600; game.addChild(moveDownArea); var moveLeftArea = LK.getAsset('player_up', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3, scaleX: 1, scaleY: 2 }); moveLeftArea.x = 100; moveLeftArea.y = 2500; game.addChild(moveLeftArea); var moveRightArea = LK.getAsset('player_up', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3, scaleX: 1, scaleY: 2 }); moveRightArea.x = 300; moveRightArea.y = 2500; game.addChild(moveRightArea); // Movement control handlers moveUpArea.down = function () { movementKeys.up = true; }; moveUpArea.up = function () { movementKeys.up = false; }; moveDownArea.down = function () { movementKeys.down = true; }; moveDownArea.up = function () { movementKeys.down = false; }; moveLeftArea.down = function () { movementKeys.left = true; }; moveLeftArea.up = function () { movementKeys.left = false; }; moveRightArea.down = function () { movementKeys.right = true; }; moveRightArea.up = function () { movementKeys.right = false; }; // Add weapon area background var weaponAreaBackground = LK.getAsset('buyBackground', { anchorX: 0.5, anchorY: 0.5, x: 1900, y: 1350, scaleX: 0.8, scaleY: 1.2, alpha: 0.7 }); game.addChild(weaponAreaBackground); // Add weapon selection buttons in right middle area var shotgunButton = LK.getAsset('shotgun', { anchorX: 0.5, anchorY: 0.5, x: 1900, y: 1200, alpha: 1.0 }); game.addChild(shotgunButton); var smgButton = LK.getAsset('smg', { anchorX: 0.5, anchorY: 0.5, x: 1900, y: 1350, alpha: 0.6 }); game.addChild(smgButton); var sniperButton = LK.getAsset('sniper', { anchorX: 0.5, anchorY: 0.5, x: 1900, y: 1500, alpha: 0.6 }); game.addChild(sniperButton); // Initialize weapon button states updateWeaponButtons(); // Weapon selection handlers shotgunButton.down = function () { if (weaponOwned.shotgun) { currentWeapon = 'shotgun'; shotgunButton.alpha = 1.0; smgButton.alpha = 0.6; sniperButton.alpha = 0.6; } else { showBuyConfirmation('shotgun'); } }; smgButton.down = function () { if (weaponOwned.smg) { currentWeapon = 'smg'; shotgunButton.alpha = 0.6; smgButton.alpha = 1.0; sniperButton.alpha = 0.6; } else { showBuyConfirmation('smg'); } }; sniperButton.down = function () { if (weaponOwned.sniper) { currentWeapon = 'sniper'; shotgunButton.alpha = 0.6; smgButton.alpha = 0.6; sniperButton.alpha = 1.0; } else { showBuyConfirmation('sniper'); } }; function showBuyConfirmation(weaponType) { if (buyConfirmationActive) return; var weaponCost = weaponStats[weaponType].cost; var canAfford = LK.getScore() >= weaponCost; buyConfirmationActive = true; pendingWeapon = weaponType; // Create buy confirmation GUI buyConfirmationGUI = new Container(); LK.gui.center.addChild(buyConfirmationGUI); // Background var background = LK.getAsset('buyBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); buyConfirmationGUI.addChild(background); // Title text var titleText = new Text2('Buy ' + weaponStats[weaponType].name + '?', { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -70; buyConfirmationGUI.addChild(titleText); // Cost text var costText = new Text2('Cost: ' + weaponCost + ' Score', { size: 50, fill: 0xFFD700 }); costText.anchor.set(0.5, 0.5); costText.y = -20; buyConfirmationGUI.addChild(costText); // Warning text for insufficient funds if (!canAfford) { var warningText = new Text2('Para yetersiz', { size: 45, fill: 0xFF4444 }); warningText.anchor.set(0.5, 0.5); warningText.y = 30; buyConfirmationGUI.addChild(warningText); } // Buy button var buyButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: 80 }); if (!canAfford) { buyButton.tint = 0x666666; buyButton.alpha = 0.5; } buyConfirmationGUI.addChild(buyButton); var buyText = new Text2('BUY', { size: 40, fill: canAfford ? 0xFFFFFF : 0x999999 }); buyText.anchor.set(0.5, 0.5); buyText.y = 80; buyConfirmationGUI.addChild(buyText); // Buy button handler buyButton.down = function () { if (LK.getScore() >= weaponCost) { LK.setScore(LK.getScore() - weaponCost); scoreText.setText('Score: ' + LK.getScore()); weaponOwned[pendingWeapon] = true; currentWeapon = pendingWeapon; updateWeaponButtons(); } hideBuyConfirmation(); }; // Cancel button (background click) background.down = function () { hideBuyConfirmation(); }; } function hideBuyConfirmation() { if (buyConfirmationGUI) { buyConfirmationGUI.destroy(); buyConfirmationGUI = null; } buyConfirmationActive = false; pendingWeapon = null; } function updateWeaponButtons() { // Update shotgun button if (weaponOwned.shotgun) { shotgunButton.alpha = currentWeapon === 'shotgun' ? 1.0 : 0.6; shotgunButton.tint = 0xFFFFFF; } else { shotgunButton.alpha = 0.8; shotgunButton.tint = 0xFF4444; } // Update SMG button if (weaponOwned.smg) { smgButton.alpha = currentWeapon === 'smg' ? 1.0 : 0.6; smgButton.tint = 0xFFFFFF; } else { smgButton.alpha = 0.8; smgButton.tint = 0xFF4444; } // Update sniper button if (weaponOwned.sniper) { sniperButton.alpha = currentWeapon === 'sniper' ? 1.0 : 0.6; sniperButton.tint = 0xFFFFFF; } else { sniperButton.alpha = 0.8; sniperButton.tint = 0xFF4444; } } function spawnEnemy() { var enemy = new Enemy(); // Calculate speed multiplier based on score (10% faster every 10 points) var speedMultiplier = 1 + Math.floor(LK.getScore() / 10) * 0.1; enemy.speed = enemy.speed * speedMultiplier; var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top enemy.x = Math.random() * 2048; enemy.y = -25; break; case 1: // Right enemy.x = 2073; enemy.y = Math.random() * 2732; break; case 2: // Bottom enemy.x = Math.random() * 2048; enemy.y = 2757; break; case 3: // Left enemy.x = -25; enemy.y = Math.random() * 2732; break; } enemies.push(enemy); game.addChild(enemy); } function spawnBoss() { var currentScore = LK.getScore(); var bossType = 25; // Default boss if (currentScore >= 100) { bossType = 100; } else if (currentScore >= 75) { bossType = 75; } else if (currentScore >= 50) { bossType = 50; } var boss = new Boss(bossType); var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top boss.x = Math.random() * 2048; boss.y = -50; break; case 1: // Right boss.x = 2098; boss.y = Math.random() * 2732; break; case 2: // Bottom boss.x = Math.random() * 2048; boss.y = 2782; break; case 3: // Left boss.x = -50; boss.y = Math.random() * 2732; break; } bosses.push(boss); game.addChild(boss); bossActive = true; LK.playMusic('bossMusic'); } function fireBullet(targetX, targetY) { if (player.shoot()) { if (currentWeapon === 'shotgun') { // Fire 3 bullets with spread for shotgun for (var i = 0; i < 3; i++) { var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; // Calculate angle to target var dx = targetX - player.x; var dy = targetY - player.y; var baseAngle = Math.atan2(dy, dx); // Add spread (-0.3, 0, +0.3 radians) var spreadAngle = baseAngle + (i - 1) * 0.3; var spreadTargetX = player.x + Math.cos(spreadAngle) * 500; var spreadTargetY = player.y + Math.sin(spreadAngle) * 500; bullet.setDirection(spreadTargetX, spreadTargetY); bullets.push(bullet); game.addChild(bullet); } } else if (currentWeapon === 'sniper') { // Sniper bullet with penetration var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; bullet.setDirection(targetX, targetY); bullet.isPenetrating = true; bullet.penetrationCount = 0; bullet.maxPenetration = 3; bullet.lifeTime = 360; // 3x longer range for sniper bullets.push(bullet); game.addChild(bullet); } else { // Regular bullet for SMG var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y; bullet.setDirection(targetX, targetY); bullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); } } // Mouse/touch tracking for player direction game.move = function (x, y, obj) { mouseX = x; mouseY = y; // Calculate direction from player to mouse var dx = mouseX - player.x; var dy = mouseY - player.y; // Determine which direction is dominant if (Math.abs(dx) > Math.abs(dy)) { // Horizontal movement is dominant if (dx > 0) { player.setDirection('right'); } else { player.setDirection('left'); } } else { // Vertical movement is dominant if (dy > 0) { player.setDirection('down'); } else { player.setDirection('up'); } } }; // Cheats button click handler cheatsButton.down = function (x, y, obj) { showCheatsMenu(); }; // Cheats button background click handler cheatsButtonBackground.down = function (x, y, obj) { showCheatsMenu(); }; function showCheatsMenu() { if (cheatsMenuActive) return; cheatsMenuActive = true; game.paused = true; // Create cheats menu GUI cheatsMenuGUI = new Container(); LK.gui.center.addChild(cheatsMenuGUI); // Background var background = LK.getAsset('buyBackground', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9, scaleX: 1.2, scaleY: 1.5 }); cheatsMenuGUI.addChild(background); // Title text var titleText = new Text2('CHEATS MENU', { size: 70, fill: 0xFF00FF }); titleText.anchor.set(0.5, 0.5); titleText.y = -150; cheatsMenuGUI.addChild(titleText); // +10 Score button var add10ScoreButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: -80 }); cheatsMenuGUI.addChild(add10ScoreButton); var add10ScoreText = new Text2('+10 SCORE', { size: 35, fill: 0xFFFFFF }); add10ScoreText.anchor.set(0.5, 0.5); add10ScoreText.y = -80; cheatsMenuGUI.addChild(add10ScoreText); // God Mode button var godModeButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: -20 }); if (godModeActive) { godModeButton.tint = 0x00FF00; } cheatsMenuGUI.addChild(godModeButton); var godModeText = new Text2(godModeActive ? 'GOD MODE: ON' : 'GOD MODE: OFF', { size: 35, fill: 0xFFFFFF }); godModeText.anchor.set(0.5, 0.5); godModeText.y = -20; cheatsMenuGUI.addChild(godModeText); // Game Speed 2x button var speed2xButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: 40 }); if (gameSpeedMultiplier === 2) { speed2xButton.tint = 0x00FF00; } cheatsMenuGUI.addChild(speed2xButton); var speed2xText = new Text2('SPEED 2X', { size: 35, fill: 0xFFFFFF }); speed2xText.anchor.set(0.5, 0.5); speed2xText.y = 40; cheatsMenuGUI.addChild(speed2xText); // Game Speed 3x button var speed3xButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: 100 }); if (gameSpeedMultiplier === 3) { speed3xButton.tint = 0x00FF00; } cheatsMenuGUI.addChild(speed3xButton); var speed3xText = new Text2('SPEED 3X', { size: 35, fill: 0xFFFFFF }); speed3xText.anchor.set(0.5, 0.5); speed3xText.y = 100; cheatsMenuGUI.addChild(speed3xText); // Close button var closeButton = LK.getAsset('buyButton', { anchorX: 0.5, anchorY: 0.5, y: 160, scaleX: 0.8 }); closeButton.tint = 0xFF4444; cheatsMenuGUI.addChild(closeButton); var closeText = new Text2('CLOSE', { size: 35, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeText.y = 160; cheatsMenuGUI.addChild(closeText); // Button handlers add10ScoreButton.down = function () { LK.setScore(LK.getScore() + 10); scoreText.setText('Score: ' + LK.getScore()); if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; highScoreText.setText('High Score: ' + highScore); } }; godModeButton.down = function () { godModeActive = !godModeActive; godModeText.setText(godModeActive ? 'GOD MODE: ON' : 'GOD MODE: OFF'); godModeButton.tint = godModeActive ? 0x00FF00 : 0xFFFFFF; }; speed2xButton.down = function () { gameSpeedMultiplier = gameSpeedMultiplier === 2 ? 1 : 2; speed2xButton.tint = gameSpeedMultiplier === 2 ? 0x00FF00 : 0xFFFFFF; if (gameSpeedMultiplier !== 3) { speed3xButton.tint = 0xFFFFFF; } }; speed3xButton.down = function () { gameSpeedMultiplier = gameSpeedMultiplier === 3 ? 1 : 3; speed3xButton.tint = gameSpeedMultiplier === 3 ? 0x00FF00 : 0xFFFFFF; if (gameSpeedMultiplier !== 2) { speed2xButton.tint = 0xFFFFFF; } }; closeButton.down = function () { hideCheatsMenu(); }; background.down = function () { hideCheatsMenu(); }; } function hideCheatsMenu() { if (cheatsMenuGUI) { cheatsMenuGUI.destroy(); cheatsMenuGUI = null; } cheatsMenuActive = false; game.paused = false; } // Shooting controls game.down = function (x, y, obj) { var currentTime = Date.now(); var weaponFireRate = weaponStats[currentWeapon].fireRate; mouseX = x; mouseY = y; // Update direction when shooting var dx = mouseX - player.x; var dy = mouseY - player.y; if (Math.abs(dx) > Math.abs(dy)) { if (dx > 0) { player.setDirection('right'); } else { player.setDirection('left'); } } else { if (dy > 0) { player.setDirection('down'); } else { player.setDirection('up'); } } if (currentWeapon === 'smg') { // Start continuous firing for SMG isShooting = true; if (currentTime - lastShotTime > weaponFireRate) { fireBullet(x, y); lastShotTime = currentTime; } if (!shootingInterval) { shootingInterval = LK.setInterval(function () { if (isShooting && player.canShoot()) { fireBullet(mouseX, mouseY); } }, weaponFireRate); } } else { // Single shot for shotgun and sniper if (currentTime - lastShotTime > weaponFireRate) { fireBullet(x, y); lastShotTime = currentTime; } } }; // Add mouse up handler to stop SMG firing game.up = function (x, y, obj) { isShooting = false; if (shootingInterval) { LK.clearInterval(shootingInterval); shootingInterval = null; } }; // Main game loop game.update = function () { if (!player || game.paused) return; // Apply game speed multiplier for (var speedLoop = 0; speedLoop < gameSpeedMultiplier; speedLoop++) { if (game.paused) break; // Player movement if (movementKeys.up && player.y > 30) { player.y -= player.speed; } if (movementKeys.down && player.y < 2702) { player.y += player.speed; } if (movementKeys.left && player.x > 30) { player.x -= player.speed; } if (movementKeys.right && player.x < 2018) { player.x += player.speed; } // Spawn enemies enemySpawnTimer++; if (enemySpawnTimer >= enemySpawnRate) { spawnEnemy(); enemySpawnTimer = 0; // Increase difficulty over time if (enemySpawnRate > 60) { enemySpawnRate--; } } // Check for boss spawn every 25 points if (LK.getScore() > 0 && LK.getScore() % 25 === 0 && LK.getScore() !== lastBossScore && !bossActive) { spawnBoss(); lastBossScore = LK.getScore(); } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.isExpired()) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet-enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { var damage = weaponStats[currentWeapon].damage; if (enemy.takeDamage(damage)) { LK.setScore(LK.getScore() + 1); scoreText.setText('Score: ' + LK.getScore()); // Update high score if current score is higher if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; highScoreText.setText('High Score: ' + highScore); } LK.getSound('enemyHit').play(); enemy.destroy(); enemies.splice(j, 1); } // Handle bullet penetration for sniper if (bullet.isPenetrating && bullet.penetrationCount < bullet.maxPenetration) { bullet.penetrationCount++; } else { bullet.destroy(); bullets.splice(i, 1); } break; } } // Check bullet-boss collisions for (var b = bosses.length - 1; b >= 0; b--) { var boss = bosses[b]; if (bullet.intersects(boss)) { var damage = weaponStats[currentWeapon].damage; if (boss.takeDamage(damage)) { LK.setScore(LK.getScore() + 10); scoreText.setText('Score: ' + LK.getScore()); // Update high score if current score is higher if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; highScoreText.setText('High Score: ' + highScore); } LK.getSound('bossDeath').play(); boss.destroy(); bosses.splice(b, 1); bossActive = false; LK.stopMusic(); } // Handle bullet penetration for sniper if (bullet.isPenetrating && bullet.penetrationCount < bullet.maxPenetration) { bullet.penetrationCount++; } else { bullet.destroy(); bullets.splice(i, 1); } break; } } } // Check player-enemy collisions for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; if (player.intersects(enemy)) { player.takeDamage(100); break; } } // Check player-boss collisions for (var m = bosses.length - 1; m >= 0; m--) { var boss = bosses[m]; if (player.intersects(boss)) { player.takeDamage(100); break; } } // Update UI healthText.setText('Health: ' + player.health); if (player.isReloading) { ammoText.setText('Reloading...'); } else { ammoText.setText('Ammo: ' + player.ammunition + '/' + player.maxAmmo); } } // Close speed multiplier loop };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Boss = Container.expand(function (bossType) {
var self = Container.call(this);
// Determine boss asset and health based on type
var assetId = 'boss';
var health = 10;
if (bossType === 50) {
assetId = 'boss50';
health = 20;
} else if (bossType === 75) {
assetId = 'boss75';
health = 30;
} else if (bossType === 100) {
assetId = 'boss100';
health = 50;
}
var bossGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.8;
self.health = health;
self.maxHealth = health;
self.bossType = bossType || 25;
self.isBoss = true;
self.lastPlayerX = 0;
self.lastPlayerY = 0;
// Create health bar
var healthBarWidth = bossGraphics.width * 0.8;
var healthBarBackground = LK.getAsset('buttonBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: healthBarWidth / 260,
scaleY: 0.3
});
healthBarBackground.y = -bossGraphics.height / 2 - 30;
self.addChild(healthBarBackground);
var healthBar = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: healthBarWidth / 200,
scaleY: 0.4
});
healthBar.y = -bossGraphics.height / 2 - 30;
healthBar.tint = 0x00ff00;
self.addChild(healthBar);
self.healthBar = healthBar;
self.healthBarBackground = healthBarBackground;
self.update = function () {
if (player) {
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastPlayerX = player.x;
self.lastPlayerY = player.y;
}
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
LK.effects.flashObject(self, 0xFF4444, 200);
// Update health bar
var healthPercent = self.health / self.maxHealth;
self.healthBar.scaleX = self.healthBarBackground.width * healthPercent / 200;
if (healthPercent > 0.5) {
self.healthBar.tint = 0x00ff00;
} else if (healthPercent > 0.25) {
self.healthBar.tint = 0xffff00;
} else {
self.healthBar.tint = 0xff0000;
}
if (self.health <= 0) {
LK.effects.flashObject(self, 0xFFFFFF, 500);
return true;
}
return false;
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.velocityX = 0;
self.velocityY = 0;
self.lifeTime = 120;
self.age = 0;
self.setDirection = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
}
};
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.age++;
};
self.isExpired = function () {
return self.age >= self.lifeTime || self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.health = 1;
self.maxHealth = 1;
self.lastPlayerX = 0;
self.lastPlayerY = 0;
// Create health bar for enemy
var healthBarWidth = enemyGraphics.width * 0.6;
var healthBarBackground = LK.getAsset('buttonBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: healthBarWidth / 260,
scaleY: 0.2
});
healthBarBackground.y = -enemyGraphics.height / 2 - 20;
self.addChild(healthBarBackground);
var healthBar = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: healthBarWidth / 200,
scaleY: 0.3
});
healthBar.y = -enemyGraphics.height / 2 - 20;
healthBar.tint = 0x00ff00;
self.addChild(healthBar);
self.healthBar = healthBar;
self.healthBarBackground = healthBarBackground;
self.update = function () {
if (player) {
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
self.lastPlayerX = player.x;
self.lastPlayerY = player.y;
}
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
// Update health bar
var healthPercent = self.health / self.maxHealth;
self.healthBar.scaleX = self.healthBarBackground.width * healthPercent / 200;
if (healthPercent > 0.5) {
self.healthBar.tint = 0x00ff00;
} else if (healthPercent > 0.25) {
self.healthBar.tint = 0xffff00;
} else {
self.healthBar.tint = 0xff0000;
}
if (self.health <= 0) {
LK.effects.flashObject(self, 0xFFFFFF, 200);
return true;
}
return false;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
// Create all directional graphics
self.playerGraphicsUp = self.attachAsset('player_up', {
anchorX: 0.5,
anchorY: 0.5
});
self.playerGraphicsDown = self.attachAsset('player_down', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
self.playerGraphicsLeft = self.attachAsset('player_left', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
self.playerGraphicsRight = self.attachAsset('player_right', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
self.currentDirection = 'up';
self.health = 100;
self.maxHealth = 100;
self.speed = 4;
self.ammunition = 30;
self.maxAmmo = 30;
self.isReloading = false;
self.reloadTime = 2000;
self.setDirection = function (direction) {
// Hide all graphics first
self.playerGraphicsUp.visible = false;
self.playerGraphicsDown.visible = false;
self.playerGraphicsLeft.visible = false;
self.playerGraphicsRight.visible = false;
// Show the correct direction
switch (direction) {
case 'up':
self.playerGraphicsUp.visible = true;
break;
case 'down':
self.playerGraphicsDown.visible = true;
break;
case 'left':
self.playerGraphicsLeft.visible = true;
break;
case 'right':
self.playerGraphicsRight.visible = true;
break;
}
self.currentDirection = direction;
};
self.takeDamage = function (damage) {
if (godModeActive) return; // God mode prevents damage
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
} else {
LK.effects.flashObject(self, 0xFF0000, 300);
}
};
self.reload = function () {
if (!self.isReloading && self.ammunition < self.maxAmmo) {
self.isReloading = true;
LK.getSound('reload').play();
LK.setTimeout(function () {
self.ammunition = self.maxAmmo;
self.isReloading = false;
}, self.reloadTime);
}
};
self.canShoot = function () {
return self.ammunition > 0 && !self.isReloading;
};
self.shoot = function () {
if (self.canShoot()) {
self.ammunition--;
if (self.ammunition === 0) {
self.reload();
}
return true;
}
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var enemySpawnTimer = 0;
var enemySpawnRate = 180;
var gameStarted = false;
var lastTapTime = 0;
var tapCooldown = 150;
var mouseX = 2048 / 2;
var mouseY = 2732 / 2;
var bosses = [];
var lastBossScore = 0;
var bossActive = false;
var currentWeapon = 'shotgun';
var weaponStats = {
shotgun: {
damage: 2,
fireRate: 20,
name: 'Shotgun',
cost: 20
},
smg: {
damage: 1,
fireRate: 25,
name: 'SMG',
cost: 100
},
sniper: {
damage: 5,
fireRate: 60,
name: 'Sniper',
cost: 100
}
};
var weaponOwned = {
shotgun: true,
smg: false,
sniper: false
};
var lastShotTime = 0;
var isShooting = false;
var shootingInterval = null;
var buyConfirmationActive = false;
var pendingWeapon = null;
var buyConfirmationGUI = null;
// UI Elements
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
LK.gui.topLeft.addChild(healthText);
healthText.x = 120;
healthText.y = 50;
var ammoText = new Text2('Ammo: 30/30', {
size: 60,
fill: 0xFFFFFF
});
ammoText.anchor.set(0, 0);
LK.gui.topLeft.addChild(ammoText);
ammoText.x = 120;
ammoText.y = 120;
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// High Score display in top right
var highScore = storage.highScore || 0;
var highScoreText = new Text2('High Score: ' + highScore, {
size: 60,
fill: 0xFFD700
});
highScoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(highScoreText);
highScoreText.x = -20;
highScoreText.y = 20;
// Cheats menu variables
var cheatsMenuActive = false;
var cheatsMenuGUI = null;
var godModeActive = false;
var gameSpeedMultiplier = 1;
// CHEATS button with background
var cheatsButtonBackground = LK.getAsset('buttonBackground', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
cheatsButtonBackground.y = 140;
LK.gui.top.addChild(cheatsButtonBackground);
var cheatsButton = new Text2('CHEATS', {
size: 50,
fill: 0xFF00FF
});
cheatsButton.anchor.set(0.5, 0);
LK.gui.top.addChild(cheatsButton);
cheatsButton.y = 100;
// Add game background
var gameBackground = LK.getAsset('gameBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(gameBackground);
// Initialize player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Movement controls
var movementKeys = {
up: false,
down: false,
left: false,
right: false
};
// Create virtual joystick areas for mobile
var moveUpArea = LK.getAsset('player_up', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3,
scaleX: 2,
scaleY: 1
});
moveUpArea.x = 200;
moveUpArea.y = 2400;
game.addChild(moveUpArea);
var moveDownArea = LK.getAsset('player_up', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3,
scaleX: 2,
scaleY: 1
});
moveDownArea.x = 200;
moveDownArea.y = 2600;
game.addChild(moveDownArea);
var moveLeftArea = LK.getAsset('player_up', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3,
scaleX: 1,
scaleY: 2
});
moveLeftArea.x = 100;
moveLeftArea.y = 2500;
game.addChild(moveLeftArea);
var moveRightArea = LK.getAsset('player_up', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3,
scaleX: 1,
scaleY: 2
});
moveRightArea.x = 300;
moveRightArea.y = 2500;
game.addChild(moveRightArea);
// Movement control handlers
moveUpArea.down = function () {
movementKeys.up = true;
};
moveUpArea.up = function () {
movementKeys.up = false;
};
moveDownArea.down = function () {
movementKeys.down = true;
};
moveDownArea.up = function () {
movementKeys.down = false;
};
moveLeftArea.down = function () {
movementKeys.left = true;
};
moveLeftArea.up = function () {
movementKeys.left = false;
};
moveRightArea.down = function () {
movementKeys.right = true;
};
moveRightArea.up = function () {
movementKeys.right = false;
};
// Add weapon area background
var weaponAreaBackground = LK.getAsset('buyBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 1350,
scaleX: 0.8,
scaleY: 1.2,
alpha: 0.7
});
game.addChild(weaponAreaBackground);
// Add weapon selection buttons in right middle area
var shotgunButton = LK.getAsset('shotgun', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 1200,
alpha: 1.0
});
game.addChild(shotgunButton);
var smgButton = LK.getAsset('smg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 1350,
alpha: 0.6
});
game.addChild(smgButton);
var sniperButton = LK.getAsset('sniper', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 1500,
alpha: 0.6
});
game.addChild(sniperButton);
// Initialize weapon button states
updateWeaponButtons();
// Weapon selection handlers
shotgunButton.down = function () {
if (weaponOwned.shotgun) {
currentWeapon = 'shotgun';
shotgunButton.alpha = 1.0;
smgButton.alpha = 0.6;
sniperButton.alpha = 0.6;
} else {
showBuyConfirmation('shotgun');
}
};
smgButton.down = function () {
if (weaponOwned.smg) {
currentWeapon = 'smg';
shotgunButton.alpha = 0.6;
smgButton.alpha = 1.0;
sniperButton.alpha = 0.6;
} else {
showBuyConfirmation('smg');
}
};
sniperButton.down = function () {
if (weaponOwned.sniper) {
currentWeapon = 'sniper';
shotgunButton.alpha = 0.6;
smgButton.alpha = 0.6;
sniperButton.alpha = 1.0;
} else {
showBuyConfirmation('sniper');
}
};
function showBuyConfirmation(weaponType) {
if (buyConfirmationActive) return;
var weaponCost = weaponStats[weaponType].cost;
var canAfford = LK.getScore() >= weaponCost;
buyConfirmationActive = true;
pendingWeapon = weaponType;
// Create buy confirmation GUI
buyConfirmationGUI = new Container();
LK.gui.center.addChild(buyConfirmationGUI);
// Background
var background = LK.getAsset('buyBackground', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
buyConfirmationGUI.addChild(background);
// Title text
var titleText = new Text2('Buy ' + weaponStats[weaponType].name + '?', {
size: 60,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -70;
buyConfirmationGUI.addChild(titleText);
// Cost text
var costText = new Text2('Cost: ' + weaponCost + ' Score', {
size: 50,
fill: 0xFFD700
});
costText.anchor.set(0.5, 0.5);
costText.y = -20;
buyConfirmationGUI.addChild(costText);
// Warning text for insufficient funds
if (!canAfford) {
var warningText = new Text2('Para yetersiz', {
size: 45,
fill: 0xFF4444
});
warningText.anchor.set(0.5, 0.5);
warningText.y = 30;
buyConfirmationGUI.addChild(warningText);
}
// Buy button
var buyButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: 80
});
if (!canAfford) {
buyButton.tint = 0x666666;
buyButton.alpha = 0.5;
}
buyConfirmationGUI.addChild(buyButton);
var buyText = new Text2('BUY', {
size: 40,
fill: canAfford ? 0xFFFFFF : 0x999999
});
buyText.anchor.set(0.5, 0.5);
buyText.y = 80;
buyConfirmationGUI.addChild(buyText);
// Buy button handler
buyButton.down = function () {
if (LK.getScore() >= weaponCost) {
LK.setScore(LK.getScore() - weaponCost);
scoreText.setText('Score: ' + LK.getScore());
weaponOwned[pendingWeapon] = true;
currentWeapon = pendingWeapon;
updateWeaponButtons();
}
hideBuyConfirmation();
};
// Cancel button (background click)
background.down = function () {
hideBuyConfirmation();
};
}
function hideBuyConfirmation() {
if (buyConfirmationGUI) {
buyConfirmationGUI.destroy();
buyConfirmationGUI = null;
}
buyConfirmationActive = false;
pendingWeapon = null;
}
function updateWeaponButtons() {
// Update shotgun button
if (weaponOwned.shotgun) {
shotgunButton.alpha = currentWeapon === 'shotgun' ? 1.0 : 0.6;
shotgunButton.tint = 0xFFFFFF;
} else {
shotgunButton.alpha = 0.8;
shotgunButton.tint = 0xFF4444;
}
// Update SMG button
if (weaponOwned.smg) {
smgButton.alpha = currentWeapon === 'smg' ? 1.0 : 0.6;
smgButton.tint = 0xFFFFFF;
} else {
smgButton.alpha = 0.8;
smgButton.tint = 0xFF4444;
}
// Update sniper button
if (weaponOwned.sniper) {
sniperButton.alpha = currentWeapon === 'sniper' ? 1.0 : 0.6;
sniperButton.tint = 0xFFFFFF;
} else {
sniperButton.alpha = 0.8;
sniperButton.tint = 0xFF4444;
}
}
function spawnEnemy() {
var enemy = new Enemy();
// Calculate speed multiplier based on score (10% faster every 10 points)
var speedMultiplier = 1 + Math.floor(LK.getScore() / 10) * 0.1;
enemy.speed = enemy.speed * speedMultiplier;
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = Math.random() * 2048;
enemy.y = -25;
break;
case 1:
// Right
enemy.x = 2073;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2757;
break;
case 3:
// Left
enemy.x = -25;
enemy.y = Math.random() * 2732;
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
function spawnBoss() {
var currentScore = LK.getScore();
var bossType = 25; // Default boss
if (currentScore >= 100) {
bossType = 100;
} else if (currentScore >= 75) {
bossType = 75;
} else if (currentScore >= 50) {
bossType = 50;
}
var boss = new Boss(bossType);
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
boss.x = Math.random() * 2048;
boss.y = -50;
break;
case 1:
// Right
boss.x = 2098;
boss.y = Math.random() * 2732;
break;
case 2:
// Bottom
boss.x = Math.random() * 2048;
boss.y = 2782;
break;
case 3:
// Left
boss.x = -50;
boss.y = Math.random() * 2732;
break;
}
bosses.push(boss);
game.addChild(boss);
bossActive = true;
LK.playMusic('bossMusic');
}
function fireBullet(targetX, targetY) {
if (player.shoot()) {
if (currentWeapon === 'shotgun') {
// Fire 3 bullets with spread for shotgun
for (var i = 0; i < 3; i++) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
// Calculate angle to target
var dx = targetX - player.x;
var dy = targetY - player.y;
var baseAngle = Math.atan2(dy, dx);
// Add spread (-0.3, 0, +0.3 radians)
var spreadAngle = baseAngle + (i - 1) * 0.3;
var spreadTargetX = player.x + Math.cos(spreadAngle) * 500;
var spreadTargetY = player.y + Math.sin(spreadAngle) * 500;
bullet.setDirection(spreadTargetX, spreadTargetY);
bullets.push(bullet);
game.addChild(bullet);
}
} else if (currentWeapon === 'sniper') {
// Sniper bullet with penetration
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setDirection(targetX, targetY);
bullet.isPenetrating = true;
bullet.penetrationCount = 0;
bullet.maxPenetration = 3;
bullet.lifeTime = 360; // 3x longer range for sniper
bullets.push(bullet);
game.addChild(bullet);
} else {
// Regular bullet for SMG
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setDirection(targetX, targetY);
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
}
}
// Mouse/touch tracking for player direction
game.move = function (x, y, obj) {
mouseX = x;
mouseY = y;
// Calculate direction from player to mouse
var dx = mouseX - player.x;
var dy = mouseY - player.y;
// Determine which direction is dominant
if (Math.abs(dx) > Math.abs(dy)) {
// Horizontal movement is dominant
if (dx > 0) {
player.setDirection('right');
} else {
player.setDirection('left');
}
} else {
// Vertical movement is dominant
if (dy > 0) {
player.setDirection('down');
} else {
player.setDirection('up');
}
}
};
// Cheats button click handler
cheatsButton.down = function (x, y, obj) {
showCheatsMenu();
};
// Cheats button background click handler
cheatsButtonBackground.down = function (x, y, obj) {
showCheatsMenu();
};
function showCheatsMenu() {
if (cheatsMenuActive) return;
cheatsMenuActive = true;
game.paused = true;
// Create cheats menu GUI
cheatsMenuGUI = new Container();
LK.gui.center.addChild(cheatsMenuGUI);
// Background
var background = LK.getAsset('buyBackground', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9,
scaleX: 1.2,
scaleY: 1.5
});
cheatsMenuGUI.addChild(background);
// Title text
var titleText = new Text2('CHEATS MENU', {
size: 70,
fill: 0xFF00FF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -150;
cheatsMenuGUI.addChild(titleText);
// +10 Score button
var add10ScoreButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: -80
});
cheatsMenuGUI.addChild(add10ScoreButton);
var add10ScoreText = new Text2('+10 SCORE', {
size: 35,
fill: 0xFFFFFF
});
add10ScoreText.anchor.set(0.5, 0.5);
add10ScoreText.y = -80;
cheatsMenuGUI.addChild(add10ScoreText);
// God Mode button
var godModeButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: -20
});
if (godModeActive) {
godModeButton.tint = 0x00FF00;
}
cheatsMenuGUI.addChild(godModeButton);
var godModeText = new Text2(godModeActive ? 'GOD MODE: ON' : 'GOD MODE: OFF', {
size: 35,
fill: 0xFFFFFF
});
godModeText.anchor.set(0.5, 0.5);
godModeText.y = -20;
cheatsMenuGUI.addChild(godModeText);
// Game Speed 2x button
var speed2xButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: 40
});
if (gameSpeedMultiplier === 2) {
speed2xButton.tint = 0x00FF00;
}
cheatsMenuGUI.addChild(speed2xButton);
var speed2xText = new Text2('SPEED 2X', {
size: 35,
fill: 0xFFFFFF
});
speed2xText.anchor.set(0.5, 0.5);
speed2xText.y = 40;
cheatsMenuGUI.addChild(speed2xText);
// Game Speed 3x button
var speed3xButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: 100
});
if (gameSpeedMultiplier === 3) {
speed3xButton.tint = 0x00FF00;
}
cheatsMenuGUI.addChild(speed3xButton);
var speed3xText = new Text2('SPEED 3X', {
size: 35,
fill: 0xFFFFFF
});
speed3xText.anchor.set(0.5, 0.5);
speed3xText.y = 100;
cheatsMenuGUI.addChild(speed3xText);
// Close button
var closeButton = LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
y: 160,
scaleX: 0.8
});
closeButton.tint = 0xFF4444;
cheatsMenuGUI.addChild(closeButton);
var closeText = new Text2('CLOSE', {
size: 35,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.y = 160;
cheatsMenuGUI.addChild(closeText);
// Button handlers
add10ScoreButton.down = function () {
LK.setScore(LK.getScore() + 10);
scoreText.setText('Score: ' + LK.getScore());
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
highScoreText.setText('High Score: ' + highScore);
}
};
godModeButton.down = function () {
godModeActive = !godModeActive;
godModeText.setText(godModeActive ? 'GOD MODE: ON' : 'GOD MODE: OFF');
godModeButton.tint = godModeActive ? 0x00FF00 : 0xFFFFFF;
};
speed2xButton.down = function () {
gameSpeedMultiplier = gameSpeedMultiplier === 2 ? 1 : 2;
speed2xButton.tint = gameSpeedMultiplier === 2 ? 0x00FF00 : 0xFFFFFF;
if (gameSpeedMultiplier !== 3) {
speed3xButton.tint = 0xFFFFFF;
}
};
speed3xButton.down = function () {
gameSpeedMultiplier = gameSpeedMultiplier === 3 ? 1 : 3;
speed3xButton.tint = gameSpeedMultiplier === 3 ? 0x00FF00 : 0xFFFFFF;
if (gameSpeedMultiplier !== 2) {
speed2xButton.tint = 0xFFFFFF;
}
};
closeButton.down = function () {
hideCheatsMenu();
};
background.down = function () {
hideCheatsMenu();
};
}
function hideCheatsMenu() {
if (cheatsMenuGUI) {
cheatsMenuGUI.destroy();
cheatsMenuGUI = null;
}
cheatsMenuActive = false;
game.paused = false;
}
// Shooting controls
game.down = function (x, y, obj) {
var currentTime = Date.now();
var weaponFireRate = weaponStats[currentWeapon].fireRate;
mouseX = x;
mouseY = y;
// Update direction when shooting
var dx = mouseX - player.x;
var dy = mouseY - player.y;
if (Math.abs(dx) > Math.abs(dy)) {
if (dx > 0) {
player.setDirection('right');
} else {
player.setDirection('left');
}
} else {
if (dy > 0) {
player.setDirection('down');
} else {
player.setDirection('up');
}
}
if (currentWeapon === 'smg') {
// Start continuous firing for SMG
isShooting = true;
if (currentTime - lastShotTime > weaponFireRate) {
fireBullet(x, y);
lastShotTime = currentTime;
}
if (!shootingInterval) {
shootingInterval = LK.setInterval(function () {
if (isShooting && player.canShoot()) {
fireBullet(mouseX, mouseY);
}
}, weaponFireRate);
}
} else {
// Single shot for shotgun and sniper
if (currentTime - lastShotTime > weaponFireRate) {
fireBullet(x, y);
lastShotTime = currentTime;
}
}
};
// Add mouse up handler to stop SMG firing
game.up = function (x, y, obj) {
isShooting = false;
if (shootingInterval) {
LK.clearInterval(shootingInterval);
shootingInterval = null;
}
};
// Main game loop
game.update = function () {
if (!player || game.paused) return;
// Apply game speed multiplier
for (var speedLoop = 0; speedLoop < gameSpeedMultiplier; speedLoop++) {
if (game.paused) break;
// Player movement
if (movementKeys.up && player.y > 30) {
player.y -= player.speed;
}
if (movementKeys.down && player.y < 2702) {
player.y += player.speed;
}
if (movementKeys.left && player.x > 30) {
player.x -= player.speed;
}
if (movementKeys.right && player.x < 2018) {
player.x += player.speed;
}
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnRate) {
spawnEnemy();
enemySpawnTimer = 0;
// Increase difficulty over time
if (enemySpawnRate > 60) {
enemySpawnRate--;
}
}
// Check for boss spawn every 25 points
if (LK.getScore() > 0 && LK.getScore() % 25 === 0 && LK.getScore() !== lastBossScore && !bossActive) {
spawnBoss();
lastBossScore = LK.getScore();
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.isExpired()) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var damage = weaponStats[currentWeapon].damage;
if (enemy.takeDamage(damage)) {
LK.setScore(LK.getScore() + 1);
scoreText.setText('Score: ' + LK.getScore());
// Update high score if current score is higher
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
highScoreText.setText('High Score: ' + highScore);
}
LK.getSound('enemyHit').play();
enemy.destroy();
enemies.splice(j, 1);
}
// Handle bullet penetration for sniper
if (bullet.isPenetrating && bullet.penetrationCount < bullet.maxPenetration) {
bullet.penetrationCount++;
} else {
bullet.destroy();
bullets.splice(i, 1);
}
break;
}
}
// Check bullet-boss collisions
for (var b = bosses.length - 1; b >= 0; b--) {
var boss = bosses[b];
if (bullet.intersects(boss)) {
var damage = weaponStats[currentWeapon].damage;
if (boss.takeDamage(damage)) {
LK.setScore(LK.getScore() + 10);
scoreText.setText('Score: ' + LK.getScore());
// Update high score if current score is higher
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
highScoreText.setText('High Score: ' + highScore);
}
LK.getSound('bossDeath').play();
boss.destroy();
bosses.splice(b, 1);
bossActive = false;
LK.stopMusic();
}
// Handle bullet penetration for sniper
if (bullet.isPenetrating && bullet.penetrationCount < bullet.maxPenetration) {
bullet.penetrationCount++;
} else {
bullet.destroy();
bullets.splice(i, 1);
}
break;
}
}
}
// Check player-enemy collisions
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
if (player.intersects(enemy)) {
player.takeDamage(100);
break;
}
}
// Check player-boss collisions
for (var m = bosses.length - 1; m >= 0; m--) {
var boss = bosses[m];
if (player.intersects(boss)) {
player.takeDamage(100);
break;
}
}
// Update UI
healthText.setText('Health: ' + player.health);
if (player.isReloading) {
ammoText.setText('Reloading...');
} else {
ammoText.setText('Ammo: ' + player.ammunition + '/' + player.maxAmmo);
}
} // Close speed multiplier loop
};
terrorist sketch 1. In-Game asset. 2d. High contrast. No shadows
Bullet. In-Game asset. 2d. High contrast. No shadows
boss sketch ballistic shield. In-Game asset. 2d. High contrast. No shadows
angry devil golem holding a big shield on right hand. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
red big monster dragon sketch. In-Game asset. 2d. High contrast. No shadows
god sketch. 3d model In-Game asset. 2d. High contrast. No shadows
dust 2 dark. In-Game asset. 2d. High contrast. No shadows
black smg icon with white stroke. In-Game asset. 2d. High contrast. No shadows
black sniper icon with white stroke. In-Game asset. 2d. High contrast. No shadows
black shotgun icon with white stroke. In-Game asset. 2d. High contrast. No shadows