#save #save-file #reader-writer #brick #version #compression #brs

brickadia

Brickadia BRS 存档的读取/写入保存文件

33 个版本

0.1.32 2024 年 2 月 22 日
0.1.30 2023 年 1 月 3 日
0.1.29 2022 年 12 月 26 日
0.1.26 2022 年 5 月 25 日
0.1.2 2021 年 7 月 17 日

#421编码


用于 omegga

MIT 许可证

300KB
2K SLoC

brickadia-rs

Rust 的 Brickadia 存档文件 (.brs) 读取/写入库。

支持版本 <= 10。

功能

此库作为官方支持的 brs 库的替代品,该库在编写时只能读取/写入版本 <= 4 的保存文件。

brickadia-rs 目前支持 brs 中缺少的功能,如保存预览、组件、砖块所有者等。随着 .brs 规范在未来继续变化,它也将得到维护。

Serde 支持

通过使用可选功能 serialize,您可以将数据无缝序列化/反序列化到/从 brs-js JSON 规范。

压缩后端

默认情况下,brickadia-rs 使用 flate2 的默认压缩后端,miniz_oxide,它具有纯 Rust 的优点。如果您需要额外的性能,请使用此包的 zlib-ng 功能来使用该后端。

brickadia = { version = "0.1", default_features = false, features = ["util", "zlib-ng"] }

Util 模块

可选功能 util 包括一些实用工具,如从砖块资产获取砖块大小、处理旋转和方向等。默认启用。要禁用它,请在您的 Cargo.toml 依赖项中设置 default_features = false,例如 brickadia = { version = "0.1", default_features = false }

Octree 模块

util 模块中包含一个名为 octree 的模块,它添加了一个八叉树构造函数和遍历对象,你可以将其包装在你的 SaveData 之上,从而快速遍历空间中的砖块。以下是一些示例用法。

// ... assume we have a `SaveData` named `save`
let octree = SaveOctree::new(save); // or `save.into_octree();`

// find the first brick that has a color of (0, 0) in the palette
let base_brick = octree.data().bricks.iter().find(|b| b.color == BrickColor::Index(0)).unwrap();

// fetch a list of bricks above it
let bricks_above = octree.brick_side(base_brick, Direction::ZPositive);

安装

将以下内容添加到你的 Cargo.toml 的依赖项中

brickadia = "0.1"

用法

读取

以下将读取文件 my_brs_file.brs 并显示砖块计数、地图以及每个砖块的位置。

use std::fs;

use brickadia::read::SaveReader;

fn main() {
    let mut reader = SaveReader::new(fs::File::open("my_brs_file.brs").unwrap()).unwrap();
    let save = reader.read_all().unwrap();

    println!("Brick count: {}", save.header1.brick_count);
    println!("Map: {}", save.header1.map);

    for brick in save.bricks.iter() {
        println!("There's a brick at {}.", brick.position);
    }
}

写入

以下将创建一个 10x10 的网格砖块并将其保存到 brickadia-rs.brs

use std::{env, fs::File};

use brickadia::{
    save::{Brick, BrickColor, BrickOwner, Color, Preview, SaveData, Size, User},
    write::SaveWriter,
};

fn main() {
    let me = User {
        name: "x".into(),
        id: "3f5108a0-c929-4e77-a115-21f65096887b".parse().unwrap(),
    };

    let mut save = SaveData::default();

    // set the first header
    save.header1.author = me.clone();
    save.header1.host = Some(me.clone());
    save.header1.description = "This was saved with brickadia-rs!".into();

    // set the second header
    save.header2
        .brick_owners
        .push(BrickOwner::from_user_bricks(me.clone(), 100));

    // set the preview image
    let preview_bytes = std::fs::read("examples/write_preview.png").unwrap();
    save.preview = Preview::PNG(preview_bytes);

    // add some bricks
    for y in 0..10 {
        for x in 0..10 {
            let mut brick = Brick::default();
            brick.position = (x * 10, y * 10, 10);
            brick.size = Size::Procedural(5, 5, 6);
            brick.color = BrickColor::Unique(Color {
                r: (x as f32 / 10.0 * 255.0) as u8,
                g: 255,
                b: (y as f32 / 10.0 * 255.0) as u8,
                a: 255,
            });
            save.bricks.push(brick);
        }
    }

    // write out the save
    let save_location = env::args()
        .nth(1)
        .unwrap_or("examples/write.out.brs".into());
    SaveWriter::new(File::create(save_location).unwrap(), save)
        .write()
        .unwrap();

    println!("Save written");
}

鸣谢

依赖项

~1–2MB
~35K SLoC