1#include "Scene/StageSceneStatePauseMenu.h"
2
3#include <nn/oe.h>
4
5#include "Library/Base/StringUtil.h"
6#include "Library/Bgm/BgmLineFunction.h"
7#include "Library/Camera/CameraUtil.h"
8#include "Library/Controller/KeyRepeatCtrl.h"
9#include "Library/Draw/GraphicsFunction.h"
10#include "Library/Effect/EffectSystem.h"
11#include "Library/Layout/LayoutActionFunction.h"
12#include "Library/Layout/LayoutActorUtil.h"
13#include "Library/LiveActor/ActorActionFunction.h"
14#include "Library/LiveActor/ActorFlagFunction.h"
15#include "Library/LiveActor/ActorInitInfo.h"
16#include "Library/LiveActor/ActorInitUtil.h"
17#include "Library/LiveActor/ActorMovementFunction.h"
18#include "Library/LiveActor/ActorPoseUtil.h"
19#include "Library/LiveActor/ActorSceneInfo.h"
20#include "Library/LiveActor/LiveActor.h"
21#include "Library/LiveActor/LiveActorFunction.h"
22#include "Library/LiveActor/LiveActorKit.h"
23#include "Library/Math/MathUtil.h"
24#include "Library/Message/MessageHolder.h"
25#include "Library/Nerve/NerveSetupUtil.h"
26#include "Library/Nerve/NerveUtil.h"
27#include "Library/Obj/PartsModel.h"
28#include "Library/Play/Layout/SimpleLayoutAppearWaitEnd.h"
29#include "Library/Play/Layout/WindowConfirm.h"
30#include "Library/Play/Layout/WipeSimple.h"
31#include "Library/Scene/SceneUtil.h"
32#include "Library/Screen/ScreenFunction.h"
33#include "Library/Se/SeFunction.h"
34#include "Library/System/GameSystemInfo.h"
35#include "Project/Scene/SceneInitInfo.h"
36
37#include "Layout/FooterParts.h"
38#include "Layout/MenuSelectParts.h"
39#include "Layout/StageSceneLayout.h"
40#include "Scene/SceneAudioSystemPauseController.h"
41#include "Scene/StageScene.h"
42#include "Scene/StageSceneStateEndSeparatePlay.h"
43#include "Scene/StageSceneStateOption.h"
44#include "Scene/StageSceneStateStartSeparatePlay.h"
45#include "Sequence/GameSequenceInfo.h"
46#include "System/GameDataHolder.h"
47#include "System/SaveDataAccessFunction.h"
48#include "Util/HelpFunction.h"
49#include "Util/InputInterruptTutorialUtil.h"
50#include "Util/SpecialBuildUtil.h"
51#include "Util/StageInputFunction.h"
52
53namespace {
54NERVE_IMPL(StageSceneStatePauseMenu, Appear);
55NERVE_IMPL(StageSceneStatePauseMenu, StartSeparatePlay);
56NERVE_IMPL(StageSceneStatePauseMenu, EndSeparatePlay);
57NERVE_IMPL(StageSceneStatePauseMenu, Option);
58NERVE_IMPL_(StageSceneStatePauseMenu, OptionFromHelp, Option);
59NERVE_IMPL(StageSceneStatePauseMenu, Wait);
60NERVE_IMPL(StageSceneStatePauseMenu, End);
61NERVE_IMPL(StageSceneStatePauseMenu, WaitDraw);
62NERVE_IMPL(StageSceneStatePauseMenu, Save);
63NERVE_IMPL(StageSceneStatePauseMenu, ConfirmNewGame);
64NERVE_IMPL(StageSceneStatePauseMenu, NotExistEmptyFile);
65NERVE_IMPL(StageSceneStatePauseMenu, FadeBeforeHelp);
66NERVE_IMPL(StageSceneStatePauseMenu, StartHelp);
67NERVE_IMPL_(StageSceneStatePauseMenu, StartHelpFromOption, StartHelp);
68
69NERVES_MAKE_NOSTRUCT(StageSceneStatePauseMenu, StartHelp);
70NERVES_MAKE_STRUCT(StageSceneStatePauseMenu, Appear, StartSeparatePlay, EndSeparatePlay, Option,
71 OptionFromHelp, Wait, End, WaitDraw, Save, ConfirmNewGame, NotExistEmptyFile,
72 FadeBeforeHelp, StartHelpFromOption);
73} // namespace
74
75StageSceneStatePauseMenu::StageSceneStatePauseMenu(
76 const char* name, al::Scene* host, al::SimpleLayoutAppearWaitEnd* menuLayout,
77 GameDataHolder* gameDataHolder, const al::SceneInitInfo& sceneInitInfo,
78 const al::ActorInitInfo& actorInitInfo, const al::LayoutInitInfo& layoutInitInfo,
79 al::WindowConfirm* windowConfirm, StageSceneLayout* stageSceneLayout, bool isTitle,
80 SceneAudioSystemPauseController* sceneAudioSystemPauseController)
81 : al::HostStateBase<al::Scene>(name, host), mMenuLayout(menuLayout),
82 mGameDataHolderAccessor(gameDataHolder), mWindowConfirm(windowConfirm),
83 mStageSceneLayout(stageSceneLayout),
84 mSceneAudioSystemPauseController(sceneAudioSystemPauseController) {
85 mMarioActor = new al::LiveActor("メニュー用マリオモデル");
86
87 al::initActorWithArchiveName(actor: mMarioActor, initInfo: actorInitInfo, archiveName: "MarioHigh", suffix: "PauseMenu");
88 mMarioActor->makeActorDead();
89
90 al::PartsModel* capManEyes = new al::PartsModel("メニュー用キャップ目");
91 al::LiveActor* marioHat = al::getSubActor(actor: mMarioActor, subActorName: "頭");
92 capManEyes->initPartsFixFile(marioHat, actorInitInfo, "CapManHeroHighEyes", nullptr, nullptr);
93 capManEyes->makeActorDead();
94 al::onSyncAppearSubActor(actor: marioHat, subActor: capManEyes);
95 al::startAction(actor: capManEyes, actionName: "Wait");
96
97 mSelectParts = new MenuSelectParts("[ポーズメニュー]選択肢", mMenuLayout, mMarioActor,
98 layoutInitInfo, cMenuItemAmount + 1);
99 mMenuGuide = new al::SimpleLayoutAppearWaitEnd("[ポーズメニュー]フッター", "MenuGuide",
100 layoutInitInfo, nullptr, false);
101 mMenuRight = new al::SimpleLayoutAppearWaitEnd("[ポーズメニュー]権利", "MenuRight",
102 layoutInitInfo, nullptr, false);
103
104 nn::oe::DisplayVersion displayVersion;
105 nn::oe::GetDisplayVersion(&displayVersion);
106 if (al::isEqualString(str1: displayVersion.name, str2: "1.0.0"))
107 al::hidePane(mMenuRight, "TxtVersion");
108 else
109 al::setPaneStringFormat(mMenuRight, "TxtVersion", displayVersion.name);
110
111 mFooterParts =
112 new FooterParts(mMenuGuide, layoutInitInfo,
113 al::getSystemMessageString(mMenuGuide, "Footer", "MenuMessage_Footer"),
114 "TxtGuide", "ParFooter");
115 mMenuGuide->kill();
116 mMenuWipe = new al::WipeSimple("メニュー黒フェード", "FadeBlack", layoutInitInfo, nullptr);
117 mMenuWipe->kill();
118 mHelpWipe = new al::WipeSimple("ヘルプ黒フェード", "FadeBlack", layoutInitInfo, "BeforeWindow");
119 mHelpWipe->kill();
120
121 mPauseCameraCtrl = al::initAndCreatePauseCameraCtrl(scene: getHost(), value: 10.0f);
122 mKeyRepeatCtrl = new al::KeyRepeatCtrl();
123 mKeyRepeatCtrl->init(initialMaxWait: 30, maxWait: 5);
124
125 initNerve(nerve: &NrvStageSceneStatePauseMenu.Appear, stateCount: 4);
126
127 al::GamePadSystem* gamePadSystem = sceneInitInfo.gameSysInfo->gamePadSystem;
128
129 mStateStartSeparatePlay = new StageSceneStateStartSeparatePlay(
130 "おすそ分け開始", this, layoutInitInfo, mMenuWipe, gamePadSystem, mFooterParts);
131 mStateEndSeparatePlay = new StageSceneStateEndSeparatePlay(
132 "おすそ分け終了", this, layoutInitInfo, mMenuWipe, gamePadSystem);
133 mStateOption = new StageSceneStateOption("オプション画面", getHost(), layoutInitInfo,
134 mFooterParts, mGameDataHolderAccessor, isTitle);
135
136 al::initNerveState(user: this, state: mStateStartSeparatePlay,
137 nerve: &NrvStageSceneStatePauseMenu.StartSeparatePlay, hostName: "おすそ分けプレイ開始");
138 al::initNerveState(user: this, state: mStateEndSeparatePlay, nerve: &NrvStageSceneStatePauseMenu.EndSeparatePlay,
139 hostName: "おすそ分けプレイ終了");
140 al::initNerveState(user: this, state: mStateOption, nerve: &NrvStageSceneStatePauseMenu.Option, hostName: "オプション画面");
141 al::addNerveState(user: this, state: mStateOption, nerve: &NrvStageSceneStatePauseMenu.OptionFromHelp,
142 hostName: "オプション画面[ヘルプから遷移]");
143
144 rs::registerGraphicsPresetPause(getHost());
145 mHtmlViewer = sceneInitInfo.gameSysInfo->htmlViewer;
146}
147
148void StageSceneStatePauseMenu::appear() {
149 mStartType = StartType::Title;
150 al::NerveStateBase::appear();
151 if (rs::isModeE3LiveRom()) {
152 if (rs::isSeparatePlay(getHost()))
153 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.EndSeparatePlay);
154 else
155 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.StartSeparatePlay);
156 return;
157 }
158 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Appear);
159}
160
161void StageSceneStatePauseMenu::kill() {
162 rs::updateGyroText(getHost());
163
164 al::NerveStateBase::kill();
165 killPauseMenu();
166 killMarioModel(); // redundant as killPauseMenu() already does this
167
168 if (!isNeedKillHost() && mSceneAudioSystemPauseController) {
169 mSceneAudioSystemPauseController->resume(1);
170 al::endPausePadRumble(scene: getHost());
171 }
172
173 alGraphicsFunction::validateGpuStressAnalyzer(getHost());
174}
175
176void StageSceneStatePauseMenu::killPauseMenu() {
177 mMenuLayout->kill();
178 mMenuRight->kill();
179 mMenuGuide->kill();
180
181 al::endCameraPause(pauseCameraCtrl: mPauseCameraCtrl);
182 killMarioModel();
183}
184
185void StageSceneStatePauseMenu::killMarioModel() {
186 if (mIsShowMarioModel)
187 al::setNearClipDistance(user: getHost(), distance: mPrevNearClipDistance, updaterIdx: 0);
188
189 if (al::isAlive(actor: mMarioActor))
190 mMarioActor->kill();
191}
192
193bool StageSceneStatePauseMenu::isNeedKillHost() const {
194 return isLoadData() || isNewGame() || isChangeLanguage() || isModeSelectEnd();
195}
196
197void StageSceneStatePauseMenu::startNormal() {
198 mStartType = StartType::Normal;
199 al::pausePadRumble(scene: getHost());
200 mSceneAudioSystemPauseController->pause(false);
201 alGraphicsFunction::invalidateGpuStressAnalyzer(getHost());
202}
203
204void StageSceneStatePauseMenu::startAfterTitle() {
205 mStartType = StartType::AfterTitle;
206}
207
208void StageSceneStatePauseMenu::killAllOptionLayout() {
209 mStateOption->killAllLayouts();
210}
211
212bool StageSceneStatePauseMenu::isEndToCancel() const {
213 return !mSelectParts->isDecideSetting();
214}
215
216bool StageSceneStatePauseMenu::isEndToHelp() const {
217 return false;
218}
219
220bool StageSceneStatePauseMenu::isLoadData() const {
221 return mStateOption->isLoadData();
222}
223
224s32 StageSceneStatePauseMenu::getSelectedFileId() const {
225 return mStateOption->getSelectedFileId();
226}
227
228bool StageSceneStatePauseMenu::isChangeLanguage() const {
229 return mStateOption->isChangeLanguage();
230}
231
232const char* StageSceneStatePauseMenu::getLanguage() const {
233 return mStateOption->getLanguage();
234}
235
236bool StageSceneStatePauseMenu::isNewGame() const {
237 return mIsNewGame;
238}
239
240bool StageSceneStatePauseMenu::isModeSelectEnd() const {
241 return mStateOption->isModeSelectEnd();
242}
243
244bool StageSceneStatePauseMenu::checkNeedKillByHostAndEnd() {
245 if (!isNeedKillHost())
246 return false;
247
248 getHost()->getLiveActorKit()->getEffectSystem()->set_69(false);
249 mSceneAudioSystemPauseController->resume(0);
250 alSeFunction::stopAllSe(getHost()->getAudioDirector(), 0);
251 al::stopAllBgm(getHost(), 0);
252 return true;
253}
254
255void StageSceneStatePauseMenu::startActionMario(const char* actionName) {
256 mSelectParts->startActionMario(marioActor: mMarioActor, actionName);
257}
258
259al::LiveActor* StageSceneStatePauseMenu::getMarioActor() const {
260 return mMarioActor;
261}
262
263bool StageSceneStatePauseMenu::isDrawLayout() const {
264 return !al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait) &&
265 !al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Appear);
266}
267
268bool StageSceneStatePauseMenu::isDrawLayoutMain() const {
269 return !al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.End) &&
270 !al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.WaitDraw);
271}
272
273bool StageSceneStatePauseMenu::isDrawViewRenderer() const {
274 if (mStateStartSeparatePlay->isDrawViewRenderer() ||
275 mStateEndSeparatePlay->isDrawViewRenderer() ||
276 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.WaitDraw) ||
277 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.End))
278 return true;
279
280 if (al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Appear))
281 return al::isDead(actor: mMarioActor);
282
283 return false;
284}
285
286bool StageSceneStatePauseMenu::isDrawChromakey() const {
287 if (al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Appear) ||
288 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait) ||
289 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.StartSeparatePlay) ||
290 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.EndSeparatePlay))
291 return true;
292
293 return !isDrawViewRenderer();
294}
295
296void StageSceneStatePauseMenu::exeAppear() {
297 if (al::isFirstStep(user: this))
298 startPauseCamera();
299
300 if (al::isStep(user: this, step: 1)) {
301 if (mStartType == StartType::Normal)
302 setNormal();
303 if (mStartType == StartType::AfterTitle) {
304 mMenuRight->appear();
305 mMenuGuide->appear();
306 al::startAction(layout: mMenuLayout, actionName: "SelectTitle", paneName: "Select");
307 }
308 }
309
310 if (al::isStep(user: this, step: 2))
311 appearMarioModel();
312
313 updatePlayerPose();
314 al::updateKitListPrev(scene: getHost());
315 if (al::isGreaterEqualStep(user: this, step: 2) || !mIsNormal) {
316 rs::requestGraphicsPresetAndCubeMapPause(getHost());
317 alGraphicsFunction::requestUpdateMaterialInfo(getHost());
318 }
319
320 al::updateKitList(scene: getHost(), name: "デモ");
321 al::updateKitList(scene: getHost(), name: "シャドウマスク");
322 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
323 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
324 al::updateKitListPost(scene: getHost());
325
326 if (al::isGreaterEqualStep(user: this, step: 3) && mMenuLayout->isWait())
327 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
328}
329
330void StageSceneStatePauseMenu::setNormal() {
331 mIsNormal = true;
332
333 if (mMenuLayout->isAlive())
334 mSelectParts->appearWait();
335 else {
336 mMenuLayout->appear();
337 mMenuRight->appear();
338 mMenuGuide->appear();
339 }
340
341 mSelectParts->appear(menuItemAmount: cMenuItemAmount);
342 mSelectParts->setSelectMessage(
343 index: MenuSelectParts::Selection::Continue,
344 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "Continue"));
345
346 if (rs::isSeparatePlay(getHost()))
347 mSelectParts->setSelectMessage(
348 index: MenuSelectParts::Selection::SeparatePlay,
349 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "EndSeparatePlay"));
350 else
351 mSelectParts->setSelectMessage(
352 index: MenuSelectParts::Selection::SeparatePlay,
353 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "StartSeparatePlay"));
354
355 al::startAction(layout: mMenuLayout, actionName: "SelectPause", paneName: "Select");
356}
357
358void StageSceneStatePauseMenu::appearMarioModel() {
359 if (!mIsShowMarioModel)
360 mPrevNearClipDistance = alCameraFunction::getNearClipDistance(user: getHost(), 0);
361
362 al::setNearClipDistance(user: getHost(), distance: 400.0f, updaterIdx: 0);
363 updatePlayerPose();
364 mMarioActor->appear();
365 mIsShowMarioModel = true;
366}
367
368void StageSceneStatePauseMenu::updatePlayerPose() {
369 sead::Vector3f worldPos = sead::Vector3f::zero;
370 al::calcWorldPosFromLayoutPos(output: &worldPos, getHost(), {310.0f, -960.0f}, 500.0f);
371 al::setTrans(actor: mMarioActor, trans: worldPos);
372
373 sead::Quatf quat = sead::Quatf::unit;
374 sead::Vector3f cameraFront = sead::Vector3f::zero;
375 al::calcCameraFront(&cameraFront, user: getHost(), viewIdx: 0);
376 al::makeQuatFrontUp(outQuat: &quat, front: -cameraFront, up: al::getCameraUp(user: getHost(), viewIdx: 0));
377 al::rotateQuatYDirDegree(&quat, quat, 360.0f);
378 al::updatePoseQuat(actor: mMarioActor, quat);
379}
380
381void StageSceneStatePauseMenu::exeWait() {
382 if (mIsNormal) {
383 if (rs::isSeparatePlay(getHost()))
384 mSelectParts->setSelectMessage(
385 index: MenuSelectParts::Selection::SeparatePlay,
386 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "EndSeparatePlay"));
387 else
388 mSelectParts->setSelectMessage(
389 index: MenuSelectParts::Selection::SeparatePlay,
390 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "StartSeparatePlay"));
391 }
392
393 al::updateKitListPrev(scene: getHost());
394 al::updateKitList(scene: getHost(), name: "カメラ");
395 rs::requestGraphicsPresetAndCubeMapPause(getHost());
396 mSelectParts->update();
397 updatePlayerPose();
398 al::updateKitList(scene: getHost(), name: "デモ");
399 al::updateKitList(scene: getHost(), name: "シャドウマスク");
400 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
401 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
402
403 if (mSelectParts->isDecideSave()) {
404 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Save);
405 }
406
407 else if (mSelectParts->isDecideContinue()) {
408 killMarioModel();
409 al::endCameraPause(pauseCameraCtrl: mPauseCameraCtrl);
410 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.WaitDraw);
411 }
412
413 else if (mSelectParts->isDecideSeparatePlay()) {
414 if (rs::isSeparatePlay(getHost()) && !mIsNormal) {
415 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.WaitDraw);
416 return;
417 }
418 if (rs::isSeparatePlay(getHost()))
419 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.EndSeparatePlay);
420 else
421 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.StartSeparatePlay);
422
423 }
424
425 else if (mSelectParts->isDecideNewGame()) {
426 if (mGameDataHolderAccessor->tryFindEmptyFileId() < 0)
427 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.NotExistEmptyFile);
428 else
429 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.ConfirmNewGame);
430 }
431
432 else if (mSelectParts->isDecideHelp()) {
433 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.FadeBeforeHelp);
434 }
435
436 else if (!isEndToCancel()) {
437 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Option);
438 }
439
440 else
441 al::updateKitListPost(scene: getHost());
442}
443
444void StageSceneStatePauseMenu::changeNerveAndReturn(const al::Nerve* nerve) {
445 al::setNerve(user: this, nerve);
446}
447
448void StageSceneStatePauseMenu::exeFadeBeforeHelp() {
449 if (al::isFirstStep(user: this))
450 mHelpWipe->startClose();
451
452 al::updateKitListPrev(scene: getHost());
453 al::updateKitList(scene: getHost(), name: "カメラ");
454 rs::requestGraphicsPresetAndCubeMapPause(getHost());
455 al::updateKitList(scene: getHost(), name: "シャドウマスク");
456 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
457 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
458 al::updateKitListPost(scene: getHost());
459
460 if (mHelpWipe->isCloseEnd())
461 al::setNerve(user: this, nerve: &StartHelp);
462}
463
464void StageSceneStatePauseMenu::exeStartHelp() {
465 al::updateKitListPrev(scene: getHost());
466 al::updateKitList(scene: getHost(), name: "カメラ");
467 rs::requestGraphicsPresetAndCubeMapPause(getHost());
468 al::updateKitList(scene: getHost(), name: "シャドウマスク");
469 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
470 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
471 al::updateKitListPost(scene: getHost());
472
473 if (al::isFirstStep(user: this)) {
474 bool isStartHelpFromOption =
475 al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.StartHelpFromOption);
476 bool isSceneStatusInvalidSave = rs::isSceneStatusInvalidSave(accessor: getHost());
477
478 al::StringTmp<256> helpUrl;
479 HelpFunction::callHelp(mHtmlViewer, mGameDataHolderAccessor, isStartHelpFromOption,
480 isSceneStatusInvalidSave, false, &helpUrl);
481
482 if (al::isEqualString(str1: "http://localhost/ChangeMode", str2: helpUrl.cstr())) {
483 mStateOption->set_51(true);
484 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.OptionFromHelp);
485 return;
486 }
487 mHelpWipe->startOpen();
488 }
489
490 if (mHelpWipe->isOpenEnd()) {
491 mSelectParts->appearWait();
492 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
493 }
494}
495
496void StageSceneStatePauseMenu::exeWaitDraw() {
497 al::updateKitListPrev(scene: getHost());
498 al::updateKitList(scene: getHost(), name: "カメラ");
499 al::updateKitList(scene: getHost(), name: "シャドウマスク");
500 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
501 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
502 al::updateKitListPost(scene: getHost());
503 if (al::isFirstStep(user: this))
504 alGraphicsFunction::requestUpdateMaterialInfo(getHost());
505 if (al::isGreaterEqualStep(user: this, step: 2))
506 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.End);
507}
508
509void StageSceneStatePauseMenu::exeEnd() {
510 al::updateKitListPrev(scene: getHost());
511 al::updateKitList(scene: getHost(), name: "カメラ");
512 al::updateKitList(scene: getHost(), name: "シャドウマスク");
513 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
514 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
515 al::updateKitListPost(scene: getHost());
516 if (al::isFirstStep(user: this)) {
517 mMenuLayout->end();
518 mMenuRight->end();
519 mMenuGuide->end();
520 }
521 if (al::isDead(mMenuLayout))
522 kill();
523}
524
525void StageSceneStatePauseMenu::exeStartSeparatePlay() {
526 if (al::isFirstStep(user: this)) {
527 mFooterParts->tryChangeTextFade(
528 text: al::getSystemMessageString(mFooterParts, "Footer", "MenuMessage_Footer_SeparatePlay"));
529 }
530 al::updateKitListPrev(scene: getHost());
531 al::updateKitList(scene: getHost(), name: "カメラ");
532 if (mStateStartSeparatePlay->isNeedRequestGraphicsPreset())
533 rs::requestGraphicsPresetAndCubeMapPause(getHost());
534 al::updateKitList(scene: getHost(), name: "シャドウマスク");
535 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
536 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
537 al::updateKitListPost(scene: getHost());
538
539 if (al::updateNerveState(user: this)) {
540 if (mStageSceneLayout)
541 mStageSceneLayout->setDirtyFlagForPlayGuideMenu();
542 if (mStateStartSeparatePlay->isCancel() && !rs::isModeE3LiveRom()) {
543 mSelectParts->appearWait();
544 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
545 return;
546 }
547 kill();
548 }
549}
550
551void StageSceneStatePauseMenu::exeEndSeparatePlay() {
552 al::updateKitListPrev(scene: getHost());
553 al::updateKitList(scene: getHost(), name: "カメラ");
554 if (mStateEndSeparatePlay->isNeedRequestGraphicsPreset())
555 rs::requestGraphicsPresetAndCubeMapPause(getHost());
556 al::updateKitList(scene: getHost(), name: "シャドウマスク");
557 al::updateKitList(scene: getHost(), name: "グラフィックス要求者");
558 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
559 al::updateKitListPost(scene: getHost());
560
561 if (al::updateNerveState(user: this)) {
562 if (mStageSceneLayout)
563 mStageSceneLayout->setDirtyFlagForPlayGuideMenu();
564
565 if (mStateEndSeparatePlay->isCancel() && !rs::isModeE3LiveRom()) {
566 mSelectParts->appearWait();
567 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
568 return;
569 }
570 kill();
571 }
572}
573
574void StageSceneStatePauseMenu::exeOption() {
575 al::updateKitListPrev(scene: getHost());
576 rs::requestGraphicsPresetAndCubeMapPause(getHost());
577 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
578 al::updateKitListPost(scene: getHost());
579
580 if (al::updateNerveState(user: this)) {
581 if (isChangeLanguage() || isLoadData()) {
582 kill();
583 return;
584 }
585
586 mSelectParts->appearWait();
587 mFooterParts->tryChangeTextFade(
588 text: al::getSystemMessageString(mMenuGuide, "Footer", "MenuMessage_Footer"));
589
590 if (al::isNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.OptionFromHelp))
591 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.StartHelpFromOption);
592 else
593 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
594 }
595}
596
597void StageSceneStatePauseMenu::exeSave() {
598 al::updateKitListPrev(scene: getHost());
599 rs::requestGraphicsPresetAndCubeMapPause(getHost());
600 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
601 al::updateKitListPost(scene: getHost());
602
603 if (al::isFirstStep(user: this))
604 SaveDataAccessFunction::startSaveDataWriteWithWindow(mGameDataHolderAccessor);
605
606 if (SaveDataAccessFunction::updateSaveDataAccess(mGameDataHolderAccessor, false)) {
607 mSelectParts->appearWait();
608 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
609 }
610}
611
612void StageSceneStatePauseMenu::exeConfirmNewGame() {
613 if (al::isFirstStep(user: this)) {
614 mWindowConfirm->setListNum(2);
615
616 mWindowConfirm->setTxtMessage(
617 al::getSystemMessageString(mWindowConfirm, "ConfirmMessage", "NewGame"));
618 mWindowConfirm->setTxtList(
619 0, al::getSystemMessageString(mWindowConfirm, "ConfirmMessage", "NewGame_Yes"));
620 mWindowConfirm->setTxtList(
621 1, al::getSystemMessageString(mWindowConfirm, "ConfirmMessage", "NewGame_No"));
622
623 mWindowConfirm->appear();
624 mKeyRepeatCtrl->reset();
625 }
626
627 al::updateKitListPrev(scene: getHost());
628 rs::requestGraphicsPresetAndCubeMapPause(getHost());
629 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
630 al::updateKitListPost(scene: getHost());
631
632 mKeyRepeatCtrl->update(up: rs::isHoldUiUp(getHost()), down: rs::isHoldUiDown(getHost()));
633
634 if (mKeyRepeatCtrl->isUp())
635 mWindowConfirm->tryUp();
636
637 if (mKeyRepeatCtrl->isDown())
638 mWindowConfirm->tryDown();
639
640 al::WindowConfirm::SelectionType selectionType = mWindowConfirm->getPrevSelectionType();
641
642 if (rs::isTriggerUiDecide(getHost())) {
643 if (selectionType == al::WindowConfirm::SelectionType::HardKey)
644 mWindowConfirm->tryDecideWithoutEnd();
645 if (selectionType == al::WindowConfirm::SelectionType::List00)
646 mWindowConfirm->tryCancel();
647 }
648
649 if (rs::isTriggerUiCancel(getHost()))
650 mWindowConfirm->tryCancel();
651
652 if (selectionType == al::WindowConfirm::SelectionType::HardKey &&
653 mWindowConfirm->isNerveEnd()) {
654 mWindowConfirm->tryDecide();
655 s32 emptyFileId = mGameDataHolderAccessor->tryFindEmptyFileId();
656 mGameDataHolderAccessor->requestSetPlayingFileId(fileId: emptyFileId);
657 mGameDataHolderAccessor->setRequireSave();
658 mIsNewGame = true;
659 }
660
661 if (selectionType == al::WindowConfirm::SelectionType::List00) {
662 if (al::isDead(mWindowConfirm)) {
663 mSelectParts->appearWait();
664 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
665 }
666 }
667}
668
669void StageSceneStatePauseMenu::exeNotExistEmptyFile() {
670 if (al::isFirstStep(user: this)) {
671 mWindowConfirm->setListNum(1);
672 mWindowConfirm->setTxtMessage(
673 al::getSystemMessageString(mWindowConfirm, "ConfirmMessage", "NotExistEmptyFile"));
674 mWindowConfirm->appear();
675 }
676
677 al::updateKitListPrev(scene: getHost());
678 rs::requestGraphicsPresetAndCubeMapPause(getHost());
679 al::updateKitList(scene: getHost(), name: "2D(ポーズ無視)");
680 al::updateKitListPost(scene: getHost());
681
682 if (rs::isTriggerUiDecide(getHost()) || rs::isTriggerUiCancel(getHost()))
683 mWindowConfirm->tryDecide();
684
685 if (al::isDead(mWindowConfirm)) {
686 mSelectParts->appearWait();
687 al::setNerve(user: this, nerve: &NrvStageSceneStatePauseMenu.Wait);
688 }
689}
690
691void StageSceneStatePauseMenu::startPauseCamera() {
692 al::startCameraPause(pauseCameraCtrl: mPauseCameraCtrl);
693}
694
695void StageSceneStatePauseMenu::setAfterTitle() {
696 mIsNormal = false;
697
698 mSelectParts->appear(menuItemAmount: cMenuItemAmount);
699 mSelectParts->setMainMenu(true);
700
701 mSelectParts->setSelectMessage(
702 index: MenuSelectParts::Selection::Continue,
703 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "StartGame"));
704 mSelectParts->setSelectMessage(
705 index: MenuSelectParts::Selection::SeparatePlay,
706 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "StartGameSeparatePlay"));
707 mSelectParts->setSelectMessage(
708 index: MenuSelectParts::Selection::NewGame,
709 message: al::getSystemMessageString(mMenuLayout, "MenuMessage", "NewGame"));
710}
711