SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
ScenarioSelectLayout.cpp
1#include "Game/Screen/ScenarioSelectLayout.hpp"
2#include "Game/Effect/MultiEmitter.hpp"
3#include "Game/System/GalaxyStatusAccessor.hpp"
4#include "Game/Util.hpp"
5
6namespace {
7 const char* const cStarPaneName[] = {
8 "Star1",
9 "Star2",
10 "Star3",
11 "Star4",
12 "Star5",
13 "Star6",
14 "Star7"
15 };
16
17 const char* const cQuestionPaneName[2] = { "NewStar1", "NewStar2" };
18};
19
20ScenarioSelectLayout::ScenarioSelectLayout(EffectSystem *pSystem, const CameraContext *pContext) : LayoutActor("シナリオ選択レイアウト", true) {
21 mSelectedScenarioNo = -1;
22 _24 = 0;
23 _28 = 0;
24 mStars = nullptr;
25 mScenarioSky = nullptr;
26 mEffectSystem = pSystem;
27 mCameraContext = pContext;
28 mNewTextFollowPos.x = 0.0f;
29 mNewTextFollowPos.y = 0.0f;
30 mNewGreenTextFollowPos.x = 0.0f;
31 mNewGreenTextFollowPos.y = 0.0f;
32 mStarTopFollowPos.x = 0.0f;
33 mStarTopFollowPos.y = 0.0f;
34 mBackButton = nullptr;
35 mMarioIconFollowPos.x = 0.0f;
36 mMarioIconFollowPos.y = 0.0f;
37 _A0 = 0;
38 _A4 = 0;
39 _A8 = -1;
40 mEffectHostMtx.identity();
41
42 for (u32 i = 0; i < 2; i++) {
43 mQuestionPane[i].zero();
44 }
45}
46
48 initLayoutManager("ScenarioSelect", 1);
49 MR::createAndAddPaneCtrl(this, "ScenarioSelect", 1);
50 MR::createAndAddPaneCtrl(this, "ScenarioFrame", 1);
51 MR::createAndAddPaneCtrl(this, "Scenario", 1);
52 MR::createAndAddPaneCtrl(this, "StarTop", 1);
53 MR::createAndAddPaneCtrl(this, "StarDown", 1);
54 MR::createAndAddPaneCtrl(this, "BestScore", 1);
55 MR::createAndAddPaneCtrl(this, "BestTime", 1);
56 MR::createAndAddPaneCtrl(this, "New", 1);
57 MR::createAndAddPaneCtrl(this, "NewStarGreen", 1);
58 MR::createAndAddPaneCtrl(this, "Mario", 1);
59 MR::createAndAddPaneCtrl(this, "CometAppear", 2);
60 MR::setFollowPos(&mStarTopFollowPos, this, "StarTop");
61 MR::setFollowTypeAdd(this, "StarTop");
62 MR::setFollowPos(&mNewTextFollowPos, this, "New");
63 MR::setFollowPos(&mNewGreenTextFollowPos, this, "NewStarGreen");
64 MR::setFollowPos(&mMarioIconFollowPos, this, "Mario");
65
66 for (u32 i = 0; i < 2; i++) {
67 MR::createAndAddPaneCtrl(this, cQuestionPaneName[i], 1);
68 MR::setFollowPos(mQuestionPane[i], this, cQuestionPaneName[i]);
69 }
70
71 initPointingTarget(7);
72 initEffectKeeper(0, "ScenarioSelect", mEffectSystem);
73 MR::setEffectHostMtx(this, "ScenarioSelectEffect", mEffectHostMtx.toMtxPtr());
74 mStars = new ScenarioSelectStar*[7];
75
76 for (s32 i = 0; i < 7; i++) {
77 ScenarioSelectStar* star = new ScenarioSelectStar(mEffectSystem);
78 mStars[i] = star;
79 mStars[i]->initWithoutIter();
80 TVec2f radius;
81 radius.x = 0.0f;
82 radius.y = 0.0f;
83 MR::addStarPointerTargetCircle(this, cStarPaneName[i], 60.0f, radius, nullptr);
84 }
85
86 mScenarioSky = new MultiSceneActor("シナリオ選択の空", "ScenarioSelectSky", false);
87 mScenarioSky->initWithoutIter();
88 mBackButton = new BackButton("戻るボタン", false);
89 mBackButton->initWithoutIter();
90 initNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppearStar::sInstance);
91}
92
93// void ScenarioSelectLayout::appear
94
95void ScenarioSelectLayout::kill() {
96 for (s32 i = 0; i < 7; i++) {
97 ScenarioSelectStar* star = mStars[i];
98
99 if (!star->_30) {
100 star->kill();
101 }
102 }
103
104 mScenarioSky->kill();
105 mBackButton->kill();
106 LayoutActor::kill();
107}
108
109void ScenarioSelectLayout::movement() {
110 LayoutActor::movement();
111
112 for (s32 i = 0; i < 7; i++) {
113 mStars[i]->movement();
114 }
115
116 mScenarioSky->movement();
117 mBackButton->movement();
118}
119
120void ScenarioSelectLayout::calcAnim() {
121 LayoutActor::calcAnim();
122
123 for (s32 i = 0; i < 7; i++) {
124 mStars[i]->calcAnim();
125 }
126
127 mScenarioSky->calcAnim();
128 mBackButton->calcAnim();
129}
130
133 mBackButton->draw();
134}
135
136void ScenarioSelectLayout::calcViewAndEntryStarModel() {
137 for (s32 i = 0; i < 7; i++) {
138 mStars[i]->calcViewAndEntry();
139 }
140
141 mScenarioSky->calcViewAndEntry();
142}
143
144s32 ScenarioSelectLayout::getSelectedScenarioNo() const {
145 return mSelectedScenarioNo;
146}
147
148bool ScenarioSelectLayout::isReadyToDisappear() const {
149 if (isNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAfterScenarioSelected::sInstance)) {
150 return MR::isGreaterStep(this, 210);
151 }
152
153 return false;
154}
155
156void ScenarioSelectLayout::disappear() {
157 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvDisappear::sInstance);
158}
159
160/*
161bool ScenarioSelectLayout::trySelect() {
162 if (!MR::testDPDMenuPadDecideTrigger() || mSelectedScenarioNo <= 0) {
163 return false;
164 }
165
166 if (MR::isStarPointerInScreen(0)) {
167 return false;
168 }
169
170 for (s32 i = 0; i < 7; i++) {
171 if (!mStars[i]->_30 && !mStars[i]->_44) {
172 mSelectedScenarioNo = mStars[i]->mFrame;
173 return true;
174 }
175 }
176
177 return false;
178}
179*/
180
181ScenarioSelectStar* ScenarioSelectLayout::getSelectedStar() const {
182 for (s32 i = 0; i < 7; i++) {
183 if (!mStars[i]->_30 && mSelectedScenarioNo == mStars[i]->mFrame) {
184 return mStars[i];
185 }
186 }
187
188 return nullptr;
189}
190
191// ScenarioSelectLayout::calcWorldPositionFromScreenPos
192// ScenarioSelectLayout::calcDisplayScenarioNum
193
194/*
195void ScenarioSelectLayout::appearAllStar(s32 starCount, s32 a3, bool a4) {
196 if (MR::isScenarioDecided()) {
197 s32 v7 = 2;
198
199 if (a4) {
200 v7 = 0;
201 }
202
203 appearStar(0, MR::getCurrentScenarioNo(), v7);
204 }
205 else {
206 for (s32 i = 0; i < starCount; i++) {
207 s32 v10;
208
209 if (a4) {
210 v10 = starCount % 80;
211 }
212 else {
213 v10 = 2;
214 }
215
216 appearStar(i, i + 1, v10);
217 }
218
219 s32 v11 = 3;
220
221 for (s32 j = 0; ; j++) {
222 s32 v14 = MR::getCurrentStageNormalScenarioNum();
223
224 if (j >= MR::getCurrentStagePowerStarNum() - v14) {
225 break;
226 }
227
228 s32 v13 = j + MR::getCurrentStageNormalScenarioNum() + 1;
229
230 if (MR::hasPowerStarInCurrentStage(v13)) {
231 appearStar(v11++, v13, (a4 == 0) - 1 + 2);
232 }
233 }
234 }
235}
236*/
237
238void ScenarioSelectLayout::appearStar(s32 starIdx, s32 a2, int a3) {
239 ScenarioSelectStar* star = mStars[starIdx];
240 TVec2f starPane;
241 MR::copyPaneTrans(&starPane, this, cStarPaneName[starIdx]);
242 TVec3f worldPos;
243 calcWorldPositionFromScreenPos(&worldPos, starPane, 1000.0f);
244 star->setup(a2, a3, worldPos, starIdx);
245 star->appear();
246}
247
248bool ScenarioSelectLayout::isAppearStarEndAll() const {
249 for (s32 i = 0; i < 7; i++) {
250 if (!mStars[i]->_30 && !mStars[i]->isAppearEnd()) {
251 return false;
252 }
253 }
254
255 return true;
256}
257
258bool ScenarioSelectLayout::tryCancel() {
259 if (mBackButton->_24) {
260 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancel::sInstance);
261 return true;
262 }
263 else if (MR::testCorePadTriggerB(0)) {
264 MR::startSystemSE("SE_SY_GALAXY_DECIDE_CANCEL", -1, -1);
265 mBackButton->disappear();
266 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancel::sInstance);
267 return true;
268 }
269
270 return false;
271}
272
273void ScenarioSelectLayout::setPlayerLeft() {
274 MR::setTextBoxGameMessageRecursive(this, "ShaMario", "PlayerLeft");
275 s32 playerLeft = MR::getPlayerLeft();
276 MR::setTextBoxNumberRecursive(this, "ShaMarioNum", playerLeft);
277
278 if (MR::getPlayerLeft() >= 10) {
279 _A0 = "MarioPosition10";
280 }
281 else {
282 _A0 = "MarioPosition01";
283 }
284}
285
286void ScenarioSelectLayout::startAnimAllNewPane(const char *pAnim) {
287 MR::startPaneAnim(this, "New", pAnim, 0);
288 MR::startPaneAnim(this, "NewStarGreen", pAnim, 0);
289
290 for (u32 i = 0; i < 2; i++) {
291 MR::startPaneAnim(this, cQuestionPaneName[i], pAnim, 0);
292 }
293}
294
295void ScenarioSelectLayout::setAnimRateAllNewPane(f32 rate) {
296 MR::setPaneAnimRate(this, "New", rate, 0);
297 MR::setPaneAnimRate(this, "NewStarGreen", rate, 0);
298
299 for (u32 i = 0; i < 2; i++) {
300 MR::setPaneAnimRate(this, cQuestionPaneName[i], rate, 0);
301 }
302}
303
304void ScenarioSelectLayout::exeDisappearCometWarning() {
305 MR::startPaneAnimAtFirstStep(this, "CometAppear", "CometEnd", 0);
306 MR::setNerveAtPaneAnimStopped(this, "CometAppear", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppear::sInstance, 0);
307}
308
309void ScenarioSelectLayout::exeCancelFadeOut() {
310 kill();
311}
312
313void ScenarioSelectLayout::exeAppearStar() {
314 if (MR::isFirstStep(this)) {
315 MR::permitTrigSE();
316 MR::getEffect(this, "ScenarioSelectEffect")->create(mEffectSystem);
317 MR::setEffectRate(this, "ScenarioSelectEffect", 2.0f);
318 MR::setEffectDirectionalSpeed(this, "ScenarioSelectEffect", 9.0f);
319
320 if (!MR::isPlayingStageBgmName("BGM_SENARIO_SEL")) {
321 MR::startStageBGM("BGM_SENARIO_SE_2", 0);
322 }
323 }
324
325 MR::startSystemLevelSE("SE_DM_LV_SENARIO_SE_FLY", -1, -1);
326
327 if (isAppearStarEndAll()) {
328 s32 scenarioNo;
329 bool needsAppearComet;
330 if (!MR::isScenarioDecided()) {
331 needsAppearComet = false;
332 }
333 else {
334 scenarioNo = MR::getCurrentScenarioNo();
335 needsAppearComet = false;
336 GalaxyStatusAccessor galaxyAccessor = MR::makeCurrentGalaxyStatusAccessor();
337
338 if (galaxyAccessor.isCometStar(scenarioNo)) {
339 if (scenarioNo == MR::getEncounterGalaxyCometPowerStarId(MR::getCurrentStageName())) {
340 needsAppearComet = true;
341 }
342 }
343 }
344
345 if (needsAppearComet) {
346 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppearCometWarning::sInstance);
347 }
348 else {
349 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppear::sInstance);
350 }
351 }
352}
353
354void ScenarioSelectLayout::exeAppear() {
355 if (MR::isFirstStep(this)) {
356 MR::setPaneAnimRate(this, "ScenarioSelect", 1.0f, 0);
357 setAnimRateAllNewPane(1.0f);
358 }
359
360 MR::startSystemLevelSE("SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
361 MR::setNerveAtPaneAnimStopped(this, "ScenarioSelect", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvWaitScenarioSelect::sInstance, 0);
362}
363
364void ScenarioSelectLayout::exeWaitScenarioSelect() {
365 if (MR::isFirstStep(this)) {
366 startAnimAllNewPane("NewWait");
367 mBackButton->appear();
368 }
369
370 updateSelectedScenario();
371 updateScenarioText();
372 MR::startSystemLevelSE("SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
373
374 if (!tryCancel()) {
375 if (trySelect()) {
376 _28 = 1;
377 MR::startSystemSE("SE_SY_DECIDE_1", -1, -1);
378 MR::startCSSound("CS_CLICK_CLOSE", nullptr, 0);
379 mBackButton->disappear();
380 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvDecide::sInstance);
381 }
382 }
383}
384
385void ScenarioSelectLayout::exeDecide() {
386 if (MR::isFirstStep(this)) {
387 for (s32 i = 0; i < 7; i++) {
388 if (!mStars[i]->_30) {
389 if (mStars[i] == getSelectedStar()) {
390 mStars[i]->select();
391 }
392 else {
393 mStars[i]->notSelect();
394 }
395 }
396 }
397
398 startAnimAllNewPane("End");
399 }
400
401 updateScenarioText();
402 MR::startSystemSE("SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
403 MR::setNerveAtStep(this, &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAfterScenarioSelected::sInstance, 40);
404}
405
406void ScenarioSelectLayout::exeAfterScenarioSelected() {
407 MR::startPaneAnimAtStep(this, "ScenarioFrame", "End", 60, 0);
408 updateScenarioText();
409 MR::startSystemLevelSE("SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
410 f32 v2 = MR::calcNerveEaseInValue(this, 60, 150, 2.0f, 15.0f);
411 f32 v3 = MR::calcNerveEaseInValue(this, 60, 150, 9.0f, 15.0f);
412 MR::setEffectRate(this, "ScenarioSelectEffect", v2);
413 MR::setEffectDirectionalSpeed(this, "ScenarioSelectEffect", v3);
414
415 if (MR::isStep(this, 180)) {
416 MR::stopStageBGM(30);
417 MR::closeSystemWipeWhiteFade(30);
418 }
419}
420
421void ScenarioSelectLayout::exeDisappear() {
422 if (MR::isFirstStep(this)) {
423 MR::hideLayout(this);
424 MR::getEffect(this, "ScenarioSelectEffect")->forceDelete(mEffectSystem);
425
426 for (s32 i = 0; i < 7; i++) {
427 ScenarioSelectStar* star = mStars[i];
428
429 if (!star->_30) {
430 star->kill();
431 }
432 }
433
434 mScenarioSky->kill();
435 MR::openSystemWipeWhiteFade(180);
436 }
437
438 if (!MR::isSystemWipeActive()) {
439 kill();
440 }
441}
442
443void ScenarioSelectLayout::exeCancel() {
444 if (MR::isFirstStep(this)) {
445 mSelectedScenarioNo = -1;
446 }
447
448 updateScenarioText();
449
450 if (mBackButton->isHidden()) {
451 MR::closeSystemWipeCircleWithCaptureScreen(90);
452 MR::stopStageBGM(1);
453 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancelFadeOut::sInstance);
454 }
455}
456
457void ScenarioSelectLayout::exeAppearCometWarning() {
458 if (MR::isStep(this, 15)) {
459 int id = MR::getEncounterGalaxyCometNameId(MR::getCurrentStageName());
460 const char* cometName = MR::getCometNameFromId(id);
461 char cometMsg[256];
462 MR::makeCometMessageID(cometMsg, sizeof(cometMsg), cometName);
463 MR::setTextBoxGameMessageRecursive(this, "TextComet", "GalaxyInfo_CometAppearR");
464 MR::setTextBoxArgGameMessageRecursive(this, "TextComet", cometMsg, 0);
465 MR::showPaneRecursive(this, "CometAppear");
466 MR::startPaneAnim(this, "CometAppear", "CometAppear", 0);
467 MR::setCometPaneAnimFromId(this, "CometAppear", id, 1);
468 MR::startSystemSE("SE_SY_COMET_WARNING_DISP", -1, -1);
469 }
470
471 if (MR::isGreaterStep(this, 15)) {
472 MR::setNerveAtPaneAnimStopped(this, "CometAppear", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvWaitCometWarning::sInstance, 0);
473 }
474}
475
476void ScenarioSelectLayout::exeWaitCometWarning() {
477 if (getNerveStep() % 80 == 25) {
478 MR::startSystemSE("SE_SY_COMET_WARNING", -1, -1);
479 }
480
481 MR::startPaneAnimAtFirstStep(this, "CometAppear", "CometWait", 0);
482 MR::setNerveAtStep(this, &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvDisappearCometWarning::sInstance, 180);
483}
484
485ScenarioSelectLayout::~ScenarioSelectLayout() {
486
487}
488
489namespace NrvScenarioSelectLayout {
490 INIT_NERVE(ScenarioSelectLayoutNrvAppearStar)
491 INIT_NERVE(ScenarioSelectLayoutNrvAppear)
492 INIT_NERVE(ScenarioSelectLayoutNrvWaitScenarioSelect)
493 INIT_NERVE(ScenarioSelectLayoutNrvDecide)
494 INIT_NERVE(ScenarioSelectLayoutNrvAfterScenarioSelected)
495 INIT_NERVE(ScenarioSelectLayoutNrvDisappear)
496 INIT_NERVE(ScenarioSelectLayoutNrvCancel)
497 INIT_NERVE(ScenarioSelectLayoutNrvCancelFadeOut)
498 INIT_NERVE(ScenarioSelectLayoutNrvAppearCometWarning)
499 INIT_NERVE(ScenarioSelectLayoutNrvWaitCometWarning)
500 INIT_NERVE(ScenarioSelectLayoutNrvDisappearCometWarning)
501};
virtual void draw() const
Draws the object. Does nothing until overridden.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.
Definition NameObj.cpp:41
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void draw() const
Draws the object. Does nothing until overridden.