Byte perfect Ubisoft CPS

This commit is contained in:
widberg 2026-07-05 18:13:41 -04:00
parent d155fd086c
commit 3ec55597d4
3 changed files with 10 additions and 12 deletions

View file

@ -140,6 +140,9 @@ fn compress_and_encrypt<W: Write>(decompressed_data: &[u8], writer: &mut W) -> B
let decompressed_size = u32::try_from(decompressed_data.len()).unwrap();
let mut compressed_data = Cursor::new(Vec::new());
// Won't match the original byte-for-byte
// It uses a different version or config than everything else
lzo_compress(decompressed_data, &mut compressed_data)?;
let mut payload_cursor = Cursor::new(compressed_data.into_inner());

View file

@ -1,30 +1,25 @@
use std::fs::File;
use std::fs;
use std::io::Cursor;
use bff::Endian;
use bff::names::{NameContext, NameType};
use bff::tsc::{Cps, read_default_cps_names};
use binrw::io::BufReader;
use crate::path_helpers::resolve_repo_data_path;
#[datatest::data("tests/datasets/cps_read_write_read.yaml")]
#[datatest::data("tests/datasets/cps_roundtrip.yaml")]
#[test]
fn read_write_read(cps_path_str: String) {
fn roundtrip(cps_path_str: String) {
let cps_path = resolve_repo_data_path(&cps_path_str);
let f = File::open(cps_path).unwrap();
let mut reader = BufReader::new(f);
let data = fs::read(cps_path).unwrap();
let mut reader = Cursor::new(&data);
let mut name_context = NameContext::new(NameType::BlackSheep32);
read_default_cps_names(&mut name_context).unwrap();
let cps = Cps::read(&mut reader, Endian::Little, &name_context).unwrap();
let mut writer = Cursor::new(Vec::new());
cps.write(&mut writer, Endian::Little, false, &mut name_context)
.unwrap();
let mut reader = Cursor::new(writer.into_inner());
let mut name_context = NameContext::new(NameType::BlackSheep32);
read_default_cps_names(&mut name_context).unwrap();
let cps2 = Cps::read(&mut reader, Endian::Little, &name_context).unwrap();
assert!(cps == cps2);
assert!(data == writer.into_inner());
}