From bc9519aa319ca06ef082790da72083a87f1adbcf Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 12 Jun 2025 12:49:09 +0800 Subject: [PATCH] Add script type detect --- src/scripts/bgi/archive/v2.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/scripts/bgi/archive/v2.rs b/src/scripts/bgi/archive/v2.rs index ec53bc5..7d2daf2 100644 --- a/src/scripts/bgi/archive/v2.rs +++ b/src/scripts/bgi/archive/v2.rs @@ -84,7 +84,7 @@ impl ScriptBuilder for BgiArchiveBuilder { fn is_this_format(&self, _filename: &str, buf: &[u8], buf_len: usize) -> Option { if buf_len >= 12 && buf.starts_with(b"BURIKO ARC20") { - return Some(1); + return Some(255); } None } @@ -111,12 +111,17 @@ struct Entry { reader: Arc>, pos: usize, base_offset: u64, + script_type: Option, } impl ArchiveContent for Entry { fn name(&self) -> &str { &self.header.filename } + + fn script_type(&self) -> Option<&ScriptType> { + self.script_type.as_ref() + } } impl Read for Entry { @@ -156,6 +161,10 @@ impl ArchiveContent for MemEntry { &self.name } + fn script_type(&self) -> Option<&ScriptType> { + detect_script_type(&self.data.data, self.data.data.len(), &self.name) + } + fn data(&mut self) -> Result> { Ok(self.data.data.clone()) } @@ -225,6 +234,19 @@ impl Script for BgiArchive { } } +fn detect_script_type(buf: &[u8], buf_len: usize, filename: &str) -> Option<&'static ScriptType> { + if buf_len >= 28 && buf.starts_with(b"BurikoCompiledScriptVer1.00\0") { + return Some(&ScriptType::BGI); + } + let filename = filename.to_lowercase(); + if filename.ends_with("._bp") { + return Some(&ScriptType::BGIBp); + } else if filename.ends_with("._bsi") { + return Some(&ScriptType::BGIBsi); + } + None +} + struct BgiArchiveIter<'a, T: Iterator, R: Read + Seek> { entries: T, reader: Arc>, @@ -246,8 +268,9 @@ impl<'a, T: Iterator, R: Read + Seek + 'static> Iterat reader: self.reader.clone(), pos: 0, base_offset: self.base_offset, + script_type: None, }; - let mut buf = [0u8; 16]; + let mut buf = [0u8; 32]; match entry.read(&mut buf) { Ok(_) => {} Err(e) => { @@ -296,6 +319,7 @@ impl<'a, T: Iterator, R: Read + Seek + 'static> Iterat data: MemReader::new(decoded), }))); } + entry.script_type = detect_script_type(&buf, buf.len(), &entry.header.filename).cloned(); Some(Ok(Box::new(entry))) } }