From e64f6fcd078c7a32933e43940f464d5a2da0c0e1 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Mon, 28 Jul 2025 22:59:50 +0800 Subject: [PATCH] Add detect support for pfs --- src/scripts/artemis/archive/pfs.rs | 17 ++++++++++++++++- src/scripts/artemis/ast/mod.rs | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/scripts/artemis/archive/pfs.rs b/src/scripts/artemis/archive/pfs.rs index d3260b0..4479ba7 100644 --- a/src/scripts/artemis/archive/pfs.rs +++ b/src/scripts/artemis/archive/pfs.rs @@ -1,5 +1,6 @@ use crate::ext::io::*; use crate::scripts::base::*; +use crate::try_option; use crate::types::*; use crate::utils::struct_pack::*; use anyhow::Result; @@ -302,6 +303,16 @@ impl Seek for Entry { } } +fn detect_script_type(buf: &[u8], buf_len: usize, filename: &str) -> Option { + if buf_len >= 5 && buf.starts_with(b"ASB\0\0") { + return Some(ScriptType::ArtemisAsb); + } + if super::super::ast::is_this_format(filename, buf, buf_len) { + return Some(ScriptType::Artemis); + } + None +} + struct ArtemisArcIter<'a, T: Iterator, R: Read + Seek + 'static> { entries: T, reader: Arc>, @@ -315,13 +326,17 @@ impl<'a, T: Iterator, R: Read + Seek + 'static> Itera fn next(&mut self) -> Option { if let Some(header) = self.entries.next() { - let entry = Entry { + let mut entry = Entry { header: header.clone(), reader: self.reader.clone(), pos: 0, script_type: None, xor_key: self.xor_key.clone(), }; + let mut header = [0; 0x20]; + let readed = try_option!(entry.read(&mut header)); + entry.pos = 0; + entry.script_type = detect_script_type(&header, readed, &entry.header.name); Some(Ok(Box::new(entry))) } else { None diff --git a/src/scripts/artemis/ast/mod.rs b/src/scripts/artemis/ast/mod.rs index eb900b0..eaae9ae 100644 --- a/src/scripts/artemis/ast/mod.rs +++ b/src/scripts/artemis/ast/mod.rs @@ -400,3 +400,8 @@ impl Script for AstScript { Ok(()) } } + +pub fn is_this_format(_filename: &str, buf: &[u8], buf_len: usize) -> bool { + let parser = parser::Parser::new(&buf[..buf_len], Encoding::Utf8); + parser.try_parse_header().is_ok() +}