Files

10 KiB

Level Objects

Instance data of Level Objects is stored as part of an archive. Two resources describe general information, then further resources are object class specific.

General Information

Level Object Table

L08, a compressed resource, contains a table with general entries about the objects in the current level. This table contains 872 entries, which houses two lists.

Level Object Entry (Obj struct) (27 bytes)

0000  byte     In use flag. 0: free, 1: in use
0001  byte     Object class
0002  byte     Object subclass
0003  int16    Class table index
0005  int16    Cross-Reference table index (also: used list head)
0007  int16    Next
0009  int16    Previous
000B  uint16   X Coordinate
000D  uint16   Y Coordinate
000F  byte     Z Coordinate (height)
0010  byte     Pitch rotation (around X axis), increasing values turn upwards
0011  byte     Yaw/Heading rotation (around Z axis), increasing values turn rightwards
0012  byte     Roll/Bank rotation (around Y axis), increasing values turn rightwards
0013  byte     Physics (0xFF for unaffected, the default)
0014  byte     Object type
0015  sint16   Hitpoints
0017  [4]byte  Extra

The starting point for both lists is the first entry (index zero). This entry is not in use (In use flag is zero).

The Cross-Reference table index field of the starting point refers to the first object of a list of objects in use. For all object entries in use, their Previous and Next fields form a double-linked list, with the exception of the starting point: The last used object entry refers to the starting point with its Next value without being referred-to from the starting point.

The Next index of the starting point refers to the first object of a list of objects not in use. For all object entries not in use, their Next field forms a single-linked list. The Previous field of unused objects is not defined and contains arbitrary data. The last unused object entry refers to the starting point with its Next value.

If an object is placed in the world, it has the X, Y and Z coordinates set, as well as the Cross-Reference table index pointing to a corresponding entry in the cross-reference table. If an object was spawned by the engine without a location in the world, such as loot from corpses, then the X field is 0xFFFF, Y and Z fields are zero, and the Cross-Reference table index is zero as well.

The extra field is a multi-purpose field, which may hold further properties and/or state. The exact features are environment specific and may also be dependent on the classification of the object.

Global extra

For some objects, the extra field is dependent on the object type or class, and the field is applicable to both real world and cyberspace.

Basic Extra (4 bytes)

0000  byte     Make Info - a general index
0001  byte     Current Frame - for animations
0002  byte     Time Remainder - for animations
0003  byte     Instance Flags - for various purposes

This is the layout as defined by the engine. Yet, these values may be interpreted/used specifically according to type and/or environment.

Panel Extra (4 bytes)

0000  byte     Panel name index; Index into cybstrng 0x0869
0001  [3]byte  Other

If the Panel name resolves to an unknown block or empty string, then the regular object name is displayed.

*Surfaces Extra (4 bytes)

0000  byte     Unknown
0001  byte     Bitmap Index
0002  [2]byte  Unknown

This is used for simple surfaces, such as icons (7/2/1) and paintings (7/2/4).

Cyberspace extra

In case the level is cyberspace, the extra field contains the following properties.

Cyberspace Level Object Extra (4 bytes)

0000  byte     Other
0001  byte     ICE presence
0002  byte     Unknown
0003  byte     ICE level

Level objects in cyberspace can be locked by ICE (Intrusion Countermeasures Electronics). ICE need to be defeated using the drill tool before the locked object can be acquired/used. The ICE presence field determines whether ICE is present. Any value != 0x00 has ICE present. If present, the health of the ICE is determined by the health of the object. The ICE level then determines how aggressive and powerful the ICE is. 0x00 is the weakest, 0xFF is the highest.

Although the vanilla game uses ICE only on software objects, the engine also supports ICE on other objects, such as cyberspace exits.

Level Object Cross-Reference Table

L09, a compressed resource, is a table that links level objects and the tiles they are in. The index field in the Tile Map Entry refers to this table, as well as the table index field in the Level Object Entry. This table contains 1600 entries.

Level Object Cross-Reference Entry (10 bytes)

0000  int16    Tile X
0002  int16    Tile Y
0004  int16    Index into level object entry table
0006  int16    Index for next object
0008  int16    Index for next tile of same object

Objects can extend over several tiles. The last field points to the next reference entry about the same object, with different tile coordinates. This field creates a single-linked list, with the last entry pointing to the first one. If the object is contained within one tile only, this field points to its own entry.

The major coordinates of the main object entry match those of the last entry of the cross-reference list. The cross-reference list only contains the X/Y values of the tiles - not sub-tile coordinates.

The Index for next object field creates a single-linked list, terminating with a zero value. This list either refers to all objects within the same tile (if referred to from a tile), or creates a pool of unused cross-reference entries. The start of this pool is the first entry (index zero). Unused cross-reference entries contain arbitrary data and only the next object index field is valid.

Class Specific Information

In the following resources, all tables have a static count of entries. Each entry has a common prefix.

Level Object Prefix (6 bytes)

0000  int16    Index into level object entry table
0002  int16    Previous
0004  int16    Next

The tables contain two lists each, similar to the main object table: The starting point is the first entry (index zero). The starting point refers to a double-linked list of used entries (via Next), and a single-linked list of unused entries (via Previous). Both lists are terminated by referring back to index zero.

The Index field of the starting point does not refer to a level object, it is the index within the same table of the last used entry. (The actual "previous" link to the double-linked list of used objects.)

The sum of all possible entries is slightly higher than the total count of possible Level Object Entries.

Class Tables and Entries

The following table lists the the level resources per class type. It also lists how many entries each table contains and how big one entry is. The name column links to the corresponding details.

Class Level Res Name Entry Count Entry Size (incl. prefix)
0 L10 Gun 16 8
1 L11 Ammo 32 6
2 L12 Physics 32 40
3 L13 Grenade 32 12
4 L14 Drug 32 6
5 L15 Hardware 8 7
6 L16 Software 16 9
7 L17 Big Stuff 176 16
8 L18 Small Stuff 128 16
9 L19 Fixture 64 30
10 L20 Door 64 14
11 L21 Animating 32 10
12 L22 Trap 160 28
13 L23 Container 64 21
14 L24 Critter 64 46

Class Default Information

Each level has 15 further resources, L25 to L39, one for each object class. The length of these resources is the same as for one class entry of the corresponding specific entries. This information is used as default for creating new objects. Most of the time, all their bytes are 0x00.