mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Add more decl for escude list
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user