SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
AlreadyDoneFlagInGalaxy.cpp
1#include "Game/System/AlreadyDoneFlagInGalaxy.hpp"
2#include "Game/Util/HashUtil.hpp"
3#include "Game/Util/JMapUtil.hpp"
4#include "Game/Util/SceneUtil.hpp"
5
6AlreadyDoneInfo::AlreadyDoneInfo() {
7 _0 = 0;
8 _2 = 0xFFFF;
9 _4 = 0xFFFF;
10
11 clear();
12}
13
14void AlreadyDoneInfo::clear() {
15 _0 = 0;
16 _2 = 0xFFFF;
17 _4 = 0xFFFF;
18}
19
20void AlreadyDoneInfo::init(const char *pInfo, s32 a2, s32 a3) {
21 u32 val = MR::getHashCode(pInfo) & 0x7FFF;
22 _2 = a2;
23 _0 = val;
24 _4 = a3;
25}
26
27bool AlreadyDoneInfo::isEqual(const AlreadyDoneInfo &otherInfo) const {
28 bool ret = 0;
29
30 if ((otherInfo._0 & 0x7FFF) == (_0 & 0x7FFF)) {
31 if (otherInfo._2 == _2) {
32 if (otherInfo._4 == _4) {
33 ret = 1;
34 }
35 }
36 }
37
38 return ret;
39}
40
41void AlreadyDoneInfo::set(bool flag) {
42 _0 = (flag ? 0 : 0x8000) | _0 & 0x7FFF;
43}
44
45AlreadyDoneFlagInGalaxy::AlreadyDoneFlagInGalaxy(int numInfos)
46 : mDoneInfos(0), mNumInfos(0), _8(0) {
47
48 mDoneInfos = new AlreadyDoneInfo[numInfos];
49 mNumInfos = numInfos;
50}
51
52void AlreadyDoneFlagInGalaxy::clear() {
53 _8 = 0;
54}
55
56#ifdef NON_MATCHING
57u32 AlreadyDoneFlagInGalaxy::setupFlag(const char *pName, const JMapInfoIter &rIter, u32 *a3) {
58 u32 result;
59
60 s32 linkID = -1;
61 MR::getJMapInfoLinkID(rIter, &linkID);
62 s32 zoneID = MR::getPlacedZoneId(rIter);
63
64 AlreadyDoneInfo info;
65 info.init(pName, zoneID, linkID);
66
67 AlreadyDoneInfo* infs = mDoneInfos;
68 AlreadyDoneInfo* lastInfs = &mDoneInfos[_8];
69
70 while (infs != lastInfs && !infs->isEqual(info)) {
71 infs++;
72 }
73
74 u32 v10 = _8;
75 AlreadyDoneInfo* new_infs = &mDoneInfos[v10];
76
77 if (infs != new_infs) {
78 result = infs - mDoneInfos;
79 *a3 = (infs->_0 >> 15) & 0x1;
80 }
81 else {
82 result = _8;
83 _8 = v10 + 1;
84 new_infs->_0 = info._0;
85 new_infs->_2 = info._2;
86 new_infs->_4 = info._4;
87 *a3 = 0;
88 }
89
90 return result;
91}
92#endif