Add more decl for escude list

This commit is contained in:
2025-12-25 23:30:14 +08:00
parent 155bf0b57a
commit 1619ebfa20

View File

@@ -145,7 +145,7 @@ impl EscudeBinList {
let id = ent.id; let id = ent.id;
if let ListData::Unknown(unk) = &ent.data { if let ListData::Unknown(unk) = &ent.data {
let mut reader = MemReader::new(unk.clone()); let mut reader = MemReader::new(unk.clone());
let element_size = if id == 0 { let mut element_size = if id == 0 {
132 132
} else if id == 1 { } else if id == 1 {
100 100
@@ -159,6 +159,11 @@ impl EscudeBinList {
return Err(anyhow::anyhow!("Unknown enum source ID: {}", id)); return Err(anyhow::anyhow!("Unknown enum source ID: {}", id));
}; };
let len = unk.len(); 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 { if len % element_size != 0 {
return Err(anyhow::anyhow!( return Err(anyhow::anyhow!(
"Invalid enum source length: {} for ID: {}", "Invalid enum source length: {} for ID: {}",
@@ -168,9 +173,19 @@ impl EscudeBinList {
} }
let count = len / element_size; let count = len / element_size;
let data_entry = match id { let data_entry = match id {
0 => ListData::Scr(EnumScr::Scripts( 0 => {
reader.read_struct_vec::<ScriptT>(count, false, encoding)?, if script_old {
)), ListData::Scr(EnumScr::Scripts2(
reader
.read_struct_vec::<ScriptT2>(count, false, encoding)?,
))
} else {
ListData::Scr(EnumScr::Scripts(
reader
.read_struct_vec::<ScriptT>(count, false, encoding)?,
))
}
}
1 => ListData::Scr(EnumScr::Names( 1 => ListData::Scr(EnumScr::Names(
reader.read_struct_vec::<NameT>(count, false, encoding)?, reader.read_struct_vec::<NameT>(count, false, encoding)?,
)), )),
@@ -355,7 +370,7 @@ impl Script for EscudeBinList {
serde_yaml_ng::to_string(&self.entries) serde_yaml_ng::to_string(&self.entries)
.map_err(|e| anyhow::anyhow!("Failed to serialize to YAML: {}", e))? .map_err(|e| anyhow::anyhow!("Failed to serialize to YAML: {}", e))?
} else { } 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))? .map_err(|e| anyhow::anyhow!("Failed to serialize to JSON: {}", e))?
}; };
let mut writer = crate::utils::files::write_file(filename)?; let mut writer = crate::utils::files::write_file(filename)?;
@@ -397,6 +412,19 @@ pub struct ScriptT {
pub title: String, 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)] #[derive(Debug, Serialize, Deserialize, StructPack, StructUnpack)]
/// Name entry in the Escu:de list /// Name entry in the Escu:de list
pub struct NameT { pub struct NameT {
@@ -448,6 +476,8 @@ pub struct SceneT {
pub enum EnumScr { pub enum EnumScr {
/// Scripts data /// Scripts data
Scripts(Vec<ScriptT>), Scripts(Vec<ScriptT>),
/// Scripts data (old)
Scripts2(Vec<ScriptT2>),
/// Names data /// Names data
Names(Vec<NameT>), Names(Vec<NameT>),
/// Variables data /// Variables data