Files
BlueArchiveToolkit/examples/unity_adapter_demo.rs

103 lines
3.4 KiB
Rust

use bat_adapters::unity::RawAssetBundle;
use bat_adapters::unity::{Unity2021_3Adapter, UnityAdapterRegistry};
fn push_c_string(data: &mut Vec<u8>, value: &str) {
data.extend_from_slice(value.as_bytes());
data.push(0);
}
fn push_u16(data: &mut Vec<u8>, value: u16) {
data.extend_from_slice(&value.to_be_bytes());
}
fn push_u32(data: &mut Vec<u8>, value: u32) {
data.extend_from_slice(&value.to_be_bytes());
}
fn push_i32(data: &mut Vec<u8>, value: i32) {
data.extend_from_slice(&value.to_be_bytes());
}
fn push_u64(data: &mut Vec<u8>, value: u64) {
data.extend_from_slice(&value.to_be_bytes());
}
fn align(data: &mut Vec<u8>, alignment: usize) {
let remainder = data.len() % alignment;
if remainder != 0 {
data.resize(data.len() + alignment - remainder, 0);
}
}
fn synthetic_minimal_unityfs_bundle() -> Vec<u8> {
let mut blocks_info = Vec::new();
blocks_info.extend_from_slice(&[0; 16]);
push_i32(&mut blocks_info, 1);
push_u32(&mut blocks_info, 4);
push_u32(&mut blocks_info, 4);
push_u16(&mut blocks_info, 0);
push_i32(&mut blocks_info, 1);
push_u64(&mut blocks_info, 0);
push_u64(&mut blocks_info, 4);
push_u32(&mut blocks_info, 0);
push_c_string(&mut blocks_info, "SYNTHETIC-DEMO-CAB");
let mut data = Vec::new();
push_c_string(&mut data, "UnityFS");
push_u32(&mut data, 8);
push_c_string(&mut data, "5.x.x");
push_c_string(&mut data, "2021.3.56f2");
push_u64(&mut data, 0);
push_u32(&mut data, blocks_info.len() as u32);
push_u32(&mut data, blocks_info.len() as u32);
push_u32(&mut data, 0);
align(&mut data, 16);
data.extend_from_slice(&blocks_info);
data.extend_from_slice(b"data");
let total_size = data.len() as u64;
let total_size_offset = b"UnityFS\0".len() + 4 + b"5.x.x\0".len() + b"2021.3.56f2\0".len();
data[total_size_offset..total_size_offset + 8].copy_from_slice(&total_size.to_be_bytes());
data
}
fn main() {
println!("🎮 BlueArchiveToolkit - Unity 适配器演示");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
// 创建 Unity Adapter
let adapter = Unity2021_3Adapter::new();
println!("✅ Unity Adapter: {}", adapter.name());
println!(" 支持版本: 2021.3.0 - 2021.3.99");
// 合成最小 UnityFS 文件,仅用于演示版本检测和适配器选择。
println!("\n📦 测试 Unity 版本检测...");
let bundle = RawAssetBundle {
data: synthetic_minimal_unityfs_bundle(),
path: Some("synthetic-demo.bundle".to_string()),
};
if adapter.can_handle(&bundle) {
println!(" ✅ 可以处理 Unity 2021.3.56f2");
} else {
println!(" ❌ 不支持此版本");
}
// 测试 Registry
println!("\n🔄 测试 Adapter Registry...");
let registry = UnityAdapterRegistry::with_defaults();
println!(" 注册的适配器数量: {}", registry.count());
match registry.select_adapter(&bundle) {
Ok(selected) => {
println!(" ✅ 自动选择的适配器: {}", selected.name());
}
Err(e) => {
println!(" ❌ 选择失败: {}", e);
}
}
println!("\n✅ 演示完成!");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}