Add detect script type support for qlie

This commit is contained in:
2026-01-29 21:50:12 +08:00
parent 770a32bdde
commit 430ffb26f6
3 changed files with 36 additions and 3 deletions

View File

@@ -216,6 +216,10 @@ msg-tool create -t <script-type> <input> <output>
| 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 |
|---|---|---|---|---|---|---|---|---|---|---|

View File

@@ -262,11 +262,31 @@ impl<T: Read + Seek + std::fmt::Debug + 'static> Script for QliePackArchive<T> {
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<ScriptType> {
if super::super::script::is_this_format(buf, buf_len) {
Some(ScriptType::Qlie)
} else {
None
}
}
@@ -274,11 +294,16 @@ impl<T: Read + Seek + std::fmt::Debug + 'static> Script for QliePackArchive<T> {
struct QliePackArchiveContent<T: Read + std::fmt::Debug> {
reader: T,
entry: QlieEntry,
typ: Option<ScriptType>,
}
impl<T: Read + std::fmt::Debug> QliePackArchiveContent<T> {
pub fn new(reader: T, entry: QlieEntry) -> Self {
Self { reader, entry }
Self {
reader,
entry,
typ: None,
}
}
}
@@ -292,4 +317,8 @@ impl<T: Read + std::fmt::Debug> ArchiveContent for QliePackArchiveContent<T> {
fn name(&self) -> &str {
&self.entry.name
}
fn script_type(&self) -> Option<&ScriptType> {
self.typ.as_ref()
}
}

View File

@@ -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;
}
}