support WARC archives version 1.30

This commit is contained in:
morkt 2015-06-21 20:44:16 +04:00
parent 598b50750b
commit fc411624df

View File

@ -75,7 +75,7 @@ namespace GameRes.Formats.ShiinaRio
return null; return null;
int version = file.View.ReadByte (7) - 0x30; int version = file.View.ReadByte (7) - 0x30;
version = 100 + version * 10; version = 100 + version * 10;
if (170 != version) if (170 != version && 130 != version)
throw new NotSupportedException ("Not supported WARC version"); throw new NotSupportedException ("Not supported WARC version");
uint index_offset = 0xf182ad82u ^ file.View.ReadUInt32 (8); uint index_offset = 0xf182ad82u ^ file.View.ReadUInt32 (8);
if (index_offset >= file.MaxOffset) if (index_offset >= file.MaxOffset)
@ -105,7 +105,7 @@ namespace GameRes.Formats.ShiinaRio
else else
{ {
var unpacked = new byte[max_index_len]; var unpacked = new byte[max_index_len];
index_length = UnpackRNG (enc_index, unpacked); index_length = UnpackRNG (enc_index, 0, index_length, unpacked);
if (0 == index_length) if (0 == index_length)
return null; return null;
index = new MemoryStream (unpacked, 0, (int)index_length); index = new MemoryStream (unpacked, 0, (int)index_length);
@ -173,7 +173,7 @@ namespace GameRes.Formats.ShiinaRio
unpack = UnpackYPK; unpack = UnpackYPK;
break; break;
case 0x5a4c59: // 'YLZ' case 0x5a4c59: // 'YLZ'
unpack = UnpackYPK; unpack = UnpackYLZ;
break; break;
} }
if (null != unpack) if (null != unpack)
@ -262,11 +262,11 @@ namespace GameRes.Formats.ShiinaRio
decoder.Unpack(); decoder.Unpack();
} }
uint UnpackRNG (byte[] input, byte[] output) uint UnpackRNG (byte[] input, int in_start, uint input_size, byte[] output)
{ {
var coder = new Kogado.CRangeCoder(); var coder = new Kogado.CRangeCoder();
coder.InitQSModel (257, 12, 2000, null, false); coder.InitQSModel (257, 12, 2000, null, false);
return coder.Decode (output, 0, (uint)output.Length, input, 1, (uint)input.Length-1); return coder.Decode (output, 0, (uint)output.Length, input, (uint)in_start, input_size);
} }
public override ResourceOptions GetDefaultOptions () public override ResourceOptions GetDefaultOptions ()
@ -310,6 +310,7 @@ namespace GameRes.Formats.ShiinaRio
bool GetCtlBit () bool GetCtlBit ()
{ {
m_mask >>= 1;
if (0 == m_mask) if (0 == m_mask)
{ {
m_ctl = LittleEndian.ToUInt32 (m_input, m_src); m_ctl = LittleEndian.ToUInt32 (m_input, m_src);
@ -317,7 +318,6 @@ namespace GameRes.Formats.ShiinaRio
m_mask = 0x80000000; m_mask = 0x80000000;
} }
bool bit = 0 != (m_ctl & m_mask); bool bit = 0 != (m_ctl & m_mask);
m_mask >>= 1;
return bit; return bit;
} }
@ -1208,7 +1208,7 @@ namespace GameRes.Formats.ShiinaRio
public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[] public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[]
{ {
EncryptionScheme.Create (2360, "ShiinaRio v2.3x"), EncryptionScheme.Create (2360, "ShiinaRio v2.36 and older"),
EncryptionScheme.Create (2480, "Bloody Rondo", "BLOODY†RONDO", EncryptionScheme.Create (2480, "Bloody Rondo", "BLOODY†RONDO",
new uint[] { 0xFBFBF8F6, 0xFBE6EDF0, 0xFBF0FA, 0, 0 }), new uint[] { 0xFBFBF8F6, 0xFBE6EDF0, 0xFBF0FA, 0, 0 }),
EncryptionScheme.Create (2450, "Chuuchuu Nurse", "ちゅうちゅうナース", EncryptionScheme.Create (2450, "Chuuchuu Nurse", "ちゅうちゅうナース",