To quote my blog post on the subject:
The 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.
Basically then since SCI0 games were
designed to be played from diskettes, they traded some bits of the "where in the volume is it" for "which volume is it in". With four bytes or 32 bits, that means you'd have a maximum possible offset-in-volume of 4,294,967,295 bytes. But if you use six of those for the disk number, you get 64 diskettes to use with a maximum offset-in-volume of only 67,108,863.
On top of that, the resource map in SCI0 can specify 32 different types of resource, with an upper bound of 2048 each. But since the
filename format is
restype.num you end up with a limit of 1000 resources of each type.
With SCI11 using a 24-bit offset-in-volume value and
no which-volume value at all (there is only
resource.000), you get an upper limit of 16,777,215, and in SCI2 onwards it's the full 4,294,967,295 again. Since the filename format has switched around, we can now express and use the full 16-bit range for resource numbers.
So to simplify, 999 is a hard limit because of file
names, but in that same SCI engine another hard limit is 2048 because of map
formats.