The Offender Engine
Our games run on our own engine: a modern, cross-platform 2D + 3D engine with its own scripting language, its own shader language and its own tools. One codebase, native renderers, the same game everywhere.
A modern render interface over Direct3D 12, Vulkan and Metal, with a multithreaded renderer: the same game, the same saves, on every platform.
// An Offender game is just a handful of hooks.
func main() -> Int { /* load assets */ }
func tick(dt: Float) -> Int { // per-frame logic }
func handleEvent(e: AGD_Event) -> Int { ... }
func render() -> Int {
canvasBegin()
spriteDraw(hero, x, y)
canvasEnd()
return 0
}
// Typed structs, no boilerplate.
struct Enemy {
var x: Float = 0.0
var hp: Int = 3
var alive: Bool = true
}
// Load + animate a sprite โ same call on every platform.
let sheet: SpriteSheetHandle = spriteSheetLoad("hero.spr")
let hero: SpriteHandle = spriteCreate(sheet)
spritePlay(hero, "run")
Modern graphics
Direct3D 12 and Vulkan on Windows, picked automatically, with 4x MSAA by default and the frame recorded on its own thread.
Physically based shading
GGX materials with normal, metal, roughness, AO and emissive maps, image-based light from the sky, and a linear HDR pipeline. Opt in per level.
Shadows, three ways
Filtered shadow maps with quality tiers, crisp stencil shadow volumes, or baked: pick per level. Moving and skinned objects always cast in real time.
Baked lighting on the GPU
Lightmaps with soft sun shadows, bounce light and AO, plus light probes for characters and props, baked by our own GPU baker in seconds.
Post-processing
Bloom, auto exposure, ACES / AgX tonemapping, SSAO, contact shadows, FXAA, colour-grading LUTs and vignette, set per level.
Volumetric fog
Light shafts and fog volumes that the sun, lights and shadows shine through.
CSL shaders
Our own shader language: write a shader once and it compiles for every backend. Games can bring their own, cached after the first run.
Compressed everything
Textures block-compressed with mipmaps at build time, assets in compressed packs, and integrity-checked bytecode.
Multithreaded renderer
The next frame is recorded on its own thread while the last one draws, and shaders compile in parallel and are cached, so levels load fast.
Everything a game needs
OffenderScript (OES)
Gameplay in a clean, statically-typed language that compiles to compact bytecode, with a JIT on x64 and arm64.
A real debugger
Breakpoints, conditions, stepping, call stacks, locals and watches inside the running game, built into every engine.
2D, batteries included
Sprites & animation, animated tilemaps, a UI library, GPU particles, video playback and SQLite saves, built in.
3D levels from TrenchBroom
Build in TrenchBroom, compile to a single level file with navigation, lighting and collision, and play. Terrain, props and skeletal animation included.
Audio
A 48 kHz software mixer with overlapping voices, click-free fades and a limiter, so loud moments never distort.
Input & Steam Deck
Keyboard, mouse and gamepads on every platform, with Steam Deck controls through Steam Input.
Steam & networking
Steam achievements, stats and relay networking, LAN discovery and HTTPS as native modules a game turns on when it needs them.
OEGM, the editor
Our IDE: projects, the script editor, the game running inside it, the debugger, a sprite editor, shaders, level builds and Steam packaging.