Ark: Survival Evolved Save Format

This wouldn't have been possible without the amazing work by ark-mod and Qowyn. This would not have been thinkable without them.

This document is first laid out with objects that I will be referring to, then the file format. All values read are little endian.

Getting Started

C:\Program Files (x86)\Steam\steamapps\common\ARK\ShooterGame\Saved\SavedArks\{map}.ark

Objects

Object Ark Class Name

Ark class names are strings stored in a special way to save space. In order to read class names, you'll need to have read the binary class name table data table. You already did this if you're following the .ark file object. To begin, read two integers... Use Type Length Notes ID Int32 4 bytes The index to load from in the binary name table array. Index Int32 4 bytes A unique index for this classname. You can find the classname string by reading from this location in the binary name table you read with the binary class name table data.

Object .Ark File

This object is the entire .Ark file used to save the majority of the map content. Make sure you follow all the instructions! The first object in the .Ark file is the Ark File Header object. The save version in this file determines a lot of the file. This documentation is mostly only targetting the latest version, 9. You should read this first. After reading the file header, the next section will be the array of binary data names (such as "Extinction", "C1_Far", "C2_Far"). These are important to Ark, but not so much to you. The first map will always be the map name (Extinction, Aberration). The next data you should read is the binary class name table data. This data is incredibly important and is required to read GameObjects. First, you should save your current position in the stream, jump to the Name Table Offset offset specified in the header, read the table, and jump back here. The next data to read is the embeded binary data array. You should read this as an array. I don't know what this data is, and it doesn't exist in any of my Ark saves. It's likely the array length will be zero. Use Type Length Notes Array length Int32 4 bytes Number of entries in the array. [Begin Array] Embeded Binary Data embeded binary data Unknown Embeded binary data at this index. The next data in the file is unknown, but we know how to skip it. You should save it anyways in case Ark needs it to save back to a file. This is an array of some flags. Follow the following info to identify it. Use Type Length Notes Array length Int32 4 bytes Number of entries in the array. [Begin Array] Unknown Flags Int32 4 bytes Some unknown data. Unknown Object Count Int32 4 bytes Some unknown data. Unknown Name String string Unknown Some unknown data. The following data is a array for the basic GameObject information. Read as a standard array. Use Type Length Notes Array length Int32 4 bytes Number of entries in the array. [Begin Array] GameObject information GameObject Base Unknown The basic GameObject data. Once this data is read, you must jump to each of the property offsets in the GameObjects. To do this, loop through each of the GameObjects, take their "Properties Offset" data, and add the Properties Block Offset offset offered in the header. Once you're there, read the GameObject Properties data.

Object Ark Location Data

Stores some floats for the x, y, z, pitch, yaw, and roll position data. Use Type Length Notes X Position Float 4 bytes X position of the actor. Y Position Float 4 bytes Y position of the actor. Z Position Float 4 bytes Z position of the actor. Pitch Float 4 bytes Pitch of the actor. Yaw Float 4 bytes Yaw of the actor. Roll Float 4 bytes Roll of the actor.

Object Binary Class Name Table

The binary class name table is a very important table introduced in save version 6. It "links" classname IDs to their strings to save space. You won't be able to read anything without this table! You should loop through this string array and respect the order it is saved in. Ark indexes this array with a 1-based integer, rather than a 0-based integer as standard. To read this array, you'll have to jump to the offset provided in the header file. Jump to the Name Table Offset offset provided in the header and begin reading in this format. Use Type Length Notes Array length Int32 4 bytes Number of entries in the array. [Begin Array] Class Name string Unknown Name of the class name at that index.

Object Boolean

The Ark boolean is saved in a very gross way. Booleans are stored as Int32 integers. If the integer is 1, return true. If the integer is 0, return false. If the integer is not one of these values, data has not been read correctly.

Object Embeded Binary Data

The meaning of this data is unknown, and it does not appear in any of my Ark save files. To begin reading, read a string name. Next, read the number of parts in the array upcoming as an Int32. You should initialize a byte array that is three arrays deep (for example, byte[][][] ). In each of these parts, follow this data format. Use Type Length Notes Blob Count Int32 4 bytes Number of blobs in this part. [Begin Array] Blob Size Int32 4 bytes Number of integers and not bytes in a nested array. [Array] Nested Integer Array Int32 array above * 4 Array of Int32. Use above for number of Int32s. Here's some example code:

Object Binary Data Names

This is a simple string array that contains all of the map parts (for example, "Extinction", "C1_Far", "C2_Far"). This isn't too important when reading, but the game requires it. The first value will always be the map name (Extinction, Aberration). Use Type Length Notes Array length Int32 4 bytes Number of entries in the array. [Begin Array] Map Part Name string Unknown Name of the map part.

Object Ark File Header

This is the first part of the header. Everything in this header varies from the game version, which is an Int16 read in at the beginning of the file. We'll read that before anything else. Use Type Length Notes Save Version Int16 2 bytes This version number changes everything in the header. Read below. Version 5 Version 5 contains the least amount of data. This only contains the game time. Use Type Length Notes Game Time Float 4 bytes In game clock. Version 6 Use Type Length Notes Name Table Offset Int32 4 bytes The offset to the name table from the start of the file. Properties Block Offset Int32 4 bytes The offset to the properties block from the start of the file. Game Time Float 4 bytes In game clock. Versions 7 and 8 Use Type Length Notes Binary Data Offset Int32 4 bytes Offset to the binary table from the start of the file. Unknown Int32 4 bytes Unknown Name Table Offset Int32 4 bytes The offset to the name table from the start of the file. Properties Block Offset Int32 4 bytes The offset to the properties block from the start of the file. Game Time Float 4 bytes In game clock. Version 9 Version 9 is the latest format and what this documentation is mostly based off of. Use Type Length Notes Binary Data Offset Int32 4 bytes Offset to the binary table from the start of the file. Unknown Int32 4 bytes Unknown Name Table Offset Int32 4 bytes The offset to the name table from the start of the file. Properties Block Offset Int32 4 bytes The offset to the properties block from the start of the file. Game Time Float 4 bytes In game clock. Unknown Int32 4 bytes Unknown

Object GameObject Base

This is the basic data for Ark GameObjects. GameObjects contain almost all of the content in the save game, from dinosaurs to AI. There is a table near the beginning of the file with this data. At the end of this content, there is a pointer to the property data for this GameObject. The property info will contain other content GameObjects store that does not fit into the parameters below. Use Type Length Notes GUID UInt128 16 bytes The (overkill) GUID for this object. Appears not to be unique! Class Name ark class name 8 bytes The classname for this GameObject. Is Item? boolean 4 bytes Is this an item? (Comment) Below is the array of Ark names. I'm not sure what makes this special, but they contain standard ark class names. Ark Class Name Array Length Int32 4 bytes Length of the upcoming ark class name array. [Begin Array] Class Name ark class name 8 bytes Push this to the array. Unknown boolean 4 bytes Some unknown boolean. Unknown Int32 4 bytes Some unknown integer. Does location data exist? boolean 4 bytes Check if the location data vector exists. (Comment) IMPORTANT: The location data below exists ONLY if the above boolean was true. Position Data ark location data 24 bytes The location data ONLY if the above boolean was true. Properties Offset Int32 4 bytes The offset from the Properties Block Offset location in the header. Unknown Int32 4 bytes An integer that always appears to be 0.

Object GameObject Properties

This isn't written yet. These things make me want to pull my hair out. Tomorrow afternoon?

Object String

Length: >5 bytes This is the format that all strings are stored in this file. All strings are null-terminated and start with a Int32 to specify the length. Use Type Length Notes Upcoming string length Int32 4 bytes Includes the null-terminating byte. Will always be >=1. String data Text Above-1 The actual text data, not including null-terminating byte. Terminating byte byte 0x00 1 The null-terminating byte.

Jump Back

To get going, you should first read in the .Ark file by clicking here . This file is located at