(KAAS): PbOpener moved to separate file.

This commit is contained in:
morkt
2017-03-11 11:46:10 +04:00
parent b0329096ff
commit 5b6f4e2c27
3 changed files with 97 additions and 65 deletions

View File

@@ -158,12 +158,38 @@ namespace GameRes.Formats.KAAS
return new PdOverlayImage (input, overlay_info, baseline);
}
}
return base.OpenImage (arc, entry);
return base.OpenImage (arc, entry); // essentialy InvalidFormatException
}
static readonly Lazy<ImageFormat> s_picFormat = new Lazy<ImageFormat> (() => ImageFormat.FindByTag ("PIC/KAAS"));
}
internal sealed class OldDecryptor : IIndexDecryptor
{
public void Decrypt (byte[] data, byte key)
{
for (int i = 0; i != data.Length; ++i)
{
int k = i + 14;
int r = 9 - (k & 7) * (k + 5) * key * 0x77;
data[i] -= (byte)r;
}
}
}
internal sealed class DiscoveryDecryptor : IIndexDecryptor
{
public void Decrypt (byte[] data, byte key)
{
for (int i = 0; i != data.Length; ++i)
{
int k = i + 14;
int r = ((k * 0x6b) % (k / 2 + 1)) + key * 0x3b * (k + 11) * (k % (k + 17));
data[i] -= (byte)r;
}
}
}
internal class PdOverlayMetaData : ImageMetaData
{
public int Method;
@@ -213,68 +239,4 @@ namespace GameRes.Formats.KAAS
}
}
}
[Export(typeof(ArchiveFormat))]
public class PbOpener : ArchiveFormat
{
public override string Tag { get { return "PB"; } }
public override string Description { get { return "KAAS engine audio archive"; } }
public override uint Signature { get { return 0; } }
public override bool IsHierarchic { get { return false; } }
public override bool CanWrite { get { return false; } }
public override ArcFile TryOpen (ArcView file)
{
if (!file.Name.EndsWith (".pb", StringComparison.InvariantCultureIgnoreCase))
return null;
int count = file.View.ReadInt32 (0);
if (count <= 0 || count > 0xfff)
return null;
var dir = new List<Entry> (count);
int index_offset = 0x10;
bool is_voice = VFS.IsPathEqualsToFileName (file.Name, "voice.pb");
int data_offset = index_offset + 8 * count;
for (int i = 0; i < count; ++i)
{
uint offset = file.View.ReadUInt32 (index_offset);
Entry entry;
if (!is_voice)
entry = new Entry { Name = i.ToString ("D4"), Type = "audio", Offset = offset };
else
entry = new Entry { Name = string.Format ("{0:D4}.pb", i), Type = "archive", Offset = offset };
entry.Size = file.View.ReadUInt32 (index_offset + 4);
if (offset < data_offset || !entry.CheckPlacement (file.MaxOffset))
return null;
dir.Add (entry);
index_offset += 8;
}
return new ArcFile (file, this, dir);
}
}
internal sealed class OldDecryptor : IIndexDecryptor
{
public void Decrypt (byte[] data, byte key)
{
for (int i = 0; i != data.Length; ++i)
{
int k = i + 14;
int r = 9 - (k & 7) * (k + 5) * key * 0x77;
data[i] -= (byte)r;
}
}
}
internal sealed class DiscoveryDecryptor : IIndexDecryptor
{
public void Decrypt (byte[] data, byte key)
{
for (int i = 0; i != data.Length; ++i)
{
int k = i + 14;
int r = ((k * 0x6b) % (k / 2 + 1)) + key * 0x3b * (k + 11) * (k % (k + 17));
data[i] -= (byte)r;
}
}
}
}