Crate serde_gff

Source
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§

de
Десериализатор для формата Bioware GFF (Generic File Format)
error
Реализация структуры, описывающей ошибки кодирования или декодирования GFF
header
Содержит описания структур заголовка GFF файла
index
Содержит описание структур-индексов различных данных в GFF файле
parser
Реализация потокового парсера GFF файла. См. описание структуры Parser
raw
Вспомогательный модуль, содержащий описание структур, непосредственно хранимых в GFF файле на диске. Обычно нет необходимости использовать данный модуль – он может понадобиться только при отладке
ser
Сериализатор для формата Bioware GFF (Generic File Format)
value
Содержит описания значений, которые может хранить GFF файл

Structs§

Label
Описание названия поля структуры GFF файла. GFF файл состоит из дерева структур, а каждая структура – из полей с именем и значением. Имена полей представлены данной структурой
LocString
Локализуемая строка, содержащая в себе все данные, которые могут храниться в GFF файле. Может содержать логически некорректные данные, поэтому, если не требуется анализировать непосредственное содержимое GFF файла без потерь, лучше сразу преобразовать ее в GffString, используя into(), и работать с ней.
ResRef
Представляет ссылку на игровой ресурс, которым может быть шаблон объекта
StrRef
Индекс в файле dialog.tlk, содержащий локализованный текст
StringKey
Ключ, используемый для индексации локализуемых строк во внутреннем представлении строк (когда строки внедрены в GFF файл, а не используются ссылки на строки в TLK файле).
SubString
Часть локализованной строки, хранящая информацию для одного языка и пола

Enums§

Gender
Виды пола персонажа, на которых могут храниться локализованные строки в объекте LocString
GffString
Локализуемая строка, представленная в виде, в котором некорректные значения непредставимы.
Language
Виды языков, на которых могут храниться локализованные строки в объекте LocString