1#include "Game/Screen/ScenarioSelectLayout.hpp"
2#include "Game/Effect/MultiEmitter.hpp"
3#include "Game/System/GalaxyStatusAccessor.hpp"
4#include "Game/Util.hpp"
7 const char*
const cStarPaneName[] = {
17 const char*
const cQuestionPaneName[2] = {
"NewStar1",
"NewStar2" };
21 mSelectedScenarioNo = -1;
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;
40 mEffectHostMtx.identity();
42 for (u32 i = 0; i < 2; i++) {
43 mQuestionPane[i].zero();
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");
66 for (u32 i = 0; i < 2; i++) {
67 MR::createAndAddPaneCtrl(
this, cQuestionPaneName[i], 1);
68 MR::setFollowPos(mQuestionPane[i],
this, cQuestionPaneName[i]);
71 initPointingTarget(7);
72 initEffectKeeper(0,
"ScenarioSelect", mEffectSystem);
73 MR::setEffectHostMtx(
this,
"ScenarioSelectEffect", mEffectHostMtx.toMtxPtr());
76 for (s32 i = 0; i < 7; i++) {
83 MR::addStarPointerTargetCircle(
this, cStarPaneName[i], 60.0f, radius,
nullptr);
86 mScenarioSky =
new MultiSceneActor(
"シナリオ選択の空",
"ScenarioSelectSky",
false);
90 initNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppearStar::sInstance);
95void ScenarioSelectLayout::kill() {
96 for (s32 i = 0; i < 7; i++) {
104 mScenarioSky->kill();
109void ScenarioSelectLayout::movement() {
110 LayoutActor::movement();
112 for (s32 i = 0; i < 7; i++) {
113 mStars[i]->movement();
116 mScenarioSky->movement();
117 mBackButton->movement();
120void ScenarioSelectLayout::calcAnim() {
121 LayoutActor::calcAnim();
123 for (s32 i = 0; i < 7; i++) {
124 mStars[i]->calcAnim();
127 mScenarioSky->calcAnim();
128 mBackButton->calcAnim();
136void ScenarioSelectLayout::calcViewAndEntryStarModel() {
137 for (s32 i = 0; i < 7; i++) {
138 mStars[i]->calcViewAndEntry();
141 mScenarioSky->calcViewAndEntry();
144s32 ScenarioSelectLayout::getSelectedScenarioNo()
const {
145 return mSelectedScenarioNo;
148bool ScenarioSelectLayout::isReadyToDisappear()
const {
149 if (isNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAfterScenarioSelected::sInstance)) {
150 return MR::isGreaterStep(
this, 210);
156void ScenarioSelectLayout::disappear() {
157 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvDisappear::sInstance);
182 for (s32 i = 0; i < 7; i++) {
183 if (!mStars[i]->_30 && mSelectedScenarioNo == mStars[i]->mFrame) {
238void ScenarioSelectLayout::appearStar(s32 starIdx, s32 a2,
int a3) {
241 MR::copyPaneTrans(&starPane,
this, cStarPaneName[starIdx]);
243 calcWorldPositionFromScreenPos(&worldPos, starPane, 1000.0f);
244 star->setup(a2, a3, worldPos, starIdx);
248bool ScenarioSelectLayout::isAppearStarEndAll()
const {
249 for (s32 i = 0; i < 7; i++) {
250 if (!mStars[i]->_30 && !mStars[i]->isAppearEnd()) {
258bool ScenarioSelectLayout::tryCancel() {
259 if (mBackButton->_24) {
260 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancel::sInstance);
263 else if (MR::testCorePadTriggerB(0)) {
264 MR::startSystemSE(
"SE_SY_GALAXY_DECIDE_CANCEL", -1, -1);
265 mBackButton->disappear();
266 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancel::sInstance);
273void ScenarioSelectLayout::setPlayerLeft() {
274 MR::setTextBoxGameMessageRecursive(
this,
"ShaMario",
"PlayerLeft");
275 s32 playerLeft = MR::getPlayerLeft();
276 MR::setTextBoxNumberRecursive(
this,
"ShaMarioNum", playerLeft);
278 if (MR::getPlayerLeft() >= 10) {
279 _A0 =
"MarioPosition10";
282 _A0 =
"MarioPosition01";
286void ScenarioSelectLayout::startAnimAllNewPane(
const char *pAnim) {
287 MR::startPaneAnim(
this,
"New", pAnim, 0);
288 MR::startPaneAnim(
this,
"NewStarGreen", pAnim, 0);
290 for (u32 i = 0; i < 2; i++) {
291 MR::startPaneAnim(
this, cQuestionPaneName[i], pAnim, 0);
295void ScenarioSelectLayout::setAnimRateAllNewPane(f32 rate) {
296 MR::setPaneAnimRate(
this,
"New", rate, 0);
297 MR::setPaneAnimRate(
this,
"NewStarGreen", rate, 0);
299 for (u32 i = 0; i < 2; i++) {
300 MR::setPaneAnimRate(
this, cQuestionPaneName[i], rate, 0);
304void ScenarioSelectLayout::exeDisappearCometWarning() {
305 MR::startPaneAnimAtFirstStep(
this,
"CometAppear",
"CometEnd", 0);
306 MR::setNerveAtPaneAnimStopped(
this,
"CometAppear", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppear::sInstance, 0);
309void ScenarioSelectLayout::exeCancelFadeOut() {
313void ScenarioSelectLayout::exeAppearStar() {
314 if (MR::isFirstStep(
this)) {
316 MR::getEffect(
this,
"ScenarioSelectEffect")->create(mEffectSystem);
317 MR::setEffectRate(
this,
"ScenarioSelectEffect", 2.0f);
318 MR::setEffectDirectionalSpeed(
this,
"ScenarioSelectEffect", 9.0f);
320 if (!MR::isPlayingStageBgmName(
"BGM_SENARIO_SEL")) {
321 MR::startStageBGM(
"BGM_SENARIO_SE_2", 0);
325 MR::startSystemLevelSE(
"SE_DM_LV_SENARIO_SE_FLY", -1, -1);
327 if (isAppearStarEndAll()) {
329 bool needsAppearComet;
330 if (!MR::isScenarioDecided()) {
331 needsAppearComet =
false;
334 scenarioNo = MR::getCurrentScenarioNo();
335 needsAppearComet =
false;
338 if (galaxyAccessor.isCometStar(scenarioNo)) {
339 if (scenarioNo == MR::getEncounterGalaxyCometPowerStarId(MR::getCurrentStageName())) {
340 needsAppearComet =
true;
345 if (needsAppearComet) {
346 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppearCometWarning::sInstance);
349 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAppear::sInstance);
354void ScenarioSelectLayout::exeAppear() {
355 if (MR::isFirstStep(
this)) {
356 MR::setPaneAnimRate(
this,
"ScenarioSelect", 1.0f, 0);
357 setAnimRateAllNewPane(1.0f);
360 MR::startSystemLevelSE(
"SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
361 MR::setNerveAtPaneAnimStopped(
this,
"ScenarioSelect", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvWaitScenarioSelect::sInstance, 0);
364void ScenarioSelectLayout::exeWaitScenarioSelect() {
365 if (MR::isFirstStep(
this)) {
366 startAnimAllNewPane(
"NewWait");
367 mBackButton->appear();
370 updateSelectedScenario();
371 updateScenarioText();
372 MR::startSystemLevelSE(
"SE_DM_LV_SENARIO_SEL_FLY", -1, -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);
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()) {
393 mStars[i]->notSelect();
398 startAnimAllNewPane(
"End");
401 updateScenarioText();
402 MR::startSystemSE(
"SE_DM_LV_SENARIO_SEL_FLY", -1, -1);
403 MR::setNerveAtStep(
this, &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvAfterScenarioSelected::sInstance, 40);
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);
415 if (MR::isStep(
this, 180)) {
416 MR::stopStageBGM(30);
417 MR::closeSystemWipeWhiteFade(30);
421void ScenarioSelectLayout::exeDisappear() {
422 if (MR::isFirstStep(
this)) {
423 MR::hideLayout(
this);
424 MR::getEffect(
this,
"ScenarioSelectEffect")->forceDelete(mEffectSystem);
426 for (s32 i = 0; i < 7; i++) {
434 mScenarioSky->kill();
435 MR::openSystemWipeWhiteFade(180);
438 if (!MR::isSystemWipeActive()) {
443void ScenarioSelectLayout::exeCancel() {
444 if (MR::isFirstStep(
this)) {
445 mSelectedScenarioNo = -1;
448 updateScenarioText();
450 if (mBackButton->isHidden()) {
451 MR::closeSystemWipeCircleWithCaptureScreen(90);
453 setNerve(&NrvScenarioSelectLayout::ScenarioSelectLayoutNrvCancelFadeOut::sInstance);
457void ScenarioSelectLayout::exeAppearCometWarning() {
458 if (MR::isStep(
this, 15)) {
459 int id = MR::getEncounterGalaxyCometNameId(MR::getCurrentStageName());
460 const char* cometName = MR::getCometNameFromId(
id);
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);
471 if (MR::isGreaterStep(
this, 15)) {
472 MR::setNerveAtPaneAnimStopped(
this,
"CometAppear", &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvWaitCometWarning::sInstance, 0);
476void ScenarioSelectLayout::exeWaitCometWarning() {
477 if (getNerveStep() % 80 == 25) {
478 MR::startSystemSE(
"SE_SY_COMET_WARNING", -1, -1);
481 MR::startPaneAnimAtFirstStep(
this,
"CometAppear",
"CometWait", 0);
482 MR::setNerveAtStep(
this, &NrvScenarioSelectLayout::ScenarioSelectLayoutNrvDisappearCometWarning::sInstance, 180);
485ScenarioSelectLayout::~ScenarioSelectLayout() {
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)
virtual void draw() const
Draws the object. Does nothing until overridden.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.
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.