mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Fix cstl parse bug
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user