Open SubSpace

Open source · Rust · 0.1.x

SubSpace, written again from the wire up.

SubSpace is a top-down multiplayer space shooter from 1997. Ships drift; bullets and bombs carry your momentum with them; a map is 1024×1024 tiles of asteroid and wall, with flags to take and a team to take them from. When the publisher walked away, the players kept it running themselves — and they still are.

Open SubSpace is that game rebuilt in Rust so that it outlives the binaries it grew up in: a new client, a zone server that runs existing zones unchanged, and a shared core anyone can build on. Not an emulator and not a fork — every packet, file format and physics rule implemented fresh, and checked against the software that is still running.

oss-client flying in the bundled zone: two ships among green prizes, with the ship list, radar and energy bar on screen
oss-client in the zone that ships with oss-server, taken with --screenshot.
Language
Rust, 1.88 or newer
Simulation
100 Hz integer physics
On the wire
VIE and OpenSec, one port
Zones
ASSS directories, unchanged
Licence
MIT core, GPL client and server

01 Source

Three repositories, one game

The split is deliberate. The core is MIT so that anyone's bot, tool or alternative client can build on it whatever its licence; the client and server are GPL because they follow ASSS, whose GPL source may be ported into them.

oss-client

GPL-2.0-or-later

The game client. Cross-platform, runs at whatever resolution and refresh rate your display has, takes a gamepad, and needs no Continuum install to start. Plus oss-session and a headless bot.

oss-server

GPL-2.0-or-later

The zone server. Follows ASSS closely enough to take an existing zone directory and run it unchanged — same .conf files, maps, module names and ?commands — with VIE and OpenSec clients on one port.

oss-core

MIT

The shared half: packets, transport, map and settings formats, the physics simulation, a bot SDK and a conformance suite anyone can run against their own implementation.

02 Play

Clone two repositories and fly

The client uses the shared crates as a sibling checkout, so clone both and run it. You need a Rust toolchain (1.88 or newer).

Shell
git clone https://github.com/DangerMouseUK/oss-core
git clone https://github.com/DangerMouseUK/oss-client
cd oss-client
cargo run --release

That opens the login screen: zone, name, password, arena, ship. F3 is the zone browser, F5 the offline sandbox. The keys are Continuum's, so a returning player already has them in their hands, and F1 in the game lists them — yours, if you have changed any.

No zone to hand? Fly on your own:

Shell
cargo run --release -p oss-client -- --sandbox

Graphics and sounds come bundled, so it plays from a fresh clone. Already have Continuum? --continuum-dir uses your own instead. The client contacts no directory server you have not configured. Keys, chat, macros and replays →

oss-client spectating another ship in the bundled zone
Spectating another ship.
The zone browser listing live zones with population and ping
The zone browser (F3) listing live zones, after adding directory servers — the client ships with none.

03 Run a zone

One command, and you are a zone

With no arguments, oss-server runs its bundled zone — the ASSS 1.4.4 sample zone, compiled into the binary — on UDP port 5000. You are now a zone.

Shell
git clone https://github.com/DangerMouseUK/oss-core
git clone https://github.com/DangerMouseUK/oss-server
cd oss-server
cargo run --release

Already run a zone? Point it at your directory, unchanged:

Shell
# run an ASSS-style zone directory
oss-server --zone <dir>
# write the bundled zone out as a starting point
oss-server --init-zone <dir>
  • ASSS's config reader: #include, sections, per-arena overrides.
  • One process, structured logs, a JSON admin API and Prometheus metrics.
  • 43 modules in the tree; the ones ASSS has that this doesn't are named in conf/modules.conf.
  • oss-biller: a small SQLite-backed SSC billing server for private and test zones.
The bundled zone seen from oss-client, with eight players in arena scf
The bundled zone, running, with eight clients in it.

04 Build on it

A core with no game loop and no window

oss-core has no game loop and no window. It is what you reach for when you are writing a bot, a tool, a zone server or another client — in Rust directly, or in any language through the conformance suite's adapter protocol.

Bot SDK

A bot in about forty lines

The SDK handles the handshake, login, arena entry, map download and security challenge. Your code sees events — PlayerEntered, Chat, Kill — and replies.

Shell
cargo run -p oss-bot-sdk --example greeter -- \
    127.0.0.1:5000 GreeterBot password
Read greeter.rs →

Conformance

Check your own implementation

The conformance suite drives anything that speaks a line-based stdin/stdout protocol, in any language — and can stand in as a zone or a client to check live software.

Shell
cargo run --release -p oss-conformance -- vectors -- python3 my_adapter.py
cargo run --release -p oss-conformance -- server 127.0.0.1:5000
The adapter protocol →

The crates in oss-core

  • oss-protoPacket types and codecs
  • oss-netSans-IO transport: reliability, clustering, file transfer, VIE and OpenSec
  • oss-formats.lvl, eLVL, .lvz, .ossr replays
  • oss-simDeterministic 100 Hz integer physics, shared by client and server
  • oss-bot-sdkZone bots in a few lines
  • oss-conformanceVector, live-client and live-server checks

05 Evidence

Why you would trust it

The project's habit is that a claim names its evidence. These are the ones worth checking first.

3,761recorded conformance checks, captured from unmodified reference implementations
846arena settings checked bit-for-bit against ASSS's own settings packet
12fuzz targets — every packet, map, LVZ and replay decoder, and the transport
~12%of one core for 500 players over a whole map, against a 20% budget

Interoperability

It plays with software nobody here wrote

A stock oss-client joined a zone running subgame, the original server software, and flew. An unmodified, prebuilt MERVBot 4.6 completed a full session on oss-server. A genuine Continuum 0.40 client logged in and flew on oss-server.

What has connected, and what each run did not cover →

Simulation

Prediction and anti-cheat are the same code

oss-sim is a fixed-step integer simulation with no floating point, used by the client to predict and by the server to validate — so the two cannot drift apart into false positives.

Every setting it reads, and its source →

Protocol

Every protocol page states its evidence level

One page per packet, each marked Vectors, Sources, Partly inferred, Observed or Open. Where sources disagree the page says so rather than picking quietly.

The protocol docs →

Performance

Performance is measured — including where it falls short

500 players over a whole map fit the budget. In a crowded 500-player arena they cost about 27% of a core with VIE and 35% with OpenSec, and the budget does not close. That is written down rather than rounded away.

Method, machine and control runs →

06 Status

What works, and what does not

Working today

Client

  • Login and registration
  • Arena entry
  • Map/LVZ/news download with a cache
  • The full renderer and HUD
  • Flying and fighting with client-side prediction
  • Public, team, private, channel and squad chat with Continuum's prefixes
  • Macros
  • Spectating
  • Turrets
  • The zone browser
  • Replays
  • Gamepads
  • Colour-blind and high-contrast palettes
  • An offline sandbox

Server

  • Arenas
  • Freq manager
  • Ships and weapons with plausibility checks
  • Kills and scoring
  • Flags
  • Balls and soccer
  • KOTH
  • Bricks
  • Prizes and ?buy
  • Chat and chatnet
  • Capability groups
  • Bans
  • Persistence
  • Directory registration
  • SSC billing
  • Hot reload
  • Module load/unload
  • Admin API and metrics

Not here, on purpose

Continuum's own encryption. Its key expansion is not public and these repositories do not carry it. A build from source cannot join zones that require Continuum's encryption; zones that accept VIE — including ASSS and the original server — and OpenSec zones are reachable. The security path is a trait, so a build that supplies its own cipher needs nothing here to change.

Not done yet

  • Packaging. No installer, release binary, container image or crates.io publication — building from source is the only way in.
  • A browser build. The renderer is kept WebGPU-compatible and the core crates build for WebAssembly, but the client is not built or tested there.
  • A crowd. It has been played against the original server software and its own — not yet by a hundred people at once.

07 Contribute

Bring a difference you can show

Issues and pull requests are welcome. The most useful thing you can bring is a difference from the original you can demonstrate — a setting that behaves differently, a packet that is mishandled, a frame that does not look right next to Continuum — with the evidence behind it.