Code edit (5 edits merged)
Please save this source code
User prompt
Farklı düşmanlar olsun. Bazen can iksiri düşsün. Daha kapsamlı bir shop olsun
Code edit (6 edits merged)
Please save this source code
User prompt
düşen altınlar otomatik toplansın. range çizgisi gözüksün. Oyun tasarımını modern hale getir.
Code edit (1 edits merged)
Please save this source code
User prompt
Idle Hero: Auto Battle RPG
Initial prompt
Create an idle action RPG game. The main character stands in the center of the screen, while waves of enemies spawn and approach from all directions. The character automatically shoots projectiles at the nearest enemies from a distance. As enemies are defeated, they drop gold and items. Players can spend collected gold in the shop to upgrade their stats (damage, attack speed, range, etc.) and buy new abilities. Add a skill tree or ability selection system where players can unlock and upgrade powerful skills — like area damage, freezing enemies, or summoning turrets. Items can also be upgraded (e.g., Sword +0 → Sword +1), improving their stats just like in traditional RPGs. Include visual effects for upgrades and skill activations. The game should have a simple and intuitive interface, with automatic combat but deep upgrade and progression mechanics. Make sure the difficulty increases gradually with stronger enemy waves.
/**** * 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.velocityX = 0; self.velocityY = 0; self.damage = 10; self.lifetime = 120; // frames self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.lifetime--; // Check collision with enemies for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (self.intersects(enemy)) { enemy.takeDamage(self.damage); self.destroy(); var index = bullets.indexOf(self); if (index > -1) { bullets.splice(index, 1); } return; } } // Remove if lifetime expired or off screen if (self.lifetime <= 0 || self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.destroy(); var index = bullets.indexOf(self); if (index > -1) { bullets.splice(index, 1); } } }; return self; }); var Enemy = Container.expand(function (type) { var self = Container.call(this); type = type || 'basic'; self.type = type; // Set different colors and stats based on type var enemyColor = 0xff6b6b; if (type === 'fast') { enemyColor = 0xff9f43; } else if (type === 'tank') { enemyColor = 0x8b5cf6; } else if (type === 'boss') { enemyColor = 0xf59e0b; } var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); enemyGraphics.tint = enemyColor; // Set stats based on type if (type === 'fast') { self.health = 5; self.maxHealth = 5; self.damage = 3; self.speed = 2.5; self.goldReward = 8; } else if (type === 'tank') { self.health = 40; self.maxHealth = 40; self.damage = 8; self.speed = 0.7; self.goldReward = 15; } else if (type === 'boss') { self.health = 100; self.maxHealth = 100; self.damage = 15; self.speed = 1.2; self.goldReward = 50; enemyGraphics.scaleX = 1.5; enemyGraphics.scaleY = 1.5; } else { // Basic enemy self.health = 10; self.maxHealth = 20; self.damage = 5; self.speed = 1; self.goldReward = 5; } self.update = function () { // Move towards hero var dx = hero.x - self.x; var dy = hero.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; } // Check collision with hero if (distance < 50) { hero.takeDamage(self.damage); self.destroy(); var index = enemies.indexOf(self); if (index > -1) { enemies.splice(index, 1); } } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.die(); } }; self.die = function () { // Drop gold var gold = new Gold(); gold.x = self.x; gold.y = self.y; gold.value = self.goldReward; goldItems.push(gold); game.addChild(gold); // Drop health potion (10% chance) if (Math.random() < 0.1) { var healthPotion = new HealthPotion(); healthPotion.x = self.x; healthPotion.y = self.y; healthPotions.push(healthPotion); game.addChild(healthPotion); } // Drop equipment (15% chance for boss, 8% for tank, 5% for others) var equipmentChance = 0.05; if (self.type === 'boss') { equipmentChance = 0.15; } else if (self.type === 'tank') { equipmentChance = 0.08; } if (Math.random() < equipmentChance) { var equipment = new Equipment(); equipment.x = self.x; equipment.y = self.y; equipmentItems.push(equipment); game.addChild(equipment); } self.destroy(); var index = enemies.indexOf(self); if (index > -1) { enemies.splice(index, 1); } LK.getSound('enemyHit').play(); }; return self; }); var Equipment = Container.expand(function () { var self = Container.call(this); var equipmentGraphics = self.attachAsset('equipment', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'sword'; self.level = 0; self.magnetRange = 20000; self.magnetSpeed = 3; self.update = function () { // Magnetic pull towards hero var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.magnetRange) { self.x += dx / distance * self.magnetSpeed; self.y += dy / distance * self.magnetSpeed; } // Automatic collection when close if (distance < 60) { playerEquipment.push(self.type); self.destroy(); var index = equipmentItems.indexOf(self); if (index > -1) { equipmentItems.splice(index, 1); } LK.getSound('pickup').play(); } }; return self; }); var Gold = Container.expand(function () { var self = Container.call(this); var goldGraphics = self.attachAsset('goldCoin', { anchorX: 0.5, anchorY: 0.5 }); self.value = 5; self.magnetRange = 2500; self.magnetSpeed = 4; self.update = function () { // Magnetic pull towards hero var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.magnetRange) { self.x += dx / distance * self.magnetSpeed; self.y += dy / distance * self.magnetSpeed; } // Automatic collection when close if (distance < 60) { playerGold += self.value; goldText.setText('Gold: ' + playerGold); self.destroy(); var index = goldItems.indexOf(self); if (index > -1) { goldItems.splice(index, 1); } LK.getSound('pickup').play(); } }; return self; }); var HealthPotion = Container.expand(function () { var self = Container.call(this); var potionGraphics = self.attachAsset('healthPotion', { anchorX: 0.5, anchorY: 0.5 }); self.healAmount = 20; self.magnetRange = 2000; self.magnetSpeed = 4; self.update = function () { // Magnetic pull towards hero var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.magnetRange) { self.x += dx / distance * self.magnetSpeed; self.y += dy / distance * self.magnetSpeed; } // Automatic collection when close if (distance < 60) { hero.health = Math.min(hero.maxHealth, hero.health + self.healAmount); self.destroy(); var index = healthPotions.indexOf(self); if (index > -1) { healthPotions.splice(index, 1); } LK.getSound('pickup').play(); } }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); var rangeCircle = self.attachAsset('rangeCircle', { anchorX: 0.5, anchorY: 0.5 }); rangeCircle.alpha = 0.1; rangeCircle.scaleX = 0.5; rangeCircle.scaleY = 0.5; self.rangeCircle = rangeCircle; self.health = 100; self.maxHealth = 100; self.damage = 40; self.attackSpeed = 60; // frames between shots self.range = 1000; self.shootTimer = 0; self.target = null; self.update = function () { self.shootTimer--; // Update range circle scale var scale = self.range / 1200; self.rangeCircle.scaleX = scale * 0.5; self.rangeCircle.scaleY = scale * 0.5; // Find nearest enemy in range var nearestEnemy = null; var nearestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range && distance < nearestDistance) { nearestDistance = distance; nearestEnemy = enemy; } } self.target = nearestEnemy; // Shoot at target if (self.target && self.shootTimer <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); bullet.velocityX = dx / distance * 8; bullet.velocityY = dy / distance * 8; bullet.damage = self.damage; bullets.push(bullet); game.addChild(bullet); self.shootTimer = self.attackSpeed; LK.getSound('shoot').play(); } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { LK.showGameOver(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0d1117 }); /**** * Game Code ****/ // Game variables LK.getSound('metin2likethat').play(); var hero; var enemies = []; var bullets = []; var goldItems = []; var equipmentItems = []; var healthPotions = []; var playerGold = 0; var playerEquipment = []; var waveNumber = 1; var enemySpawnTimer = 0; var enemiesPerWave = 3; // UI Elements var goldText = new Text2('Gold: 0', { size: 40, fill: '#FFD700' }); goldText.anchor.set(0, 0); goldText.x = 120; goldText.y = 50; LK.gui.topLeft.addChild(goldText); var waveText = new Text2('Wave: 1', { size: 40, fill: '#FFFFFF' }); waveText.anchor.set(0.5, 0); waveText.x = 0; waveText.y = 50; LK.gui.top.addChild(waveText); var healthText = new Text2('Health: 100', { size: 40, fill: '#FF0000' }); healthText.anchor.set(1, 0); healthText.x = 0; healthText.y = 50; LK.gui.topRight.addChild(healthText); // Upgrade buttons var damageUpgradeBtn = new Text2('Damage +10 (Cost: 50)', { size: 35, fill: '#FFFFFF' }); damageUpgradeBtn.anchor.set(0.5, 1); damageUpgradeBtn.x = 0; damageUpgradeBtn.y = -200; LK.gui.bottom.addChild(damageUpgradeBtn); var speedUpgradeBtn = new Text2('Speed +10 (Cost: 75)', { size: 35, fill: '#FFFFFF' }); speedUpgradeBtn.anchor.set(0.5, 1); speedUpgradeBtn.x = 0; speedUpgradeBtn.y = -150; LK.gui.bottom.addChild(speedUpgradeBtn); var rangeUpgradeBtn = new Text2('Range +50 (Cost: 100)', { size: 35, fill: '#FFFFFF' }); rangeUpgradeBtn.anchor.set(0.5, 1); rangeUpgradeBtn.x = 0; rangeUpgradeBtn.y = -100; LK.gui.bottom.addChild(rangeUpgradeBtn); var healthUpgradeBtn = new Text2('Health +25 (Cost: 60)', { size: 35, fill: '#FFFFFF' }); healthUpgradeBtn.anchor.set(0.5, 1); healthUpgradeBtn.x = 0; healthUpgradeBtn.y = -50; LK.gui.bottom.addChild(healthUpgradeBtn); var equipmentUpgradeBtn = new Text2('Upgrade Equipment (Cost: 200)', { size: 35, fill: '#FFFFFF' }); equipmentUpgradeBtn.anchor.set(0.5, 1); equipmentUpgradeBtn.x = 0; equipmentUpgradeBtn.y = 0; LK.gui.bottom.addChild(equipmentUpgradeBtn); var equipmentLevelText = new Text2('Equipment Level: 0', { size: 30, fill: '#8a2be2' }); equipmentLevelText.anchor.set(0, 0); equipmentLevelText.x = 120; equipmentLevelText.y = 100; LK.gui.topLeft.addChild(equipmentLevelText); // Initialize hero at center hero = new Hero(); hero.x = 1024; hero.y = 1366; game.addChild(hero); // Upgrade costs var damageCost = 50; var speedCost = 75; var rangeCost = 100; var healthCost = 60; var equipmentCost = 200; var equipmentLevel = 0; // Upgrade button handlers damageUpgradeBtn.down = function () { if (playerGold >= damageCost) { playerGold -= damageCost; hero.damage += 10; damageCost = Math.floor(damageCost * 1.5); goldText.setText('Gold: ' + playerGold); damageUpgradeBtn.setText('Damage +10 (Cost: ' + damageCost + ')'); LK.getSound('upgrade').play(); } }; speedUpgradeBtn.down = function () { if (playerGold >= speedCost) { playerGold -= speedCost; hero.attackSpeed = Math.max(10, hero.attackSpeed - 5); speedCost = Math.floor(speedCost * 1.5); goldText.setText('Gold: ' + playerGold); speedUpgradeBtn.setText('Speed +10 (Cost: ' + speedCost + ')'); LK.getSound('upgrade').play(); } }; rangeUpgradeBtn.down = function () { if (playerGold >= rangeCost) { playerGold -= rangeCost; hero.range += 50; rangeCost = Math.floor(rangeCost * 1.5); goldText.setText('Gold: ' + playerGold); rangeUpgradeBtn.setText('Range +50 (Cost: ' + rangeCost + ')'); LK.getSound('upgrade').play(); } }; healthUpgradeBtn.down = function () { if (playerGold >= healthCost) { playerGold -= healthCost; hero.maxHealth += 25; hero.health = Math.min(hero.health + 25, hero.maxHealth); healthCost = Math.floor(healthCost * 1.4); goldText.setText('Gold: ' + playerGold); healthUpgradeBtn.setText('Health +25 (Cost: ' + healthCost + ')'); LK.getSound('upgrade').play(); } }; equipmentUpgradeBtn.down = function () { if (playerGold >= equipmentCost && playerEquipment.length > 0) { playerGold -= equipmentCost; equipmentLevel++; hero.damage += 15; hero.attackSpeed = Math.max(8, hero.attackSpeed - 3); equipmentCost = Math.floor(equipmentCost * 1.6); goldText.setText('Gold: ' + playerGold); equipmentUpgradeBtn.setText('Upgrade Equipment (Cost: ' + equipmentCost + ')'); equipmentLevelText.setText('Equipment Level: ' + equipmentLevel); LK.getSound('upgrade').play(); } }; function spawnEnemy() { // Determine enemy type based on wave and random chance var enemyType = 'basic'; var rand = Math.random(); if (waveNumber >= 10 && rand < 0.05) { enemyType = 'boss'; } else if (waveNumber >= 5 && rand < 0.2) { enemyType = 'tank'; } else if (waveNumber >= 3 && rand < 0.3) { enemyType = 'fast'; } var enemy = new Enemy(enemyType); // Random spawn position at screen edges var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top enemy.x = Math.random() * 2048; enemy.y = -50; break; case 1: // Right enemy.x = 2098; enemy.y = Math.random() * 2732; break; case 2: // Bottom enemy.x = Math.random() * 2048; enemy.y = 2782; break; case 3: // Left enemy.x = -50; enemy.y = Math.random() * 2732; break; } // Scale enemy stats with wave number based on type var healthMultiplier = 1 + (waveNumber - 1) * 0.3; var speedMultiplier = 1 + (waveNumber - 1) * 0.15; var goldMultiplier = 1 + (waveNumber - 1) * 0.4; enemy.health = Math.floor(enemy.health * healthMultiplier); enemy.maxHealth = enemy.health; enemy.speed = enemy.speed * speedMultiplier; enemy.goldReward = Math.floor(enemy.goldReward * goldMultiplier); enemies.push(enemy); game.addChild(enemy); } game.update = function () { // Update health display healthText.setText('Health: ' + hero.health); // Enemy spawning enemySpawnTimer++; var spawnRate = Math.max(30, 120 - waveNumber * 5); if (enemySpawnTimer >= spawnRate) { if (enemies.length < enemiesPerWave + Math.floor(waveNumber / 2)) { spawnEnemy(); enemySpawnTimer = 0; } } // Check for wave completion if (LK.ticks % 1800 === 0) { // Every 30 seconds waveNumber++; enemiesPerWave = Math.min(15, 3 + Math.floor(waveNumber / 2)); waveText.setText('Wave: ' + waveNumber); } // Update all game objects for (var i = bullets.length - 1; i >= 0; i--) { if (bullets[i].update) { bullets[i].update(); } } for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i].update) { enemies[i].update(); } } for (var i = goldItems.length - 1; i >= 0; i--) { if (goldItems[i].update) { goldItems[i].update(); } } for (var i = equipmentItems.length - 1; i >= 0; i--) { if (equipmentItems[i].update) { equipmentItems[i].update(); } } for (var i = healthPotions.length - 1; i >= 0; i--) { if (healthPotions[i].update) { healthPotions[i].update(); } } };
===================================================================
--- original.js
+++ change.js
@@ -134,9 +134,13 @@
game.addChild(healthPotion);
}
// Drop equipment (15% chance for boss, 8% for tank, 5% for others)
var equipmentChance = 0.05;
- if (self.type === 'boss') equipmentChance = 0.15;else if (self.type === 'tank') equipmentChance = 0.08;
+ if (self.type === 'boss') {
+ equipmentChance = 0.15;
+ } else if (self.type === 'tank') {
+ equipmentChance = 0.08;
+ }
if (Math.random() < equipmentChance) {
var equipment = new Equipment();
equipment.x = self.x;
equipment.y = self.y;
@@ -324,8 +328,9 @@
/****
* Game Code
****/
// Game variables
+LK.getSound('metin2likethat').play();
var hero;
var enemies = [];
var bullets = [];
var goldItems = [];