SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
Air.cpp
1#include "Game/Map/Air.hpp"
2#include "Game/LiveActor/MaterialCtrl.hpp"
3#include "Game/Scene/SceneObjHolder.hpp"
4#include "Game/Util.hpp"
5
6Air::Air(const char *pName) : LiveActor(pName) {
7 _8C = 0;
8 _8D = 0;
9 mDistance = 70.0f;
10}
11
12void Air::init(const JMapInfoIter &rIter) {
13 MR::initDefaultPos(this, rIter);
14 const char* object_name = 0;
15 MR::getObjectName(&object_name, rIter);
16 initModel(object_name);
17 MR::connectToSceneAir(this);
18 MR::useStageSwitchReadA(this, rIter);
19 MR::getJMapInfoArg0NoInit(rIter, &mDistance);
20 s32 arg_1 = -1;
21 MR::getJMapInfoArg1NoInit(rIter, &arg_1);
22 _8D = arg_1 + 1;
23 MR::tryStartAllAnim(this, object_name);
24 MR::setClippingTypeSphereContainsModelBoundingBox(this, 100.0f);
25 setFarClipping();
26 MR::setGroupClipping(this, rIter, 0x10);
27 initNerve(&NrvAir::HostTypeOut::sInstance);
28 MR::registerDemoSimpleCastAll(this);
29 bool registered = MR::tryRegisterDemoCast(this, rIter);
30
31 if (registered) {
32 bool val = true;
33
34 void (Air::*fadeOut)(void) = &Air::appearFadeOut;
35 bool ret = MR::tryRegisterDemoActionFunctor(this, MR::Functor(this, fadeOut), "消滅");
36
37 if (!ret) {
38 void (Air::*fadeIn)(void) = &Air::appearFadeIn;
39 ret = MR::tryRegisterDemoActionFunctor(this, MR::Functor(this, fadeIn), 0);
40
41 if (!ret) {
42 val = false;
43 }
44 }
45
46 if (val) {
47 makeActorDead();
48 }
49 }
50 else {
51 appear();
52 }
53}
54
55void Air::appear() {
56 LiveActor::appear();
57
58 f32 val = 100.0f * mDistance;
59 f32 dist = MR::calcDistanceToPlayer(this);
60
61 if (dist < val) {
62 MR::tryStartAllAnim(this, "Appear");
63 MR::setAllAnimFrameAtEnd(this, "Appear");
64 setNerve(&NrvAir::HostTypeIn::sInstance);
65 }
66 else {
67 MR::tryStartAllAnim(this, "Disappear");
68 MR::setAllAnimFrameAtEnd(this, "Disappear");
69 MR::hideModel(this);
70 setNerve(&NrvAir::HostTypeOut::sInstance);
71 }
72}
73
74bool Air::isDrawing() const {
75 if (!MR::isDead(this)) {
76 return !MR::isHiddenModel(this);
77 }
78
79 return false;
80}
81
82void Air::initModel(const char *pModelName) {
83 initModelManagerWithAnm(pModelName, 0, false);
84}
85
86bool Air::tryChange() {
87 if (!MR::isValidSwitchA(this)) {
88 return false;
89 }
90
91 if (_8C) {
92 return false;
93 }
94
95 if (MR::isOnSwitchA(this)) {
96 MR::tryStartAllAnim(this, "Change");
97 _8C = 1;
98 return true;
99 }
100
101 return false;
102}
103
104void Air::appearFadeIn() {
105 makeActorAppeared();
106 MR::tryStartAllAnim(this, "Appear");
107 setNerve(&NrvAir::HostTypeIn::sInstance);
108}
109
110void Air::appearFadeOut() {
111 makeActorAppeared();
112 MR::tryStartAllAnim(this, "Disappear");
113 setNerve(&NrvAir::HostTypeOut::sInstance);
114}
115
116void Air::exeIn() {
117 bool isCameraNotEnd = false;
118
119 if (_8D && !MR::isStartAnimCameraEnd()) {
120 isCameraNotEnd = true;
121 }
122
123 if (!isCameraNotEnd) {
124 tryChange();
125 f32 val = (100.0f * (20.0f + mDistance));
126 if (val < MR::calcDistanceToPlayer(this)) {
127 MR::tryStartAllAnim(this, "Disappear");
128 setNerve(&NrvAir::HostTypeOut::sInstance);
129 }
130 }
131}
132
133void Air::exeOut() {
134 bool flag = false;
135
136 if (_8D && !MR::isStartAnimCameraEnd()) {
137 flag = true;
138 }
139
140 if (!flag) {
141 tryChange();
142
143 if (!MR::isHiddenModel(this) && MR::isAnyAnimStopped(this, "Disappear")) {
144 MR::hideModel(this);
145 }
146
147 f32 distMult = (100.0f * mDistance);
148
149 if (MR::calcDistanceToPlayer(this) < distMult) {
150 MR::showModel(this);
151 MR::tryStartAllAnim(this, "Appear");
152 setNerve(&NrvAir::HostTypeIn::sInstance);
153 }
154 }
155}
156
157Air::~Air() {
158
159}
160
161void ProjectionMapAir::initModel(const char *pModelName) {
162 initModelManagerWithAnm(pModelName, nullptr, true);
163 ProjmapEffectMtxSetter* mtxSetter = MR::initDLMakerProjmapEffectMtxSetter(this);
164 MR::newDifferedDLBuffer(this);
165 mtxSetter->updateMtxUseBaseMtx();
166}
167
168void Air::setFarClipping() {
169 MR::setClippingFarMax(this);
170}
171
172AirFar100m::AirFar100m(const char *pName) : Air(pName) {
173
174}
175
176void AirFar100m::setFarClipping() {
177 MR::setClippingFar100m(this);
178}
179
180PriorDrawAir::PriorDrawAir(const char *pName) : Air(pName) {
181 MR::createSceneObj(SceneObj_PriorDrawAirHolder);
182 MR::getSceneObj<PriorDrawAirHolder*>(SceneObj_PriorDrawAirHolder)->add(this);
183}
184
185PriorDrawAirHolder::PriorDrawAirHolder() : NameObj("先描画大気保持") {
186 mAirCount = 0;
187}
188
189void PriorDrawAirHolder::add(PriorDrawAir *pAir) {
190 s32 airCnt = mAirCount++;
191 mAirs[airCnt] = pAir;
192}
193
194bool PriorDrawAirHolder::isExistValidDrawAir() const {
195 PriorDrawAir** curAir = (PriorDrawAir**)&mAirs;
196
197 for (; curAir != &mAirs[mAirCount]; *curAir++) {
198 if ((*curAir)->isDrawing()) {
199 return true;
200 }
201 }
202
203 return false;
204}
205
206namespace MR {
207 bool isExistPriorDrawAir() {
208 if (!MR::isExistSceneObj(SceneObj_PriorDrawAirHolder)) {
209 return false;
210 }
211
212 return MR::getSceneObj<PriorDrawAirHolder*>(SceneObj_PriorDrawAirHolder)->isExistValidDrawAir();
213 }
214};
215
216namespace NrvAir {
217 INIT_NERVE(HostTypeIn);
218 INIT_NERVE(HostTypeOut);
219};
220
221AirFar100m::~AirFar100m() {
222
223}
224
225ProjectionMapAir::~ProjectionMapAir() {
226
227}
228
229PriorDrawAir::~PriorDrawAir() {
230
231}
232
233PriorDrawAirHolder::~PriorDrawAirHolder() {
234
235}
Definition Air.hpp:5
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition Air.cpp:12
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
The most basic form of an object.
Definition NameObj.hpp:11