ai-behavior-trees-util…
Build a production behavior-tree runtime (Blackboard, action/condition leaves, sequence/selector/parallel composites, decorators)…
Structure and debug a LÖVE (Love2D) game in Lua: the love.load/update/draw loop, delta-time movement, input, and screen states. Use when building a LÖVE 11.x game (main.lua, conf.lua, .love).
Claude Code
$ npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core --agent claude-code
Codex
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a codex -y
Cursor
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a cursor -y
Gemini CLI
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a gemini-cli -y
GitHub Copilot
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a github-copilot -y
OpenCode
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a opencode -y
Windsurf
$ npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill love2d-core -a windsurf -y
name: love2d-core description: > Structure and debug a LÖVE (Love2D) game in Lua: the love.load/update/draw loop, delta-time movement, input, and screen states. Use when building a LÖVE 11.x game (main.lua, conf.lua, .love).
Set up and debug the foundation of a LÖVE game in Lua: the callback loop, frame-rate- independent movement, input, and screen states. Targets **LÖVE 11.5**.
movement that runs at the wrong speed, input handling, or screen switching.
**When *not* to use:** Lua *language* questions unrelated to LÖVE; physics bodies/joints (LÖVE uses Box2D via `love.physics` — a separate concern); shader code (`love.graphics` GLSL is its own topic). For cross-engine save/load patterns, use `save-systems`.
1. **Confirm the entry points.** A LÖVE game runs `main.lua`; it should define `love.load()` (one-time setup), `love.update(dt)` (state), and `love.draw()` (rendering). Window/version setup goes in `conf.lua` (run *before* modules load). 2. **Pin the version.** Set `t.version = "11.5"` in `conf.lua` so LÖVE warns on mismatch. 3. **Drive all motion by `dt`** (delta time, in seconds) so speed is frame-rate independent. 4. **Handle input** two ways: polled (`love.keyboard.isDown` in `update`, for held keys) and event (`love.keypressed` callback, for discrete presses). 5. **Manage screens** (menu, game, pause) with a small state stack rather than a pile of `if` flags — see Patterns and `references/state-stack.md`. 6. **Run and observe.** Launch with `love .` from the project folder; verify the window, motion speed, and input on screen before assuming it works.
-- main.lua — LÖVE calls these callbacks for you. Colors are 0–1 in LÖVE 11.x.
function love.load()
-- One-time setup. speed is in PIXELS PER SECOND, not per frame.
player = { x = 100, y = 100, size = 40, speed = 220 }
love.graphics.setBackgroundColor(0.1, 0.1, 0.12)
end
function love.update(dt)
-- Polled input: good for continuous movement while a key is held.
if love.keyboard.isDown("right") then player.x = player.x + player.speed * dt end
if love.keyboard.isDown("left") then player.x = player.x - player.speed * dt end
if love.keyboard.isDown("down") then player.y = player.y + player.speed * dt end
if love.keyboard.isDown("up") then player.y = player.y - player.speed * dt end
end
function love.draw()
love.graphics.setColor(0.2, 0.8, 1.0) -- tint ON
love.graphics.rectangle("fill", player.x, player.y, player.size, player.size)
love.graphics.setColor(1, 1, 1) -- reset tint before text/images
love.graphics.print("Arrow keys to move, Esc to quit", 10, 10)
end
function love.keypressed(key)
-- Event input: fires once per physical press. Use for menus, jumps, toggles.
if key == "escape" then love.event.quit() end
end-- RIGHT: scaled by dt → same real-world speed at 30 or 240 FPS. player.x = player.x + player.speed * dt -- WRONG: "pixels per frame" → moves twice as fast at double the frame rate. player.x = player.x + player.speed
-- conf.lua — must be its own file; love.conf will NOT run from main.lua.
function love.conf(t)
t.version = "11.5" -- the LÖVE version this game targets (string "X.Y")
t.window.title = "My LÖVE Game"
t.window.width = 800
t.window.height = 600
t.window.vsync = 1 -- number since 11.0: 1 = on, 0 = off, -1 = adaptive
t.window.resizable = false
t.modules.physics = false -- disable modules you don't use to trim startup/memory
end-- LÖVE 11.x uses normalized floats. (Pre-11.0 code used 0–255 and will look wrong.) love.graphics.setColor(1, 0, 0) -- opaque red love.graphics.setColor(0.2, 0.8, 1.0, 0.5) -- translucent cyan (alpha 0.5) -- Need to convert old byte values? Use the helper instead of dividing by hand: love.graphics.setColor(love.math.colorFromBytes(128, 234, 255))
-- A screen is a table with optional :update(dt), :draw(), :keypressed(key).
-- Keep the active screen on a stack so pause/menu overlays are trivial to pop.
local Stack = require("state_stack") -- see references/state-stack.md for the module
-- Call a method on the top screen only if it defines it (a menu may have no update).
local function forward(name, ...)
local screen = Stack.current()
if screen and screen[name] then screen[name](screen, ...) end
end
function love.load() Stack.push(require("screens.menu")) end
function love.update(dt) forward("update", dt) end
function love.draw() forward("draw") end
function love.keypressed(key) forward("keypressed", key) endor animation must be scaled by `dt`.
which LÖVE runs *before* loading modules.
every channel above 1 draws at full intensity, so `setColor(128, 234, 255)` comes out plain white and an alpha of `128` is fully opaque. Use 0–1 floats or `love.math.colorFromBytes` (11.3+).
Reset with `love.graphics.setColor(1, 1, 1)` before drawing text/images you want untinted
<img src="docs/assets/awesome-gamedev-agent-skills-banner.png" width="820" alt="awesome-gamedev-agent-skills — game-dev skills for AI coding agents.
Build a production behavior-tree runtime (Blackboard, action/condition leaves, sequence/selector/parallel composites, decorators)…
Implement game audio practice — bus/mixer architecture and gain in decibels, ducking (sidechain), adaptive/dynamic music via…
Build game cameras that feel good — 2D follow with a deadzone, look-ahead, smoothing, and level-bounds clamping; 3D third-person…
Plan, generate, source, normalize, and validate cohesive visual game assets. Use for art direction, style bibles, sprites,…
Build branching dialogue and narrative — a node/choice graph with conditions, variables, and localization hooks — and choose…
Design NPC and enemy decision-making with finite state machines, behavior trees, steering behaviors, and A* pathfinding —…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.