TKViewer
TKViewer copied to clipboard
NexusTK DAT Object Viewer
TKViewer
NexusTK Resource Viewer for EPF and related files.
Quickstart
IntelliJ is recommended for development, but you should be able to build with just Java 8+ and Maven:
Building TKViewer with Maven:
$ mvn clean install
$ (cd tk-viewer; mvn clean package)
- Output is stored in
target/
Run TKViewer with:
java -jar tk-viewer/target/tk-viewer*.jar
Building TKPartPicker with Maven:
$ mvn clean install
$ (cd tk-partpicker; mvn clean package)
Run TKPartPicker with:
java -jar tk-viewer/target/tk-partpicker*.jar
FileReader Classes
-
File Structures
- CMP
- DAT
- DNA
- DSC
- EPF
- FRM
- MAP
- PAL (Single)
- PAL (Packed)
- TBL (Tiles)
- TBL (Static Objects)
File Structures
CMP
- Note: The tile structures are compressed with zlib in the CMP format - it must be inflated!
short width (2 bytes) # width of the map (in tiles)
short height (2 bytes) # height of the map (in tiles)
tile[width * height] tiles (width * height * 4 bytes) # list of tile structures (zlib compressed)
typedef struct {
short abTileId (2 bytes) # ground tile frame index (Tile/Tbl)
short passableTile (2 bytes) # passable tile flag
short sObjTileId (2 bytes) # static object index (TileC/SObjTbl)
} tile (6 bytes)
DAT
int file_count (4 bytes) # file count + 1 (decrement for file count)
file[file_count] files ((file_count * file_size) bytes) # list of file structures
byte[] file_data # binary data of all files (head-to-tail)
typedef struct {
int data_location (4 bytes) # index of 'file_data' for the start of this file
byte[13] file_name (13 bytes) # the file name (UTF-8 padded - 13 bytes)
} file (17 + size bytes)
DNA
int mob_count (4 bytes) # number of mobs in file
mob[mob_count] mobs (mob_count * mob_size bytes) # list of mob structures
typedef struct {
int frame_index (4 bytes) # frame index of mob
byte chunk_count (1 byte) # number of chunks in mob
byte unknown1 (1 byte) # unknown id/flag (1)
short palette_index (2 bytes) # palette index of mob
chunk[chunk_count] chunks (chunk_count * chunk_size bytes) # list of chunk structures
} mob (8 + (chunk_count * chunk_size) bytes)
typedef struct {
short block_count (2 bytes) # block count of chunk
block[block_count] blocks (block_count * block_size bytes) # list of block structures
} chunk (2 + (block_count * block_size) bytes)
typedef struct {
short frame_offset (2 bytes) # offset from frame_index in chunk
short duration (2 bytes) # amount of time to play the frame
short unknownId1 (2 bytes) # normally -1, only has real values
in death animations for 2 mobs
byte transparency (1 bytes) # transparency
byte unknownId2 (1 byte) # unknown id/flag (5)
byte unknownId3 (1 byte) # unknown id/flag (5)
} block (9 bytes)
DSC
byte[15] header (15 bytes) # PartDescription (literal)
byte[7] null (7 bytes) # unknown null bytes (1)
byte unknown1 (1 byte) # unknown id/flag (2)
int part_count (4 bytes) # number of parts
part[part_count] parts (part_count * part_size bytes) # list of part structures
typedef struct {
int id (4 bytes) # id of the part
int palette_id (4 bytes) # palette index of the part
int frame_index (4 bytes) # first frame index of the part
int frame_count (4 bytes) # number of sequential frames after frame_index
byte unknown2 (1 byte) # unknown id/flag (3)
int unknown3 (4 bytes) # unknown id/flag (4)
byte unknown4 (1 byte) # unknown id/flag (5)
int unknown5 (4 bytes) # unknown id/flag (6)
int unknown6 (4 bytes) # unknown id/flag (7)
int chunk_count (4 bytes) # number of chunks
chunk[chunk_count] chunks (chunk_count * chunk_size bytes) # list of chunk structures
} part (34 + (chunk_count * chunk_size) bytes)
typedef struct {
int id (4 bytes) # id of the chunk
int unknown (4 bytes) # unknown id/flag (1)
int block_count (4 bytes) # number of blocks
block[block_count] blocks (block_count * block_size bytes) # list of block structures
} chunk (12 + (block_count * block_size) bytes)
typedef struct {
byte id (1 byte) # id of the block
int null (4 bytes) # unknown id/flag (1)
int unknown (4 bytes) # unknown id/flag (2)
} block (9 bytes)
EPF
short frame_count (2 bytes) # number of frames in the EPF
short height (2 bytes) # height of the EPF (?)
short width (2 bytes) # width of the EPF (?)
short unknown (2 bytes) # unknown id/flag (1)
int pixel_data_length (4 bytes) # length of the pixel data
byte[pixel_data_length] pixel_data (pixel_data_length bytes) # list of pixel data bytes
frame[frame_count] frames (frame_count * frame_size bytes) # list of frame structures
typedef struct {
short top (2 bytes) # top offset of the frame (in pixels)
short left (2 bytes) # left offset of the frame (in pixels)
short bottom (2 bytes) # bottom offset of the frame (in pixels)
short right (2 bytes) # right offset of the frame (in pixels)
int pixel_data_offset (4 bytes) # index of 'pixel_data' for the start of this frame's pixel data
int stencil_data_offset (4 bytes) # index of 'pixel_data' for the start of this frame's stencil data
} frame (16 bytes)
FRM
int effect_count (4 bytes) # number of effects in FRM
int[effect_count] palette_index (effect_count * 4 bytes) # list of palette indicies for effects
MAP
short width (2 bytes) # width of the map (in tiles)
short height (2 bytes) # height of the map (in tiles)
tile[width*height] tiles (width * height * 4 bytes) # list of tile structures
typedef struct {
short ab_tile_id (2 bytes) # ground tile frame index (Tile/Tbl)
short sobj_tile_id (2 bytes) # static object index (TileC/SObjTbl)
} tile (4 bytes)
PAL (Single)
byte[9] header (9 bytes) # DLPalette # DLPalette (literal)
byte[15] unknown (15 bytes) # unknown bytes (1)
byte animation_color_count (1 byte) # number of animation colors
byte[7] unknown2 (7 bytes) # unknown bytes (2)
short[animation_color_count] (animation_color_count * 2 bytes) # list of animation colors (short)
color[256] palette (1024 bytes) # list of color structures
typedef struct {
byte red (1 byte) # red value for color
byte green (1 byte) # green value for color
byte red (1 byte) # red value for color
byte alpha (1 byte) # alpha value for color
} color (4 bytes)
PAL (Packed)
int palette_count # number of palettes in file
PAL[palette_count] palettes # list of PAL structures
typedef struct {
byte[9] header (9 bytes) # DLPalette (literal)
byte[15] unknown (15 bytes) # unknown bytes (1)
byte animation_color_count (1 byte) # number of animation colors
byte[7] unknown2 (7 bytes) # unknown bytes (2)
short[animation_color_count] (animation_color_count * 2 bytes) # list of animation colors (short)
color[256] palette (1024 bytes) # list of color structures
typedef struct {
byte red (1 byte) # blue value for color
byte green (1 byte) # green value for color
byte blue (1 byte) # red value for color
byte alpha (1 byte) # alpha value for color
} color (4 bytes)
} PAL
TBL (Effects)
int effect count (4 bytes) # number of effects in TBL
effect [effect_count] effects # list of effect structures
typedef struct {
int effect_index (4 bytes) # effect index
int frame count (4 bytes) # number of sequential frames after effect_index
byte[20] unknown # unknown bytes (1)
frame [frame_count] frames # list of frame structures
typedef struct {
int frame index (4 bytes) # start frame index for effect
int frame delay (4 bytes) # delay until next frame (milliseconds)
int pallete number (4 bytes) # palette index to use when renderer
byte[4] unknown (4 bytes) # unknown bytes (1)
}
} effect
TBL (Static Objects)
int object_count (4 bytes) # number of objects in SObj TBL
short unknown (2 bytes) # unknown short
object[object_count] (obj_count * obj_size bytes) # list of object structures
typedef struct {
int unknown (4 bytes) # unknown byte (typically 0xFFFFFFFF)
byte unknown (1 byte) # unknown byte (typically 0x00)
byte movement_directions (1 byte) # movement directions for static object (see list below)
byte tile_count (1 byte) # number of tiles in static object
short[tile_count] (tile_count * 2 bytes) # list of tile indicies for static object
} object
Note: Movement Directions appear to have 6 states:
- 0x00 (Empty)
- 0x01 (Bottom)
- 0x02 (Top)
- 0x04 (Left)
- 0x08 (Right)
- 0x0F (Full)
TBL (Tiles)
int tile_count (4 bytes) # number of tiles in TBL
tile[tile_count] tiles (tile_count * 2 bytes) # list of tile structures
typedef struct {
short palette_index (1 byte) # palette index for tile (masked)
} tile (2 bytes)
Contributors
Huge thank you to everyone who helps figure out NTK file structures:
- DDeokk
- herbert3000
- rbcastner
- SapMagic
- wattostudios
- mac