## Level Objects Instance data of [Level Objects](../levelObjects/index.md) 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](mapInformation.md) 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][L10] | 16 | 8 | | 1 | ```L11``` | [Ammo][L11] | 32 | 6 | | 2 | ```L12``` | Physics | 32 | 40 | | 3 | ```L13``` | [Grenade][L13] | 32 | 12 | | 4 | ```L14``` | [Drug][L14] | 32 | 6 | | 5 | ```L15``` | [Hardware][L15] | 8 | 7 | | 6 | ```L16``` | [Software][L16] | 16 | 9 | | 7 | ```L17``` | [Big Stuff][L17] | 176 | 16 | | 8 | ```L18``` | [Small Stuff][L18] | 128 | 16 | | 9 | ```L19``` | [Fixture][L19] | 64 | 30 | | 10 | ```L20``` | [Door][L20] | 64 | 14 | | 11 | ```L21``` | Animating | 32 | 10 | | 12 | ```L22``` | [Trap][L22] | 160 | 28 | | 13 | ```L23``` | [Container][L23] | 64 | 21 | | 14 | ```L24``` | [Critter][L24] | 64 | 46 | [L10]: ../levelObjects/00_Gun/levelGunEntry.md [L11]: ../levelObjects/01_Ammo/levelAmmoEntry.md [L13]: ../levelObjects/03_Grenade/levelGrenadeEntry.md [L14]: ../levelObjects/04_Drug/levelDrugEntry.md [L15]: ../levelObjects/05_Hardware/levelHardwareEntry.md [L16]: ../levelObjects/06_Software/levelSoftwareEntry.md [L17]: ../levelObjects/07_BigStuff/levelBigStuffEntry.md [L18]: ../levelObjects/08_SmallStuff/levelSmallStuffEntry.md [L19]: ../levelObjects/09_Fixture/levelFixtureEntry.md [L20]: ../levelObjects/10_Door/levelDoorEntry.md [L22]: ../levelObjects/12_Trap/levelTrapEntry.md [L23]: ../levelObjects/13_Container/levelContainerEntry.md [L24]: ../levelObjects/14_Critter/levelCritterEntry.md ### 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.