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