SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CoinCounter.cpp
1#include "Game/Screen/CoinCounter.hpp"
2#include "Game/Screen/CounterLayoutController.hpp"
3#include "Game/Util.hpp"
4
5CoinCounter::CoinCounter(const char *pName) : LayoutActor(pName, true) {
6 mCoinCount = 0;
7 _24 = 0;
8 _28 = 0;
9 mLayoutAppearer = nullptr;
10 mPaneRumbler = nullptr;
11 mIsAppear = false;
12 mFollowPos.x = 0.0f;
13 mFollowPos.y = 0.0f;
14}
15
16void CoinCounter::init(const JMapInfoIter &rIter) {
17 initLayoutManager("CoinCounter", 2);
18 MR::createAndAddPaneCtrl(this, "Counter", 1);
19 MR::createAndAddPaneCtrl(this, "CoinCounter", 1);
20 MR::setFollowPos(&mFollowPos, this, "CoinCounter");
21 initEffectKeeper(0, nullptr, nullptr);
22 mLayoutAppearer = new CounterLayoutAppearer(this, TVec2f(50.0f, 0.0f));
23 mPaneRumbler = new CountUpPaneRumbler(this, "Counter");
24 initNerve(&NrvCoinCounter::CoinCounterNrvHide::sInstance);
25 MR::connectToSceneLayout(this);
26 appear();
27}
28
29void CoinCounter::appear() {
30 mLayoutAppearer->reset();
31 mPaneRumbler->reset();
32 _28 = 0;
33 mIsAppear = false;
34 MR::hideLayout(this);
35 setNerve(&NrvCoinCounter::CoinCounterNrvHide::sInstance);
36 LayoutActor::appear();
37}
38
39void CoinCounter::forceAppear() {
40 if (!isNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance)) {
41 appear();
42 setNerve(&NrvCoinCounter::CoinCounterNrvAppear::sInstance);
43 }
44
45 mIsAppear = true;
46}
47
48void CoinCounter::disappear() {
49 mIsAppear = false;
50 setNerve(&NrvCoinCounter::CoinCounterNrvDisappear::sInstance);
51}
52
53bool CoinCounter::isWait() const {
54 return isNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance);
55}
56
57void CoinCounter::control() {
58 updateCounter();
59 mLayoutAppearer->update();
60 mPaneRumbler->update();
61}
62
63void CoinCounter::updateCounter() {
64 s32 coinNum = MR::getCoinNum();
65 s32 var = _28;
66 mCoinCount = coinNum;
67
68 if (var > 0) {
69 _28 = var - 1;
70 }
71 else {
72 if (_24 < coinNum) {
73 if (isNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance)) {
74 u32 v4 = _24;
75 _28 = 3;
76 _24 = v4 + 1;
77 MR::startAnim(this, "Flash", 0);
78 MR::emitEffect(this, "CoinCounterLight");
79 mPaneRumbler->start();
80 }
81
82 if (!isNerve(&NrvCoinCounter::CoinCounterNrvAppear::sInstance)) {
83 if (!isNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance)) {
84 setNerve(&NrvCoinCounter::CoinCounterNrvAppear::sInstance);
85 }
86 else {
87 setNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance);
88 }
89 }
90 }
91 }
92
93 char* pane = "Position001";
94 if (_24 >= 100) {
95 pane = "Position100";
96 }
97 else {
98 if (_24 >= 10) {
99 pane = "Position010";
100 }
101 }
102
103 MR::copyPaneTrans(&mFollowPos, this, pane);
104 MR::setTextBoxNumberRecursive(this, "Counter", _24);
105}
106
107void CoinCounter::exeHide() {
108 if (MR::isFirstStep(this)) {
109 _28 = 0;
110 MR::hideLayout(this);
111 }
112}
113
114void CoinCounter::exeAppear() {
115 if (MR::isFirstStep(this)) {
116 MR::showLayout(this);
117 if (MR::isStageAstroLocation()) {
118 TVec2f vec;
119 vec.x = 0.0f;
120 vec.y = 40.0f;
121 mLayoutAppearer->appear(vec);
122 }
123 else {
124 TVec2f vec;
125 vec.x = 0.0f;
126 vec.y = 0.0f;
127 mLayoutAppearer->appear(vec);
128 }
129
130 MR::startAnim(this, "Wait", 1);
131 }
132
133 if (mLayoutAppearer->isAppeared()) {
134 setNerve(&NrvCoinCounter::CoinCounterNrvWait::sInstance);
135 }
136}
137
138void CoinCounter::exeWait() {
139 if (!mIsAppear && _24 == mCoinCount) {
140 if (CounterLayoutController::isWaitToDisappearCounter(this)) {
141 setNerve(&NrvCoinCounter::CoinCounterNrvDisappear::sInstance);
142 }
143 }
144}
145
146void CoinCounter::exeDisappear() {
147 if (MR::isFirstStep(this)) {
148 mLayoutAppearer->disappear();
149 }
150
151 if (mLayoutAppearer->isDisappeared()) {
152 setNerve(&NrvCoinCounter::CoinCounterNrvHide::sInstance);
153 }
154}
155
156CoinCounter::~CoinCounter() {
157
158}
159
160namespace NrvCoinCounter {
161 INIT_NERVE(CoinCounterNrvHide);
162 INIT_NERVE(CoinCounterNrvAppear);
163 INIT_NERVE(CoinCounterNrvWait);
164 INIT_NERVE(CoinCounterNrvDisappear);
165
166 void CoinCounterNrvDisappear::execute(Spine *pSpine) const {
167 CoinCounter* counter = reinterpret_cast<CoinCounter*>(pSpine->mExecutor);
168 counter->exeDisappear();
169 }
170
171 void CoinCounterNrvWait::execute(Spine *pSpine) const {
172 CoinCounter* counter = reinterpret_cast<CoinCounter*>(pSpine->mExecutor);
173 counter->exeWait();
174 }
175
176 void CoinCounterNrvAppear::execute(Spine *pSpine) const {
177 CoinCounter* counter = reinterpret_cast<CoinCounter*>(pSpine->mExecutor);
178 counter->exeAppear();
179 }
180
181 void CoinCounterNrvHide::execute(Spine *pSpine) const {
182 CoinCounter* counter = reinterpret_cast<CoinCounter*>(pSpine->mExecutor);
183 counter->exeHide();
184 }
185};
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition Spine.hpp:9