#smash #ultimate #arc #file-format #directory #region #data-file

smash-arc

用于处理《超级 Smash Bros. 最终决战》的 data.arc 文件的 Rust 库

5 个版本 (3 个重大更新)

0.6.0 2023 年 12 月 9 日
0.5.0 2022 年 6 月 12 日
0.4.0 2022 年 4 月 15 日
0.2.1 2021 年 1 月 25 日
0.2.0 2021 年 1 月 23 日

#1092解析器实现

Download history 48/week @ 2024-03-11 71/week @ 2024-03-18 77/week @ 2024-03-25 53/week @ 2024-04-01 18/week @ 2024-04-08 34/week @ 2024-04-15 32/week @ 2024-04-22 9/week @ 2024-04-29 33/week @ 2024-05-06 20/week @ 2024-05-13 32/week @ 2024-05-20 2/week @ 2024-05-27 21/week @ 2024-06-03 35/week @ 2024-06-10 7/week @ 2024-06-17 13/week @ 2024-06-24

每月 76 次下载

MIT 许可证

110KB
2.5K SLoC

smash-arc

一个用于处理《超级 Smash Bros. 最终决战》的 data.arc 文件的 Rust 库。在桌面构建时,添加 --features=libzstd。有关其他选项,请参阅 cargo.toml。
示例:cargo build --release --features=libzstd


lib.rs:

用于处理《超级 Smash Bros. 最终决战》的 data.arc 文件的库。

use smash_arc::{ArcFile, ArcLookup, FileNode, Hash40, Region};

// Load the hashes needed to list directories (file format restriction)
Hash40::set_global_labels_file("hash_labels.txt").unwrap();

// Parse the arc from a file
let arc = ArcFile::open("data.arc").unwrap();

// loop over every file in the root
for node in arc.get_dir_listing("/").unwrap() {
    match node {
        FileNode::Dir(dir) => {
            // print out name of directory
            println!("directory: {}", dir.global_label().unwrap());
        }
        FileNode::File(file) => {
            // extract file
            let path = file.global_label().unwrap();
            std::fs::write(path, arc.get_file_contents(file, Region::UsEnglish).unwrap()).unwrap();
        }
    }
}

Cargo 功能

  • network (默认启用) = 能够通过网络解析文件

  • dir-listing (默认启用) = 列出目录

  • global-hashes (默认启用) = 启用全局表以破解哈希值

  • smash-runtime = 在《超级 Smash Bros. 最终决战》本身的环境中启用功能(启用 Aarch64 crc32 硬件加速,启用从游戏的内存布局解析 Arc)

  • search = 启用模糊搜索 ArcFile 的功能

  • ZSTD 后端

    • libzstd - 推荐用于构建的平台
    • rust-zstd - 提高可移植性(推荐用于 Switch)
    • nozstd - 不提供 zstd 后端,ZSTD 解压缩时引发恐慌

依赖项

~1.7–3.5MB
~66K SLoC