SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
StageSwitch.cpp
1#include "Game/Map/StageSwitch.hpp"
2#include "Game/Scene/SceneObjHolder.hpp"
3#include "Game/Util.hpp"
4
5bool BitFlag128::get(int idx) const {
6 u32 flags = mFlags[idx / 32];
7 u32 mask = (1 << (idx % 32));
8 return mask == (flags & (u32)mask);
9}
10
11void BitFlag128::set(int bit_index, bool setTrue) {
12 u32 valIdx = bit_index / 32;
13 u32& flag = mFlags[valIdx];
14
15 if (setTrue) {
16 flag |= (1 << (bit_index % 32));
17 }
18 else {
19 flag &= ~(1 << (bit_index % 32));
20 }
21}
22
23ZoneSwitch::ZoneSwitch() : BitFlag128() {
24 s32 idx = 0;
25
26 while (idx < 0x80) {
27 set(idx, false);
28 }
29}
30
31SwitchIdInfo::SwitchIdInfo(s32 switchID, const JMapInfoIter &rIter) {
32 mIDInfo = nullptr;
33 mIsGlobal = switchID >= 1000;
34 mIDInfo = new JMapIdInfo(switchID, rIter);
35}
36
37s32 SwitchIdInfo::getSwitchNo() const {
38 if (mIsGlobal) {
39 return mIDInfo->_0 - 1000;
40 }
41
42 return mIDInfo->_0;
43}
44
45void StageSwitchContainer::createAndAddZone(const SwitchIdInfo &rInfo) {
46 if (findZoneSwitchFromTable(rInfo)) {
47 return;
48 }
49
50 ZoneSwitch* s = new ZoneSwitch();
51 ContainerSwitch sw;
52 sw.mData = rInfo.mIDInfo->mZoneID;
53 sw.mSwitch = s;
54 mSwitches[mCount++] = sw;
55}
56
57ZoneSwitch* StageSwitchContainer::getZoneSwitch(const SwitchIdInfo &rInfo) {
58 if (rInfo.mIsGlobal) {
59 return mGlobalSwitches;
60 }
61
62 return findZoneSwitchFromTable(rInfo);
63}
64
65ZoneSwitch* StageSwitchContainer::findZoneSwitchFromTable(const SwitchIdInfo &rInfo) {
66 for (int i = 0; i < mCount; i++)
67 {
68 ContainerSwitch* s = &mSwitches[i];
69
70 if (s->mData == rInfo.mIDInfo->mZoneID) {
71 return s->mSwitch;
72 }
73 }
74
75 return 0;
76}
77
78void StageSwitchCtrl::onSwitchA() {
79 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_A);
80}
81
82void StageSwitchCtrl::offSwitchA() {
83 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_A);
84}
85
86bool StageSwitchCtrl::isOnSwitchA() const {
87 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_A);
88}
89
90bool StageSwitchCtrl::isValidSwitchA() const {
91 return mSW_A != 0;
92}
93
94void StageSwitchCtrl::onSwitchB() {
95 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_B);
96}
97
98void StageSwitchCtrl::offSwitchB() {
99 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_B);
100}
101
102bool StageSwitchCtrl::isOnSwitchB() const {
103 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_B);
104}
105
106bool StageSwitchCtrl::isValidSwitchB() const {
107 return mSW_B != 0;
108}
109
110bool StageSwitchCtrl::isOnSwitchAppear() const {
111 return StageSwitchFunction::isOnSwitchBySwitchIdInfo(*mSW_Appear);
112}
113
114bool StageSwitchCtrl::isValidSwitchAppear() const {
115 return mSW_Appear != 0;
116}
117
118void StageSwitchCtrl::onSwitchDead() {
119 StageSwitchFunction::onSwitchBySwitchIdInfo(*mSW_Dead);
120}
121
122void StageSwitchCtrl::offSwitchDead() {
123 StageSwitchFunction::offSwitchBySwitchIdInfo(*mSW_Dead);
124}
125
126bool StageSwitchCtrl::isValidSwitchDead() const {
127 return mSW_Dead != 0;
128}
129
130#ifdef NON_MATCHING
131// reg use
132bool StageSwitchCtrl::isOnAllSwitchAfterB(int idx) const {
133 for (s32 i = 0; i < idx; i++) {
134 s32 switchNo = i + mSW_B->getSwitchNo();
135 StageSwitchContainer* container = static_cast<StageSwitchContainer*>(MR::getSceneObjHolder()->getObj(0xA));
136
137 if (!container->getZoneSwitch(*mSW_B)->get(switchNo)) {
138 return false;
139 }
140 }
141
142 return true;
143}
144#endif
145
146// isOnAnyOneSwitchAfterB
147
148SwitchIdInfo* StageSwitchFunction::createSwitchIdInfo(const char *pSwitchName, const JMapInfoIter &rIter, bool unused) {
149 s32 switchNo;
150 bool res = rIter.getValue<s32>(pSwitchName, &switchNo);
151
152 if (!res) {
153 return nullptr;
154 }
155
156 if (switchNo < 0) {
157 return nullptr;
158 }
159
160 SwitchIdInfo* inf = new SwitchIdInfo(switchNo, rIter);
161
162 if (switchNo < 0x3E8) {
163 SceneObjHolder* objHolder = MR::getSceneObjHolder();
164 StageSwitchContainer* container = static_cast<StageSwitchContainer*>(objHolder->getObj(0xA));
165 container->createAndAddZone(*inf);
166 }
167
168 return inf;
169}
170
171void StageSwitchFunction::onSwitchBySwitchIdInfo(const SwitchIdInfo &rSwitchId) {
172 s32 switchNo = rSwitchId.getSwitchNo();
173 SceneObjHolder* objHolder = MR::getSceneObjHolder();
174 StageSwitchContainer* container = static_cast<StageSwitchContainer*>(objHolder->getObj(0xA));
175
176 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
177
178 if (zoneSwitch->get(switchNo)) {
179 zoneSwitch->set(switchNo, true);
180 }
181}
182
183void StageSwitchFunction::offSwitchBySwitchIdInfo(const SwitchIdInfo &rSwitchId) {
184 s32 switchNo = rSwitchId.getSwitchNo();
185 SceneObjHolder* objHolder = MR::getSceneObjHolder();
186 StageSwitchContainer* container = static_cast<StageSwitchContainer*>(objHolder->getObj(0xA));
187
188 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
189
190 if (zoneSwitch->get(switchNo)) {
191 zoneSwitch->set(switchNo, false);
192 }
193}
194
195bool StageSwitchFunction::isOnSwitchBySwitchIdInfo(const SwitchIdInfo &rSwitchId) {
196 s32 switchNo = rSwitchId.getSwitchNo();
197 SceneObjHolder* objHolder = MR::getSceneObjHolder();
198 StageSwitchContainer* container = static_cast<StageSwitchContainer*>(objHolder->getObj(0xA));
199
200 ZoneSwitch* zoneSwitch = container->getZoneSwitch(rSwitchId);
201
202 return zoneSwitch->get(switchNo);
203}
204
205namespace MR {
206 StageSwitchCtrl* createStageSwitchCtrl(NameObj *pObj, const JMapInfoIter &rIter) {
207 return new StageSwitchCtrl(rIter);
208 }
209};
210
211StageSwitchContainer::~StageSwitchContainer() {
212
213}
214
215StageSwitchContainer::StageSwitchContainer() : NameObj("ステージスイッチ") {
216 mCount = 0;
217 mGlobalSwitches = new ZoneSwitch();
218}
219
220StageSwitchCtrl::StageSwitchCtrl(const JMapInfoIter &rIter)
221 : mSW_A(nullptr), mSW_B(nullptr), mSW_Appear(nullptr), mSW_Dead(nullptr) {
222 mSW_A = StageSwitchFunction::createSwitchIdInfo("SW_A", rIter, true);
223 mSW_B = StageSwitchFunction::createSwitchIdInfo("SW_B", rIter, true);
224 mSW_Appear = StageSwitchFunction::createSwitchIdInfo("SW_APPEAR", rIter, true);
225 mSW_Dead = StageSwitchFunction::createSwitchIdInfo("SW_DEAD", rIter, true);
226}
The most basic form of an object.
Definition NameObj.hpp:11