When I researched the compression algorithm used in the GR2 files a year ago, I didn’t find anyone that had reverse engineered the algorithm. I decided to use the granny32.dll library from the NWN2 install to decompress the GR2 files, but this has two problems for my future plans:
- Because granny32.dll is 32-bit and 64-bit programs can’t be linked to 32-bit DLLs, my tools are tied to 32-bit or to use complex, annoying and ugly workarounds.
- Because granny32.dll is a Windows library, I can’t make my tools cross-platform without complex, annoying and ugly workarounds.
So I decided to revisit the compression algorithm past weekend and decided to reverse engineer it myself. I got a general high-level overview of the algorithm, but I was overwhelmed by the details, so I kept looking for every bit of info I could find and finally… I found that someone had reverse enginered the algorithm 3 years ago! In fact, it was a work to be included in xoreos-tools, but the author didn’t find the time to properly rewrite it to fit in the project codebase. The work is here:
I have tested it with a bunch of GR2 files, comparing the decompressed output of this implementation with the output of granny32.dll and they are byte by byte identical!
Now the path is clearer for 64-bit and cross-platform .