/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Defender class (minimal implementation, can be expanded as needed) var Defender = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Defender asset references for each age self.defenderAssets = [self.attachAsset('defender_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('defender_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('defender_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set defender appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.defenderAssets.length; i++) { self.defenderAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); return self; }); // Enemy class (minimal implementation, can be expanded as needed) var Enemy = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Enemy asset references for each age self.enemyAssets = [self.attachAsset('enemy_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('enemy_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('enemy_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set enemy appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.enemyAssets.length; i++) { self.enemyAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // Default speed (can be overridden) self.speed = 3; // Update method for movement self.update = function () { if (typeof self.lastX === "undefined") self.lastX = self.x; // Move left by speed self.x -= self.speed; self.lastX = self.x; }; return self; }); // EnemyTower class (minimal implementation, can be expanded as needed) var EnemyTower = Container.expand(function () { var self = Container.call(this); // Store current age for asset switching self.currentAge = 0; // Tower asset references for each age self.towerAssets = [self.attachAsset('tower_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('tower_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('tower_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set tower appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.towerAssets.length; i++) { self.towerAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); return self; }); // AI-controlled support defender class var NpcDefender = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Defender asset references for each age self.defenderAssets = [self.attachAsset('defender_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('defender_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('defender_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set defender appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.defenderAssets.length; i++) { self.defenderAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // AI shooting cooldowns (same as player) self.shootCooldowns = [300, 180, 100]; self.shootCooldown = self.shootCooldowns[0]; self.lastShotTime = 0; // AI shoot logic: find nearest enemy and shoot self.tryShoot = function () { if (typeof enemies === "undefined" || enemies.length === 0) return; var now = Date.now(); if (now - self.lastShotTime < self.shootCooldown) return; // Find nearest enemy var minDist = Infinity; var targetEnemy = null; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; var dx = e.x - self.x; var dy = e.y - self.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; targetEnemy = e; } } if (targetEnemy) { var proj = new Projectile(); proj.setAge(self.currentAge); proj.x = self.x + 80; proj.y = self.y; proj.setTarget(targetEnemy.x, targetEnemy.y); projectiles.push(proj); game.addChild(proj); self.lastShotTime = now; // Play shoot sound for current age if (self.currentAge === 0) { LK.getSound('shoot_stone').play(); } else if (self.currentAge === 1) { LK.getSound('shoot_medieval').play(); } else if (self.currentAge === 2) { LK.getSound('shoot_modern').play(); } } }; // Update method for AI self.update = function () { self.tryShoot(); }; return self; }); // Projectile class for defender's attack var Projectile = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Attach projectile assets for each age self.projectileAssets = [self.attachAsset('projectile_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('projectile_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('projectile_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set projectile appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.projectileAssets.length; i++) { self.projectileAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // Target position self.targetX = self.x; self.targetY = self.y; self.speed = 40; // Fast projectile // Set the target for the projectile to move towards self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; // Calculate normalized direction var dx = x - self.x; var dy = y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) { self.vx = self.speed; self.vy = 0; } else { self.vx = dx / dist * self.speed; self.vy = dy / dist * self.speed; } }; // Update method for movement self.update = function () { if (typeof self.lastX === "undefined") self.lastX = self.x; if (typeof self.lastY === "undefined") self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Sound assets for each age and action // Savunma kulesi assetleri (her çağ için farklı) // Savunma kulesi assetleri (her çağ için) // Geçiş efekti için // Düşmanlar (çağa göre farklı renkler) // Farklı çağlar için mermi/ok/kurşun // Silahlar ve çağlar için farklı renklerde savunma birimi // Oyun parametreleri var AGES = [{ name: "Taş Çağı", scoreToNext: 10 }, { name: "Orta Çağ", scoreToNext: 25 }, { name: "Modern Çağ", scoreToNext: 50 }]; var currentAge = 0; var score = 0; var wave = 1; var money = 0; var moneyTxt = null; var enemies = []; var projectiles = []; var defender = null; var dragNode = null; var lastTouch = { x: 1024, y: 2300 }; var canShoot = true; // Ateş hızı çağlara göre: taş 200ms, ortaçağ 120ms, modern 60ms var shootCooldowns = [200, 120, 60]; var shootCooldown = shootCooldowns[0]; var lastShotTime = 0; var ageFlash = null; var ageText = null; var scoreTxt = null; var waveTxt = null; var ageTxt = null; var gameOver = false; // Arka planlar: Her çağ için bir arka plan asset'i oluştur ve ekle var backgrounds = [LK.getAsset('bg_stone', { anchorX: 0, anchorY: 0, x: 0, y: 0 }), LK.getAsset('bg_medieval', { anchorX: 0, anchorY: 0, x: 0, y: 0 }), LK.getAsset('bg_modern', { anchorX: 0, anchorY: 0, x: 0, y: 0 })]; // Sadece ilk çağın arka planını göster, diğerlerini gizle for (var i = 0; i < backgrounds.length; i++) { if (i === 0) { backgrounds[i].visible = true; } else { backgrounds[i].visible = false; } game.addChild(backgrounds[i]); } // Savunma kulesi oluştur ve ekle var defenderTower = new EnemyTower(); defenderTower.setAge(0); defenderTower.x = 180; // Kuleyi daha sola al defenderTower.y = 1000; // Haritanın ortasının biraz üstü (1366 merkez, 1000 üstte) game.addChild(defenderTower); // Savunma birimini oluştur ve kuleye göre daha sağda konumlandır defender = new Defender(); defender.x = 600; defender.y = 1366; game.addChild(defender); // --- Add two AI-controlled support NPC defenders --- var npcDefender1 = new NpcDefender(); npcDefender1.x = 900; npcDefender1.y = 1366 - 300; // üstte game.addChild(npcDefender1); var npcDefender2 = new NpcDefender(); npcDefender2.x = 900; npcDefender2.y = 1366 + 300; // altta game.addChild(npcDefender2); // Skor ve çağ göstergeleri scoreTxt = new Text2('0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Para göstergesi moneyTxt = new Text2("₺ 0", { size: 80, fill: 0xFFD700 }); moneyTxt.anchor.set(0.5, 0); LK.gui.top.addChild(moneyTxt); ageTxt = new Text2(AGES[currentAge].name, { size: 70, fill: 0xFFE066 }); ageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(ageTxt); waveTxt = new Text2('Dalga: 1', { size: 60, fill: "#fff" }); waveTxt.anchor.set(0.5, 0); LK.gui.top.addChild(waveTxt); // GUI pozisyonları scoreTxt.y = 20; scoreTxt.x = 2048 / 2; moneyTxt.y = 20; moneyTxt.x = 2048 - 180; // Sağ üst köşe, menüye çarpmayacak şekilde biraz içeride ageTxt.y = 140; ageTxt.x = 2048 / 2; waveTxt.y = 220; waveTxt.x = 2048 / 2; // Çağ geçiş efekti function showAgeFlash(newAge) { if (ageFlash) { ageFlash.destroy(); ageFlash = null; } ageFlash = LK.getAsset('age_flash', { anchorX: 0, anchorY: 0, x: 0, y: 0, alpha: 0.0 }); game.addChild(ageFlash); ageFlash.alpha = 0.8; var txt = new Text2(AGES[newAge].name + "!", { size: 180, fill: "#222" }); txt.anchor.set(0.5, 0.5); txt.x = 2048 / 2; txt.y = 2732 / 2; game.addChild(txt); // Play age-up sound for new age if (newAge === 0) { LK.getSound('ageup_stone').play(); } else if (newAge === 1) { LK.getSound('ageup_medieval').play(); } else if (newAge === 2) { LK.getSound('ageup_modern').play(); } // Savunma kulesi çağını güncelle if (typeof defenderTower !== "undefined" && defenderTower.setAge) { defenderTower.setAge(newAge); } // NPC'lerin çağını güncelle if (typeof npcDefender1 !== "undefined" && npcDefender1.setAge) { npcDefender1.setAge(newAge); } if (typeof npcDefender2 !== "undefined" && npcDefender2.setAge) { npcDefender2.setAge(newAge); } // Arka planı güncelle: Sadece yeni çağın arka planını göster for (var i = 0; i < backgrounds.length; i++) { backgrounds[i].visible = i === newAge; } tween(ageFlash, { alpha: 0 }, { duration: 1200, easing: tween.linear, onFinish: function onFinish() { ageFlash.destroy(); txt.destroy(); ageFlash = null; } }); tween(txt, { alpha: 0 }, { duration: 1200, easing: tween.linear }); } // Düşman dalgası oluştur function spawnWave() { // Düşman sayısını daha hızlı artır (ör: 5 + 2*wave) var count = 5 + 2 * wave; var minY = 180, maxY = 2732 - 180; var minX = 2048 + 100; var maxX = 2048 + 400; for (var i = 0; i < count; i++) { var enemy = new Enemy(); enemy.setAge(currentAge); // Tüm düşmanlar sağdan sola gelecek şekilde ayarlanıyor var minY = 180, maxY = 2732 - 180; var minX = 2048 + 100, maxX = 2048 + 400; enemy.x = maxX + Math.floor(Math.random() * 200); enemy.y = minY + Math.floor(Math.random() * (maxY - minY)); enemy.speedX = -(3 + currentAge * 1 + Math.floor(wave / 3)); enemy.speedY = 0; enemy.update = function () { if (typeof this.lastX === "undefined") this.lastX = this.x; this.x += this.speedX; this.lastX = this.x; }; enemies.push(enemy); game.addChild(enemy); } } // İlk dalga spawnWave(); // Sürükleme ve ateşleme function handleMove(x, y, obj) { // Defender movement is disabled; do nothing here } game.down = function (x, y, obj) { // Savunma birimini sürükleme devre dışı if (!gameOver) { handleMove(x, y, obj); // Ateşle tryShoot(x, y); } }; game.move = function (x, y, obj) { handleMove(x, y, obj); }; game.up = function (x, y, obj) { // Dragging disabled, do not set dragNode }; // Ateşleme fonksiyonu function tryShoot(x, y) { var now = Date.now(); if (canShoot && now - lastShotTime > shootCooldown) { var proj = new Projectile(); proj.setAge(currentAge); proj.x = defender.x + 80; proj.y = defender.y; proj.setTarget(x, y); projectiles.push(proj); game.addChild(proj); lastShotTime = now; // Play shoot sound for current age if (currentAge === 0) { LK.getSound('shoot_stone').play(); } else if (currentAge === 1) { LK.getSound('shoot_medieval').play(); } else if (currentAge === 2) { LK.getSound('shoot_modern').play(); } } } // Oyun güncelleme game.update = function () { if (gameOver) return; // Mermileri güncelle for (var i = projectiles.length - 1; i >= 0; i--) { var p = projectiles[i]; p.update(); // Ekran dışıysa sil if (p.x < -100 || p.x > 2148) { p.destroy(); projectiles.splice(i, 1); } } // NPC'leri güncelle if (typeof npcDefender1 !== "undefined" && npcDefender1.update) { npcDefender1.update(); } if (typeof npcDefender2 !== "undefined" && npcDefender2.update) { npcDefender2.update(); } // Düşmanları güncelle for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; e.update(); // Düşman savunma birimine ulaştıysa oyun biter if (e.intersects(defender)) { LK.effects.flashScreen(0xff0000, 1000); gameOver = true; LK.showGameOver(); return; } // Düşman ekranın solundan geçtiyse oyun biter if (e.x < -100) { LK.effects.flashScreen(0xff0000, 1000); gameOver = true; LK.showGameOver(); return; } // Mermi ile çarpışma for (var k = projectiles.length - 1; k >= 0; k--) { var p = projectiles[k]; if (e.intersects(p)) { // Düşman ve mermi yok olur, skor artar e.destroy(); p.destroy(); enemies.splice(j, 1); projectiles.splice(k, 1); // Play hit sound for current age if (currentAge === 0) { LK.getSound('hit_stone').play(); } else if (currentAge === 1) { LK.getSound('hit_medieval').play(); } else if (currentAge === 2) { LK.getSound('hit_modern').play(); } score += 1; LK.setScore(score); scoreTxt.setText(score); // Para sistemi: Her çağ için farklı para ekle if (typeof money === "undefined") money = 0; if (currentAge === 0) { money += 1; } else if (currentAge === 1) { money += 2; } else if (currentAge === 2) { money += 3; } if (typeof moneyTxt !== "undefined") { moneyTxt.setText("₺ " + money); } // Çağ atlama kontrolü if (currentAge < AGES.length - 1 && score >= AGES[currentAge].scoreToNext) { currentAge += 1; defender.setAge(currentAge); showAgeFlash(currentAge); ageTxt.setText(AGES[currentAge].name); // Çağ atladıkça ateş hızını güncelle shootCooldown = shootCooldowns[currentAge]; } // Kazanma kontrolü if (score >= AGES[AGES.length - 1].scoreToNext) { LK.showYouWin(); gameOver = true; return; } break; } } } // Dalga bitti mi? if (enemies.length === 0 && !gameOver) { wave += 1; waveTxt.setText('Dalga: ' + wave); spawnWave(); } }; // Oyun başında çağ ve skorları sıfırla function resetGame() { currentAge = 0; score = 0; money = 0; wave = 1; enemies = []; projectiles = []; defender.setAge(0); shootCooldown = shootCooldowns[0]; defender.x = 180; defender.y = 1366; if (typeof moneyTxt !== "undefined") { moneyTxt.setText("₺ 0"); } // Reset NPC defenders if (typeof npcDefender1 !== "undefined") { npcDefender1.setAge(0); npcDefender1.x = 900; npcDefender1.y = 1366 - 300; } if (typeof npcDefender2 !== "undefined") { npcDefender2.setAge(0); npcDefender2.x = 900; npcDefender2.y = 1366 + 300; } // Savunma kulesini de sıfırla if (typeof defenderTower !== "undefined" && defenderTower.setAge) { defenderTower.setAge(0); defenderTower.x = 180; defenderTower.y = 1000; // Haritanın ortasının biraz üstü } scoreTxt.setText('0'); ageTxt.setText(AGES[0].name); waveTxt.setText('Dalga: 1'); gameOver = false; // Arka planı sıfırla: Sadece ilk çağın arka planı görünsün for (var i = 0; i < backgrounds.length; i++) { backgrounds[i].visible = i === 0; } } // Oyun yeniden başlatıldığında sıfırla LK.on('gameStart', function () { resetGame(); // Tüm düşman ve mermileri sil for (var i = 0; i < enemies.length; i++) { enemies[i].destroy(); } for (var j = 0; j < projectiles.length; j++) { projectiles[j].destroy(); } enemies = []; projectiles = []; spawnWave(); });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Defender class (minimal implementation, can be expanded as needed)
var Defender = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Defender asset references for each age
self.defenderAssets = [self.attachAsset('defender_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('defender_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('defender_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set defender appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.defenderAssets.length; i++) {
self.defenderAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
return self;
});
// Enemy class (minimal implementation, can be expanded as needed)
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Enemy asset references for each age
self.enemyAssets = [self.attachAsset('enemy_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('enemy_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('enemy_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set enemy appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.enemyAssets.length; i++) {
self.enemyAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// Default speed (can be overridden)
self.speed = 3;
// Update method for movement
self.update = function () {
if (typeof self.lastX === "undefined") self.lastX = self.x;
// Move left by speed
self.x -= self.speed;
self.lastX = self.x;
};
return self;
});
// EnemyTower class (minimal implementation, can be expanded as needed)
var EnemyTower = Container.expand(function () {
var self = Container.call(this);
// Store current age for asset switching
self.currentAge = 0;
// Tower asset references for each age
self.towerAssets = [self.attachAsset('tower_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('tower_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('tower_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set tower appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.towerAssets.length; i++) {
self.towerAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
return self;
});
// AI-controlled support defender class
var NpcDefender = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Defender asset references for each age
self.defenderAssets = [self.attachAsset('defender_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('defender_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('defender_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set defender appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.defenderAssets.length; i++) {
self.defenderAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// AI shooting cooldowns (same as player)
self.shootCooldowns = [300, 180, 100];
self.shootCooldown = self.shootCooldowns[0];
self.lastShotTime = 0;
// AI shoot logic: find nearest enemy and shoot
self.tryShoot = function () {
if (typeof enemies === "undefined" || enemies.length === 0) return;
var now = Date.now();
if (now - self.lastShotTime < self.shootCooldown) return;
// Find nearest enemy
var minDist = Infinity;
var targetEnemy = null;
for (var i = 0; i < enemies.length; i++) {
var e = enemies[i];
var dx = e.x - self.x;
var dy = e.y - self.y;
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
targetEnemy = e;
}
}
if (targetEnemy) {
var proj = new Projectile();
proj.setAge(self.currentAge);
proj.x = self.x + 80;
proj.y = self.y;
proj.setTarget(targetEnemy.x, targetEnemy.y);
projectiles.push(proj);
game.addChild(proj);
self.lastShotTime = now;
// Play shoot sound for current age
if (self.currentAge === 0) {
LK.getSound('shoot_stone').play();
} else if (self.currentAge === 1) {
LK.getSound('shoot_medieval').play();
} else if (self.currentAge === 2) {
LK.getSound('shoot_modern').play();
}
}
};
// Update method for AI
self.update = function () {
self.tryShoot();
};
return self;
});
// Projectile class for defender's attack
var Projectile = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Attach projectile assets for each age
self.projectileAssets = [self.attachAsset('projectile_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('projectile_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('projectile_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set projectile appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.projectileAssets.length; i++) {
self.projectileAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// Target position
self.targetX = self.x;
self.targetY = self.y;
self.speed = 40; // Fast projectile
// Set the target for the projectile to move towards
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
// Calculate normalized direction
var dx = x - self.x;
var dy = y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist === 0) {
self.vx = self.speed;
self.vy = 0;
} else {
self.vx = dx / dist * self.speed;
self.vy = dy / dist * self.speed;
}
};
// Update method for movement
self.update = function () {
if (typeof self.lastX === "undefined") self.lastX = self.x;
if (typeof self.lastY === "undefined") self.lastY = self.y;
self.x += self.vx;
self.y += self.vy;
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Sound assets for each age and action
// Savunma kulesi assetleri (her çağ için farklı)
// Savunma kulesi assetleri (her çağ için)
// Geçiş efekti için
// Düşmanlar (çağa göre farklı renkler)
// Farklı çağlar için mermi/ok/kurşun
// Silahlar ve çağlar için farklı renklerde savunma birimi
// Oyun parametreleri
var AGES = [{
name: "Taş Çağı",
scoreToNext: 10
}, {
name: "Orta Çağ",
scoreToNext: 25
}, {
name: "Modern Çağ",
scoreToNext: 50
}];
var currentAge = 0;
var score = 0;
var wave = 1;
var money = 0;
var moneyTxt = null;
var enemies = [];
var projectiles = [];
var defender = null;
var dragNode = null;
var lastTouch = {
x: 1024,
y: 2300
};
var canShoot = true;
// Ateş hızı çağlara göre: taş 200ms, ortaçağ 120ms, modern 60ms
var shootCooldowns = [200, 120, 60];
var shootCooldown = shootCooldowns[0];
var lastShotTime = 0;
var ageFlash = null;
var ageText = null;
var scoreTxt = null;
var waveTxt = null;
var ageTxt = null;
var gameOver = false;
// Arka planlar: Her çağ için bir arka plan asset'i oluştur ve ekle
var backgrounds = [LK.getAsset('bg_stone', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}), LK.getAsset('bg_medieval', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}), LK.getAsset('bg_modern', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
})];
// Sadece ilk çağın arka planını göster, diğerlerini gizle
for (var i = 0; i < backgrounds.length; i++) {
if (i === 0) {
backgrounds[i].visible = true;
} else {
backgrounds[i].visible = false;
}
game.addChild(backgrounds[i]);
}
// Savunma kulesi oluştur ve ekle
var defenderTower = new EnemyTower();
defenderTower.setAge(0);
defenderTower.x = 180; // Kuleyi daha sola al
defenderTower.y = 1000; // Haritanın ortasının biraz üstü (1366 merkez, 1000 üstte)
game.addChild(defenderTower);
// Savunma birimini oluştur ve kuleye göre daha sağda konumlandır
defender = new Defender();
defender.x = 600;
defender.y = 1366;
game.addChild(defender);
// --- Add two AI-controlled support NPC defenders ---
var npcDefender1 = new NpcDefender();
npcDefender1.x = 900;
npcDefender1.y = 1366 - 300; // üstte
game.addChild(npcDefender1);
var npcDefender2 = new NpcDefender();
npcDefender2.x = 900;
npcDefender2.y = 1366 + 300; // altta
game.addChild(npcDefender2);
// Skor ve çağ göstergeleri
scoreTxt = new Text2('0', {
size: 100,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Para göstergesi
moneyTxt = new Text2("₺ 0", {
size: 80,
fill: 0xFFD700
});
moneyTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyTxt);
ageTxt = new Text2(AGES[currentAge].name, {
size: 70,
fill: 0xFFE066
});
ageTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(ageTxt);
waveTxt = new Text2('Dalga: 1', {
size: 60,
fill: "#fff"
});
waveTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(waveTxt);
// GUI pozisyonları
scoreTxt.y = 20;
scoreTxt.x = 2048 / 2;
moneyTxt.y = 20;
moneyTxt.x = 2048 - 180; // Sağ üst köşe, menüye çarpmayacak şekilde biraz içeride
ageTxt.y = 140;
ageTxt.x = 2048 / 2;
waveTxt.y = 220;
waveTxt.x = 2048 / 2;
// Çağ geçiş efekti
function showAgeFlash(newAge) {
if (ageFlash) {
ageFlash.destroy();
ageFlash = null;
}
ageFlash = LK.getAsset('age_flash', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
alpha: 0.0
});
game.addChild(ageFlash);
ageFlash.alpha = 0.8;
var txt = new Text2(AGES[newAge].name + "!", {
size: 180,
fill: "#222"
});
txt.anchor.set(0.5, 0.5);
txt.x = 2048 / 2;
txt.y = 2732 / 2;
game.addChild(txt);
// Play age-up sound for new age
if (newAge === 0) {
LK.getSound('ageup_stone').play();
} else if (newAge === 1) {
LK.getSound('ageup_medieval').play();
} else if (newAge === 2) {
LK.getSound('ageup_modern').play();
}
// Savunma kulesi çağını güncelle
if (typeof defenderTower !== "undefined" && defenderTower.setAge) {
defenderTower.setAge(newAge);
}
// NPC'lerin çağını güncelle
if (typeof npcDefender1 !== "undefined" && npcDefender1.setAge) {
npcDefender1.setAge(newAge);
}
if (typeof npcDefender2 !== "undefined" && npcDefender2.setAge) {
npcDefender2.setAge(newAge);
}
// Arka planı güncelle: Sadece yeni çağın arka planını göster
for (var i = 0; i < backgrounds.length; i++) {
backgrounds[i].visible = i === newAge;
}
tween(ageFlash, {
alpha: 0
}, {
duration: 1200,
easing: tween.linear,
onFinish: function onFinish() {
ageFlash.destroy();
txt.destroy();
ageFlash = null;
}
});
tween(txt, {
alpha: 0
}, {
duration: 1200,
easing: tween.linear
});
}
// Düşman dalgası oluştur
function spawnWave() {
// Düşman sayısını daha hızlı artır (ör: 5 + 2*wave)
var count = 5 + 2 * wave;
var minY = 180,
maxY = 2732 - 180;
var minX = 2048 + 100;
var maxX = 2048 + 400;
for (var i = 0; i < count; i++) {
var enemy = new Enemy();
enemy.setAge(currentAge);
// Tüm düşmanlar sağdan sola gelecek şekilde ayarlanıyor
var minY = 180,
maxY = 2732 - 180;
var minX = 2048 + 100,
maxX = 2048 + 400;
enemy.x = maxX + Math.floor(Math.random() * 200);
enemy.y = minY + Math.floor(Math.random() * (maxY - minY));
enemy.speedX = -(3 + currentAge * 1 + Math.floor(wave / 3));
enemy.speedY = 0;
enemy.update = function () {
if (typeof this.lastX === "undefined") this.lastX = this.x;
this.x += this.speedX;
this.lastX = this.x;
};
enemies.push(enemy);
game.addChild(enemy);
}
}
// İlk dalga
spawnWave();
// Sürükleme ve ateşleme
function handleMove(x, y, obj) {
// Defender movement is disabled; do nothing here
}
game.down = function (x, y, obj) {
// Savunma birimini sürükleme devre dışı
if (!gameOver) {
handleMove(x, y, obj);
// Ateşle
tryShoot(x, y);
}
};
game.move = function (x, y, obj) {
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
// Dragging disabled, do not set dragNode
};
// Ateşleme fonksiyonu
function tryShoot(x, y) {
var now = Date.now();
if (canShoot && now - lastShotTime > shootCooldown) {
var proj = new Projectile();
proj.setAge(currentAge);
proj.x = defender.x + 80;
proj.y = defender.y;
proj.setTarget(x, y);
projectiles.push(proj);
game.addChild(proj);
lastShotTime = now;
// Play shoot sound for current age
if (currentAge === 0) {
LK.getSound('shoot_stone').play();
} else if (currentAge === 1) {
LK.getSound('shoot_medieval').play();
} else if (currentAge === 2) {
LK.getSound('shoot_modern').play();
}
}
}
// Oyun güncelleme
game.update = function () {
if (gameOver) return;
// Mermileri güncelle
for (var i = projectiles.length - 1; i >= 0; i--) {
var p = projectiles[i];
p.update();
// Ekran dışıysa sil
if (p.x < -100 || p.x > 2148) {
p.destroy();
projectiles.splice(i, 1);
}
}
// NPC'leri güncelle
if (typeof npcDefender1 !== "undefined" && npcDefender1.update) {
npcDefender1.update();
}
if (typeof npcDefender2 !== "undefined" && npcDefender2.update) {
npcDefender2.update();
}
// Düşmanları güncelle
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
e.update();
// Düşman savunma birimine ulaştıysa oyun biter
if (e.intersects(defender)) {
LK.effects.flashScreen(0xff0000, 1000);
gameOver = true;
LK.showGameOver();
return;
}
// Düşman ekranın solundan geçtiyse oyun biter
if (e.x < -100) {
LK.effects.flashScreen(0xff0000, 1000);
gameOver = true;
LK.showGameOver();
return;
}
// Mermi ile çarpışma
for (var k = projectiles.length - 1; k >= 0; k--) {
var p = projectiles[k];
if (e.intersects(p)) {
// Düşman ve mermi yok olur, skor artar
e.destroy();
p.destroy();
enemies.splice(j, 1);
projectiles.splice(k, 1);
// Play hit sound for current age
if (currentAge === 0) {
LK.getSound('hit_stone').play();
} else if (currentAge === 1) {
LK.getSound('hit_medieval').play();
} else if (currentAge === 2) {
LK.getSound('hit_modern').play();
}
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Para sistemi: Her çağ için farklı para ekle
if (typeof money === "undefined") money = 0;
if (currentAge === 0) {
money += 1;
} else if (currentAge === 1) {
money += 2;
} else if (currentAge === 2) {
money += 3;
}
if (typeof moneyTxt !== "undefined") {
moneyTxt.setText("₺ " + money);
}
// Çağ atlama kontrolü
if (currentAge < AGES.length - 1 && score >= AGES[currentAge].scoreToNext) {
currentAge += 1;
defender.setAge(currentAge);
showAgeFlash(currentAge);
ageTxt.setText(AGES[currentAge].name);
// Çağ atladıkça ateş hızını güncelle
shootCooldown = shootCooldowns[currentAge];
}
// Kazanma kontrolü
if (score >= AGES[AGES.length - 1].scoreToNext) {
LK.showYouWin();
gameOver = true;
return;
}
break;
}
}
}
// Dalga bitti mi?
if (enemies.length === 0 && !gameOver) {
wave += 1;
waveTxt.setText('Dalga: ' + wave);
spawnWave();
}
};
// Oyun başında çağ ve skorları sıfırla
function resetGame() {
currentAge = 0;
score = 0;
money = 0;
wave = 1;
enemies = [];
projectiles = [];
defender.setAge(0);
shootCooldown = shootCooldowns[0];
defender.x = 180;
defender.y = 1366;
if (typeof moneyTxt !== "undefined") {
moneyTxt.setText("₺ 0");
}
// Reset NPC defenders
if (typeof npcDefender1 !== "undefined") {
npcDefender1.setAge(0);
npcDefender1.x = 900;
npcDefender1.y = 1366 - 300;
}
if (typeof npcDefender2 !== "undefined") {
npcDefender2.setAge(0);
npcDefender2.x = 900;
npcDefender2.y = 1366 + 300;
}
// Savunma kulesini de sıfırla
if (typeof defenderTower !== "undefined" && defenderTower.setAge) {
defenderTower.setAge(0);
defenderTower.x = 180;
defenderTower.y = 1000; // Haritanın ortasının biraz üstü
}
scoreTxt.setText('0');
ageTxt.setText(AGES[0].name);
waveTxt.setText('Dalga: 1');
gameOver = false;
// Arka planı sıfırla: Sadece ilk çağın arka planı görünsün
for (var i = 0; i < backgrounds.length; i++) {
backgrounds[i].visible = i === 0;
}
}
// Oyun yeniden başlatıldığında sıfırla
LK.on('gameStart', function () {
resetGame();
// Tüm düşman ve mermileri sil
for (var i = 0; i < enemies.length; i++) {
enemies[i].destroy();
}
for (var j = 0; j < projectiles.length; j++) {
projectiles[j].destroy();
}
enemies = [];
projectiles = [];
spawnWave();
});
taş devri döneminde savaşçı. In-Game asset. 2d. High contrast. No shadows. taş devri asker
Ortaçağ dönemi savaşçı. In-Game asset. 2d. High contrast. No shadows
Modern çağ dönemi savaşçı. In-Game asset. 2d. High contrast. No shadows
Taş devri düşman. In-Game asset. 2d. High contrast. No shadows
Modern çağ düşman. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi düşman. In-Game asset. 2d. High contrast. No shadows
Taş devri cephane mermisi. In-Game asset. 2d. High contrast. No shadows
Modern çağ dönemi cephane mermisi. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi silah mermisi. In-Game asset. 2d. High contrast. No shadows
Taş devri arka plan. In-Game asset. 2d. High contrast. No shadows
Modern çağ için savaş arka planı. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi için savaş arka planı. In-Game asset. 2d. High contrast. No shadows
Taş devri Kule. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi kule savunma. In-Game asset. 2d. High contrast. No shadows
modern çağ dönemi kule savunma. In-Game asset. 2d. High contrast. No shadows