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 файл состоит из дерева структур, а каждая структура – из полей с именем и значением. Имена полей представлены данной структурой
Локализуемая строка
Представляет ссылку на игровой ресурс, которым может быть шаблон объекта
Индекс в файле dialog.tlk, содержащий локализованный текст
Часть локализованной строки, хранящая информацию для одного языка и пола

Enums

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