Lab // LÖVE 11.5

Lua, run from the metal of the game loop.

LÖVE is the prototyping bench — built directly against the callback surface, no wrapping engine, no entity component DSL. Productized work runs in Unity (Passages) and explorations sit in Rust/Bevy and SDL2/C++ below.

love.update(dt)
fixed step
love.draw()
canvas batched
love.physics
box2d body sim
Active & Past Builds unity // c // rust+bevy // sdl2
resource
vitality/essence
dual-pool combat
in_development
pending_captures
[0x01]_PASSAGES

LitRPG-inspired third-person action RPG

Combat blends FF12's Gambit system with the rule-driven party logic of .hack//GU. A dual-resource system (Vitality / Essence) governs both health and casting. The Attunement Scripts editor lets the player wire per-companion behavior trees. Abilities authored as ScriptableObjects so designers iterate without recompiling.

Unity C# gambit AI ScriptableObject dual-resource
[0x02]_BSP_RENDERER + 3D_SHOOTER

From-scratch BSP rendering + Unity shooter prototype

A BSP renderer written from scratch in C as a graphics deep-dive — tree construction, polygon splitting, painter's-order traversal. Separately, a 3D shooter prototype in Unity to feel the C# tooling end of the same pipeline. Both research artifacts, not productized.

C Unity BSP renderer research
research
pong → breakout
top-down shooter
bevy
in_progress
[0x03]_BEVY + SDL2 TRACK

Sequential learning ladder — SDL2 first, Bevy after

Sequential ladder, not a single project. SDL2/C++ for the fundamentals (Pong, then Breakout, then a top-down shooter), then graduate the same exercises into Rust + Bevy to feel ECS-first authoring against the same problems. Active track.

Rust Bevy SDL2 C++ ECS
love2d_loop.lua
function love.load()
    world = love.physics.newWorld(0, 9.81*64)
    player = entities.spawn("player", 100, 100)
end

function love.update(dt)
    accumulator = accumulator + dt
    while accumulator >= STEP do
        world:update(STEP)
        input.poll()
        ai.tick(STEP)
        accumulator = accumulator - STEP
    end
end

function love.draw()
    camera:attach()
    tilemap:draw()
    entities:draw()
    camera:detach()
    hud:draw()
end
Subsystem coverage
  • love.graphicscanvases, batches, shaders
  • love.physicsbox2d bodies, joints
  • love.audiopositional sources
  • love.keyboardedge + held detection
  • conf.luawindow + module flags