From 2d2da5e3e59ddfecd3317f8c1af02a807f8f3bc1 Mon Sep 17 00:00:00 2001 From: morkt Date: Sat, 7 Nov 2015 03:05:35 +0400 Subject: [PATCH] (AosOpener): recognize compressed ABM images. --- ArcFormats/Lilim/ArcAOS.cs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/ArcFormats/Lilim/ArcAOS.cs b/ArcFormats/Lilim/ArcAOS.cs index 32502ab0..9c8cb5ba 100644 --- a/ArcFormats/Lilim/ArcAOS.cs +++ b/ArcFormats/Lilim/ArcAOS.cs @@ -32,6 +32,11 @@ using GameRes.Utility; namespace GameRes.Formats.Lilim { + internal class AosEntry : Entry + { + public bool IsCompressed; + } + [Export(typeof(ArchiveFormat))] public class AosOpener : ArchiveFormat { @@ -76,13 +81,15 @@ namespace GameRes.Formats.Lilim if (-1 == name_length) name_length = name_buf.Length; var name = Encodings.cp932.GetString (name_buf, 0, name_length); - var entry = FormatCatalog.Instance.Create (name); + var entry = FormatCatalog.Instance.Create (name); entry.Offset = file.View.ReadUInt32 (current_offset+0x10); entry.Size = file.View.ReadUInt32 (current_offset+0x14); current_offset += 0x20; entry.Offset += current_offset; if (!entry.CheckPlacement (file.MaxOffset)) return null; + if (name.EndsWith (".scr", StringComparison.InvariantCultureIgnoreCase)) + entry.IsCompressed = true; dir.Add (entry); } } @@ -91,8 +98,9 @@ namespace GameRes.Formats.Lilim public override Stream OpenEntry (ArcFile arc, Entry entry) { - if (!entry.Name.EndsWith (".scr", StringComparison.InvariantCultureIgnoreCase)) - return arc.File.CreateStream (entry.Offset, entry.Size); + var aent = entry as AosEntry; + if (null == aent || !aent.IsCompressed) + return base.OpenEntry (arc, entry); uint unpacked_size = arc.File.View.ReadUInt32 (entry.Offset); var packed = new byte[entry.Size-4]; @@ -140,11 +148,19 @@ namespace GameRes.Formats.Lilim var name = file.View.ReadString (index_offset, 0x20); if (0 == name.Length) return null; - var entry = FormatCatalog.Instance.Create (name); + var entry = FormatCatalog.Instance.Create (name); entry.Offset = base_offset + file.View.ReadUInt32 (index_offset+0x20); entry.Size = file.View.ReadUInt32 (index_offset+0x24); if (!entry.CheckPlacement (file.MaxOffset)) return null; + if (name.EndsWith (".scr", StringComparison.InvariantCultureIgnoreCase)) + entry.IsCompressed = true; + else if (name.EndsWith (".cmp", StringComparison.InvariantCultureIgnoreCase)) + { + entry.IsCompressed = true; + entry.Name = Path.ChangeExtension (entry.Name, ".abm"); + entry.Type = "image"; + } dir.Add (entry); index_offset += 0x28; }