From 3ec55597d4168493897a48bd450eccf677996e48 Mon Sep 17 00:00:00 2001 From: widberg Date: Sun, 5 Jul 2026 18:13:41 -0400 Subject: [PATCH] Byte perfect Ubisoft CPS --- bff/src/tsc/mqfel_settings_bin.rs | 3 +++ bff/tests/cps.rs | 19 +++++++------------ ...ead_write_read.yaml => cps_roundtrip.yaml} | 0 3 files changed, 10 insertions(+), 12 deletions(-) rename bff/tests/datasets/{cps_read_write_read.yaml => cps_roundtrip.yaml} (100%) diff --git a/bff/src/tsc/mqfel_settings_bin.rs b/bff/src/tsc/mqfel_settings_bin.rs index 3b74d62..5d3024b 100644 --- a/bff/src/tsc/mqfel_settings_bin.rs +++ b/bff/src/tsc/mqfel_settings_bin.rs @@ -140,6 +140,9 @@ fn compress_and_encrypt(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()); diff --git a/bff/tests/cps.rs b/bff/tests/cps.rs index 27f6ac7..fb63042 100644 --- a/bff/tests/cps.rs +++ b/bff/tests/cps.rs @@ -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()); } diff --git a/bff/tests/datasets/cps_read_write_read.yaml b/bff/tests/datasets/cps_roundtrip.yaml similarity index 100% rename from bff/tests/datasets/cps_read_write_read.yaml rename to bff/tests/datasets/cps_roundtrip.yaml