Expand description
Реализация парсера файлов формата Bioware GFF, используемых в играх на движке Aurora (Neverwinter Nights, The Witcher) и в игре Neverwinter Nights 2.
Формат имеет некоторые ограничения:
- элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
- имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
- то же самое касается ключей карт. Кроме того, ключами могут быть только строки (
&str
илиString
)
§Пример
use std::f32::consts::PI;
use std::f64::consts::E;
use std::io::Cursor;
use serde::{Serialize, Deserialize};
use serde_gff::de::Deserializer;
use serde_gff::ser::to_vec;
use serde_gff::value::Value;
#[derive(Debug, Serialize, Deserialize)]
struct Item { u8: u8, i8: i8 }
#[derive(Debug, Serialize, Deserialize)]
struct Struct {
f32: f32,
f64: f64,
#[serde(with = "serde_bytes")]
bytes: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
#[allow(non_snake_case)]
struct Test {
u16: u16,
i16: i16,
u32: u32,
i32: i32,
u64: u64,
i64: i64,
string: String,
Struct: Struct,
list: Vec<Item>,
}
fn main() {
let data = Test {
u16: 1, i16: 2,
u32: 3, i32: 4,
u64: 5, i64: 6,
string: "String".into(),
Struct: Struct { f32: PI, f64: E, bytes: b"Vec<u8>".to_vec() },
list: vec![
Item { u8: 7, i8: -8 },
Item { u8: 9, i8: -10 },
],
};
let mut vec = to_vec((*b"GFF ").into(), &data).expect("can't write data");
// Важный нюанс - не забыть, что создание десериализатора читает заголовок и возвращает
// Result, а не сам десериализатор, поэтому требуется распаковка результата
let mut de = Deserializer::new(Cursor::new(vec)).expect("can't read GFF header");
let val = Value::deserialize(&mut de).expect("can't deserialize data");
println!("{:#?}", val);
}
Modules§
- Десериализатор для формата Bioware GFF (Generic File Format)
- Реализация структуры, описывающей ошибки кодирования или декодирования GFF
- Содержит описания структур заголовка GFF файла
- Содержит описание структур-индексов различных данных в GFF файле
- Реализация потокового парсера GFF файла. См. описание структуры
Parser
- Вспомогательный модуль, содержащий описание структур, непосредственно хранимых в GFF файле на диске. Обычно нет необходимости использовать данный модуль – он может понадобиться только при отладке
- Сериализатор для формата Bioware GFF (Generic File Format)
- Содержит описания значений, которые может хранить GFF файл
Structs§
- Описание названия поля структуры GFF файла. GFF файл состоит из дерева структур, а каждая структура – из полей с именем и значением. Имена полей представлены данной структурой
- Локализуемая строка, содержащая в себе все данные, которые могут храниться в GFF файле. Может содержать логически некорректные данные, поэтому, если не требуется анализировать непосредственное содержимое GFF файла без потерь, лучше сразу преобразовать ее в
GffString
, используяinto()
, и работать с ней. - Представляет ссылку на игровой ресурс, которым может быть шаблон объекта
- Индекс в файле
dialog.tlk
, содержащий локализованный текст - Ключ, используемый для индексации локализуемых строк во внутреннем представлении строк (когда строки внедрены в GFF файл, а не используются ссылки на строки в TLK файле).
- Часть локализованной строки, хранящая информацию для одного языка и пола
Enums§
- Виды пола персонажа, на которых могут храниться локализованные строки в объекте
LocString
- Локализуемая строка, представленная в виде, в котором некорректные значения непредставимы.
- Виды языков, на которых могут храниться локализованные строки в объекте
LocString