Please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Notes:System Shock

From The Cutting Room Floor
Jump to: navigation, search
This page contains notes for the game System Shock.

This notes page will briefly detail how to use a RAM editor to change item types, for playing around with the unused objects and stuff. I use Cheat Engine to do this, but any memory editor with a search feature should get the job done.

Quick how-to:

  • Run the game.
  • Open the game's process in Cheat Engine by selecting sshock.exe, cdshock.exe, dosbox.exe, etc. in the Process menu.
  • Click the "Memory view" button.
  • Start a new game (any difficulty)
  • In the memory view, search for this string of bytes: 01 04 00 02 00. These are the first five bytes of a specific entry in the "master object table"; in this case, it corresponds to the Medipatch right by your starting location on level 1. Each entry in the master object table has this format:
0000    int8    in-use flag. 0 slot is free, 1 in use.
0001    int8    object class
0002    int8    object subclass
0003    int16   class index. This is an index into the class specific table in
                 one of the following chunks.
0005    int16   index into object cross-reference table (next chunk)
0007    int16   prev link
0009    int16   next link
000B    int16   x coord (high byte is tile x)
000D    int16   y coord (high byte is tile y)
000F    int8    z coord (?)
0010    int8    \
0011    int8     } These seem to be the 3 angles for 3d positioning
0012    int8    /
0013    int8    ?? AI index - is 0xFF for all but damageable things (critters
                 and crates)
0014    int8    object type
0015    int16   Hitpoints? Initial values tend to be round decimal numbers
0017    int8    State (sprite frame)

The "class", "subclass", and "type" fields determine what the object actually is. By changing these to other values, it will instantly take the form of something else. The "class index" field has varying uses depending on what the specific object is. For example, for switches, this value is an index into a table telling the game what the switch does; for elevator panels, the table describes which floors the elevator can access; for hardware and software, it describes the version of that specific copy, and so on. Feel free to experiment with this value as well.

More information about the object and class tables can be found in the Unofficial System Shock Specs (also the source of the above table).

For some items (including most of the unused ones), you will have to save and re-load the game to load the correct graphics, unless it is an item type that already appears in the level you're on. When saving, you may get the message "Objsys error, save anyway?" This more or less means that something in the game changed in a way that the game wasn't expecting. Ignore it and save anyway; this shouldn't have any ill effects when simply editing objects.

If you want to experiment with different objects in the level, you can attempt to search for their master object table entries using their class and subclass as a starting point. For example, search for the bytes 01 00 03 in the same general area of memory as you found the Medipatch from before, and you should eventually stumble on the lead pipe in the medical storage closet (you can make sure by changing the class or subclass; if the object changes into something else or seems to vanish, you've found it.)

Some tools of interest:

  • SS1Edit - Edits OBJPROP.DAT and other stuff, handy for seeing all the different object classes/types in the game, as well as editing item types' properties.
  • XWE - Primarily a Doom editor, but has secondary support for many other games, including System Shock. Useful for messing with the graphic, sound, and text resources.
  • shack - A reverse-engineered version of the System Shock/Underworld engine. Fly around Citadel station and have adventures. Useful for viewing the game maps without actually having to play the game. Requires SDL.
  • Sound extractor and texture extractor - Does exactly as advertised.

Version comparison

This is a chunk-by-chunk breakdown of the map archive, to try and help me identify all the minor changes between versions. Unfortunately it only provides vague hints as to what has been changed, and right now I'm too lazy to crack open every single chunk with a hex editor to try and examine the differences in more detail.

Level data parts:
xx04 - basic level info
(can probably ignore in archive.dat since some of it is garbage)

xx05 - tile map
xx07 - texture list

xx08 - master obj. table
xx09 - obj. cross ref table (controls per-tile item position)

Item tables - number is class+10
xx10 - weapons table
xx11 - ammo table
xx12 - projectile table (probably garbage/unused except in save games)
xx13 - explosives table
xx14 - patches table
xx15 - hardware table
xx16 - software/logs table
xx17 - scenery/decor
xx18 - other items
xx19 - switches/panels
xx20 - doors
xx21 - animations
xx22 - traps/triggers
xx23 - containers
xx24 - critters

other stuff
xx43 - surveillance screens

Chunks xx40, xx45, xx48 have changed in EVERY level - maybe the same change each time
or something related to checksums/version number, which will necessarily be different
Chunk xx04 also contains at least a pointer which changes with every play so if
these chunks differ it's probably meaningless
I'm just ignoring these chunks for now.

Except for Beta Grove and the final cspace, it looks like all of the levels have been tweaked somehow

Level R

Changed stuff: object table + cross ref table
(I know the one camera at start of level was moved, maybe other things were moved)
Scenery/decor table (words, screens, ?)

Files 4008.bin and ..\cd\4008.bin differ
Files 4009.bin and ..\cd\4009.bin differ
Files 4017.bin and ..\cd\4017.bin differ

Level 1

Changed stuff: tile map (severed head compartment)
Object table + cross ref table (mira's head, maybe other stuff also?)
scenery/decor, other items, traps/triggers, containers

Files 4105.bin and ..\cd\4105.bin differ
Files 4108.bin and ..\cd\4108.bin differ
Files 4109.bin and ..\cd\4109.bin differ
Files 4117.bin and ..\cd\4117.bin differ
Files 4118.bin and ..\cd\4118.bin differ
Files 4120.bin and ..\cd\4120.bin differ
Files 4122.bin and ..\cd\4122.bin differ
Files 4123.bin and ..\cd\4123.bin differ

Level 2

Changed stuff: tile map
object tables, "other items" table (circuit breaker papers, + something else?)

Files 4205.bin and ..\cd\4205.bin differ
Files 4208.bin and ..\cd\4208.bin differ
Files 4209.bin and ..\cd\4209.bin differ
Files 4218.bin and ..\cd\4218.bin differ

Level 3

Changed stuff: tile map
object tables, scenery table

Files 4305.bin and ..\cd\4305.bin differ
Files 4308.bin and ..\cd\4308.bin differ
Files 4309.bin and ..\cd\4309.bin differ
Files 4317.bin and ..\cd\4317.bin differ

Level 4

Changed stuff: tile map
object tables, scenery table, switches table, trigger table

Files 4405.bin and ..\cd\4405.bin differ
Files 4408.bin and ..\cd\4408.bin differ
Files 4409.bin and ..\cd\4409.bin differ
Files 4417.bin and ..\cd\4417.bin differ
Files 4419.bin and ..\cd\4419.bin differ
Files 4422.bin and ..\cd\4422.bin differ

Level 5

Changed stuff: tile map
object tables, trigger table
(Something to do with the Parovski post-mortem email bug?
I don't know if this was fixed in the CD version)

Files 4505.bin and ..\cd\4505.bin differ
Files 4508.bin and ..\cd\4508.bin differ
Files 4509.bin and ..\cd\4509.bin differ
Files 4522.bin and ..\cd\4522.bin differ

Level 6

Changed stuff: tile map
object tables, software table, scenery table, trigger table

Files 4605.bin and ..\cd\4605.bin differ
Files 4608.bin and ..\cd\4608.bin differ
Files 4609.bin and ..\cd\4609.bin differ
Files 4616.bin and ..\cd\4616.bin differ
Files 4617.bin and ..\cd\4617.bin differ
Files 4622.bin and ..\cd\4622.bin differ

Level 7

Changed stuff: tile map
object tables, scenery table, critter table

Files 4705.bin and ..\cd\4705.bin differ
Files 4708.bin and ..\cd\4708.bin differ
Files 4709.bin and ..\cd\4709.bin differ
Files 4717.bin and ..\cd\4717.bin differ
Files 4724.bin and ..\cd\4724.bin differ

Level 8

Changed stuff: tile map
object tables, hardware table, other items table,
doors, triggers, critters

Files 4805.bin and ..\cd\4805.bin differ
Files 4808.bin and ..\cd\4808.bin differ
Files 4809.bin and ..\cd\4809.bin differ
Files 4815.bin and ..\cd\4815.bin differ
Files 4818.bin and ..\cd\4818.bin differ
Files 4820.bin and ..\cd\4820.bin differ
Files 4822.bin and ..\cd\4822.bin differ
Files 4824.bin and ..\cd\4824.bin differ

Level 9

Changed stuff: cross ref table only (can ignore this?)
hardware table (some hardware got a version change maybe)

Files 4909.bin and ..\cd\4909.bin differ
Files 4915.bin and ..\cd\4915.bin differ

shodan cyberspace

Changed stuff: nothing.

delta grove

Changed stuff: tile map, object tables
(but not individual class tables? subclass/type changes i guess
or, possibly things were moved around))

Files 5105.bin and ..\cd\5105.bin differ
Files 5108.bin and ..\cd\5108.bin differ
Files 5109.bin and ..\cd\5109.bin differ

alpha grove

Changed stuff: tile map, cross ref table only 
(may be meaningless: items moving around would change xx08 too)

Files 5205.bin and ..\cd\5205.bin differ
Files 5209.bin and ..\cd\5209.bin differ

beta grove

Changed stuff: nothing
cyberspace 1

Changed stuff: tile map, object tables, nothing else
(software type changes?)

Files 5405.bin and ..\cd\5405.bin differ
Files 5408.bin and ..\cd\5408.bin differ
Files 5409.bin and ..\cd\5409.bin differ

cyberspace 2

Changed stuff: tile map, object tables
Software table (extra cdrom minigames, maybe other stuff)
scenery/decor table (probably related to that added software)
switches table (the forgotten prison lock)
traps & critters tables

This will be the hardest to check since it spans 6(?) actual levels of gameplay
and probably even more points of entry 

Files 5505.bin and ..\cd\5505.bin differ
Files 5508.bin and ..\cd\5508.bin differ
Files 5509.bin and ..\cd\5509.bin differ
Files 5516.bin and ..\cd\5516.bin differ
Files 5517.bin and ..\cd\5517.bin differ
Files 5519.bin and ..\cd\5519.bin differ
Files 5522.bin and ..\cd\5522.bin differ
Files 5524.bin and ..\cd\5524.bin differ