User prompt
increase drag and drop area, build turret
User prompt
increase time between Wave
User prompt
Adjust the zombie spawn mechanism, only spawn a certain number, usually 3-4 depending on the difficulty of the game, then wait a random amount of time to spawn the next wave
User prompt
makes SSC spawn sun slower, usually randomly from 10-15s,the turrets cannot be targeted and attacked by zombies
User prompt
add range to turret, when zombie is in range turret will aim at target and shoot otherwise will stop, duo barrel and triple barrel will shoot two, three bullets instead of shooting two, three targets ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Change Laser, freeze and explosive tower to classic turret, double barrel turret, triple barrel turret with price of 50, 75, 100 sun respectively, Zombie only appears after 35s, SSC will spawn 20 sun after a period of time not too long
User prompt
change the price of SSC, only 25 sun instead of 50
User prompt
Progress bar run slower (about 300 seconds to run out of bar and increase 25s each time reset) ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
progress bar runs slower ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add progress bar, when the progress bar ends, the game will spawn a boss, when the boss is defeated, the progress bar will reset, the game will be harder, the game will change to another stage (light -> dark; dark -> light),When entering the game for the first time, the game will be easy for players to prepare (zombies will appear less and less frequently), the later, the more difficult the game will be ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Place the text that displays the turret's solar energy needs above the icon that displays that turret
User prompt
Add text to show how much solar energy that turret needs to build
User prompt
When you click on the icon of that turret, you will need to drag that turret to where you want to build, release it to build.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var globalPos = game.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 700
User prompt
create drag and drop system for turrets, when built it will cost some sun
User prompt
Increase the hitbox of the house to avoid zombies from gathering in one place when approaching
User prompt
There is only one house, the house will be as long as the width of the bottom screen
User prompt
S.S.C not attacked and targeted by zombies
User prompt
Zombies will only go from top to bottom aiming at houses, houses will lose health based on zombie damage
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'dayText.style.fill = isDaytime ? "#FFD700" : "#4169E1";' Line Number: 691
Code edit (1 edits merged)
Please save this source code
User prompt
The Zombies Are Coming
Initial prompt
Create a tower defense game name "The zombie are coming",You need to use your knowledge, build Super Solar Collector (SSC) to collect energy for building resources,confront the massive zombie waves
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BossZombie = Container.expand(function () { var self = Container.call(this); var bossGraphics = self.attachAsset('bossZombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0.5; self.health = 500; self.damage = 25; self.target = null; self.attackTimer = 0; self.frozen = 0; self.update = function () { if (self.frozen > 0) { self.frozen--; bossGraphics.tint = 0x87CEEB; self.speed = 0.25; } else { bossGraphics.tint = 0xFFFFFF; self.speed = 0.5; } if (!self.target || self.target.destroyed) { self.findTarget(); } if (self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 60) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } else { self.attackTimer++; if (self.attackTimer >= 45) { self.attackTimer = 0; if (self.target.takeDamage) { if (self.target.takeDamage(self.damage)) { self.target = null; } } } } } else { self.x += self.speed; if (self.x > 2048) { lives -= 5; self.destroy(); } } }; self.findTarget = function () { var minDist = Infinity; self.target = null; // Prioritize houses first for (var i = 0; i < houses.length; i++) { var dx = houses[i].x - self.x; var dy = houses[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; self.target = houses[i]; } } // Skip solar collectors - they are not targeted by boss zombies for (var i = 0; i < towers.length; i++) { var dx = towers[i].x - self.x; var dy = towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; self.target = towers[i]; } } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { LK.setScore(LK.getScore() + 100); LK.getSound('zombieDeath').play(); self.destroy(); return true; } LK.effects.flashObject(self, 0xFFFFFF, 200); return false; }; self.freeze = function () { self.frozen = 120; }; return self; }); var ExplosiveTower = Container.expand(function () { var self = Container.call(this); var tower = self.attachAsset('explosiveTower', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 50; self.range = 200; self.explosionRange = 100; self.fireRate = 90; self.fireTimer = 0; self.health = 120; self.maxHealth = 120; self.update = function () { self.fireTimer++; if (self.fireTimer >= self.fireRate) { self.fireTimer = 0; self.findAndExplode(); } }; self.findAndExplode = function () { var target = null; var minDist = self.range; for (var i = 0; i < zombies.length; i++) { var dx = zombies[i].x - self.x; var dy = zombies[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; target = zombies[i]; } } if (target) { self.explode(target.x, target.y); } }; self.explode = function (x, y) { LK.getSound('explode').play(); var explosion = game.addChild(LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5 })); explosion.x = x; explosion.y = y; explosion.alpha = 0.8; tween(explosion, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { explosion.destroy(); } }); for (var i = 0; i < zombies.length; i++) { var dx = zombies[i].x - x; var dy = zombies[i].y - y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.explosionRange) { zombies[i].takeDamage(self.damage); } } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.destroy(); return true; } LK.effects.flashObject(self, 0xFF0000, 300); return false; }; return self; }); var FreezeTower = Container.expand(function () { var self = Container.call(this); var tower = self.attachAsset('freezeTower', { anchorX: 0.5, anchorY: 0.5 }); self.range = 150; self.fireRate = 120; self.fireTimer = 0; self.health = 100; self.maxHealth = 100; self.update = function () { self.fireTimer++; if (self.fireTimer >= self.fireRate) { self.fireTimer = 0; self.freezeArea(); } }; self.freezeArea = function () { LK.getSound('freeze').play(); for (var i = 0; i < zombies.length; i++) { var dx = zombies[i].x - self.x; var dy = zombies[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.range) { zombies[i].freeze(); } } var freezeEffect = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5 }); freezeEffect.tint = 0x00BFFF; freezeEffect.alpha = 0.5; freezeEffect.width = self.range * 2; freezeEffect.height = self.range * 2; tween(freezeEffect, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 500, onFinish: function onFinish() { freezeEffect.destroy(); } }); }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.destroy(); return true; } LK.effects.flashObject(self, 0xFF0000, 300); return false; }; return self; }); var House = Container.expand(function () { var self = Container.call(this); var houseGraphics = self.attachAsset('house', { anchorX: 0.5, anchorY: 0.5 }); // Scale house to span the width of the screen houseGraphics.width = 2048; // Full screen width houseGraphics.height = 100; // Keep original height self.health = 500; // Increased health since it's the only house self.maxHealth = 500; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { lives -= 10; // Lose more lives when the main house is destroyed self.destroy(); return true; } LK.effects.flashObject(self, 0xFF0000, 300); return false; }; return self; }); var LaserTower = Container.expand(function () { var self = Container.call(this); var tower = self.attachAsset('laserTower', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 20; self.range = 200; self.fireRate = 30; self.fireTimer = 0; self.health = 150; self.maxHealth = 150; self.update = function () { self.fireTimer++; if (self.fireTimer >= self.fireRate) { self.fireTimer = 0; self.findAndShoot(); } }; self.findAndShoot = function () { var target = null; var minDist = self.range; for (var i = 0; i < zombies.length; i++) { var dx = zombies[i].x - self.x; var dy = zombies[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; target = zombies[i]; } } if (target) { self.shootLaser(target); } }; self.shootLaser = function (target) { LK.getSound('laser').play(); var laser = self.attachAsset('laserBeam', { anchorX: 0.5, anchorY: 1 }); var dx = target.x - self.x; var dy = target.y - self.y; var angle = Math.atan2(dy, dx) + Math.PI / 2; laser.rotation = angle; var dist = Math.sqrt(dx * dx + dy * dy); laser.height = dist; tween(laser, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { laser.destroy(); } }); target.takeDamage(self.damage); }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.destroy(); return true; } LK.effects.flashObject(self, 0xFF0000, 300); return false; }; return self; }); var SolarCollector = Container.expand(function () { var self = Container.call(this); var collector = self.attachAsset('solarCollector', { anchorX: 0.5, anchorY: 0.5 }); self.energyRate = 1; self.health = 100; self.maxHealth = 100; self.isDaytime = true; self.energyTimer = 0; self.update = function () { self.energyTimer++; if (self.energyTimer >= 60) { self.energyTimer = 0; var energyGain = self.isDaytime ? self.energyRate * 2 : self.energyRate; energy += energyGain; LK.getSound('collect').play(); var energyText = new Text2('+' + energyGain, { size: 30, fill: 0xFFD700 }); energyText.anchor.set(0.5, 0.5); energyText.x = 0; energyText.y = -40; self.addChild(energyText); tween(energyText, { y: -80, alpha: 0 }, { duration: 1000, onFinish: function onFinish() { energyText.destroy(); } }); } collector.tint = self.isDaytime ? 0xFFD700 : 0xB8860B; }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.destroy(); return true; } LK.effects.flashObject(self, 0xFF0000, 300); return false; }; return self; }); var Zombie = Container.expand(function () { var self = Container.call(this); var zombieGraphics = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.health = 50; self.damage = 10; self.target = null; self.attackTimer = 0; self.frozen = 0; self.update = function () { if (self.frozen > 0) { self.frozen--; zombieGraphics.tint = 0x87CEEB; self.speed = 0.5; } else { zombieGraphics.tint = 0xFFFFFF; self.speed = 1; } if (!self.target || self.target.destroyed) { self.findTarget(); } if (self.target) { var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 50) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } else { self.attackTimer++; if (self.attackTimer >= 60) { self.attackTimer = 0; if (self.target.takeDamage) { if (self.target.takeDamage(self.damage)) { self.target = null; } } } } } else { // Move towards bottom of screen when no target self.y += self.speed; if (self.y > 2732) { lives--; self.destroy(); } } }; self.findTarget = function () { var minDist = Infinity; self.target = null; // Prioritize houses first for (var i = 0; i < houses.length; i++) { var dx = houses[i].x - self.x; var dy = houses[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; self.target = houses[i]; } } // Skip solar collectors - they are not targeted by zombies // Finally target towers for (var i = 0; i < towers.length; i++) { var dx = towers[i].x - self.x; var dy = towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; self.target = towers[i]; } } }; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { LK.setScore(LK.getScore() + 10); LK.getSound('zombieDeath').play(); self.destroy(); return true; } LK.effects.flashObject(self, 0xFFFFFF, 200); return false; }; self.freeze = function () { self.frozen = 180; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var energy = 100; var wave = 0; var lives = 20; var isDaytime = true; var dayTimer = 0; var waveTimer = 0; var zombieSpawnTimer = 0; var zombiesPerWave = 5; var zombiesToSpawn = 0; var solarCollectors = []; var towers = []; var zombies = []; var houses = []; var gridCells = []; var selectedTower = null; var placementMode = false; var placementCost = 0; var GRID_SIZE = 80; var GRID_COLS = Math.floor(2048 / GRID_SIZE); var GRID_ROWS = Math.floor(2000 / GRID_SIZE); var energyText = new Text2('Energy: ' + energy, { size: 60, fill: 0xFFD700 }); energyText.anchor.set(0.5, 0); LK.gui.top.addChild(energyText); var waveText = new Text2('Wave: ' + wave, { size: 50, fill: 0xFFFFFF }); waveText.anchor.set(0, 0); waveText.x = -900; waveText.y = 100; LK.gui.top.addChild(waveText); var livesText = new Text2('Lives: ' + lives, { size: 50, fill: 0xFF0000 }); livesText.anchor.set(1, 0); livesText.x = 900; livesText.y = 100; LK.gui.top.addChild(livesText); var dayText = new Text2('Day', { size: 40, fill: 0xFFD700 }); dayText.anchor.set(0.5, 0); dayText.y = 80; LK.gui.top.addChild(dayText); var solarButton = new Container(); var solarButtonBg = solarButton.attachAsset('solarCollector', { anchorX: 0.5, anchorY: 0.5 }); solarButtonBg.width = 100; solarButtonBg.height = 100; var solarButtonText = new Text2('50', { size: 30, fill: 0xFFFFFF }); solarButtonText.anchor.set(0.5, 0.5); solarButtonText.y = 60; solarButton.addChild(solarButtonText); solarButton.x = -300; LK.gui.bottom.addChild(solarButton); var laserButton = new Container(); var laserButtonBg = laserButton.attachAsset('laserTower', { anchorX: 0.5, anchorY: 0.5 }); laserButtonBg.width = 100; laserButtonBg.height = 100; var laserButtonText = new Text2('100', { size: 30, fill: 0xFFFFFF }); laserButtonText.anchor.set(0.5, 0.5); laserButtonText.y = 60; laserButton.addChild(laserButtonText); laserButton.x = -100; LK.gui.bottom.addChild(laserButton); var freezeButton = new Container(); var freezeButtonBg = freezeButton.attachAsset('freezeTower', { anchorX: 0.5, anchorY: 0.5 }); freezeButtonBg.width = 100; freezeButtonBg.height = 100; var freezeButtonText = new Text2('150', { size: 30, fill: 0xFFFFFF }); freezeButtonText.anchor.set(0.5, 0.5); freezeButtonText.y = 60; freezeButton.addChild(freezeButtonText); freezeButton.x = 100; LK.gui.bottom.addChild(freezeButton); var explosiveButton = new Container(); var explosiveButtonBg = explosiveButton.attachAsset('explosiveTower', { anchorX: 0.5, anchorY: 0.5 }); explosiveButtonBg.width = 100; explosiveButtonBg.height = 100; var explosiveButtonText = new Text2('200', { size: 30, fill: 0xFFFFFF }); explosiveButtonText.anchor.set(0.5, 0.5); explosiveButtonText.y = 60; explosiveButton.addChild(explosiveButtonText); explosiveButton.x = 300; LK.gui.bottom.addChild(explosiveButton); for (var row = 0; row < GRID_ROWS; row++) { for (var col = 0; col < GRID_COLS; col++) { var cell = game.addChild(LK.getAsset('gridCell', { anchorX: 0, anchorY: 0 })); cell.x = col * GRID_SIZE; cell.y = row * GRID_SIZE + 200; cell.alpha = 0.1; cell.gridX = col; cell.gridY = row; cell.occupied = false; gridCells.push(cell); } } // Create single house spanning the bottom of screen var house = new House(); house.x = 1024; // Center of screen width (2048/2) house.y = 2500; houses.push(house); game.addChild(house); solarButton.down = function () { selectedTower = 'solar'; placementMode = true; placementCost = 50; }; laserButton.down = function () { selectedTower = 'laser'; placementMode = true; placementCost = 100; }; freezeButton.down = function () { selectedTower = 'freeze'; placementMode = true; placementCost = 150; }; explosiveButton.down = function () { selectedTower = 'explosive'; placementMode = true; placementCost = 200; }; game.down = function (x, y, obj) { if (!placementMode) return; var gridX = Math.floor(x / GRID_SIZE); var gridY = Math.floor((y - 200) / GRID_SIZE); if (gridX < 0 || gridX >= GRID_COLS || gridY < 0 || gridY >= GRID_ROWS) return; var cellIndex = gridY * GRID_COLS + gridX; if (gridCells[cellIndex].occupied) return; if (energy < placementCost) return; energy -= placementCost; gridCells[cellIndex].occupied = true; var newX = gridX * GRID_SIZE + GRID_SIZE / 2; var newY = gridY * GRID_SIZE + GRID_SIZE / 2 + 200; if (selectedTower === 'solar') { var collector = new SolarCollector(); collector.x = newX; collector.y = newY; solarCollectors.push(collector); game.addChild(collector); } else if (selectedTower === 'laser') { var tower = new LaserTower(); tower.x = newX; tower.y = newY; towers.push(tower); game.addChild(tower); } else if (selectedTower === 'freeze') { var tower = new FreezeTower(); tower.x = newX; tower.y = newY; towers.push(tower); game.addChild(tower); } else if (selectedTower === 'explosive') { var tower = new ExplosiveTower(); tower.x = newX; tower.y = newY; towers.push(tower); game.addChild(tower); } LK.getSound('build').play(); placementMode = false; selectedTower = null; }; function spawnZombie(isBoss) { var zombie; if (isBoss) { zombie = new BossZombie(); } else { zombie = new Zombie(); } // Spawn only from top of screen zombie.x = Math.random() * 2048; zombie.y = 150; zombies.push(zombie); game.addChild(zombie); } game.update = function () { dayTimer++; if (dayTimer >= 600) { dayTimer = 0; isDaytime = !isDaytime; dayText.setText(isDaytime ? 'Day' : 'Night'); dayText.tint = isDaytime ? 0xFFD700 : 0x4169E1; game.setBackgroundColor(isDaytime ? 0x87CEEB : 0x191970); for (var i = 0; i < solarCollectors.length; i++) { solarCollectors[i].isDaytime = isDaytime; } } if (zombiesToSpawn <= 0) { waveTimer++; if (waveTimer >= 300) { waveTimer = 0; wave++; zombiesPerWave = 5 + Math.floor(wave * 1.5); zombiesToSpawn = zombiesPerWave; if (wave % 5 === 0) { zombiesToSpawn += 1; spawnZombie(true); } } } else { zombieSpawnTimer++; if (zombieSpawnTimer >= 30) { zombieSpawnTimer = 0; zombiesToSpawn--; spawnZombie(false); } } for (var i = solarCollectors.length - 1; i >= 0; i--) { if (solarCollectors[i].destroyed) { solarCollectors.splice(i, 1); } } for (var i = towers.length - 1; i >= 0; i--) { if (towers[i].destroyed) { towers.splice(i, 1); } } for (var i = zombies.length - 1; i >= 0; i--) { if (zombies[i].destroyed) { zombies.splice(i, 1); } } for (var i = houses.length - 1; i >= 0; i--) { if (houses[i].destroyed) { houses.splice(i, 1); } } energyText.setText('Energy: ' + energy); waveText.setText('Wave: ' + wave); livesText.setText('Lives: ' + lives); if (lives <= 0) { LK.showGameOver(); } }; LK.playMusic('gameMusic');
===================================================================
--- original.js
+++ change.js
@@ -231,19 +231,21 @@
return self;
});
var House = Container.expand(function () {
var self = Container.call(this);
- var houseGraphics = self.attachAsset('solarCollector', {
+ var houseGraphics = self.attachAsset('house', {
anchorX: 0.5,
anchorY: 0.5
});
- houseGraphics.tint = 0x8B4513; // Brown color for houses
- self.health = 200;
- self.maxHealth = 200;
+ // Scale house to span the width of the screen
+ houseGraphics.width = 2048; // Full screen width
+ houseGraphics.height = 100; // Keep original height
+ self.health = 500; // Increased health since it's the only house
+ self.maxHealth = 500;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
- lives -= 5; // Lose more lives when house is destroyed
+ lives -= 10; // Lose more lives when the main house is destroyed
self.destroy();
return true;
}
LK.effects.flashObject(self, 0xFF0000, 300);
@@ -598,16 +600,14 @@
cell.occupied = false;
gridCells.push(cell);
}
}
-// Create houses at bottom of screen
-for (var i = 0; i < 5; i++) {
- var house = new House();
- house.x = 300 + i * 350;
- house.y = 2500;
- houses.push(house);
- game.addChild(house);
-}
+// Create single house spanning the bottom of screen
+var house = new House();
+house.x = 1024; // Center of screen width (2048/2)
+house.y = 2500;
+houses.push(house);
+game.addChild(house);
solarButton.down = function () {
selectedTower = 'solar';
placementMode = true;
placementCost = 50;
top view of a garden. 2d. No shadows. In-game assetmodern, simple
top view of a grassy area. In-Game asset. 2d. High contrast. No shadows
Top view of a house. In-Game asset. 2d. High contrast. No shadows
Acid turret. In-Game asset. 2d. High contrast. No shadows
A zombie. In-Game asset. 2d. High contrast. No shadows
solar collector. In-Game asset. 2d. High contrast. No shadows
A turret. In-Game asset. 2d. High contrast. No shadows
A duo barrel turret. In-Game asset. 2d. High contrast. No shadows
Triple barrel turret. In-Game asset. 2d. High contrast. No shadows
Tough zombie. In-Game asset. 2d. High contrast. No shadows
Light-skin runner zombie. In-Game asset. 2d. High contrast. No shadows
a zombie raises an umbrella forward. In-Game asset. 2d. High contrast. No shadows
Zombie dressed as a crow. In-Game asset. 2d. High contrast. No shadows
Zombie crow. In-Game asset. 2d. High contrast. No shadows
Ice turret. In-Game asset. 2d. High contrast. No shadows
Flame thrower turret. In-Game asset. 2d. High contrast. No shadows
Homing bullet turret. In-Game asset. 2d. High contrast. No shadows
Minigun turret. In-Game asset. 2d. High contrast. No shadows
Rocket launcher turret. In-Game asset. 2d. High contrast. No shadows
Missile. In-Game asset. 2d. High contrast. No shadows
Old abandoned, broken tank. In-Game asset. 2d. High contrast. No shadows
Ninja zombie. In-Game asset. 2d. High contrast. No shadows
Grey zombie. In-Game asset. 2d. High contrast. No shadows
Soldier zombie. In-Game asset. 2d. High contrast. No shadows
Very crazy zombie. In-Game asset. 2d. High contrast. No shadows
A shaman zombie,head wearing a cow skull. In-Game asset. 2d. High contrast. No shadows
Spike turret. In-Game asset. 2d. High contrast. No shadows
Ball turret. In-Game asset. 2d. High contrast. No shadows
Electrical turret. In-Game asset. 2d. High contrast. No shadows
Sci-fi wall. In-Game asset. 2d. High contrast. No shadows
A shield with radar. In-Game asset. 2d. High contrast. No shadows
Football zombie. In-Game asset. 2d. High contrast. No shadows
a zombie covered in mud. In-Game asset. 2d. High contrast. No shadows
A cardboard. In-Game asset. 2d. High contrast. No shadows
A wooden crate. In-Game asset. 2d. High contrast. No shadows