It’s no surprise to people around me that I’m a big fan of System Shock 2. I talk about it quite a bit, perhaps more than I should. I even have a button that has the game’s antagonist, SHODAN, pinned on my jacket. And, for a while now, I wanted an excuse to create a level with its tools. Taking this on as a project, I had more of an opportunity to do that, while discovering some new things about the engine and rooting around some very old corners of the internet.
First, I was familiar with DromEd, the internal level editor Looking Glass Studios used on their previous Thief games. While this worked for SS2 level creation, the continuation of the editor, ShockEd, is much more tailored to SS2 specifically and is generally more stable (and still works with Windows 10, thank god). It also adds a number of hotkeys and chords that weren’t available in DromEd, making access to certain commands easier and quicker.
A screen shot of my level in ShockEd.
After re-familiarizing myself with the level editor, I decided to start digging around some old websites in order to see what else I could do in the editor, looking particularly for whether I could write custom scripts. The answer was yes, but as it turns out, it was a very complicated “yes”. Having found my way to a site called “The DromEdsday Book” (get it?), there were a few pages dedicated to explaining scripting, with one claiming that you could create them using Lua. However, this required the download of a file called “lgscript.osm”, and when I went to look at the example scripts on the site, they were also all .osm files. Clearly there was more to this than Lua.
After some quick searching, I found out that .osm stood for “Object Script Module”. As it turns out, this is how Looking Glass themselves added scripts to the Thief games and SS2, these files being nothing more than C++ compiled to a .dll and renamed. However, when I went to look into how to write my own, I started running into problems. Given that this is a pretty technical subject involving a 15+ year-old game where documentation was entirely fan-created, there wasn’t a lot to go on. And yet people were still able to write these scripts. How?
After Googling the right combination of words, I found the work of one Tom N. Harris via a link in a SourceForge conversation (yes, really). Turns out Harris is pretty adept at reading assembly, and managed to reverse-engineer some C++ wrapper files, which were available to download, to allow anyone to write an .osm. Included was a tutorial he wrote, detailing the functions that needed to be defined in order for the script to be loaded into the editor and run, which had to be exposed for the .dll to properly hook up.
The initialization function for a .osm Script Module, taken from Harris’s tutorial document.
After grabbing some updated files from Harris’s Github account, I started to realize that this internet sleuthing had taken up a lot of my time. I still had obligations to other classes and the other half of this project, making my own SS2 level, was still barely started. On top of that, the level I designed didn’t really have much of a reason for a custom script, so I figured it would look weird to write a custom script that didn’t really serve a useful function.
So in the end, I didn’t get any custom scripting in for this project, but I’m in a very good position now to start writing them in the future. In addition, I did learn a few new things about creating SS2 levels, though largely by opening the mission files that were actually used in the game and looking at what the developers did. I’m still really eager to continue my work on custom SS2 levels, and hopefully I can contribute back to the modding community in the future.