-
Notifications
You must be signed in to change notification settings - Fork 0
Radoub Formats GFF
Generic File Format - the foundation format for most Aurora Engine data files.
GFF (Generic File Format) is a hierarchical tree structure used by virtually all Aurora Engine game data. Dialog files (.dlg), creature templates (.utc), items (.uti), journals (.jrl), and dozens of other file types are all GFF files with different type signatures.
File Types Using GFF: DLG, UTC, UTI, UTP, UTD, UTE, UTT, UTS, UTW, UTM, JRL, IFO, ARE, GIT, GIC, FAC, GUI, ITP, and more.
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | char[4] | FileType (e.g., "DLG ", "UTC ", "JRL ") |
| 4 | 4 | char[4] | Version (always "V3.2") |
| 8 | 4 | uint32 | StructOffset |
| 12 | 4 | uint32 | StructCount |
| 16 | 4 | uint32 | FieldOffset |
| 20 | 4 | uint32 | FieldCount |
| 24 | 4 | uint32 | LabelOffset |
| 28 | 4 | uint32 | LabelCount |
| 32 | 4 | uint32 | FieldDataOffset |
| 36 | 4 | uint32 | FieldDataCount |
| 40 | 4 | uint32 | FieldIndicesOffset |
| 44 | 4 | uint32 | FieldIndicesCount |
| 48 | 4 | uint32 | ListIndicesOffset |
| 52 | 4 | uint32 | ListIndicesCount |
flowchart TB
Header[Header 56 bytes]
Structs[Struct Array]
Fields[Field Array]
Labels[Label Array]
FieldData[Field Data]
FieldIndices[Field Indices]
ListIndices[List Indices]
Header --> Structs
Structs --> Fields
Fields --> Labels
Labels --> FieldData
FieldData --> FieldIndices
FieldIndices --> ListIndices
Each struct is 12 bytes:
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Type (application-specific meaning) |
| 4 | 4 | uint32 | DataOrDataOffset (see below) |
| 8 | 4 | uint32 | FieldCount |
DataOrDataOffset interpretation:
-
FieldCount == 0: No fields (value ignored) -
FieldCount == 1: Direct field index -
FieldCount > 1: Byte offset into FieldIndices array
The root struct is always index 0.
Each field is 12 bytes:
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Type (see Field Types below) |
| 4 | 4 | uint32 | LabelIndex |
| 8 | 4 | uint32 | DataOrDataOffset |
DataOrDataOffset interpretation:
- Simple types (0-9): Value stored directly
- Complex types (10-15): Byte offset into FieldData
| Value | Name | Size | Storage |
|---|---|---|---|
| 0 | BYTE | 1 | Direct |
| 1 | CHAR | 1 | Direct |
| 2 | WORD | 2 | Direct |
| 3 | SHORT | 2 | Direct |
| 4 | DWORD | 4 | Direct |
| 5 | INT | 4 | Direct |
| 6 | DWORD64 | 8 | Direct* |
| 7 | INT64 | 8 | Direct* |
| 8 | FLOAT | 4 | Direct |
| 9 | DOUBLE | 8 | Direct* |
| 10 | CExoString | Variable | FieldData |
| 11 | CResRef | 1-17 | FieldData |
| 12 | CExoLocString | Variable | FieldData |
| 13 | VOID | Variable | FieldData |
| 14 | Struct | 4 | FieldData (struct index) |
| 15 | List | Variable | ListIndices |
*Note: 64-bit types store value directly but only lower 32 bits fit in DataOrDataOffset; implementations vary.
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Length |
| 4 | Length | char[] | UTF-8 string (not null-terminated) |
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 1 | byte | Length (max 16) |
| 1 | Length | char[] | ASCII resource reference |
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | TotalSize (bytes following) |
| 4 | 4 | uint32 | StrRef (0xFFFFFFFF = no TLK) |
| 8 | 4 | uint32 | SubStringCount |
| 12+ | Variable | SubString[] | Localized strings |
SubString format:
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | LanguageID (Language * 2 + Gender) |
| 4 | 4 | uint32 | StringLength |
| 8 | Length | char[] | UTF-8 string |
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Length |
| 4 | Length | byte[] | Raw binary data |
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Struct index |
DataOrDataOffset points to ListIndices array:
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | uint32 | Count |
| 4 | Count*4 | uint32[] | Struct indices |
Labels are 16-byte fixed-width fields:
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 16 | char[16] | Null-padded label text |
Maximum label length is 16 characters.
using Radoub.Formats.Gff;
var gff = GffReader.Read("mydialog.dlg");
// Access file metadata
string type = gff.FileType; // "DLG "
string version = gff.FileVersion; // "V3.2"
// Navigate structure
var root = gff.RootStruct;
var entryList = root.GetField("EntryList");
// Type-safe access
uint delay = root.GetFieldValue<uint>("DelayEntry", 0);
string text = root.GetFieldValue<CExoLocString>("Text")?.GetDefaultString();
// Iterate list
if (entryList?.Value is GffList list)
{
foreach (var entry in list.Elements)
{
// Process each struct
}
}using Radoub.Formats.Gff;
var gff = new GffFile
{
FileType = "DLG ",
FileVersion = "V3.2"
};
// Build structure
gff.RootStruct = new GffStruct { Type = 0xFFFFFFFF };
gff.RootStruct.Fields.Add(new GffField
{
Type = GffField.DWORD,
Label = "DelayEntry",
Value = 0u
});
// Write to file
GffWriter.Write(gff, "output.dlg");Radoub.Formats auto-detects label format based on section size:
- 16-byte fixed (Aurora standard)
- 18-byte length-prefixed (some tools)
- Null-terminated (rare)
- CExoString: UTF-8 with Windows-1252 fallback
- CResRef: ASCII only
- Labels: ASCII only
The reader validates:
- Header size and magic
- Version string ("V3.2" only)
- Array bounds for all offsets
- Struct/field indices within range
Page freshness: 2025-12-15
Getting Started
User Guide
Features
Help
- Manifest - Journal Editor
- Quartermaster - Creature/Inventory Editor (Coming Spring 2026)
- Fence - Merchant/Store Editor
- Trebuchet - Radoub Launcher
- Spell Check - Dictionary-based spell checking
- Token System - Dialog tokens and custom colors
Parley Internals
Manifest Internals
Quartermaster Internals
Fence Internals
Trebuchet Internals
Radoub.UI
Library
Low-Level Formats
High-Level Parsers
- JRL Format (.jrl)
- UTI Format (.uti) - Item blueprints
- UTC Format (.utc) - Creature blueprints
- UTM Format (.utm) - Store blueprints
- BIC Format (.bic) - Player characters
Original BioWare Aurora Engine file format specifications.
Core Formats
- GFF Format - Generic File Format
- KEY/BIF Format - Resource archives
- ERF Format - Encapsulated resources
- TLK Format - Talk tables
- 2DA Format - Data tables
- Localized Strings
- Common GFF Structs
Object Blueprints
- Creature Format (.utc)
- Item Format (.uti)
- Store Format (.utm)
- Door/Placeable (.utd/.utp)
- Encounter Format (.ute)
- Sound Object (.uts)
- Trigger Format (.utt)
- Waypoint Format (.utw)
Module/Area Files
- Conversation Format (.dlg)
- Journal Format (.jrl)
- Area File Format (.are/.git/.gic)
- Module Info (.ifo)
- Faction Format (.fac)
- Palette/ITP Format (.itp)
- SSF Format - Sound sets
Reference