oma-command/game/abm.lua
nosignal 64ce7f0fcb Initial public release
OMA-COMMAND — Missile Command arcade clone in Love2D with Omarchy theme integration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 18:32:07 +01:00

87 lines
2.2 KiB
Lua

local World = require("game.world")
local Palette = require("rendering.palette")
local Explosions = require("game.explosions")
local Crosshair = require("game.crosshair")
local ABM = {}
local missiles = {}
local MAX_IN_FLIGHT = 8
function ABM.fire(startX, startY, targetX, targetY, speed)
if #missiles >= MAX_IN_FLIGHT then return false end
local dx = targetX - startX
local dy = targetY - startY
local dist = math.sqrt(dx * dx + dy * dy)
if dist < 1 then return false end
table.insert(missiles, {
startX = startX,
startY = startY,
targetX = targetX,
targetY = targetY,
x = startX,
y = startY,
speed = speed,
dirX = dx / dist,
dirY = dy / dist,
totalDist = dist,
birth = love.timer.getTime(),
})
Crosshair.addTarget(targetX, targetY)
return true
end
function ABM.update(dt)
for i = #missiles, 1, -1 do
local m = missiles[i]
local step = m.speed * dt
m.x = m.x + m.dirX * step
m.y = m.y + m.dirY * step
local dx = m.x - m.startX
local dy = m.y - m.startY
local traveled = math.sqrt(dx * dx + dy * dy)
if traveled >= m.totalDist then
m.x = m.targetX
m.y = m.targetY
Explosions.add(m.targetX, m.targetY)
Crosshair.removeTarget(m.targetX, m.targetY)
table.remove(missiles, i)
end
end
end
function ABM.count()
return #missiles
end
function ABM.clear()
missiles = {}
end
function ABM.draw()
local p = Palette.get(World.wave)
local lw = 1 / World.scale
for _, m in ipairs(missiles) do
-- Glow trail
love.graphics.setColor(p.abm[1], p.abm[2], p.abm[3], 0.2)
love.graphics.setLineWidth(lw * 4)
love.graphics.line(m.startX, m.startY, m.x, m.y)
-- Main vector trail
love.graphics.setColor(p.abm[1], p.abm[2], p.abm[3], 0.9)
love.graphics.setLineWidth(lw * 1.5)
love.graphics.line(m.startX, m.startY, m.x, m.y)
-- Bright head dot
love.graphics.setColor(p.bright)
love.graphics.circle("line", m.x, m.y, 1, 8)
end
end
return ABM