diff --git a/repak/Cargo.toml b/repak/Cargo.toml index f9461a4..a321330 100644 --- a/repak/Cargo.toml +++ b/repak/Cargo.toml @@ -13,6 +13,7 @@ compression = ["dep:flate2", "dep:zstd", "dep:lz4_flex"] oodle = ["dep:oodle_loader", "compression"] encryption = ["dep:aes"] wuthering-waves = [] +wuthering-waves-2_4 = [] [dependencies] byteorder = "1.5" diff --git a/repak/src/entry.rs b/repak/src/entry.rs index f117809..76a6d60 100644 --- a/repak/src/entry.rs +++ b/repak/src/entry.rs @@ -1,4 +1,4 @@ -use std::{io, process::exit}; +use std::io; use byteorder::{LE, ReadBytesExt, WriteBytesExt}; @@ -70,6 +70,9 @@ impl Entry { pub fn is_deleted(&self) -> bool { 0 != (self.flags >> 1) & 1 } + pub fn is_partial_encrypted(&self) -> bool { + 0 != (self.flags >> 3) & 1 + } pub fn get_serialized_size( version: super::Version, compression: Option, @@ -330,7 +333,7 @@ impl Entry { buf: &mut W, ) -> Result<(), super::Error> { reader.seek(io::SeekFrom::Start(self.offset))?; - Entry::read(reader, version)?; + let entry_read = Entry::read(reader, version)?; #[cfg(any(feature = "compression", feature = "oodle"))] let data_offset = reader.stream_position()?; #[allow(unused_mut)] @@ -348,11 +351,14 @@ impl Entry { }; use aes::cipher::BlockDecrypt; - let mut data_len = data.len(); - #[cfg(all(feature = "wuthering-waves", feature = "compression"))] - if let Some(Compression::Zlib) = self.compression_slot.and_then(|c| compression[c as usize]) { - data_len = data_len.min(2048); - } + #[cfg(not(feature = "wuthering-waves-2_4"))] + let data_len = data.len(); + #[cfg(feature = "wuthering-waves-2_4")] + let data_len = if entry_read.is_partial_encrypted() { + data.len().min(2048) + } else { + data.len() + }; for block in data[..data_len].chunks_mut(16) { key.decrypt_block(aes::Block::from_mut_slice(block))