mirror of
https://github.com/crskycode/GARbro.git
synced 2026-07-08 01:30:18 +08:00
implemented WSM1 archives.
This commit is contained in:
@@ -25,19 +25,25 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.Composition;
|
using System.ComponentModel.Composition;
|
||||||
|
using System.IO;
|
||||||
using GameRes.Utility;
|
using GameRes.Utility;
|
||||||
|
|
||||||
namespace GameRes.Formats.Will
|
namespace GameRes.Formats.Will
|
||||||
{
|
{
|
||||||
[Export(typeof(ArchiveFormat))]
|
[Export(typeof(ArchiveFormat))]
|
||||||
public class WsmOpener : ArchiveFormat
|
public class Wsm2Opener : ArchiveFormat
|
||||||
{
|
{
|
||||||
public override string Tag { get { return "WSM"; } }
|
public override string Tag { get { return "WSM2"; } }
|
||||||
public override string Description { get { return "Tanaka Tatsuhiro's engine music archive"; } }
|
public override string Description { get { return "Tanaka Tatsuhiro's engine music archive v2"; } }
|
||||||
public override uint Signature { get { return 0x324D5357; } } // 'WSM2'
|
public override uint Signature { get { return 0x324D5357; } } // 'WSM2'
|
||||||
public override bool IsHierarchic { get { return false; } }
|
public override bool IsHierarchic { get { return false; } }
|
||||||
public override bool CanWrite { get { return false; } }
|
public override bool CanWrite { get { return false; } }
|
||||||
|
|
||||||
|
public Wsm2Opener ()
|
||||||
|
{
|
||||||
|
Extensions = new string[] { "wsm" };
|
||||||
|
}
|
||||||
|
|
||||||
public override ArcFile TryOpen (ArcView file)
|
public override ArcFile TryOpen (ArcView file)
|
||||||
{
|
{
|
||||||
uint index_size = file.View.ReadUInt32 (4);
|
uint index_size = file.View.ReadUInt32 (4);
|
||||||
@@ -55,6 +61,8 @@ namespace GameRes.Formats.Will
|
|||||||
var entry = new Entry { Type = "audio" };
|
var entry = new Entry { Type = "audio" };
|
||||||
entry.Offset = index.ToUInt32 (table_offset) - 0x14;
|
entry.Offset = index.ToUInt32 (table_offset) - 0x14;
|
||||||
entry.Size = index.ToUInt32 (table_offset+8) + 0x14;
|
entry.Size = index.ToUInt32 (table_offset+8) + 0x14;
|
||||||
|
if (!entry.CheckPlacement (file.MaxOffset))
|
||||||
|
return null;
|
||||||
table_offset += 0x20;
|
table_offset += 0x20;
|
||||||
dir.Add (entry);
|
dir.Add (entry);
|
||||||
}
|
}
|
||||||
@@ -77,4 +85,72 @@ namespace GameRes.Formats.Will
|
|||||||
return new ArcFile (file, this, dir);
|
return new ArcFile (file, this, dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Export(typeof(ArchiveFormat))]
|
||||||
|
public class Wsm1Opener : ArchiveFormat
|
||||||
|
{
|
||||||
|
public override string Tag { get { return "WSM1"; } }
|
||||||
|
public override string Description { get { return "Tanaka Tatsuhiro's engine music archive v1"; } }
|
||||||
|
public override uint Signature { get { return 0x314D5357; } } // 'WSM1'
|
||||||
|
public override bool IsHierarchic { get { return false; } }
|
||||||
|
public override bool CanWrite { get { return false; } }
|
||||||
|
|
||||||
|
public Wsm1Opener ()
|
||||||
|
{
|
||||||
|
Extensions = new string[] { "wsm" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override ArcFile TryOpen (ArcView file)
|
||||||
|
{
|
||||||
|
uint index_size = file.View.ReadUInt32 (4);
|
||||||
|
int count = file.View.ReadInt32 (8);
|
||||||
|
if (!IsSaneCount (count) || index_size >= file.MaxOffset)
|
||||||
|
return null;
|
||||||
|
var index = file.View.ReadBytes (0, index_size);
|
||||||
|
var dir = new List<Entry> (count);
|
||||||
|
int index_offset = 0x10;
|
||||||
|
for (int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
int entry_pos = index.ToInt32 (index_offset);
|
||||||
|
index_offset += 4;
|
||||||
|
int name_length = index[entry_pos];
|
||||||
|
var name = Binary.GetCString (index, entry_pos+1, name_length-1);
|
||||||
|
if (0 == name.Length)
|
||||||
|
return null;
|
||||||
|
entry_pos += name_length;
|
||||||
|
var entry = new WsmEntry {
|
||||||
|
Name = string.Format ("{0}.wav", name),
|
||||||
|
Type = "audio",
|
||||||
|
Offset = index.ToUInt32 (entry_pos+8),
|
||||||
|
Size = index.ToUInt32 (entry_pos+12),
|
||||||
|
};
|
||||||
|
if (!entry.CheckPlacement (file.MaxOffset))
|
||||||
|
return null;
|
||||||
|
entry.Format.FormatTag = 1;
|
||||||
|
entry.Format.Channels = index[entry_pos+2];
|
||||||
|
entry.Format.BitsPerSample = index[entry_pos+3];
|
||||||
|
entry.Format.SamplesPerSecond = index.ToUInt32 (entry_pos+4);
|
||||||
|
entry.Format.BlockAlign = (ushort)(entry.Format.Channels * entry.Format.BitsPerSample/8);
|
||||||
|
entry.Format.AverageBytesPerSecond = entry.Format.SamplesPerSecond * entry.Format.BlockAlign;
|
||||||
|
dir.Add (entry);
|
||||||
|
}
|
||||||
|
return new ArcFile (file, this, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Stream OpenEntry (ArcFile arc, Entry entry)
|
||||||
|
{
|
||||||
|
var went = (WsmEntry)entry;
|
||||||
|
using (var riff = new MemoryStream (0x2C))
|
||||||
|
{
|
||||||
|
WaveAudio.WriteRiffHeader (riff, went.Format, entry.Size);
|
||||||
|
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
||||||
|
return new PrefixStream (riff.ToArray(), input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class WsmEntry : Entry
|
||||||
|
{
|
||||||
|
public WaveFormat Format;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ Xross Scramble<br/>
|
|||||||
<tr class="odd"><td>*.pac</td><td><tt>PAC1</tt></td><td>No</td><td rowspan="2">RAGE</td><td rowspan="2">
|
<tr class="odd"><td>*.pac</td><td><tt>PAC1</tt></td><td>No</td><td rowspan="2">RAGE</td><td rowspan="2">
|
||||||
Brightia Plus<br/>
|
Brightia Plus<br/>
|
||||||
Hana Hiraku<br/>
|
Hana Hiraku<br/>
|
||||||
|
Hitou Meguri ~Yokujou Juurin Onsen Ki~<br/>
|
||||||
Iinari<br/>
|
Iinari<br/>
|
||||||
Kyrie ~Blood Royal 3~<br/>
|
Kyrie ~Blood Royal 3~<br/>
|
||||||
Shiosai no Himei<br/>
|
Shiosai no Himei<br/>
|
||||||
@@ -339,6 +340,7 @@ Gitai Saimin<br/>
|
|||||||
Fukou na Kami<br/>
|
Fukou na Kami<br/>
|
||||||
Saiminjutsu<br/>
|
Saiminjutsu<br/>
|
||||||
Soukan Yuugi 2<br/>
|
Soukan Yuugi 2<br/>
|
||||||
|
Ura Saiminjutsu 2<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr class="odd"><td>*.bmd</td><td><tt>_BMD</tt></td><td>Yes</td></tr>
|
<tr class="odd"><td>*.bmd</td><td><tt>_BMD</tt></td><td>Yes</td></tr>
|
||||||
<tr class="odd last"><td>*.asd</td><td>-</td><td>No</td></tr>
|
<tr class="odd last"><td>*.asd</td><td>-</td><td>No</td></tr>
|
||||||
@@ -449,6 +451,7 @@ Doushite Daite Kurenai no!?<span class="footnote">ShiinaRio v2.49</span><br/>
|
|||||||
Douryou no Oku-san ~Netori Tsuma, Netorare Tsuma~ <span class="footnote">ShiinaRio v2.46</span><br/>
|
Douryou no Oku-san ~Netori Tsuma, Netorare Tsuma~ <span class="footnote">ShiinaRio v2.46</span><br/>
|
||||||
Draculius <span class="footnote">ShiinaRio v2.38</span><br/>
|
Draculius <span class="footnote">ShiinaRio v2.38</span><br/>
|
||||||
Enkaku Sousa <span class="footnote">2.36 or 2.37</span><br/>
|
Enkaku Sousa <span class="footnote">2.36 or 2.37</span><br/>
|
||||||
|
Gakushoku no Oba-san The Motion <span class="footnote">ShiinaRio v2.48</span><br/>
|
||||||
Gensou no Idea ~Oratorio Phantasm Historia~<span class="footnote">ShiinaRio v2.49</span><br/>
|
Gensou no Idea ~Oratorio Phantasm Historia~<span class="footnote">ShiinaRio v2.49</span><br/>
|
||||||
Gohoushi Nurse ~Mayonaka no Kyousei Call~ <span class="footnote">ShiinaRio v2.50</span><br/>
|
Gohoushi Nurse ~Mayonaka no Kyousei Call~ <span class="footnote">ShiinaRio v2.50</span><br/>
|
||||||
Hana no Kioku 1-2-3 <span class="footnote">ShiinaRio v2.10</span><br/>
|
Hana no Kioku 1-2-3 <span class="footnote">ShiinaRio v2.10</span><br/>
|
||||||
@@ -492,6 +495,7 @@ Tekoire Princess!<span class="footnote">ShiinaRio v2.37</span><br/>
|
|||||||
Toriko no Chigiri<span class="footnote">ShiinaRio v2.49</span><br/>
|
Toriko no Chigiri<span class="footnote">ShiinaRio v2.49</span><br/>
|
||||||
Wana ~Hakudaku Mamire no Houkago~<span class="footnote">ShiinaRio v2.36</span><br/>
|
Wana ~Hakudaku Mamire no Houkago~<span class="footnote">ShiinaRio v2.36</span><br/>
|
||||||
Wana II ~Gang Rape~<span class="footnote">ShiinaRio v2.44</span><br/>
|
Wana II ~Gang Rape~<span class="footnote">ShiinaRio v2.44</span><br/>
|
||||||
|
Yokorenbo ~Immoral Mother~ <span class="footnote">ShiinaRio v2.44</span><br/>
|
||||||
Yoyogi Hitozuma Senmon Gakuin<span class="footnote">ShiinaRio v2.37</span><br/>
|
Yoyogi Hitozuma Senmon Gakuin<span class="footnote">ShiinaRio v2.37</span><br/>
|
||||||
Zansho Omimai Moushiagemasu<span class="footnote">ShiinaRio v2.41</span><br/>
|
Zansho Omimai Moushiagemasu<span class="footnote">ShiinaRio v2.41</span><br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
@@ -956,6 +960,7 @@ Otto no Mae de Okasarete...<br/>
|
|||||||
<tr class="odd"><td>*.arc</td><td>-</td><td>No</td><td rowspan="2">AI6WIN</td><td rowspan="2">
|
<tr class="odd"><td>*.arc</td><td>-</td><td>No</td><td rowspan="2">AI6WIN</td><td rowspan="2">
|
||||||
Gakuen Saimin Reido<br/>
|
Gakuen Saimin Reido<br/>
|
||||||
Jokei Kazoku 3<br/>
|
Jokei Kazoku 3<br/>
|
||||||
|
Mama no Oppai ~Ore no Doutei Milk ga Shiboritorareta Ken~<br/>
|
||||||
Shinsou Noise<br/>
|
Shinsou Noise<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr class="odd last"><td>*.akb</td><td><tt>AKB</tt></td><td>No</td></tr>
|
<tr class="odd last"><td>*.akb</td><td><tt>AKB</tt></td><td>No</td></tr>
|
||||||
@@ -1383,8 +1388,9 @@ Mite Kudasaimasu?<br/>
|
|||||||
<tr class ="odd"><td>*.dpm<br/>*.bin</td><td><tt>DPMX</tt></td><td>No</td><td>Hot Soup Processor</td><td>
|
<tr class ="odd"><td>*.dpm<br/>*.bin</td><td><tt>DPMX</tt></td><td>No</td><td>Hot Soup Processor</td><td>
|
||||||
femme fatale<br/>
|
femme fatale<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td>*.cdt<br/>*.pdt<br/>*.vdt</td><td><tt>RK1</tt></td><td>No</td><td rowspan="2">NEJII</td><td rowspan="2">
|
<tr><td>*.cdt<br/>*.pdt<br/>*.vdt<br/>*.ovd</td><td><tt>RK1</tt></td><td>No</td><td rowspan="2">NEJII</td><td rowspan="2">
|
||||||
Kidou Houshinki<br/>
|
Kidou Houshinki<br/>
|
||||||
|
Sutadoru!<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td class="last">*.pcd</td><td>-</td><td>No</td></tr>
|
<tr><td class="last">*.pcd</td><td>-</td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*.tac</td><td><tt>TArc1.10</tt><br/><tt>TArc1.00</tt></td><td>No</td><td>TanukiSoft</td><td>
|
<tr class="odd"><td>*.tac</td><td><tt>TArc1.10</tt><br/><tt>TArc1.00</tt></td><td>No</td><td>TanukiSoft</td><td>
|
||||||
@@ -1396,12 +1402,13 @@ Dedenden!<br/>
|
|||||||
</td></tr>
|
</td></tr>
|
||||||
<tr class="odd"><td>*.arc</td><td><tt>ARC0</tt></td><td>No</td><td rowspan="7">Will</td><td rowspan="7">
|
<tr class="odd"><td>*.arc</td><td><tt>ARC0</tt></td><td>No</td><td rowspan="7">Will</td><td rowspan="7">
|
||||||
Bishimai Kutsujoku no Heya<br/>
|
Bishimai Kutsujoku no Heya<br/>
|
||||||
|
~Miboujin~ Niku Dorei<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr class="odd"><td>*.bmx</td><td>-</td><td>No</td></tr>
|
<tr class="odd"><td>*.bmx</td><td>-</td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*.mbf</td><td><tt>MBF0</tt></td><td>No</td></tr>
|
<tr class="odd"><td>*.mbf</td><td><tt>MBF0</tt></td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*.vpk</td><td><tt>VPK1</tt></td><td>No</td></tr>
|
<tr class="odd"><td>*.vpk</td><td><tt>VPK1</tt></td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*.wrc</td><td><tt>WVX0</tt></td><td>No</td></tr>
|
<tr class="odd"><td>*.wrc</td><td><tt>WVX0</tt></td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*.wsm</td><td><tt>WSM2</tt></td><td>No</td></tr>
|
<tr class="odd"><td>*.wsm</td><td><tt>WSM1</tt><br/><tt>WSM2</tt></td><td>No</td></tr>
|
||||||
<tr class="odd"><td>*</td><td><tt>BC</tt></td><td>No</td></tr>
|
<tr class="odd"><td>*</td><td><tt>BC</tt></td><td>No</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<p><a name="note-1" class="footnote">1</a> Non-encrypted only</p>
|
<p><a name="note-1" class="footnote">1</a> Non-encrypted only</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user