diff --git a/ArcFormats/Malie/ArcLIB.cs b/ArcFormats/Malie/ArcLIB.cs index d1f8f03e..948cdbef 100644 --- a/ArcFormats/Malie/ArcLIB.cs +++ b/ArcFormats/Malie/ArcLIB.cs @@ -118,9 +118,28 @@ namespace GameRes.Formats.Malie } [Serializable] - public class LibScheme : ResourceScheme + public class LibScheme { - public Dictionary 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 KnownSchemes; } [Export(typeof(ArchiveFormat))] @@ -142,15 +161,15 @@ namespace GameRes.Formats.Malie if (file.MaxOffset <= 0x10) return null; 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); LibIndexReader reader; 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")) - reader = new LibUReader (file, encryption, header); + reader = new LibUReader (file, encryption, header, scheme); else continue; using (reader) @@ -209,11 +228,14 @@ namespace GameRes.Formats.Malie { byte[] m_index; long m_base_offset; + uint m_data_align; 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_data_align = scheme.DataAlign - 1; } public override List ReadIndex () @@ -236,7 +258,7 @@ namespace GameRes.Formats.Malie Buffer.BlockCopy (offsets, 0, m_offset_table, 0, 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; ReadDir ("", 0, 1); @@ -276,7 +298,8 @@ namespace GameRes.Formats.Malie { 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); m_input = new BinaryReader (input, Encoding.Unicode); @@ -380,12 +403,12 @@ namespace GameRes.Formats.Malie return Math.Min (length, read-offset_pad); } - public static Dictionary KnownKeys = new Dictionary(); + public static Dictionary KnownSchemes = new Dictionary(); public override ResourceScheme Scheme { - get { return new LibScheme { KnownKeys = KnownKeys }; } - set { KnownKeys = ((LibScheme)value).KnownKeys; } + get { return new MalieScheme { KnownSchemes = KnownSchemes }; } + set { KnownSchemes = ((MalieScheme)value).KnownSchemes; } } } diff --git a/supported.html b/supported.html index 5f195e4d..4ddf9886 100644 --- a/supported.html +++ b/supported.html @@ -616,6 +616,7 @@ Hidamari Basket
Makai Tenshi Djibril -episode 3-
Mehime no Toriko
Nanatsu no Fushigi no Owaru Toki
+Princess Lover!
Shinigami no Kiss wa Wakare no Aji
Soshite Ashita no Sekai yori
@@ -638,8 +639,9 @@ Gakuen ~Nerawareta Chitai~
Kimon Youitan
Unbalance
-*.lib
*.datLIB
LIBP
LIBUencryptedNoMalie +*.lib
*.datLIB
LIBP
LIBUencryptedNoMalie Angel Crown
+Deep Love Diary
Dies irae
Dies irae ~Amantes amentes~
Dokidoki Sister Paradise 2
@@ -647,9 +649,11 @@ Kajiri Kamui Kagura
Paradise Lost
Sakashiki Hito ni Miru Kokoro
Tenmon Dokei no Aria
+Tsumi Koi x 2/3
Zettai Meikyuu Grimm
-*.mgfMalieGFYes +*.mgfMalieGFYes +*.dziDZINo *.arc-NoAI5WIN Ai no Katachi ~Ecchi na Onna no Ko wa Kirai... Desu ka?~
Ai Shimai ~Docchi ni Suru no!!~
@@ -1126,6 +1130,7 @@ Ore Maou! ~Kudake Chitta Tamashii
Oshioki ~Gakuen Reijou Kousei Keikaku~
Ouma no Shoku ~Sei ni Tsukaeshi Yami no Guuzou~
Shukubo no Uzuki ~Hitozuma Miboujin no Nareta Karada to Amai Toiki~
+Shukubo no Uzuki 2 ~Nareta Hitozuma kara Tadayou "Onna" no Iroka~
Volley Coaching!
Yumekoi Tensei
Zoku Etsuraku no Tane
@@ -1207,6 +1212,7 @@ Triangle Heart 1-2-3
*.sgfSGNo *.pxfPXNo *.fpkFPK 0100NoMoonhirGames +Bitchin Beach
Pretty Devil Paradise ~Millium Makai Dakkan Shirei~
S Sensei no Koto