From 601b335238c7d4f6a0cb01ea4d091d878dd2ce38 Mon Sep 17 00:00:00 2001 From: morkt Date: Sun, 12 Nov 2017 10:05:49 +0400 Subject: [PATCH] (WSM): recognize 'WSM4' archives. --- ArcFormats/Tanaka/ArcWSM.cs | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ArcFormats/Tanaka/ArcWSM.cs b/ArcFormats/Tanaka/ArcWSM.cs index 4b904893..a7298315 100644 --- a/ArcFormats/Tanaka/ArcWSM.cs +++ b/ArcFormats/Tanaka/ArcWSM.cs @@ -157,4 +157,49 @@ namespace GameRes.Formats.Will { public WaveFormat Format; } + + [Export(typeof(ArchiveFormat))] + public class Wsm4Opener : ArchiveFormat + { + public override string Tag { get { return "WSM4"; } } + public override string Description { get { return "Tanaka Tatsuhiro's engine music archive v4"; } } + public override uint Signature { get { return 0x344D5357; } } // 'WSM4' + public override bool IsHierarchic { get { return false; } } + public override bool CanWrite { get { return false; } } + + public Wsm4Opener () + { + Extensions = new string[] { "wsm" }; + } + + public override ArcFile TryOpen (ArcView file) + { + uint data_offset = file.View.ReadUInt32 (4); + int count = file.View.ReadInt32 (0xC); + if (!IsSaneCount (count) || data_offset >= file.MaxOffset) + return null; + int table_offset = file.View.ReadInt32 (0x10); + int table_count = file.View.ReadInt32 (0x14); + if (table_offset >= data_offset || !IsSaneCount (table_count)) + return null; + var dir = new List (count); + for (int i = 0; i < table_count; ++i) + { + var entry = new Entry { Type = "audio" }; + entry.Offset = file.View.ReadUInt32 (table_offset); + entry.Size = file.View.ReadUInt32 (table_offset+4); + if (!entry.CheckPlacement (file.MaxOffset)) + return null; + table_offset += 0x24; + dir.Add (entry); + } + int index_offset = 0x44; + for (int i = 0; i < count; ++i) + { + dir[i].Name = file.View.ReadString (index_offset, 0x40); + index_offset += 0x1A8; + } + return new ArcFile (file, this, dir); + } + } }