User prompt
saldırı hızı yükseltmesini kaldır. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
yaratıklar öldüğünde daha fazla gold versin
User prompt
hasar yükselt butonuna basıldığında sadece hasar yükselsin , hızı yükselt butonuna basıldığında sadece saldırı hızını yükselt ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
hero çağır butonunu kaldır
User prompt
prestij butonuna bastığımızda yükseltmeler de sıfırlansın. fakat karakter gelişimi 1.5x artsın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
prestij butonuna basıldığında her şey sıfırlansın. Fakat karakterin gelişimi 1.5x artsın
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.heroLevel = undefined;' Line Number: 407 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
oyunu sıfırla butonuna bastığımızda tüm yükseltmeler ve paralar sıfırlansın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
oyunu sıfırladığımızda tüm değerler sıfırlansın. fakat oyunu yeniden başlattığımızda yükseltmeler kaybolmasın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
her titan öldüğünde başka bir titan gelsin. o ölene kadar başka titan gelmesin. her 10 dalgada 1 boss gelsin. boss geldiğinde titan gelmesin
User prompt
kristal ile sadece prestij yapılsın. ve biraz pahalı olsun. prestij yapıldığında karakterin özellikleri 1.5 katına çıksın
User prompt
dalga olayını düzelt
User prompt
sol alt tarafa admin modu ekle
User prompt
aşağıdaki yükseltme butonlarına saldırı hızı da ekle
User prompt
her dalgada sadece 1 adet titan doğsun. boss doğduğu dalgada sadece boss doğsun
User prompt
boss doğduğu dalgada titan doğmasın. bir sonraki dalgada doğmaya devam etsin
User prompt
oyunu fixle
User prompt
Oyundan çıkıp tekrar girdiğimizde yükseltmelerimiz sıfırlanmasın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Oyundan çıkıp tekrar girdiğimizde yükseltmelerimiz sıfırlanmasın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Dps değerimiz her saniye kaydedilsin. Oyundan çıkıp girsek bile ilk değerine dönmesin ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Oyun açılmıyor
User prompt
Oyun kapandığında hiç bir özelliğimiz kaybolmasın. Dps tekrar başlangıçtaki değerine dönüyor , onu düzelt . Ve ayarlar'a tıkladığımızda oyun duraklasın ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Sağ alt tarafta ayarlar ikonu olsun. Ayarlar ikonuna bastığımızda bir ekran açılsın. O ekranda , müziği aç/kapat , efektleri aç/kapat , dil seçeneği ( türkçe ve ingilizce ) ve oyunu sıfırla olsun ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Dalga sayısı her arttığında titanlar farklı bir renk ile doğsun. Ve canları kendisinin üst tarafında gözüksün
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('titan', { anchorX: 0.5, anchorY: 0.5 }); self.maxHealth = 100; self.health = self.maxHealth; self.goldReward = 20; self.isBoss = false; self.waveNumber = 1; // Health bar background self.healthBarBg = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.3 }); self.healthBarBg.tint = 0x333333; self.healthBarBg.y = -enemyGraphics.height / 2 - 30; self.addChild(self.healthBarBg); // Health bar fill self.healthBarFill = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.3 }); self.healthBarFill.tint = 0x27ae60; self.healthBarFill.y = -enemyGraphics.height / 2 - 30; self.addChild(self.healthBarFill); self.setWaveColor = function (waveNum) { self.waveNumber = waveNum; var colors = [0xffffff, 0xff6b6b, 0x4ecdc4, 0x45b7d1, 0x96ceb4, 0xffeaa7, 0xdda0dd, 0xff7675, 0x74b9ff, 0x00b894]; var colorIndex = (waveNum - 1) % colors.length; enemyGraphics.tint = colors[colorIndex]; }; self.updateHealthBar = function () { var healthPercent = self.health / self.maxHealth; self.healthBarFill.scaleX = 0.8 * healthPercent; if (healthPercent > 0.6) { self.healthBarFill.tint = 0x27ae60; // Green } else if (healthPercent > 0.3) { self.healthBarFill.tint = 0xf39c12; // Orange } else { self.healthBarFill.tint = 0xe74c3c; // Red } }; self.takeDamage = function (damage) { self.health -= damage; self.updateHealthBar(); // Get current wave color for restore var colors = [0xffffff, 0xff6b6b, 0x4ecdc4, 0x45b7d1, 0x96ceb4, 0xffeaa7, 0xdda0dd, 0xff7675, 0x74b9ff, 0x00b894]; var colorIndex = (self.waveNumber - 1) % colors.length; var originalColor = colors[colorIndex]; // Flash red when taking damage tween(enemyGraphics, { tint: 0xff0000 }, { duration: 100, onFinish: function onFinish() { tween(enemyGraphics, { tint: originalColor }, { duration: 100 }); } }); if (self.health <= 0) { self.die(); } }; self.die = function () { gold += self.goldReward; crystals += self.isBoss ? 5 : 1; updateGoldDisplay(); updateCrystalsDisplay(); if (storage.soundEnabled !== false) LK.getSound('enemyDeath').play(); // Death animation tween(self, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 300, onFinish: function onFinish() { var index = enemies.indexOf(self); if (index > -1) { enemies.splice(index, 1); } self.destroy(); spawnNextEnemy(); } }); }; return self; }); var Boss = Enemy.expand(function () { var self = Enemy.call(this); // Replace graphics with boss asset self.removeChildren(); var bossGraphics = self.attachAsset('boss', { anchorX: 0.5, anchorY: 0.5 }); self.maxHealth = 500; self.health = self.maxHealth; self.goldReward = 200; self.isBoss = true; // Re-add health bar for boss self.healthBarBg = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 0.4 }); self.healthBarBg.tint = 0x333333; self.healthBarBg.y = -bossGraphics.height / 2 - 40; self.addChild(self.healthBarBg); self.healthBarFill = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 0.4 }); self.healthBarFill.tint = 0x8e44ad; self.healthBarFill.y = -bossGraphics.height / 2 - 40; self.addChild(self.healthBarFill); var originalSetWaveColor = self.setWaveColor; self.setWaveColor = function (waveNum) { self.waveNumber = waveNum; // Bosses always stay purple but get darker with higher waves var darkness = Math.min(waveNum * 0.1, 0.7); var baseColor = 0x8e44ad; var r = baseColor >> 16 & 0xFF; var g = baseColor >> 8 & 0xFF; var b = baseColor & 0xFF; r = Math.floor(r * (1 - darkness)); g = Math.floor(g * (1 - darkness)); b = Math.floor(b * (1 - darkness)); bossGraphics.tint = r << 16 | g << 8 | b; }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.level = 1; self.damage = 10; self.attackSpeed = 1000; // milliseconds between attacks self.lastAttackTime = 0; self.cost = 100; self.type = 'DPS'; // DPS, Support, Tank self.attack = function () { if (currentEnemy && currentEnemy.parent && LK.ticks * 16.67 - self.lastAttackTime >= self.attackSpeed) { var projectile = new HeroProjectile(); projectile.x = self.x; projectile.y = self.y; projectile.targetX = currentEnemy.x; projectile.targetY = currentEnemy.y; projectile.damage = self.damage; projectiles.push(projectile); game.addChild(projectile); if (storage.soundEnabled !== false) LK.getSound('attack').play(); self.lastAttackTime = LK.ticks * 16.67; } }; self.upgrade = function () { var upgradeCost = Math.floor(self.cost * Math.pow(1.15, self.level - 1)); if (gold >= upgradeCost) { gold -= upgradeCost; self.level++; self.damage = Math.floor(self.damage * 1.2); self.cost = upgradeCost; updateGoldDisplay(); saveHeroData(); } }; self.update = function () { self.attack(); }; return self; }); var HeroProjectile = Container.expand(function () { var self = Container.call(this); var projectileGraphics = self.attachAsset('heroProjectile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.damage = 10; self.targetX = 0; self.targetY = 0; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { // Hit target if (currentEnemy && currentEnemy.parent) { currentEnemy.takeDamage(self.damage); } var index = projectiles.indexOf(self); if (index > -1) { projectiles.splice(index, 1); } self.destroy(); } else { // Move towards target self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var SettingsPanel = Container.expand(function () { var self = Container.call(this); // Semi-transparent overlay var overlay = LK.getAsset('settingsPanel', { anchorX: 0.5, anchorY: 0.5, scaleX: 4, scaleY: 4 }); overlay.tint = 0x000000; overlay.alpha = 0.8; overlay.x = 1024; overlay.y = 1366; self.addChild(overlay); // Settings panel background var panelBg = self.attachAsset('settingsPanel', { anchorX: 0.5, anchorY: 0.5 }); panelBg.x = 1024; panelBg.y = 1366; // Title var titleText = new Text2('AYARLAR', { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 1066; self.addChild(titleText); // Music toggle var musicToggle = LK.getAsset('toggleButton', { anchorX: 0.5, anchorY: 0.5 }); musicToggle.x = 1174; musicToggle.y = 1200; musicToggle.tint = storage.musicEnabled !== false ? 0x27ae60 : 0xe74c3c; self.addChild(musicToggle); var musicLabel = new Text2('Müzik:', { size: 40, fill: 0xFFFFFF }); musicLabel.anchor.set(0, 0.5); musicLabel.x = 774; musicLabel.y = 1200; self.addChild(musicLabel); var musicText = new Text2(storage.musicEnabled !== false ? 'AÇIK' : 'KAPALI', { size: 30, fill: 0xFFFFFF }); musicText.anchor.set(0.5, 0.5); musicText.x = 1174; musicText.y = 1200; self.addChild(musicText); musicToggle.down = function () { storage.musicEnabled = !storage.musicEnabled; musicToggle.tint = storage.musicEnabled ? 0x27ae60 : 0xe74c3c; musicText.setText(storage.musicEnabled ? 'AÇIK' : 'KAPALI'); if (storage.musicEnabled) { LK.playMusic('battleMusic'); } else { LK.stopMusic(); } }; // Sound effects toggle var soundToggle = LK.getAsset('toggleButton', { anchorX: 0.5, anchorY: 0.5 }); soundToggle.x = 1174; soundToggle.y = 1300; soundToggle.tint = storage.soundEnabled !== false ? 0x27ae60 : 0xe74c3c; self.addChild(soundToggle); var soundLabel = new Text2('Efektler:', { size: 40, fill: 0xFFFFFF }); soundLabel.anchor.set(0, 0.5); soundLabel.x = 774; soundLabel.y = 1300; self.addChild(soundLabel); var soundText = new Text2(storage.soundEnabled !== false ? 'AÇIK' : 'KAPALI', { size: 30, fill: 0xFFFFFF }); soundText.anchor.set(0.5, 0.5); soundText.x = 1174; soundText.y = 1300; self.addChild(soundText); soundToggle.down = function () { storage.soundEnabled = !storage.soundEnabled; soundToggle.tint = storage.soundEnabled ? 0x27ae60 : 0xe74c3c; soundText.setText(storage.soundEnabled ? 'AÇIK' : 'KAPALI'); }; // Language toggle var langToggle = LK.getAsset('toggleButton', { anchorX: 0.5, anchorY: 0.5 }); langToggle.x = 1174; langToggle.y = 1400; langToggle.tint = 0x3498db; self.addChild(langToggle); var langLabel = new Text2('Dil:', { size: 40, fill: 0xFFFFFF }); langLabel.anchor.set(0, 0.5); langLabel.x = 774; langLabel.y = 1400; self.addChild(langLabel); var langText = new Text2(storage.language || 'TR', { size: 30, fill: 0xFFFFFF }); langText.anchor.set(0.5, 0.5); langText.x = 1174; langText.y = 1400; self.addChild(langText); langToggle.down = function () { storage.language = storage.language === 'EN' ? 'TR' : 'EN'; langText.setText(storage.language); self.updateLanguage(); }; // Reset game button var resetBtn = LK.getAsset('settingsButton', { anchorX: 0.5, anchorY: 0.5 }); resetBtn.x = 1024; resetBtn.y = 1500; resetBtn.tint = 0xe74c3c; self.addChild(resetBtn); var resetText = new Text2('OYUNU SIFIRLA', { size: 36, fill: 0xFFFFFF }); resetText.anchor.set(0.5, 0.5); resetText.x = 1024; resetText.y = 1500; self.addChild(resetText); resetBtn.down = function () { storage.gold = 500; storage.crystals = 10; storage.wave = 1; storage.currentDPS = 0; storage.heroData = []; LK.showGameOver(); }; // Close button var closeBtn = LK.getAsset('settingsButton', { anchorX: 0.5, anchorY: 0.5 }); closeBtn.x = 1024; closeBtn.y = 1600; closeBtn.tint = 0x95a5a6; self.addChild(closeBtn); var closeText = new Text2('KAPAT', { size: 36, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeText.x = 1024; closeText.y = 1600; self.addChild(closeText); closeBtn.down = function () { self.hide(); }; self.updateLanguage = function () { var isEn = storage.language === 'EN'; titleText.setText(isEn ? 'SETTINGS' : 'AYARLAR'); musicLabel.setText(isEn ? 'Music:' : 'Müzik:'); soundLabel.setText(isEn ? 'Effects:' : 'Efektler:'); langLabel.setText(isEn ? 'Language:' : 'Dil:'); musicText.setText(storage.musicEnabled !== false ? isEn ? 'ON' : 'AÇIK' : isEn ? 'OFF' : 'KAPALI'); soundText.setText(storage.soundEnabled !== false ? isEn ? 'ON' : 'AÇIK' : isEn ? 'OFF' : 'KAPALI'); resetText.setText(isEn ? 'RESET GAME' : 'OYUNU SIFIRLA'); closeText.setText(isEn ? 'CLOSE' : 'KAPAT'); }; self.show = function () { self.alpha = 1; self.visible = true; game.isPaused = true; }; self.hide = function () { self.alpha = 0; self.visible = false; game.isPaused = false; }; // Start hidden self.hide(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c3e50 }); /**** * Game Code ****/ // Game state variables var gold = storage.gold || 500; var crystals = storage.crystals || 10; var wave = storage.wave || 1; var currentDPS = storage.currentDPS || 0; var heroes = []; var enemies = []; var projectiles = []; var currentEnemy = null; var heroData = storage.heroData || []; game.isPaused = false; // UI elements var goldText = new Text2('Gold: ' + gold, { size: 40, fill: 0xFFD700 }); goldText.anchor.set(0, 0); goldText.x = 120; goldText.y = 50; LK.gui.topLeft.addChild(goldText); var crystalsText = new Text2('Crystals: ' + crystals, { size: 40, fill: 0x9B59B6 }); crystalsText.anchor.set(0, 0); crystalsText.x = 120; crystalsText.y = 100; LK.gui.topLeft.addChild(crystalsText); var waveText = new Text2('Wave: ' + wave, { size: 50, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); waveText.x = 0; waveText.y = 50; LK.gui.top.addChild(waveText); var dpsText = new Text2('DPS: ' + currentDPS, { size: 40, fill: 0xE74C3C }); dpsText.anchor.set(1, 0); dpsText.x = 0; dpsText.y = 50; LK.gui.topRight.addChild(dpsText); // Upgrade button var upgradeBtn = LK.getAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5 }); upgradeBtn.x = 0; upgradeBtn.y = -100; LK.gui.bottom.addChild(upgradeBtn); var upgradeBtnText = new Text2('Upgrade Hero\n100 Gold', { size: 24, fill: 0xFFFFFF }); upgradeBtnText.anchor.set(0.5, 0.5); upgradeBtn.addChild(upgradeBtnText); upgradeBtn.down = function () { if (heroes.length > 0) { heroes[0].upgrade(); updateUpgradeButton(); } ; }; // Summon button var summonBtn = LK.getAsset('summonButton', { anchorX: 0.5, anchorY: 0.5 }); summonBtn.x = 0; summonBtn.y = -40; LK.gui.bottom.addChild(summonBtn); var summonBtnText = new Text2('Summon Hero\n50 Crystals', { size: 24, fill: 0xFFFFFF }); summonBtnText.anchor.set(0.5, 0.5); summonBtn.addChild(summonBtnText); summonBtn.down = function () { if (crystals >= 50) { crystals -= 50; summonHero(); updateCrystalsDisplay(); if (storage.soundEnabled !== false) LK.getSound('heroSummon').play(); } }; // Settings icon in bottom right var settingsIcon = LK.getAsset('settingsIcon', { anchorX: 0.5, anchorY: 0.5 }); settingsIcon.x = -50; settingsIcon.y = -50; LK.gui.bottomRight.addChild(settingsIcon); var settingsText = new Text2('⚙', { size: 50, fill: 0xFFFFFF }); settingsText.anchor.set(0.5, 0.5); settingsIcon.addChild(settingsText); // Settings panel var settingsPanel = new SettingsPanel(); game.addChild(settingsPanel); settingsIcon.down = function () { settingsPanel.show(); }; // Game functions function updateGoldDisplay() { goldText.setText('Gold: ' + gold); storage.gold = gold; } function updateCrystalsDisplay() { crystalsText.setText('Crystals: ' + crystals); storage.crystals = crystals; } function updateWaveDisplay() { waveText.setText('Wave: ' + wave); storage.wave = wave; } function updateDPSDisplay() { var totalDPS = 0; for (var i = 0; i < heroes.length; i++) { totalDPS += Math.floor(heroes[i].damage * 1000 / heroes[i].attackSpeed); } currentDPS = totalDPS; storage.currentDPS = currentDPS; dpsText.setText('DPS: ' + totalDPS); } function updateUpgradeButton() { if (heroes.length > 0) { var cost = Math.floor(heroes[0].cost * Math.pow(1.15, heroes[0].level - 1)); upgradeBtnText.setText('Upgrade Hero\n' + cost + ' Gold'); } } function saveHeroData() { heroData = []; for (var i = 0; i < heroes.length; i++) { heroData.push({ level: heroes[i].level, damage: heroes[i].damage, cost: heroes[i].cost, type: heroes[i].type }); } storage.heroData = heroData; } function summonHero() { var hero = new Hero(); hero.x = 300 + heroes.length * 100; hero.y = 1500; // Restore hero data if available if (heroData.length > heroes.length) { var savedHero = heroData[heroes.length]; hero.level = savedHero.level; hero.damage = savedHero.damage; hero.cost = savedHero.cost; hero.type = savedHero.type; } heroes.push(hero); game.addChild(hero); saveHeroData(); } function spawnEnemy() { var enemy; if (wave % 10 === 0) { // Boss wave enemy = new Boss(); enemy.maxHealth = Math.floor(500 * Math.pow(1.5, Math.floor(wave / 10))); } else { // Regular enemy enemy = new Enemy(); enemy.maxHealth = Math.floor(100 * Math.pow(1.2, wave)); } enemy.health = enemy.maxHealth; enemy.goldReward = Math.floor(enemy.goldReward * Math.pow(1.1, wave)); enemy.setWaveColor(wave); enemy.updateHealthBar(); enemy.x = 1500; enemy.y = 800; enemies.push(enemy); game.addChild(enemy); currentEnemy = enemy; } function spawnNextEnemy() { wave++; updateWaveDisplay(); // Small delay before spawning next enemy LK.setTimeout(function () { spawnEnemy(); }, 1000); } // Initialize saved heroes if (heroData.length > 0) { for (var i = 0; i < heroData.length; i++) { summonHero(); } } else { // Initialize first hero if no saved data summonHero(); } spawnEnemy(); // Start background music if (storage.musicEnabled !== false) { LK.playMusic('battleMusic'); } // Main game loop game.update = function () { // Skip update if game is paused if (game.isPaused) return; // Update displays updateDPSDisplay(); updateUpgradeButton(); // Clean up destroyed projectiles for (var i = projectiles.length - 1; i >= 0; i--) { if (!projectiles[i].parent) { projectiles.splice(i, 1); } } // Clean up destroyed enemies for (var i = enemies.length - 1; i >= 0; i--) { if (!enemies[i].parent) { if (enemies[i] === currentEnemy) { currentEnemy = null; } enemies.splice(i, 1); } } // Set current enemy to first alive enemy if (!currentEnemy && enemies.length > 0) { currentEnemy = enemies[0]; } };
===================================================================
--- original.js
+++ change.js
@@ -163,9 +163,9 @@
self.lastAttackTime = 0;
self.cost = 100;
self.type = 'DPS'; // DPS, Support, Tank
self.attack = function () {
- if (currentEnemy && LK.ticks * 16.67 - self.lastAttackTime >= self.attackSpeed) {
+ if (currentEnemy && currentEnemy.parent && LK.ticks * 16.67 - self.lastAttackTime >= self.attackSpeed) {
var projectile = new HeroProjectile();
projectile.x = self.x;
projectile.y = self.y;
projectile.targetX = currentEnemy.x;
@@ -208,9 +208,9 @@
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
// Hit target
- if (currentEnemy) {
+ if (currentEnemy && currentEnemy.parent) {
currentEnemy.takeDamage(self.damage);
}
var index = projectiles.indexOf(self);
if (index > -1) {
@@ -440,8 +440,9 @@
var enemies = [];
var projectiles = [];
var currentEnemy = null;
var heroData = storage.heroData || [];
+game.isPaused = false;
// UI elements
var goldText = new Text2('Gold: ' + gold, {
size: 40,
fill: 0xFFD700
@@ -492,8 +493,9 @@
if (heroes.length > 0) {
heroes[0].upgrade();
updateUpgradeButton();
}
+ ;
};
// Summon button
var summonBtn = LK.getAsset('summonButton', {
anchorX: 0.5,
@@ -650,12 +652,12 @@
}
// Clean up destroyed enemies
for (var i = enemies.length - 1; i >= 0; i--) {
if (!enemies[i].parent) {
- enemies.splice(i, 1);
if (enemies[i] === currentEnemy) {
currentEnemy = null;
}
+ enemies.splice(i, 1);
}
}
// Set current enemy to first alive enemy
if (!currentEnemy && enemies.length > 0) {
Büyücü. In-Game asset. 2d. High contrast. No shadows
Titan enemy. In-Game asset. 2d. High contrast. No shadows
Boss Titan. In-Game asset. 2d. High contrast. No shadows
GOLD. In-Game asset. 2d. High contrast. No shadows
doğa. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
fireball. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat