From c6850236da348b942ccfac24dbb38c74b6b8b7a7 Mon Sep 17 00:00:00 2001 From: morkt Date: Mon, 2 Nov 2015 05:43:45 +0400 Subject: [PATCH] another version of AOS archives. --- ArcFormats/Lilim/ArcAOS.cs | 53 +++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/ArcFormats/Lilim/ArcAOS.cs b/ArcFormats/Lilim/ArcAOS.cs index 0b3107d3..32502ab0 100644 --- a/ArcFormats/Lilim/ArcAOS.cs +++ b/ArcFormats/Lilim/ArcAOS.cs @@ -57,9 +57,9 @@ namespace GameRes.Formats.Lilim if (!name_buf.SequenceEqual (IndexLink) && !name_buf.SequenceEqual (IndexEnd)) return null; - uint current_offset = 0; + long current_offset = 0; var dir = new List (0x3E); - for (;;) + while (current_offset < file.MaxOffset) { if (0x10 != file.View.Read (current_offset, name_buf, 0, 0x10)) break; @@ -67,8 +67,6 @@ namespace GameRes.Formats.Lilim { uint next_offset = file.View.ReadUInt32 (current_offset+0x10); current_offset += 0x20 + next_offset; - if (current_offset >= file.MaxOffset) - break; } else { @@ -106,4 +104,51 @@ namespace GameRes.Formats.Lilim return new MemoryStream (unpacked); } } + + [Export(typeof(ArchiveFormat))] + public class Aos2Opener : AosOpener + { + public override string Tag { get { return "AOSv2"; } } + public override string Description { get { return "LiLiM resource archive version 2"; } } + public override uint Signature { get { return 0; } } + public override bool IsHierarchic { get { return false; } } + public override bool CanCreate { get { return false; } } + + public Aos2Opener () + { + Extensions = new string[] { "aos" }; + } + + public override ArcFile TryOpen (ArcView file) + { + if (0 != file.View.ReadInt32 (0)) + return null; + + long base_offset = file.View.ReadUInt32 (4); + uint index_offset = 0x111; + int index_size = file.View.ReadInt32 (8); + if (base_offset >= file.MaxOffset || index_offset+index_size >= file.MaxOffset + || base_offset < index_offset+index_size) + return null; + int count = index_size / 0x28; + if (!IsSaneCount (count)) + return null; + + var dir = new List (count); + for (int i = 0; i < count; ++i) + { + var name = file.View.ReadString (index_offset, 0x20); + if (0 == name.Length) + return null; + 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; + dir.Add (entry); + index_offset += 0x28; + } + return new ArcFile (file, this, dir); + } + } }