Fix cstl parse bug

This commit is contained in:
2025-07-29 16:27:49 +08:00
parent 6cca5c7e87
commit c1328743d5

View File

@@ -45,6 +45,24 @@ impl ScriptBuilder for CstlScriptBuilder {
} }
} }
trait CustomFn {
fn read_size(&mut self) -> Result<usize>;
}
impl<T: Read> CustomFn for T {
fn read_size(&mut self) -> Result<usize> {
let mut size = 0;
loop {
let len = self.read_u8()?;
size += len as usize;
if len != 0xFF {
break;
}
}
Ok(size)
}
}
#[derive(Debug)] #[derive(Debug)]
struct CstlScript { struct CstlScript {
langs: Vec<String>, langs: Vec<String>,
@@ -66,50 +84,28 @@ impl CstlScript {
if unk != 0 { if unk != 0 {
return Err(anyhow::anyhow!("Unknown CSTL unk value: {}", unk)); return Err(anyhow::anyhow!("Unknown CSTL unk value: {}", unk));
} }
let lang_count = reader.read_u8()? as usize; let lang_count = reader.read_size()?;
for _ in 0..lang_count { for _ in 0..lang_count {
let len = reader.read_u8()? as usize; let len = reader.read_size()?;
let s = reader.read_fstring(len, encoding, false)?; let s = reader.read_fstring(len, encoding, false)?;
langs.push(s); langs.push(s);
data.push(Vec::new()); data.push(Vec::new());
} }
let mut count = 0; let count = reader.read_size()?;
loop {
let len = reader.read_u8()?;
if len == 0 {
break; // End of data
}
count += len as usize;
}
let mut i = 0; let mut i = 0;
let mut name = None;
loop { loop {
let len = reader.read_u8()?; let name_len = reader.read_size()?;
let s = reader.read_fstring(len as usize, encoding, false)?; let name = if name_len > 0 {
if reader.is_eof() { Some(reader.read_fstring(name_len, encoding, false)?)
data[i % lang_count].push(Message {
name: name.take(),
message: s,
});
i += 1;
break;
} else { } else {
let e = reader.read_u8()?; None
if e != 0 { };
data[i % lang_count].push(Message { let mes_len = reader.read_size()?;
name: name.take(), let message = reader.read_fstring(mes_len, encoding, false)?;
message: s, data[i % lang_count].push(Message { name, message });
}); i += 1;
let s = reader.read_fstring(e as usize, encoding, false)?; if reader.is_eof() {
name = Some(s); break;
i += 1;
} else {
data[i % lang_count].push(Message {
name: name.take(),
message: s,
});
i += 1;
}
} }
} }
if i != count * lang_count { if i != count * lang_count {