SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
GalaxyStatusAccessor.cpp
1#include "Game/System/GalaxyStatusAccessor.hpp"
2#include "Game/System/GameDataFunction.hpp"
3#include "Game/System/GameDataConst.hpp"
4#include "Game/System/ScenarioDataParser.hpp"
5#include "Game/Util.hpp"
6
7GalaxyStatusAccessor::GalaxyStatusAccessor(const ScenarioData *pScenarioData) {
8 mScenarioData = pScenarioData;
9}
10
11const char* GalaxyStatusAccessor::getName() const {
12 return mScenarioData->mGalaxyName;
13}
14
15u32 GalaxyStatusAccessor::getScenarioNum() const {
16 return mScenarioData->getScenarioNum();
17}
18
19u32 GalaxyStatusAccessor::getPowerStarNum() const {
20 return mScenarioData->getPowerStarNum();
21}
22
23u32 GalaxyStatusAccessor::getZoneNum() const {
24 return mScenarioData->getZoneNum();
25}
26
27u32 GalaxyStatusAccessor::getZoneId(const char *pZone) const {
28 return mScenarioData->getZoneId(pZone);
29}
30
31const char* GalaxyStatusAccessor::getZoneName(int zoneId) const {
32 return mScenarioData->getZoneName(zoneId);
33}
34
35const char* GalaxyStatusAccessor::getCometName(s32 scenario) const {
36 const char *pCometName = nullptr;
37
38 if (mScenarioData->getValueString("Comet", scenario, &pCometName)) {
39 return pCometName;
40 }
41 else {
42 return nullptr;
43 }
44}
45
46bool GalaxyStatusAccessor::isValidNormalComet(s32 scenario) const {
47 bool ret = false;
48
49 if (isExistAnyComet() && scenario == getNormalCometScenarioNo()) {
50 ret = true;
51 }
52
53 return ret;
54}
55
56bool GalaxyStatusAccessor::isCometStar(s32 scenario) const {
57 bool ret = false;
58
59 if (isExistAnyComet() && scenario == getNormalCometScenarioNo() || isValidCoin100(scenario)) {
60 ret = true;
61 }
62
63 return ret;
64}
65
66bool GalaxyStatusAccessor::isExistGrandStar() const {
67 for (s32 i = 1; i <= mScenarioData->getPowerStarNum(); i++) {
68 if (GameDataConst::isGrandStar(mScenarioData->mGalaxyName, i)) {
69 return true;
70 }
71 }
72
73 return false;
74}
75
76#ifdef NON_MATCHING // The good old registers problem
77bool GalaxyStatusAccessor::isExistAnyComet() const {
78 const char *pIsComet;
79
80 for (s32 i = 1; i <= mScenarioData->getScenarioNum(); i++) {
81 const char *pComet;
82
83 if (mScenarioData->getValueString("Comet", i, &pComet)) {
84 pIsComet = pComet;
85 }
86 else {
87 pIsComet = nullptr;
88 }
89
90 if (pIsComet) {
91 return true;
92 }
93 }
94
95 return false;
96}
97#endif
98
99s32 GalaxyStatusAccessor::getNormalCometScenarioNo() const {
100 const char *pNormal;
101
102 for (s32 i = 1; i <= mScenarioData->getScenarioNum(); i++) {
103 const char *pIsNormal = nullptr;
104
105 if (mScenarioData->getValueString("Comet", i, &pIsNormal)) {
106 pNormal = pIsNormal;
107 }
108 else {
109 pNormal = nullptr;
110 }
111
112 if (pNormal && !isValidCoin100(i)) {
113 return i;
114 }
115 }
116
117 return -1;
118}
119
120s32 GalaxyStatusAccessor::getCoin100CometScenarioNo() const {
121 const char *pPurpleComet;
122
123 for (s32 i = 1; i <= mScenarioData->getScenarioNum(); i++) {
124 const char *pCometName = nullptr;
125
126 if (mScenarioData->getValueString("Comet", i, &pCometName)) {
127 pPurpleComet = pCometName;
128 }
129 else {
130 pPurpleComet = nullptr;
131 }
132
133 if (pPurpleComet && isValidCoin100(i)) {
134 return i;
135 }
136 }
137
138 return -1;
139}
140
141bool GalaxyStatusAccessor::canOpen() const {
142 if (mScenarioData->getPowerStarNum()) {
143 return true;
144 }
145 else {
146 return GameDataFunction::canOnGameEventFlag(mScenarioData->mGalaxyName);
147 }
148}
149
150bool GalaxyStatusAccessor::isOpened() const {
151 if (mScenarioData->getPowerStarNum() == 0) {
152 return true;
153 }
154 else {
155 return GameDataFunction::isOnGameEventFlag(mScenarioData->mGalaxyName);
156 }
157}
158
159bool GalaxyStatusAccessor::isCompleted() const {
160 if (mScenarioData->getPowerStarNum() == 0) {
161 return false;
162 }
163
164 return getPowerStarNumOwned() == mScenarioData->getPowerStarNum();
165}
166
167s32 GalaxyStatusAccessor::getPowerStarNumOwned() const {
168 if (!mScenarioData->getPowerStarNum()) {
169 return GameDataFunction::getPowerStarNumOwned(mScenarioData->mGalaxyName);
170 }
171 else {
172 return 0;
173 }
174}
175
176bool GalaxyStatusAccessor::hasPowerStar(s32 Scenario) const {
177 if (mScenarioData->getPowerStarNum() == 0) {
178 return false;
179 }
180 else {
181 return GameDataFunction::hasPowerStar(mScenarioData->mGalaxyName, Scenario);
182 }
183}
184
185s32 GalaxyStatusAccessor::getNormalScenarioNum() const {
186 const char *pCometName;
187 s32 scenarioNum = 0;
188
189 for (s32 i = 0; i < mScenarioData->getScenarioNum(); i++) {
190 const char *pScenarioComet = nullptr;
191
192 if (mScenarioData->getValueString("Comet", i + 1, &pScenarioComet)) {
193 pCometName = pScenarioComet;
194 }
195 else {
196 pCometName = nullptr;
197 }
198
199 if (!pCometName) {
200 scenarioNum++;
201 }
202 }
203
204 return scenarioNum;
205}
206
207const char* GalaxyStatusAccessor::getAppearPowerStarObjName(s32 scenario) const {
208 const char *pObjName;
209 bool ret = mScenarioData->getValueString("AppearPowerStarObj", scenario, &pObjName);
210
211 if (isValidCoin100(scenario)){
212 return "100枚コイン";
213 }
214
215 if (ret){
216 return pObjName;
217 }
218
219 return 0;
220}
221
222u32 GalaxyStatusAccessor::getActivePowerStarId(s32 scenario) const {
223 u32 powerStarId;
224
225 if (mScenarioData->getValueU32("PowerStarId", scenario, &powerStarId)) {
226 return powerStarId;
227 }
228 else {
229 return 0;
230 }
231}
232
233bool GalaxyStatusAccessor::isValidCoin100(s32 scenario) const {
234 const char *pPurpleComet;
235 const char *pCometName = nullptr;
236
237 if (mScenarioData->getValueString("Comet", scenario, &pCometName)) {
238 pPurpleComet = pCometName;
239 }
240 else {
241 pPurpleComet = nullptr;
242 }
243
244 return (pPurpleComet && MR::isEqualString(pPurpleComet, "Purple") || MR::isEqualString(pPurpleComet, "Black"));
245}
246
247bool GalaxyStatusAccessor::isHiddenStar(s32 scenario) const {
248 bool isHidden = false;
249 mScenarioData->getValueBool("IsHidden", scenario, &isHidden);
250 return isHidden;
251}
252
253namespace MR {
254 GalaxyStatusAccessor makeGalaxyStatusAccessor(const char *pGalaxyName) {
255 return ScenarioDataFunction::getScenarioDataParser()->makeAccessor(pGalaxyName);
256 }
257
258 GalaxyStatusAccessor makeCurrentGalaxyStatusAccessor() {
259 return ScenarioDataFunction::getScenarioDataParser()->makeAccessor(MR::getCurrentStageName());
260 }
261};