From b587d260094e2e53212d6784f57c93ec4efdb4a8 Mon Sep 17 00:00:00 2001 From: devseed Date: Sun, 20 Sep 2020 11:37:10 +0900 Subject: [PATCH 1/7] fixed comile --- ArcFormats/ArcFormats.csproj | 26 +++++++++++++++++--------- ArcFormats/Gss/ArcARC.cs | 22 +++++++++++++--------- ArcFormats/packages.config | 6 +++++- Console/ConsoleBrowser.cs | 16 ++++++++++------ Console/GARbro.Console.csproj | 1 + Console/GARbro.Console.csproj.user | 2 +- GARbro.sln | 8 ++++++-- GUI/GARbro.GUI.csproj | 8 +------- GameRes/GameRes.csproj | 6 ------ Image.Convert/Program.cs | 4 ++-- Legacy/Legacy.csproj | 2 +- 11 files changed, 57 insertions(+), 44 deletions(-) diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index 95ff52b7..e82486f3 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -48,6 +48,9 @@ prompt MinimumRecommendedRules.ruleset + + false + ..\packages\SharpZipLib.1.1.0\lib\net45\ICSharpCode.SharpZipLib.dll @@ -56,18 +59,29 @@ ..\packages\NAudio.1.7.3\lib\net35\NAudio.dll - - ..\packages\NVorbis.0.8.6\lib\net35\NVorbis.dll - True + + ..\packages\NVorbis.0.10.1\lib\net45\NVorbis.dll + + ..\packages\System.Buffers.4.4.0\lib\netstandard1.1\System.Buffers.dll + + + ..\packages\System.Memory.4.5.3\lib\netstandard1.1\System.Memory.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll + @@ -1216,12 +1230,6 @@ exit 0 xcopy "$(ProjectDir)\Resources\Formats.dat" "$(TargetDir)\GameData\" /D /Y >NUL - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - 0) - output[dst++] = v; + case 0xF0: return 0; + case 0x40: + input.Read(output, dst, count); + dst += count; break; - } - case 0xE0: - { + case 0xD0: count = count << 8 | input.ReadUInt8(); - byte v = input.ReadUInt8(); - while (count --> 0) - output[dst++] = v; + input.Read(output, dst, count); + dst += count; break; - } - case 0x00: - dst += count; - break; + case 0x80: + { + byte v = input.ReadUInt8(); + while (count-- > 0) + output[dst++] = v; + break; + } - case 0xC0: - count = count << 8 | input.ReadUInt8(); - dst += count; - break; + case 0xE0: + { + count = count << 8 | input.ReadUInt8(); + byte v = input.ReadUInt8(); + while (count-- > 0) + output[dst++] = v; + break; + } + + case 0x00: + dst += count; + break; + + case 0xC0: + count = count << 8 | input.ReadUInt8(); + dst += count; + break; } } } - unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) + int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) { // buf = (_BYTE *)&unk_811C6780; @@ -191,22 +189,22 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) //memset(0x811C6780, 0, 0x2000); // buf1 //memset(0x811C8784, 0, 0x800); // buf2 //memset(0x811C8F84, 0, 0x800); // buf3 - var buf = new Byte[0x10000]; + var buf = new Byte[0x100000]; Array.Clear(buf, 0, buf.Length); const uint buf2_off = 0x2004; const uint buf3_off = 0x2804; const uint buf4_off = 0x3004; //0x811C9784 - uint cur_addr = 2, next = 2, cur_output_addr=0; - int first_char = buf_packed[0]; + uint cur_addr = 2, next = 2, cur_output_addr = 0; + byte first_char = buf_packed[0]; int v8 = 0; - int i2, v28, v29; - byte outchar, i1 = 0; + int i2, v28; + byte outchar, i1 = 0, v29; do { var v10 = next; int cur_char1 = buf_packed[cur_addr]; - var v32 =cur_addr + 1; + var v32 = cur_addr + 1; ++next; if (cur_char1 != 0) { @@ -244,7 +242,7 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) next = v10 + 4; i1++; } - + } else { @@ -298,17 +296,17 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) } while (v19 != 0x18); buf[0x301c] = (byte)v18; //unk_811C979C = v18; - int v35 = 0; + int size_done = 0; Int64 v33 = 0; Array.Clear(buf, 0x3028, 8);//qword_811C97A8 = 0i64; int v23 = (int)unpacked_size; while (true) { //v24 = next + ((unsigned int)(v33 & 0x1F) >> 3) +((v33 >> 3) & 0xFFFFFFFC); - int v24 = (int)(next + ((uint)(v33 & 0x1F)>>3) +((v33 >> 3) & 0xFFFFFFFC)); - v23 = (int)((v23 & 0xffffff00) + buf_packed[v24 + 3]); // LOBYTE(v23) = buf_packed[v24 + 3]; - Int64 v25 = (Int64)((((buf_packed[v24] | (buf_packed[v24 + 1] << 8)) & 0xFF00FFFF) | (buf_packed[v24 + 2] << 16)) & 0xFFFFFF | (v23 << 24)); - ushort cur_char2 = (ushort)first_char; + int v24 = (int)(next + ((uint)(v33 & 0x1F) >> 3) + ((v33 >> 3) & 0xFFFFFFFC)); //this place, out of range + v23 = (int)((v23 & 0xffffff00) + buf_packed[v24 + 3]); // LOBYTE(v23) = buf_packed[v24 + 3]; + int v25 = (int)((((buf_packed[v24] | (buf_packed[v24 + 1] << 8)) & 0xFF00FFFF) | (buf_packed[v24 + 2] << 16)) & 0xFFFFFF | (v23 << 24)); + byte cur_char2 = first_char; uint v27 = sub_8105E56C((uint)v25, (uint)(v25 >> 32), (uint)((v33 & 0x1F) - (v33 & 0x18))); if (first_char != 0xD) { @@ -318,12 +316,12 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) v28 = (int)(v27 & dword_8107F828[2 * cur_char2]); //dword_811C8780 = 2 * v28 + 0x811C6780; // buf2 - 4 var tmp2 = BitConverter.GetBytes(2 * v28 + 0x811C6780); - tmp2.CopyTo(buf, buf2_off - 4); + //tmp2.CopyTo(buf, buf2_off - 4); //if ( cur_char2 == *(_BYTE *)(2 * v28 + 0x811C6781) )// buf1+1 - if (cur_char2 == buf[2*v28+1])// buf1+1 + if (cur_char2 == buf[2 * v28 + 1])// buf1+1 break; cur_char2++; - if ((ushort)cur_char2 == 0xD) + if (cur_char2 == 0xD) goto LABEL_22; } //v30 = *(_BYTE*)(2 * v28 + 0x811C6780); // buf1 @@ -338,7 +336,7 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) //v29 = *(_BYTE*)(cur_char2 + 0x811C9784); // buf4 v29 = buf[buf4_off + cur_char2]; //if (v29 != *(_BYTE*)(cur_char2 + 0x811C9785))// buf4+1 - if (v29 != buf[buf4_off + 1 + cur_char2]) + if (v29 != buf[buf4_off + 1 + cur_char2]) break; LABEL_26: //goto can not jump here if (++cur_char2 == 0x18) @@ -349,9 +347,9 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) } //while (*(_DWORD*)(8 * v29 + 0x811C8784) != (v27 & *(_DWORD*)(8 * cur_char2 + 0x8107F828)))// buf2, const1 while (BitConverter.ToUInt32(buf, (int)buf2_off + 8 * v29) != - dword_8107F828[2*cur_char2]) + dword_8107F828[2 * cur_char2]) { - v29 = (ushort)(v29 + 1) & 0xffff; + v29++; //if ( (unsigned __int16)v29 == *(_BYTE *)(cur_char2 + 0x811C9785) )// buf4+1 if (v29 == buf[buf4_off + 1 + cur_char2]) { @@ -378,19 +376,21 @@ unsafe void UnpackH (byte[] buf_packed, byte[] output, uint unpacked_size) //outchar = *(_BYTE*)(8 * v29 + 0x811C8789); // buf2+5 outchar = buf[buf2_off + 5 + 8 * v29]; LABEL_29: + //Debug.WriteLine($"cur_output_addr={cur_output_addr:x}"); output[cur_output_addr] = (byte)outchar; //qword_811C97A8 = v33 + (unsigned __int16)cur_char2; var tmp = BitConverter.GetBytes((Int64)v33 + (ushort)cur_char2); tmp.CopyTo(buf, 0x3028);//0x3028 - v23 =v35 + 1; + v23 = size_done + 1; ++cur_output_addr; v33 += (cur_char2 & 0xffff); - v35 = v23; + size_done = v23; if (v23 >= unpacked_size) - return; + return size_done; } + return 0; } - uint sub_8105E56C(uint result, uint a2, uint a3) + uint sub_8105E56C(uint result, uint a2, uint a3) { if (a3 > 63) { @@ -407,7 +407,7 @@ uint sub_8105E56C(uint result, uint a2, uint a3) return result; } - void UnpackW (IBinaryStream input, byte[] output) + int UnpackW(IBinaryStream input, byte[] output) { throw new NotImplementedException(); output = input.ReadBytes(output.Length); @@ -469,6 +469,11 @@ void UnpackW (IBinaryStream input, byte[] output) */ } + int decrypt(byte[] output, int len, char enc_method) + { + return 0; + } + static readonly int[] dword_455540 = { 0x0, 0x0, 0x0, 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE @@ -494,7 +499,7 @@ void UnpackW (IBinaryStream input, byte[] output) 0x06050403, 0x0A090807, 0x0E0D0C0B, 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00000000, 0xFFFF0001, 0x00000000, 0x00000000, 0x00000001, - 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000001, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000001, }; } } From 7f8035b6014e6c72b4af70819e13622aafc5f989 Mon Sep 17 00:00:00 2001 From: devseed Date: Fri, 25 Sep 2020 22:03:42 +0900 Subject: [PATCH 4/7] neat code 1 --- ArcFormats/Gss/ArcARC.cs | 157 +++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 88 deletions(-) diff --git a/ArcFormats/Gss/ArcARC.cs b/ArcFormats/Gss/ArcARC.cs index 9313c6bd..82fe6928 100644 --- a/ArcFormats/Gss/ArcARC.cs +++ b/ArcFormats/Gss/ArcARC.cs @@ -191,88 +191,72 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) //memset(0x811C8F84, 0, 0x800); // buf3 var buf = new Byte[0x100000]; Array.Clear(buf, 0, buf.Length); - const uint buf2_off = 0x2004; - const uint buf3_off = 0x2804; - const uint buf4_off = 0x3004; //0x811C9784 + const uint off2 = 0x2004; + const uint off3 = 0x2804; + const uint off4 = 0x3004; //0x811C9784 - uint cur_addr = 2, next = 2, cur_output_addr = 0; - byte first_char = buf_packed[0]; - int v8 = 0; - int i2, v28; - byte outchar, i1 = 0, v29; + uint cur_addr = 2, pre_pos, next_pos = 2, cur_output_addr = 0; + byte outchar, i1 = 0, i2, v29, first_char = buf_packed[0]; + int idx1 = 0, v28; do { - var v10 = next; - int cur_char1 = buf_packed[cur_addr]; - var v32 = cur_addr + 1; - ++next; + pre_pos = next_pos; + var cur_char1 = buf_packed[cur_addr]; + var next_addr = cur_addr + 1; + next_pos++; if (cur_char1 != 0) { + byte l1 = buf_packed[cur_addr + 1]; + byte h1 = buf_packed[cur_addr + 2]; + uint t1 = (ushort)(l1 + (h1 << 8)); if (cur_char1 >= 8) { - byte v13 = buf_packed[cur_addr + 1]; - byte v14 = buf_packed[cur_addr + 2]; if (cur_char1 >= 0xD) { - ushort v16 = (ushort)(v13 + (v14 << 8)); - if (cur_char1 < 0x10) + uint d; + if (cur_char1 < 0x10) // 2 byte { - //*(_BYTE*)(8 * i1 + 0x811C8F88) = cur_char_1;// buf3 + 4 - buf[buf3_off + 4 + 8 * i1] = (byte)cur_char1; - //*(_DWORD*)(8 * i1 + 0x811C8F84) = v16;// buf3 - var tmp = BitConverter.GetBytes((uint)v16); - tmp.CopyTo(buf, buf3_off + 8 * i1); - //*(_BYTE*)(8 * i1 + 0x811C8F88) = v8;// bu3 + 4 - buf[buf3_off + 4 + 8 * i1] = (byte)v8; - v32 = cur_addr + 3; - next = v10 + 3; - i1++; + d = t1; + next_addr = cur_addr + 3; + next_pos = pre_pos + 3; } - else + else //3 byte { - byte v17 = buf_packed[cur_addr + 3]; - //*(_BYTE*)(8 * i1 + 0x811C8F88) = cur_char_1;// buf3+4 - buf[buf3_off + 4 + 8 * i1] = (byte)cur_char1; - v32 = cur_addr + 4; - //*(_DWORD*)(8 * i1 + 0x811C8F84) = v16 + (v17 << 16);// buf3 - var tmp = BitConverter.GetBytes((uint)(v16 + (v17 << 16))); - tmp.CopyTo(buf, buf3_off + 8 * i1); - //*(_BYTE*)(8 * i1 + 0x811C8F89) = v8;// buf3+5 - buf[buf3_off + 5 + 8 * i1] = (byte)cur_char1; - next = v10 + 4; - i1++; + d = (uint)(t1 + (buf_packed[cur_addr + 3] << 16)); + next_addr = cur_addr + 4; + next_pos = pre_pos + 4; } - + buf[off3 + 4 + 8 * i1] = cur_char1; + BitConverter.GetBytes((uint)(d)).CopyTo(buf, off3 + 8 * i1); + buf[off3 + 5 + 8 * i1] = (byte)idx1; + i1++; } - else + else //2byte { - uint v15 = (uint)(v13 & 0xFFFF00FF | ((byte)v14 << 8)); - buf[2 * (ushort)v15] = (byte)v8; - buf[2 * (ushort)v15 + 1] = (byte)cur_char1; - v32 = cur_addr + 3; - next = v10 + 3; + buf[2 * t1] = (byte)idx1; + buf[2 * t1 + 1] = cur_char1; + next_addr = cur_addr + 3; + next_pos = pre_pos + 3; } } - else + else // 1byte { - v32 = cur_addr + 2; - next = v10 + 2; - int v12 = buf_packed[cur_addr + 1]; - buf[2 * v12] = (byte)v8; - buf[2 * v12 + 1] = (byte)cur_char1; + buf[2 * l1] = (byte)idx1; + buf[2 * l1 + 1] = cur_char1; + next_addr = cur_addr + 2; + next_pos = pre_pos + 2; } } - cur_addr = v32; - ++v8; - } while (v8 != 0x100); + cur_addr = next_addr; + ++idx1; + } while (idx1 != 0x100); - byte v18 = 0; + byte idx2 = 0; ushort v19 = 0xD; do { i2 = 0; - // *(_BYTE*)(v19 + 0x811C9784) = v18; // buf4, buf2+0x1000 - buf[buf4_off + v19] = (byte)v18; + buf[off4 + v19] = (byte)idx2; if (i1 != 0) { int buf3_addr = 0x2804; //buf3_addr = (_BYTE *)&dword_811C8F84; @@ -280,12 +264,9 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) { if (buf[buf3_addr + 4] == v19) { - //v22 = *((_DWORD*)buf3 + 1); - //*(_DWORD*)(8 * v18 + 0x811C8788) = v22;// buf2+4 - Array.Copy(buf, buf3_addr + 1, buf, buf2_off + 4 + 8 * v18, 4); - //*(_DWORD*)(8 * v18 + 0x811C8784) = *(_DWORD*)buf3;// buf2 - Array.Copy(buf, buf3_addr, buf, buf2_off + 8 * v18, 4); - v18++; + Array.Copy(buf, buf3_addr, buf, off2 + 8 * idx2, 4); + Array.Copy(buf, buf3_addr + 1, buf, off2 + 4 + 8 * idx2, 4); //? + idx2++; } ++i2; buf3_addr += 8; @@ -295,15 +276,15 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) v19++; } while (v19 != 0x18); - buf[0x301c] = (byte)v18; //unk_811C979C = v18; + buf[0x301c] = (byte)idx2; //unk_811C979C = idx2; int size_done = 0; Int64 v33 = 0; Array.Clear(buf, 0x3028, 8);//qword_811C97A8 = 0i64; int v23 = (int)unpacked_size; while (true) { - //v24 = next + ((unsigned int)(v33 & 0x1F) >> 3) +((v33 >> 3) & 0xFFFFFFFC); - int v24 = (int)(next + ((uint)(v33 & 0x1F) >> 3) + ((v33 >> 3) & 0xFFFFFFFC)); //this place, out of range + //v24 = next_pos + ((unsigned int)(v33 & 0x1F) >> 3) +((v33 >> 3) & 0xFFFFFFFC); + int v24 = (int)(next_pos + ((uint)(v33 & 0x1F) >> 3) + ((v33 >> 3) & 0xFFFFFFFC)); //this place, out of range v23 = (int)((v23 & 0xffffff00) + buf_packed[v24 + 3]); // LOBYTE(v23) = buf_packed[v24 + 3]; int v25 = (int)((((buf_packed[v24] | (buf_packed[v24 + 1] << 8)) & 0xFF00FFFF) | (buf_packed[v24 + 2] << 16)) & 0xFFFFFF | (v23 << 24)); byte cur_char2 = first_char; @@ -316,7 +297,7 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) v28 = (int)(v27 & dword_8107F828[2 * cur_char2]); //dword_811C8780 = 2 * v28 + 0x811C6780; // buf2 - 4 var tmp2 = BitConverter.GetBytes(2 * v28 + 0x811C6780); - //tmp2.CopyTo(buf, buf2_off - 4); + //tmp2.CopyTo(buf, off2 - 4); //if ( cur_char2 == *(_BYTE *)(2 * v28 + 0x811C6781) )// buf1+1 if (cur_char2 == buf[2 * v28 + 1])// buf1+1 break; @@ -334,47 +315,47 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) while (true) { //v29 = *(_BYTE*)(cur_char2 + 0x811C9784); // buf4 - v29 = buf[buf4_off + cur_char2]; + v29 = buf[off4 + cur_char2]; //if (v29 != *(_BYTE*)(cur_char2 + 0x811C9785))// buf4+1 - if (v29 != buf[buf4_off + 1 + cur_char2]) + if (v29 != buf[off4 + 1 + cur_char2]) break; LABEL_26: //goto can not jump here if (++cur_char2 == 0x18) { - outchar = buf[buf2_off + 5 + 8 * v29]; //this seems a hack... + outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... goto LABEL_29; } } //while (*(_DWORD*)(8 * v29 + 0x811C8784) != (v27 & *(_DWORD*)(8 * cur_char2 + 0x8107F828)))// buf2, const1 - while (BitConverter.ToUInt32(buf, (int)buf2_off + 8 * v29) != + while (BitConverter.ToUInt32(buf, (int)off2 + 8 * v29) != dword_8107F828[2 * cur_char2]) { v29++; //if ( (unsigned __int16)v29 == *(_BYTE *)(cur_char2 + 0x811C9785) )// buf4+1 - if (v29 == buf[buf4_off + 1 + cur_char2]) + if (v29 == buf[off4 + 1 + cur_char2]) { if (++cur_char2 == 0x18) { - outchar = buf[buf2_off + 5 + 8 * v29]; //this seems a hack... + outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... goto LABEL_29; } while (true) { //v29 = *(_BYTE*)(cur_char2 + 0x811C9784); // buf4 - v29 = buf[buf4_off + cur_char2]; + v29 = buf[off4 + cur_char2]; //if (v29 != *(_BYTE*)(cur_char2 + 0x811C9785))// buf4+1 - if (v29 != buf[buf4_off + 1 + cur_char2]) + if (v29 != buf[off4 + 1 + cur_char2]) break; if (++cur_char2 == 0x18) { - outchar = buf[buf2_off + 5 + 8 * v29]; //this seems a hack... + outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... goto LABEL_29; } } } } //outchar = *(_BYTE*)(8 * v29 + 0x811C8789); // buf2+5 - outchar = buf[buf2_off + 5 + 8 * v29]; + outchar = buf[off2 + 5 + 8 * v29]; LABEL_29: //Debug.WriteLine($"cur_output_addr={cur_output_addr:x}"); output[cur_output_addr] = (byte)outchar; @@ -421,42 +402,42 @@ int UnpackW(IBinaryStream input, byte[] output) { int bit = v7 & 0x1F; int v9 = (v7 >> 3) & 0x1FFFFFFC; - int v10; + int pre_addr; if (bit < 0x1C) { - v10 = input.ReadInt32(); //MemInt32(&src[v9]); + pre_addr = input.ReadInt32(); //MemInt32(&src[v9]); } else { - v10 = input.ReadInt32(); //MemInt32(&src[v9 + 1]); + pre_addr = input.ReadInt32(); //MemInt32(&src[v9 + 1]); bit -= 8; } v7 += 5; - int v13 = (v10 >> bit) & 0x1F; + int l1 = (pre_addr >> bit) & 0x1F; bit = v7 & 0x1F; int v14 = (v7 >> 3) & 0x1FFFFFFC; if (bit < 8) { - v10 = MemInt32(&src[v14]); + pre_addr = MemInt32(&src[v14]); } else if (bit < 0x10) { - v10 = MemInt32(&src[v14 + 1]); + pre_addr = MemInt32(&src[v14 + 1]); bit -= 8; } else if (bit < 0x18) { - v10 = MemInt32(&src[v14 + 2]); + pre_addr = MemInt32(&src[v14 + 2]); bit -= 16; } else { - v10 = MemInt32(&src[v14 + 3]); + pre_addr = MemInt32(&src[v14 + 3]); bit -= 24; } - v17 = v13 & 0xF; - int sample = dword_455580[v17] + (((v10 >> bit) & (dword_4554E8[v17] >> shift)) << shift); - if ((v13 & 0x10) != 0) + v17 = l1 & 0xF; + int sample = dword_455580[v17] + (((pre_addr >> bit) & (dword_4554E8[v17] >> shift)) << shift); + if ((l1 & 0x10) != 0) sample = -sample; LittleEndian.Pack ((short)sample, output, dst); dst += 2; From 3475e6d7a93e0c7a118d21908f77d223fec3f691 Mon Sep 17 00:00:00 2001 From: devseed Date: Sat, 26 Sep 2020 02:37:56 +0900 Subject: [PATCH 5/7] UnPackH done! --- ArcFormats/Gss/ArcARC.cs | 70 +++++++++++----------------------------- 1 file changed, 18 insertions(+), 52 deletions(-) diff --git a/ArcFormats/Gss/ArcARC.cs b/ArcFormats/Gss/ArcARC.cs index 82fe6928..df7bcaec 100644 --- a/ArcFormats/Gss/ArcARC.cs +++ b/ArcFormats/Gss/ArcARC.cs @@ -183,13 +183,7 @@ int UnpackR(IBinaryStream input, byte[] output) //sub_81043AA6 int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) { - - // buf = (_BYTE *)&unk_811C6780; - //cur_output = output; - //memset(0x811C6780, 0, 0x2000); // buf1 - //memset(0x811C8784, 0, 0x800); // buf2 - //memset(0x811C8F84, 0, 0x800); // buf3 - var buf = new Byte[0x100000]; + var buf = new Byte[0x10000]; Array.Clear(buf, 0, buf.Length); const uint off2 = 0x2004; const uint off3 = 0x2804; @@ -197,7 +191,7 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) uint cur_addr = 2, pre_pos, next_pos = 2, cur_output_addr = 0; byte outchar, i1 = 0, i2, v29, first_char = buf_packed[0]; - int idx1 = 0, v28; + int idx1 = 0, v28=0; do { pre_pos = next_pos; @@ -252,7 +246,7 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) } while (idx1 != 0x100); byte idx2 = 0; - ushort v19 = 0xD; + byte v19 = 0xD; do { i2 = 0; @@ -265,7 +259,7 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) if (buf[buf3_addr + 4] == v19) { Array.Copy(buf, buf3_addr, buf, off2 + 8 * idx2, 4); - Array.Copy(buf, buf3_addr + 1, buf, off2 + 4 + 8 * idx2, 4); //? + Array.Copy(buf, buf3_addr+4, buf, off2 + 4 + 8 * idx2, 4); idx2++; } ++i2; @@ -277,94 +271,66 @@ int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) } while (v19 != 0x18); buf[0x301c] = (byte)idx2; //unk_811C979C = idx2; - int size_done = 0; - Int64 v33 = 0; Array.Clear(buf, 0x3028, 8);//qword_811C97A8 = 0i64; - int v23 = (int)unpacked_size; + int v23 = (int)unpacked_size, v33=0, size_done = 0; while (true) { - //v24 = next_pos + ((unsigned int)(v33 & 0x1F) >> 3) +((v33 >> 3) & 0xFFFFFFFC); int v24 = (int)(next_pos + ((uint)(v33 & 0x1F) >> 3) + ((v33 >> 3) & 0xFFFFFFFC)); //this place, out of range - v23 = (int)((v23 & 0xffffff00) + buf_packed[v24 + 3]); // LOBYTE(v23) = buf_packed[v24 + 3]; - int v25 = (int)((((buf_packed[v24] | (buf_packed[v24 + 1] << 8)) & 0xFF00FFFF) | (buf_packed[v24 + 2] << 16)) & 0xFFFFFF | (v23 << 24)); + ulong v25 = BitConverter.ToUInt32(buf_packed, v24); byte cur_char2 = first_char; uint v27 = sub_8105E56C((uint)v25, (uint)(v25 >> 32), (uint)((v33 & 0x1F) - (v33 & 0x18))); if (first_char != 0xD) { while (true) - { - //v28 = v27 & *(_DWORD*)(8 * cur_char2 + 0x8107F828);// const1 + { v28 = (int)(v27 & dword_8107F828[2 * cur_char2]); - //dword_811C8780 = 2 * v28 + 0x811C6780; // buf2 - 4 - var tmp2 = BitConverter.GetBytes(2 * v28 + 0x811C6780); - //tmp2.CopyTo(buf, off2 - 4); - //if ( cur_char2 == *(_BYTE *)(2 * v28 + 0x811C6781) )// buf1+1 + BitConverter.GetBytes((int)(2 * v28 + 0x811C6780)).CopyTo(buf, off2 - 4); //must pay attention to the type convert and length if (cur_char2 == buf[2 * v28 + 1])// buf1+1 break; cur_char2++; if (cur_char2 == 0xD) goto LABEL_22; } - //v30 = *(_BYTE*)(2 * v28 + 0x811C6780); // buf1 outchar = buf[2 * v28]; goto LABEL_29; } LABEL_22: if (cur_char2 == 0x18) break; + LABEL_26_2: while (true) { - //v29 = *(_BYTE*)(cur_char2 + 0x811C9784); // buf4 v29 = buf[off4 + cur_char2]; - //if (v29 != *(_BYTE*)(cur_char2 + 0x811C9785))// buf4+1 if (v29 != buf[off4 + 1 + cur_char2]) break; LABEL_26: //goto can not jump here if (++cur_char2 == 0x18) { - outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... - goto LABEL_29; + return 0; + //outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... + //goto LABEL_29; } } - //while (*(_DWORD*)(8 * v29 + 0x811C8784) != (v27 & *(_DWORD*)(8 * cur_char2 + 0x8107F828)))// buf2, const1 while (BitConverter.ToUInt32(buf, (int)off2 + 8 * v29) != - dword_8107F828[2 * cur_char2]) + (v27 & dword_8107F828[2 * cur_char2])) { v29++; - //if ( (unsigned __int16)v29 == *(_BYTE *)(cur_char2 + 0x811C9785) )// buf4+1 - if (v29 == buf[off4 + 1 + cur_char2]) + if (v29 == buf[off4 + 1 + cur_char2 ]) { if (++cur_char2 == 0x18) { - outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... - goto LABEL_29; - } - while (true) - { - //v29 = *(_BYTE*)(cur_char2 + 0x811C9784); // buf4 - v29 = buf[off4 + cur_char2]; - //if (v29 != *(_BYTE*)(cur_char2 + 0x811C9785))// buf4+1 - if (v29 != buf[off4 + 1 + cur_char2]) - break; - if (++cur_char2 == 0x18) - { - outchar = buf[off2 + 5 + 8 * v29]; //this seems a hack... - goto LABEL_29; - } + return 0; } + goto LABEL_26_2; } } - //outchar = *(_BYTE*)(8 * v29 + 0x811C8789); // buf2+5 outchar = buf[off2 + 5 + 8 * v29]; LABEL_29: - //Debug.WriteLine($"cur_output_addr={cur_output_addr:x}"); output[cur_output_addr] = (byte)outchar; - //qword_811C97A8 = v33 + (unsigned __int16)cur_char2; - var tmp = BitConverter.GetBytes((Int64)v33 + (ushort)cur_char2); - tmp.CopyTo(buf, 0x3028);//0x3028 + BitConverter.GetBytes((Int64)v33 + (ushort)cur_char2).CopyTo(buf, 0x3028); v23 = size_done + 1; ++cur_output_addr; - v33 += (cur_char2 & 0xffff); + v33 += cur_char2 ; size_done = v23; if (v23 >= unpacked_size) return size_done; From 372964e392892354f9e238ec64c4d2ba9008b101 Mon Sep 17 00:00:00 2001 From: devseed Date: Sat, 26 Sep 2020 19:02:37 +0900 Subject: [PATCH 6/7] UnpackD done! --- ArcFormats/Gss/ArcARC.cs | 116 ++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/ArcFormats/Gss/ArcARC.cs b/ArcFormats/Gss/ArcARC.cs index df7bcaec..10a90055 100644 --- a/ArcFormats/Gss/ArcARC.cs +++ b/ArcFormats/Gss/ArcARC.cs @@ -86,22 +86,21 @@ public override Stream OpenEntry(ArcFile arc, Entry entry) int len; using (var input = arc.File.CreateStream(entry.Offset + 12, entry.Size - 12)) { + var buf_packed = new byte[unpacked_size > entry.Size ? unpacked_size : entry.Size]; + input.Read(buf_packed, 0, (int)entry.Size - 12); var output = new byte[unpacked_size]; switch ((char)pack_method) { - case 'D': len = UnpackD(input, output); break; //sub_81043C02(v9, v3, v6); - case 'R': len = UnpackR(input, output); break; //sub_81043AA6(v9, v3) - case 'H': //sub_81043752(v9, v3, v6); - { - var buf_packed = new byte[unpacked_size > entry.Size ? unpacked_size : entry.Size]; - input.Read(buf_packed, 0, (int)entry.Size - 12); - len = UnpackH(buf_packed, output, unpacked_size); - break; - } - case 'W': len = UnpackW(input, output); break; //sub_81043414 sub_81043340 + case 'D': len = UnpackD(buf_packed, output, unpacked_size); break; //sub_81043C02, sub_81048646 + case 'R': len = UnpackR(input, output); break; //sub_81043AA6 + case 'H': len = UnpackH(buf_packed, output, unpacked_size);break; //sub_81043752 + case 'W': var v11 = UnpackW(buf_packed, output, unpacked_size); //sub_81043414 + var v12 = buf_packed[0]; + len = decrypt(output, v11 - v12, (char)enc_method, v12); + break; default: len = input.Read(output, 0, output.Length); break; } - decrypt(output, len, (char)enc_method); + decrypt(output, len, (char)enc_method); //sub_81043340 return new BinMemoryStream(output, entry.Name); } } @@ -111,11 +110,71 @@ public override IImageDecoder OpenImage(ArcFile arc, Entry entry) throw new NotImplementedException(); } - int UnpackD(IBinaryStream input, byte[] output) + int UnpackD(byte[] buf_packed, byte[] output, uint unpacked_size) { - throw new NotImplementedException(); - input.Read(output, 0, output.Length); - return 0; + int result = 0, i=0, v8, v12; + int v3 = 0, qword_811C97A8 = 0; + var size1 = unpacked_size >> 1; + byte v6, v16; + if ((unpacked_size >> 1) != 0) + { + int cur_output_addr = 0; + int cur_pos = 0; + do + { + v6 = (byte)(v3 & 0x1F); + int v7 = (int)((v3 >> 3) & 0xFFFFFFFC); + if ((int)(v3 & 0x1F) < 28) + { + v8 = BitConverter.ToInt32(buf_packed, v7); + } + else + { + v8 = BitConverter.ToInt32(buf_packed, v7 + 1); + v6 -= (byte)8; + } + var v23 = v8 >> v6; + qword_811C97A8 += 5; + byte v10 = (byte)(qword_811C97A8 & 0x1F); + int idx = v23 & 0xF ; + int v11 = (int)(((qword_811C97A8) >> 3) & 0xFFFFFFFC); + if (v10 >= 24) + { + v12 = BitConverter.ToInt32(buf_packed, v11 + 3); + v16 = (byte)(v10 - 24); + } + else if (v10 >= 16) + { + v12 = BitConverter.ToInt32(buf_packed, v11 + 2); + v16 = (byte)(v10 - 16); + } + else + { + if (v10 < 8) + { + v12 = BitConverter.ToInt32(buf_packed, v11); + } + else + { + v12 = BitConverter.ToInt32(buf_packed, v11 + 1); + v10 -= 8; + } + v16 = v10; + } + var v19 = (dword_8107F750[idx] & (v12 >> v16)) + dword_8107F7A4[0x10 + idx]; + if ((v23 & 0x10) != 0) + v19 = v19 & 0xffff0000 | (~v19 & 0xffff); + output[cur_output_addr++] = (byte)(v19); //word + output[cur_output_addr++] = (byte)(v19 >> 8); + qword_811C97A8 += (int)dword_8107F7A4[idx]; + ++i; + v3 = qword_811C97A8; + cur_pos += 2; + } + while (i != size1); + result = cur_pos + 2; + } + return result; } int UnpackR(IBinaryStream input, byte[] output) //sub_81043AA6 @@ -354,10 +413,9 @@ uint sub_8105E56C(uint result, uint a2, uint a3) return result; } - int UnpackW(IBinaryStream input, byte[] output) + int UnpackW(byte[] buf_packed, byte[] output, uint unpacked_size) { throw new NotImplementedException(); - output = input.ReadBytes(output.Length); /* int header_length = input.ReadUInt8(); int shift = input.ReadUInt8(); @@ -416,7 +474,7 @@ int UnpackW(IBinaryStream input, byte[] output) */ } - int decrypt(byte[] output, int len, char enc_method) + int decrypt(byte[] output, int len, char enc_method, int start_pos=0) { return 0; } @@ -433,7 +491,7 @@ int decrypt(byte[] output, int len, char enc_method) 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF }; - static readonly uint[] dword_8107F828 = { //8107F828 + static readonly uint[] dword_8107F828 = { 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000003, 0x00000000, 0x00000007, 0x00000000, 0x0000000F, 0x00000000, 0x0000001F, 0x00000000, 0x0000003F, 0x00000000, 0x0000007F, 0x00000000, 0x000000FF, 0x00000000, 0x000001FF, 0x00000000, 0x000003FF, 0x00000000, 0x000007FF, 0x00000000, @@ -448,5 +506,25 @@ int decrypt(byte[] output, int len, char enc_method) 0x00001000, 0x00002000, 0x00004000, 0x00000000, 0xFFFF0001, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000001, }; + static readonly uint[] dword_8107F750 ={ + 0x00000000, 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, + 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, + 0x00007FFF, 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x000FFFFF, 0x00000000, 0x00000000, 0x00000001, + }; + static readonly uint[] dword_8107F7A4 = { + 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005, 0x00000006, + 0x00000007, 0x00000008, 0x00000009, 0x0000000A, 0x0000000B, 0x0000000C, 0x0000000D, 0x0000000E, + 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, + 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, + 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000003, 0x00000000, 0x00000007, + 0x00000000, 0x0000000F, 0x00000000, 0x0000001F, 0x00000000, 0x0000003F, 0x00000000, 0x0000007F, + 0x00000000, 0x000000FF, 0x00000000, 0x000001FF, 0x00000000, 0x000003FF, 0x00000000, 0x000007FF, + 0x00000000, 0x00000FFF, 0x00000000, 0x00001FFF, 0x00000000, 0x00003FFF, 0x00000000, 0x00007FFF, + 0x00000000, 0x0000FFFF, 0x00000000, 0x0001FFFF, 0x00000000, 0x0003FFFF, 0x00000000, 0x0007FFFF, + 0x00000000, 0x000FFFFF, 0x00000000, 0x001FFFFF, 0x00000000, 0x003FFFFF, 0x00000000, 0x007FFFFF, + 0x00000000, 0x00FFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, + 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, + 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x000FFFFF, + }; } } From f0e8e1600a6105736aa330bccc6606479767cfe9 Mon Sep 17 00:00:00 2001 From: devseed Date: Sat, 26 Sep 2020 23:34:54 +0900 Subject: [PATCH 7/7] finish gss in Getsuei --- ArcFormats/Gss/ArcARC.cs | 84 +++++++++++++++++++++++++++++++++++----- README.md | 5 ++- 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/ArcFormats/Gss/ArcARC.cs b/ArcFormats/Gss/ArcARC.cs index 10a90055..45247ff5 100644 --- a/ArcFormats/Gss/ArcARC.cs +++ b/ArcFormats/Gss/ArcARC.cs @@ -1,8 +1,8 @@ //! \file ArcARC.cs //! \date 2018 May 05 -//! \brief GSS engine resource archive. +//! \brief GSS engine resource archive. // -// Copyright (C) 2018 by morkt +// Copyright (C) 2018 by morkt, then finished by devseed // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to @@ -75,12 +75,12 @@ public override ArcFile TryOpen(ArcView file) } } - public override Stream OpenEntry(ArcFile arc, Entry entry) + unsafe public override Stream OpenEntry(ArcFile arc, Entry entry) { var pent = entry as PackedEntry; if (null == pent || !pent.IsPacked || !arc.File.View.AsciiEqual(entry.Offset, "LSD\x1A")) return base.OpenEntry(arc, entry); - byte enc_method = arc.File.View.ReadByte(entry.Offset + 4); + char enc_method = (char)arc.File.View.ReadByte(entry.Offset + 4); byte pack_method = arc.File.View.ReadByte(entry.Offset + 5); uint unpacked_size = arc.File.View.ReadUInt32(entry.Offset + 6); int len; @@ -88,6 +88,7 @@ public override Stream OpenEntry(ArcFile arc, Entry entry) { var buf_packed = new byte[unpacked_size > entry.Size ? unpacked_size : entry.Size]; input.Read(buf_packed, 0, (int)entry.Size - 12); + input.Seek(0, SeekOrigin.Begin); var output = new byte[unpacked_size]; switch ((char)pack_method) { @@ -96,11 +97,11 @@ public override Stream OpenEntry(ArcFile arc, Entry entry) case 'H': len = UnpackH(buf_packed, output, unpacked_size);break; //sub_81043752 case 'W': var v11 = UnpackW(buf_packed, output, unpacked_size); //sub_81043414 var v12 = buf_packed[0]; - len = decrypt(output, v11 - v12, (char)enc_method, v12); + len = decrypt(output, output, v11 - v12, (char)enc_method, v12, v12); break; default: len = input.Read(output, 0, output.Length); break; } - decrypt(output, len, (char)enc_method); //sub_81043340 + len = decrypt(output, output, len < output.Length ? len:output.Length, (char)enc_method); //sub_81043340 return new BinMemoryStream(output, entry.Name); } } @@ -179,7 +180,6 @@ int UnpackD(byte[] buf_packed, byte[] output, uint unpacked_size) int UnpackR(IBinaryStream input, byte[] output) //sub_81043AA6 { - throw new NotImplementedException(); int dst = 0; while (dst < output.Length) { @@ -238,6 +238,7 @@ int UnpackR(IBinaryStream input, byte[] output) //sub_81043AA6 break; } } + return dst; } int UnpackH(byte[] buf_packed, byte[] output, uint unpacked_size) @@ -416,6 +417,7 @@ uint sub_8105E56C(uint result, uint a2, uint a3) int UnpackW(byte[] buf_packed, byte[] output, uint unpacked_size) { throw new NotImplementedException(); + //not appear in my test game /* int header_length = input.ReadUInt8(); int shift = input.ReadUInt8(); @@ -474,9 +476,73 @@ int UnpackW(byte[] buf_packed, byte[] output, uint unpacked_size) */ } - int decrypt(byte[] output, int len, char enc_method, int start_pos=0) + int decrypt(byte[] input, byte[] output, int len, char enc_method, int start_input=0, int start_output=0) { - return 0; + int len_decrypt = len, i; + int cur_output_addr = start_output; + int cur_addr = start_input; + switch (enc_method) + { + case 'N': + input.CopyTo(output, 0); + break; + case 'B': //byte + i = 0; + if (len_decrypt!=0) + { + do + { + var d = input[cur_addr]; + var tmp = -d; + if (i != 0) + tmp = input[cur_addr - 1] - d; + i++; + output[cur_output_addr++] = (byte)tmp; + ++cur_addr; + } + while (i != len_decrypt); + } + break; + case 'W': //word + len_decrypt = (int)((len + 1) & 0xFFFFFFFE); + i = 0; + if (len_decrypt!=0) + { + do + { + var d = input[cur_addr] | (input[cur_addr+1] << 8); + var tmp = -d; + if (i!=0) + tmp = (input[cur_addr-2] | input[cur_addr-1] << 8) - d; + output[cur_output_addr++] = (byte)(tmp & 0xff); + output[cur_output_addr++] = (byte)(tmp >> 8); + i += 2; + cur_addr += 2; + } + while (i != len_decrypt); + } + break; + case 'S': // big endian word + len_decrypt = (int)((len + 1) & 0xFFFFFFFE); + i = 0; + if (len_decrypt!=0) + { + do + { + var d = input[cur_addr+1] | (input[cur_addr] << 8); + var tmp = -d; + if (i!=0) + tmp = (input[cur_addr - 1] | input[cur_addr - 2] << 8) - d; + output[cur_output_addr++] = (byte)(tmp >> 8); + output[cur_output_addr++] = (byte)(tmp & 0xff); + i += 2; + cur_addr += 2; + } + while (i != len_decrypt); + } + break; + } + return len_decrypt; } static readonly int[] dword_455540 = { diff --git a/README.md b/README.md index d3be6e18..c8a62088 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ GARbro ====== Visual Novels resource browser. -Mod by Yurisizuku. Adding support to: -* *.arc, *.bin in gss/ArcARC.cs, for 月影の鎖 -錯乱パラノイア +Mod by Devseed. Adding support to: +* *.arc, *.bin in gss/ArcARC.cs + 月影の鎖 -錯乱パラノイア PSP, PSV Requires .NET Framework v4.6 or newer (https://www.microsoft.com/net)