User prompt
make it %5
User prompt
and increase the magnet drop rate %100
User prompt
make the magnet effect area 800
User prompt
and also make xp attraction area 150
User prompt
make it same with the xp
User prompt
make it 150
User prompt
make it same with the magnet
User prompt
set hero radius to 10
User prompt
make hero radius 30 and gem radius 10
User prompt
lower it more
User prompt
lower the pickup radius %100
User prompt
make hero radius 20
User prompt
decrease the xp pickup radius by %100
User prompt
increase the magnet collecting area (not magnet effect but taking the magnet from ground)
User prompt
xp gem and big xp gem assets shouldnt be interwinded
User prompt
big gems and normal gems should not be intertwined as assets
User prompt
make it %10
User prompt
decrase the big gem drop rate to %2
User prompt
also a normal gem
User prompt
make every zombie drop big xp gem
User prompt
make big gem asset visible be in front of the background
User prompt
remove big gem drop
User prompt
but I cant see big gem drop fix that
User prompt
make magnet drop %20
User prompt
when collecting make xp dragged to hero not disappear
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletSprite = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 18; self.speed = 19; self.dirX = 1; self.dirY = 0; self.pierce = 1; self.update = function () { self.x += self.dirX * self.speed; self.y += self.dirY * self.speed; }; return self; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemySprite = self.attachAsset('enemy_right', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 50; self.speed = 1.5 + Math.random(); self.update = function () { var dx = hero.x - self.x; var dy = hero.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } if (self.children && self.children.length > 0) { var currentSprite = self.children[0]; var shouldFaceRight = hero.x > self.x; var isLeftSprite = currentSprite.assetId === 'enemy_left'; var isRightSprite = currentSprite.assetId === 'enemy_right'; if (shouldFaceRight && !isRightSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('enemy_right', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'enemy_right'; } else if (!shouldFaceRight && !isLeftSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('enemy_left', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'enemy_left'; } } }; return self; }); // Experience Gem class var Gem = Container.expand(function () { var self = Container.call(this); var gemSprite = self.attachAsset('xp_gem', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 20; self.update = function () {}; return self; }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroSprite = self.attachAsset('hero_right', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 60; self.speed = 15; self.targetX = 1024; self.targetY = 1366; self.magnetActive = false; self.magnetDuration = 0; self.magnetRange = 300; self.magnetRangeBoosted = 600; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { var move = Math.min(self.speed, dist); var prevX = self.x; self.x += dx / dist * move; self.y += dy / dist * move; if (self.children && self.children.length > 0) { var currentSprite = self.children[0]; var isLeftSprite = currentSprite.assetId === 'hero_left'; var isRightSprite = currentSprite.assetId === 'hero_right'; if (self.x < prevX && !isLeftSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('hero_left', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'hero_left'; } else if (self.x > prevX && !isRightSprite) { self.removeChild(currentSprite); var newSprite = self.attachAsset('hero_right', { anchorX: 0.5, anchorY: 0.5 }); newSprite.assetId = 'hero_right'; } } } if (self.magnetActive) { // Make hero glow blue while magnet is active if (!self._magnetGlowActive) { LK.effects.flashObject(self, 0x00ffff, 60000); // long duration, will be reset when deactivated self._magnetGlowActive = true; } self.magnetDuration--; if (self.magnetDuration <= 0) { self.magnetActive = false; self._magnetGlowActive = false; LK.effects.flashObject(self, 0xff0000, 600); } } else { self._magnetGlowActive = false; } }; return self; }); // Powerup class var Powerup = Container.expand(function (opts) { var self = Container.call(this); // Eğer parametrelerle mıknatıs mı olduğunu alabiliyorsak self.isMagnet = opts && opts.isMagnet || false; if (self.isMagnet) { self.attachAsset('magnet_powerup', { anchorX: 0.5, anchorY: 0.5 }); } else { self.attachAsset('big_xp_gem', { anchorX: 0.5, anchorY: 0.5 }); } self.radius = 30; self.update = function () {}; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x444444 }); /**** * Game Code ****/ var hero; var enemies = []; var bullets = []; var gems = []; var powerups = []; var spawnTimer = 0; var spawnInterval = 90; var wave = 1; var xp = 0; var xpToLevel = 10; var level = 1; var dragging = false; var lastGameOver = false; var heroLives = 3; var livesTxt; var scoreTxt, xpTxt, levelTxt; var centerX = 2048 / 2; var centerY = 2732 / 2; hero = new Hero(); hero.x = centerX; hero.y = centerY; game.addChild(hero); scoreTxt = new Text2('Score: 0', { size: 54, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); livesTxt = new Text2('Lives: 3', { size: 54, fill: "#fff" }); livesTxt.anchor.set(0.5, 0); livesTxt.y = 60; LK.gui.top.addChild(livesTxt); var timerTxt = new Text2('00:00', { size: 54, fill: "#fff" }); timerTxt.anchor.set(1, 0); LK.gui.topRight.addChild(timerTxt); var magnetTimerTxt = new Text2('', { size: 44, fill: 0x00FFFF }); magnetTimerTxt.anchor.set(1, 0); magnetTimerTxt.y = 60; LK.gui.topRight.addChild(magnetTimerTxt); xpTxt = new Text2('XP: 0/10', { size: 36, fill: 0x7BE495 }); xpTxt.anchor.set(0.5, 0); LK.gui.top.addChild(xpTxt); xpTxt.y = 110; levelTxt = new Text2('Level: 1', { size: 36, fill: 0xF7E967 }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 180; function spawnEnemy() { var edge = Math.floor(Math.random() * 4); var x, y; var useRight = false; if (edge === 0) { x = Math.random() * 2048; y = -100; if (x > 1024) { useRight = true; } } else if (edge === 1) { x = 2048 + 100; y = Math.random() * 2732; useRight = true; } else if (edge === 2) { x = Math.random() * 2048; y = 2732 + 100; if (x > 1024) { useRight = true; } } else { x = -100; y = Math.random() * 2732; } var enemy = new Enemy(); if (useRight && enemy.children && enemy.children.length > 0) { var oldSprite = enemy.children[0]; enemy.removeChild(oldSprite); var enemyLeftSprite = enemy.attachAsset('enemy_left', { anchorX: 0.5, anchorY: 0.5 }); } enemy.x = x; enemy.y = y; enemies.push(enemy); game.addChild(enemy); } function spawnGem(x, y) { var gem = new Gem(); gem.x = x; gem.y = y; gems.push(gem); game.addChild(gem); } function spawnMagnetPowerup(x, y) { var powerup = new Powerup({ isMagnet: true }); // isMagnet parametresiyle oluştur powerup.x = x; powerup.y = y; powerups.push(powerup); game.addChild(powerup); } function spawnPowerup(x, y) { var powerup = new Powerup({ isMagnet: false }); // Diğer poweruplar powerup.x = x; powerup.y = y; powerups.push(powerup); // Remove and re-add to ensure it's above any background (if present) if (game.children && game.children.length > 0) { game.removeChild(powerup); game.addChild(powerup); } else { game.addChild(powerup); } } function fireBullet(dx, dy) { var bullet = new Bullet(); bullet.x = hero.x; bullet.y = hero.y; bullet.pierce = Bullet.prototype.pierce || 1; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) { bullet.dirX = 1; bullet.dirY = 0; } else { bullet.dirX = dx / dist; bullet.dirY = dy / dist; } bullet.rotation = Math.atan2(bullet.dirY, bullet.dirX); bullets.push(bullet); game.addChild(bullet); } function randomDir() { var angle = Math.random() * Math.PI * 2; return { x: Math.cos(angle), y: Math.sin(angle) }; } function dist2(a, b) { var dx = a.x - b.x; var dy = a.y - b.y; return Math.sqrt(dx * dx + dy * dy); } game.down = function (x, y, obj) { if (x < 100 && y < 100) { return; } hero.targetX = x; hero.targetY = y; dragging = true; }; game.move = function (x, y, obj) { hero.targetX = x; hero.targetY = y; }; game.up = function (x, y, obj) { dragging = false; }; var ticksSurvived = 0; var autoAttackTimer = 0; var autoAttackInterval = 48; game.update = function () { hero.update(); for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); if (dist2(e, hero) < e.radius + hero.radius) { if (!e.hasHitHero) { heroLives--; livesTxt.setText('Lives: ' + heroLives); LK.effects.flashScreen(0xff0000, 1000); e.hasHitHero = true; if (heroLives <= 0) { LK.showGameOver(); lastGameOver = true; } } } else { e.hasHitHero = false; } } for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); bullets.splice(i, 1); continue; } for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (dist2(b, e) < b.radius + e.radius) { var bigGemSpawned = false; if (Math.random() < 0.10) { // Drop big xp gem at 10% rate spawnPowerup(e.x, e.y); bigGemSpawned = true; } // Offset the normal gem if big gem was spawned to avoid overlap if (bigGemSpawned) { var offsetAngle = Math.random() * Math.PI * 2; var offsetDist = 40; var gemX = e.x + Math.cos(offsetAngle) * offsetDist; var gemY = e.y + Math.sin(offsetAngle) * offsetDist; spawnGem(gemX, gemY); } else { spawnGem(e.x, e.y); } // Set magnet drop rate to 1% (1 in 100 chance) if (Math.random() < 0.01) { spawnMagnetPowerup(e.x, e.y); } e.destroy(); enemies.splice(j, 1); b.pierce -= 1; if (b.pierce <= 0) { b.destroy(); bullets.splice(i, 1); } break; } } } for (var i = gems.length - 1; i >= 0; i--) { var g = gems[i]; var magnetRange = hero.magnetActive ? hero.magnetRangeBoosted : hero.magnetRange; var d = dist2(g, hero); if (d < magnetRange) { var dx = hero.x - g.x; var dy = hero.y - g.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { g.x += dx / dist * 18; g.y += dy / dist * 18; } } if (dist2(g, hero) < g.radius + hero.radius) { xp += 1; g.destroy(); gems.splice(i, 1); if (xp >= xpToLevel) { level += 1; xp = 0; xpToLevel = 10 + level * 4; LK.effects.flashObject(hero, 0xf7e967, 600); spawnPowerup(hero.x + (Math.random() - 0.5) * 200, hero.y + (Math.random() - 0.5) * 200); autoAttackInterval = Math.max(12, autoAttackInterval - 4); Bullet.prototype.pierce = (Bullet.prototype.pierce || 1) + 1; } } } for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; // Lower the pickup radius for collecting magnet powerups from the ground even more var magnetPowerupCollectRadius = Math.max(10, (p.radius + hero.radius) * 0.4); var magnetPowerupRange = 600; // Increased range for magnet effect var d = dist2(p, hero); // Only attract powerups that are NOT magnet powerups if (!p.isMagnet && d < magnetPowerupRange) { var dx = hero.x - p.x; var dy = hero.y - p.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { p.x += dx / dist * 12; p.y += dy / dist * 12; } } if (p.isMagnet && dist2(p, hero) < magnetPowerupCollectRadius || !p.isMagnet && dist2(p, hero) < p.radius + hero.radius) { if (p.isMagnet) { hero.magnetActive = true; hero.magnetDuration = 300; hero._magnetGlowActive = false; // force re-apply blue glow in Hero.update LK.effects.flashObject(hero, 0x00ffff, 800); } else { if (Math.random() < 0.5) { autoAttackInterval = Math.max(16, autoAttackInterval - 4); LK.effects.flashObject(hero, 0x8e44ad, 400); } else { hero.speed += 2; LK.effects.flashObject(hero, 0x7be495, 400); } xp += 5; } p.destroy(); powerups.splice(i, 1); } } autoAttackTimer++; if (autoAttackTimer >= autoAttackInterval) { autoAttackTimer = 0; var nearest = null, minDist = 99999; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; var d = dist2(hero, e); if (d < minDist) { minDist = d; nearest = e; } } if (nearest) { var dx = nearest.x - hero.x; var dy = nearest.y - hero.y; var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; var spread; if (level === 2) { spread = Math.PI / 32; } else if (level > 2) { spread = Math.PI / 32 + (level - 2) * Math.PI / 48; if (spread > Math.PI / 4) { spread = Math.PI / 4; } } else { spread = Math.PI / 16; } var baseAngle = Math.atan2(dy, dx); for (var b = 0; b < totalBullets; b++) { var angle = baseAngle; if (totalBullets > 1) { angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1); } var dirX = Math.cos(angle); var dirY = Math.sin(angle); fireBullet(dirX, dirY); } } else { var extraBullets = Math.max(0, level - 1); var totalBullets = 1 + extraBullets; var spread; if (level === 2) { spread = Math.PI / 32; } else if (level > 2) { spread = Math.PI / 32 + (level - 2) * Math.PI / 48; if (spread > Math.PI / 4) { spread = Math.PI / 4; } } else { spread = Math.PI / 16; } var baseAngle = Math.random() * Math.PI * 2; for (var b = 0; b < totalBullets; b++) { var angle = baseAngle; if (totalBullets > 1) { angle = baseAngle - spread / 2 + spread * b / (totalBullets - 1); } var dirX = Math.cos(angle); var dirY = Math.sin(angle); fireBullet(dirX, dirY); } } } spawnTimer++; if (spawnTimer >= spawnInterval) { spawnTimer = 0; var toSpawn = 1 + Math.floor(wave / 3); for (var i = 0; i < toSpawn; i++) { spawnEnemy(); } wave++; spawnInterval = Math.max(24, 90 - Math.floor(wave / 2)); } ticksSurvived++; scoreTxt.setText('Score: ' + Math.floor(ticksSurvived / 60)); xpTxt.setText('XP: ' + xp + '/' + xpToLevel); levelTxt.setText('Level: ' + level); var totalSeconds = Math.floor(ticksSurvived / 60); var minutes = Math.floor(totalSeconds / 60); var seconds = totalSeconds % 60; var minStr = minutes < 10 ? '0' + minutes : '' + minutes; var secStr = seconds < 10 ? '0' + seconds : '' + seconds; timerTxt.setText(minStr + ':' + secStr); if (hero && hero.parent) { lastGameOver = false; if (heroLives !== 3) { heroLives = 3; livesTxt.setText('Lives: ' + heroLives); } } // Magnet timer display if (hero.magnetActive && hero.magnetDuration > 0) { var magnetSeconds = Math.ceil(hero.magnetDuration / 60); magnetTimerTxt.setText('Magnet: ' + magnetSeconds + 's'); } else { magnetTimerTxt.setText(''); } };
===================================================================
--- original.js
+++ change.js
@@ -439,10 +439,10 @@
}
}
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
- // Restore the pickup radius for collecting magnet powerups from the ground to default (p.radius + hero.radius)
- var magnetPowerupCollectRadius = p.radius + hero.radius;
+ // Lower the pickup radius for collecting magnet powerups from the ground even more
+ var magnetPowerupCollectRadius = Math.max(10, (p.radius + hero.radius) * 0.4);
var magnetPowerupRange = 600; // Increased range for magnet effect
var d = dist2(p, hero);
// Only attract powerups that are NOT magnet powerups
if (!p.isMagnet && d < magnetPowerupRange) {
16x16 pixel wounded guy holding pistol. In-Game asset. 2d. High contrast. No shadows. pixel art. retro arcade game
3x3 pixel green coin. In-Game asset. 2d. High contrast. No shadows. retro arcade. Pixel art
3x3 pixel blue coin. In-Game asset. 2d. High contrast. No shadows. Pixel art. retro arcade
4x4 pixel art heart. In-Game asset. 2d. High contrast. No shadows. retro arcade. Pixel art. 8 bit
fill the circle with yellow colour
remove cars and buildings
Create an 8-bit style effect representing a magnetic power-up area. The effect should be a circular, glowing field with a soft, pulsing light. The colors should be green and blue, with a slight gradient effect to indicate the area where objects (such as coins or experience points) are attracted towards the character. The circle should have a subtle flicker to show the magnetic pull, and it should be designed to fit within the retro, pixel-art aesthetic of an 8-bit game. In-Game asset. 2d. High contrast. No shadows
Vertical windowed filled rectangle HUD for the 2d zombie theme game. Use green colours. Do not make it too much pixelated. In-Game asset. 2d. High contrast. No shadows. No text. No icon. No background Transparent.Retro arcade theme.
windowed filled rectangle HUD button for the 2d pixel art zombie theme game. Use dark green colours. In-Game asset. 2d. High contrast. No shadows. No text. No icon. No background Transparent.Retro arcade theme.
pixelart magnet In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart red circular enemy projectile to dodge In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart yellow circular bullet to shoot enemies In-Game asset. 2d. High contrast. No shadows. Pixel art
pixelart blue circular enemy projectile to dodge In-Game asset. 2d. High contrast. No shadows. Pixel art
4x4pixel bow and arrow. In-Game asset. 2d. High contrast. No shadows. Black outline
8x8 pixel movement speed powerup icon. boot with wings. In-Game asset. 2d. High contrast. No shadows. Black outline