mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Add script type detect for xp3
This commit is contained in:
@@ -210,6 +210,7 @@ impl<T: Read + Seek + std::fmt::Debug + 'static> Script for Xp3Archive<T> {
|
|||||||
let mut header = [0u8; 16];
|
let mut header = [0u8; 16];
|
||||||
let header_len = entry.read(&mut header)?;
|
let header_len = entry.read(&mut header)?;
|
||||||
entry.rewind()?;
|
entry.rewind()?;
|
||||||
|
entry.script_type = detect_script_type(entry.index.info().name(), &header, header_len);
|
||||||
if self.decrypt_simple_crypt
|
if self.decrypt_simple_crypt
|
||||||
&& header_len >= 5
|
&& header_len >= 5
|
||||||
&& header[0] == 0xFE
|
&& header[0] == 0xFE
|
||||||
@@ -239,6 +240,33 @@ impl<T: Read + Seek + std::fmt::Debug + 'static> Script for Xp3Archive<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn detect_script_type(filename: &str, buf: &[u8], buf_len: usize) -> Option<ScriptType> {
|
||||||
|
#[cfg(feature = "kirikiri-img")]
|
||||||
|
if buf_len >= 11 && libtlg_rs::is_valid_tlg(buf) {
|
||||||
|
return Some(ScriptType::KirikiriTlg);
|
||||||
|
}
|
||||||
|
if buf_len >= 8 && (buf.starts_with(b"TJS/ns0\0") || buf.starts_with(b"TJS/4s0\0")) {
|
||||||
|
return Some(ScriptType::KirikiriTjsNs0);
|
||||||
|
}
|
||||||
|
if buf_len >= 8 && buf.starts_with(b"TJS2100\0") {
|
||||||
|
return Some(ScriptType::KirikiriTjs2);
|
||||||
|
}
|
||||||
|
let extension = std::path::Path::new(filename)
|
||||||
|
.extension()
|
||||||
|
.and_then(|s| s.to_str())
|
||||||
|
.unwrap_or("")
|
||||||
|
.to_lowercase();
|
||||||
|
match extension.as_str() {
|
||||||
|
"ks" => Some(ScriptType::Kirikiri),
|
||||||
|
"scn" => Some(ScriptType::KirikiriScn),
|
||||||
|
#[cfg(feature = "emote-img")]
|
||||||
|
"dref" => Some(ScriptType::EmoteDref),
|
||||||
|
#[cfg(feature = "emote-img")]
|
||||||
|
"pimg" => Some(ScriptType::EmotePimg),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Entry<T: Read + Seek + std::fmt::Debug> {
|
struct Entry<T: Read + Seek + std::fmt::Debug> {
|
||||||
reader: Arc<Mutex<T>>,
|
reader: Arc<Mutex<T>>,
|
||||||
@@ -246,6 +274,7 @@ struct Entry<T: Read + Seek + std::fmt::Debug> {
|
|||||||
cache: Option<ZlibDecoder<Take<MutexWrapper<T>>>>,
|
cache: Option<ZlibDecoder<Take<MutexWrapper<T>>>>,
|
||||||
pos: u64,
|
pos: u64,
|
||||||
entries_pos: Vec<u64>,
|
entries_pos: Vec<u64>,
|
||||||
|
script_type: Option<ScriptType>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Read + Seek + std::fmt::Debug> Entry<T> {
|
impl<T: Read + Seek + std::fmt::Debug> Entry<T> {
|
||||||
@@ -266,6 +295,7 @@ impl<T: Read + Seek + std::fmt::Debug> Entry<T> {
|
|||||||
cache: None,
|
cache: None,
|
||||||
pos: 0,
|
pos: 0,
|
||||||
entries_pos,
|
entries_pos,
|
||||||
|
script_type: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -278,6 +308,10 @@ impl<T: Read + Seek + std::fmt::Debug> ArchiveContent for Entry<T> {
|
|||||||
fn to_data<'a>(&'a mut self) -> Result<Box<dyn ReadSeek + 'a>> {
|
fn to_data<'a>(&'a mut self) -> Result<Box<dyn ReadSeek + 'a>> {
|
||||||
Ok(Box::new(self))
|
Ok(Box::new(self))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn script_type(&self) -> Option<&ScriptType> {
|
||||||
|
self.script_type.as_ref()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Read + Seek + std::fmt::Debug> Read for Entry<T> {
|
impl<T: Read + Seek + std::fmt::Debug> Read for Entry<T> {
|
||||||
|
|||||||
Reference in New Issue
Block a user