Notes: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: . 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 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