mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-27 15:44:00 +08:00
WARC archive variation.
This commit is contained in:
parent
0fb2fa9a8a
commit
a5a9d10678
@ -440,7 +440,9 @@
|
|||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Strings\arcStrings.ru-RU.resx" />
|
<EmbeddedResource Include="Strings\arcStrings.ru-RU.resx" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Resources\ShiinaRio5.png" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PreBuildEvent>perl "$(SolutionDir)inc-revision.pl" "$(ProjectPath)" $(ConfigurationName)</PreBuildEvent>
|
<PreBuildEvent>perl "$(SolutionDir)inc-revision.pl" "$(ProjectPath)" $(ConfigurationName)</PreBuildEvent>
|
||||||
|
@ -150,6 +150,8 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
|
|||||||
|
|
||||||
if (0 != (wentry.Flags & 0x80000000u) && entry.Size > 8) // encrypted entry
|
if (0 != (wentry.Flags & 0x80000000u) && entry.Size > 8) // encrypted entry
|
||||||
warc.Decoder.Decrypt (enc_data, 8, entry.Size-8);
|
warc.Decoder.Decrypt (enc_data, 8, entry.Size-8);
|
||||||
|
if (warc.Decoder.SchemeVersion >= 2490)
|
||||||
|
warc.Decoder.DecryptExtra (enc_data, 8, entry.Size-8, 0x202);
|
||||||
if (0 != (wentry.Flags & 0x20000000u) && entry.Size > 8)
|
if (0 != (wentry.Flags & 0x20000000u) && entry.Size > 8)
|
||||||
warc.Decoder.Decrypt2 (enc_data, 8, entry.Size-8);
|
warc.Decoder.Decrypt2 (enc_data, 8, entry.Size-8);
|
||||||
|
|
||||||
@ -172,11 +174,9 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
|
|||||||
unpacked = new byte[unpacked_size];
|
unpacked = new byte[unpacked_size];
|
||||||
unpack (enc_data, unpacked);
|
unpack (enc_data, unpacked);
|
||||||
if (0 != (wentry.Flags & 0x40000000))
|
if (0 != (wentry.Flags & 0x40000000))
|
||||||
{
|
|
||||||
warc.Decoder.Decrypt2 (unpacked, 0, (uint)unpacked.Length);
|
warc.Decoder.Decrypt2 (unpacked, 0, (uint)unpacked.Length);
|
||||||
if (warc.Decoder.SchemeVersion >= 2490)
|
if (warc.Decoder.SchemeVersion >= 2490)
|
||||||
warc.Decoder.Decrypt3 (unpacked, 0, (uint)unpacked.Length);
|
warc.Decoder.DecryptExtra (unpacked, 0, (uint)unpacked.Length, 0x204);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return new MemoryStream (unpacked);
|
return new MemoryStream (unpacked);
|
||||||
}
|
}
|
||||||
@ -610,6 +610,7 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
|
|||||||
public byte[] ShiinaImage;
|
public byte[] ShiinaImage;
|
||||||
public byte[] Region;
|
public byte[] Region;
|
||||||
public byte[] DecodeBin;
|
public byte[] DecodeBin;
|
||||||
|
public byte[] DecodeExtra;
|
||||||
|
|
||||||
private static CachedResource Resource = new CachedResource();
|
private static CachedResource Resource = new CachedResource();
|
||||||
|
|
||||||
@ -641,6 +642,8 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
|
|||||||
LittleEndian.Pack (decode_patch.Value, scheme.DecodeBin, 0x1020);
|
LittleEndian.Pack (decode_patch.Value, scheme.DecodeBin, 0x1020);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (version >= 2490)
|
||||||
|
scheme.DecodeExtra = Resource.Load ("ShiinaRio5.png");
|
||||||
return scheme;
|
return scheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -835,6 +838,36 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
|
|||||||
data[index+0x105] ^= (byte)(key >> 8);
|
data[index+0x105] ^= (byte)(key >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DecryptExtra (byte[] data, int index, uint length, uint flags)
|
||||||
|
{
|
||||||
|
if (length < 0x400 || null == m_scheme.DecodeExtra)
|
||||||
|
return;
|
||||||
|
uint key = 0xECB2F5B2;
|
||||||
|
uint k0 = key + 1;
|
||||||
|
uint k3 = k0 + 2;
|
||||||
|
uint k2 = k0 + 1;
|
||||||
|
uint k1 = k0 + 3;
|
||||||
|
if ((flags & 0x202) == 0x202)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 0xFF; ++i)
|
||||||
|
{
|
||||||
|
uint j = k3 ^ (k3 << 11) ^ k0 ^ ((k3 ^ (k3 << 11) ^ (k0 >> 11)) >> 8);
|
||||||
|
k3 = k2;
|
||||||
|
k2 = k1;
|
||||||
|
k1 = k0;
|
||||||
|
k0 = j;
|
||||||
|
data[index + i] ^= m_scheme.DecodeExtra[j % m_scheme.DecodeExtra.Length];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((flags & 0x204) == 0x204)
|
||||||
|
{
|
||||||
|
data[index + 0x200] ^= (byte)key;
|
||||||
|
data[index + 0x201] ^= (byte)(key >> 8);
|
||||||
|
data[index + 0x202] ^= (byte)(key >> 16);
|
||||||
|
data[index + 0x203] ^= (byte)(key >> 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
double DecryptHelper1 (double a)
|
double DecryptHelper1 (double a)
|
||||||
{
|
{
|
||||||
if (a < 0)
|
if (a < 0)
|
||||||
|
@ -188,10 +188,6 @@ namespace GameRes.Formats.ShiinaRio
|
|||||||
for (int y = 0; y < m_height; ++y)
|
for (int y = 0; y < m_height; ++y)
|
||||||
{
|
{
|
||||||
uint row_pos = rows[y];
|
uint row_pos = rows[y];
|
||||||
// if (183 == y)
|
|
||||||
// System.Diagnostics.Debugger.Break();
|
|
||||||
// if (0x82 == y)
|
|
||||||
// System.Diagnostics.Debugger.Break();
|
|
||||||
if (input_rows.ContainsKey (row_pos))
|
if (input_rows.ContainsKey (row_pos))
|
||||||
{
|
{
|
||||||
input_lines[y] = input_rows[row_pos];
|
input_lines[y] = input_rows[row_pos];
|
||||||
|
@ -218,6 +218,7 @@ Najimi no Oba-chan <span class="footnote">ShiinaRio v2.47</span><br/>
|
|||||||
Otome Juurin Yuugi <span class="footnote">ShiinaRio v2.37</span><br/>
|
Otome Juurin Yuugi <span class="footnote">ShiinaRio v2.37</span><br/>
|
||||||
Ran→Sem <span class="footnote">ShiinaRio v2.47</span><br/>
|
Ran→Sem <span class="footnote">ShiinaRio v2.47</span><br/>
|
||||||
Rin×Sen <span class="footnote">ShiinaRio v2.47</span><br/>
|
Rin×Sen <span class="footnote">ShiinaRio v2.47</span><br/>
|
||||||
|
Shojo Mama<span class="footnote">ShiinaRio v2.49</span><br/>
|
||||||
Tantei Shounen A<br/>
|
Tantei Shounen A<br/>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td>*.s25</td><td><tt>S25</tt></td><td>No</td></tr>
|
<tr><td>*.s25</td><td><tt>S25</tt></td><td>No</td></tr>
|
||||||
|
Loading…
Reference in New Issue
Block a user