A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
Decomp.cc
1#include "Decomp.hh"
2
3namespace Kinoko::EGG::Decomp {
4
8s32 DecodeSZS(const u8 *src, u8 *dst) {
9 s32 expandSize = GetExpandSize(src);
10 s32 srcIdx = 0x10;
11 u8 code = 0;
12
13 u8 byte;
14
15 for (s32 destIdx = 0; destIdx < expandSize; code >>= 1) {
16 if (!code) {
17 code = 0x80;
18 byte = src[srcIdx++];
19 }
20
21 // Direct copy (code bit = 1)
22 if (byte & code) {
23 dst[destIdx++] = src[srcIdx++];
24 }
25 // RLE compressed data (code bit = 0)
26 else {
27 // Lower nibble of byte1 + byte2
28 s32 distToDest = (src[srcIdx] << 8) | src[srcIdx + 1];
29 srcIdx += sizeof(u8) * 2;
30 s32 runSrcIdx = destIdx - (distToDest & 0xfff);
31
32 // Upper nibble of byte 1
33 s32 runLen = ((distToDest >> 12) == 0) ? src[srcIdx++] + 0x12 : (distToDest >> 12) + 2;
34
35 for (; runLen > 0; runLen--, destIdx++, runSrcIdx++) {
36 if (destIdx >= expandSize) {
37 PANIC("Malformed compressed SZS data.");
38 }
39
40 dst[destIdx] = dst[runSrcIdx - 1];
41 }
42 }
43 }
44 return expandSize;
45}
46
47} // namespace Kinoko::EGG::Decomp