The Technology

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.

WindowsDirect3D 12 ยท Vulkan macOSMetal iOSMetal Linux & SteamOSOpenGL ES AndroidOpenGL ES

A modern render interface over Direct3D 12, Vulkan and Metal, with a multithreaded renderer: the same game, the same saves, on every platform.

game.aqs
// 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
}
player.aqs
// 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")
Rendering

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.

The Engine

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.