The Technology

The Offender Engine

Our cabinets run on our own engine — a lightweight, cross-platform engine scripted in OffenderScript. Built for fast 2D, it also does 3D: BSP-based levels with a first-person camera and PhysX collision & physics. One codebase, native backends, the same game everywhere.

WindowsDirect3D 11 macOSMetal iOSMetal AndroidOpenGL ES

+ Direct3D 12 and Vulkan backends coming soon.

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")
🌍

Write once, ship native

Direct3D 11 on Windows, Metal on macOS & iOS, OpenGL ES on Android — one codebase, no per-platform gameplay code.

OffenderScript (OES)

Gameplay in a clean, statically-typed language. Compiles to compact bytecode with an arm64 JIT for near-native speed.

🧩

2D, batteries included

Sprites & animation, animated tilemaps, an entity runtime with AABB collision, particle effects, audio, and SQLite saves — built in.

🧊

3D, BSP & PhysX

Not just 2D — render BSP-based 3D levels with a first-person camera and full PhysX collision & physics when a project calls for it.

🔁

Instant iteration

Edit a script, recompile in milliseconds, relaunch. Tune gameplay without ever rebuilding the engine.

📦

Tiny footprint

A built game is a few-megabyte bytecode file plus assets — fast to load and easy to ship anywhere.

🛠️

Real tooling

OffenderEdit, our visual editor, plus a compiler & validator, a cutscene director, and a sprite pipeline — the tools we build our own games with.