OpenBOR logo
Game EngineFree & Open SourceWindows / Linux / macOS

OpenBOR Setup Guide

The definitive guide to running OpenBOR beat-em-up PAK modules on your arcade cabinet. Covers PAK version management, joystick input, LaunchBox integration, and advanced engine migration protocols.

Type
Game Engine
Platform
Beat-em-ups
BIOS Required
No
ROM Format
.pak files
Input
SDL2 / XInput
Frontend
LaunchBox / BigBox

Overview

OpenBOR (Open Beats of Rage) is one of the most misunderstood tools in the arcade emulation space. It is not a console emulator — it is an open-source beat-em-up game engine that interprets fan-made PAK modules at runtime. This distinction is critical for understanding how to manage, configure, and troubleshoot it on an arcade cabinet.

Originally derived from the Beats of Rage engine created by Senile Team in 2003, OpenBOR has grown into a full-featured 2D action game platform. The community has produced hundreds of PAK modules recreating and extending classic arcade brawler franchises — Final Fight, Streets of Rage, Double Dragon, Cadillacs and Dinosaurs, The Punisher, TMNT, and many more.

If You Only Remember One Thing

Every OpenBOR PAK is coupled to a specific engine build. The most recent executable is not automatically the most stable for any given game. Always identify the correct build for each PAK before running it.

Engine vs. Emulator

Understanding OpenBOR's architecture is the foundation of every configuration and troubleshooting decision you will make.

Traditional Console Emulator

  • • Translates a static ROM image into host CPU instructions
  • • Hardware translation layer — mimics real silicon
  • • ROM is a fixed binary dump of original hardware
  • • Compatibility is measured against original hardware behavior

OpenBOR Game Engine

  • • Interprets human-readable text files and scripts at runtime
  • • Software-driven engine — no hardware to mimic
  • • PAK is a collection of assets + scripts defining the game world
  • • Compatibility is measured against the specific engine build used during development

The Anatomy of a PAK File

An OpenBOR "game" is a project module called a PAK (or mod). A PAK is a compressed archive containing:

Data/Uncompressed assets folder (overrides .pak if present)
levels/Stage definitions and entity placement scripts
models/Character and enemy sprite sheets + animation data
sounds/SFX and music files
scripts/C-derivative scripting files (.c extension)
video/Cutscene and intro video files

PAK Version Sensitivity in Action — TMNT: Rescue-Palooza!

This heavily scripted PAK requires specific 3.0-era builds (like Build 4153) and exhibits severe sound and glitch issues on newer builds like 6412 — a perfect illustration of engine-PAK coupling.

Step 1: Core Setup

1.1 Downloading OpenBOR

OpenBOR is hosted on GitHub and distributed as pre-compiled builds. The key decision is which build to download — not just the latest.

Build EraRepresentative BuildBest For
Legacy 3.0Build 4153Heavily scripted classic PAKs (TMNT: Rescue-Palooza, older Final Fight mods)
TransitionalBuild 6391SDL 2.0 backend, most community PAKs from 2015–2020
Modern 4.0+Build 7530+New PAKs built on the object-centric scripting model

1.2 Directory Structure

OpenBOR is entirely self-contained. The recommended structure for an arcade cabinet with multiple PAKs:

# Recommended multi-instance structure
OpenBOR/
├── Build4153/
├── OpenBOR.exe
├── Paks/ # PAKs for this build only
└── Saves/
├── Build6391/
├── OpenBOR.exe
└── Paks/
└── Build7530/
├── OpenBOR.exe
└── Paks/

⚠️ Data Folder Override

If both an uncompressed Data/ folder and a .pak file exist in the root directory, OpenBOR prioritizes the Data/ folder. This is useful for testing modifications without repacking.

1.3 Controller Configuration

OpenBOR reads input through SDL2 on modern builds. For arcade cabinets, configure controls from within the engine's built-in menu.

1
Launch OpenBOR.exe— The engine will display the PAK selection screen
2
Navigate to Options → Controls— Use keyboard arrow keys on first launch
3
Map each action to your arcade buttons— Attack, Jump, Special, Start, Select, Up, Down, Left, Right
4
Save and exit— Config is saved to Saves/[gamename]/default.cfg

Step 2: PAK Management

Managing an OpenBOR library is fundamentally different from managing a ROM collection. Each PAK is a self-contained project with its own engine version dependency. Treating PAKs like ROMs — dropping them all into one folder and expecting a single executable to handle them — is the most common mistake in OpenBOR cabinet setups.

2.1 Version Sensitivity — The Core Problem

A command or script that functions perfectly in Build 3016 may cause a catastrophic failure in Build 4.0 because the underlying C logic has been refactored. This is not a bug — it is an intentional consequence of engine evolution.

Build 4153
Migration Risk: Low
Legacy 3.0 era. Most stable for pre-2015 PAKs. SDL 1.2 backend.
Build 6391
Migration Risk: Medium
SDL 2.0 transition. Validates script interpreter. Most 2015–2020 community PAKs.
Build 7530+
Migration Risk: High (for legacy)
Object-centric model. Modern PAKs only. Requires re-verification of all global variables.

2.2 Identifying the Correct Build for a PAK

Most PAK authors document the required build in their release notes or readme file. If no documentation exists:

  1. Check the PAK's release thread on ChronoCrash.com for the original post date — this narrows the build era
  2. Try Build 6391 first — it covers the largest range of community PAKs
  3. If audio glitches or crashes occur, step down to Build 4153
  4. If the PAK uses object-centric scripting features, step up to Build 7530+

Heavy OpenBOR Modifications in Action — Night Slashers X

Night Slashers X demonstrates the level of customization possible with OpenBOR's scripting system — entirely new mechanics built on top of the engine's base framework.

Step 3: Frontend Integration

Integrating OpenBOR into LaunchBox or BigBox requires a different approach than standard emulators because each PAK is its own runtime environment. The recommended method is a wrapper batch script that handles PAK routing automatically.

3.1 The LaunchBox Wrapper Method

Create a batch script for each OpenBOR build instance. LaunchBox calls the script with the PAK file path as an argument. The script copies the PAK to the correct instance's Paks/ folder and launches the engine.

@echo off
REM OpenBOR Build 6391 Wrapper
set OPENBOR_DIR=C:\Emulators\OpenBOR\Build6391
set PAK_SOURCE=%1
REM Clear existing PAKs
del /Q "%OPENBOR_DIR%\Paks\*.*"
REM Copy target PAK
copy "%PAK_SOURCE%" "%OPENBOR_DIR%\Paks\"
REM Launch engine
start "" "%OPENBOR_DIR%\OpenBOR.exe"

In LaunchBox, set the "Emulator" to this batch script. The PAK file becomes the "ROM" that LaunchBox passes as %1.

3.2 Unified Controller Config (Master Config Method)

Because each PAK stores its controller config in its own save directory, a new PAK will always require re-mapping controls. The solution is a master config copy step in your wrapper script.

REM Add to wrapper script after PAK copy
set GAME_NAME=%~n1
set SAVE_DIR=%OPENBOR_DIR%\Saves\%GAME_NAME%
if not exist "%SAVE_DIR%" mkdir "%SAVE_DIR%"
copy "%OPENBOR_DIR%\master.cfg" "%SAVE_DIR%\default.cfg"

Configure your arcade controls once in master.cfg, then the script automatically applies it to every new PAK's save directory on first launch.

Advanced Scripting

OpenBOR supports a C-derivative scripting interpreter that allows PAK creators to override nearly every engine limitation. For cabinet builders, understanding the scripting architecture is essential for diagnosing crashes and performance issues.

⚠️ The 200Hz Logic Loop

OpenBOR's engine update rate is fixed at approximately 200 frames per second. Any logic placed in an updated.c script function executes 200 times per second.

A NULL pointer error or unoptimized nested loop in updated.c triggers 200 times per second → hard crash or severe frame drops.

Input Priority Hierarchy

OpenBOR processes input through a strict, hard-coded hierarchy. External tools must operate as signal normalizers only — never inject logic states directly.

  1. inputall script — runs before engine key handling
  2. Level keyscript — stage-specific input logic
  3. Entity keyscript — character-specific input logic
  4. Global scripts — general input monitoring
  5. Default engine action — native response

Migration Protocols

Upgrading an OpenBOR PAK from a legacy engine to a modern version is a high-risk operation. Never attempt a direct jump from a legacy build to 4.0. Use the Pit Stop Migration Method.

The Pit Stop Migration Method

Stop 1
Build 4153

Console parity check for legacy logic. Verify all scripts run without errors on the 3.0-era foundation.

Stop 2
Build 6391

Validates the script interpreter and SDL 2.0 backend. Catch input and audio regressions here.

Stop 3
Build 7530+

Modern object-centric migration. Re-verify all saved global variables and physics behavior.

Zombie Variables

OpenBOR 4.0 introduced strict type separation. A Zombie Variable occurs when a saved game loads a value as a String that the new engine expects to be an Integer.

// Headless Boot type check
if(typeof(myVar) != VT_INTEGER) {
log("ZOMBIE: myVar is not integer");
}

Ebox Misalignment

Between Build 6391 and 4.0, gravity handling changed from integer checks to bitwise flags. If the legacy translation layer fails, entities may fail to bounce, completely breaking hit detection.

Use the engine's native visual debugger to verify Attack Box (Red) and Body Box (Blue) positions. Enable PROPERTY_ACCESS_DUMP to serialize entity coordinates to OpenBorLog.txt.

OpenBOR Native Collision and Range Debug Tools

How to access OpenBOR's native visual debugger to verify entity box positions — essential for diagnosing Ebox misalignment after engine migrations.

Top OpenBOR Titles

The OpenBOR community has produced hundreds of PAK modules. These are among the most polished and well-regarded titles for arcade cabinet use.

TitleBased OnRecommended BuildNotes
TMNT: Rescue-Palooza!Teenage Mutant Ninja TurtlesBuild 4153Requires legacy 3.0 build. Severe glitches on 6412+.
Night Slashers XNight Slashers (Data East)Build 6391Heavily modified with custom mechanics.
Streets of Rage RemakeStreets of Rage seriesBuild 6391Community classic. Extensive character roster.
Final Fight: Double ImpactFinal Fight (Capcom)Build 6391Faithful recreation with expanded content.
Double Dragon AdvanceDouble DragonBuild 7530+Uses modern scripting features.
The Punisher: No MercyThe Punisher (Capcom)Build 6391Marvel characters, arcade-faithful gameplay.
Cadillacs & Dinosaurs XCadillacs and DinosaursBuild 6391Expanded roster, additional stages.
Golden Axe: The Duel RebornGolden Axe (Sega)Build 7530+Object-centric scripting. Modern build required.

Troubleshooting

Game crashes immediately on launch

Cause

Wrong engine build for the PAK

Fix

Identify the PAK's required build era from its release notes. Try Build 4153 for pre-2015 PAKs, Build 6391 for 2015–2020 PAKs, Build 7530+ for modern PAKs.

Audio glitches, missing sounds, or wrong music

Cause

SDL audio backend mismatch between build eras

Fix

Build 4153 uses SDL 1.2 audio. Build 6391+ uses SDL 2.0. A PAK developed on SDL 1.2 may have audio issues on SDL 2.0 builds. Step down to Build 4153.

Controls not working after adding a new PAK

Cause

New PAK has no controller config in its save directory

Fix

Copy your master.cfg to the new PAK's Saves/[gamename]/ directory, or add the master config copy step to your LaunchBox wrapper script.

Hit detection broken — attacks pass through enemies

Cause

Ebox misalignment from engine migration

Fix

Enable the native visual debugger to verify Attack Box (Red) and Body Box (Blue) positions. Use PROPERTY_ACCESS_DUMP to log entity coordinates to OpenBorLog.txt.

Severe frame drops or hard freeze during gameplay

Cause

Unoptimized updated.c script executing at 200Hz

Fix

Check the PAK's updated.c script for NULL pointer dereferences or nested loops. Any error in this function triggers 200 times per second.

Input soft-locks — game stops responding to controls

Cause

External tool bypassing OpenBOR's input hierarchy

Fix

Ensure any input abstraction layer operates as a signal normalizer only. Never inject logic states directly into OpenBOR's input buffer — this breaks keyscript processing.