From 430ffb26f63a495917eb8e19d154959b2f463394 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 29 Jan 2026 21:50:12 +0800 Subject: [PATCH] Add detect script type support for qlie --- README.md | 4 ++++ src/scripts/qlie/archive/pack/mod.rs | 33 ++++++++++++++++++++++++++-- src/scripts/qlie/script.rs | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5bfee61..df3863f 100644 --- a/README.md +++ b/README.md @@ -216,6 +216,10 @@ msg-tool create -t | Script Type | Feature Name | Name | Export | Import | Export Multiple | Import Multiple | Custom Export | Custom Import | Create | Remarks | |---|---|---|---|---|---|---|---|---|---|---| | `qlie` | `qlie` | Qlie Engine Scenario script (.s) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | | + +| Archive Type | Feature Name | Name | Unpack | Pack | Remarks | +|---|---|---|---|---|---| +| `qlie-pack` | `qlie-arc` | Qlie Pack Archive (.pack) | ✔️ | ❌ | Currently only v3.1 are supported | ### Silky Engine | Script Type | Feature Name | Name | Export | Import | Export Multiple | Import Multiple | Custom Export | Custom Import | Create | Remarks | |---|---|---|---|---|---|---|---|---|---|---| diff --git a/src/scripts/qlie/archive/pack/mod.rs b/src/scripts/qlie/archive/pack/mod.rs index b964c35..18f5483 100644 --- a/src/scripts/qlie/archive/pack/mod.rs +++ b/src/scripts/qlie/archive/pack/mod.rs @@ -262,11 +262,31 @@ impl Script for QliePackArchive { MutexWrapper::new(self.reader.clone(), entry.offset), entry.size as u64, )?; + let stream_clone = StreamRegion::with_size( + MutexWrapper::new(self.reader.clone(), entry.offset), + entry.size as u64, + )?; let mut stream = self.encryption.decrypt_entry(Box::new(stream), &entry)?; + let mut stream_clone = self + .encryption + .decrypt_entry(Box::new(stream_clone), &entry)?; if entry.is_packed != 0 { stream = encryption::decompress(stream)?; + stream_clone = encryption::decompress(stream_clone)?; } - Ok(Box::new(QliePackArchiveContent::new(stream, entry))) + let mut entry = QliePackArchiveContent::new(stream, entry); + let mut header_buffer = [0u8; 1024]; + let readed = stream_clone.read_most(&mut header_buffer)?; + entry.typ = detect_script_type(&entry.entry.name, &header_buffer, readed); + Ok(Box::new(entry)) + } +} + +fn detect_script_type(_name: &str, buf: &[u8], buf_len: usize) -> Option { + if super::super::script::is_this_format(buf, buf_len) { + Some(ScriptType::Qlie) + } else { + None } } @@ -274,11 +294,16 @@ impl Script for QliePackArchive { struct QliePackArchiveContent { reader: T, entry: QlieEntry, + typ: Option, } impl QliePackArchiveContent { pub fn new(reader: T, entry: QlieEntry) -> Self { - Self { reader, entry } + Self { + reader, + entry, + typ: None, + } } } @@ -292,4 +317,8 @@ impl ArchiveContent for QliePackArchiveContent { fn name(&self) -> &str { &self.entry.name } + + fn script_type(&self) -> Option<&ScriptType> { + self.typ.as_ref() + } } diff --git a/src/scripts/qlie/script.rs b/src/scripts/qlie/script.rs index d6fa70a..c6d94a9 100644 --- a/src/scripts/qlie/script.rs +++ b/src/scripts/qlie/script.rs @@ -72,7 +72,7 @@ pub fn is_this_format(buf: &[u8], buf_len: usize) -> bool { Err(_) => return false, }; let line = line.trim(); - if line.to_lowercase() == "@@@avg/header.s" { + if line.to_lowercase() == "@@@avg\\header.s" { return true; } }