Kinoko
A reimplementation of Mario Kart Wii's physics engine in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
Decomp.cc
1
#include "Decomp.hh"
2
3
namespace
Kinoko::EGG::Decomp {
4
8
s32 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
egg
core
Decomp.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.17.0