From 1619ebfa20c71510f37220b5d6869133674bfae5 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 25 Dec 2025 23:30:14 +0800 Subject: [PATCH] Add more decl for escude list --- src/scripts/escude/list.rs | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/scripts/escude/list.rs b/src/scripts/escude/list.rs index 98b9dd2..94997a4 100644 --- a/src/scripts/escude/list.rs +++ b/src/scripts/escude/list.rs @@ -145,7 +145,7 @@ impl EscudeBinList { let id = ent.id; if let ListData::Unknown(unk) = &ent.data { let mut reader = MemReader::new(unk.clone()); - let element_size = if id == 0 { + let mut element_size = if id == 0 { 132 } else if id == 1 { 100 @@ -159,6 +159,11 @@ impl EscudeBinList { return Err(anyhow::anyhow!("Unknown enum source ID: {}", id)); }; let len = unk.len(); + let mut script_old = false; + if id == 0 && len % element_size != 0 { + element_size = 128; + script_old = true; + } if len % element_size != 0 { return Err(anyhow::anyhow!( "Invalid enum source length: {} for ID: {}", @@ -168,9 +173,19 @@ impl EscudeBinList { } let count = len / element_size; let data_entry = match id { - 0 => ListData::Scr(EnumScr::Scripts( - reader.read_struct_vec::(count, false, encoding)?, - )), + 0 => { + if script_old { + ListData::Scr(EnumScr::Scripts2( + reader + .read_struct_vec::(count, false, encoding)?, + )) + } else { + ListData::Scr(EnumScr::Scripts( + reader + .read_struct_vec::(count, false, encoding)?, + )) + } + } 1 => ListData::Scr(EnumScr::Names( reader.read_struct_vec::(count, false, encoding)?, )), @@ -355,7 +370,7 @@ impl Script for EscudeBinList { serde_yaml_ng::to_string(&self.entries) .map_err(|e| anyhow::anyhow!("Failed to serialize to YAML: {}", e))? } else { - serde_json::to_string(&self.entries) + serde_json::to_string_pretty(&self.entries) .map_err(|e| anyhow::anyhow!("Failed to serialize to JSON: {}", e))? }; let mut writer = crate::utils::files::write_file(filename)?; @@ -397,6 +412,19 @@ pub struct ScriptT { pub title: String, } +#[derive(Debug, Serialize, Deserialize, StructPack, StructUnpack)] +/// Script entry in the Escu:de list +pub struct ScriptT2 { + #[fstring = 64] + #[fstring_pad = 0x20] + /// File name + pub file: String, + #[fstring = 64] + #[fstring_pad = 0x20] + /// Script title + pub title: String, +} + #[derive(Debug, Serialize, Deserialize, StructPack, StructUnpack)] /// Name entry in the Escu:de list pub struct NameT { @@ -448,6 +476,8 @@ pub struct SceneT { pub enum EnumScr { /// Scripts data Scripts(Vec), + /// Scripts data (old) + Scripts2(Vec), /// Names data Names(Vec), /// Variables data