User prompt
wave değiştikten sonra zombiler değişsin başka güçte bide ekrandaki hp azalmıyor
User prompt
xp alınca oyun durması karakter hareket emiyor daha çok zombi ekle ve canımız azalmıyor
Code edit (1 edits merged)
Please save this source code
User prompt
Crystal Arena: Bullet Heaven Roguelike
Initial prompt
1) Oyun Kimliği Tür: 2D top-down roguelike, dalga tabanlı “bullet heaven”. Stil: Minimalist/pixel; sade şekiller (kare/daire), canlı renk paleti, okunaklı UI. Tema: Biyomlara göre değişen ışık/renk ve müzik; hafif komik düşman yüz ifadeleri. Hedef: Dalgaları hayatta kalarak geç; XP taşlarını topla; her seviye rastgele 3 perk arasından birini seç; her bölüm sonunda güçlenen yeni yaratıklar ve boss. 2) Çekirdek Döngü Arena/haritaya giriş → düşük seviye düşmanlar spawn. Düşmanları yok et → XP kristali düşer → topla. Seviye atla → 3 rasgele perk arasından seçim. Bölüm ilerleme sayacı dolunca mini-boss/boss. Boss bitince sonraki biyoma geç veya sonsuz modda zorluk artışı. 3) Kontroller PC: WASD hareket, Mouse hedefleme, Sol tık temel saldırı (otomatik ateş seçeneği), Space dash, ESC menü. Gamepad: Sol çubuk hareket, Sağ çubuk nişan, RT ateş, B dash, Start menü. Mobil (opsiyonel): Sol sanal joystick, sağ otomatik nişan; büyük ateş/dash butonları. 4) Oyuncu Karakteri Başlangıç: 3 kalp, temel sihir mermisi (0.8 sn/mermi, 5 hasar), hareket hızı 3.5 u/s. Hasar alımı: Temas = 1 kalp, i-frame 0.6 sn. Dash: 0.25 sn, 3x hız, i-frame; CD 3 sn. 5) XP & Seviye Sistemi XP kristali düşer: yeşil (1), mavi (5), mor (20). Seviye formülü: XP_needed(level) = 30 + level^2 * 5. Seviye atlayınca 3 rastgele perk; tekrar gelen perkler seviye atlar (I→II→III→IV). Rarity: Common 60%, Rare 30%, Epic 9%, Legendary 1% (ağırlıklar oyuncu şansına göre +/- %5 değişebilir). 6) Perk/Yetnek Havuzu (örnekler) Core Rapid Cast: Saldırı hızı +10% / kademe. Power Shot: Temel hasar +15% / kademe. Orbitals: Oyuncu etrafında dönen 2/3/4 bıçak (hasar 8/10/12). Barrier: 8 sn’de bir 1 darbe emen kalkan. Vitality: +1 kalp (maks 6). Greed: Düşen XP oranı +20% (I), +35% (II), +50% (III). Elementler Ateş: Yanma (3 sn boyunca/sn başına %20 hasar). Buz: %15 yavaşlatma + kısa süreli dondurma şansı. Zehir: Yığılabilir DOT, öldürülen düşmanda zehir bulutu. Elektrik: Zincir atlama 2/3/4 hedef. Sinerjiler Fire + Greed → “Smoldering Coins”: Yanma ile ölenler +%10 XP. Ice + Orbitals → “Frost Blades”: Bıçaklar yavaşlatır. Electric + Rapid → “Overclock”: Zincir menzili +%30. 7) Düşmanlar, Dalga ve Güçlenme Temel Aileler Sarı Küpler (Grunt): Yavaş, temas hasarı düşük. Kırmızı Sprinter: Hızlı, düşük HP. Mavi Tank: Yavaş, yüksek HP, itilmeye direnç. Mor Wisp (Uçan): Duvarları ezer/üstünden geçer, bazen mermi atar. Destek (Şaman): Yakındaki düşmanlara buff (hız/HP). Bölüm Bazlı Güçlenme Her bölüm sonunda Global Çarpan artar: HP_mult = 1 + 0.25 * stage Speed_mult = 1 + 0.08 * stage Damage_mult = 1 + 0.15 * stage Yeni davranış: Stage 2’de sprinter dash atar, Stage 3’te wisp mermisi çiftlenir, Stage 4+’ta şaman zırh verir. Boss Taslakları Sand Colossus (Çöl): Alan kum fırtınası, segmentli zırh; zayıf nokta baş. Grove Hydra (Orman): 3 baş; kesilince yerde zehir gölü. Ice Behemoth (Buz): Koniler halinde buz nefesi, zemine kayganlık. Umbral Eye (Mağara): Dairesel mermi desenleri (bullet hell), çağırma fazı. 8) Harita/Biyomlar Biyomlar: Orman → Çöl → Mağara → Buzul (sırayla). Her biyomda: Işık rengi, parçacık, çevre engelleri (ağaç, kaya, diken). Minimap sağ üstte; oyuncu, düşman yoğunluğu ve sandık noktalarını göster. Spawn bölgeleri ekrandan 1.5 ekran uzağı; kapalı alanlarda kapı/koridor. Roguelike çeşitlilik: Engeller ve sandıklar “seed” ile yaratılsın. 9) Eşya Düşüşleri ve Sandıklar Düşmanlar: %5 coin, %8 küçük iyileşme, %2 perk shard (meta). Sandık: Dalga 3/6/9 ve boss sonrası garanti; nadir eşyalar ağırlıklı. 10) Meta-İlerleme (kalıcı) Koşu sonu perk shard harcanarak: başlangıç HP +1, +%5 altın, +%5 XP alımı, yeni karakter kilidi vb. Meta yükseltmeler küçük ve istiflenebilir olsun; tek koşuyu kırmasın. 11) UI / UX Oyun içi: Alt: XP barı + seviye sayacı. Sol üst: Kalpler; altında aktif buff ikonları ve süreleri. Orta alt: Seçili 6 perk slotu (hover ile açıklama). Sağ üst: Minimap; altında dalga/bölüm sayacı ve kalan süre. Seviye ekranı (pause yok): 3 kart açılır; her kartın adı, nadirlik rengi, kısa açıklama, sayı değerleri. Hasar sayıları: Kısa süreli “10, 12, crit!” pop-ups. Erişilebilirlik: Renk körlüğü paletleri, mermi/XP kontur çizgisi, titreşim kapatılabilir. 12) Ana Menü & Akış Başlat, Devam (varsa), Karakterler, Ayarlar, Kredi/Çıkış. Karakterler: 3 başlangıç sınıfı (Büyücü/Okçu/Paladin) + kilitli varyantlar. Ayarlar: Ses: Müzik/FX master. Grafik: Parçacık yoğunluğu (Düşük/Orta/Yüksek), gölge halkaları Aç/Kapat. Kontrol: Oto-ateş Aç/Kapat, nişan hassasiyeti, gamepad deadzone. Oynanış: Hasar sayıları, ekran titreşimi, renk körlüğü modu. Koşu sonunda: İstatistik özeti, alınan perkler listesi, tekrar dene/menü. 13) Ses & VFX Biyoma özgü chip/retro loop; bosslarda varyasyon. Etkiler: XP toplama “tinkle”, seviye atlama “whoosh”, kritik “snap”. VFX: Çemberimsi darbe halkaları, elementlere göre renkli izler. 14) Kaydetme Yerel JSON/PlayerPrefs: meta ilerleme, açılan karakterler, ayarlar. Oturum (run) kaydı zorunlu değil; ancak “Devam” seçeneği opsiyonel tek checkpoint olarak sunulabilir (boss sonrası). 15) Zorluk Modları Kolay/Normal/Zor/Sonsuz. Çarpanlar: düşman HP/hız/hasar, drop oranları, boss faz sayısı. 16) Performans Kısıtları Aynı anda ekranda ≤ 250 düşman, ≤ 400 aktif mermi/partikül. Havuzlama (object pooling) zorunlu; GC spike’larını engelle. 60 FPS hedef; mobilde 30 FPS kabul. 17) Kabul Kriterleri (QA Checklist) Seviye atladığımda daima 3 farklı perk kartı çıkar, nadirlik renkleri doğru. Bölüm geçişinde düşman HP/Speed/Damage çarpanları formüle göre artar. Boss öldüğünde yeni biyoma geçiş tetiklenir; en az 1 yeni düşman tipi eklenir. Minimap oyuncu/düşman yoğunluğunu gösterir; ikonlar ölçeklenir. Ayarlardan otomatik ateş açılıp kapatılabilir. Kaydet/yükle meta ilerleme çalışır; ayarlar kalıcıdır. Ölüm ekranı: istatistik özeti (yaşanan süre, öldürülen düşman, toplanan XP, seçilen perkler)
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
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.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = 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.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 20;
self.speed = 1;
self.damage = 10;
self.lastDamageTime = 0;
self.update = function () {
if (!player) return;
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;
}
// Damage player on contact
if (distance < 40) {
player.takeDamage(self.damage);
}
};
self.takeDamage = function (damage) {
self.hp -= damage;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.hp <= 0) {
self.die();
}
};
self.die = function () {
// Spawn XP crystal
var crystal = new XPCrystal();
crystal.x = self.x;
crystal.y = self.y;
game.addChild(crystal);
xpCrystals.push(crystal);
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 100;
self.maxHp = 100;
self.speed = 4;
self.level = 1;
self.xp = 0;
self.xpToNext = 100;
self.update = function () {
// Constrain player to screen bounds
if (self.x < 30) self.x = 30;
if (self.x > 2018) self.x = 2018;
if (self.y < 30) self.y = 30;
if (self.y > 2702) self.y = 2702;
};
self.takeDamage = function (damage) {
self.hp -= damage;
self.hp = Math.max(0, self.hp); // Ensure HP doesn't go below 0
LK.effects.flashObject(self, 0xff0000, 300);
if (self.hp <= 0) {
LK.showGameOver();
}
};
self.gainXP = function (amount) {
self.xp += amount;
if (self.xp >= self.xpToNext) {
self.levelUp();
}
};
self.levelUp = function () {
self.level++;
self.xp = 0;
self.xpToNext = Math.floor(self.xpToNext * 1.2);
LK.getSound('levelup').play();
// Auto-apply damage boost on level up
player.damage = (player.damage || 25) + 5;
};
return self;
});
var XPCrystal = Container.expand(function () {
var self = Container.call(this);
var crystalGraphics = self.attachAsset('xpCrystal', {
anchorX: 0.5,
anchorY: 0.5
});
self.value = 20;
self.attractDistance = 120;
self.collectDistance = 30;
self.update = function () {
if (!player) return;
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Attract to player when close
if (distance < self.attractDistance && distance > self.collectDistance) {
var attractSpeed = 3;
self.x += dx / distance * attractSpeed;
self.y += dy / distance * attractSpeed;
}
// Collect when very close
if (distance < self.collectDistance) {
player.gainXP(self.value);
LK.getSound('pickup').play();
self.collect();
}
};
self.collect = function () {
// Remove from array and destroy
for (var i = xpCrystals.length - 1; i >= 0; i--) {
if (xpCrystals[i] === self) {
xpCrystals.splice(i, 1);
break;
}
}
self.destroy();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2E7D32
});
/****
* Game Code
****/
var player;
var enemies = [];
var bullets = [];
var xpCrystals = [];
var waveNumber = 1;
var enemiesKilled = 0;
var enemiesInWave = 5;
var lastShootTime = 0;
var shootCooldown = 20;
var perkSelectionActive = false;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreText);
var hpText = new Text2('HP: 100/100', {
size: 50,
fill: 0xFF4444
});
hpText.anchor.set(0, 0);
LK.gui.topLeft.addChild(hpText);
hpText.x = 120;
var levelText = new Text2('Level: 1', {
size: 50,
fill: 0x44FF44
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var waveText = new Text2('Wave: 1', {
size: 50,
fill: 0x4444FF
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
waveText.y = 70;
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
// Perk system
var availablePerks = [{
name: "More HP",
description: "Increase max HP by 20",
rarity: "common"
}, {
name: "Faster Shooting",
description: "Reduce shooting cooldown",
rarity: "common"
}, {
name: "Speed Boost",
description: "Increase movement speed",
rarity: "common"
}, {
name: "Damage Up",
description: "Increase bullet damage",
rarity: "rare"
}, {
name: "Multi Shot",
description: "Fire additional bullets",
rarity: "rare"
}, {
name: "Life Steal",
description: "Heal when dealing damage",
rarity: "epic"
}];
function showPerkSelection() {
perkSelectionActive = true;
// Create perk selection UI
var perkContainer = new Container();
perkContainer.x = 1024;
perkContainer.y = 1366;
var bg = LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 15,
scaleY: 8,
alpha: 0.8
});
bg.tint = 0x000000;
perkContainer.addChild(bg);
var titleText = new Text2('Choose a Perk!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -200;
perkContainer.addChild(titleText);
// Select 3 random perks
var selectedPerks = [];
for (var i = 0; i < 3; i++) {
var randomPerk = availablePerks[Math.floor(Math.random() * availablePerks.length)];
selectedPerks.push(randomPerk);
}
// Create perk buttons
for (var i = 0; i < 3; i++) {
var perkButton = createPerkButton(selectedPerks[i], i, perkContainer);
}
LK.gui.center.addChild(perkContainer);
// Store reference for cleanup
game.perkContainer = perkContainer;
}
function createPerkButton(perk, index, parent) {
var button = new Container();
button.x = (index - 1) * 400;
button.y = 0;
var buttonBg = LK.getAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 3
});
buttonBg.tint = 0x444444;
button.addChild(buttonBg);
var nameText = new Text2(perk.name, {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = -40;
button.addChild(nameText);
var descText = new Text2(perk.description, {
size: 40,
fill: 0xCCCCCC
});
descText.anchor.set(0.5, 0.5);
descText.y = 20;
button.addChild(descText);
button.down = function (x, y, obj) {
applyPerk(perk);
LK.gui.center.removeChild(game.perkContainer);
perkSelectionActive = false;
game.perkContainer = null;
};
parent.addChild(button);
return button;
}
function applyPerk(perk) {
switch (perk.name) {
case "More HP":
player.maxHp += 20;
player.hp += 20;
break;
case "Faster Shooting":
shootCooldown = Math.max(5, shootCooldown - 5);
break;
case "Speed Boost":
player.speed += 1;
break;
case "Damage Up":
// This would modify bullet damage globally
break;
case "Multi Shot":
// This would modify shooting behavior
break;
case "Life Steal":
// This would add healing on damage
break;
}
}
function spawnWave() {
enemiesInWave = 15 + waveNumber * 5;
for (var i = 0; i < enemiesInWave; i++) {
var enemy = new Enemy();
// Spawn from 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;
}
// Create different enemy variants based on wave number
var enemyType = Math.floor(Math.random() * 4);
switch (waveNumber % 4) {
case 1:
// Wave 1: Basic yellow cubes
enemy.hp = 20 + waveNumber * 3;
enemy.speed = 1 + waveNumber * 0.1;
enemy.damage = 8 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow
break;
case 2:
// Wave 2: Fast red sprinters
if (enemyType < 2) {
enemy.hp = 15 + waveNumber * 2;
enemy.speed = 2.5 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red
} else {
enemy.hp = 30 + waveNumber * 4;
enemy.speed = 0.8 + waveNumber * 0.1;
enemy.damage = 15 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
case 3:
// Wave 3: Mix with purple wisps
if (enemyType < 1) {
enemy.hp = 12 + waveNumber * 2;
enemy.speed = 1.8 + waveNumber * 0.2;
enemy.damage = 10 + waveNumber * 1;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisps
} else if (enemyType < 3) {
enemy.hp = 25 + waveNumber * 3;
enemy.speed = 1.2 + waveNumber * 0.15;
enemy.damage = 14 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red sprinters
} else {
enemy.hp = 35 + waveNumber * 5;
enemy.speed = 0.7 + waveNumber * 0.1;
enemy.damage = 18 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
}
break;
default:
// Wave 4+: All enemy types with scaling
if (enemyType === 0) {
enemy.hp = 15 + waveNumber * 4;
enemy.speed = 2.8 + waveNumber * 0.4;
enemy.damage = 15 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Fast red
} else if (enemyType === 1) {
enemy.hp = 45 + waveNumber * 6;
enemy.speed = 0.6 + waveNumber * 0.1;
enemy.damage = 22 + waveNumber * 3;
enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Tanky blue
} else if (enemyType === 2) {
enemy.hp = 18 + waveNumber * 3;
enemy.speed = 2.2 + waveNumber * 0.3;
enemy.damage = 12 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisp
} else {
enemy.hp = 25 + waveNumber * 4;
enemy.speed = 1.5 + waveNumber * 0.2;
enemy.damage = 16 + waveNumber * 2;
enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow basic
}
break;
}
enemies.push(enemy);
game.addChild(enemy);
}
}
function findNearestEnemy() {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
}
var dragNode = null;
game.move = function (x, y, obj) {
if (dragNode) {
dragNode.x = x;
dragNode.y = y;
}
};
game.down = function (x, y, obj) {
dragNode = player;
player.x = x;
player.y = y;
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn initial wave
spawnWave();
game.update = function () {
// Update UI
hpText.setText('HP: ' + player.hp + '/' + player.maxHp);
levelText.setText('Level: ' + player.level);
waveText.setText('Wave: ' + waveNumber);
// Auto-shoot at nearest enemy
if (LK.ticks - lastShootTime > shootCooldown) {
var target = findNearestEnemy();
if (target) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullet.setTarget(target.x, target.y);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
lastShootTime = LK.ticks;
}
}
// Update bullets and check collisions
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove bullets that go off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
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)) {
enemy.takeDamage(bullet.damage);
if (enemy.hp <= 0) {
enemy.destroy();
enemies.splice(j, 1);
enemiesKilled++;
}
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Check if wave is complete
if (enemies.length === 0) {
waveNumber++;
enemiesKilled = 0;
spawnWave();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -52,11 +52,10 @@
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Damage player on contact
- if (distance < 40 && LK.ticks - self.lastDamageTime > 30) {
+ if (distance < 40) {
player.takeDamage(self.damage);
- self.lastDamageTime = LK.ticks;
}
};
self.takeDamage = function (damage) {
self.hp -= damage;
@@ -97,8 +96,9 @@
if (self.y > 2702) self.y = 2702;
};
self.takeDamage = function (damage) {
self.hp -= damage;
+ self.hp = Math.max(0, self.hp); // Ensure HP doesn't go below 0
LK.effects.flashObject(self, 0xff0000, 300);
if (self.hp <= 0) {
LK.showGameOver();
}
@@ -357,12 +357,76 @@
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
- // Scale enemy stats
- enemy.hp = 20 + waveNumber * 5;
- enemy.speed = 1 + waveNumber * 0.2;
- enemy.damage = 10 + waveNumber * 2;
+ // Create different enemy variants based on wave number
+ var enemyType = Math.floor(Math.random() * 4);
+ switch (waveNumber % 4) {
+ case 1:
+ // Wave 1: Basic yellow cubes
+ enemy.hp = 20 + waveNumber * 3;
+ enemy.speed = 1 + waveNumber * 0.1;
+ enemy.damage = 8 + waveNumber * 1;
+ enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow
+ break;
+ case 2:
+ // Wave 2: Fast red sprinters
+ if (enemyType < 2) {
+ enemy.hp = 15 + waveNumber * 2;
+ enemy.speed = 2.5 + waveNumber * 0.3;
+ enemy.damage = 12 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red
+ } else {
+ enemy.hp = 30 + waveNumber * 4;
+ enemy.speed = 0.8 + waveNumber * 0.1;
+ enemy.damage = 15 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
+ }
+ break;
+ case 3:
+ // Wave 3: Mix with purple wisps
+ if (enemyType < 1) {
+ enemy.hp = 12 + waveNumber * 2;
+ enemy.speed = 1.8 + waveNumber * 0.2;
+ enemy.damage = 10 + waveNumber * 1;
+ enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisps
+ } else if (enemyType < 3) {
+ enemy.hp = 25 + waveNumber * 3;
+ enemy.speed = 1.2 + waveNumber * 0.15;
+ enemy.damage = 14 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Red sprinters
+ } else {
+ enemy.hp = 35 + waveNumber * 5;
+ enemy.speed = 0.7 + waveNumber * 0.1;
+ enemy.damage = 18 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Blue tanks
+ }
+ break;
+ default:
+ // Wave 4+: All enemy types with scaling
+ if (enemyType === 0) {
+ enemy.hp = 15 + waveNumber * 4;
+ enemy.speed = 2.8 + waveNumber * 0.4;
+ enemy.damage = 15 + waveNumber * 3;
+ enemy.attachAsset('enemy', {}).tint = 0xFF0000; // Fast red
+ } else if (enemyType === 1) {
+ enemy.hp = 45 + waveNumber * 6;
+ enemy.speed = 0.6 + waveNumber * 0.1;
+ enemy.damage = 22 + waveNumber * 3;
+ enemy.attachAsset('enemy', {}).tint = 0x0000FF; // Tanky blue
+ } else if (enemyType === 2) {
+ enemy.hp = 18 + waveNumber * 3;
+ enemy.speed = 2.2 + waveNumber * 0.3;
+ enemy.damage = 12 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0x800080; // Purple wisp
+ } else {
+ enemy.hp = 25 + waveNumber * 4;
+ enemy.speed = 1.5 + waveNumber * 0.2;
+ enemy.damage = 16 + waveNumber * 2;
+ enemy.attachAsset('enemy', {}).tint = 0xFFFF00; // Yellow basic
+ }
+ break;
+ }
enemies.push(enemy);
game.addChild(enemy);
}
}
Ayakları Ve gözü Olan ateş insan. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Bana Korkunç bir kare insan oluştur. In-Game asset. 2d. High contrast. No shadows
bana bir silah mermisi oluştur. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
bana bir xp kristali çiz. In-Game asset. 2d. High contrast. No shadows