mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-06-06 04:48:54 +08:00
Add detect script type support for qlie
This commit is contained in:
@@ -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 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user