User prompt
AFTER LEVEL 15, THE ATTACK SPEED OF THE MAIN CHARACTER AND THE ENEMY WILL NO LONGER INCREASE, AND THE HEALTH VALUE OF THE ENEMY WILL INCREASE BY 50% FOR EVERY EXTRA LEVEL AFTER LEVEL 20.
User prompt
THE LEVEL OF THE ENEMY THAT WILL COME AGAINST ME IS AS I TOLD YOU. IT WILL ALWAYS BE EITHER 1 LEVEL LOWER THAN ME, OR THE SAME LEVEL AS ME, OR 1 LEVEL HIGHER, OR 2 LEVEL HIGHER. WHEN I AM LEVEL 20, HE MAY BE ONE OF THE LEVELS 19-20-21-22, ADD THIS TO THE GAME
User prompt
After level 10, both the main character and the enemies gain random stat increases with each level-up. The stats affected are: health, attack, and speed. Each stat increases by a random percentage between 5% and 20% per level. The difference between the main character and enemies is: Main Character: The percentage is applied to the current value, so the increase is compounded. Example: Level 10 health: 100 Level 11 health: 100 + 15% → 115 Level 12 health: 115 + 10% → 126.5 Enemy: The percentage increase at each level is applied to the original (base) value at level 10. Example: Level 10 base health: 500 Level 11 health: 500 + 12% → 560 Level 12 health: 500 + 12% + 8% → 500 * (1 + 0.12 + 0.08) → 600 Not compounded. So, the player scales exponentially, while enemies scale linearly but with randomness. //// BUNU OYUNA EKLE
User prompt
WHEN THE MAIN CHARACTER'S HEALTH RANKS, HIS HEALTH RISES 1 SECOND, SO THAT HE CAN FIGHT AGAIN WHEN HIS HEALTH REACHES 100%, AND LET'S SEE HIS HEALTH REFILLED ,, WHILE THIS HAPPENS, THE ENEMY IN FRONT OF ME WILL BE DESTROYED, SO THAT I CAN SUMMON A NEW ENEMY WHEN MY HEALTH IS FULL
User prompt
OKAY NOW CHECK OUT WHAT I SAID AND FIX YOUR MISTAKE BECAUSE I CANNOT SUMMON ENEMIES AT THE START OF THE GAME.
User prompt
YOU CAN ONLY SUMMON NEW ENEMY WHEN THE MAIN CHARACTER'S HEALTH IS 100%
User prompt
WHEN THE MAIN CHARACTER'S HEALTH RANGE, HIS HEALTH RISES 1 SECOND, SO THAT HE CAN FIGHT AGAIN WHEN HIS HEALTH REACHES 100%, AND LET'S SEE HIS HEALTH ARE FULL, WHILE THIS HAPPENS, THE ENEMY IN FRONT OF ME WILL BE DESTROYED BUT NOT DROP GOLD
User prompt
WHEN THE MAIN CHARACTER'S HEALTH RANKS, HIS HEALTH RISES 1 SECOND, SO THAT HE CAN FIGHT AGAIN WHEN HIS HEALTH REACHES 100%, AND LET'S SEE HIS HEALTH REFILLED
User prompt
WHEN MY ENEMY'S HEALTH IS OUT, HIS HEALTH RISES 1 SECOND, SO THAT HE CAN FIGHT AGAIN WHEN HIS HEALTH REACHES 100%, AND LET'S SEE HIS HEALTH REFILLED
User prompt
WHEN MY ENEMY'S HEALTH RANKS, HIS HEALTH RISES BY 1 EVERY SECOND SO THAT HE CAN FIGHT AGAIN WHEN HIS HEALTH REACHES 100%
User prompt
DO IT SO THAT THE LEVEL OF THE ENEMY IN FRONT OF ME IS 15% PROBABILITY OF THE ENEMY BEING 1 LEVEL HIGHER THAN ME, 50% PROBABILITY OF THE ENEMY BEING 1 LEVEL LESS THAN ME, 25% PROBABILITY OF THE ENEMY BEING 1 LEVEL LESS THAN ME, 10% PROBABILITY OF THE ENEMY BEING 2 LEVEL HIGHER THAN ME.
User prompt
Make all the texts in the game a little smaller and add a white glow effect behind them
User prompt
Write "find enemy!" above the spawn enemy button and write the amount of gold required to upgrade under the upgrade button above.
User prompt
Remove the spawn enemy text at the bottom and upgrade lvl text at the top
User prompt
Move the enemy's stats slightly to the right
User prompt
At the bottom, in the section where the character and enemy stats are located, there are pictures of the enemy and the main character. Remove them and move the enemy stats a little further to the left.
User prompt
move the position of the enemy image a little lower
User prompt
move the position of the main character's image a little lower
User prompt
tone down the main character a bit
User prompt
Add the background image of the game to the visual named background in the assets.
User prompt
Please fix the bug: 'TypeError: Cannot use 'in' operator to search for 'tint' in null' in or related to this line: 'tween(currentEnemy, {' Line Number: 373
User prompt
The gold was taken to the wrong place, my gold amount is written on the top right ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Create gold objects as much as the amount of gold dropped by the enemy and these golds will be collected automatically. While they are being collected, these objects will float to the place where the amount of gold is written, will be pulled and will disappear when they reach there, my gold amount will increase. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Every time I kill an enemy, the amount of gold that is written will drop randomly and will be as I wrote. 🔹 Level 1 gold : 1 - 5 random 🔹 Level 2 gold : 3 - 8 random 🔹 Level 3 gold : 5 - 12 random 🔹 Level 4 gold : 8 - 16 random 🔹 Level 5 gold : 12 - 20 random 🔹 Level 6 gold : 15 - 25 random 🔹 Level 7 gold : 20 - 32 random 🔹 Level 8 gold : 25 - 40 random 🔹 Level 9 gold : 30 - 48 random 🔹 Level 10 gold : 35 - 60 random
User prompt
When you press the "spawn enemy" button, when you summon the enemy, they will automatically fight each other. The enemy and the main character will fight each other.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGfx = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 1; self.x = 600; self.y = 2732 / 2; self.isAlive = true; // Animate enemy in self.spawnAnim = function () { self.scaleX = 0.5; self.scaleY = 0.5; tween(self, { scaleX: 1, scaleY: 1 }, { duration: 180, easing: tween.bounceOut }); }; // Animate enemy defeat self.defeatAnim = function (onFinish) { tween(self, { alpha: 0, scaleX: 1.3, scaleY: 1.3 }, { duration: 180, easing: tween.easeIn, onFinish: onFinish }); }; return self; }); // Gold class var Gold = Container.expand(function () { var self = Container.call(this); var goldGfx = self.attachAsset('gold', { anchorX: 0.5, anchorY: 0.5 }); self.x = 600; self.y = 2732 / 2; // Animate gold drop self.dropAnim = function (targetX, targetY, onFinish) { tween(self, { y: targetY }, { duration: 350, easing: tween.bounceOut, onFinish: onFinish }); }; // Animate gold collect self.collectAnim = function (targetX, targetY, onFinish) { tween(self, { x: targetX, y: targetY, scaleX: 0.3, scaleY: 0.3, alpha: 0 }, { duration: 320, easing: tween.cubicIn, onFinish: onFinish }); }; return self; }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGfx = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; self.x = 200; self.y = 2732 / 2; // For upgrade animation self.flashUpgrade = function () { tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 120, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 120, easing: tween.easeIn }); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222a36 }); /**** * Game Code ****/ // --- Background Image --- // Hero: red box, left side // Enemy: blue ellipse // Gold: yellow ellipse // Spawn Enemy Button: green box // Upgrade Button: orange box var backgroundImg = LK.getAsset('backgraund', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732 }); game.addChild(backgroundImg); // --- Global State --- var hero = new Hero(); game.addChild(hero); var currentEnemy = null; var golds = []; var goldAmount = 0; var heroLevel = 1; // Auto-fight timer handles var heroAutoAttackTimer = null; var enemyAutoAttackTimer = null; // --- GUI Elements --- // Gold display (top right) var goldTxt = new Text2('0', { size: 70, fill: 0xFFE066, glow: { color: 0xffffff, distance: 10, strength: 2 } }); goldTxt.anchor.set(1, 0); // right, top LK.gui.topRight.addChild(goldTxt); // --- Hero and Enemy Stats Display --- // Removed hero and enemy images from the bottom stats area // Hero stats text (bottom left) var heroStatsTxt = new Text2('', { size: 40, fill: "#000", glow: { color: 0xffffff, distance: 8, strength: 2 } }); heroStatsTxt.anchor.set(0, 1); heroStatsTxt.x = 30; heroStatsTxt.y = LK.gui.bottom.height - 30; LK.gui.bottomLeft.addChild(heroStatsTxt); // Enemy stats text (bottom right, moved slightly to the right) var enemyStatsTxt = new Text2('', { size: 40, fill: "#000", glow: { color: 0xffffff, distance: 8, strength: 2 } }); enemyStatsTxt.anchor.set(1, 1); // Move enemy stats slightly to the right (less offset from right edge) enemyStatsTxt.x = LK.gui.bottomRight.width - 130; enemyStatsTxt.y = LK.gui.bottom.height - 30; LK.gui.bottomRight.addChild(enemyStatsTxt); // Upgrade button (top center) var upgradeBtn = LK.getAsset('upgradeBtn', { anchorX: 0.5, anchorY: 0.5 }); // Place upgradeBtn at top center, but not in the top left 100x100 area // Use LK.gui.top (centered horizontally, below top edge) upgradeBtn.x = LK.gui.top.width / 2; upgradeBtn.y = 100 + upgradeBtn.height / 2; // Add gold required text under the upgrade button var upgradeCostTxt = new Text2("", { size: 40, fill: 0x222A36, glow: { color: 0xffffff, distance: 8, strength: 2 } }); upgradeCostTxt.anchor.set(0.5, 0); upgradeCostTxt.x = upgradeBtn.x; upgradeCostTxt.y = upgradeBtn.y + upgradeBtn.height / 2 + 10; LK.gui.top.addChild(upgradeCostTxt); LK.gui.top.addChild(upgradeBtn); // Spawn enemy button (bottom center) var spawnBtn = LK.getAsset('spawnBtn', { anchorX: 0.5, anchorY: 0.5 }); // Place spawnBtn at bottom center, above the very bottom edge spawnBtn.x = LK.gui.bottom.width / 2; spawnBtn.y = LK.gui.bottom.height - 100 - spawnBtn.height / 2; // Add "find enemy!" text above the spawn button var findEnemyTxt = new Text2("find enemy!", { size: 45, fill: 0x222A36, glow: { color: 0xffffff, distance: 8, strength: 2 } }); findEnemyTxt.anchor.set(0.5, 1); findEnemyTxt.x = spawnBtn.x; findEnemyTxt.y = spawnBtn.y - spawnBtn.height / 2 - 20; LK.gui.bottom.addChild(findEnemyTxt); LK.gui.bottom.addChild(spawnBtn); // --- Helper Functions --- function updateGoldDisplay() { goldTxt.setText(goldAmount); } function updateUpgradeDisplay() { // Show gold required to upgrade under the upgrade button if (typeof upgradeCostTxt !== "undefined") { var nextUpgradeCost = heroLevel * 5; upgradeCostTxt.setText("Gold required: " + nextUpgradeCost); } } // Update hero stats display function updateHeroStatsDisplay() { var stats = getStatsForLevel(heroLevel, "hero"); var hpDisplay = typeof hero.currentHp === "number" ? Math.max(0, Math.round(hero.currentHp)) + " / " + stats.hp : stats.hp; heroStatsTxt.setText("Hero\n" + "Level: " + heroLevel + "\n" + "Health: " + hpDisplay + "\n" + "Attack: " + stats.atk + "\n" + "Atk Spd: " + stats.atkSpd); } // Update enemy stats display function updateEnemyStatsDisplay() { if (currentEnemy && currentEnemy.isAlive) { var enemyLevel = currentEnemy.level || heroLevel; var stats = getStatsForLevel(enemyLevel, "enemy"); var hpDisplay = typeof currentEnemy.hp === "number" ? Math.max(0, Math.round(currentEnemy.hp)) + " / " + stats.hp : stats.hp; enemyStatsTxt.setText("Enemy\n" + "Level: " + enemyLevel + "\n" + "Health: " + hpDisplay + "\n" + "Attack: " + currentEnemy.attack + "\n" + "Atk Spd: " + currentEnemy.attackSpeed); } else { enemyStatsTxt.setText("Enemy\n-"); } } // --- Game Logic --- // Spawn enemy logic // Enemy stat table for levels 1-10 (fixed stats) var enemyStatsByLevel = [ // Level 1 { hp: 60, atk: 10, atkSpd: 2 }, // Level 2 { hp: 95, atk: 14, atkSpd: 3 }, // Level 3 { hp: 130, atk: 18, atkSpd: 4 }, // Level 4 { hp: 170, atk: 23, atkSpd: 4 }, // Level 5 { hp: 215, atk: 27, atkSpd: 5 }, // Level 6 { hp: 265, atk: 32, atkSpd: 6 }, // Level 7 { hp: 320, atk: 38, atkSpd: 6 }, // Level 8 { hp: 380, atk: 45, atkSpd: 7 }, // Level 9 { hp: 445, atk: 53, atkSpd: 8 }, // Level 10 { hp: 515, atk: 62, atkSpd: 9 }]; // --- Stat scaling logic for hero and enemy after level 10 --- // Store hero stat growth per level (compounded) and enemy stat growth per level (linear from level 10 base) var heroStatGrowth = { hp: [enemyStatsByLevel[9].hp], atk: [enemyStatsByLevel[9].atk], atkSpd: [enemyStatsByLevel[9].atkSpd] }; var enemyStatGrowth = { hp: [enemyStatsByLevel[9].hp], atk: [enemyStatsByLevel[9].atk], atkSpd: [enemyStatsByLevel[9].atkSpd] }; // Store enemy stat percent increases per level (for linear scaling) var enemyStatPercents = { hp: [], atk: [], atkSpd: [] }; // Store hero stat percent increases per level (for compounded scaling) var heroStatPercents = { hp: [], atk: [], atkSpd: [] }; // Helper to get random percent between 5% and 20% function randomPercent() { return 0.05 + Math.random() * 0.15; } // Precompute stat growth up to a reasonable max level (e.g. 100) function ensureStatGrowthUpTo(level) { var maxComputed = heroStatGrowth.hp.length + 9; // since index 0 is level 10 for (var lvl = maxComputed + 1; lvl <= level; lvl++) { // HERO: compounded var prevHeroHp = heroStatGrowth.hp[heroStatGrowth.hp.length - 1]; var prevHeroAtk = heroStatGrowth.atk[heroStatGrowth.atk.length - 1]; var prevHeroAtkSpd = heroStatGrowth.atkSpd[heroStatGrowth.atkSpd.length - 1]; var heroHpPct = randomPercent(); var heroAtkPct = randomPercent(); // After level 15, hero attack speed no longer increases var heroAtkSpdPct = lvl > 15 ? 0 : randomPercent(); heroStatPercents.hp.push(heroHpPct); heroStatPercents.atk.push(heroAtkPct); heroStatPercents.atkSpd.push(heroAtkSpdPct); heroStatGrowth.hp.push(Math.round(prevHeroHp * (1 + heroHpPct))); heroStatGrowth.atk.push(Math.round(prevHeroAtk * (1 + heroAtkPct))); heroStatGrowth.atkSpd.push(Math.round(prevHeroAtkSpd * (1 + heroAtkSpdPct))); // ENEMY: linear from level 10 base var baseHp = enemyStatsByLevel[9].hp; var baseAtk = enemyStatsByLevel[9].atk; var baseAtkSpd = enemyStatsByLevel[9].atkSpd; var enemyHpPct = randomPercent(); var enemyAtkPct = randomPercent(); // After level 15, enemy attack speed no longer increases var enemyAtkSpdPct = lvl > 15 ? 0 : randomPercent(); enemyStatPercents.hp.push(enemyHpPct); enemyStatPercents.atk.push(enemyAtkPct); enemyStatPercents.atkSpd.push(enemyAtkSpdPct); // For linear, sum all previous percent increases var totalHpPct = 0; var totalAtkPct = 0; var totalAtkSpdPct = 0; for (var i = 0; i < enemyStatPercents.hp.length; i++) totalHpPct += enemyStatPercents.hp[i]; for (var i = 0; i < enemyStatPercents.atk.length; i++) totalAtkPct += enemyStatPercents.atk[i]; for (var i = 0; i < enemyStatPercents.atkSpd.length; i++) totalAtkSpdPct += enemyStatPercents.atkSpd[i]; // After level 20, enemy health increases by an additional 50% per level var extraHpMultiplier = 1; if (lvl > 20) { // For each level above 20, multiply by 1.5 for each extra level extraHpMultiplier = Math.pow(1.5, lvl - 20); } enemyStatGrowth.hp.push(Math.round(baseHp * (1 + totalHpPct) * extraHpMultiplier)); enemyStatGrowth.atk.push(Math.round(baseAtk * (1 + totalAtkPct))); enemyStatGrowth.atkSpd.push(Math.round(baseAtkSpd * (1 + totalAtkSpdPct))); } } // Returns stats for a given level and type ('hero' or 'enemy') function getStatsForLevel(level, type) { if (level <= 10) { var idx = Math.max(0, Math.min(enemyStatsByLevel.length - 1, level - 1)); var stats = enemyStatsByLevel[idx]; return { hp: stats.hp, atk: stats.atk, atkSpd: stats.atkSpd }; } ensureStatGrowthUpTo(level); var idx = level - 10; if (type === "hero") { return { hp: heroStatGrowth.hp[idx], atk: heroStatGrowth.atk[idx], atkSpd: heroStatGrowth.atkSpd[idx] }; } else { return { hp: enemyStatGrowth.hp[idx], atk: enemyStatGrowth.atk[idx], atkSpd: enemyStatGrowth.atkSpd[idx] }; } } // For backward compatibility, keep getEnemyStatsForLevel for hero stats (used in refill, etc) function getEnemyStatsForLevel(level) { return getStatsForLevel(level, "hero"); } function spawnEnemy() { if (currentEnemy && currentEnemy.isAlive) return; // Only one at a time if (hero.healthRefilling) return; // Don't allow spawn while refilling var enemy = new Enemy(); // Place enemy on the far right, vertically aligned with hero enemy.x = 2048 - 200; // 200px from the right edge, matching hero's 200px from left enemy.y = hero.y; // Determine enemy level: always one of heroLevel-1, heroLevel, heroLevel+1, or heroLevel+2 var possibleLevels = [Math.max(1, heroLevel - 1), heroLevel, heroLevel + 1, heroLevel + 2]; // Remove duplicates and clamp to at least 1 var uniqueLevels = []; for (var i = 0; i < possibleLevels.length; i++) { var lvl = Math.max(1, possibleLevels[i]); if (uniqueLevels.indexOf(lvl) === -1) uniqueLevels.push(lvl); } // Randomly pick one var enemyLevel = uniqueLevels[Math.floor(Math.random() * uniqueLevels.length)]; // Clamp enemyLevel to valid range for stats table enemyLevel = Math.max(1, Math.min(enemyStatsByLevel.length + heroStatGrowth.hp.length, enemyLevel)); // Get stats for this level (enemy uses linear scaling after level 10) var stats = getStatsForLevel(enemyLevel, "enemy"); enemy.hp = stats.hp; enemy.attack = stats.atk; enemy.attackSpeed = stats.atkSpd; enemy.isAlive = true; enemy.spawnAnim(); game.addChild(enemy); currentEnemy = enemy; // Store the enemy's level for display currentEnemy.level = enemyLevel; updateEnemyStatsDisplay(); // --- Start auto-fight timers --- if (typeof heroAutoAttackTimer !== "undefined" && heroAutoAttackTimer) { LK.clearInterval(heroAutoAttackTimer); heroAutoAttackTimer = null; } if (typeof enemyAutoAttackTimer !== "undefined" && enemyAutoAttackTimer) { LK.clearInterval(enemyAutoAttackTimer); enemyAutoAttackTimer = null; } // Get hero stats for this level (hero uses compounded scaling after level 10) var heroStats = getStatsForLevel(heroLevel, "hero"); hero.currentHp = heroStats.hp; hero.attack = heroStats.atk; hero.attackSpeed = heroStats.atkSpd; // Hero attacks enemy heroAutoAttackTimer = LK.setInterval(function () { if (!currentEnemy || !currentEnemy.isAlive) { LK.clearInterval(heroAutoAttackTimer); heroAutoAttackTimer = null; return; } currentEnemy.hp -= hero.attack; // Flash enemy if (currentEnemy) { tween(currentEnemy, { tint: 0xffffff }, { duration: 60, onFinish: function onFinish() { if (currentEnemy) { tween(currentEnemy, { tint: 0x2a6bde }, { duration: 60 }); } } }); } updateEnemyStatsDisplay(); if (currentEnemy.hp <= 0) { defeatEnemy(); LK.clearInterval(heroAutoAttackTimer); heroAutoAttackTimer = null; LK.clearInterval(enemyAutoAttackTimer); enemyAutoAttackTimer = null; } }, 1000 / hero.attackSpeed); // Enemy attacks hero enemyAutoAttackTimer = LK.setInterval(function () { if (!currentEnemy || !currentEnemy.isAlive) { LK.clearInterval(enemyAutoAttackTimer); enemyAutoAttackTimer = null; return; } if (typeof hero.currentHp !== "number") { // Defensive: ensure hero.currentHp is set var hStats = getEnemyStatsForLevel(heroLevel); hero.currentHp = hStats.hp; } hero.currentHp -= currentEnemy.attack; // Flash hero tween(hero, { tint: 0xffffff }, { duration: 60, onFinish: function onFinish() { tween(hero, { tint: 0xd83318 }, { duration: 60 }); } }); updateHeroStatsDisplay(); if (hero.currentHp <= 0) { // Hero defeated, stop fighting hero.currentHp = 0; updateHeroStatsDisplay(); // Optionally, you can add defeat logic here (e.g. show game over) LK.clearInterval(heroAutoAttackTimer); heroAutoAttackTimer = null; LK.clearInterval(enemyAutoAttackTimer); enemyAutoAttackTimer = null; // Start health refill (handled in update loop) hero.healthRefilling = false; // Will be set to true in update loop } }, 1000 / currentEnemy.attackSpeed); } // Defeat enemy logic function defeatEnemy() { if (!currentEnemy || !currentEnemy.isAlive) return; currentEnemy.isAlive = false; // Stop auto-fight timers if (typeof heroAutoAttackTimer !== "undefined" && heroAutoAttackTimer) { LK.clearInterval(heroAutoAttackTimer); heroAutoAttackTimer = null; } if (typeof enemyAutoAttackTimer !== "undefined" && enemyAutoAttackTimer) { LK.clearInterval(enemyAutoAttackTimer); enemyAutoAttackTimer = null; } currentEnemy.defeatAnim(function () { if (currentEnemy) { currentEnemy.destroy(); currentEnemy = null; updateEnemyStatsDisplay(); } }); // --- Gold drop amount table per level --- var goldDropByLevel = [{ min: 1, max: 5 }, // Level 1 { min: 3, max: 8 }, // Level 2 { min: 5, max: 12 }, // Level 3 { min: 8, max: 16 }, // Level 4 { min: 12, max: 20 }, // Level 5 { min: 15, max: 25 }, // Level 6 { min: 20, max: 32 }, // Level 7 { min: 25, max: 40 }, // Level 8 { min: 30, max: 48 }, // Level 9 { min: 35, max: 60 } // Level 10 ]; // Determine gold drop amount for this level var goldDropStats = goldDropByLevel[Math.max(0, Math.min(heroLevel - 1, goldDropByLevel.length - 1))]; var goldDropAmount = Math.floor(Math.random() * (goldDropStats.max - goldDropStats.min + 1)) + goldDropStats.min; // Drop gold at the far right (where enemy was) // Animate and auto-collect gold after enemy defeat // Calculate the gold display position in game coordinates (top right, where goldTxt is) var goldDisplayGlobal = LK.gui.topRight.toGlobal({ x: goldTxt.x, y: goldTxt.y }); var goldDisplayGamePos = game.toLocal(goldDisplayGlobal); for (var i = 0; i < goldDropAmount; i++) { var gold = new Gold(); gold.x = 2048 - 200; gold.y = hero.y; gold.scaleX = 1; gold.scaleY = 1; gold.alpha = 1; game.addChild(gold); golds.push(gold); // Drop to random y near enemy var dropY = gold.y + (Math.random() * 120 - 60); (function (goldObj, idx) { goldObj.dropAnim(goldObj.x, dropY, function () { // Stagger collection for nice effect LK.setTimeout(function () { // Animate to gold display and collect goldObj.collectAnim(goldDisplayGamePos.x, goldDisplayGamePos.y, function () { goldAmount += 1; updateGoldDisplay(); goldObj.destroy(); }); }, 80 * idx); }); })(gold, i); } } // Collect gold logic function collectGold(gold) { // Animate to gold display var guiGoldPos = LK.gui.topRight.toLocal(gold.toGlobal({ x: 0, y: 0 })); goldAmount += 1; updateGoldDisplay(); gold.collectAnim(guiGoldPos.x, guiGoldPos.y, function () { gold.destroy(); }); } // Upgrade logic function upgradeHero() { var upgradeCost = heroLevel * 5; if (goldAmount < upgradeCost) { // Flash gold text red tween(goldTxt, { tint: 0xff4444 }, { duration: 120, onFinish: function onFinish() { tween(goldTxt, { tint: 0xFFE066 }, { duration: 120 }); } }); return; } goldAmount -= upgradeCost; heroLevel += 1; hero.level = heroLevel; updateGoldDisplay(); updateUpgradeDisplay(); updateHeroStatsDisplay(); updateEnemyStatsDisplay(); hero.flashUpgrade(); } // --- Event Handlers --- // Spawn button tap spawnBtn.down = function (x, y, obj) { spawnEnemy(); }; // Enemy tap (defeat) function onEnemyDown(x, y, obj) { if (!currentEnemy || !currentEnemy.isAlive) return; currentEnemy.hp -= 1; // Flash enemy tween(currentEnemy, { tint: 0xffffff }, { duration: 60, onFinish: function onFinish() { tween(currentEnemy, { tint: 0x2a6bde }, { duration: 60 }); } }); if (currentEnemy.hp <= 0) { defeatEnemy(); } } // Gold tap (collect) function onGoldDown(x, y, obj) { for (var i = golds.length - 1; i >= 0; i--) { var gold = golds[i]; if (gold && gold.containsPoint && gold.containsPoint({ x: x, y: y })) { collectGold(gold); golds.splice(i, 1); break; } } } // Upgrade button tap upgradeBtn.down = function (x, y, obj) { upgradeHero(); }; // --- Attach event handlers to game --- game.down = function (x, y, obj) { // Check if tap is on enemy if (currentEnemy && currentEnemy.isAlive && currentEnemy.containsPoint && currentEnemy.containsPoint({ x: x, y: y })) { onEnemyDown(x, y, obj); return; } // Check if tap is on any gold for (var i = golds.length - 1; i >= 0; i--) { var gold = golds[i]; if (gold && gold.containsPoint && gold.containsPoint({ x: x, y: y })) { collectGold(gold); golds.splice(i, 1); return; } } // (Buttons handled by their own .down) }; // --- Game update loop --- game.update = function () { // Remove golds that are invisible for (var i = golds.length - 1; i >= 0; i--) { var gold = golds[i]; if (gold.alpha <= 0.01) { gold.destroy(); golds.splice(i, 1); } } // --- Hero health refill logic --- if (typeof hero.healthRefilling === "undefined") hero.healthRefilling = false; if (typeof hero.refillStartTime === "undefined") hero.refillStartTime = 0; if (typeof hero.refillDuration === "undefined") hero.refillDuration = 1000; if (typeof hero.refillFromHp === "undefined") hero.refillFromHp = 0; if (typeof hero.refillToHp === "undefined") hero.refillToHp = 0; if (typeof hero.currentHp === "number" && hero.currentHp <= 0 && !hero.healthRefilling) { // Start refill hero.healthRefilling = true; hero.refillStartTime = Date.now(); var stats = getStatsForLevel(heroLevel, "hero"); hero.refillFromHp = 0; hero.refillToHp = stats.hp; // Destroy enemy immediately (so a new one can only be summoned after refill) if (currentEnemy && currentEnemy.isAlive) { currentEnemy.isAlive = false; currentEnemy.defeatAnim(function () { if (currentEnemy) { currentEnemy.destroy(); currentEnemy = null; updateEnemyStatsDisplay(); } }); } } if (hero.healthRefilling) { var now = Date.now(); var elapsed = now - hero.refillStartTime; var t = Math.min(1, elapsed / hero.refillDuration); var stats = getStatsForLevel(heroLevel, "hero"); hero.currentHp = Math.round(hero.refillFromHp + (hero.refillToHp - hero.refillFromHp) * t); if (t >= 1) { hero.currentHp = stats.hp; hero.healthRefilling = false; } } // Keep hero slightly lower than vertical center hero.y = 2732 / 2 + 200; // Keep enemy vertically centered and at far right if alive if (currentEnemy && currentEnemy.isAlive) { currentEnemy.x = 2048 - 200; currentEnemy.y = hero.y + 100; // Move enemy a little lower } updateHeroStatsDisplay(); updateEnemyStatsDisplay(); }; // --- Initial UI state --- updateGoldDisplay(); updateUpgradeDisplay(); updateHeroStatsDisplay(); updateEnemyStatsDisplay();
===================================================================
--- original.js
+++ change.js
@@ -365,9 +365,10 @@
var prevHeroAtk = heroStatGrowth.atk[heroStatGrowth.atk.length - 1];
var prevHeroAtkSpd = heroStatGrowth.atkSpd[heroStatGrowth.atkSpd.length - 1];
var heroHpPct = randomPercent();
var heroAtkPct = randomPercent();
- var heroAtkSpdPct = randomPercent();
+ // After level 15, hero attack speed no longer increases
+ var heroAtkSpdPct = lvl > 15 ? 0 : randomPercent();
heroStatPercents.hp.push(heroHpPct);
heroStatPercents.atk.push(heroAtkPct);
heroStatPercents.atkSpd.push(heroAtkSpdPct);
heroStatGrowth.hp.push(Math.round(prevHeroHp * (1 + heroHpPct)));
@@ -378,9 +379,10 @@
var baseAtk = enemyStatsByLevel[9].atk;
var baseAtkSpd = enemyStatsByLevel[9].atkSpd;
var enemyHpPct = randomPercent();
var enemyAtkPct = randomPercent();
- var enemyAtkSpdPct = randomPercent();
+ // After level 15, enemy attack speed no longer increases
+ var enemyAtkSpdPct = lvl > 15 ? 0 : randomPercent();
enemyStatPercents.hp.push(enemyHpPct);
enemyStatPercents.atk.push(enemyAtkPct);
enemyStatPercents.atkSpd.push(enemyAtkSpdPct);
// For linear, sum all previous percent increases
@@ -389,9 +391,15 @@
var totalAtkSpdPct = 0;
for (var i = 0; i < enemyStatPercents.hp.length; i++) totalHpPct += enemyStatPercents.hp[i];
for (var i = 0; i < enemyStatPercents.atk.length; i++) totalAtkPct += enemyStatPercents.atk[i];
for (var i = 0; i < enemyStatPercents.atkSpd.length; i++) totalAtkSpdPct += enemyStatPercents.atkSpd[i];
- enemyStatGrowth.hp.push(Math.round(baseHp * (1 + totalHpPct)));
+ // After level 20, enemy health increases by an additional 50% per level
+ var extraHpMultiplier = 1;
+ if (lvl > 20) {
+ // For each level above 20, multiply by 1.5 for each extra level
+ extraHpMultiplier = Math.pow(1.5, lvl - 20);
+ }
+ enemyStatGrowth.hp.push(Math.round(baseHp * (1 + totalHpPct) * extraHpMultiplier));
enemyStatGrowth.atk.push(Math.round(baseAtk * (1 + totalAtkPct)));
enemyStatGrowth.atkSpd.push(Math.round(baseAtkSpd * (1 + totalAtkSpdPct)));
}
}