NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_next.cpp
1#include <game/bases/d_next.hpp>
2#include <game/bases/d_actor.hpp>
3#include <game/bases/d_a_player_manager.hpp>
5#include <game/bases/d_cd.hpp>
6#include <game/bases/d_s_stage.hpp>
7#include <game/bases/d_s_world_map_static.hpp>
8#include <game/bases/d_snd_scene_mgr.hpp>
9#include <game/mLib/m_heap.hpp>
10
12
16
17void dNext_c::createInstance(EGG::Heap *heap) {
18 EGG::Heap *prevHeap = mHeap::setCurrentHeap(heap);
19 new dNext_c();
20 mHeap::setCurrentHeap(prevHeap);
21}
22
24 if (m_instance == nullptr) {
25 return;
26 }
27 dNext_c *instance = m_instance;
28 m_instance = nullptr;
29 delete instance;
30}
31
38
39void dNext_c::setChangeSceneNextDat(u8 fileIdx, u8 nextGoto, dFader_c::fader_type_e faderType) {
40 if (!mNextDataSet) {
41 setOwnNextData(fileIdx, nextGoto);
42 mNextDataSet = true;
43 mSceneChangeDone = false;
44 mFaderType = faderType;
45 }
46}
47
48void dNext_c::setOwnNextData(u8 fileIdx, u8 nextGoto) {
49 dCdFile_c *file = dCd_c::m_instance->getFileP(fileIdx);
50 mNextGotoData = *file->getNextGotoP(nextGoto);
51
52 u8 destFile = mNextGotoData.mDestFile - 1;
53 if (destFile == 255) {
54 destFile = fileIdx;
55 }
56 mNextGotoData.mDestFile = destFile;
57
58 if (mNextGotoData.mDestID == 255) {
59 mNextGotoData.mDestID = dCd_c::m_instance->getFileP(fileIdx)->mpOptions->mInitialNextGotoID;
60 }
61}
62
63bool dNext_c::isNextDifferent(u8 fileIdx, u8 nextGoto) {
64 if (mNextDataSet) {
65 dCdFile_c *file = dCd_c::m_instance->getFileP(fileIdx);
66 sNextGotoData *data = file->getNextGotoP(nextGoto);
67 if (data->mID != mNextGotoData.mID) {
68 return true;
69 }
70
71 u8 destFile = data->mDestFile - 1;
72 if (destFile == 255) {
73 destFile = fileIdx;
74 }
75 if (destFile != mNextGotoData.mDestFile) {
76 return true;
77 }
78 }
79 return false;
80}
81
82bool dNext_c::searchNextNum(u8 fileIdx, float x, float y, int *foundNum) {
83 dCdFile_c *file = dCd_c::m_instance->getFileP(fileIdx);
84
85 mVec2_c pos(x, -y);
86 sNextGotoData *curr = file->mpNextGotos;
87 for (int i = 0; i < file->mNextGotoCount; i++) {
88 if (!(curr->mFlags & NEXT_GOTO_FLAG_ONLY_EXIT)) {
89 mVec2_c nextGotoSize;
90 switch (curr->mType) {
91 case NEXT_GOTO_TYPE_14:
92 case NEXT_GOTO_TYPE_MINI_PIPE_U:
93 case NEXT_GOTO_TYPE_MINI_PIPE_D:
94 case NEXT_GOTO_TYPE_MINI_PIPE_L:
95 case NEXT_GOTO_TYPE_MINI_PIPE_R:
96 nextGotoSize.set(16.0f, 16.0f);
97 break;
98 case NEXT_GOTO_TYPE_15:
99 nextGotoSize.set(48.0f, 16.0f);
100 break;
101 case NEXT_GOTO_TYPE_PIPE_L:
102 case NEXT_GOTO_TYPE_PIPE_R:
103 nextGotoSize.set(16.0f, 32.0f);
104 break;
105 case NEXT_GOTO_TYPE_WATER_TANK:
106 nextGotoSize.set(32.0f, 32.0f);
107 break;
108 default:
109 nextGotoSize.set(32.0f, 16.0f);
110 break;
111 }
112
113 float gdX = curr->mX;
114 float gdY = curr->mY;
115 if (
116 gdX <= pos.x && pos.x < gdX + nextGotoSize.x &&
117 gdY <= pos.y && pos.y < gdY + nextGotoSize.y
118 ) {
119 s8 id = curr->mID;
120 *foundNum = id;
121 return true;
122 }
123 }
124 curr++;
125 }
126 return false;
127}
128
129void dNext_c::simpleChangeScene(u8 destNextGoto, dFader_c::fader_type_e faderType) {
130 simpleChangeScene(dScStage_c::m_instance->mCurrFile, destNextGoto, faderType);
131}
132
133void dNext_c::simpleChangeScene(u8 destFile, u8 destNextGoto, dFader_c::fader_type_e faderType) {
134 if (mNextDataSet) {
135 return;
136 }
137
138 dCdFile_c *file = dCd_c::m_instance->getFileP(destFile);
139 mNextGotoData = *file->getNextGotoP(destNextGoto);
140
141 mNextGotoData.mDestFile = destFile;
142 mNextGotoData.mDestID = destNextGoto;
143 mNextDataSet = true;
144 mSceneChangeDone = false;
145 mStartSceneChange = true;
147 mFaderType = faderType;
148}
149
154
155 dScStage_c *stage = dScStage_c::m_instance;
156 u8 world = stage->getCurrWorld();
157
158 if (dScStage_c::m_gameMode == dInfo_c::GAME_MODE_HINT_MOVIE) {
159 dFader_c::setFader(dFader_c::CIRCLE_MIDDLE);
160 } else {
161 dFader_c::setFader(mFaderType);
162 }
163
164 if (mNextGotoData.mIsLevelExit) {
165 dScStage_c::m_exitMode = dScStage_c::EXIT_0;
166 dScWMap_c::setNextWorldScene(world, dScWMap_c::m_SceneNo, 0);
167 return;
168 }
169
170 dCdFile_c *file = dCd_c::m_instance->getFileP(mNextGotoData.mDestFile);
171 sNextGotoData *data = file->getNextGotoP(mNextGotoData.mDestID);
172 if (stage->mCurrFile != mNextGotoData.mDestFile) {
174 } else if (data->mArea != stage->mCurrArea) {
176 } else {
178 }
179
180 u8 bgm = file->getAreaBgm(data->mArea);
181 dAudio::setMainBgmNo(bgm);
182 u8 mode = file->getAreaBgmMode(data->mArea);
183 dAudio::setBgmMode(mode & 0x0F);
184 SndSceneMgr::sInstance->FUN_8019d5b0(mode >> 4);
185
186 u32 param = ACTOR_PARAM_GEN(dScStage_c, File, mNextGotoData.mDestFile);
187 param |= ACTOR_PARAM_GEN(dScStage_c, NextGotoID, mNextGotoData.mDestID);
188
189 mSceneChangeDone = true;
190 dScStage_c::m_exitMode = dScStage_c::EXIT_3;
191 dScene_c::setNextScene(fProfile::STAGE, param, false);
192}
193
196 return;
197 }
198
199 if (daPyMng_c::mNum > 1 && mMultiplayerDelay > 0) {
201 return;
202 }
203
204 changeScene();
205}
static u8 mExecStopReq
The actors for which the execute operation is requested to be disabled.
Definition d_actor.hpp:395
@ STAGE_ACTOR_GENERIC
A generic stage actor (default).
Definition d_actor.hpp:46
@ STAGE_ACTOR_ENEMY
An enemy actor.
Definition d_actor.hpp:49
@ STAGE_ACTOR_YOSHI
The Yoshi actor.
Definition d_actor.hpp:48
@ STAGE_ACTOR_PLAYER
The player actor.
Definition d_actor.hpp:47
Course data file holder. A course data file contains the actual course elements - areas,...
Definition d_cd.hpp:11
Manager for scene changes triggered by entrances.
Definition d_next.hpp:8
bool isNextDifferent(u8 fileIdx, u8 nextGoto)
Returns whether the currently saved entrance is different from the given one.
Definition d_next.cpp:63
void changeScene()
Go to the next scene using the data in mNextGotoData.
Definition d_next.cpp:150
static dNext_c * m_instance
The singleton instance of this class.
Definition d_next.hpp:74
bool mStartSceneChange
Whether a scene change should be performed next time execute() is called.
Definition d_next.hpp:69
void simpleChangeScene(u8 destNextGoto, dFader_c::fader_type_e faderType)
Move to a new entrance in the same file.
Definition d_next.cpp:129
@ NEXT_DIFFERENT_FILE
The next entrance is in a different file.
Definition d_next.hpp:13
@ NEXT_DIFFERENT_AREA
The next entrance is in a different area of the same file.
Definition d_next.hpp:14
@ NEXT_SAME_AREA
The next entrance is in the same area.
Definition d_next.hpp:15
void setOwnNextData(u8 fileIdx, u8 nextGoto)
Sets the entrance data for the next scene change.
Definition d_next.cpp:48
static void deleteInstance()
Deletes the class instance.
Definition d_next.cpp:23
SceneChangeType_e mSceneChangeType
The type of scene change to do when going to the next entrance.
Definition d_next.hpp:67
bool searchNextNum(u8 fileIdx, float x, float y, int *foundNum)
Search for a next entrance at the given coordinates in the given file.
Definition d_next.cpp:82
sNextGotoData mNextGotoData
The data for the entrance the player activated.
Definition d_next.hpp:66
void setChangeSceneNextDat(u8 fileIdx, u8 nextGoto, dFader_c::fader_type_e faderType)
Updates the saved entrance data for the next scene change if not already set.
Definition d_next.cpp:39
void execute()
Checks for scene changes and executes them when necessary.
Definition d_next.cpp:194
u16 mMultiplayerDelay
Number of frames to delay the scene change in multiplayer mode.
Definition d_next.hpp:71
bool mNextDataSet
Whether the entrance data for the next scene change has been set.
Definition d_next.hpp:68
bool mSceneChangeDone
Whether the scene change has been performed.
Definition d_next.hpp:70
dFader_c::fader_type_e mFaderType
The type of fader to use for the scene change.
Definition d_next.hpp:72
static const int smc_MULTIPLAYER_SCENE_CHANGE_DELAY
The number of frames to delay scene changes in multiplayer mode.
Definition d_next.hpp:77
void initialize()
Resets the class to its initial state.
Definition d_next.cpp:32
static void createInstance(EGG::Heap *heap)
Creates a class instance on the given heap.
Definition d_next.cpp:17
dNext_c()
Constructs a new dNext_c.
Definition d_next.cpp:13
static bool m_isCourseOut
Whether the game is transitioning from a stage scene to a non-stage scene.
Definition d_s_stage.hpp:50
static void setNextScene(ProfileName nextScene, unsigned long param, bool forceChange)
Attempts to prepare the transition to a new scene.
Definition d_scene.cpp:162
A two-dimensional floating point vector.
Definition m_vec.hpp:16
EGG::Heap * setCurrentHeap(EGG::Heap *heap)
Sets the specified heap as the current heap.
Definition m_heap.cpp:37
u8 mType
See NextGotoType_e.
u16 mFlags
See NextGotoFlags_e.
u8 mDestFile
0 = same file, others are 1-indexed.