User prompt
mağazayı biraz yukarı koy
User prompt
mağazayı biraz yukarı koy
User prompt
mağazayı solaa koy
User prompt
mağaza yine gözükmüyor
User prompt
mağza tuşunu konumunu değiştir
User prompt
score ekran gözükmüyor biraz daha ortalara getir ekranda görünür hale getir mağaza düğmesi için aynı şeyler geçerli
User prompt
mağaza tuşunu sol alta koy
User prompt
tuş yok
User prompt
alt ortadaki yazıları sil
User prompt
şimdik ekranın en üst orta köşesine tuş koy tuş açıldığında 3 tane silah çıkıyor fareni silahlara götürdüğünde ücreti ve mermi hızı ve gücünü söylüyor paramızı yeterse ala biliriz yetmezse uyarı çıkar ayrıca. ayrıca silahları biraz daha büyüt adamın elindeki silahları. paramız yeşil renkte gözüksün sol köşede bir ortada gözüksün
User prompt
şimdik ekranın en üst orta köşesine tuş koy tuş açıldığında 3 tane silah çıkıyor fareni silahlara götürdüğünde ücreti ve mermi hızı ve gücünü söylüyor paramızı yeterse ala biliriz yetmezse uyarı çıkar ayrıca ekranın alt ortadaki upgrade fire rate ($10): 1.0shots/sec ve onunda altındaki yazıyıda sil
User prompt
caanımız azaldıkça kırmızıya dönüşen yer taşıyor
User prompt
geri al
User prompt
hasar aldığımızda kırmızı yeri sil ve sağ üst köşeded kırmızılaşıcak can barını koy yeşilen kırmızıya dönecek ve sayıda belirlitilecek
User prompt
karakterin elinde silah dursun silah fare imlecin baktığı yöne haraket etsin
User prompt
arka plan için bir image oluştur kurak bira arazi yap
User prompt
arkaplan kuru arazi yap mermi rengini brazdaha parlak yap ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
sıktığımız yere mermi gitmiyor
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'fill')' in or related to this line: 'fireRateBtn.style.fill = currency >= upgrades.fireRate.cost ? "#00ff00" : "#ff0000";' Line Number: 290
Code edit (1 edits merged)
Please save this source code
User prompt
Concrete Bunker: Last Defense
Initial prompt
Oluşturulacak Yapay Zeka İçin Oyun Tasarım Prompt'u: Oyun Adı (Öneri): "Beton Siper" veya "Son Savunma" Oyun Türü: 2D Nişancı Platform / Kule Savunma Hibriti Temel Konsept: Oyuncu, sabit bir beton platform üzerinde duran bir keskin nişancıyı kontrol eder. Amacı, platforma ulaşmaya çalışan ve platforma hasar veren düşman dalgalarını yok etmektir. Düşmanlar öldürüldükçe oyuncu puan ve para kazanır. Puan, oyunun zorluğunu (düşman sayısı ve gücü) artırırken, para karakterin silahını veya savunmasını geliştirmek için harcanabilir. Beton platformun canı tükendiğinde oyun sona erer. 1. Oyuncu Karakteri ve Kontroller: * Pozisyon: Ekranın bir kenarında (örneğin sol veya orta-alt) yer alan, yıkılabilir bir beton karenin üzerinde sabit durur. * Eylemler: * Nişan Alma: Fare imleci ile serbest nişan alma. * Ateş Etme: Fare sol tıklaması ile ateş. * (Opsiyonel) Şarjör Değiştirme: 'R' tuşu ile. * Silah: Başlangıç seviyesi bir keskin nişancı tüfeği. Hasar, atış hızı, şarjör kapasitesi gibi özellikleri parayla yükseltilebilir. 2. Beton Platform: * Can Puanı (HP): Başlangıçta belirli bir can puanına sahip. * Hasar Alma: Düşmanlar platforma ulaştığında ve saldırdığında canı azalır. * Yenilenme Yok: Platformun canı doğal yollarla veya zamanla yenilenmez. * Oyun Sonu Koşulu: Platformun canı sıfıra ulaştığında oyun biter. 3. Düşman Yapay Zekası ve Türleri: * Davranış: * Doğuş: Genellikle ekranın oyuncuya uzak kenarından (örneğin sağından) doğarlar. * Hareket: Doğrusal bir şekilde veya basit engelleri aşarak oyuncunun bulunduğu beton platforma doğru ilerlerler. * Saldırı: Platforma ulaştıklarında durup platforma periyodik olarak hasar verirler. Oyuncuya doğrudan saldırmazlar. * Özellikler (Her Düşman İçin): * Can Puanı * Hareket Hızı * Platforma Verdikleri Hasar Miktarı * Öldürüldüğünde Kazandırdığı Puan * Öldürüldüğünde Kazandırdığı Para * Düşman Çeşitliliği (Skora Göre Artan): * Temel Düşman: Ortalama hız, düşük can, düşük hasar. * Hızlı Düşman: Yüksek hız, çok düşük can, düşük hasar (zor hedef). * Zırhlı Düşman: Düşük hız, yüksek can, ortalama hasar (yüksek isabet veya güçlü silah gerektirir). * Minyon Sürüsü: Çok sayıda, çok düşük can, çok düşük bireysel hasar ama toplu halde tehlikeli. * (Opsiyonel İleri Seviye) Patlayıcı Düşman: Platforma ulaştığında patlayarak yüksek hasar verir. 4. Skor, Para ve Zorluk Sistemi: * Skor: * Düşman öldürdükçe kazanılır. * Harcanamaz. * Oyunun ana ilerleme ve zorluk ölçütüdür. * Skor arttıkça: * Düşmanların doğma sıklığı artar. * Düşmanların canı ve/veya hasarı artar (yüzdesel veya sabit artışlar). * Yeni ve daha güçlü düşman türleri oyuna dahil olur. * Para: * Düşman öldürdükçe kazanılır. * Harcanabilir. * Düşman dalgaları arasında veya belirli aralıklarla açılan bir "Mağaza/Yükseltme" ekranında kullanılır. 5. Yükseltme Sistemi (Para Harcama): * Silah Yükseltmeleri: * Hasar Artışı * Atış Hızı Artışı * Şarjör Kapasitesi Artışı * Yeniden Doldurma Hızı Artışı * (Opsiyonel) Mermi Türleri (örn: Zırh Delici, Patlayıcı) * (Opsiyonel) Platform Savunma Yükseltmeleri: * NOT: Betonun canı yenilenmez dendiği için, bu "tek seferlik tamir" veya "geçici kalkan" gibi özellikler olabilir, ancak ana kurala sadık kalmak daha iyi olabilir. Belki platforma ek dikenli tel gibi pasif savunmalar eklenebilir. 6. Oyun Akışı: * Oyun başlar, oyuncu platformda, ilk düşmanlar belirir. * Oyuncu düşmanları vurur, puan ve para kazanır. * Skor arttıkça düşman dalgaları zorlaşır. * Belirli skor aralıklarında veya düşman dalgaları arasında oyuncuya yükseltme yapma fırsatı sunulur. * Platform yıkılana kadar oyun devam eder. * Oyun bitince oyuncunun ulaştığı skor gösterilir. 7. Görsel ve Atmosfer (Minimalist): * Arka Plan: Basit, stilize dağlık arazi silüetleri. Renk paleti kurak ve soluk olabilir. * Zemin: Beton platformun önünde uzanan, basit dokulu kurak bir patika. * Karakter, Düşmanlar, Platform: Abartısız, işlevsel 2D sprite'lar. Düşmanlar farklı renk veya basit şekillerle ayırt edilebilir. İstenmeyen Özellikler (Odak Dışı): * Karmaşık grafik efektleri. * Detaylı ses tasarımı. * Hikaye öğeleri. * Karakter animasyonlarında aşırı detay. Ana Odak: Sürükleyici ve giderek zorlaşan bir hayatta kalma deneyimi sunan çekirdek oynanış mekanikleri ve dengeli bir yapay zeka.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, currency: 0 }); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); self.graphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; // Default speed, will be overridden self.damage = 1; // Default damage, will be overridden self.active = true; self.update = function () { if (!self.active) return; // Use directional movement if speedX and speedY are defined if (self.speedX !== undefined && self.speedY !== undefined) { self.x += self.speedX; self.y += self.speedY; } else { // Fallback to original vertical-only movement self.y -= self.speed; } // Bullet goes off screen (check all edges) if (self.y < -50 || self.y > 2732 + 50 || self.x < -50 || self.x > 2048 + 50) { self.active = false; } }; self.hit = function () { self.active = false; LK.getSound('enemyHit').play(); LK.effects.flashObject(self, 0xffffff, 200); }; return self; }); var Bunker = Container.expand(function () { var self = Container.call(this); self.graphics = self.attachAsset('bunker', { anchorX: 0.5, anchorY: 0.5 }); self.damageIndicator = self.attachAsset('damageIndicator', { anchorX: 0.5, anchorY: 0.5 }); self.damageIndicator.alpha = 0; self.damageIndicator.originalX = 0; self.damageIndicator.originalY = 0; self.showDamage = function (percentage) { // Make indicator more visible as health decreases self.damageIndicator.alpha = 1 - percentage; // Move the indicator based on health percentage // Lower health = more movement var moveFactor = (1 - percentage) * 10; self.damageIndicator.x = self.damageIndicator.originalX + (Math.random() * 2 - 1) * moveFactor; self.damageIndicator.y = self.damageIndicator.originalY + (Math.random() * 2 - 1) * moveFactor; // Change tint to become redder as health decreases var healthColor = Math.floor(percentage * 255); self.damageIndicator.tint = 255 << 16 | healthColor << 8 | healthColor; }; // Store original position self.onAddedToStage = function () { self.damageIndicator.originalX = self.damageIndicator.x; self.damageIndicator.originalY = self.damageIndicator.y; }; return self; }); var Enemy = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'regular'; // Set properties based on enemy type switch (self.type) { case 'fast': self.graphics = self.attachAsset('fastEnemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.hp = 1; self.damage = 10; self.points = 15; self.currency = 2; break; case 'tank': self.graphics = self.attachAsset('tankEnemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.hp = 5; self.damage = 25; self.points = 30; self.currency = 5; break; default: // regular self.graphics = self.attachAsset('regularEnemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.hp = 2; self.damage = 15; self.points = 10; self.currency = 1; } self.active = true; self.update = function () { if (!self.active) return; self.y += self.speed; // Check if enemy reached the bunker if (self.y > bunkerY - 50) { self.attackBunker(); } }; self.takeDamage = function (amount) { self.hp -= amount; if (self.hp <= 0) { self.die(); } else { LK.effects.flashObject(self, 0xffffff, 200); } }; self.die = function () { self.active = false; LK.setScore(LK.getScore() + self.points); currency += self.currency; updateUI(); }; self.attackBunker = function () { bunkerHealth -= self.damage; updateBunkerHealth(); LK.getSound('bunkerHit').play(); LK.effects.flashObject(bunker, 0xff0000, 500); self.active = false; // Check if bunker is destroyed if (bunkerHealth <= 0) { gameOver(); } }; return self; }); var Sniper = Container.expand(function () { var self = Container.call(this); self.graphics = self.attachAsset('sniper', { anchorX: 0.5, anchorY: 0.5 }); // Add rifle that will rotate toward cursor self.rifle = self.attachAsset('rifle', { anchorX: 0, anchorY: 0.5 }); // Position rifle to appear like it's being held by the sniper self.rifle.x = 10; self.fireRate = 1000; // ms between shots self.lastShot = 0; self.bulletDamage = 1; self.bulletSpeed = 15; // Default bullet speed // Method to update rifle rotation based on cursor position self.updateAim = function (targetX, targetY) { // Calculate angle to target var angle = Math.atan2(targetY - self.y, targetX - self.x); // Set rifle rotation to aim at target self.rifle.rotation = angle; return angle; }; self.canShoot = function () { var now = Date.now(); if (now - self.lastShot >= self.fireRate) { self.lastShot = now; return true; } return false; }; self.shoot = function (targetX, targetY) { if (!self.canShoot()) return null; // Update rifle aim var angle = self.updateAim(targetX, targetY); var bullet = new Bullet(); // Calculate bullet spawn position at end of rifle var rifleLength = self.rifle.width; bullet.x = self.x + Math.cos(angle) * rifleLength; bullet.y = self.y + Math.sin(angle) * rifleLength; // Set bullet direction bullet.speedX = Math.cos(angle) * bullet.speed; bullet.speedY = Math.sin(angle) * bullet.speed; bullet.damage = self.bulletDamage; bullet.speed = self.bulletSpeed; // Set bullet speed from sniper LK.getSound('shoot').play(); return bullet; }; return self; }); var WeaponShop = Container.expand(function () { var self = Container.call(this); self.isOpen = false; self.weapons = [{ name: "Basic Rifle", price: 0, damage: 1, speed: 15, owned: true }, { name: "Sniper Rifle", price: 50, damage: 3, speed: 30, owned: false }, { name: "Machine Gun", price: 100, damage: 2, speed: 20, owned: false }]; // Shop button self.shopButton = new Text2("WEAPONS", { size: 80, fill: 0xFFFF00 }); self.shopButton.anchor.set(0.5, 0); // Add background to make button more visible var buttonBg = LK.getAsset('bullet', { width: 300, height: 100, anchorX: 0.5, anchorY: 0.5, tint: 0x333333 }); buttonBg.alpha = 0.8; buttonBg.y = self.shopButton.height / 2; self.addChild(buttonBg); self.addChild(self.shopButton); // Shop panel (hidden by default) self.panel = new Container(); self.panel.visible = false; self.addChild(self.panel); // Create weapon options self.weaponItems = []; for (var i = 0; i < self.weapons.length; i++) { var weapon = self.weapons[i]; var item = new Container(); var bg = LK.getAsset('bullet', { width: 400, height: 150, anchorX: 0.5, anchorY: 0.5, tint: 0x333333 }); bg.alpha = 0.8; item.addChild(bg); var title = new Text2(weapon.name, { size: 40, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.y = -50; item.addChild(title); var info = new Text2("Damage: " + weapon.damage + " | Speed: " + weapon.speed, { size: 30, fill: 0xFFFFFF }); info.anchor.set(0.5, 0); info.y = 0; item.addChild(info); var priceText = new Text2(weapon.owned ? "OWNED" : "$" + weapon.price, { size: 35, fill: weapon.owned ? 0x00FF00 : 0xFFFF00 }); priceText.anchor.set(0.5, 0); priceText.y = 40; item.addChild(priceText); item.y = i * 200; item.weaponIndex = i; self.weaponItems.push(item); self.panel.addChild(item); } // Position panel self.panel.y = 100; // Handle shop button press self.shopButton.down = function (x, y, obj) { self.toggleShop(); }; // Toggle shop visibility self.toggleShop = function () { self.isOpen = !self.isOpen; self.panel.visible = self.isOpen; }; // Handle weapon selection self.selectWeapon = function (index) { var weapon = self.weapons[index]; if (weapon.owned) { // Equip weapon sniper.bulletDamage = weapon.damage; sniper.bulletSpeed = weapon.speed; LK.getSound('upgrade').play(); return true; } else if (currency >= weapon.price) { // Purchase weapon currency -= weapon.price; weapon.owned = true; // Update UI var priceText = self.weaponItems[index].children[3]; priceText.setText("OWNED", { fill: 0x00FF00 }); // Equip weapon sniper.bulletDamage = weapon.damage; sniper.bulletSpeed = weapon.speed; LK.getSound('upgrade').play(); updateUI(); return true; } else { // Not enough currency LK.effects.flashScreen(0xFF0000, 300); return false; } }; // Check if an item was clicked self.checkItemClick = function (x, y) { if (!self.isOpen) return false; var pos = self.toLocal({ x: x, y: y }); for (var i = 0; i < self.weaponItems.length; i++) { var item = self.weaponItems[i]; if (pos.y >= item.y - 75 && pos.y <= item.y + 75) { return self.selectWeapon(item.weaponIndex); } } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xC2B280 // Sandy/dry land color }); /**** * Game Code ****/ // Create background var background = game.attachAsset('background', { width: 2048, height: 2732, anchorX: 0, anchorY: 0, tint: 0xC2B280 // Apply dry land tint to the background }); // Game variables var bunkerHealth = 100; var maxBunkerHealth = 100; var bunkerY = 2732 - 100; // Position near bottom of screen var currency = 0; var difficulty = 1; var wave = 1; var enemySpawnRate = 3000; // ms between enemy spawns var lastEnemySpawn = 0; var gameActive = true; // Upgrade costs and values var upgrades = { fireRate: { level: 1, cost: 10, value: 1000, // ms between shots increment: -100 // decrease time between shots }, bulletDamage: { level: 1, cost: 15, value: 1, increment: 1 // increase damage } }; // Arrays for tracking game objects var bullets = []; var enemies = []; // Create bunker var bunker = new Bunker(); bunker.x = 2048 / 2; bunker.y = bunkerY; game.addChild(bunker); // Create sniper var sniper = new Sniper(); sniper.x = 2048 / 2; sniper.y = bunkerY - 50; game.addChild(sniper); // Create weapon shop var weaponShop = new WeaponShop(); weaponShop.x = 150; // Position on the left side of the screen weaponShop.y = 1800; // Position higher on the screen for better visibility game.addChild(weaponShop); // Add to game instead of GUI for better positioning // UI Elements // Score display var scoreTxt = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); scoreTxt.y = 50; LK.gui.top.addChild(scoreTxt); // Wave display var waveTxt = new Text2('Wave: 1', { size: 50, fill: 0xFFFFFF }); waveTxt.anchor.set(1, 0); LK.gui.topLeft.addChild(waveTxt); waveTxt.x = 150; // Move away from the top left corner // Health display var healthTxt = new Text2('Bunker: 100%', { size: 50, fill: 0xFFFFFF }); healthTxt.anchor.set(0.5, 0); healthTxt.y = 130; LK.gui.top.addChild(healthTxt); // Currency display var currencyTxt = new Text2('$: 0', { size: 50, fill: 0x00FF00 }); currencyTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(currencyTxt); currencyTxt.x = 150; // Move away from top left corner currencyTxt.y = 60; // Position below wave display // Upgrade buttons removed as requested // Update UI elements function updateUI() { scoreTxt.setText('Score: ' + LK.getScore()); currencyTxt.setText('$: ' + currency); waveTxt.setText('Wave: ' + wave); updateUpgradeButtons(); } function updateBunkerHealth() { var healthPercentage = Math.max(0, Math.min(100, Math.round(bunkerHealth / maxBunkerHealth * 100))); healthTxt.setText('Bunker: ' + healthPercentage + '%'); bunker.showDamage(bunkerHealth / maxBunkerHealth); // Create a visual indicator effect when health is low if (bunkerHealth / maxBunkerHealth < 0.5) { // Add continuous damage indicator update for low health LK.setTimeout(function () { if (gameActive) bunker.showDamage(bunkerHealth / maxBunkerHealth); }, 100); } } function updateUpgradeButtons() { // Upgrade buttons removed as requested } // Game mechanics functions function spawnEnemy() { var now = Date.now(); if (now - lastEnemySpawn < enemySpawnRate) return; lastEnemySpawn = now; // Determine enemy type based on difficulty var enemyType = 'regular'; var random = Math.random(); if (difficulty >= 3 && random < 0.2) { enemyType = 'tank'; } else if (difficulty >= 2 && random < 0.3) { enemyType = 'fast'; } var enemy = new Enemy(enemyType); enemy.x = Math.random() * (2048 - 100) + 50; // Random x position enemy.y = -50; // Start above the screen enemies.push(enemy); game.addChild(enemy); } function checkCollisions() { for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (!bullet.active) { game.removeChild(bullet); bullets.splice(i, 1); continue; } for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (!enemy.active) { game.removeChild(enemy); enemies.splice(j, 1); continue; } if (bullet.active && enemy.active && bullet.intersects(enemy)) { enemy.takeDamage(bullet.damage); bullet.hit(); break; } } } } function upgradeFireRate() { if (currency >= upgrades.fireRate.cost) { currency -= upgrades.fireRate.cost; upgrades.fireRate.level++; upgrades.fireRate.value += upgrades.fireRate.increment; // Ensure fire rate doesn't go below minimum upgrades.fireRate.value = Math.max(200, upgrades.fireRate.value); sniper.fireRate = upgrades.fireRate.value; // Increase cost for next upgrade upgrades.fireRate.cost = Math.floor(upgrades.fireRate.cost * 1.5); LK.getSound('upgrade').play(); updateUI(); } } function upgradeBulletDamage() { if (currency >= upgrades.bulletDamage.cost) { currency -= upgrades.bulletDamage.cost; upgrades.bulletDamage.level++; upgrades.bulletDamage.value += upgrades.bulletDamage.increment; sniper.bulletDamage = upgrades.bulletDamage.value; // Increase cost for next upgrade upgrades.bulletDamage.cost = Math.floor(upgrades.bulletDamage.cost * 1.5); LK.getSound('upgrade').play(); updateUI(); } } function increaseDifficulty() { var score = LK.getScore(); // Increase difficulty based on score difficulty = 1 + Math.floor(score / 100); // Adjust wave var newWave = 1 + Math.floor(score / 200); if (newWave > wave) { wave = newWave; // Decrease spawn rate with each wave (faster spawns) enemySpawnRate = Math.max(500, 3000 - wave * 200); } } function gameOver() { gameActive = false; // Save high score if (LK.getScore() > storage.highScore) { storage.highScore = LK.getScore(); } // Save currency for next game storage.currency = currency; // Show game over screen LK.showGameOver(); } // Event handlers game.move = function (x, y, obj) { if (gameActive) { // Update rifle aim to follow cursor sniper.updateAim(x, y); } }; game.down = function (x, y, obj) { if (!gameActive) return; // Check if weapon shop item was clicked if (weaponShop.checkItemClick(x, y)) { return; } // Fire at touch location var bullet = sniper.shoot(x, y); if (bullet) { bullets.push(bullet); game.addChild(bullet); } }; // Update function called every frame game.update = function () { if (!gameActive) return; // Spawn enemies spawnEnemy(); // Update bullets for (var i = 0; i < bullets.length; i++) { if (bullets[i].active) { bullets[i].update(); } } // Update enemies for (var i = 0; i < enemies.length; i++) { if (enemies[i].active) { enemies[i].update(); } } // Check for collisions checkCollisions(); // Update difficulty increaseDifficulty(); // Continuously update damage indicator when health is low if (bunkerHealth / maxBunkerHealth < 0.4) { // Move damage indicator more frequently as health gets lower if (LK.ticks % Math.max(5, Math.floor(bunkerHealth / maxBunkerHealth * 20)) === 0) { bunker.showDamage(bunkerHealth / maxBunkerHealth); } } // Update UI if (LK.ticks % 30 === 0) { updateUI(); } }; // Initialize UI updateUI(); updateBunkerHealth(); // Start background music LK.playMusic('gameBgMusic', { fade: { start: 0, end: 0.3, duration: 1000 } });
===================================================================
--- original.js
+++ change.js
@@ -402,9 +402,9 @@
game.addChild(sniper);
// Create weapon shop
var weaponShop = new WeaponShop();
weaponShop.x = 150; // Position on the left side of the screen
-weaponShop.y = 2200; // Position higher on the screen for better visibility
+weaponShop.y = 1800; // Position higher on the screen for better visibility
game.addChild(weaponShop); // Add to game instead of GUI for better positioning
// UI Elements
// Score display
var scoreTxt = new Text2('Score: 0', {
kaya. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
sopalı düşman adam . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
koşan ninja. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
tek gözlü dev. In-Game asset. 2d. High contrast. No shadows
barbed wire wall. In-Game asset. 2d. High contrast. No shadows
gözcü kulesi. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
yazıyı sil
Çöl haydut sniper. In-Game asset. 2d. High contrast. No shadows
önden zırhlı araç . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
zırhlı aracaın arkası. In-Game asset. 2d. High contrast. No shadows
sağa giden askeri yeşil renkte zırhlı araç. In-Game asset. 2d. High contrast. No shadows