One thing that stood out to me when I look at my collection of Sierra SCI games is that basically all the 16-color and early 256-color games (that is, SCI0, SCI01, SCI1) have multiple resource volumes, but the SCI11 games do not. Not because a lot of them came on CD either, the diskette versions, once installed, had a single resource volume too.
Why do you suppose that is? Why do the diskettes for SCI11 games contain a single
resource.000 file that’s been split across them all for the install script to merge back together on the hard drive?
Because the map format doesn’t allow it.
resource.map file specifies which resources can be found on which disks. For SCI0, it’s a list of six-byte entries. The first two encode the type (upper five bits) and number (the lower 11 bits), the next four have the volume number (upper six) and absolute offset in the volume (the rest). If a resource appears on multiple disks, it’s listed once for every appearance. In SCI01, there are only four bits for the volume number, trading amount for space.
In the later versions, the map file starts off with a list of offsets for each type listed in the map. With this list and a contract that the map entries are sorted by type, the interpreter can look up a given type of resource much faster. Since we already know that this part of the list only contains resources of a given type, we can use the full 16 bit range for the numbers. In SCI1, the next four bytes are just like in SCI01. In SCI11 however there’s only three, and there’s no volume number. Then in SCI2 it’s a straight-up plain 32 bit offset value.
The trick with SCI11 having only a 24 bit range for its offsets is that the value is shifted. They must be aligned on a two byte boundary so that the offset range is effectively doubled again.
As a practical example, let’s look at The Dating Pool. If I open its
resource.map in my favorite hex editor and try to look up the second view, it’d go like this.
The first few bytes are
80 2B 00 81 EE 00 82 BB 01. We know the format, so this means that views (type
80) start at offset
002B and background pictures (
81) start at offset
00EE, which means the views end there. Skipping ahead to the given offset, we see this:
00 00 00 00 00 05 00 02 26 00. Obviously the first resource (view 0) is at offset zero. Splitting this up into handy chunks,
0000 000000 0005 002602, we see that view 5 (which is the second one in the game data) is at offset
2602 << 1 = 4C04. Open up
resource.000 and go there, and the first thing we see is confirmation:
80 05 00 36 44 36 44 00 00. View number 5,
4436 bytes in size both unpacked and packed, no compression, followed by the actual view data. Then there’s a single null byte for padding, and view 10 begins.