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
6
s32 GetExpandSize(
const
u8 *src) {
7
if
(src[0] ==
'Y'
&& src[1] ==
'a'
&& src[2] ==
'z'
) {
8
return
form<s32>(&src[4]);
9
}
10
11
return
-1;
12
}
13
17
s32 DecodeSZS(
const
u8 *src, u8 *dst) {
18
s32 expandSize = GetExpandSize(src);
19
s32 srcIdx = 0x10;
20
u8 code = 0;
21
22
u8 byte;
23
24
for
(s32 destIdx = 0; destIdx < expandSize; code >>= 1) {
25
if
(!code) {
26
code = 0x80;
27
byte
= src[srcIdx++];
28
}
29
30
// Direct copy (code bit = 1)
31
if
(
byte
& code) {
32
dst[destIdx++] = src[srcIdx++];
33
}
34
// RLE compressed data (code bit = 0)
35
else
{
36
// Lower nibble of byte1 + byte2
37
s32 distToDest = (src[srcIdx] << 8) | src[srcIdx + 1];
38
srcIdx +=
sizeof
(u8) * 2;
39
s32 runSrcIdx = destIdx - (distToDest & 0xfff);
40
41
// Upper nibble of byte 1
42
s32 runLen = ((distToDest >> 12) == 0) ? src[srcIdx++] + 0x12 : (distToDest >> 12) + 2;
43
44
for
(; runLen > 0; runLen--, destIdx++, runSrcIdx++) {
45
if
(destIdx >= expandSize) {
46
PANIC(
"Malformed compressed SZS data."
);
47
}
48
49
dst[destIdx] = dst[runSrcIdx - 1];
50
}
51
}
52
}
53
return
expandSize;
54
}
55
56
}
// namespace Kinoko::EGG::Decomp
egg
core
Decomp.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.17.0