oma-tank/game/effects.lua
2026-04-18 11:35:06 +01:00

64 lines
1.9 KiB
Lua

local World = require("game.world")
local Palette = require("rendering.palette")
local Effects = {}
local CRACK_DURATION = 2.0
local CRACK_MIN_LINES = 8
local CRACK_MAX_LINES = 12
local crack = nil
local function buildCrack(cx, cy)
local lines = {}
local count = CRACK_MIN_LINES + math.floor(math.random() * (CRACK_MAX_LINES - CRACK_MIN_LINES + 1))
local maxLen = math.max(World.screenW, World.screenH)
for i = 1, count do
local angle = (i / count) * math.pi * 2 + (math.random() - 0.5) * 0.4
local len = maxLen * (0.6 + math.random() * 0.6)
-- Jagged shards: a few jittered segments from the impact point outward
local segments = {cx, cy}
local steps = 3
for s = 1, steps do
local frac = s / steps
local jitter = (math.random() - 0.5) * len * 0.12
local perpAngle = angle + math.pi / 2
local px = cx + math.cos(angle) * len * frac + math.cos(perpAngle) * jitter
local py = cy + math.sin(angle) * len * frac + math.sin(perpAngle) * jitter
table.insert(segments, px)
table.insert(segments, py)
end
table.insert(lines, segments)
end
return { lines = lines, age = 0 }
end
function Effects.triggerCrack(cx, cy)
cx = cx or World.screenW / 2
cy = cy or (World.radarH + World.viewH / 2)
crack = buildCrack(cx, cy)
end
function Effects.update(dt)
if crack then
crack.age = crack.age + dt
if crack.age >= CRACK_DURATION then crack = nil end
end
end
function Effects.draw()
if not crack then return end
local p = Palette.get()
local fade = 1 - (crack.age / CRACK_DURATION)
love.graphics.setColor(p.bright[1], p.bright[2], p.bright[3], fade)
love.graphics.setLineWidth(2)
for _, poly in ipairs(crack.lines) do
love.graphics.line(poly)
end
end
function Effects.clear()
crack = nil
end
return Effects