Crate serde_gff

source ·
Expand description

Реализация парсера файлов формата Bioware GFF, используемых в играх на движке Aurora (Neverwinter Nights, The Witcher) и в игре Neverwinter Nights 2.

Формат имеет некоторые ограничения:

  • элементами верхнего уровня могут быть только структуры или перечисления Rust в unit или struct варианте
  • имена полей структур не должны быть длиннее 16 байт в UTF-8. При нарушении при сериализации будет ошибка
  • то же самое касается ключей карт. Кроме того, ключами могут быть только строки (&str или String)

Пример

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_bytes;
extern crate serde_gff;

use std::f32::consts::PI;
use std::f64::consts::E;
use std::io::Cursor;
use serde::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