A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ResDic.cc
1#include "ResDic.hh"
2
3namespace Kinoko::Abstract::g3d {
4
5ResDic::ResDic(const void *data) : m_data(reinterpret_cast<const Data *>(data)) {}
6
8const ResDic::NodeData *ResDic::get(const char *pName, u32 len) const {
9 const NodeData *c = &m_data->data[0];
10 const NodeData *x = &m_data->data[parse<u16>(c->idxLeft)];
11
12 while (parse<u16>(c->ref) > parse<u16>(x->ref)) {
13 c = x;
14
15 u32 wd = parse<u16>(x->ref) >> 3;
16 u32 pos = parse<u16>(x->ref) & 7;
17
18 if (wd < len && (pName[wd] >> pos) & 1) {
19 x = &m_data->data[parse<u16>(x->idxRight)];
20 } else {
21 x = &m_data->data[parse<u16>(x->idxLeft)];
22 }
23 }
24
25 s32 stringOffset = parse<s32>(x->ofsString);
26
27 if (stringOffset != 0) {
28 const char *xName =
29 reinterpret_cast<const char *>(reinterpret_cast<uintptr_t>(m_data) + stringOffset);
30
31 if (std::strcmp(pName, xName) == 0) {
32 return x;
33 }
34 }
35
36 return nullptr;
37}
38
39} // namespace Kinoko::Abstract::g3d