diff --git a/src/save/save.rs b/src/save/save.rs index 46f690a..619f57d 100644 --- a/src/save/save.rs +++ b/src/save/save.rs @@ -6,12 +6,9 @@ pub mod save { common::{ save_slot::{EquipInventoryData, EquipProjectileData, GaItem, GaItemData, SaveSlot}, user_data_10::ProfileSummary, user_data_11::UserData11 }, pc::pc_save::PCSave, playstation::ps_save::PSSave, - }, util::bit::bit::set_bit, write::write::Write + }, util::{bit::bit::set_bit, regulation::Regulation}, write::write::Write }; - // Using a checksum of the regulation bin file to check for Save Wizard .txt save file - const REGULATION_MD5_CHECKSUM: [u8; 0x10] =[0x2E, 0x88, 0x1A, 0x15, 0xAC, 0x05, 0x88, 0x8D, 0xF2, 0xC2, 0x6A, 0xEC, 0xC2, 0x90, 0x89, 0x23]; - pub enum SaveType { Unknown, PC(PCSave), @@ -825,10 +822,12 @@ pub mod save { // Check if it's a PS Save Wizard save file pub fn is_ps_save_wizard(br: &mut BinaryReader) -> bool { - br.jmp(0x1960070); - let regulation = br.read_bytes(0x240010).expect(""); - let digest = md5::compute(regulation); - let is_ps_save_wizard = digest == md5::Digest(REGULATION_MD5_CHECKSUM); + br.jmp(0x1960080); + let regulation = br.read_bytes(0x1e9fb0).expect(""); + let is_ps_save_wizard = match Regulation::get_decrypted_decompressed(®ulation) { + Ok(_v) => true, + Err(_e) => false, + }; br.jmp(0); is_ps_save_wizard } diff --git a/src/util/regulation.rs b/src/util/regulation.rs index 4375c72..5e97783 100644 --- a/src/util/regulation.rs +++ b/src/util/regulation.rs @@ -87,10 +87,16 @@ impl Regulation { }); } - pub fn params_from_regulation(bytes: &[u8]) -> Result>, Error>{ + pub fn get_decrypted_decompressed(bytes: &[u8]) -> Result{ let decrypted = Self::decrypt(&bytes)?; let decompressed = Self::decompress(&decrypted)?; let res = Self::unpack(&decompressed)?; + + Ok(res) + } + + pub fn params_from_regulation(bytes: &[u8]) -> Result>, Error>{ + let res = Self::get_decrypted_decompressed(&bytes)?; let mut params: HashMap> = HashMap::new(); for file in &res.files {