(Malie): recognize different alignment in LIBP archives.

This commit is contained in:
morkt 2016-11-15 10:20:21 +04:00
parent 0c3ea083c5
commit 0b962cf8e3
2 changed files with 43 additions and 14 deletions

View File

@ -118,9 +118,28 @@ namespace GameRes.Formats.Malie
} }
[Serializable] [Serializable]
public class LibScheme : ResourceScheme public class LibScheme
{ {
public Dictionary<string, uint[]> KnownKeys; public uint DataAlign;
public uint[] Key;
public LibScheme (uint[] key)
{
DataAlign = 0x1000;
Key = key;
}
public LibScheme (uint align, uint[] key)
{
DataAlign = align;
Key = key;
}
}
[Serializable]
public class MalieScheme : ResourceScheme
{
public Dictionary<string, LibScheme> KnownSchemes;
} }
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
@ -142,15 +161,15 @@ namespace GameRes.Formats.Malie
if (file.MaxOffset <= 0x10) if (file.MaxOffset <= 0x10)
return null; return null;
var header = new byte[0x10]; var header = new byte[0x10];
foreach (var key in KnownKeys.Values) foreach (var scheme in KnownSchemes.Values)
{ {
var encryption = new Camellia (key); var encryption = new Camellia (scheme.Key);
ReadEncrypted (file.View, encryption, 0, header, 0, 0x10); ReadEncrypted (file.View, encryption, 0, header, 0, 0x10);
LibIndexReader reader; LibIndexReader reader;
if (Binary.AsciiEqual (header, 0, "LIBP")) if (Binary.AsciiEqual (header, 0, "LIBP"))
reader = new LibPReader (file, encryption, header); reader = new LibPReader (file, encryption, header, scheme);
else if (Binary.AsciiEqual (header, 0, "LIBU")) else if (Binary.AsciiEqual (header, 0, "LIBU"))
reader = new LibUReader (file, encryption, header); reader = new LibUReader (file, encryption, header, scheme);
else else
continue; continue;
using (reader) using (reader)
@ -209,11 +228,14 @@ namespace GameRes.Formats.Malie
{ {
byte[] m_index; byte[] m_index;
long m_base_offset; long m_base_offset;
uint m_data_align;
uint[] m_offset_table; uint[] m_offset_table;
public LibPReader (ArcView file, Camellia encryption, byte[] header) : base (file, encryption, header) public LibPReader (ArcView file, Camellia encryption, byte[] header, LibScheme scheme)
: base (file, encryption, header)
{ {
m_base_offset = 0; m_base_offset = 0;
m_data_align = scheme.DataAlign - 1;
} }
public override List<Entry> ReadIndex () public override List<Entry> ReadIndex ()
@ -236,7 +258,7 @@ namespace GameRes.Formats.Malie
Buffer.BlockCopy (offsets, 0, m_offset_table, 0, offsets.Length); Buffer.BlockCopy (offsets, 0, m_offset_table, 0, offsets.Length);
m_base_offset += offsets.Length; m_base_offset += offsets.Length;
m_base_offset = (m_base_offset + 0xFFF) & ~0xFFF; m_base_offset = (m_base_offset + m_data_align) & ~m_data_align;
m_dir.Capacity = offset_count; m_dir.Capacity = offset_count;
ReadDir ("", 0, 1); ReadDir ("", 0, 1);
@ -276,7 +298,8 @@ namespace GameRes.Formats.Malie
{ {
BinaryReader m_input; BinaryReader m_input;
public LibUReader (ArcView file, Camellia encryption, byte[] header) : base (file, encryption, header) public LibUReader (ArcView file, Camellia encryption, byte[] header, LibScheme scheme)
: base (file, encryption, header)
{ {
var input = new EncryptedStream (file, encryption); var input = new EncryptedStream (file, encryption);
m_input = new BinaryReader (input, Encoding.Unicode); m_input = new BinaryReader (input, Encoding.Unicode);
@ -380,12 +403,12 @@ namespace GameRes.Formats.Malie
return Math.Min (length, read-offset_pad); return Math.Min (length, read-offset_pad);
} }
public static Dictionary<string, uint[]> KnownKeys = new Dictionary<string, uint[]>(); public static Dictionary<string, LibScheme> KnownSchemes = new Dictionary<string, LibScheme>();
public override ResourceScheme Scheme public override ResourceScheme Scheme
{ {
get { return new LibScheme { KnownKeys = KnownKeys }; } get { return new MalieScheme { KnownSchemes = KnownSchemes }; }
set { KnownKeys = ((LibScheme)value).KnownKeys; } set { KnownSchemes = ((MalieScheme)value).KnownSchemes; }
} }
} }

View File

@ -616,6 +616,7 @@ Hidamari Basket<br/>
Makai Tenshi Djibril -episode 3-<br/> Makai Tenshi Djibril -episode 3-<br/>
Mehime no Toriko<br/> Mehime no Toriko<br/>
Nanatsu no Fushigi no Owaru Toki<br/> Nanatsu no Fushigi no Owaru Toki<br/>
Princess Lover!<br/>
Shinigami no Kiss wa Wakare no Aji<br/> Shinigami no Kiss wa Wakare no Aji<br/>
Soshite Ashita no Sekai yori<br/> Soshite Ashita no Sekai yori<br/>
</td></tr> </td></tr>
@ -638,8 +639,9 @@ Gakuen ~Nerawareta Chitai~<br/>
Kimon Youitan<br/> Kimon Youitan<br/>
Unbalance<br/> Unbalance<br/>
</td></tr> </td></tr>
<tr class="odd"><td>*.lib<br/>*.dat</td><td><tt>LIB</tt><br/><tt>LIBP</tt><br/><tt>LIBU</tt><span class="footnote">encrypted</span></td><td>No</td><td rowspan="2">Malie</td><td rowspan="2"> <tr class="odd"><td>*.lib<br/>*.dat</td><td><tt>LIB</tt><br/><tt>LIBP</tt><br/><tt>LIBU</tt><span class="footnote">encrypted</span></td><td>No</td><td rowspan="3">Malie</td><td rowspan="3">
Angel Crown<br/> Angel Crown<br/>
Deep Love Diary<br/>
Dies irae<br/> Dies irae<br/>
Dies irae ~Amantes amentes~<br/> Dies irae ~Amantes amentes~<br/>
Dokidoki Sister Paradise 2<br/> Dokidoki Sister Paradise 2<br/>
@ -647,9 +649,11 @@ Kajiri Kamui Kagura<br/>
Paradise Lost<br/> Paradise Lost<br/>
Sakashiki Hito ni Miru Kokoro<br/> Sakashiki Hito ni Miru Kokoro<br/>
Tenmon Dokei no Aria<br/> Tenmon Dokei no Aria<br/>
Tsumi Koi x 2/3<br/>
Zettai Meikyuu Grimm<br/> Zettai Meikyuu Grimm<br/>
</td></tr> </td></tr>
<tr class="odd last"><td>*.mgf</td><td><tt>MalieGF</tt></td><td>Yes</td></tr> <tr class="odd"><td>*.mgf</td><td><tt>MalieGF</tt></td><td>Yes</td></tr>
<tr class="odd last"><td>*.dzi</td><td><tt>DZI</tt></td><td>No</td></tr>
<tr><td>*.arc</td><td>-</td><td>No</td><td rowspan="2">AI5WIN</td><td rowspan="2"> <tr><td>*.arc</td><td>-</td><td>No</td><td rowspan="2">AI5WIN</td><td rowspan="2">
Ai no Katachi ~Ecchi na Onna no Ko wa Kirai... Desu ka?~<br/> Ai no Katachi ~Ecchi na Onna no Ko wa Kirai... Desu ka?~<br/>
Ai Shimai ~Docchi ni Suru no!!~<br/> Ai Shimai ~Docchi ni Suru no!!~<br/>
@ -1126,6 +1130,7 @@ Ore Maou! ~Kudake Chitta Tamashii<br/>
Oshioki ~Gakuen Reijou Kousei Keikaku~<br/> Oshioki ~Gakuen Reijou Kousei Keikaku~<br/>
Ouma no Shoku ~Sei ni Tsukaeshi Yami no Guuzou~<br/> Ouma no Shoku ~Sei ni Tsukaeshi Yami no Guuzou~<br/>
Shukubo no Uzuki ~Hitozuma Miboujin no Nareta Karada to Amai Toiki~<br/> Shukubo no Uzuki ~Hitozuma Miboujin no Nareta Karada to Amai Toiki~<br/>
Shukubo no Uzuki 2 ~Nareta Hitozuma kara Tadayou "Onna" no Iroka~<br/>
Volley Coaching!<br/> Volley Coaching!<br/>
Yumekoi Tensei<br/> Yumekoi Tensei<br/>
Zoku Etsuraku no Tane<br/> Zoku Etsuraku no Tane<br/>
@ -1207,6 +1212,7 @@ Triangle Heart 1-2-3<br/>
<tr class ="odd"><td>*.sg</td><td><tt>fSG</tt></td><td>No</td></tr> <tr class ="odd"><td>*.sg</td><td><tt>fSG</tt></td><td>No</td></tr>
<tr class ="odd last"><td>*.px</td><td><tt>fPX</tt></td><td>No</td></tr> <tr class ="odd last"><td>*.px</td><td><tt>fPX</tt></td><td>No</td></tr>
<tr><td>*.fpk</td><td><tt>FPK 0100</tt></td><td>No</td><td>MoonhirGames</td><td> <tr><td>*.fpk</td><td><tt>FPK 0100</tt></td><td>No</td><td>MoonhirGames</td><td>
Bitchin Beach<br/>
Pretty Devil Paradise ~Millium Makai Dakkan Shirei~<br/> Pretty Devil Paradise ~Millium Makai Dakkan Shirei~<br/>
S Sensei no Koto<br/> S Sensei no Koto<br/>
</td></tr> </td></tr>