From 7de11127a7a1a134f985f58d1865735f89591f5d Mon Sep 17 00:00:00 2001 From: morkt Date: Mon, 19 Jan 2015 09:43:52 +0400 Subject: [PATCH] AFS and PACKDAT archives implementation. --- ArcFormats/ArcAFS.cs | 88 ++++++++++++++++++++++++++++++++++++ ArcFormats/ArcFormats.csproj | 2 + ArcFormats/ArcInnGrey.cs | 73 ++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 ArcFormats/ArcAFS.cs create mode 100644 ArcFormats/ArcInnGrey.cs diff --git a/ArcFormats/ArcAFS.cs b/ArcFormats/ArcAFS.cs new file mode 100644 index 00000000..9f1b9f64 --- /dev/null +++ b/ArcFormats/ArcAFS.cs @@ -0,0 +1,88 @@ +//! \file ArcAFS.cs +//! \date Tue Jan 06 10:27:51 2015 +//! \brief PS2 archive implementation. +// +// Copyright (C) 2014 by morkt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.IO; +using System.Linq; +using GameRes.Utility; + +namespace GameRes.Formats.PS2 +{ + [Export(typeof(ArchiveFormat))] + public class AfsOpener : ArchiveFormat + { + public override string Tag { get { return "AFS"; } } + public override string Description { get { return "PS2 resource archive"; } } + public override uint Signature { get { return 0x00534641; } } // "AFS" + public override bool IsHierarchic { get { return false; } } + public override bool CanCreate { get { return false; } } + + public override ArcFile TryOpen (ArcView file) + { + int count = file.View.ReadInt32 (4); + if (count <= 0 || count > 0xfffff) + return null; + uint index_offset = 8; + var dir = new List (count); + for (int i = 0; i < count; ++i) + { + uint offset = file.View.ReadUInt32 (index_offset); + uint size = file.View.ReadUInt32 (index_offset+4); + var entry = new Entry { Offset = offset, Size = size }; + if (!entry.CheckPlacement (file.MaxOffset)) + return null; + dir.Add (entry); + index_offset += 8; + } + var last_entry = dir[count-1]; + index_offset = (uint)AlignOffset (last_entry.Offset + last_entry.Size); + for (int i = 0; i < count; ++i) + { + var name = file.View.ReadString (index_offset, 0x20); + if (string.IsNullOrEmpty (name)) + return null; + dir[i].Name = name; + dir[i].Type = FormatCatalog.Instance.GetTypeFromName (name); + index_offset += 0x30; + } + return new ArcFile (file, this, dir); + } + + long AlignOffset (long offset, uint block_size = 0x800) + { + offset += block_size - 1; + return offset & ~(long)(block_size - 1); + } + } + + [Export(typeof(AudioFormat))] + public class AdxAudio : OggAudio + { + public override string Tag { get { return "ADX"; } } + public override string Description { get { return "PS2 audio format (Ogg/Vorbis)"; } } + } +} diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index 9249393e..0dea8699 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -59,9 +59,11 @@ + + diff --git a/ArcFormats/ArcInnGrey.cs b/ArcFormats/ArcInnGrey.cs new file mode 100644 index 00000000..6c3506a3 --- /dev/null +++ b/ArcFormats/ArcInnGrey.cs @@ -0,0 +1,73 @@ +//! \file ArcInnGrey.cs +//! \date Mon Jan 19 08:57:16 2015 +//! \brief Innocent Grey archives format. +// +// Copyright (C) 2014 by morkt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +using System; +using System.IO; +using System.Collections.Generic; +using System.ComponentModel.Composition; + +namespace GameRes.Formats.InnocentGrey +{ + [Export(typeof(ArchiveFormat))] + public class PakOpener : ArchiveFormat + { + public override string Tag { get { return "PACKDAT"; } } + public override string Description { get { return "Innocent Grey resource archive"; } } + public override uint Signature { get { return 0x4B434150; } } // "PACK" + public override bool IsHierarchic { get { return false; } } + public override bool CanCreate { get { return false; } } + + public PakOpener () + { + Extensions = new string[] { "pak", "dat" }; + } + + public override ArcFile TryOpen (ArcView file) + { + if (!file.View.AsciiEqual (4, "DAT.")) + return null; + int count = file.View.ReadInt32 (8); + if (count <= 0 || count > 0xfffff) + return null; + uint index_size = 0x30 * (uint)count; + if (index_size > file.View.Reserve (0x10, index_size)) + return null; + var dir = new List (count); + long index_offset = 0x10; + for (int i = 0; i < count; ++i) + { + string name = file.View.ReadString (index_offset, 0x20); + var entry = FormatCatalog.Instance.CreateEntry (name); + entry.Offset = file.View.ReadUInt32 (index_offset+0x20); + entry.Size = file.View.ReadUInt32 (index_offset+0x28); + if (!entry.CheckPlacement (file.MaxOffset)) + return null; + dir.Add (entry); + index_offset += 0x30; + } + return new ArcFile (file, this, dir); + } + } +}