From 8a039adc057ed622a1c2089d13246cf1aefe873a Mon Sep 17 00:00:00 2001 From: assada Date: Tue, 24 Feb 2026 00:46:50 +0100 Subject: [PATCH] rework + cool bomber --- source/assets/sprites/backgrounds/bomber.png | Bin 0 -> 73928 bytes .../sprites/{bg1.png => backgrounds/fpv.png} | Bin source/assets/sprites/bg2.png | Bin 19898 -> 0 bytes .../boom_splash_1.png} | Bin .../boom_splash_2.png} | Bin .../{enemy1.png => bomber/enemy_alive_1.png} | Bin .../{enemy_2.png => bomber/enemy_alive_2.png} | Bin .../{enemy1_3.png => bomber/enemy_dead.png} | Bin .../sprites/{groundFin.png => ground_1.png} | Bin source/assets/sprites/ground_2.png | Bin 0 -> 3486 bytes source/assets/sprites/targets/btr.png | Bin 0 -> 6765 bytes source/assets/sprites/targets/btr_dead.png | Bin 0 -> 4232 bytes source/assets/sprites/{ => targets}/tank.png | Bin .../{tankD.png => targets/tank_dead.png} | Bin source/assets/{ => unused}/audio/drop.wav | Bin source/assets/{ => unused}/bg_bomber.psd | Bin .../fonts/Mini Sans 2X-table-18-20.png | Bin .../assets/{ => unused}/fonts/Outfoxies.fnt | 0 .../assets/{ => unused}/fonts/Play Girls.fnt | 0 .../assets/{ => unused}/fonts/diamond_20.fnt | 0 source/assets/{ => unused}/fonts/opal_9.fnt | 0 .../{ => unused}/images/bg_bomber33.png | Bin source/assets/{ => unused}/sprites/death.png | Bin .../assets/{ => unused}/sprites/enemy1_1.png | Bin .../assets/{ => unused}/sprites/enemy1_2.png | Bin .../assets/{ => unused}/sprites/enemy1_4.png | Bin source/assets/{ => unused}/sprites/enemy2.png | Bin .../sprites/old1player-table-64-64.png | Bin source/main.lua | 56 ++++- source/scenes/Assemble.lua | 15 +- source/scenes/DroneCardSelector.lua | 102 +++++++- source/scenes/Game.lua | 17 +- source/scenes/MapSelector.lua | 19 +- source/scenes/Menu.lua | 5 +- source/scenes/bomber/BomberScene.lua | 238 ++++++++++++++++-- source/scripts/bomber/allyBullet.lua | 68 +++++ source/scripts/bomber/ammoCrate.lua | 71 ++++++ source/scripts/bomber/enemy.lua | 32 ++- source/scripts/bomber/explosionMark.lua | 2 +- source/scripts/bomber/floatingText.lua | 59 +++++ source/scripts/bomber/granade.lua | 3 +- source/scripts/bomber/movableCrosshair.lua | 16 +- source/scripts/bomber/noiseAnimation.lua | 45 +++- source/scripts/bomber/smokeCloud.lua | 54 ++++ source/scripts/groundSprite.lua | 2 +- source/scripts/tankSprite.lua | 15 +- 46 files changed, 737 insertions(+), 82 deletions(-) create mode 100644 source/assets/sprites/backgrounds/bomber.png rename source/assets/sprites/{bg1.png => backgrounds/fpv.png} (100%) delete mode 100644 source/assets/sprites/bg2.png rename source/assets/sprites/{boomSplash1.png => bomber/boom_splash_1.png} (100%) rename source/assets/sprites/{boomSplash2.png => bomber/boom_splash_2.png} (100%) rename source/assets/sprites/{enemy1.png => bomber/enemy_alive_1.png} (100%) rename source/assets/sprites/{enemy_2.png => bomber/enemy_alive_2.png} (100%) rename source/assets/sprites/{enemy1_3.png => bomber/enemy_dead.png} (100%) rename source/assets/sprites/{groundFin.png => ground_1.png} (100%) create mode 100644 source/assets/sprites/ground_2.png create mode 100644 source/assets/sprites/targets/btr.png create mode 100644 source/assets/sprites/targets/btr_dead.png rename source/assets/sprites/{ => targets}/tank.png (100%) rename source/assets/sprites/{tankD.png => targets/tank_dead.png} (100%) rename source/assets/{ => unused}/audio/drop.wav (100%) rename source/assets/{ => unused}/bg_bomber.psd (100%) rename source/assets/{ => unused}/fonts/Mini Sans 2X-table-18-20.png (100%) rename source/assets/{ => unused}/fonts/Outfoxies.fnt (100%) rename source/assets/{ => unused}/fonts/Play Girls.fnt (100%) rename source/assets/{ => unused}/fonts/diamond_20.fnt (100%) rename source/assets/{ => unused}/fonts/opal_9.fnt (100%) rename source/assets/{ => unused}/images/bg_bomber33.png (100%) rename source/assets/{ => unused}/sprites/death.png (100%) rename source/assets/{ => unused}/sprites/enemy1_1.png (100%) rename source/assets/{ => unused}/sprites/enemy1_2.png (100%) rename source/assets/{ => unused}/sprites/enemy1_4.png (100%) rename source/assets/{ => unused}/sprites/enemy2.png (100%) rename source/assets/{ => unused}/sprites/old1player-table-64-64.png (100%) create mode 100644 source/scripts/bomber/allyBullet.lua create mode 100644 source/scripts/bomber/ammoCrate.lua create mode 100644 source/scripts/bomber/floatingText.lua create mode 100644 source/scripts/bomber/smokeCloud.lua diff --git a/source/assets/sprites/backgrounds/bomber.png b/source/assets/sprites/backgrounds/bomber.png new file mode 100644 index 0000000000000000000000000000000000000000..02dde12fd59121ede828477a37dcfb14a8c812c1 GIT binary patch literal 73928 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 H8$S3yk}3RS literal 0 HcmV?d00001 diff --git a/source/assets/sprites/bg1.png b/source/assets/sprites/backgrounds/fpv.png similarity index 100% rename from source/assets/sprites/bg1.png rename to source/assets/sprites/backgrounds/fpv.png diff --git a/source/assets/sprites/bg2.png b/source/assets/sprites/bg2.png deleted file mode 100644 index 3686d6eafd18c452fccfd268c9609016c4f942f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19898 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 aBWIR0e&%$vXv9Cik+p@xEwq_;%D(~OlgiHk literal 0 HcmV?d00001 diff --git a/source/assets/sprites/targets/btr.png b/source/assets/sprites/targets/btr.png new file mode 100644 index 0000000000000000000000000000000000000000..67b374886e8f7947667dd76571cdd35524357f6b GIT binary patch literal 6765 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 literal 0 HcmV?d00001 diff --git a/source/assets/sprites/targets/btr_dead.png b/source/assets/sprites/targets/btr_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a9aa741d6ac96fc232e1d40ebca47c29f2de70 GIT binary patch literal 4232 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 literal 0 HcmV?d00001 diff --git a/source/assets/sprites/tank.png b/source/assets/sprites/targets/tank.png similarity index 100% rename from source/assets/sprites/tank.png rename to source/assets/sprites/targets/tank.png diff --git a/source/assets/sprites/tankD.png b/source/assets/sprites/targets/tank_dead.png similarity index 100% rename from source/assets/sprites/tankD.png rename to source/assets/sprites/targets/tank_dead.png diff --git a/source/assets/audio/drop.wav b/source/assets/unused/audio/drop.wav similarity index 100% rename from source/assets/audio/drop.wav rename to source/assets/unused/audio/drop.wav diff --git a/source/assets/bg_bomber.psd b/source/assets/unused/bg_bomber.psd similarity index 100% rename from source/assets/bg_bomber.psd rename to source/assets/unused/bg_bomber.psd diff --git a/source/assets/fonts/Mini Sans 2X-table-18-20.png b/source/assets/unused/fonts/Mini Sans 2X-table-18-20.png similarity index 100% rename from source/assets/fonts/Mini Sans 2X-table-18-20.png rename to source/assets/unused/fonts/Mini Sans 2X-table-18-20.png diff --git a/source/assets/fonts/Outfoxies.fnt b/source/assets/unused/fonts/Outfoxies.fnt similarity index 100% rename from source/assets/fonts/Outfoxies.fnt rename to source/assets/unused/fonts/Outfoxies.fnt diff --git a/source/assets/fonts/Play Girls.fnt b/source/assets/unused/fonts/Play Girls.fnt similarity index 100% rename from source/assets/fonts/Play Girls.fnt rename to source/assets/unused/fonts/Play Girls.fnt diff --git a/source/assets/fonts/diamond_20.fnt b/source/assets/unused/fonts/diamond_20.fnt similarity index 100% rename from source/assets/fonts/diamond_20.fnt rename to source/assets/unused/fonts/diamond_20.fnt diff --git a/source/assets/fonts/opal_9.fnt b/source/assets/unused/fonts/opal_9.fnt similarity index 100% rename from source/assets/fonts/opal_9.fnt rename to source/assets/unused/fonts/opal_9.fnt diff --git a/source/assets/images/bg_bomber33.png b/source/assets/unused/images/bg_bomber33.png similarity index 100% rename from source/assets/images/bg_bomber33.png rename to source/assets/unused/images/bg_bomber33.png diff --git a/source/assets/sprites/death.png b/source/assets/unused/sprites/death.png similarity index 100% rename from source/assets/sprites/death.png rename to source/assets/unused/sprites/death.png diff --git a/source/assets/sprites/enemy1_1.png b/source/assets/unused/sprites/enemy1_1.png similarity index 100% rename from source/assets/sprites/enemy1_1.png rename to source/assets/unused/sprites/enemy1_1.png diff --git a/source/assets/sprites/enemy1_2.png b/source/assets/unused/sprites/enemy1_2.png similarity index 100% rename from source/assets/sprites/enemy1_2.png rename to source/assets/unused/sprites/enemy1_2.png diff --git a/source/assets/sprites/enemy1_4.png b/source/assets/unused/sprites/enemy1_4.png similarity index 100% rename from source/assets/sprites/enemy1_4.png rename to source/assets/unused/sprites/enemy1_4.png diff --git a/source/assets/sprites/enemy2.png b/source/assets/unused/sprites/enemy2.png similarity index 100% rename from source/assets/sprites/enemy2.png rename to source/assets/unused/sprites/enemy2.png diff --git a/source/assets/sprites/old1player-table-64-64.png b/source/assets/unused/sprites/old1player-table-64-64.png similarity index 100% rename from source/assets/sprites/old1player-table-64-64.png rename to source/assets/unused/sprites/old1player-table-64-64.png diff --git a/source/main.lua b/source/main.lua index 70cbb07..156c7b2 100644 --- a/source/main.lua +++ b/source/main.lua @@ -42,12 +42,16 @@ Maps = { name = "Vovchansk", description = "This is a map", locked = false, + unlockMissions = 0, + killTarget = 10, }, { id = 2, name = "Mariupol", description = "This is a map", - locked = false, + locked = true, + unlockMissions = 3, + killTarget = 15, } } @@ -71,9 +75,10 @@ Drones = { { id = 2, mode = Modes.bomber, - name = "Drone 2", + name = "Bomber", description = "This is a drone", price = 200, + stockPrice = 50, locked = false, preview = nil, full = nil @@ -82,7 +87,7 @@ Drones = { id = 3, name = "Drone 3", description = "This is a drone", - price = 300, + price = -1, locked = true, preview = nil, full = nil @@ -91,7 +96,7 @@ Drones = { id = 4, name = "Drone 4", description = "This is a drone", - price = 400, + price = -1, locked = true, preview = nil, full = nil @@ -114,6 +119,10 @@ import "scripts/bomber/movableCrosshair" import "scripts/bomber/granade" import "scripts/bomber/explosionMark" import "scripts/bomber/enemy" +import "scripts/bomber/ammoCrate" +import "scripts/bomber/smokeCloud" +import "scripts/bomber/floatingText" +import "scripts/bomber/allyBullet" import "scripts/bomber/noiseAnimation" import "scenes/BaseScene" import 'scenes/Assemble' @@ -150,12 +159,49 @@ Noble.Settings.setup({ debug = false }) +Targets = { + { + id = "tank", + name = "Tank", + sprite = "assets/sprites/targets/tank", + spriteD = "assets/sprites/targets/tank_dead", + briefing = [[The drone is assembled and operational. We are ready for the mission. + +An enemy tank is confirmed in the field. It threatens our advance. + +Your task: eliminate the target. Clear the path for our assault units. + +This operation is crucial. Execute with precision. Command out.]], + }, + { + id = "btr", + name = "BTR", + sprite = "assets/sprites/targets/btr", + spriteD = "assets/sprites/targets/btr_dead", + briefing = [[The drone is assembled and operational. We are ready for the mission. + +An enemy BTR has been spotted moving through the area. It's transporting troops. + +Your task: hit the BTR before it reaches the frontline. Stop the reinforcements. + +Time is critical. Strike hard. Command out.]], + }, +} + +CurrentMission = { + mapId = 1, + droneId = 1, + targetIndex = 1, +} + Noble.GameData.setup({ drone1 = 0, drone2 = 0, drone3 = 0, drone4 = 0, - money = 150 + money = 500, + bomberStock = 3, + missionsCompleted = 0, }) playdate.display.setRefreshRate(50) diff --git a/source/scenes/Assemble.lua b/source/scenes/Assemble.lua index 50f1d9f..381391c 100644 --- a/source/scenes/Assemble.lua +++ b/source/scenes/Assemble.lua @@ -13,7 +13,7 @@ function scene:popCode(button) end scene.menuConfirmSound:stop() if scene.tickTimer.paused then - scene.droneParts = scene:loadDrone(1, #scene.code) + scene.droneParts = scene:loadDrone(CurrentMission.droneId, #scene.code) scene.tickTimer:start() scene.progressBar:setVisible(true) end @@ -146,16 +146,9 @@ function scene:enter() scene.buttonTimeout = 100 Noble.Input.setHandler(scene.inputHandler) - local text = - [[The drone is assembled and operational. We are ready for the mission. - -An enemy tank is confirmed in the field. It threatens our advance. - -Your task: eliminate the target. Clear the path for our assault units. - -This operation is crucial. Execute with precision. Command out.]] - - self.dialogue = pdDialogueBox(text, 390, 46) + CurrentMission.targetIndex = math.random(1, #Targets) + local target = Targets[CurrentMission.targetIndex] + self.dialogue = pdDialogueBox(target.briefing, 390, 46) -- self.dialogue:setPadding(4) end diff --git a/source/scenes/DroneCardSelector.lua b/source/scenes/DroneCardSelector.lua index c75d4cd..92039e8 100644 --- a/source/scenes/DroneCardSelector.lua +++ b/source/scenes/DroneCardSelector.lua @@ -6,22 +6,59 @@ local elapsedTime = 0 scene.inputHandler = { AButtonDown = function() - if Drones[scene.menuIndex].locked == true then + local drone = Drones[scene.menuIndex] + -- If locked, try to buy + if drone.locked == true then + if drone.price <= 0 then return end + local money = Noble.GameData.get("money") + if money >= drone.price then + Noble.GameData.set("money", money - drone.price) + Noble.GameData.set("drone" .. drone.id, 1) + drone.locked = false + scene.menuConfirmSound:play(1) + scene.purchaseText = "-$" .. drone.price + scene.purchaseTimer = playdate.timer.new(1200, 0, 40, playdate.easingFunctions.outCubic) + screenShake(200, 3) + else + screenShake(300, 5) + scene.noMoneyTimer = playdate.timer.new(800, 0, 800, playdate.easingFunctions.linear) + end return end + CurrentMission.droneId = drone.id scene.menuConfirmSound:play(1) - local mode = Drones[scene.menuIndex].mode + local mode = drone.mode local soundTable = playdate.sound.playingSources() for i=1, #soundTable do soundTable[i]:stop() end if mode == Modes.bomber then + local stock = Noble.GameData.get("bomberStock") + if stock <= 0 then + return + end + Noble.GameData.set("bomberStock", stock - 1) Noble.transition(BomberScene) else Noble.transition(Assemble) end end, BButtonDown = function() + -- B on bomber drone: buy stock + local drone = Drones[scene.menuIndex] + if not drone.locked and drone.mode == Modes.bomber then + local money = Noble.GameData.get("money") + local stockPrice = drone.stockPrice or 50 + if money >= stockPrice then + Noble.GameData.set("money", money - stockPrice) + Noble.GameData.set("bomberStock", Noble.GameData.get("bomberStock") + 1) + scene.menuConfirmSound:play(1) + scene.purchaseText = "-$" .. stockPrice + scene.purchaseY = 0 + scene.purchaseTimer = playdate.timer.new(1200, 0, 40, playdate.easingFunctions.outCubic) + return + end + end scene.menuBackSound:play(1) Noble.transition(MapSelector) end, @@ -62,6 +99,10 @@ function scene:setValues() scene.currentX = 0 scene.targetX = 0 + + scene.purchaseText = nil + scene.purchaseTimer = nil + scene.noMoneyTimer = nil end function scene:init() @@ -78,6 +119,16 @@ end function scene:enter() scene.super.enter(self) + + -- Update locked state from GameData + for i = 1, #Drones do + Drones[i].locked = (Noble.GameData.get("drone" .. i) == 0) + end + + scene.menuIndex = 1 + scene.currentX = 0 + scene.targetX = 0 + scene.cards = {} for i = 1, #Drones do scene.cards[i] = DroneCard(0, 0, Drones[i]) @@ -108,13 +159,54 @@ function scene:update() scene.cards[i]:moveTo(x + scene.currentX, 25) end - if Drones[scene.menuIndex].locked == false then + local drone = Drones[scene.menuIndex] + + -- Money display + Noble.Text.draw("$" .. Noble.GameData.get("money"), 200, 5, Noble.Text.ALIGN_CENTER, false, fontMed) + + if drone.locked and drone.price > 0 then + self.aKey:draw(315, 207 + dy) + Noble.Text.draw("Buy $" .. drone.price, 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + elseif drone.locked then + Noble.Text.draw("Coming soon", 340, 210, Noble.Text.ALIGN_CENTER, false, fontMed) + elseif drone.mode == Modes.bomber then + local stock = Noble.GameData.get("bomberStock") + self.aKey:draw(315, 207 + dy) + Noble.Text.draw("Go (" .. stock .. "x)", 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + else self.aKey:draw(315, 207 + dy) Noble.Text.draw("Assemble", 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) end - self.bKey:draw(15, 207 + dy) - Noble.Text.draw("Back", 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + -- B button: back or buy stock + if not drone.locked and drone.mode == Modes.bomber then + self.bKey:draw(15, 207 + dy) + Noble.Text.draw("Buy +1: $" .. (drone.stockPrice or 50), 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + else + self.bKey:draw(15, 207 + dy) + Noble.Text.draw("Back", 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + end + + -- Not enough money warning + if scene.noMoneyTimer then + if scene.noMoneyTimer.value < 800 then + Noble.Text.draw("Not enough $!", 200, 190, Noble.Text.ALIGN_CENTER, false, fontMed) + else + scene.noMoneyTimer = nil + end + end + + -- Purchase animation + if scene.purchaseText and scene.purchaseTimer then + local offset = scene.purchaseTimer.value + local alpha = 1.0 - (offset / 40) + if alpha > 0 then + Noble.Text.draw(scene.purchaseText, 200, 20 - offset, Noble.Text.ALIGN_CENTER, false, fontMed) + else + scene.purchaseText = nil + scene.purchaseTimer = nil + end + end scene.paginator:moveTo(200, 207) end diff --git a/source/scenes/Game.lua b/source/scenes/Game.lua index 0b31071..b33ae4a 100644 --- a/source/scenes/Game.lua +++ b/source/scenes/Game.lua @@ -21,7 +21,8 @@ function scene:drawBackground() end function scene:setValues() - self.bg = Graphics.image.new("assets/sprites/bg1") + local bgPaths = { "assets/sprites/backgrounds/fpv", "assets/sprites/backgrounds/bomber" } + self.bg = Graphics.image.new(bgPaths[CurrentMission.mapId]) scene.bgX = 0 scene.telemLostSound = playdate.sound.fileplayer.new("assets/audio/telemko") scene.telemLostSoundPlayed = false @@ -69,17 +70,17 @@ end function scene:enter() scene.super.enter(self) - + scene:setValues() scene.player = Player(150, 100) scene.ground = Ground(0, 225, scene.player) scene.balebaSpawner.timerEndedCallback = function() - scene:spawnBaleba() + -- scene:spawnBaleba() end for i = 1, 3 do - scene:spawnBaleba() + -- scene:spawnBaleba() end scene.helloAudio:play(1) @@ -135,8 +136,14 @@ function scene:update() if scene.player.targetDone then message = "You did it!" end + if scene.player.targetDone then + local reward = 100 + Noble.GameData.set("missionsCompleted", Noble.GameData.get("missionsCompleted") + 1) + Noble.GameData.set("money", Noble.GameData.get("money") + reward) + message = "You did it! +$" .. reward + end c = notify(message, function() - Noble.transition(Menu) + Noble.transition(DroneCardSelector) c:remove() end) c:moveTo(200, 120) diff --git a/source/scenes/MapSelector.lua b/source/scenes/MapSelector.lua index 8e379f9..1cd6d2a 100644 --- a/source/scenes/MapSelector.lua +++ b/source/scenes/MapSelector.lua @@ -34,6 +34,17 @@ end function scene:enter() scene.super.enter(self) + + -- Update locked state from missionsCompleted + local completed = Noble.GameData.get("missionsCompleted") + for i = 1, #Maps do + Maps[i].locked = (completed < Maps[i].unlockMissions) + end + + scene.menuIndex = 1 + scene.currentX = 0 + scene.targetX = 0 + scene.cards = {} for i = 1, #Maps do scene.cards[i] = MapCard(0, 0, Maps[i]) @@ -61,15 +72,18 @@ function scene:update() end -- Bottom background - if Maps[scene.menuIndex].locked == false then + local map = Maps[scene.menuIndex] + if map.locked == false then self.aKey:draw(315, 207 + dy) Noble.Text.draw("Select", 333, 210, Noble.Text.ALIGN_LEFT, false, fontMed) + else + Noble.Text.draw(map.unlockMissions .. " missions to unlock", 200, 195, Noble.Text.ALIGN_CENTER, false, fontMed) end self.bKey:draw(15, 207 + dy) Noble.Text.draw("Back", 33, 210, Noble.Text.ALIGN_LEFT, false, fontMed) - Noble.Text.draw(string.upper(Maps[scene.menuIndex].name), 200, 210, Noble.Text.ALIGN_CENTER, false, fontBig) + Noble.Text.draw(string.upper(map.name), 200, 210, Noble.Text.ALIGN_CENTER, false, fontBig) end @@ -96,6 +110,7 @@ scene.inputHandler = { if Maps[scene.menuIndex].locked then return end + CurrentMission.mapId = Maps[scene.menuIndex].id scene.menuConfirmSound:play(1) Noble.transition(DroneCardSelector) end, diff --git a/source/scenes/Menu.lua b/source/scenes/Menu.lua index f7b7b8f..0deae1a 100644 --- a/source/scenes/Menu.lua +++ b/source/scenes/Menu.lua @@ -126,6 +126,9 @@ function scene:setupMenu(__menu) end return end) - __menu:addItem("Credits", function() return end) + __menu:addItem("Credits", function() + Noble.GameData.resetAll() + print("GameData reset!") + end) __menu:select("Start") end diff --git a/source/scenes/bomber/BomberScene.lua b/source/scenes/bomber/BomberScene.lua index d0f0215..e7bc11a 100644 --- a/source/scenes/bomber/BomberScene.lua +++ b/source/scenes/bomber/BomberScene.lua @@ -7,7 +7,7 @@ local font = Graphics.font.new('assets/fonts/Mini Sans 2X') function scene:init() scene.super.init(self) - self.bg = Graphics.image.new("assets/sprites/bg2") + self.bg = Graphics.image.new("assets/sprites/backgrounds/bomber") self.bgY = 0 self.scrollSpeed = 0.6 @@ -31,6 +31,10 @@ function scene:init() scene.availableGrenades = 8 + scene.killCount = 0 + scene.killTarget = Maps[CurrentMission.mapId].killTarget or 10 + scene.missionEnded = false + scene.enemies = {} scene.enemySpawnTimer = nil @@ -40,16 +44,43 @@ function scene:init() scene.minSpawnDelay = 500 scene.maxSpawnDelay = 3500 + scene.enemySpeedBonus = 0 + scene.enemySpeedMax = 1.5 + scene.enemySpeedRamp = 0.0005 + + scene.crateTimer = 0 + scene.crateInterval = math.random(400, 800) + + scene.allyBulletTimer = 0 + scene.allyBulletInterval = math.random(200, 500) + + -- Drone battery (in frames, ~60 seconds at 50fps) + scene.battery = 3000 + scene.batteryMax = 3000 + + -- Falling state + scene.falling = false + + -- Combo tracking + scene.comboCount = 0 + scene.comboText = nil + scene.comboTextTimer = nil + BomberScene.instance = self end function scene:drawBackground() + if scene.missionEnded and scene.falling then + Graphics.clear(Graphics.kColorBlack) + return + end + self.bgY = self.bgY + self.scrollSpeed - + if self.bgY >= 720 then self.bgY = 0 end - + self.bg:draw(0, self.bgY - 720) self.bg:draw(0, self.bgY) end @@ -116,31 +147,206 @@ function scene:start() Noble.showFPS = true end +function scene:hasActiveGrenades() + local sprites = playdate.graphics.sprite.getAllSprites() + for i = 1, #sprites do + if sprites[i]:getTag() == 154 then + return true + end + end + return false +end + function scene:update() scene.super.update(self) + if scene.missionEnded then return end + + local killsBefore = scene.killCount + + -- Ramp up enemy speed over time + if scene.enemySpeedBonus < scene.enemySpeedMax then + scene.enemySpeedBonus = scene.enemySpeedBonus + scene.enemySpeedRamp + end + + -- Drone battery + scene.battery = scene.battery - 1 + if scene.battery <= 0 and not scene.falling then + scene.falling = true + scene.fallTimer = 0 + scene.fallDuration = 120 + -- Stop spawning new enemies + if scene.enemySpawnTimer then + scene.enemySpawnTimer:remove() + end + end + + if scene.falling then + scene.fallTimer = scene.fallTimer + 1 + + if scene.fallTimer == 1 then + scene.crosshair:setVisible(false) + scene.fallSnapshot = playdate.graphics.getDisplayImage():copy() + -- Remove all gameplay sprites during fall + local allSprites = playdate.graphics.sprite.getAllSprites() + for i = 1, #allSprites do + allSprites[i]:remove() + end + end + + local t = scene.fallTimer / scene.fallDuration + local scale = 1 + t * t * 5 + + local w = math.floor(400 * scale) + local h = math.floor(240 * scale) + local x = math.floor((400 - w) / 2) + local y = math.floor((240 - h) / 2) + + Graphics.clear(Graphics.kColorBlack) + scene.fallSnapshot:drawScaled(x, y, scale) + + if scene.fallTimer >= scene.fallDuration and not scene.missionEnded then + scene.missionEnded = true + scene.fallSnapshot = nil + + -- Remove all gameplay sprites + local allSprites = playdate.graphics.sprite.getAllSprites() + for i = 1, #allSprites do + allSprites[i]:remove() + end + + -- Crash effects + BigBoom() + screenShake(1500, 8) + local random = math.random(1, 4) + local crashSound = playdate.sound.fileplayer.new("assets/audio/boom" .. random) + crashSound:setVolume(0.8) + crashSound:play(1) + + playdate.timer.performAfterDelay(2000, function() + local c + c = notify("Battery dead!", function() + Noble.transition(DroneCardSelector) + c:remove() + end) + c:moveTo(200, 120) + c:add() + end) + end + return + end + + -- Spawn ammo crates + scene.crateTimer = scene.crateTimer + 1 + if scene.crateTimer >= scene.crateInterval then + scene.crateTimer = 0 + scene.crateInterval = math.random(400, 800) + AmmoCrate(math.random(30, 370), -20) + end + + -- Ally bullets (steal kills) + scene.allyBulletTimer = scene.allyBulletTimer + 1 + if scene.allyBulletTimer >= scene.allyBulletInterval then + scene.allyBulletTimer = 0 + scene.allyBulletInterval = math.random(200, 500) + -- Find a random alive enemy to target + local alive = {} + for i = 1, #scene.enemies do + if scene.enemies[i] and not scene.enemies[i].removed and not scene.enemies[i].isDying then + alive[#alive + 1] = scene.enemies[i] + end + end + if #alive > 0 then + local target = alive[math.random(1, #alive)] + AllyBullet(target) + end + end + + -- Victory check + if scene.killCount >= scene.killTarget then + scene.missionEnded = true + scene.crosshair:setVisible(false) + local reward = 100 + Noble.GameData.set("missionsCompleted", Noble.GameData.get("missionsCompleted") + 1) + Noble.GameData.set("money", Noble.GameData.get("money") + reward) + local c + c = notify("Mission Complete! +$" .. reward, function() + Noble.transition(DroneCardSelector) + c:remove() + end) + c:moveTo(200, 120) + c:add() + return + end + + -- Defeat check: no grenades left and no active grenades on screen + if scene.availableGrenades <= 0 and not scene.grenadeCooldown and not scene:hasActiveGrenades() then + scene.missionEnded = true + scene.crosshair:setVisible(false) + local c + c = notify("Mission Failed!", function() + Noble.transition(DroneCardSelector) + c:remove() + end) + c:moveTo(200, 120) + c:add() + return + end + if scene.grenadeCooldown and not scene.autoReload and not playdate.isCrankDocked() then local change = playdate.getCrankChange() - + if change > 0 or change < 0 then scene.reloadProgress = scene.reloadProgress + (change * scene.crankSensitivity) if scene.reloadProgress > scene.progressBarMax then scene.reloadProgress = scene.progressBarMax - + scene.grenadeCooldown = false scene.progressBar:setVisible(false) end - + scene.progressBar:set(scene.reloadProgress) end end + -- Combo detection + local frameKills = scene.killCount - killsBefore + if frameKills >= 2 then + scene.comboText = "x" .. frameKills .. " COMBO!" + scene.comboTextTimer = playdate.timer.new(1500, 0, 1500, playdate.easingFunctions.linear) + scene.availableGrenades = scene.availableGrenades + (frameKills - 1) + end + + -- HUD: kill count + Noble.Text.draw(scene.killCount .. "/" .. scene.killTarget, 350, 10, Noble.Text.ALIGN_RIGHT, false, font) + + -- HUD: battery bar + local batW = 40 + local batH = 6 + local batX = 180 + local batY = 10 + local batFill = (scene.battery / scene.batteryMax) * batW + Graphics.drawRect(batX, batY, batW, batH) + Graphics.fillRect(batX, batY, batFill, batH) + + -- HUD: combo text + if scene.comboText and scene.comboTextTimer then + if scene.comboTextTimer.value < 1500 then + Noble.Text.draw(scene.comboText, 200, 100, Noble.Text.ALIGN_CENTER, false, font) + else + scene.comboText = nil + scene.comboTextTimer = nil + end + end + Noble.Text.draw(scene.availableGrenades .. "x", 10, 210, Noble.Text.ALIGN_LEFT, false, font) - if scene.availableGrenades <= 0 then + if scene.availableGrenades <= 0 and not scene:hasActiveGrenades() then Noble.Text.draw("No grenades left", 200, 110, Noble.Text.ALIGN_CENTER, false, font) scene.crosshair:setVisible(false) scene.progressBar:setVisible(false) + elseif scene.availableGrenades <= 0 then + -- grenades still flying, wait elseif playdate.isCrankDocked() then Noble.Text.draw("Crank it to reload!", 200, 110, Noble.Text.ALIGN_CENTER, false, font) playdate.ui.crankIndicator:draw() @@ -157,7 +363,8 @@ function scene:spawnEnemies() end if activeEnemies < self.maxEnemies then - scene.enemies[scene.nextEnemyIndex] = Enemy(math.random(30, 370), -20) + local isScout = math.random() < 0.1 + scene.enemies[scene.nextEnemyIndex] = Enemy(math.random(30, 370), -20, isScout) scene.nextEnemyIndex = scene.nextEnemyIndex + 1 end @@ -174,23 +381,22 @@ end function scene:finish() scene.themeSound:stop() scene.enemySpawnTimer:remove() - for i = 1, #scene.enemies do - if scene.enemies[i] then - scene.enemies[i]:remove() - end + + -- Remove ALL sprites to prevent leaking into next scene + local allSprites = playdate.graphics.sprite.getAllSprites() + for i = 1, #allSprites do + allSprites[i]:remove() end + scene.enemies = {} - if scene.progressBar then - scene.progressBar:remove() - end scene.progressBar = nil if scene.grenadeCooldownTimer then scene.grenadeCooldownTimer:remove() end scene.grenadeCooldownTimer = nil - scene.crosshair:remove() scene.crosshair = nil BomberScene.instance = nil + NoiseAnimation.isJamming = false end -- TODO: random spawn some decorations diff --git a/source/scripts/bomber/allyBullet.lua b/source/scripts/bomber/allyBullet.lua new file mode 100644 index 0000000..70ee946 --- /dev/null +++ b/source/scripts/bomber/allyBullet.lua @@ -0,0 +1,68 @@ +AllyBullet = {} +class('AllyBullet').extends(playdate.graphics.sprite) + +local killPhrases = { "stolen!", "mine!", "gotcha", "sorry :)", "too slow", "ez" } + +function AllyBullet:init(targetEnemy) + AllyBullet.super.init(self) + + self.target = targetEnemy + self.speed = 3 + self.removed = false + + self:setSize(4, 8) + self:setCenter(0.5, 0.5) + self:setZIndex(ZIndex.fx) + self:moveTo(targetEnemy.x + math.random(-30, 30), 250) + self:add() + self:markDirty() +end + +function AllyBullet:update() + if self.removed then return end + + -- Fly upward toward target + local dx = 0 + local dy = -self.speed + if self.target and not self.target.removed and not self.target.isDying then + dx = (self.target.x - self.x) * 0.05 + end + self:moveBy(dx, dy) + + -- Rotate to match flight vector + local angle = math.deg(math.atan(dy, dx)) + 90 + self:setRotation(angle) + + -- Check if reached target + if self.target and not self.target.removed and not self.target.isDying then + local dist = math.abs(self.y - self.target.y) + math.abs(self.x - self.target.x) + if dist < 20 then + -- Kill enemy without counting toward player score + self.target:setImage(self.target.deadImage) + self.target.isDying = true + self.target.vx = math.random(-2, 2) + self.target.vy = math.random(-1, 1) + self.target:setRotation(math.random() * 360) + + -- Show "stolen" text + local phrase = killPhrases[math.random(1, #killPhrases)] + FloatingText.spawnCustom(self.target.x, self.target.y, phrase) + + self.removed = true + self:remove() + return + end + end + + -- Off screen + if self.y < -10 then + self.removed = true + self:remove() + end + + self:markDirty() +end + +function AllyBullet:draw() + playdate.graphics.fillRect(0, 0, 4, 8) +end diff --git a/source/scripts/bomber/ammoCrate.lua b/source/scripts/bomber/ammoCrate.lua new file mode 100644 index 0000000..ee41193 --- /dev/null +++ b/source/scripts/bomber/ammoCrate.lua @@ -0,0 +1,71 @@ +AmmoCrate = {} +class('AmmoCrate').extends(playdate.graphics.sprite) + +function AmmoCrate:init(x, y) + AmmoCrate.super.init(self) + + self.crateSize = 20 + self:setSize(self.crateSize, self.crateSize) + self:setCenter(0.5, 0.5) + self:setZIndex(ZIndex.props) + self:setGroups(CollideGroups.props) + self:setCollidesWithGroups({ CollideGroups.granade }) + self:setCollideRect(0, 0, self.crateSize, self.crateSize) + self:setTag(155) + + self.removed = false + self.bonusGrenades = 3 + + self:moveTo(x, y) + self:add() + self:markDirty() +end + +function AmmoCrate:update() + if self.removed then return end + if not BomberScene.instance then return end + + self:moveBy(0, BomberScene.instance.scrollSpeed) + + local _, _, collisions, count = self:checkCollisions(self.x, self.y) + if count > 0 then + for i, collision in ipairs(collisions) do + if collision.other:getTag() == 154 and collision.other.currentRadius <= 0.05 then + self:pickup() + return + end + end + end + + if self.y > 260 then + self.removed = true + self:remove() + end +end + +function AmmoCrate:pickup() + self.removed = true + BomberScene.availableGrenades = BomberScene.availableGrenades + self.bonusGrenades + + local particle = ParticlePoly(self.x, self.y) + particle:setThickness(1) + particle:setSize(1, 2) + particle:setSpeed(1, 5) + particle:setColour(Graphics.kColorXOR) + particle:add(8) + + self:remove() +end + +function AmmoCrate:draw() + local s = self.crateSize + -- Box outline + playdate.graphics.drawRect(0, 0, s, s) + -- Cross pattern + playdate.graphics.drawLine(0, 0, s, s) + playdate.graphics.drawLine(s, 0, 0, s) + -- Inner + symbol + local mid = s / 2 + playdate.graphics.drawLine(mid - 3, mid, mid + 3, mid) + playdate.graphics.drawLine(mid, mid - 3, mid, mid + 3) +end diff --git a/source/scripts/bomber/enemy.lua b/source/scripts/bomber/enemy.lua index 7e3c025..ed9754c 100644 --- a/source/scripts/bomber/enemy.lua +++ b/source/scripts/bomber/enemy.lua @@ -1,13 +1,13 @@ Enemy = {} class('Enemy').extends(NobleSprite) -function Enemy:init(x,y) +function Enemy:init(x, y, isScout) Enemy.super.init(self) self:moveTo(x, y) self:setZIndex(4) self:add(x,y) - self.markImage = Graphics.image.new("assets/sprites/enemy"..math.random(1,2)) -- TODO: make it random - self.deadImage = Graphics.image.new("assets/sprites/enemy1_3") + self.markImage = Graphics.image.new("assets/sprites/bomber/enemy_alive_"..math.random(1,2)) + self.deadImage = Graphics.image.new("assets/sprites/bomber/enemy_dead") self.hitSound = playdate.sound.fileplayer.new("assets/audio/hit1") self:setImage(self.markImage) self.removed = false @@ -18,11 +18,21 @@ function Enemy:init(x,y) }) self:setCollideRect(-6, -6, 46, 46) self:setSize(32, 32) - + self.vx = 0 self.vy = 0 self.isDying = false self.friction = 0.95 + + self.isScout = isScout or false + if self.isScout then + self.baseSpeed = math.random(8, 14) / 10 + self.zigzagTime = math.random() * 100 + self.zigzagAmplitude = math.random(8, 15) / 10 + self.zigzagFrequency = math.random(4, 8) / 100 + else + self.baseSpeed = math.random(2, 8) / 10 + end end function Enemy:update() @@ -40,8 +50,13 @@ function Enemy:update() self.removed = true end elseif not self.removed then - speed = math.random(0, 7)/10 - self:moveBy(0, BomberScene.instance.scrollSpeed + speed) + speed = self.baseSpeed + (BomberScene.enemySpeedBonus or 0) + local dx = 0 + if self.isScout then + self.zigzagTime = self.zigzagTime + self.zigzagFrequency + dx = math.sin(self.zigzagTime) * self.zigzagAmplitude + end + self:moveBy(dx, BomberScene.instance.scrollSpeed + speed) else self:moveBy(0, BomberScene.instance.scrollSpeed) end @@ -89,6 +104,9 @@ function Enemy:applyExplosionForce(explosionX, explosionY) self.vy = dy * force * 0.5 self.isDying = true - + + BomberScene.killCount = BomberScene.killCount + 1 + FloatingText(self.x, self.y) + self:setRotation(math.random() * 360) end diff --git a/source/scripts/bomber/explosionMark.lua b/source/scripts/bomber/explosionMark.lua index 78335d0..1658460 100644 --- a/source/scripts/bomber/explosionMark.lua +++ b/source/scripts/bomber/explosionMark.lua @@ -4,7 +4,7 @@ class('ExplosionMark').extends(NobleSprite) function ExplosionMark:init(x, y) ExplosionMark.super.init(self) self.id = math.random(1, 2) - self.markImage = Graphics.image.new("assets/sprites/boomSplash" .. self.id) + self.markImage = Graphics.image.new("assets/sprites/bomber/boom_splash_" .. self.id) self:setImage(self.markImage) self:moveTo(x, y) self:setZIndex(5) diff --git a/source/scripts/bomber/floatingText.lua b/source/scripts/bomber/floatingText.lua new file mode 100644 index 0000000..5a79624 --- /dev/null +++ b/source/scripts/bomber/floatingText.lua @@ -0,0 +1,59 @@ +FloatingText = {} +class('FloatingText').extends(playdate.graphics.sprite) + +local floatFont = Graphics.font.new('assets/fonts/Mini Sans 2X') + +local phrases = { "-1", "nice", "200", "dead", "done", "nice shot", "boom", "rip", "lol", "ez" } + +function FloatingText.spawnCustom(x, y, text) + local ft = FloatingText(x, y) + ft.text = text + local w = floatFont:getTextWidth(text) + 4 + ft:setSize(w, 16) + ft:markDirty() + return ft +end + +function FloatingText:init(x, y) + FloatingText.super.init(self) + + self.text = phrases[math.random(1, #phrases)] + self.life = 0 + self.maxLife = 60 + self.driftX = math.random(-20, 20) / 10 + self.driftY = -math.random(10, 20) / 10 + + local w = floatFont:getTextWidth(self.text) + 4 + self:setSize(w, 16) + self:setCenter(0.5, 0.5) + self:setZIndex(ZIndex.ui + 1) + self:moveTo(x, y) + self:add() + self:markDirty() +end + +function FloatingText:update() + self.life = self.life + 1 + if self.life >= self.maxLife then + self:remove() + return + end + + self:moveBy(self.driftX, self.driftY) + self.driftY = self.driftY + 0.03 + self:markDirty() +end + +function FloatingText:draw() + local t = 1 - (self.life / self.maxLife) + if t > 0.5 then + floatFont:drawText(self.text, 2, 0) + else + local dither = playdate.graphics.image.kDitherTypeBayer4x4 + local img = Graphics.image.new(self.width, self.height) + Graphics.pushContext(img) + floatFont:drawText(self.text, 2, 0) + Graphics.popContext() + img:drawFaded(0, 0, t * 2, dither) + end +end diff --git a/source/scripts/bomber/granade.lua b/source/scripts/bomber/granade.lua index 7701939..9287a8d 100644 --- a/source/scripts/bomber/granade.lua +++ b/source/scripts/bomber/granade.lua @@ -71,7 +71,8 @@ function Granade:update() screenShake(1000, 5) SmallBoom() ExplosionMark(self.x, self.y) - + SmokeCloud(self.x, self.y) + self:remove() end end diff --git a/source/scripts/bomber/movableCrosshair.lua b/source/scripts/bomber/movableCrosshair.lua index 03c4c77..b5b2360 100644 --- a/source/scripts/bomber/movableCrosshair.lua +++ b/source/scripts/bomber/movableCrosshair.lua @@ -29,9 +29,19 @@ function MovableCrosshair:update() MovableCrosshair.super.update(self) self.time = self.time + playdate.display.getRefreshRate() / 1000 - local offsetX = math.sin(self.time) * self.moveRadius - local offsetY = math.cos(self.time * 1.3) * self.moveRadius - + local radius = self.moveRadius + if NoiseAnimation.isJamming then + radius = 8 + end + + local offsetX = math.sin(self.time) * radius + local offsetY = math.cos(self.time * 1.3) * radius + + if NoiseAnimation.isJamming then + offsetX = offsetX + math.random(-3, 3) + offsetY = offsetY + math.random(-3, 3) + end + self:moveTo(self.baseX + offsetX, self.baseY + offsetY) self:markDirty() end diff --git a/source/scripts/bomber/noiseAnimation.lua b/source/scripts/bomber/noiseAnimation.lua index 54c6f44..da7f07f 100644 --- a/source/scripts/bomber/noiseAnimation.lua +++ b/source/scripts/bomber/noiseAnimation.lua @@ -1,6 +1,9 @@ NoiseAnimation = {} class('NoiseAnimation').extends(NobleSprite) +-- Global EW (РЕБ) state accessible by crosshair +NoiseAnimation.isJamming = false + function NoiseAnimation:init(x, y) NoiseAnimation.super.init(self, "assets/sprites/noise", true) self.animation:addState("run", 2, 11) @@ -13,24 +16,40 @@ function NoiseAnimation:init(x, y) self:moveTo(x, y) self.state = "idle" - self.idleFrames = 0 + self.timer = 0 + + -- РЕБ timing: long idle periods, short jam bursts + self.minIdleDuration = 300 + self.maxIdleDuration = 600 + self.minJamDuration = 40 + self.maxJamDuration = 120 + + self.nextSwitch = math.random(self.minIdleDuration, self.maxIdleDuration) end function NoiseAnimation:update() - if self.state == "idle" then - self.idleFrames -= 1 - if self.idleFrames <= 0 then - self.state = "run" + self.timer = self.timer + 1 + + if self.timer >= self.nextSwitch then + self.timer = 0 + if self.state == "idle" then + self.state = "jamming" self.animation:setState("run") - end - else - local r = math.random(0) - if r < 0.01 then - self.state = "idle" - self.idleFrames = math.random(30, 100) - self.animation:setState("idle") + self.nextSwitch = math.random(self.minJamDuration, self.maxJamDuration) + NoiseAnimation.isJamming = true else - self.animation:setState("run") + self.state = "idle" + self.animation:setState("idle") + self.nextSwitch = math.random(self.minIdleDuration, self.maxIdleDuration) + NoiseAnimation.isJamming = false + playdate.display.setOffset(0, 0) end end + + -- Micro screen shake during jamming + if self.state == "jamming" then + local sx = math.random(-1, 1) + local sy = math.random(-1, 1) + playdate.display.setOffset(sx, sy) + end end diff --git a/source/scripts/bomber/smokeCloud.lua b/source/scripts/bomber/smokeCloud.lua new file mode 100644 index 0000000..ef974ff --- /dev/null +++ b/source/scripts/bomber/smokeCloud.lua @@ -0,0 +1,54 @@ +SmokeCloud = {} +class('SmokeCloud').extends(playdate.graphics.sprite) + +function SmokeCloud:init(x, y) + SmokeCloud.super.init(self) + + self.radius = 25 + self.maxLife = 150 + self.life = self.maxLife + + local size = self.radius * 2 + 4 + self:setSize(size, size) + self:setCenter(0.5, 0.5) + self:setZIndex(ZIndex.fx - 1) + self:moveTo(x, y) + self:add() + self:markDirty() +end + +function SmokeCloud:update() + if not BomberScene.instance then + self:remove() + return + end + + self:moveBy(0, BomberScene.instance.scrollSpeed) + self.life = self.life - 1 + + if self.life <= 0 or self.y > 280 then + self:remove() + return + end + + self:markDirty() +end + +function SmokeCloud:draw() + local t = self.life / self.maxLife + local r = self.radius * t + local cx = self.width / 2 + local cy = self.height / 2 + + local dither = playdate.graphics.image.kDitherTypeBayer4x4 + if t < 0.3 then + dither = playdate.graphics.image.kDitherTypeBayer8x8 + elseif t < 0.6 then + dither = playdate.graphics.image.kDitherTypeBayer4x4 + end + + playdate.graphics.setColor(playdate.graphics.kColorBlack) + playdate.graphics.setDitherPattern(1 - t * 0.6, dither) + playdate.graphics.fillCircleAtPoint(cx, cy, r) + playdate.graphics.setColor(playdate.graphics.kColorBlack) +end diff --git a/source/scripts/groundSprite.lua b/source/scripts/groundSprite.lua index 07c5f02..6a024b5 100644 --- a/source/scripts/groundSprite.lua +++ b/source/scripts/groundSprite.lua @@ -2,7 +2,7 @@ Ground = {} class("Ground").extends(NobleSprite) function Ground:init(x, y, player) - Ground.super.init(self, "assets/sprites/groundFin") + Ground.super.init(self, "assets/sprites/ground_2") -- Collision properties self:setZIndex(ZIndex.ground) diff --git a/source/scripts/tankSprite.lua b/source/scripts/tankSprite.lua index 8f82d02..738992b 100644 --- a/source/scripts/tankSprite.lua +++ b/source/scripts/tankSprite.lua @@ -3,18 +3,11 @@ Tank = {} class("Tank").extends(Graphics.sprite) function Tank:init(x, y, ground) - self.tankImage = Graphics.image.new("assets/sprites/tank") - self.tankImageD = Graphics.image.new("assets/sprites/tankD") + local target = Targets[CurrentMission.targetIndex] + self.tankImage = Graphics.image.new(target.sprite) + self.tankImageD = Graphics.image.new(target.spriteD) Tank.super.init(self) - local width, height = self.tankImage:getSize() - - self.faded_image = Graphics.image.new(width, height, Graphics.kColorClear) - - Graphics.pushContext(self.faded_image) - self.tankImageD:drawBlurred(0, 0, 2, 2, Graphics.image.kDitherTypeFloydSteinberg) - Graphics.popContext() - -- Collision properties self:setZIndex(ZIndex.enemy) self:setTag(2) @@ -38,7 +31,7 @@ function Tank:fadein() end function Tank:fadeout() - self:setImage(self.faded_image) + self:setImage(self.tankImageD) end function Tank:update()