1#include "Scene/StageSceneStateStartSeparatePlay.h"
2
3#include "Library/Layout/LayoutActionFunction.h"
4#include "Library/Layout/LayoutActorUtil.h"
5#include "Library/Message/MessageHolder.h"
6#include "Library/Nerve/NerveSetupUtil.h"
7#include "Library/Nerve/NerveUtil.h"
8#include "Library/Play/Layout/SimpleLayoutAppearWaitEnd.h"
9#include "Library/Play/Layout/WipeSimple.h"
10#include "Library/Scene/Scene.h"
11#include "Library/Se/SeFunction.h"
12
13#include "Layout/FooterParts.h"
14#include "Scene/StageSceneStatePauseMenu.h"
15#include "Util/SpecialBuildUtil.h"
16#include "Util/StageInputFunction.h"
17
18namespace {
19NERVE_IMPL(StageSceneStateStartSeparatePlay, Appear);
20NERVE_IMPL(StageSceneStateStartSeparatePlay, FadeOut);
21NERVE_IMPL(StageSceneStateStartSeparatePlay, FadeIn);
22NERVE_IMPL(StageSceneStateStartSeparatePlay, Back);
23NERVE_IMPL(StageSceneStateStartSeparatePlay, WaitDraw);
24NERVE_IMPL(StageSceneStateStartSeparatePlay, Wait);
25NERVE_IMPL(StageSceneStateStartSeparatePlay, Applet);
26
27NERVES_MAKE_NOSTRUCT(StageSceneStateStartSeparatePlay, Wait, Applet);
28NERVES_MAKE_STRUCT(StageSceneStateStartSeparatePlay, Appear, FadeOut, FadeIn, Back, WaitDraw);
29} // namespace
30
31StageSceneStateStartSeparatePlay::StageSceneStateStartSeparatePlay(
32 const char* name, StageSceneStatePauseMenu* host, const al::LayoutInitInfo& info,
33 al::WipeSimple* wipeSimple, al::GamePadSystem* gamePadSystem, FooterParts* footerParts)
34 : al::HostStateBase<StageSceneStatePauseMenu>(name, host), mGamePadSystem(gamePadSystem),
35 mWipeSimple(wipeSimple), mFooterParts(footerParts) {
36 initNerve(nerve: &NrvStageSceneStateStartSeparatePlay.Appear, stateCount: 0);
37
38 mControllerGuideMulti = new al::SimpleLayoutAppearWaitEnd(
39 "おすそ分け開始", "ControllerGuideMulti", info, nullptr, false);
40 al::killLayoutIfActive(mControllerGuideMulti);
41}
42
43void StageSceneStateStartSeparatePlay::appear() {
44 field_40 = 0;
45 mIsCancel = false;
46 al::NerveStateBase::appear();
47 if (rs::isModeE3LiveRom()) {
48 startTreeHouse();
49 return;
50 }
51 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.Appear);
52}
53
54void StageSceneStateStartSeparatePlay::startTreeHouse() {
55 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeOut);
56}
57
58bool StageSceneStateStartSeparatePlay::isNeedRequestGraphicsPreset() const {
59 return (mIsCancel && al::isNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeIn)) ||
60 (al::isNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.Appear) ||
61 al::isNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.Back));
62}
63
64bool StageSceneStateStartSeparatePlay::isDrawViewRenderer() const {
65 if (isDead() || mIsCancel)
66 return false;
67 return al::isNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.WaitDraw) ||
68 al::isNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeIn);
69}
70
71void StageSceneStateStartSeparatePlay::exeAppear() {
72 if (al::isFirstStep(user: this)) {
73 mControllerGuideMulti->appear();
74 al::startAction(layout: mControllerGuideMulti, actionName: "Loop", paneName: "Loop");
75 }
76 if (mControllerGuideMulti->isWait())
77 al::setNerve(user: this, nerve: &Wait);
78}
79
80void StageSceneStateStartSeparatePlay::exeWait() {
81 if (rs::isTriggerUiCancel(getScene())) {
82 mIsCancel = true;
83 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.Back);
84 return;
85 }
86 if (rs::isTriggerUiDecide(getScene()))
87 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeOut);
88}
89
90al::Scene* StageSceneStateStartSeparatePlay::getScene() {
91 return getHost()->getHost();
92}
93
94void StageSceneStateStartSeparatePlay::exeBack() {
95 if (al::isFirstStep(user: this)) {
96 mControllerGuideMulti->end();
97 mFooterParts->changeTextFade(
98 text: al::getSystemMessageString(mFooterParts, "Footer", "MenuMessage_Footer"));
99 }
100 if (!al::isActive(mControllerGuideMulti))
101 kill();
102}
103
104void StageSceneStateStartSeparatePlay::exeFadeOut() {
105 if (al::isFirstStep(user: this)) {
106 mWipeSimple->startClose(frames: 60);
107 al::startSe(mControllerGuideMulti, "Decide");
108 al::startAction(layout: mControllerGuideMulti, actionName: "Decide", paneName: nullptr);
109 }
110 if (mWipeSimple->isCloseEnd())
111 al::setNerve(user: this, nerve: &Applet);
112}
113
114void StageSceneStateStartSeparatePlay::exeApplet() {
115 if (ControllerAppletFunction::connectControllerSeparatePlay(mGamePadSystem)) {
116 rs::changeSeparatePlayMode(getScene(), true);
117 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.WaitDraw);
118 return;
119 }
120 mFooterParts->changeTextFade(
121 text: al::getSystemMessageString(mFooterParts, "Footer", "MenuMessage_Footer"));
122 mIsCancel = true;
123 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeIn);
124}
125
126void StageSceneStateStartSeparatePlay::exeFadeIn() {
127 if (al::isFirstStep(user: this)) {
128 mControllerGuideMulti->kill();
129 mWipeSimple->startOpen(frames: -1);
130 }
131 if (mWipeSimple->isOpenEnd())
132 kill();
133}
134
135void StageSceneStateStartSeparatePlay::exeWaitDraw() {
136 if (al::isFirstStep(user: this) && !mIsCancel)
137 getHost()->killPauseMenu();
138 if (al::isGreaterEqualStep(user: this, step: 2))
139 al::setNerve(user: this, nerve: &NrvStageSceneStateStartSeparatePlay.FadeIn);
140}
141