**The unofficial 3DO Deathkeep files format specifications by Versus (vas.1987), 2024 (version 1.0) ** Note:\\ All data is BIG ENDIAN.\\ Directions for stairs and ramps means that named direction must have considered from lower to upper part of the structure. i.e. North direction for the ramp means that I’m sliding from the top towards South.\\ Directions for the monsters means that monster is faced towards the named direction. I made an app, which reads all game data needed for 3D model export and for some level edit. You can edit every cube, but you can’t extend or shrink the palette. You can extract level to wavefront *.obj format. You can edit a gap between cubes before exporting (for some 3rd app needs). You can also test your suggestions by editing cube’s properties and test it later in the game. First select the target cube, edit its value and click this button “edit”. Then just save a new file or overwrite the an existing one. ---- **Level editor with source** : [[https://github.com/Versusvs/3DO-Deathkeep-level-editor|https://github.com/Versusvs/3DO-Deathkeep-level-editor]] __**Contents**__ **Overview** **Introduction** **Level voxel files (\data2\levels\*)** **Level data files (\data2\levels\*data)** **Global data files (\data2\DK Data*)** **Savefile structure** **OVERVIEW**. This description covers almost all game data files, which contains level geometry, level textures, inventory items and monsters. Movies, sounds, music and separate cel files are excluded from documenting. I also tried to investigate savefile data structure. **INTRODUCTION**.\\ 3DO and PC port have identical levels, but level files have different format.\\ Both 3DO and PC levels consist of voxels. Every voxel is a 3D cube which may contain different combinations of level elements. It may contain ramp or stair only or teleport or level exit. Every level must fit in parallelogram with dimensions 64 by 32 by 8. Where 8 is height and as we could say the number of Floors. We have 16384 voxels in total! Pretty much, isn’t it?\\ 3DO levels consist of two files. First one contains voxel table, Second contains textures, animation data, teleports and other logic, items and monsters. **A) LEVEL VOXEL FILES** (\data2\levels\*) Each level voxel file is 131 072 bytes. Each voxel in 3DO version is encoded by 8 bytes. So, there are 16 384 voxels. If voxel has 0xFF value, it’s blank for the game engine. Every variation from it means that voxel is used by the game. It can be just walls, ceiling and floor with textures, it can be ramp or stairs, item or monster can be placed in. Blank voxels may be located inside large halls, in the center of the room, if the room is big enough.\\ First voxel in file has position in 0,0,0 (X, Y, Z). Second voxel has position 0,0,1 (X, Y, Z). It means that second voxel is located directly above the first one. First 8 voxels are located one above another. Voxel number 9 is located near to first column in the width direction on the coordinates: 0,1,0 (X, Y, Z). {{ ..:media:deathkeep:1.jpg?400 |1.jpg}} **Voxel file structure** ^Offset (HEX)^Length, bytes^Description^Chapter| |0|8|Voxel #0|A| |8|8|Voxel #1| ::: | |0x10|8|Voxel #2| ::: | |…|…|…| ::: | |0x1FFF8|8|Voxel #16383| ::: | Each voxel is encoded by 8 bytes and they are numbered from 0 to 7. **Voxel structure** ^Byte #^Length, bits^Description^Chapter| |0|8|Stairs, Steps, Ramps. (also linked with byte 7 when set to teleports, Elevators)|A.1| |1|4|Doors, closed doors|A.2| | ::: |4|Brightness, Flickering| ::: | |2|8|First number for the cube's palette specs|A.3| |3|4|Always zero|A.4| | ::: |4|Second number for the cube's palette specs| ::: | |4|8|Always zero|A.5| |5|8|Additional item’s specs|A.6| |6|8|Always zero|A.7| |7|8|Item&Enemy (also bound with byte 0 when set to teleport, elevator)|A.8| **A.1) ** **Byte #0. **It contains data about ramps, steps and stairs. Various values can encode all directions of the ramp or stair. Both ramps and stairs can be 2 types. The first type encodes a ramps or stair in lower half of the cube height. The second type encodes the ramp or stair in upper half of the cube height to the top of the cube. Values in range 0x80 – 0x9A are for game inner logic (teleports, elevators, monster and fireballs triggers, etc.). {{:images:deathkeep:stair_ramp.jpg?nolink&709x204|stair_ramp.jpg}} This byte also encodes a steps, if I may say so. This steps have a various elevation from the floor ground and have flat surface. Using different values, you may do a fine tuning for your level design. {{:images:deathkeep:steps.jpg?nolink&446x259|steps.jpg}} I found some values which affects a level in a weird way and not actually present in the game. May be there are more, I didn’t test others. {{:images:deathkeep:weird1.jpg?nolink&358x239|weird1.jpg}}{{:images:deathkeep:weird2.jpg?nolink&358x245|weird2.jpg}}{{:images:deathkeep:weird3.jpg?nolink&360x241|weird3.jpg}}{{:images:deathkeep:weird4.jpg?nolink&370x242|weird4.jpg}} All known values of Byte #0 are in the table below. ^Byte #0 (HEX) ^Description | |0 |N/A | |01 |Stairs South Low | |02 |Stairs North Low | |03 |Stairs West Low | |04 |Stairs East Low | |05 |Stairs South Upper | |06 |Stairs North Upper | |07 |Stairs West Upper | |08 |Stairs East Upper | |09 |Columns in cube's corners | |0A |2 steps pyramid. Pedestal | |0B |Double square wall in the center | |0C |Big square column in the center | |0D | | |0E | | |0F |Step. Height 16. Default texture on the walls. Without top texture | |10 |Elevator path definer. Must be set in addition with other bytes (Byte #7, Block 4) | |11 |Step. Height 1 | |12 |Step. Height 2 | |13 |Step. Height 3 | |14 |Step. Height 4 | |15 |Step. Height 5 | |16 |Step. Height 6 | |17 |Step. Height 7 | |18 |Step. Height 8 | |19 |Step. Height 9 | |1A |Step. Height 10 | |1B |Step. Height 11 | |1C |Step. Height 12 | |1D |Step. Height 13 | |1E |Step. Height 14 | |1F |Step. Height 15 | |20 | | |21 |Step. Height 1. Without vert. textures | |22 |Step. Height 2. Without vert. textures | |23 |Step. Height 3. Without vert. textures | |24 |Step. Height 4. Without vert. textures | |25 |Step. Height 5. Without vert. textures | |26 |Step. Height 6. Without vert. textures | |27 |Step. Height 7. Without vert. textures | |28 |Step. Height 8. Without vert. textures | |29 |Step. Height 9. Without vert. textures | |2A |Step. Height 10. Without vert. textures | |2B |Step. Height 11. Without vert. textures | |2C |Step. Height 12. Without vert. textures | |2D |Step. Height 13. Without vert. textures | |2E |Step. Height 14. Without vert. textures | |2F |Step. Height 15. Without vert. textures | |30 |Step. Height 0. Jump up 1 floor | |31 |Step. Height 1. Without vert. textures. Jump up 1 floor | |32 |Step. Height 2. Without vert. textures. Jump up 1 floor | |33 |Step. Height 3. Without vert. textures. Jump up 1 floor | |34 |Step. Height 4. Without vert. textures. Jump up 1 floor | |35 |Step. Height 5. Without vert. textures. Jump up 1 floor | |36 |Step. Height 6. Without vert. textures. Jump up 1 floor | |37 |Step. Height 7. Without vert. textures. Jump up 1 floor | |38 |Step. Height 8. Without vert. textures. Jump up 1 floor | |39 |Step. Height 9. Without vert. textures. Jump up 1 floor | |3A |Step. Height 10. Without vert. textures. Jump up 1 floor | |3B |Step. Height 11. Without vert. textures. Jump up 1 floor | |3C |Step. Height 12. Without vert. textures. Jump up 1 floor | |3D |Step. Height 13. Without vert. textures. Jump up 1 floor | |3E |Step. Height 14. Without vert. textures. Jump up 1 floor | |3F |Step. Height 15. Without vert. textures. Jump up 1 floor | |40 |Step. Height 0. Jump up 2 floors | |41 |Step. Height 1. Without vert. textures. Jump up 2 floors | |42 |Step. Height 2. Without vert. textures. Jump up 2 floors | |43 |Step. Height 3. Without vert. textures. Jump up 2 floors | |44 |Step. Height 4. Without vert. textures. Jump up 2 floors | |45 |Step. Height 5. Without vert. textures. Jump up 2 floors | |46 |Step. Height 6. Without vert. textures. Jump up 2 floors | |47 |Step. Height 7. Without vert. textures. Jump up 2 floors | |48 |Step. Height 8. Without vert. textures. Jump up 2 floors | |49 |Step. Height 9. Without vert. textures. Jump up 2 floors | |4A |Step. Height 10. Without vert. textures. Jump up 2 floors | |4B |Step. Height 11. Without vert. textures. Jump up 2 floors | |4C |Step. Height 12. Without vert. textures. Jump up 2 floors | |4D |Step. Height 13. Without vert. textures. Jump up 2 floors | |4E |Step. Height 14. Without vert. textures. Jump up 2 floors | |4F |Step. Height 15. Without vert. textures. Jump up 2 floors | |50 |Step. Height 0. Jump up 3 floors | |51 |Step. Height 1. Without vert. textures. Jump up 3 floors | |52 |Step. Height 2. Without vert. textures. Jump up 3 floors | |53 |Step. Height 3. Without vert. textures. Jump up 3 floors | |54 |Step. Height 4. Without vert. textures. Jump up 3 floors | |55 |Step. Height 5. Without vert. textures. Jump up 3 floors | |56 |Step. Height 6. Without vert. textures. Jump up 3 floors | |57 |Step. Height 7. Without vert. textures. Jump up 3 floors | |58 |Step. Height 8. Without vert. textures. Jump up 3 floors | |59 |Step. Height 9. Without vert. textures. Jump up 3 floors | |5A |Step. Height 10. Without vert. textures. Jump up 3 floors | |5B |Step. Height 11. Without vert. textures. Jump up 3 floors | |5C |Step. Height 12. Without vert. textures. Jump up 3 floors | |5D |Step. Height 13. Without vert. textures. Jump up 3 floors | |5E |Step. Height 14. Without vert. textures. Jump up 3 floors | |5F |Step. Height 15. Without vert. textures. Jump up 3 floors | |60 |Step. Height 0. Jump up 4 floors | |61 |Step. Height 1. Without vert. textures. Jump up 4 floors | |62 |Step. Height 2. Without vert. textures. Jump up 4 floors | |63 |Step. Height 3. Without vert. textures. Jump up 4 floors | |64 |Step. Height 4. Without vert. textures. Jump up 4 floors | |65 |Step. Height 5. Without vert. textures. Jump up 4 floors | |66 |Step. Height 6. Without vert. textures. Jump up 4 floors | |67 |Step. Height 7. Without vert. textures. Jump up 4 floors | |68 |Step. Height 8. Without vert. textures. Jump up 4 floors | |69 |Step. Height 9. Without vert. textures. Jump up 4 floors | |6A |Step. Height 10. Without vert. textures. Jump up 4 floors | |6B |Step. Height 11. Without vert. textures. Jump up 4 floors | |6C |Step. Height 12. Without vert. textures. Jump up 4 floors | |6D |Step. Height 13. Without vert. textures. Jump up 4 floors | |6E |Step. Height 14. Without vert. textures. Jump up 4 floors | |6F |Step. Height 15. Without vert. textures. Jump up 4 floors | |70 |Step. Height 0. Jump up 5 floors | |71 |Step. Height 1. Without vert. textures. Jump up 5 floors | |72 |Step. Height 2. Without vert. textures. Jump up 5 floors | |73 |Step. Height 3. Without vert. textures. Jump up 5 floors | |74 |Step. Height 4. Without vert. textures. Jump up 5 floors | |75 |Step. Height 5. Without vert. textures. Jump up 5 floors | |76 |Step. Height 6. Without vert. textures. Jump up 5 floors | |77 |Step. Height 7. Without vert. textures. Jump up 5 floors | |78 |Step. Height 8. Without vert. textures. Jump up 5 floors | |79 |Step. Height 9. Without vert. textures. Jump up 5 floors | |7A |Step. Height 10. Without vert. textures. Jump up 5 floors | |7B |Step. Height 11. Without vert. textures. Jump up 5 floors | |7C |Step. Height 12. Without vert. textures. Jump up 5 floors | |7D |Step. Height 13. Without vert. textures. Jump up 5 floors | |7E |Step. Height 14. Without vert. textures. Jump up 5 floors | |7F |Step. Height 15. Without vert. textures. Jump up 5 floors | |80 |Teleport. Set Byte #7 to 0xE4 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |81 |Trigger for the door. Set Byte #7 to 0xE5 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |82 |Elevator related DOWN. Set Byte #7 to 0xE6, set Byte #0 along the path to 0x10 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |83 |This cube points on cubes around elevators. Set Byte #7 to 0xE7 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |84 |Wall fireball trigger. Set Byte #7 to 0xE8 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |85 |Floor flame trigger. Set Byte #7 to 0xE9 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |86 |Ceiling fireball trigger. Wait an attack from above. Set Byte #7 to 0xEA and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |87 |Wall fireball trigger (blue fireball). Set Byte #7 to 0xEB and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |88 |Switching off the light (reduces brightness). Set Byte #7 to 0xEC and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |89 | | |8A | | |8B |This cube points on some Monsters nearby. Triggers monsters to active state. Set Byte #7 to 0xEF and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |8C |N/A. Not working. Present only in levels #3, 7, 13, 14 basically outside level cubes. | |8D |N/A | |8E |N/A | |8F |N/A | |90 |N/A | |91 |N/A | |92 |N/A | |93 |N/A | |94 |This cube points on cubes. Flickering light turns on in those cubes in case of triggering. Set Byte #7 to 0xF8 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |95 |Elevator DOWN. Set Byte #7 to 0xF9, set Byte #0 on the path to 0x10 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |96 |Elevator UP. Set Byte #7 to 0xFA, set Byte #0 on the path to 0x10 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |97 |Elevator DOWN. Set Byte #7 to 0xFB, set Byte #0 on the path to 0x10 and use blocks 4, 5 (See chapter B, LEVEL DATA FILES) | |98 | | |99 | | |9A | | |9B | | |9C | | |9D | | |9E | | |9F | | |A0 | | |A1 | | |A2 | | |A3 | | |A4 | | |A5 | | |A6 | | |A7 | | |A8 | | |A9 | | |AA | | |AB | | |AC | | |AD | | |AE | | |AF | | |B0 | | |B1 | | |B2 | | |B3 | | |B4 | | |B5 | | |B6 | | |B7 | | |B8 | | |B9 | | |BA | | |BB | | |BC | | |BD | | |BE | | |BF | | |C0 | | |C1 | | |C2 | | |C3 | | |C4 | | |C5 | | |C6 | | |C7 | | |C8 | | |C9 | | |CA | | |CB | | |CC | | |CD | | |CE | | |CF | | |D0 | | |D1 | | |D2 | | |D3 | | |D4 | | |D5 | | |D6 | | |D7 | | |D8 | | |D9 | | |DA | | |DB | | |DC | | |DD | | |DE | | |DF | | |E0 | | |E1 | | |E2 | | |E3 | | |E4 | | |E5 | | |E6 | | |E7 | | |E8 | | |E9 | | |EA | | |EB | | |EC | | |ED | | |EE | | |EF | | |F0 |Ramp West. Low | |F1 |Ramp West. High | |F2 |Ramp East. Low | |F3 |Ramp East. High | |F4 |Ramp North. Low | |F5 |Ramp North. High | |F6 |Ramp South. Low | |F7 |Ramp South. High | |F8 |N/A? | |F9 |N/A? | |FA |N/A? | |FB |N/A? | |FC |N/A? | |FD |N/A? | |FE |N/A? | |FF | | **A.2)** Byte #1. Contains data about cube’s inner brightness, light flickering, and partially doors logic. To ensure the Door is working properly it’s animation must be set in blocks 1-3 (see chapter B).\\ Bit #1 indicates that this cube has a door, Bit #3 indicates that door is closed or not (requires key). Bits must be set in both cubes (both door sides). Bit #1 == 1 means door presence in the cube. Bit #3 == 1 means that door requires a key. Setting these bits to make a door is necessary but not enough. Most common situation is when door may be opened from both sides. In this case two cubes which have the door, must have Bit #1 bit enabled. I can make a one-way path using a closed door bit (Bit #3) from one side only. So, this area may be accessed but there is no way back without a key.\\ Byte #1, bits #0-3:\\ Bit #1 = 1 means that a door is present\\ Bit #3 = 1 means that a door is locked\\ You can play with first 4 bits of Byte #1:\\ 0x2 – door present\\ 0xA – door present and locked\\ 0 – door doesn’t exist Bits #4-7 within Byte #1 describes cube’s inner brightness or light flickering. ^Byte #1, bits #4-7 (HEX)^Description| |1|Brightness 14 (brighter)| |2| Brightness 7 | |3|Brightness 13| |4|Brightness 6| |5|Brightness 12| |6|Brightness 5| |7|Brightness 11| |8|Brightness 4| |9|Brightness 10| |A|Brightness 3| |B|Brightness 9| |C|Brightness 2| |D|Brightness 8| |E|Brightness 1 (darker)| |F|Flickering light| **A.3)** **Byte #2.** First palette byte. (See chapter B, LEVEL DATA FILES). This byte is used as a first palette ID part for the walls, ceiling, floors and the textures. This byte must be considered with Byte #3. **A.4)\\ Byte #3**. First 4 bits are always zero. The next 4 bits are used as a second palette ID part for the walls, ceiling, floors and the textures like Byte #2. Textures encodes inner surfaces of the scenery cube and cube’s collisions. This byte must be considered with Byte #3.\\ Bytes #2, #3 together represents palette ID in *data file. (See chapter B, LEVEL DATA FILES).\\ __Example__:\\ Byte #2 = 0xF4.\\ Byte #3 = 0xA.\\ Palette number = 0xF4A. **A.5)\\ Byte #4**. This byte isn’t used by the game and always equals zero. **A.6)\\ Byte #5**. This byte adds additional data for character’s items from Byte #7 (0x50-0xC3). Helms, Armor, Weapons can gain additional specs, i.e. Helm +2, Long sword +1, where +2 and +1 are additional specs. Possible values: 0 to 0x7F. **A.7)\\ Byte #6**. This byte isn’t used by the game and always equals zero. **A.8)\\ Byte #7**. This byte contains data about all items placed on the level. Health potions, weapons, food, amulets, decor and so on. It also encodes an enemy placement with chosen enemy direction. Item may be placed in the level, but some items are visible to Mage, but not visible for Dwarf or Half-Elf FighterMage. ^**Byte #7 (HEX)** ^**Description** | |0 |Monster. 1st type. N | |01 |Monster. 1st type. NE | |02 |Monster. 1st type. E | |03 |Monster. 1st type. SE | |04 |Monster. 1st type. S | |05 |Monster. 1st type. SW | |06 |Monster. 1st type. W | |07 |Monster. 1st type. NW | |08 |Monster. 1st type. N. Moving by default | |09 |Monster. 1st type. NE. Moving by default | |0A |Not used by the game? | |0B | | |0C |Monster. 1st type. S Moving by default | |0D |Monster. 1st type. SW Moving by default | |0E |Monster. 1st type. W Moving by default | |0F |Monster. 1st type. NW Moving by default | |10 |Monster. 2nd type. N | |11 |Monster. 2nd type. NE | |12 |Monster. 2nd type. E | |13 |Monster. 2nd type. SE | |14 |Monster. 2nd type. S | |15 |Monster. 2nd type. SW | |16 |Monster. 2nd type. W | |17 |Monster. 2nd type. NW | |18 |Monster. 2nd type. N. Moving by default | |19 |Monster. 2nd type. NE. Moving by default | |1A |Monster. 2nd type. E. Moving by default | |1B |Monster. 2nd type. SE. Moving by default | |1C |Monster. 2nd type. S. Moving by default | |1D |Monster. 2nd type. SW. Moving by default | |1E |Monster. 2nd type. W. Moving by default | |1F |Monster. 2nd type. NW. Moving by default | |20 |Monster. 3rd type. N | |21 |Monster. 3rd type. NE | |22 |Monster. 3rd type. E | |23 |Monster. 3rd type. SE | |24 |Monster. 3rd type. S | |25 |Monster. 3rd type. SW | |26 |Monster. 3rd type. W | |27 |Monster. 3rd type. NW | |28 |Monster. 3rd type. N. Moving by default | |29 |Monster. 3rd type. NE. Moving by default | |2A |Monster. 3rd type. E. Moving by default | |2B |Monster. 3rd type. SE. Moving by default | |2C |Monster. 3rd type. S. Moving by default | |2D |Monster. 3rd type. SW. Moving by default | |2E |Monster. 3rd type. W. Moving by default | |2F |Monster. 3rd type. NW. Moving by default | |30 |Decor1, N | |31 |Decor1, NE | |32 |Decor1, E | |33 |Decor1, SE | |34 |Decor1, S | |35 |Decor1, SW | |36 |Decor1, W | |37 |Decor1, NW | |38 |Decor2, N | |39 |Decor2, NE | |3A |Decor2, E | |3B |Decor2, SE | |3C |Decor2, S | |3D |Decor2, SW | |3E |Decor2, W | |3F |Decor2, NW | |40 |Decor 3, N | |41 |Decor 3, NE | |42 |Decor 3, E | |43 |Decor 3, SE | |44 |Decor 3, S | |45 |Decor 3, SW | |46 |Decor 3, W | |47 |Decor 3, NW | |48 |Decor 4, N | |49 |Decor 4, NE | |4A |Decor 4, E | |4B |Decor 4, SE | |4C |Decor 4, S | |4D |Decor 4, SW | |4E |Decor 4, W | |4F |Decor 4, NW | |50 |Feast (Food) | |51 |Not used by the game | |52 |Dwarven Key, Tower Key, Fortress Key | |53 |Ancestral artifact RED | |54 |Ancestral artifact GREEN | |55 |Ancestral artifact BLUE | |56 |Rations | |57 |Healing potion | |58 |Potion of speed | |59 |Scroll of Acid protection | |5A |Rock | |5B |Dart | |5C |Scrying Glass | |5D |Orb of Lighting | |5E |Wand of Fear | |5F |Winged Boots | |60 |Helm | |61 |Bracers | |62 |Ring of Flying | |63 |Ring of Protection | |64 |Amulet of magic resistance (round) | |65 |Amulet of imminent return (knife type) | |66 |Dagger | |67 |Long Sword | |68 |Longbow | |69 |Spellbook | |6A |Cloak | |6B |Chain Mail | |6C |Scroll Spell | |6D |Defender Sword | |6E |Vorpal Sword | |6F |Battle Axe | |70 |Hammer | |71 |Staff | |72 |Sling | |73 |Arrow | |74 |Gauntlets | |75 |Shield | |76 |Flame Tongue | |77 |Crossbow | |78 |Not used by the game | |79 |Not used by the game | |7A |Amulet of Power | |7B |Book of Spell Doubling | |7C |Extra Healing potion | |7D |Poison | |7E |Potion of Cure Poison | |7F |Water | |80 |Potion of Invulnerability | |81 |Scroll of Hurling | |82 |Potion of Flying | |83 |Potion of Heroism | |84 |Potion of Super-Heroism | |85 |Potion of Invisibility | |86 |Potion of Hill Giant Strength | |87 |Potion of Storm Giant Strength | |88 |Lightning Staff | |89 |Staff of Striking | |8A |Ring of Invisibility | |8B |Ring of Regeneration | |8C |Ring of Sustenance | |8D |Ring of Weakness | |8E |Ring of Wisardry | |8F |Not used by the game | |90 |Plate Mail | |91 |Ring Mail | |92 |Scale Mail | |93 |Two-Handed Sword | |94 |Axe of Hurling | |95 |Dwarven Lord's Deathstriker | |96 |Storm Hammer | |97 |Dwarven Thrower II | |98 |Dagger of return | |99 |Chill Blade | |9A |Vampire Fang | |9B |Luck Blade | |9C |Crossbow of Accuracy | |9D |Crossbow of Doubling | |9E |Bow of Neverending Arrows | |9F |Firebow | |A0 |Dart of Homing | |A1 |Bracers of Archery | |A2 |Bracers of Defense | |A3 |Sling of Seeking | |A4 |Fire Slinger | |A5 |Fire Sling of Doubling | |A6 |Gauntlets of Dexterity | |A7 |Gauntlets of Ogre Power | |A8 |Scroll of Electricity protection | |A9 |Scroll of Cold protection | |AA |Scroll of Fire protection | |AB |Scroll of Gas protection | |AC |Scroll of Magic protection | |AD |Scroll of Poison protection | |AE |Boots of Ice Walking | |AF |Boots of Ooze Walking | |B0 |Boots of Lava Walking | |B1 |Boots of Goop Walking | |B2 |Boots of Acid Walking | |B3 |Boots of Ether Walking | |B4 |Boots of Artery Walking | |B5 |Boots of Vein Walking | |B6 |Boots of Dirt Walking | |B7 |Not used by the game | |B8 |Boots of Leaping | |B9 |Boots of Door Bashing | |BA |Not used by the game | |BB |Wand of Fire | |BC |Wand of Frost | |BD |Wand of Lightning | |BE |Wand of Magic Missiles | |BF |Wand of Paralysis | |C0 |Orb of Fire Storms | |C1 |Orb of True Seeing | |C2 |Orb of Magic Missiles | |C3 |Orb of Flame Strikes | |C4 | | |C5 | | |C6 | | |C7 | | |C8 | | |C9 | | |CA | | |CB | | |CC | | |CD | | |CE | | |CF | | |D0 | | |D1 | | |D2 | | |D3 | | |D4 | | |D5 | | |D6 | | |D7 | | |D8 | | |D9 | | |DA | | |DB | | |DC | | |DD | | |DE | | |DF | | |E0 | | |E1 | | |E2 | | |E3 | | |E4 |Standart Teleport. Works with Byte #0 set to 0x80 and blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |E5 |Trigger for the door. Works with Byte #0 set to 0x81 and blocks 4, 5. (See chapter B, LEVEL DATA FILES). When character enters this cube, another cube opens it’s door. | |E6 |Elevator DOWN. Works with Byte #0 set to 0x82, blocks 4, 5 and 0xE7(0x83). (See chapter B, LEVEL DATA FILES). | |E7 |Cube points on cubes around elevators. Use blocks 4, 5. Works with Byte #0 set to 0x83. May be one cube per level, may be some of them. (See chapter B, LEVEL DATA FILES). | |E8 |Wall fireball trigger. Works with Byte #0 set to 0x84. Use blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |E9 |Floor flame trigger. Works with Byte #0 set to 0x85. Use blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |EA |Ceiling fireball trigger. Wait an attack from above. Works with Byte #0 set to 0x86. Use blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |EB |Wall fireball trigger (blue). Works with Byte #0 set to 0x87. Use blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |EC |Switch off the light (reduces brightness). Works with Byte #0 set to 0x88. Use blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |ED | | |EE | | |EF |This cube points on some Monsters to set to active mode. Works with Byte #0 set to 0x8B and blocks 4, 5. (See chapter B, LEVEL DATA FILES). | |F0 |Not working. These cubes located basically behind the playable area. (Levels 3, 7, 13, 14) Byte #0 = 0x8C | |F1 |N/A. Doesn’t have a link with the Byte #0 | |F2 |N/A. Doesn’t have a link with the Byte #0 | |F3 |N/A. Doesn’t have a link with the Byte #0 | |F4 |N/A. Doesn’t have a link with the Byte #0 | |F5 |N/A. Doesn’t have a link with the Byte #0 | |F6 |N/A. Doesn’t have a link with the Byte #0 | |F7 |N/A. Doesn’t have a link with the Byte #0 | |F8 |Turns on Flickering light in linked cubes. Works with Byte #0 set to 0x94 and blocks 4, 5 (See chapter B, LEVEL DATA FILES). | |F9 |Elevator related DOWN. Works with Byte #0 set to 0x95, blocks 4, 5 and with 0xE7 (0x83). (See chapter B, LEVEL DATA FILES). Set Byte #0 on the path to 0x10 and use blocks 4, 5. Platform returns up? | |FA |Elevator UP. Works with Byte #0 set to 0x96, blocks 4, 5 and with 0xE7(0x83). (See chapter B, LEVEL DATA FILES). Set Byte #0 on the path to 0x10 and use blocks 4, 5. Platform returns down. | |FB |Elevator DOWN. Works with Byte #0 set to 0x97, blocks 4, 5 and 0xE7(0x83). (See chapter B, LEVEL DATA FILES). Set Byte #0 on the path to 0x10 and use blocks 4, 5. | |FC | | |FD | | |FE | | |FF |Blank (N/A) | **B) LEVEL DATA FILES** (\data2\levels\*data) Data file structure: ^Offset (HEX) ^Length (HEX) ^Description ^Chapter | |0 |4 |Number of textures | | |4 |various |CCB textures |B.1 | | |0x100 |Block 1. Offsets for animated object’s backgrounds in block 2 |B.2 | | |0x100 |Block 1. Offsets for animation palette in block 2 | ::: | | |0x100 |Block 1. Offsets for repeated animation in block 2 | ::: | | |various |Block 2. Animation sequences for doors, torches, floors |B.3 | | |various |Block 3. Palette (floor, ceiling, walls texture indexes, collisions) 16-byte entries |B.4 | | |4 |Level entry coordinates (X, Y, Z, rotation) |B.5 | | |4 |Level exit coordinates (X, Y, Z, 0) | ::: | | |0x6C |Block 4. Offsets for game logic in block 5 |B.6 | | |various |Block 5. Game logic. Teleports, Elevators, Monsters and fireballs triggers, Door triggers, Light triggers |B.7 | | |various |Animation without collision, level decorations (ANIMBACK) |C | | |various |Monsters (ANIMENEMIES) |D | | |various |Animation with collision, level decorations (ANIMOBJ) |E | | |various |Unique objects for the level (OBJECTS) |F | | |various |End of the file |G | **B.1) CCB textures** \\ All wall floor and ceiling textures are here. Every texture entry has the following structure: ^Offset (HEX)^Length (HEX)^Description| |0|2|0| |2|1|0 or Texture prefix| |3|1|Texture ID| |4|4|Texture size without texture ID, prefix and custom collision data (optional)| | |8|Custom collision (optional)| | |4|‘CCB’ header| | | |Texture data| **Texture prefix.** \\ Texture prefix 0x10 indicates default texture for using by game engine. So, for each inner side of the cube only one texture may be assigned by palette (see chapter B.4). If cube geometry is more complex than a simple cube, (cube with ramp, stairs, steps, etc.) this default texture ID will be used for “secondary” surfaces. If voxel data (Byte #0) indicates that cube has a stair, step, etc., this default texture will be assigned to vertical stair polygons. It also applicable for complex cube’s geometry (Byte # 0 is set to: 0x1-0x7F).\\ Texture prefix may be set to 1 or 2. When I swapped this prefixes, these floor and ceiling textures swapped to in the game. Texture prefix also may be set to 0x20, but I didn’t investigate it yet.\\ Texture prefix 0x20 marks textures, which are used for hidden doors in the walls. **Texture ID.** \\ Unique texture IDs are assigned to each texture in the CCB textures section. Voxel’s textures are coded in the palette (see chapter B.4).\\ Texture ID is coded by first 5 bits. Next bits are used for texture rotation of texture mirroring.\\ For wall textures: Bit #7 = 1 – texture is flipped relative to vertical axis.\\ For ceiling and floor textures: Bits #6 and #7 codes texture rotation. There are 4 possible cases: ^Bit #7^Bit #6^Rotation^Value| |0|0|{{..:media:deathkeep:triangle4.png?nolink&28x28}}|0| |1|0|{{..:media:deathkeep:triangle3.png?nolink&28x28}}|1| |1|1|{{..:media:deathkeep:triangle2.png?nolink&28x28}}|2| |0|1|{{..:media:deathkeep:triangle.png?nolink&28x28}}|3| **Custom collision. ** \\ Base cube’s collision is set by palette (see chapter B.4). But in some cases like stairs, ramps, doors or windows must have a more complex collision. It means that only selected cube’s wall zones must be transparent for any kind of object or the actors. Custom wall collision is encoded by 8 bytes. Each bit in 8×8 grid encodes the collision in the cell. Note that all frame in opening door animation has a corresponding custom collision. There is one exclusion in this bit cell rule, when bit pattern doesn’t work as shown in the game. It’s just an opening in the wall (level 1), but bit mask looks weird… (see pattern 8). Some patterns are shown below. {{..:media:deathkeep:ramplow.png?nolink&300x308}} Pattern 1. Ramp, low ( 0xFF 0x3F 0x0F 0x3 0 0 0 0). {{..:media:deathkeep:ramphigh.png?nolink&300x308}} Pattern 2. Ramp, high ( 0xFF 0xFF 0xFF 0xFF 0x3F 0x0F 0x3 0). {{..:media:deathkeep:roundholeinthecenter.png?nolink&300x308}} Pattern 3. Round hole in the center ( 0xFF 0xFF 0xFF 0xE7 0xE7 0xFF 0xFF 0xFF ). {{..:media:deathkeep:openingdoor1.png?nolink&300x308}} Pattern 4. Opening door, frame 1 ( 0xE7 0xE7 0xE7 0xE7 0xE7 0xE7 0xFF 0xFF ). {{..:media:deathkeep:openingdoor2.png?nolink&300x308}} Pattern 5. Opening door, frame 2 ( 0xC3 0xC3 0xC3 0xC3 0xC3 0xE7 0xFF 0xFF ). {{..:media:deathkeep:openingdoor3.png?nolink&300x308}} Pattern 6. Opening door, frame 3 ( 0x81 0x81 0x81 0x81 0x81 0xC3 0xFF 0xFF ). {{..:media:deathkeep:corner.png?nolink&300x308}} Pattern 7. Corner ( 0x80 0xC0 0xE0 0xF0 0xF8 0xFC 0xFE 0xFF ). {{..:media:deathkeep:openingframe.png?nolink&300x308}} Pattern 8. Opening frame (0 0 0x78 0 0xF0 0xE8 0 0xB4 ). All patterns used in the game see table below. ^Bytes (HEX)^^^^^^^^Description| |FF|FF|FF|FF|FF|FF|FF|FF|Closed door| |C3|C3|C3|C3|C3|C3|C3|FF|Opening type 1| |81|81|81|81|81|81|81|FF|Opening type 2| |FF|3F|0F|03|0|0|0|0|Ramp low| |FF|FF|FF|FF|FF|3F|0F|03|Ramp high| |FF|FF|81|81|C3|E7|FF|FF|Triangle window| |81|81|81|81|81|81|C3|FF|Opening with thick sides| |FF|FF|FF|FF|C3|C3|C3|FF|Window in the upper part| |FF|FF|81|81|81|99|99|FF|Double window type 1| |C3|C3|C3|C3|C3|C3|FF|FF|Opening type 3| |C0|C0|C0|C0|E0|F0|FF|FF|Half of the arch| |F8|F8|F8|F8|F8|F8|FF|FF|Opening single-door| |C0|C0|C0|C0|C0|C0|FF|FF|Opening single-door| |C3|C3|C3|C3|C3|C3|C3|FF|Narrow opening| |FF|FF|FF|C3|C3|C3|C3|FF|Double window type 2| |C3|C3|C3|C3|C3|E7|FF|FF|Opening| |FF|FF|99|99|99|99|FF|FF|Double narrow window| |FF|FF|C3|C3|C3|E7|FF|FF|Arch window| |FF|FF|81|81|81|FF|FF|FF| | |F0|F0|F0|F0|FF|FF|FF|FF|Half of the arch| |FF|C3|C3|C3|C3|C3|C3|FF| | |FF|FF|A5|A5|A5|A5|FF|FF|Triple window| |F0|F0|F0|F0|F0|F0|F0|F0|Window with side column| |FF|FF|FF|E7|E7|FF|FF|FF|Hole in the center| |0|0|0|0|0|0|C3|FF|Arch on the top. Without side collisions| |E7|E7|E7|E7|E7|E7|E7|FF|Opening double door| |C3|C3|C3|C3|C3|C3|C3|FF|Opening double door| |81|81|81|81|81|81|C3|FF|Opening double door| |FF|C3|81|81|81|81|C3|FF|Big hole| **B.2) Block 1** \\ Block 1 has constant size of 0x300 and consist of 3 equal parts. Part 1 (size = 0x100) is for backgrounds, Part 2 is for wall animation offsets, Part 3 is for repeated animation? (torches, reflections on the walls). Wall texture ID is linked to the Part 1(2, 3) offsets. If offset = 0, wall texture has no texture ID override or animation.\\ Block 1 has the following structure: ^Offset (HEX)^Length (HEX)^Description| |0|0x100|Part 1| |0x100|0x100|Part 2| |0x200|0x100|Part 3| 1) Game engine looks to Part 1 offset = Texture ID. Value at this offset = texture ID override. It means that this new texture will draw instead of previous one. 2) Game engine looks to Part 2 offset = Texture ID. Value at this offset = Block 2 offset. Part 2 is for single use animation (like doors). 3) Game engine looks to Part 3 offset = Texture ID. Value at this offset = Block 2 offset. Part 3 is for repeated animations (like torches reflections). **B.3) Block 2** \\ Block 2 describes animation sequences texture IDs. Offsets values from Part 2 and 3 from Block 1 points to animation sequence beginning in this block. Block structure is the follows: ^Offset (HEX)^Length^Description| |0|1|Block 2 size (with this byte)| |1|1|Base (background) texture?| | |1|Key? (for doors)| | |1|0? (for doors), First frame? (for animated objects)| | |1|Animation speed| | |1|Frames quantity| | |various|Texture IDs (animation sequences)| | |…|…| | |1|Base (background) texture?| | |1|Key? (for doors)| | |1|0? (for doors), First frame? (for animated objects)| | |1|Animation speed| | |1|Frames quantity| | |various|Texture IDs (animation sequences)| | |…|…| If there are no animations on the level, Block 2 structure is the follows: ^Offset (HEX)^Length (HEX)^Description| |0|1|Block 2 size in bytes (with this byte)| |1|3|0| **B.4) Block 3** \\ Block 3 is the Palette. Palette consist of 16-byte entries and each stores all texture IDs for each side of the cube, base collisions, additional collisions, floor damage flags, resting zone flags, low friction flags and textures for vertical stair’s polygons. Numeration begins from 0. Two Bytes #2, #3 (see chapter A.3, A.4) combined gives the palette #.\\ Block 3 structure is the follows: ^Offset (HEX)^Length (HEX)^Description| |0|4|Block 3 size in 16-byte entries (without this bytes)| |4|0xF|16-byte entry n| |4+0xF*1|0xF|16-byte entry n+1| |4+0xF*2|0xF|16-byte entry n+2| |…|…|…| |4+0xF*(Block 3 size)/0xF|0xF|16-byte entry n*(Block 3 size)| 16-bytes entries have the following structure: ^Byte #^Description| |1|Texture ID West| |2|Texture ID South| |3|Texture ID East| |4|Texture ID North| |5|Texture ID NW-SE (non-transparent from North)| |6|Texture ID NE-SW (non- transparent from South)| |7|Texture ID NW-SE (non- transparent from South)| |8|Texture ID NE-SW (non- transparent from North)| |9|Floor texture ID| |10|Ceiling texture ID| |11|?| |12|Textures ID for vertical stair’s polygons, Low friction, Resting, Damage| |13|?| |14|?| |15|Additional Collision. Non-visible obstacles, some thin columns inside the cube, etc.| |16|Collision| Byte #12 structure |Texture for stairs (vertical)|||||||| |Low friction|Damage (not applicable on Bonus level)|Resting (except stairs and ramps. Applies only on a flat surfaces)| | | | | | |Bit #7|Bit #6|Bit #5|Bit #4|Bit #3|Bit #2|Bit #1|Bit #0| Byte #16 collisions structure |North wall|South wall|East wall|West wall|Diag. NE-SW|Diag. NW-SE|Ceiling|Floor| |Bit #7|Bit #6|Bit #5|Bit #4|Bit #3|Bit #2|Bit #1|Bit #0| **B.5) Level entry and exit coordinates** \\ 8 bytes encoding level start and exit positions. Structure is the follows: ^Byte #^Description| |1|Start level X coordinate| |2|Start level Y coordinate| |3|Start level Z coordinate| |4|Start level rotation| |5|Exit level X coordinate| |6|Exit level Y coordinate| |7|Exit level Z coordinate| |8|Always = 0?| Level exit coordinates may be 0 when Monster is triggering exit? Rotation values range:\\ 0 = West dir, 0x40 = South dir, 0x80 = East dir, 0xC0 = North dir. Interpolation may be applied. **B.6) Block 4** \\ Block 4 stores offsets for teleports, elevators, collapsing floors and other such data type. These offsets are linked with Block 5 (see chapter B.7). Note that Byte #0 and Byte #7 (see chapter A) must be set to their corresponding values together. Block 4 starts with it’s size (4 bytes) and always equal 0x6C without this 4 bytes. All offsets in the table below starts after the block’s size. I.e. if Byte #7 and Byte #0 (see chapter A) are set, and value on offset in Block 4 is not 0, all data is located in Block 5 (see chapter B.7). Note that offset value for standart teleport in Block 4 is always 0, but teleport data may be in Block 5 (see chapter B.7). ^Offset (HEX)^Byte #7 (Chapter A)^Byte #0 (Chapter A)^Description| |0|0xE4|0x80|Standart Teleport. Works with zero byte set to 0x80 and blocks 4, 5| |0x4|0xE5|0x81| | |0x8|0xE6|0x82|Elevator down. Works with zero byte set to 0x82, blocks 4, 5 and 0xE7(0x83).| |0xC|0xE7|0x83|This cube points on cubes around elevators. Use blocks 4, 5. Works with zero byte set to 0x83. May be one cube per level, may be some of them.| |0x10|0xE8|0x84|Wall fireball trigger. Works with zero byte set to 0x84.| |0x14|0xE9|0x85|Floor flame trigger. Works with zero byte set to 0x85.| |0x18|0xEA|0x86|Ceiling fireball trigger. Wait an attack from above. Works with zero byte set to 0x86.| |0x1C|0xEB|0x87|Wall fireball trigger (blue). Works with zero byte set to 0x87.| |0x20|0xEC|0x88|Switch off the light (reduces brightness). Works with zero byte set to 0x88.| |0x24|0xED|0x89| | |0x28|0xEE|0x8A| | |0x2C|0xEF|0x8B|This cube points on some Monsters to set to active mode. Works with zero byte set to 0x8B and blocks 4, 5| |0x30|0xF0|0x8C| | |0x34|0xF1|0x8D| | |0x38|0xF2|0x8E| | |0x3C|0xF3|0x8F| | |0x40|0xF4|0x90| | |0x44|0xF5|0x91| | |0x48|0xF6|0x92| | |0x4C|0xF7|0x93| | |0x50|0xF8|0x94| | |0x54|0xF9|0x95|Elevator related DOWN. Works with zero byte set to 0x95, blocks 4, 5 and 0xE7 (0x83). Byte #0 (see chapter A) in all cubes along the elevator’s way must be set to 0x10. Platform returns up?| |0x58|0xFA|0x96|Elevator UP. Works with zero byte set to 0x96, blocks 4, 5 and 0xE7(0x83). Поднимается снизу наверх. Byte #0 (see chapter A) in all cubes along the elevator’s way must be set to 0x10. Platform returns down.| |0x5C|0xFB|0x97|Elevator DOWN. Works with zero byte set to 0x97, blocks 4, 5 and 0xE7(0x83). Byte #0 (see chapter A) in all cubes along the elevator’s way must be set to 0x10.| |0x60|0xFC|0x98| | |0x64|0xFD|0x99| | |0x68|0xFE|0x9A| | **B.7) Block 5** \\ Block 5 contains all special events logic (teleports, elevators, wall and ceiling triggers, etc.). All data in this block is linked with Block 4 offsets (see chapter B.6). If there are no data for block 5 (block is missing), Block 5 is 4 bytes length and = 4. In order to be working, Byte #0 and Byte #7 must be set (see chapter A). ^Offset (HEX)^Length, bytes (HEX)^Description| |-|4|Block 5 size (without these bytes)| |0|1|Teleports or elevators quantity (or other types quantity)| |1|3|Teleport or elevator or other entrance (trigger) (X, Y, Z)| |4|1|Delimiter (always = 1 for teleports type). In other cases = number of dependent cubes.| |5|3 x n|Teleport exit (X, Y, Z) or dependent cubes (3xn) for other types. n = number of dependent cubes. n=1 for teleports, because teleport has only one dependent cube (exit).| |5+ 3 x n|3|Next teleport or elevator or other entrance (trigger) (X, Y, Z)| | |1|Next delimiter (always = 1 for teleports type). In other cases = number of dependent cubes.| | | |…| If dependent cube is an another trigger, this new trigger will be activated instead of the first triggering cube (non-teleport related). **C) ANIMBACK** \\ These objects appear in the cube then value on corresponding offsets in Block 1 (see chapter B.2) is not zero. ANIMBACK are usually animated objects which have no collision and may resides always near walls (torches, flames, huge challises etc…) and in the cube’s center (sparkles, hanging objects, candelabras, etc…). May be only two different ANIMBACK object types per level. Some these objects may be observed in 3D in game. These objects may be attached to the top or to the bottom of the cube.\\ I didn’t dive deeply into the investigation for this type of objects, because it wasn’t necessary for building a 3D model, which was my primary objective. Object’s structure is fairly investigated, but the base is clear. ^Offset (HEX)^Length, bytes (HEX)^Description| |0|4|1| |4|4|Header size in bytes| |8|1|Bytes left before “ANIM” header?| |9|1|Frames quantity| |0xA|1|?| |0xB|1|?| |0xC|1|Animation speed? Frames selection?| |…|…|…| | |4|“ANIM” section size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| **D) ANIMENEMIES** \\ This objects placed in level are monsters. Enemy placement encoded in Byte #7 (see chapter A.8). May be three of monster types per level maximum. I also didn’t investigate this objects deeply. Object’s structure is shown below. ^Offset (HEX)^Length (HEX)^Description| |0|4|Monster types quantity| |4|4|Header size in bytes| |8|1|Offset to monster’s name| |9|1|0?| |0xA|1|?| |0xB|1|?| |0xC|1|Animation speed| |0xD|1|Z coordinate. Loading at this altitude in the level cube| |0xE| |Transparency or translucency| |0xF| |Z coordinate. While walking| |0x10| |?| |0x11| |?| |0x12| |?| |0x13| |Z coordinate. Walking coordinate? Attacking coordinate?| |0x14| |?| |0x15| |?| |0x16| |?| |0x17| |?| |0x18| |?| |0x19| |?| |0x1A| |?| |0x1B| |?| |0x1C| |?| |0x1D| |Health? Armor?| |0x1E| |?| |0x1F| |?| |0x20| |?| |0x21| |?| |0x22| |?| |0x23| |Health| |0x24| |Speed| |0x25| |?| |0x26| |First frame ID?| |0x27| |?| |0x28| |First attacking frame ID?| |0x29| |Frame ID?| |0x2A| |Frame ID?| |0x2B| |Frame ID?| |0x2C| |Frame ID?| |0x2D| |Frame ID?| |0x2E| |Frame ID?| |…| |….| | |4|“ANIM” section size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| **E) ANIMOBJ** \\ This objects are for level decoration (stalactites, stalagmites, standalone columns, tables, fountains, graves, hanging skeletons, gargoyles, debris, etc…). Object placement encoded in Byte #7 (see chapter A.8). May be four of these object types per level maximum. Object may be observed as 3D in the game. No deep investigation also, sorry. ^Offset (HEX)^Length (HEX)^Description| |0| |Object types quantity available| |4| |Header size in bytes| |8| |?| |9| |Frames quantity| |0xA| |?| |0xB| |?| |0xC| |Animation speed| |0xD| |Z coordinate| |0xE| |Transparency. 0-No transparency, > 0 - more transparency …… To black non-transparency| |0xF| |0?| |0x10| |0| |0x11| |Collision (=4 only?)| |…| |…| | |4|“ANIM” section size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| **F) OBJECTS** \\ These objects are unique items which could be found on a level (Keys, Ancestral Artefacts, Feast, etc…). Object placement encoded in Byte #7 (see chapter A.8). May be three or four of these object types per level maximum. In some levels 4th object exist in level file, but kind of ‘blank’. Object may be observed as plain texture in the game. No deep investigation also, sorry. ^Offset (HEX)^Length (HEX)^Descripton| |0|4|Object types quantity available| |4|1|Item ID (see Byte #7 in chapter A.8)| |5|1|0| |6|1|0| |7|1|Header size in bytes| |8|1|Offset to object’s name| |9|1|Frames quantity| |0xA|1|?| |0xB|1|?| |0xC|1|Animation speed| |0xD|1|Z coordinate| |0xE|1|Transparency. 0-No transparency, > 0 - more transparency …… To black non-transparency| |0xF|1|0?| |0x10|1|0| |0x11|1|0?| |0x12|1|?| |0x13|1|?| |0x14|1|?| |0x15|1|?| |0x16|1|?| |0x17|1|?| |0x18|1|?| |0x19|1|?| |0x1A|1|?| |0x1B|1|Item ID again (see Byte #7 in chapter A.8)| |0x1C|1|?| |0x1D|1|?| |0x1E|1|?| |0x1F|1|?| |0x20|1|?| |0x21|various|Object’s name| | |4|“ANIM” section size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| **G) END OF FILE** \\ End of the file mark (-1) is located after objects block (see chapter F). After this mark level name follows. ^Offset (HEX)^Length^Description| |0|4|0xFFFFFF| |4|various|Level name| | |1|0x20 (dot)| **H) GLOBAL DATA FILES** (\data2\DK Data*)\\ This three files contains all item textures (also small item textures in inventory), explosions animations, weapons animations, inventory backgrounds and huge amount of unknown data.\\ File structure is the follows. ^Offset (HEX)^Length, bytes (HEX)^Descripttion| |0|0xD0|Character name and default skills| |0xD0|4|Block 1 size in bytes including this 4 bytes| | |various|Block 1| | |4|‘APPL’ identifier string| | |4|Block 2 size in bytes including this 4 bytes| | |various|Block 2| | |4|‘APPL’ identifier string| | |4|Block 3 size in bytes including this 4 bytes| | |various|Block 3| | |4|‘APPL’ identifier string| | |4|Block 4 size in bytes including this 4 bytes| | |various|Block 4| | |4|‘APPL’ identifier string| | |4|Block 5 size in bytes including this 4 bytes| | |various|Block 5| | |4|‘APPL’ identifier string| | |4|Block 6 size in bytes including this 4 bytes| | |various|Block 6| | |4|‘APPL’ identifier string| | |4|Block 7 size in bytes including this 4 bytes| | |various|Block 7| | |4|‘APPL’ identifier string| | |4|0x63 for DK Data 1 file, 0x64 for DK Data 2 file, 0x69 for DK Data 3 file| | |4|Item ID or index # (zero-length header)| | |4|“ANIM” size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| | | |…| | |1|Item ID or index # (zero-length header)| | |4|“ANIM” size in bytes| | |4|‘ANIM’ identifier string| | |various|“ANIM” data| | |4|“ANIM” or “CCB” header size in bytes| | |1|If equal to zero, item’s texture is below. If not, take texture from this item’s ID| | |1|0| | |1|Item ID| | |4|“ANIM” or “CCB” size in bytes| | |4|‘ANIM’ or ‘CCB’ identifier string| | |various|“ANIM” or ‘CCB’ data| **I) SAVEFILE STRUCTURE** \\ Savefile size is 356 bytes. I tried a lot of tests and now I know some bytes are used for. Some bytes have secondary meaning, may be character dependent. I made a table with all investigated data. Each cell is a byte. Number of columns and rows are equal to HEX-editor in GameGuru. |— |— |— |— |— | Savegame slot # minus 1 |— |— | |— |— |— |— |— |— |— |— | |— |— | Difficulty 0 - 2 | Level# |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | | Character Name | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx |— | Character specs. Str, Int, Wis, Dex, Con |— | xxx | xxx | | xxx | xxx | xxx |Health current |— |— |— |— | |— |— |— |Health Max |Fighter at level #. Text description on the loading screen |Arrows quantity |Food. 0xFF max |— | |— |Character level |— |— | Experience. 0x7F FF FF FF max | xxx | xxx | xxx | | Experience (spells?). 0x7F FF FF FF max (?) | xxx | xxx | xxx |— |— |— |— | |— |— |— |— |— |— |— |Level completition (time). 0 = infinite. Max - 0xFF (10 seconds) | | Hands and wearable. Non-predictable??? | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | Backpack ???? (low priority with non-predictable items in) | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx |— |— |— | |— |— |— |— | Armor, Burning hands, Magic missile | Melf's Acid arrow, Improved identify, Ray of enfeeblement | Fireball, Fly, Lightning bolt | Fear, Ice storm, Stoneskin | | Cone of cold, Feeblemind, Hold monster | Death fog, Disintegrate, True Seeing | Acid storm | Abi-Dolzin's Horrid Wilting | Meteor Swarm |— |— |— | |— | (All red in these bytes nearby are Ability Powerups also) Armor | Storm Giant Strength | Hill Giant Strength | Fly | True Seeing | Speed | Invulnerability | | 0-0xFF Invisibility | Protection from Acid | Protection from Cold | Protection from Electricity | Protection from Fire | Protection from Gas | Protection from Magic | Protection from Poison | | Heroism | Super Heroism |— |Artefacts |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— |— |— |— |— |— | |— |— |— | Left hand (4 cells up) | Left hand (3 cells up) | Left hand (2 cells up) | Left hand (1 cell up) | Left hand (active) | | Right hand (4 cells up) | Right hand (3 cells up) | Right hand (2 cells up) | Right hand (1 cell up) | Right hand (active) |Body |Hands |Ring #1 | |Ring #2 |Boots |Amulet |Head | Backpack items IDs (high priority) Upper left corner | xxx | xxx | xxx | | Lowest left corner | Second column. Upper | xxx | xxx | xxx | xxx | 3rd column upper | xxx | | xxx | xxx | xxx | 4th column upper | xxx | xxx | xxx | xxx | | Left hand item charges quantity *2 (4 up) | Left hand item charges quantity *2 (3 up) | Left hand item charges quantity *2 (2 up) | Left hand item charges quantity *2 (1 up) | Left hand item charges quantity *2 (Lighting orb) (Bottom, active) | Right hand item charges quantity *2 (4 up) | Right hand item charges quantity *2 (3 up) | Right hand item charges quantity *2 (2 up) | | Right hand item charges quantity *2 (1 up) | Right hand item charges quantity *2 (Lighting orb) (Bottom, active) | If ==1, character is wearing it. Armor |Gauntlets |Ring low |Ring upper |Boots on the Character (==1) | Amulet | | Helm | Backpack items charges | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | Wearable. Additional specs, weight, etc… | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | Backpack. Additional specs for items. 40 == normal item. 43 == item with specs +3 | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx | xxx | xxx | xxx | xxx | xxx | xxx | | xxx | xxx |Zero |Zero |Not a byte |Not a byte |Not a byte |Not a byte | Bytes for pells for Fighter/Mage occupies these bytes: Armor, Burning hands, Magic missile Melf's Acid arrow, Improved identify, Ray of enfeeblement Fireball, Fly, Lightning bolt Fear, Ice storm, Stoneskin\\ Cone of cold, Feeblemind, Hold monster Death fog, Disintegrate, True Seeing Acid storm Abi-Dolzin's Horrid Wilting Meteor Swarm Artefacts byte and its possible values with marked artefacts colors avalable in inventory: ^Artefacts colors^^^Value (HEX)| |Red available|Green available|Blue available|0xF, 0xE| | |Green available|Blue available|0xD, 0xC| |Red available| |Blue available|0xB, 0xA| | | |Blue available|0x9, 0x8| |Red available|Green available| |0x7, 0x6| | |Green available| |0x5, 0x4| |Red available| | |0x3, 0x2|