User prompt
ejderhalar güçlendirildiğinde renkleri koyulaşsın bütün ejderhalar 70 altın olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
elektrik ejderhasının saldırıları iskeletler arasında sekecekti sekme sırasında fırlattığı şimşek gözüksün ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
ilk dalgada 20 tane sıradan iskelet olsun
User prompt
dalgalar sırasında ejderha alınıp konulabilsin ve ilk dalgada 20 tane iskelet sırayla gelsin
User prompt
ilk dalgada 20 tane sıradan iskelet olsun
User prompt
iskeletlerin hızı yüzde yüz artsın
User prompt
ejderhalar haritanın her yerine saldırabilsin iskeletlerin arasında boşluk olsun başlangıç parası 100 altın olsun
User prompt
ateş ejderhası 300 hasar vursun bütün iskeletlerin hızı yüzde iki yüz yavaşlatılsın
Code edit (1 edits merged)
Please save this source code
User prompt
Dragon Defense: Skeleton Siege
Initial prompt
oyun tower defense oyunu olacak. 3 tür ejderha 3 tür iskelet olacak. birinci ejderha ateş ejderhası olacak 100 hasar vuracak alev topu fırlatarak iskeletlere hasar verecek 30 altın değerinde olacak. ikinci ejderha buz ejderhası olacak 50 hasar vuracak vurduğu iskeletin arkasındaki iki iskeleti ve vurduğu iskeleti yüzde 60 yavaşlatacak. örneğin iskeletin hızı 1 metre/saniyeyese bu 0,4 metre/ saniye olacak. buz ejderhası buz kristalleri fırlatarak hasar vuracak ve yavaşlatacak. değeri 50 altın olacak. son ejderha elektrik ejderhası olacak. şimşek fırlatarak hasar vuracak. şimşeği isabet ettirdiği iskelet 200 hasar yiyecek. ejderin attığı şimşek iskeletler arasından sekebilecek. ilk isabet ettiği iskelete 200 ordan bi arkasındaki iskelete sekecek ve o iskelete 100 hasar vuracak. ordan da üçüncü iskelete sıçrayıp üçüncü iskelete 50 hasar vuracak ve şimşek daha sekmeyecek. yani elektrik ejderi tek şimşek atışında üç iskelete hasar verebilecek ve maksimum 350 hasara ulaşabilecek. elektrik ejderinin değeri 70 altın olacak. bütün ejderhalar 1,5 saniyede bir saldırı gerçekleştirecek. ejderhalar kendilerine en yakın olan iskelete saldırabilecek. ejderhalar haritanın her yerine saldırabilecek. ejderhalar altın karşılığında güçlendirilebilecek. ateş ejderi 30 altın karşılığında güçledirilebilir. güçlendirildiğinde 150 hasar vurabilecek. buz ejderi 50 altın karşılığında güçlendirilebilcek hasarı değişmeyecek fakat artık düşmanları yüzde seksen yavaşlatacak. yani hızı 1 m/saniye olan bir iskeletin hızı 0,2 metre/saniye olacak. elektrik ejderi 70 altın karşılığında güçlendirilcek. güçlendirildiğinde bir şimşek atışı beş iskelete hasar vurabilecek. 1. iskelete 200 2. iskelete 150 3. iskelete 100 4. iskelete 80 5. iskelete 50 hasar vuaracak. şimşeğin sekme yönü hep arkaya doğru olacak. oyun 3 dalgadan oluşacak. birinci dalgada sıradan iskeletler olacak. bir sıradan iskeletin normalde canı 300 hızı 1m/saniye olacak. 1. dalgada 20 tane sıradan iskelet 0,5 metre aralıklarla patikaya girecek. hasar almadıkları senaryoda bir sıradan iskeletin patikayı bitirme süresi 15 saniye olacak. yani patika 15 metre olacak. 2. iskelet türü kalkanlı iskelet olacak. bu iskeletlerin ellerinde tutacakları kalkanları olacak. canları 1000 olacak. hızları sıradan iskeletlerin yarısı yani 0,5 metre/saniye olacak. yani normal koşullardah patikayı 30 saniyede bitirecekler. 2 dalgada 20 tane kalkanlı iskelet sırayla patikaya girecek. aralarında 0,25 metre olacak. 3. dalga sonuncu dalga olacak. bu dalgada dev iskeletler ve bir adet cadı olacak. cadı boss olacak ve canı 15000 olacak. hızı 0,1 metre/saniye olacak yani normal şartlarda patikayı 150 saniyede bitirecek. cadının önünde ve arkasında birer tane dev iskelet olacak. dev iskeletler cadıylar aynı hızda olacak ve aralarında birer metre olacak yani 3. dalgada iki dev iskelet bir cadı boss olacak. dev iskeletin canı 5000 olacak hızı cadıyla eşit olacak. patikanın girişi sağdan çıkışı soldan olacak iskeletlerin yürüyebileceği tek bir patika olacak ve bu patika kıvrımlı toplam 15 metre olacak. ölen her sıradan iskelet için 10 altın. ölen her kalkanlı iskelet için 15 altın kazanılacak. başlangıçta 30 altın olacak. haritada ejderhaların yerleştirilebileceği toplamda 10 alan olacak yani haritada toplam on ejderha olabilir. başlangıçta hiç bir ejder olmaz oyuncu kazandığı altınlarla ejderhaları alıp yerleştirebilir. ejderhaları satın alabilceği bir market sekmesi hep açık olur. bu sekme ekranın altında olur ve ejderhaların kaç altına alınabileceği ejderhaların altında yazar. ejderhaları satın almak için markette üzerine tıklar. eğer parası yetiyorsa ejderhayı alır ve harita üzerinde belirlenmiş on bölgeden birisine tıklayarak ejderhayı yerleştirir.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function (type, damage, target, isChain) {
var self = Container.call(this);
var bulletGraphics = self.attachAsset(type + 'Bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.damage = damage;
self.target = target;
self.speed = 8;
self.isChain = isChain || false;
self.hasHit = false;
self.update = function () {
if (!self.target || self.hasHit) return;
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 30) {
self.hitTarget();
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
self.hitTarget = function () {
if (self.hasHit) return;
self.hasHit = true;
self.target.takeDamage(self.damage);
LK.getSound('enemyHit').play();
if (self.isChain && self.target.health > 0) {
handleChainLightning(self.target, self.damage);
}
self.destroy();
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i] === self) {
bullets.splice(i, 1);
break;
}
}
};
return self;
});
var Dragon = Container.expand(function (type, x, y) {
var self = Container.call(this);
var dragonGraphics = self.attachAsset(type + 'Dragon', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.isUpgraded = false;
self.lastShotTime = 0;
self.shootInterval = 1500;
if (type === 'fire') {
self.damage = 300;
self.range = 150;
self.cost = 30;
} else if (type === 'ice') {
self.damage = 50;
self.range = 130;
self.cost = 50;
} else if (type === 'lightning') {
self.damage = 200;
self.range = 140;
self.cost = 70;
}
self.x = x;
self.y = y;
self.update = function () {
var currentTime = Date.now();
if (currentTime - self.lastShotTime >= self.shootInterval) {
var target = self.findTarget();
if (target) {
self.shoot(target);
self.lastShotTime = currentTime;
}
}
};
self.findTarget = function () {
var closestEnemy = null;
var closestDistance = 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 < closestDistance) {
closestDistance = distance;
closestEnemy = enemy;
}
}
return closestEnemy;
};
self.shoot = function (target) {
LK.getSound('shoot').play();
var bullet = new Bullet(self.type, self.damage, target, self.type === 'lightning');
bullet.x = self.x;
bullet.y = self.y;
bullets.push(bullet);
game.addChild(bullet);
if (self.type === 'ice') {
target.applySlowEffect(self.isUpgraded ? 0.2 : 0.4);
}
};
self.upgrade = function () {
if (self.isUpgraded) return false;
if (playerGold >= self.cost) {
playerGold -= self.cost;
self.isUpgraded = true;
if (self.type === 'fire') {
self.damage = 450;
dragonGraphics.tint = 0xff0000;
} else if (self.type === 'ice') {
dragonGraphics.tint = 0x0000ff;
} else if (self.type === 'lightning') {
dragonGraphics.tint = 0xffff00;
}
updateGoldDisplay();
return true;
}
return false;
};
self.down = function (x, y, obj) {
if (gameState === 'playing') {
selectedDragon = self;
updateUpgradeButton();
}
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var enemyGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.pathIndex = 0;
self.speed = 0.8;
self.slowEffect = 1;
self.slowDuration = 0;
if (type === 'regularSkeleton') {
self.maxHealth = 300;
self.goldValue = 10;
} else if (type === 'shieldedSkeleton') {
self.maxHealth = 1000;
self.goldValue = 15;
} else if (type === 'giantSkeleton') {
self.maxHealth = 5000;
self.goldValue = 25;
} else if (type === 'witchBoss') {
self.maxHealth = 15000;
self.goldValue = 50;
}
self.health = self.maxHealth;
self.x = pathPoints[0].x;
self.y = pathPoints[0].y;
self.update = function () {
if (self.slowDuration > 0) {
self.slowDuration--;
} else {
self.slowEffect = 1;
}
if (self.pathIndex < pathPoints.length - 1) {
var currentPoint = pathPoints[self.pathIndex];
var nextPoint = pathPoints[self.pathIndex + 1];
var dx = nextPoint.x - self.x;
var dy = nextPoint.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
self.pathIndex++;
} else {
var moveSpeed = self.speed * self.slowEffect;
self.x += dx / distance * moveSpeed;
self.y += dy / distance * moveSpeed;
}
} else {
self.reachEnd();
}
};
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.die();
}
};
self.applySlowEffect = function (slowAmount) {
self.slowEffect = slowAmount;
self.slowDuration = 180;
};
self.die = function () {
playerGold += self.goldValue;
updateGoldDisplay();
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
checkWaveComplete();
};
self.reachEnd = function () {
playerLives--;
updateLivesDisplay();
if (playerLives <= 0) {
gameState = 'gameOver';
LK.showGameOver();
}
self.destroy();
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i] === self) {
enemies.splice(i, 1);
break;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
var gameState = 'playing';
var playerGold = 100;
var playerLives = 10;
var currentWave = 1;
var waveInProgress = false;
var selectedDragon = null;
var dragons = [];
var enemies = [];
var bullets = [];
var placementZones = [];
var pathPoints = [{
x: 2048,
y: 1200
}, {
x: 1800,
y: 1200
}, {
x: 1600,
y: 1000
}, {
x: 1400,
y: 800
}, {
x: 1200,
y: 600
}, {
x: 1000,
y: 400
}, {
x: 800,
y: 600
}, {
x: 600,
y: 800
}, {
x: 400,
y: 1000
}, {
x: 200,
y: 1200
}, {
x: 0,
y: 1200
}];
var placementPositions = [{
x: 1700,
y: 900
}, {
x: 1500,
y: 700
}, {
x: 1300,
y: 500
}, {
x: 1100,
y: 300
}, {
x: 900,
y: 500
}, {
x: 700,
y: 700
}, {
x: 500,
y: 900
}, {
x: 300,
y: 1100
}, {
x: 1900,
y: 1100
}, {
x: 1100,
y: 1300
}];
// Create path
for (var i = 0; i < pathPoints.length; i++) {
var pathSegment = game.addChild(LK.getAsset('path', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
}));
pathSegment.x = pathPoints[i].x;
pathSegment.y = pathPoints[i].y;
}
// Create placement zones
for (var i = 0; i < placementPositions.length; i++) {
var zone = game.addChild(LK.getAsset('placementZone', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
}));
zone.x = placementPositions[i].x;
zone.y = placementPositions[i].y;
zone.zoneIndex = i;
zone.down = function (x, y, obj) {
if (gameState === 'playing' && selectedDragonType) {
placeDragon(selectedDragonType, this.x, this.y, this.zoneIndex);
}
};
placementZones.push(zone);
}
// Create shop panel
var shopPanel = LK.gui.bottom.addChild(LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 1
}));
// Create dragon buttons
var fireButton = shopPanel.addChild(LK.getAsset('dragonButton', {
anchorX: 0.5,
anchorY: 0.5,
x: -600,
y: -150,
tint: 0xff4444
}));
var iceButton = shopPanel.addChild(LK.getAsset('dragonButton', {
anchorX: 0.5,
anchorY: 0.5,
x: -300,
y: -150,
tint: 0x4444ff
}));
var lightningButton = shopPanel.addChild(LK.getAsset('dragonButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -150,
tint: 0xffff44
}));
var upgradeButton = shopPanel.addChild(LK.getAsset('dragonButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 300,
y: -150,
tint: 0x00ff00
}));
var startWaveButton = shopPanel.addChild(LK.getAsset('dragonButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 600,
y: -150,
tint: 0xff8800
}));
// Create UI text
var goldText = LK.gui.topRight.addChild(new Text2('Gold: 100', {
size: 60,
fill: 0xFFFF00
}));
goldText.anchor.set(1, 0);
var livesText = LK.gui.topRight.addChild(new Text2('Lives: 10', {
size: 60,
fill: 0xFF0000
}));
livesText.anchor.set(1, 0);
livesText.y = 80;
var waveText = LK.gui.top.addChild(new Text2('Wave: 1', {
size: 60,
fill: 0xFFFFFF
}));
waveText.anchor.set(0.5, 0);
var fireButtonText = fireButton.addChild(new Text2('Fire\n30g', {
size: 30,
fill: 0xFFFFFF
}));
fireButtonText.anchor.set(0.5, 0.5);
var iceButtonText = iceButton.addChild(new Text2('Ice\n50g', {
size: 30,
fill: 0xFFFFFF
}));
iceButtonText.anchor.set(0.5, 0.5);
var lightningButtonText = lightningButton.addChild(new Text2('Lightning\n70g', {
size: 30,
fill: 0xFFFFFF
}));
lightningButtonText.anchor.set(0.5, 0.5);
var upgradeButtonText = upgradeButton.addChild(new Text2('Upgrade\nSelect', {
size: 30,
fill: 0xFFFFFF
}));
upgradeButtonText.anchor.set(0.5, 0.5);
var startWaveButtonText = startWaveButton.addChild(new Text2('Start\nWave', {
size: 30,
fill: 0xFFFFFF
}));
startWaveButtonText.anchor.set(0.5, 0.5);
var selectedDragonType = null;
var waveSpawnIndex = 0;
var waveSpawnTimer = 0;
function updateGoldDisplay() {
goldText.setText('Gold: ' + playerGold);
}
function updateLivesDisplay() {
livesText.setText('Lives: ' + playerLives);
}
function updateWaveDisplay() {
waveText.setText('Wave: ' + currentWave);
}
function updateUpgradeButton() {
if (selectedDragon && !selectedDragon.isUpgraded) {
upgradeButtonText.setText('Upgrade\n' + selectedDragon.cost + 'g');
} else {
upgradeButtonText.setText('Upgrade\nSelect');
}
}
function placeDragon(type, x, y, zoneIndex) {
var cost = type === 'fire' ? 30 : type === 'ice' ? 50 : 70;
if (playerGold >= cost) {
var hasExistingDragon = false;
for (var i = 0; i < dragons.length; i++) {
if (Math.abs(dragons[i].x - x) < 50 && Math.abs(dragons[i].y - y) < 50) {
hasExistingDragon = true;
break;
}
}
if (!hasExistingDragon) {
playerGold -= cost;
updateGoldDisplay();
var dragon = game.addChild(new Dragon(type, x, y));
dragons.push(dragon);
selectedDragonType = null;
updateButtonHighlights();
}
}
}
function updateButtonHighlights() {
fireButton.tint = selectedDragonType === 'fire' ? 0xffaaaa : 0xff4444;
iceButton.tint = selectedDragonType === 'ice' ? 0xaaaaff : 0x4444ff;
lightningButton.tint = selectedDragonType === 'lightning' ? 0xffffaa : 0xffff44;
}
function startWave() {
if (waveInProgress) return;
waveInProgress = true;
waveSpawnIndex = 0;
waveSpawnTimer = 0;
selectedDragon = null;
updateUpgradeButton();
}
function spawnEnemy() {
var enemyType;
var waveSize;
if (currentWave === 1) {
enemyType = 'regularSkeleton';
waveSize = 20;
} else if (currentWave === 2) {
enemyType = 'shieldedSkeleton';
waveSize = 20;
} else if (currentWave === 3) {
if (waveSpawnIndex < 2) {
enemyType = 'giantSkeleton';
} else {
enemyType = 'witchBoss';
}
waveSize = 3;
}
if (waveSpawnIndex < waveSize) {
var enemy = game.addChild(new Enemy(enemyType));
enemies.push(enemy);
waveSpawnIndex++;
}
}
function checkWaveComplete() {
if (waveInProgress && enemies.length === 0) {
waveInProgress = false;
if (currentWave >= 3) {
gameState = 'victory';
LK.showYouWin();
} else {
currentWave++;
updateWaveDisplay();
}
}
}
function handleChainLightning(hitTarget, baseDamage) {
var chainTargets = [];
var maxChains = selectedDragon && selectedDragon.isUpgraded ? 5 : 3;
var chainDamages = selectedDragon && selectedDragon.isUpgraded ? [baseDamage, baseDamage * 0.7, baseDamage * 0.5, baseDamage * 0.3, baseDamage * 0.2] : [baseDamage, baseDamage * 0.5, baseDamage * 0.25];
for (var i = 0; i < enemies.length && chainTargets.length < maxChains - 1; i++) {
var enemy = enemies[i];
if (enemy !== hitTarget) {
var dx = enemy.x - hitTarget.x;
var dy = enemy.y - hitTarget.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= 200) {
chainTargets.push(enemy);
}
}
}
for (var i = 0; i < chainTargets.length; i++) {
var target = chainTargets[i];
var damage = chainDamages[i + 1];
LK.setTimeout(function (t, d) {
return function () {
if (t && t.health > 0) {
t.takeDamage(d);
}
};
}(target, damage), (i + 1) * 100);
}
}
// Button event handlers
fireButton.down = function () {
if (gameState === 'playing' && playerGold >= 30) {
selectedDragonType = selectedDragonType === 'fire' ? null : 'fire';
updateButtonHighlights();
}
};
iceButton.down = function () {
if (gameState === 'playing' && playerGold >= 50) {
selectedDragonType = selectedDragonType === 'ice' ? null : 'ice';
updateButtonHighlights();
}
};
lightningButton.down = function () {
if (gameState === 'playing' && playerGold >= 70) {
selectedDragonType = selectedDragonType === 'lightning' ? null : 'lightning';
updateButtonHighlights();
}
};
upgradeButton.down = function () {
if (gameState === 'playing' && selectedDragon) {
selectedDragon.upgrade();
updateUpgradeButton();
}
};
startWaveButton.down = function () {
if (gameState === 'playing' && !waveInProgress) {
startWave();
}
};
game.update = function () {
if (gameState !== 'playing') return;
// Update dragons
for (var i = 0; i < dragons.length; i++) {
dragons[i].update();
}
// Update enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].update();
}
// Spawn enemies during wave
if (waveInProgress) {
waveSpawnTimer++;
if (waveSpawnTimer >= 120) {
spawnEnemy();
waveSpawnTimer = 0;
}
}
// Check if wave is complete
if (waveInProgress && waveSpawnIndex >= (currentWave === 3 ? 3 : 20) && enemies.length === 0) {
checkWaveComplete();
}
}; ===================================================================
--- original.js
+++ change.js
basic red fire dragon. 3d. In-Game asset. 2d. High contrast. No shadows
şimşek. In-Game asset. 2d. High contrast. No shadows
skeleton. In-Game asset. 2d. High contrast. No shadows
kalkanlı zırhlı iskelet. In-Game asset. 2d. High contrast. No shadows
cadı boss. In-Game asset. 2d. High contrast. No shadows
şimşek fırlatan bir elektrik ejderhası. In-Game asset. 2d. High contrast. No shadows şimşekleri sil
bu buz fırlatan bir buz ejderhası soğukları iliklerimize kadar hissetiriyor ejderha çizimi buz içermesin. In-Game asset. 2d. High contrast. No shadows bu çizimde ejderhanın ağzı açık olsun ama bir şey çıkmasın
bu bir buz parçası. uzun sivri bir koni gibi. In-Game asset. 2d. High contrast. No shadows
yuvarlak alev topu. In-Game asset. 2d. High contrast. No shadows
dümdüz toprak bir yol taş süslemeleri. In-Game asset. 2d. High contrast. No shadows
papatya. In-Game asset. 2d. High contrast. No shadows
üstten bakılan kaya parçaları. In-Game asset. 2d. High contrast. No shadows
çizimler iyi . ağzı açık olsun ama lazer olmasın. In-Game asset. 2d. High contrast. No shadows