NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_wipe_circle.cpp
1#include <game/bases/d_wipe_circle.hpp>
2#include <game/bases/d_a_player_manager.hpp>
3#include <game/bases/d_a_player_demo_manager.hpp>
4#include <game/bases/d_fukidashi_manager.hpp>
5#include <game/bases/d_game_com.hpp>
6#include <game/bases/d_s_stage.hpp>
7
9
11mFaderBase_c(mColor(color), status) {
12 m_instance = this;
13 mIsCreated = false;
14}
15
19
21 static const char *AnmNameTbl[ANIM_NAME_COUNT] = {
22 "wipeCircle_00_inWindow.brlan",
23 "wipeCircle_00_outWindow.brlan"
24 };
25
26 static const char *GROUP_NAME_DT[ANIM_COUNT] = {
27 "A00_inWindow",
28 "B00_outWindow"
29 };
30 static const int ANIME_INDEX_TBL[ANIM_COUNT] = {
31 inWindow,
32 outWindow
33 };
34
35 static const char *WPANE_NAME_DT[W_COUNT] = {
36 "W_circle_00"
37 };
38
39 if (mIsCreated) {
40 return true;
41 }
42
43 if (!mLyt.ReadResource("wipeCircle/wipeCircle.arc", false)) {
44 return false;
45 }
46
47 mLyt.build("wipeCircle_00.brlyt", nullptr);
48 mLyt.AnimeResRegister(AnmNameTbl, ANIM_NAME_COUNT);
49 mLyt.GroupRegister(GROUP_NAME_DT, ANIME_INDEX_TBL, ANIM_COUNT);
50 mpRootPane = mLyt.getRootPane();
51 mLyt.WPaneRegister(WPANE_NAME_DT, mpWnd, W_COUNT);
52
53 mCenterPos.x = 0.0f;
54 mCenterPos.y = 0.0f;
55 mIsCreated = true;
56 mHasTarget = false;
57 mUseCenterPos = false;
58
59 mLyt.AllAnimeEndSetup();
60
61 mpRootPane->SetVisible(false);
62 mLyt.mDrawOrder = 154;
63 mAction = IDLE;
64
65 return true;
66}
67
68typedef void (dWipeCircle_c::*actMeth)();
69
71 static const actMeth Proc_tbl[ACTION_COUNT] = {
75 };
76
77 if (!mIsCreated) {
78 return 1;
79 }
80
81 if (mAction != IDLE) {
82 (this->*Proc_tbl[mAction])();
83 mLyt.AnimePlay();
84 mLyt.calc();
85 }
86 return 1;
87}
88
90 if (mIsCreated) {
91 mLyt.entry();
92 }
93}
94
95// [Fakematch]
96#pragma push
97#pragma ppc_iro_level 2
98
100 mVec2_c centerPos(0.0f, 0.0f);
101 mpRootPane->SetTranslate(mVec3_c(0.0f, 0.0f, 0.0f));
102 if (!mHasTarget) {
103 return;
104 }
105
106 mHasTarget = false;
107 if (mUseCenterPos) {
108 mUseCenterPos = false;
109 centerPos.x = mCenterPos.x;
110 centerPos.y = mCenterPos.y;
111 } else {
112 int targetPlayerNo = daPyDemoMng_c::mspInstance->mPlNo;
113 if (dScStage_c::m_KoopaJrEscape) {
114 targetPlayerNo = 0;
115 }
116 if (targetPlayerNo < 0) {
117 return;
118 }
119
120 dAcPy_c *targetPlayer = daPyMng_c::getPlayer(targetPlayerNo);
121 if (targetPlayer == nullptr) {
122 return;
123 }
124
125 static float PLAYER_OFFSET_Y_DATA_TBL[PLAYER_COUNT][POWERUP_COUNT] = {
126 {
127 dfukidashiInfo_c::c_MARIO_NORMAL_OFFSET_Y,
128 dfukidashiInfo_c::c_MARIO_SUPER_OFFSET_Y,
129 dfukidashiInfo_c::c_MARIO_FIRE_OFFSET_Y,
130 dfukidashiInfo_c::c_MARIO_MAME_OFFSET_Y,
131 dfukidashiInfo_c::c_MARIO_PROPEL_OFFSET_Y,
132 dfukidashiInfo_c::c_MARIO_PENGUIN_OFFSET_Y,
133 dfukidashiInfo_c::c_MARIO_ICE_OFFSET_Y
134 },
135 {
136 dfukidashiInfo_c::c_LUIGI_NORMAL_OFFSET_Y,
137 dfukidashiInfo_c::c_LUIGI_SUPER_OFFSET_Y,
138 dfukidashiInfo_c::c_LUIGI_FIRE_OFFSET_Y,
139 dfukidashiInfo_c::c_LUIGI_MAME_OFFSET_Y,
140 dfukidashiInfo_c::c_LUIGI_PROPEL_OFFSET_Y,
141 dfukidashiInfo_c::c_LUIGI_PENGUIN_OFFSET_Y,
142 dfukidashiInfo_c::c_LUIGI_ICE_OFFSET_Y
143 },
144 {
145 dfukidashiInfo_c::c_KINOPIO_NORMAL_OFFSET_Y,
146 dfukidashiInfo_c::c_KINOPIO_SUPER_OFFSET_Y,
147 dfukidashiInfo_c::c_KINOPIO_FIRE_OFFSET_Y,
148 dfukidashiInfo_c::c_KINOPIO_MAME_OFFSET_Y,
149 dfukidashiInfo_c::c_KINOPIO_PROPEL_OFFSET_Y,
150 dfukidashiInfo_c::c_KINOPIO_PENGUIN_OFFSET_Y,
151 dfukidashiInfo_c::c_KINOPIO_ICE_OFFSET_Y
152 },
153 {
154 dfukidashiInfo_c::c_KINOPIO_NORMAL_OFFSET_Y,
155 dfukidashiInfo_c::c_KINOPIO_SUPER_OFFSET_Y,
156 dfukidashiInfo_c::c_KINOPIO_FIRE_OFFSET_Y,
157 dfukidashiInfo_c::c_KINOPIO_MAME_OFFSET_Y,
158 dfukidashiInfo_c::c_KINOPIO_PROPEL_OFFSET_Y,
159 dfukidashiInfo_c::c_KINOPIO_PENGUIN_OFFSET_Y,
160 dfukidashiInfo_c::c_KINOPIO_ICE_OFFSET_Y
161 }
162 };
163 int targetPlayerType = daPyMng_c::getPlayerType(targetPlayerNo);
164 int targetPlayerMode = daPyMng_c::getPlayerMode(targetPlayerType);
165
166 mVec3_c targetPos;
167 targetPos.x = targetPlayer->mPos.x;
168 float offs = PLAYER_OFFSET_Y_DATA_TBL[targetPlayerType][targetPlayerMode];
169 targetPos.y = targetPlayer->mPos.y + offs * 0.5f;
170 targetPos.z = targetPlayer->mPos.z;
171 dGameCom::getGlbPosToLyt(targetPos);
172 centerPos.x = targetPos.x;
173 centerPos.y = targetPos.y;
174 }
175
176 mpRootPane->SetTranslate(mVec3_c(centerPos, 0.0f));
177}
178
179#pragma pop
180
182 mLyt.AllAnimeEndSetup();
183 mLyt.AnimeStartSetup(outWindow, false);
185 CenterPosSet();
186}
187
189 if (!mLyt.isAnime(-1)) {
190 if (getStatus() == FADE_IN) {
191 mStatus = HIDDEN;
192 mFlag |= FADE_IN_COMPLETE;
193 mpRootPane->SetVisible(false);
194 } else {
195 mStatus = OPAQUE;
196 mFlag |= FADE_OUT_COMPLETE;
197 }
198 mCenterPos.x = 0.0f;
199 mCenterPos.y = 0.0f;
200 mAction = IDLE;
201 }
202}
203
205 mLyt.AllAnimeEndSetup();
206 mLyt.AnimeStartSetup(inWindow, false);
208 CenterPosSet();
209}
210
212 if (status == OPAQUE) {
213 mStatus = OPAQUE;
214 mpWnd[W_circle_00]->SetAlpha(255);
215 mLyt.ReverseAnimeStartSetup(outWindow, false);
216 mpRootPane->SetVisible(true);
217 mLyt.AnimePlay();
218 mLyt.calc();
219 } else if (status == HIDDEN) {
220 mStatus = HIDDEN;
221 mpWnd[W_circle_00]->SetAlpha(0);
222 mLyt.ReverseAnimeStartSetup(inWindow, false);
223 mpRootPane->SetVisible(true);
224 mLyt.AnimePlay();
225 mLyt.calc();
226 }
227}
228
230 bool res = mFaderBase_c::fadeIn();
231 if (res) {
233 }
234 return res;
235}
236
238 bool res = mFaderBase_c::fadeOut();
239 if (res) {
241 }
242 return res;
243}
mVec3_c mPos
The actor's position.
A fader that animates a circle in/out.
bool mHasTarget
Whether the circle's center point needs to be targeted at a specific position.
LytBase_c mLyt
The layout for the fader.
virtual bool fadeOut()
Initiates a fade out from no-obstruction.
void AnimeEndCheck()
Checks if the fade animation has finished yet.
bool createLayout()
Loads the resources and creates the layout for the fader.
static dWipeCircle_c * m_instance
The instance of the fader.
~dWipeCircle_c()
Destroys the fader.
bool mIsCreated
Whether the layout for the fader has been created.
@ CLOSE_SETUP
Prepare the fade-in transition.
@ OPEN_SETUP
Prepare the fade-out transition.
@ ANIME_END_CHECK
Fade has begun, waiting for it to end.
@ IDLE
The fade has not been started.
nw4r::lyt::Pane * mpRootPane
The root pane of the fader layout.
void CloseSetup()
Prepares the fade-in transition.
dWipeCircle_c(nw4r::ut::Color, mFaderBase_c::EStatus status)
Constructs a new fader.
virtual void setStatus(mFaderBase_c::EStatus status)
Sets the fader's status.
virtual void draw()
Draws the fader.
mVec2_c mCenterPos
The screen position of the circle's center point.
void OpenSetup()
Prepares the fade-out transition.
nw4r::lyt::Window * mpWnd[W_COUNT]
The window panes of the fader.
void CenterPosSet()
Sets the circle's center position.
ACTION_e mAction
The action to be performed in calc.
virtual int calc()
Calculates the fader at the current frame.
bool mUseCenterPos
Whether mCenterPos should be used as the circle's center point.
virtual bool fadeIn()
Initiates a fade in from pure blacked-out.
EStatus mStatus
The fader's status.
virtual EStatus getStatus() const
Gets the fader's status.
u8 mFlag
The fader's flags.
virtual bool fadeIn()
Initiates a fade in from pure blacked-out.
mFaderBase_c(const mColor &color, EStatus status)
Constructs a new fader.
EStatus
The fader's status.
@ FADE_IN
Transition from OPAQUE to HIDDEN.
@ HIDDEN
The screen is completely unblocked.
@ OPAQUE
The screen is completely blacked out.
virtual bool fadeOut()
Initiates a fade out from no-obstruction.
A two-dimensional floating point vector.
Definition m_vec.hpp:9
A three-dimensional floating point vector.
Definition m_vec.hpp:100
A 32-bit RGBA color.
Definition m_color.hpp:6