From 983d49346e72417dc3431206ba4b17a05b5dfdb4 Mon Sep 17 00:00:00 2001 From: morkt Date: Fri, 2 Sep 2016 09:37:56 +0400 Subject: [PATCH] (IafFormat): image variation. --- ArcFormats/Triangle/ImageIAF.cs | 40 +++++++++++++++++++-------------- supported.html | 3 +++ 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/ArcFormats/Triangle/ImageIAF.cs b/ArcFormats/Triangle/ImageIAF.cs index 0d597780..04632f69 100644 --- a/ArcFormats/Triangle/ImageIAF.cs +++ b/ArcFormats/Triangle/ImageIAF.cs @@ -52,42 +52,48 @@ namespace GameRes.Formats.Triangle var header = new byte[0x14]; if (12 != stream.Read (header, 0, 12)) return null; - int data_offset; int packed_size0 = LittleEndian.ToInt32 (header, 0); int packed_size1 = LittleEndian.ToInt32 (header, 1); - int x, y, packed_size, unpacked_size; + int data_offset, packed_size, unpacked_pos; + int tail_size = 0; if (5+packed_size1+0x14 == stream.Length) { packed_size = packed_size1; data_offset = 5; - stream.Seek (-0x14, SeekOrigin.End); - if (0x14 != stream.Read (header, 0, 0x14)) - return null; - x = LittleEndian.ToInt32 (header, 0); - y = LittleEndian.ToInt32 (header, 4); - unpacked_size = LittleEndian.ToInt32 (header, 0x10); + tail_size = 0x14; + unpacked_pos = 0x10; + } + else if (5+packed_size1+0xC == stream.Length) + { + packed_size = packed_size1; + data_offset = 5; + tail_size = 12; + unpacked_pos = 8; } else if (4+packed_size0+0xC == stream.Length) { packed_size = packed_size0; data_offset = 4; - stream.Seek (-12, SeekOrigin.End); - if (12 != stream.Read (header, 0, 12)) - return null; - x = LittleEndian.ToInt32 (header, 0); - y = LittleEndian.ToInt32 (header, 4); - unpacked_size = LittleEndian.ToInt32 (header, 8); + tail_size = 12; + unpacked_pos = 8; } else { packed_size = (int)stream.Length-12; data_offset = 12; - x = LittleEndian.ToInt32 (header, 0); - y = LittleEndian.ToInt32 (header, 4); - unpacked_size = LittleEndian.ToInt32 (header, 8); + unpacked_pos = 8; } + if (tail_size > 0) + { + stream.Seek (-tail_size, SeekOrigin.End); + if (tail_size != stream.Read (header, 0, tail_size)) + return null; + } + int x = LittleEndian.ToInt32 (header, 0); + int y = LittleEndian.ToInt32 (header, 4); if (Math.Abs (x) > 4096 || Math.Abs (y) > 4096) return null; + int unpacked_size = LittleEndian.ToInt32 (header, unpacked_pos); int pack_type = (unpacked_size >> 30) & 3; if (3 == pack_type) return null; diff --git a/supported.html b/supported.html index ced3e887..e64a0ae8 100644 --- a/supported.html +++ b/supported.html @@ -512,6 +512,7 @@ Zettai Joshi Ryouiki!
*.eri
*.mioEntis\x1aNo *.saf-NoLuneRinkan Gakuen *.arc+*.ariWFL1NoKaGuYa +Bishoku
Dungeon Crusaderz ~Tales of Demon Eater~
Dungeon Crusaderz 2 ~Eigou no Rakudo~
Inkou Haden Amatsu ~Hakudaku no Juin~
@@ -643,6 +644,7 @@ Zettai★Maou ~Boku no Mune-kyun Gakuen Saga~
*.sud-NoTriangle Kourin Tenshi En Ciel Rena
+Mahou Senshi Princess Tear
Mahou Senshi Sweet Knights ~Heroine Ryoujoku Shirei~
Mamagoto
Monster Park ~Bakemono ni Miirareshi Hime~
@@ -843,6 +845,7 @@ Verdia Gensoukyoku
Wondering Repair!
*.pac-NoTmr-Hiro ADV System +Dennou Shinpan Kisaragi Sanjikan
Gokkun Athlete! Kyonyuu Medalist no Oshaburi Kyouka Gasshuku
Hitozuma Sakunyuu Hyakkaten
Mai Miko Moe