From 76461f57c411eca69eda777ce85ff713a9d977a9 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Wed, 13 May 2026 20:47:16 +0800 Subject: [PATCH] Update yscm file unpack --- src/scripts/yuris/yscm.rs | 43 +++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/scripts/yuris/yscm.rs b/src/scripts/yuris/yscm.rs index 0e19115..3a1f125 100644 --- a/src/scripts/yuris/yscm.rs +++ b/src/scripts/yuris/yscm.rs @@ -55,7 +55,40 @@ impl ScriptBuilder for YSCMBuilder { #[derive(Debug, Deserialize, Serialize)] pub(crate) struct YSCMData { pub engine: u32, + pub opcode_length: u32, + pub unk: u32, pub opcodes: Vec, + pub errmsgs: Vec, + pub unk_tbl: Vec, +} + +impl StructUnpack for YSCMData { + fn unpack( + reader: &mut R, + big: bool, + encoding: Encoding, + info: &Option>, + ) -> Result { + let engine = u32::unpack(reader, big, encoding, info)?; + let opcode_length = u32::unpack(reader, big, encoding, info)?; + let unk = u32::unpack(reader, big, encoding, info)?; + let opcodes = reader.read_struct_vec(opcode_length as usize, big, encoding, info)?; + let target_len = reader.stream_length()? - 0x100; + let mut errmsgs = Vec::new(); + while reader.stream_position()? < target_len { + let s = reader.read_cstring()?; + errmsgs.push(decode_to_string(encoding, s.as_bytes(), true)?); + } + let unk_tbl = reader.read_exact_vec(0x100)?; + Ok(Self { + engine, + opcode_length, + unk, + opcodes, + errmsgs, + unk_tbl, + }) + } } #[derive(Debug)] @@ -75,15 +108,9 @@ impl YSCM { if &sig != b"YSCM" { anyhow::bail!("Unsupported YSCM file."); } - let engine = reader.read_u32()?; - let opcode_count = reader.read_u32()?; - reader.skip(4)?; - let mut opcodes = Vec::with_capacity(opcode_count as usize); - for _ in 0..opcode_count { - opcodes.push(CodeMeta::unpack(&mut reader, false, encoding, &None)?); - } + let data = YSCMData::unpack(&mut reader, false, encoding, &None)?; Ok(Self { - data: YSCMData { engine, opcodes }, + data, custom_yaml: config.custom_yaml, }) }