CLI tool
Interrupt/systemshock avatar
Interrupt/systemshock

Shockolate: a cross-platform System Shock source port built on SDL2 and OpenGL

Shockolate - A minimalist and cross platform System Shock source port.

908 stars80 forksCGPL-3.0

At a glance

What is it?
Shockolate is a C source port of System Shock built from the PowerPC code Night Dive Studios released, using SDL2 and targeting Linux and Windows. It aims to be the Chocolate Doom of System Shock: a faithful, portable experience with an OpenGL renderer and mod support, and the README is candid that some features remain missing because the released source never contained them.
Who is it for?
Shockolate suits a player who wants System Shock running natively on Linux or Windows with an OpenGL renderer and fan mission loading, and who is prepared to supply their own game data. It does not suit someone who expects a complete, feature-complete port, since the README states that some features need reviving because they were not in the released source, and the tagged releases stop in 2020 even though commits continue.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The starting point is a PowerPC dump, not a fresh implementation

Shockolate is a cross-platform source port of System Shock, using SDL2, based on the source code for PowerPC released by Night Dive Studios, Incorporated. That provenance explains both the strengths and the gaps in the project. What you get is a working game that was never re-implemented from a specification, so the physics, the level logic and the original behaviour are the original behaviour rather than a reconstruction of it. The gaps come from the same place. The README states that the port runs well on Linux and Windows right now, with some missing features that need reviving due to not being included in the source code that was released. So when a feature is absent, it is usually absent because the code was never available to port, not because nobody got round to it. That distinction matters for judging whether a missing feature is a bug report or an impossible request.

The stated goal is the Chocolate Doom model, which sets the acceptance criteria

The README gives the project its own benchmark in one sentence: the end goal is something like what Chocolate Doom is for Doom, an experience that closely mimics the original, but portable and with some quality-of-life improvements, including an OpenGL renderer and mod support. That is a precise and useful target. It means fidelity to the original is the priority, and the improvements are additive rather than a redesign, which is the opposite of how a modern port is usually scoped. It also means the OpenGL renderer and the mod support are the two named departures from the original experience, and those are the features to judge the port by. A reader who wants a remake with modern graphics will find the fidelity goal constraining, while a reader who wants the game they remember, on a modern OS, at a modern resolution, is exactly the audience the project is aiming at. Development is followed on Discord.

Running it needs the original data, and the floppy disk version will not work

This is the practical constraint that trips up newcomers. The game requires its assets: original CD-ROM or SS:EE assets in a res/data folder next to the executable. The README also warns that floppy disk assets are an older version that cannot currently be loaded. So this is a source port in the strict sense, not a re-release: it ships code, and you supply the game data you already own. The optional piece is the music sound font. You can add a .sf2 sound font file in the res folder for playback, and the README links a file it describes as close to the Windows default that everyone knows, while being careful to note that it is a file of unknown provenance. The executable itself is started with a single command:

bash
./systemshock

Two command line parameters are documented. The -nosplash flag disables the splash screens so the game starts straight to the main menu, and -data-dir points the game at an alternate data directory, which must still be called res.

Fan missions load from a folder or from a pair of files

Modding support is present, though narrower than the word suggests. Shockolate supports loading mods and full on fan missions, and you point the executable at a mod file or folder and the game loads it. So far, mod loading supports additional .res and .dat files for resources and missions respectively. Running a fan mission from a folder is one argument:

bash
./systemshock /Path/To/My/Mission

and running one from specific files names them directly:

bash
./systemshock my-archive.dat my-strings.res

The two-file form is the interesting one, because it shows that a mission is treated as a pair of a data archive and a string table, which is the structure the original game used. The limitation to note is that the format support is limited to those two file types. A fan mission that needs new code, a new renderer path or a new sound engine cannot be expressed through this mechanism, so the mod scene here is about content rather than about extending the game.

WASD and F replace the original movement, and three hotkeys cover display modes

Control modifications are the one place where the port deliberately departs from the original, and the README explains the reasoning. Shockolate replaces the original game's movement with WASD controls and uses F as the mouselook toggle hotkey, which differs from the Enhanced Edition's use of E, and the stated reason is that it keeps Q and E available for leaning. Since leaning is a mechanic the original had and this keeps, the port has made a deliberate trade of one keybinding convention for another mechanic's accessibility. Three additional hotkeys are documented. Ctrl+G cycles between graphics rendering modes, which is the practical way to move between the OpenGL renderer and any fallback, Ctrl+F enables full screen mode and Ctrl+D disables it. There is no separate mouse-look config file mentioned in the README, so the key mapping is fixed rather than user-configurable, which is a limitation for anyone with a different keyboard layout or a strong preference.

The build supports CMake and Zig, and the tagged releases stopped years ago

For building from source, the README points at COMPILING.md in the repository. The tree shows what the build looks like: a CMakeLists.txt at the root, a cmake directory, a build.zig file, an externals directory for third-party code, a shaders directory for the OpenGL side, and src for the port itself. A .clang-format file is present, which tells you the project is formatted with clang-format. The two build systems in the tree mean you are not forced into one toolchain, and the release tags hint at how the CI was structured: v0.8.0 was a testing 64 bit CI building from 2019-12-31, v0.8.1 was testing SDL changes, and v0.8.2 was testing Travis CI builds, all from January 2020. Those tag names are a useful warning. The published release history is a set of CI experiments rather than a sequence of playable milestones, so if you are evaluating the port, the current state of the master branch and the downloadable packages page matter more than the version numbers.

Licensing is GPL-3.0, and the data situation is separate from the code

The licence field for the repository is GPL-3.0, and the tree carries both COPYING.txt and a LICENSE file. That governs the port code. The game data is a separate matter and the README keeps them separate in practice: you are expected to supply your own original CD-ROM or SS:EE assets, which is how source ports normally handle assets they do not own. For anyone considering a redistribution or a packaged build, the practical point is that the GPL-3.0 terms apply to the port and the underlying game assets carry their own terms, so the two cannot simply be bundled together as one thing. The sound font is called out as optional precisely because it is a separate file with its own provenance question, and the README flags that the well-known candidate is of unknown provenance. Neither of these is legal advice; the practical advice is to keep the data out of your distribution and to read the licence text before packaging anything.

Where this port is the wrong choice

The first case is a player with no copy of the game. There is no bundled data and the floppy disk asset set will not load, so without an original CD-ROM or SS:EE assets there is nothing to run. The second is a player who wants modern graphics. The OpenGL renderer is listed as a quality-of-life improvement over the original rather than a rework, and the project goal is explicitly to closely mimic the original, so a remake with new art and lighting is not what this is. The third is anyone who wants modding in the broader sense, since the loader only handles .res and .dat files and cannot extend the engine. The fourth is a Linux distribution packager looking for a stable release. There are no recent tagged releases, the last one being v0.8.2 from 2020, so packaging from master means packaging unreleased work, and the repository carries a .github directory and a CMake configuration that suggest the CI story has changed since the Travis era.

Editorial conclusion

Shockolate suits a player who wants System Shock running natively on Linux or Windows with an OpenGL renderer and fan mission loading, and who is prepared to supply their own game data. It does not suit someone who expects a complete, feature-complete port, since the README states that some features need reviving because they were not in the released source, and the tagged releases stop in 2020 even though commits continue. Before you try it, confirm you have the original CD-ROM or SS:EE assets rather than the floppy disk version, read COMPILING.md before building from source, and check the current state of the releases page, because the latest tagged build is v0.8.2 from January 2020 and the project now also builds with Zig.

Frequently asked questions

What game data does Shockolate need to run?

Original CD-ROM or SS:EE assets in a res/data folder next to the executable. The README warns that floppy disk assets are an older version that cannot currently be loaded. A .sf2 sound font in the res folder is optional.

Does Shockolate support fan missions and mods?

Yes, it supports loading mods and full on fan missions by pointing the executable at a mod file or folder. So far mod loading supports additional .res and .dat files for resources and missions respectively.

What controls does Shockolate use and what changed from the original?

Shockolate replaces the original game's movement with WASD controls and uses F as the mouselook toggle hotkey, which differs from the Enhanced Edition's E and keeps Q and E available for leaning. Ctrl+G cycles graphics rendering modes, Ctrl+F enables full screen and Ctrl+D disables it.

How do I build Shockolate from source?

The README points at COMPILING.md in the repository for the details. The tree includes a CMakeLists.txt with a cmake directory, a build.zig file for the Zig toolchain, an externals directory for third-party code, and a shaders directory for the OpenGL renderer.

Official sources

  1. Interrupt/systemshock on GitHub
  2. Issues
  3. License: GPL-3.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/interrupt-systemshock.svg)](https://hysenlabs.com/projects/interrupt-systemshock)

Was this useful?