DarkRoast Help
DarkRoast is a game engine that uses Blender as its editor. You build the level in Blender, give objects behaviour with a few lines of Lua, and press Play. When it’s done, Package Game turns it into a standalone Windows game.
🚀 Getting startedInstall the engine and add-on, then make and play your first level in ten minutes.
🎨 The Blender add-onEvery button and setting in the BlendForge tab: physics, sound, particles, AI and world.
📜 Lua scriptingHow scripts work, the callbacks, and the complete API reference.
🍳 Script cookbookReady-made scripts: coins, doors, guards, timers, cutscenes, save games and more.
🎮 2D gamesOrthographic cameras, sprites and sprite sheets, pixel art and 2D physics: build a side-scroller.
🏎️ Cars & racingDrivable cars with suspension and gears, a chase camera, AI drivers, laps and positions.
🧩 Logic graphsVisual scripting: build gameplay from nodes in a Blender node editor, no code needed.
🌐 MultiplayerHost and join, replicated objects, players’ bodies, messages and shared state.
🧩 PluginsAdd Lua modules, scripts for every level, Logic graph nodes or native C/C++ code to your games.
📦 Shipping your gamePackage Game, multiple levels, and what to send your players.
🔧 Tips & troubleshootingDebug keys, command-line options, known limits and common fixes.
How it fits together
Blender + DarkRoast add-on —(.glb + components + Lua scripts + sounds)→ DarkRoast engine
objects, lights, materials, OpenGL 4.5 renderer, Jolt physics,
animation, scripts, Play Lua 5.4, navmesh AI, 3D audio
- Build your level in Blender as usual: meshes, materials, lights, animation.
- Tag objects in the BlendForge tab: is it a wall, a crate you can throw, a trigger, a sound source?
- Script the interesting parts with short Lua scripts attached to objects.
- Play to test. Press Play again (or keep Live Link on) to see changes instantly.
- Package it into a folder and zip anyone can run.
The five-minute version
Attach this script to a cube, set its Body to Trigger and tick Visible In Game. Duplicate it a few times and press Play — you have a coin-collecting game.
function on_update(self, dt)
self:rotate(0, 0, 90 * dt) -- spin 90 degrees per second
end
function on_trigger_enter(self, other)
if other.is_player then
game.score = (game.score or 0) + 1
ui.set("score", "Score " .. game.score)
self:destroy()
end
end
Ready? Start with Getting started.