SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
PowerStar.cpp
1#include "Game/MapObj/PowerStar.hpp"
2#include "Game/MapObj/PowerStarHolder.hpp"
3#include "Game/LiveActor/LiveActorGroup.hpp"
4#include "Game/Util.hpp"
5#include "JSystem/JMath.hpp"
6
7const GXColor lightColor[5] = { { 0x96, 0x96, 0x32, 0 },
8 { 0x32, 0x32, 0x96, 0 },
9 { 0x32, 0x96, 0x32, 0 },
10 { 0x96, 0x32, 0x32, 0 },
11 { 0x64, 0x64, 0x64, 0}
12 };
13
14namespace {
15 void setupColor(LiveActor *pActor, bool useFrame, int frame) NO_INLINE {
16 MR::startBtp(pActor, "PowerStar");
17 MR::setBtpFrameAndStop(pActor, useFrame ? 0.0f : frame);
18 MR::startBva(pActor, "PowerStar");
19 MR::setBvaFrameAndStop(pActor, useFrame ? 1.0f : 0.0f);
20 }
21
22 void setupColorGrandStar(LiveActor *pActor, bool dontStartRecover) NO_INLINE {
23 if (dontStartRecover) {
24 MR::showMaterial(pActor, "GrandStarEmpty");
25 MR::hideMaterial(pActor, "FooMat");
26 }
27 else {
28 MR::showMaterial(pActor, "FooMat");
29 MR::hideMaterial(pActor, "GrandStarEmpty");
30 MR::startBrk(pActor, "Recover");
31 MR::setBrkFrameEndAndStop(pActor);
32 }
33 }
34
35 void requestPointLight(const LiveActor *pActor, int a2) NO_INLINE {
36 TVec3f joint_pos;
37 MR::copyJointPos(pActor, "PowerStar", &joint_pos);
38 MR::requestPointLight(pActor, TVec3f(joint_pos), lightColor[a2], 1.0f, -1);
39 }
40};
41
42PowerStar::PowerStar(const char *pName) : LiveActor(pName),
43 mPowerStarId(-1), mIsInDemo(false), mAppearPosition(gZeroVec), _A0(gZeroVec), _AC(gZeroVec) {
44
45 mPowerStarModelObj = 0;
46 _11C = 0;
47 mColorFrame = 0;
48 mIsGrandStar = false;
49 _125 = false;
50 _126 = false;
51 _127 = false;
52 mCameraInfo = 0;
53 mCameraActor = 0;
54 mLuigiNPC = 0;
55 _164 = 0;
56 _B8.identity();
57 _E8.identity();
58 _134.identity();
59}
60
61void PowerStar::init(const JMapInfoIter &rIter) {
62 mIsGrandStar = MR::isEqualObjectName(rIter, "GrandStar");
63 initMapToolInfo(rIter);
64 initModel();
65
66 if (mIsGrandStar) {
67 MR::connectToSceneIndirectMapObj(this);
68 initSensorGrandStar();
69 }
70 else {
71 MR::connectToSceneNoSilhouettedMapObj(this);
72 initHitSensor(1);
73 MR::addHitSensor(this, "body", 0x67, 8, 75.0f, TVec3f(0.0f, 0.0f, 0.0f));
74 }
75
76 initEffectKeeper(0, 0, false);
77 if (MR::isGalaxyGhostCometAppearInCurrentStage()) {
78 MR::invalidateClipping(this);
79 }
80 else {
81 MR::setClippingTypeSphere(this, 5000.0f);
82 }
83
84 initShadow(rIter);
85 MR::initActorCamera(this, rIter, &mCameraInfo);
86 ModelObj* power_star_mdl = mPowerStarModelObj;
87 ActorCameraInfo* cam_info = mCameraInfo;
88 MR::initAnimCamera(power_star_mdl, cam_info, mIsGrandStar ? "GrandStarGet" : "PowerStarGet");
89
90 if (mIsGrandStar) {
91 if (MR::isStageKoopaVs()) {
92 bool isStageV3 = MR::isStageKoopaVs3();
93 power_star_mdl = mPowerStarModelObj;
94 cam_info = mCameraInfo;
95 MR::initAnimCamera(power_star_mdl, cam_info, isStageV3 ? "DemoKoopaGrandStarVs3" : "DemoKoopaGrandStar");
96
97 if (MR::isStageKoopaVs3()) {
98 MR::initAnimCamera(mPowerStarModelObj, mCameraInfo, cStageClearAnimNameKoopaVs3);
99 }
100 }
101 }
102
103 if (MR::tryRegisterDemoCast(this, rIter)) {
104 MR::registerDemoActionNerve(this, &NrvPowerStar::PowerStarNrvWeakNoRotate::sInstance, "ミニ太陽消失");
105 MR::registerDemoActionNerve(this, &NrvPowerStar::PowerStarNrvWeakToWait::sInstance, "グランドスター復活");
106 MR::registerDemoSimpleCastAll(this);
107 }
108
109 initSound(4, false);
110 initNerve(&NrvPowerStar::PowerStarNrvWait::sInstance);
111
112 if (mPowerStarId == -1) {
113 if (mIsInDemo) {
114 makeActorDead();
115 }
116 else {
117 makeActorAppeared();
118 }
119 }
120 else {
121 makeActorAppeared();
122 }
123
124 /*if (mPowerStarId == -1 && mIsInDemo) {
125 makeActorDead();
126 }
127 else {
128 makeActorAppeared();
129 }*/
130}
131
132void PowerStar::initAfterPlacement() {
133
134}
135
136void PowerStar::appear() {
137 LiveActor::appear();
138 MR::invalidateClipping(this);
139 requestAppearOrWait();
140}
141
142void PowerStar::makeActorAppeared() {
143 _AC.set(mPosition);
144 initPosture();
145 LiveActor::makeActorAppeared();
146}
147
148void PowerStar::requestAppear() {
149 makeActorAppeared();
150 MR::invalidateClipping(this);
151 MR::hideModel(this);
152 MR::invalidateHitSensors(this);
153 setNerve(&NrvPowerStar::PowerStarNrvWaitStartAppear::sInstance);
154
155 if (MR::isStageKoopaVs()) {
156 MR::requestStartDemoMarioPuppetableWithoutCinmeaFrame(this, cAppearDemoName, &NrvPowerStar::PowerStarNrvAppearDemoKoopa::sInstance, 0);
157 }
158 else {
159 MR::requestStartDemoWithoutCinemaFrame(this, cAppearDemoName, &NrvPowerStar::PowerStarNrvAppearDemoRise::sInstance, 0);
160 }
161}
162
163void PowerStar::setDemoAppearPos(const TVec3f &rVec) {
164 bool isinArray = MR::getGroupFromArray(this);
165 if (isinArray) {
166 mCameraActor = getNearestAppearPoint(rVec);
167 mAppearPosition.set(mCameraActor->mPosition);
168 }
169
170 mPosition.set(rVec);
171}
172
173bool PowerStar::isEndAppearDemo() const {
174 bool ret = false;
175
176 if (isNerve(&NrvPowerStar::PowerStarNrvWait::sInstance) || isNerve(&NrvPowerStar::PowerStarNrvStageClearDemo::sInstance)) {
177 ret = true;
178 }
179
180 return ret;
181}
182
183void PowerStar::offAppearDemo() {
184 mIsInDemo = false;
185}
186
187void PowerStar::setupColor(LiveActor *pActor, const NameObj *a2, s32 a3) {
188 bool hasPowerStar;
189 s32 val = 0;
190 hasPowerStar = MR::hasPowerStarInCurrentStageWithDeclarer(a2->mName, a3);
191
192 if (MR::isPowerStarGreenInCurrentStageWithDeclarer(a2->mName, a3)) {
193 val = 2;
194 }
195 else if (MR::isPowerStarRedInCurrentStageWithDeclarer(a2->mName, a3)) {
196 val = 3;
197 }
198
199 if (MR::isGrandStarInCurrentStageWithDeclarer(a2->mName, a3)) {
200 ::setupColorGrandStar(pActor, hasPowerStar);
201 }
202 else {
203 ::setupColor(pActor, hasPowerStar, val);
204 }
205}
206
207void PowerStar::setupColorAtResultSequence(LiveActor *pPowerStar, bool a2) {
208 bool hasStarAtRes;
209 s32 val = 0;
210 hasStarAtRes = MR::hasPowerStarAtResultSequence();
211
212 if (MR::isPowerStarGreenAtResultSequence()) {
213 val = 2;
214 }
215 else if (MR::isPowerStarRedAtResultSequence()) {
216 val = 3;
217 }
218
219 if (a2) {
220 ::setupColorGrandStar(pPowerStar, hasStarAtRes);
221 }
222 else {
223 ::setupColor(pPowerStar, hasStarAtRes, val);
224 }
225}
226
227void PowerStar::requestPointLight(const LiveActor *pActor, const NameObj *a2, s32 a3) {
228 s32 colorIdx = 0;
229
230 if (MR::hasPowerStarInCurrentStageWithDeclarer(a2->mName, a3)) {
231 colorIdx = 4;
232 }
233 else if (MR::isPowerStarGreenInCurrentStageWithDeclarer(a2->mName, a3)) {
234 colorIdx = 2;
235 }
236 else if (MR::isPowerStarRedInCurrentStageWithDeclarer(a2->mName, a3)) {
237 colorIdx = 3;
238 }
239
240 ::requestPointLight(pActor, colorIdx);
241}
242
243void PowerStar::requestPointLightAtResultSequence(const LiveActor *pActor) {
244 s32 val = 0;
245
246 if (MR::hasPowerStarAtResultSequence()) {
247 val = 4;
248 }
249 else if (MR::isPowerStarGreenAtResultSequence()) {
250 val = 2;
251 }
252 else if (MR::isPowerStarRedAtResultSequence()) {
253 val = 3;
254 }
255
256 ::requestPointLight(pActor, val);
257}
258
259f32 PowerStar::getPowerStarWaitRotateSpeed() {
260 return 3.0f;
261}
262
263s32 PowerStar::getBtpFrameCurrentStage(s32 a1) {
264 if (MR::isPowerStarGreenInCurrentStage(a1)) {
265 return 2;
266 }
267
268 return MR::isPowerStarRedInCurrentStage(a1) ? 3 : 0;
269}
270
271bool PowerStar::isCurrentStageKoopaVs3() {
272 return MR::isStageKoopaVs3();
273}
274
275void PowerStar::initShadowPowerStar(LiveActor *pActor, bool a2) {
276 MR::initShadowFromCSV(pActor, "Shadow");
277 MR::invalidateShadowAll(pActor);
278 MR::validateShadowGroup(pActor, a2 ? "円柱" : "通常");
279}
280
281void PowerStar::makeArchiveList(NameObjArchiveListCollector *pCollector, const JMapInfoIter &rIter) {
282 if (MR::isPowerStarGetDemoWithLuigiCurrentGalaxy()) {
283 pCollector->addArchive("LuigiNPC");
284 }
285}
286
287void PowerStar::control() {
288 if (!isNerve(&NrvPowerStar::PowerStarNrvWaitStartAppear::sInstance)) {
289 TVec3f joint_pos;
290
291 if (isNerve(&NrvPowerStar::PowerStarNrvStageClearDemo::sInstance)) {
292 MR::copyJointPos(mPowerStarModelObj, "PowerStar", &joint_pos);
293 }
294 else {
295 MR::copyJointPos(this, "PowerStar", &joint_pos);
296 }
297
298 bool cond = (isNerve(&NrvPowerStar::PowerStarNrvAppearDemoKoopa::sInstance) && MR::isStageKoopaVs3()) ? true : false;
299 s32 val = cond ? 0x78 : -1;
300 MR::requestPointLight(this, TVec3f(joint_pos), lightColor[mColorFrame], 1.0f, val);
301 }
302}
303
304#ifdef NON_MATCHING
306 f32 derp = 0.017453292f * mRotation.y;
307 TVec3f stack_14(0.0f, 1.0f, 0.0f);
308 TPos3f pos;
309 pos.zeroTrans();
310 TVec3f stack_8;
311 stack_8.set(stack_14);
312 PSVECMag(stack_8.toCVec());
313 PSVECNormalize(stack_8.toCVec(), stack_8.toVec());
314 f32 _sin = sin(derp);
315 f32 _cos = cos(derp);
316 pos.mMtx[0][0] = _cos + ((1.0f - _cos) * (stack_8.x * stack_8.x));
317 pos.mMtx[1][1] = _cos + ((1.0f - _cos) * (stack_8.y * stack_8.y));
318 pos.mMtx[2][2] = _cos + ((1.0f - _cos) * (stack_8.z * stack_8.z));
319 pos.mMtx[0][1] = (stack_8.y * ((1.0f - _cos) * stack_8.x)) - (_sin * stack_8.z);
320 pos.mMtx[0][2] = (stack_8.z * ((1.0f - _cos) * stack_8.x)) - (_sin * stack_8.y);
321 pos.mMtx[1][0] = (stack_8.y * ((1.0f - _cos) * stack_8.x)) - (_sin * stack_8.z);
322 pos.mMtx[2][0] = (stack_8.z * ((1.0f - _cos) * stack_8.x)) - (_sin * stack_8.y);
323 pos.mMtx[1][2] = (stack_8.z * ((1.0f - _cos) * stack_8.y)) - (_sin * stack_8.x);
324 pos.mMtx[2][1] = (stack_8.z * ((1.0f - _cos) * stack_8.y)) - (_sin * stack_8.x);
325 TPos3f mtx;
326 mtx.concat(_B8, pos);
327 mtx.setTrans(mPosition);
328 MR::setBaseTRMtx(this, mtx);
329}
330#endif
331
332bool PowerStar::receiveMsgPlayerAttack(u32 msg, HitSensor *a2, HitSensor *a3) {
333 if (MR::isMsgStarPieceReflect(msg)) {
334 return 1;
335 }
336
337 return MR::isMsgJetTurtleAttack(msg);
338}
339
340bool PowerStar::receiveOtherMsg(u32 msg, HitSensor *a2, HitSensor *a3) {
341 switch(msg) {
342 case 0x98:
343 return 1;
344 break;
345 case 0x92:
346 if (isNerve(&NrvPowerStar::PowerStarNrvWait::sInstance)) {
347 MR::startSystemSE("SE_SY_STAR_GET", -1, -1);
348 MR::stopSoundPlayer("SE_PV_BURN_RUN", 0);
349 MR::stopSoundPlayer("SE_PV_NEEDLE_DAMAGE_RUN", 0);
350 MR::makeMtxTR((MtxPtr)&_E8, *MR::getPlayerRotate(), *MR::getPlayerPos());
351 setNerve(&NrvPowerStar::PowerStarNrvStageClearDemo::sInstance);
352 return 1;
353 }
354 break;
355 case 0xA1:
356 MR::setPlayerBaseMtx((MtxPtr)&_E8);
357 return 1;
358 break;
359 }
360
361 return 0;
362}
363
364void PowerStar::initMapToolInfo(const JMapInfoIter &rIter) {
365 MR::initDefaultPos(this, rIter);
366 MR::getJMapInfoArg0NoInit(rIter, &mPowerStarId);
367 MR::getJMapInfoArg1NoInit(rIter, &_125);
368 MR::getJMapInfoArg2NoInit(rIter, &_126);
369 MR::getJMapInfoArg4NoInit(rIter, &_127);
370 mAppearPosition.set(mPosition);
371 _A0.set(mPosition);
372 MR::registerPowerStar(this, mPowerStarId);
373 MR::joinToGroupArray(this, rIter, "パワースター出現ポイントグループ", 0x10);
374
375 if (mPowerStarId > 0) {
376 if (!MR::hasPowerStarInCurrentStage(mPowerStarId)) {
377 u32 frame;
378 if (mIsGrandStar) {
379 frame = 0;
380 }
381 else {
382 frame = getBtpFrameCurrentStage(mPowerStarId);
383 }
384
385 mColorFrame = frame;
386 }
387 else {
388 mColorFrame = 4;
389 }
390 }
391}
392
393void PowerStar::initModel() {
394 initModelManagerWithAnm(isGrandStar() ? "GrandStar" : "PowerStar", 0, false);
395
396 if (mIsGrandStar) {
397 ::setupColorGrandStar(this, mColorFrame_v == 4);
398 }
399 else {
400 ::setupColor(this, mColorFrame_v == 4, mColorFrame_v);
401 }
402
403 if (mIsGrandStar) {
404 MtxPtr mtx = (MtxPtr)&_E8;
405 const char* name = "グランドスターデモモデル";
406 mPowerStarModelObj = MR::createModelObjIndirectMapObj(name, mIsGrandStar ? "GrandStar" : "PowerStar", mtx);
407 ::setupColorGrandStar(mPowerStarModelObj, mColorFrame_v == 4);
408 }
409 else {
410 MtxPtr mtx = (MtxPtr)&_E8;
411 const char* name = "パワースターデモモデル";
412 mPowerStarModelObj = MR::createModelObjNoSilhouettedMapObj(name, mIsGrandStar ? "GrandStar" : "PowerStar", mtx);
413 ::setupColor(mPowerStarModelObj, mColorFrame_v == 4, mColorFrame_v);
414 }
415
416 MR::invalidateClipping(mPowerStarModelObj);
417 mPowerStarModelObj->makeActorDead();
418
419 if (MR::isPowerStarGetDemoWithLuigiCurrentGalaxy()) {
420 mLuigiNPC = MR::createModelObjNpc("ルイージデモモデル", "LuigiNPC", (MtxPtr)&_E8);
421 MR::initLightCtrl(mLuigiNPC);
422 MR::invalidateClipping(mLuigiNPC);
423 mLuigiNPC->makeActorDead();
424 }
425
426 MR::tryCreateMirrorActor(this, isGrandStar() ? "GrandStar" : "PowerStar");
427}
428
429void PowerStar::initSensorGrandStar() {
430 initHitSensor(6);
431 TVec3f body1Offs = TVec3f(0.0f, 100.0f, 0.0f);
432 const char* body1Name = "body1";
433 MR::addHitSensorMtx(this, body1Name, 0x67, 8, 60.0f, getBaseMtx(), body1Offs);
434 TVec3f body2Offs = TVec3f(-95.0f, 35.0f, 0.0f);
435 const char* body2Name = "body2";
436 MR::addHitSensorMtx(this, body2Name, 0x67, 8, 60.0f, getBaseMtx(), body2Offs);
437 TVec3f body3Offs = TVec3f(-55.0f, -75.0f, 0.0f);
438 const char* body3Name = "body3";
439 MR::addHitSensorMtx(this, body3Name, 0x67, 8, 60.0f, getBaseMtx(), body3Offs);
440 TVec3f body4Offs = TVec3f(55.0f, -75.0f, 0.0f);
441 const char* body4Name = "body4";
442 MR::addHitSensorMtx(this, body4Name, 0x67, 8, 60.0f, getBaseMtx(), body4Offs);
443 TVec3f body5Offs = TVec3f(95.0f, 35.0f, 0.0f);
444 const char* body5Name = "body5";
445 MR::addHitSensorMtx(this, body5Name, 0x67, 8, 60.0f, getBaseMtx(), body5Offs);
446 TVec3f body6Offs = TVec3f(0.0f, 0.0f, 0.0f);
447 const char* body6Name = "body6";
448 MR::addHitSensorMtx(this, body6Name, 0x67, 8, 80.0f, getBaseMtx(), body6Offs);
449}
450
451void PowerStar::initShadow(const JMapInfoIter &rIter) {
452 if (!mIsGrandStar) {
453 bool arg_3 = false;
454 MR::getJMapInfoArg3NoInit(rIter, &arg_3);
455 bool thing = arg_3;
456 MR::initShadowFromCSV(this, "Shadow");
457 MR::invalidateShadowAll(this);
458 MR::validateShadowGroup(this, thing ? "円柱" : "通常");
459 }
460 else {
461 MR::initShadowFromCSV(this, "Shadow");
462 }
463}
464
465void PowerStar::initPosture() {
466 MR::calcGravity(this, mAppearPosition);
467 TMtx34f rotate;
468 MR::makeMtxRotate((MtxPtr)&rotate, _A0);
469
470 if (!_126) {
471 TVec3f stack_14;
472 f32 z = rotate.mMtx[2][2];
473 f32 y = rotate.mMtx[1][2];
474 f32 x = rotate.mMtx[0][2];
475 stack_14.set(x, y, z);
476
477 TVec3f negGravity;
478 negGravity.negateInline_2(mGravity);
479
480 if (!MR::isSameDirection(negGravity, stack_14, 0.0099999998f)) {
481 MR::makeMtxUpFront(&_B8, negGravity, stack_14);
482 }
483 else {
484 MR::makeMtxUpNoSupport(&_B8, negGravity);
485 }
486 }
487 else {
488 JMath::gekko_ps_copy12(&_B8, &rotate);
489 }
490
491 _B8.zeroTrans();
492 mRotation.y = 0.0f;
493}
494
495void PowerStar::endAppearDemo() {
496 if (!_11C) {
497 MR::endDemo(this, cAppearDemoName);
498 }
499
500 MR::moveVolumeStageBGM(1.0f, 0x3C);
501 MR::moveVolumeSubBGM(1.0f, 0x3C);
502 setNerve(&NrvPowerStar::PowerStarNrvWait::sInstance);
503}
504
505PowerStarAppearPoint* PowerStar::getNearestAppearPoint(const TVec3f &rPos) const {
506 LiveActorGroup* group = MR::getGroupFromArray(this);
507 f32 curDist = 3.4028235e38f;
508 PowerStarAppearPoint* curNearest = 0;
509
510 for (int i = 0; i < group->mObjectCount; i++) {
511 PowerStarAppearPoint* actor = reinterpret_cast<PowerStarAppearPoint*>(group->getActor(i));
512
513 if ((LiveActor*)actor != this) {
514 f32 dist = PSVECDistance(rPos.toCVec(), actor->mPosition.toCVec());
515
516 if (dist < curDist) {
517 curNearest = actor;
518 curDist = dist;
519 }
520 }
521 }
522
523 return curNearest;
524}
525
526
527LiveActor* PowerStar::getAppearCameraActor() {
528 LiveActor* cam_actor = this->mCameraActor;
529 if (cam_actor) {
530 return cam_actor;
531 }
532}
533
534void PowerStar::requestAppearOrWait() {
535 if (MR::isDemoCast(this, 0)) {
536 setNerve(&NrvPowerStar::PowerStarNrvWeak::sInstance);
537 }
538 else if (mIsInDemo) {
539 if (_11C) {
540 MR::invalidateClipping(this);
541 MR::requestMovementOn(this);
542
543 if (MR::isStageKoopaVs()) {
544 setNerve(&NrvPowerStar::PowerStarNrvAppearDemoKoopa::sInstance);
545 }
546 else {
547 setNerve(&NrvPowerStar::PowerStarNrvAppearDemoRise::sInstance);
548 }
549 }
550 else {
551 requestAppear();
552 }
553 }
554 else {
555 setNerve(&NrvPowerStar::PowerStarNrvWait::sInstance);
556 }
557}
558
559void PowerStar::calcAppearDemoRiseTrans(TVec3f *pOutTrans, f32 a2) const {
560 if (_125) {
561 MR::calcGravityVector(this, _AC, pOutTrans, 0, 0);
562 pOutTrans->x += -a2;
563 pOutTrans->y = (pOutTrans->y * -a2);
564 pOutTrans->z = (pOutTrans->z * -a2);
565 }
566 else {
567 TVec3f vec;
568 vec.y = a2;
569 vec.x = 0.0f;
570 vec.z = 0.0f;
571 _B8.mult(vec, *pOutTrans);
572 }
573
574 pOutTrans->add(_AC);
575}
576
577#ifdef NON_MATCHING
578void PowerStar::processWait(f32 val) {
579 f32 derp = (mRotation.y + val) - 0.0;
580 f32 rot_y = fmod((360.0f + derp), 360.0f);
581 mRotation.y = rot_y + 0.0;
582
583 if (mIsGrandStar) {
584 if (MR::changeShowModelFlagSyncNearClipping(this, 250.0f)) {
585 MR::onDrawEffect(this);
586 }
587 else {
588 MR::offDrawEffect(this);
589 }
590 }
591
592 if (MR::isGalaxyGhostCometAppearInCurrentStage()) {
593 if (MR::isJudgedToClipFrustum100m(mPosition, 5000.0f)) {
594 MR::hideModelAndOnCalcAnimIfShown(this);
595 MR::forceDeleteEffect(this, "Light");
596 }
597 else {
598 MR::showModelIfHidden(this);
599 MR::emitEffect(this, "Light");
600 }
601 }
602
603 if (!_164) {
604 if (MR::isInWater(this, TVec3f(0.0f, 0.0f, 0.0f))) {
605 MR::startLevelSound(this, "SE_OJ_LV_POW_STAR_EXIST_W", -1, -1, -1);
606 }
607 else {
608 MR::startLevelSound(this, "SE_OJ_LV_POW_STAR_EXIST", -1, -1, -1);
609 }
610 }
611}
612#endif
613
614#ifdef NON_MATCHING
615void PowerStar::exeAppearDemoRise() {
616 if (MR::isFirstStep(this)) {
617 MR::showModelIfHidden(this);
618 MR::moveVolumeStageBGM(0.0f, 5);
619 MR::moveVolumeSubBGM(0.0f, 5);
620
621 CameraTargetArg target_arg(this);
622 MR::startActorCameraTargetOther(getAppearCameraActor(), getAppearCameraInfo(), target_arg, 0);
623 mPosition.set(_AC);
624 MR::emitEffect(this, "Light");
625 }
626
627 TVec3f stack_8(0.0f, 0.0f, 0.0f);
628 if (MR::isInWater(this, stack_8)) {
629 MR::startLevelSound(this, "SE_OJ_LV_POW_STAR_EXIST_W", -1, -1, -1);
630 }
631 else {
632 MR::startLevelSound(this, "SE_OJ_LV_POW_STAR_EXIST", -1, -1, -1);
633 }
634
635 f32 easeOut = MR::calcNerveEaseOutValue(this, 0x3C, 0.0f, 300.0f);
636 calcAppearDemoRiseTrans(&mPosition, easeOut);
637 mRotation.y = 0.0f + fmod((360.0f + ((10.0f + mRotation.y) - 0.0f)), 360.0f);
638
639 if (MR::isStep(this, 0x50)) {
640 setNerve(&NrvPowerStar::PowerStarNrvAppearDemoMove::sInstance);
641 }
642}
643#endif
644
645// PowerStar::exeAppearDemoMove()
646
647void PowerStar::exeWait() {
648 if (MR::isFirstStep(this)) {
649 if (MR::isGalaxyGhostCometAppearInCurrentStage()) {
650 MR::validateClipping(this);
651 }
652
653 MR::validateHitSensors(this);
654 MR::emitEffect(this, "Light");
655 }
656
657 processWait(mIsGrandStar ? 2.0f : 3.0f);
658}
659
660void PowerStar::exeWeak() {
661 if (MR::isFirstStep(this)) {
662 MR::invalidateHitSensors(this);
663 MR::validateClipping(this);
664
665 if (mColorFrame != 4) {
666 MR::startBrkAndSetFrameAndStop(this, "Recover", 0.0f);
667 }
668 }
669
670 _164 = 1;
671 processWait(0.30000001f);
672}
673
674void PowerStar::exeWeakNoRotate() {
675 if (MR::isFirstStep(this)) {
676 mRotation.y = 45.0f;
677 }
678
679 _164 = 1;
680 processWait(0.0f);
681}
682
683void PowerStar::exeWeakToWait() {
684 if (MR::isFirstStep(this)) {
685 if (mColorFrame != 4) {
686 MR::setBrkRate(this, 1.0f);
687 }
688 }
689
690 _164 = 0;
691 f32 easeIn = MR::calcNerveEaseInValue(this, 0x1E, 0.30000001f, mIsGrandStar ? 2.0f : 3.0f);
692 processWait(easeIn);
693 MR::setNerveAtStep(this, &NrvPowerStar::PowerStarNrvWait::sInstance, 0x1E);
694}
695
696// PowerStar::exeStageClearDemo
697
698PowerStar::~PowerStar() {
699
700}
701
702namespace NrvPowerStar {
703 INIT_NERVE(PowerStarNrvWaitStartAppear);
704 INIT_NERVE(PowerStarNrvAppearDemoRise);
705 INIT_NERVE(PowerStarNrvAppearDemoMove);
706 INIT_NERVE(PowerStarNrvAppearDemoKoopa);
707 INIT_NERVE(PowerStarNrvWait);
708 INIT_NERVE(PowerStarNrvWeak);
709 INIT_NERVE(PowerStarNrvWeakNoRotate);
710 INIT_NERVE(PowerStarNrvWeakToWait);
711 INIT_NERVE(PowerStarNrvStageClearDemo);
712
713 void PowerStarNrvStageClearDemo::execute(Spine *pSpine) const {
714 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
715 star->exeStageClearDemo();
716 }
717
718 void PowerStarNrvWeakToWait::execute(Spine *pSpine) const {
719 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
720 star->exeWeakToWait();
721 }
722
723 void PowerStarNrvWeakNoRotate::execute(Spine *pSpine) const {
724 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
725 star->exeWeakNoRotate();
726 }
727
728 void PowerStarNrvWeak::execute(Spine *pSpine) const {
729 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
730 star->exeWeak();
731 }
732
733 void PowerStarNrvWait::execute(Spine *pSpine) const {
734 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
735 star->exeWait();
736 }
737
738 void PowerStarNrvAppearDemoKoopa::execute(Spine *pSpine) const {
739 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
740 star->exeAppearDemoKoopa();
741 }
742
743 void PowerStarNrvAppearDemoMove::execute(Spine *pSpine) const {
744 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
745 return star->exeAppearDemoMove();
746 }
747
748 void PowerStarNrvAppearDemoRise::execute(Spine *pSpine) const {
749 PowerStar* star = reinterpret_cast<PowerStar*>(pSpine->mExecutor);
750 return star->exeAppearDemoRise();
751 }
752
753 void PowerStarNrvWaitStartAppear::execute(Spine *pSpine) const {
754
755 }
756};
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mRotation
3D vector of the actor's rotation.
Definition LiveActor.hpp:96
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
TVec3f mGravity
3D vector of the actor's gravity.
Definition LiveActor.hpp:99
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
Stores archive names of NameObjs.
The most basic form of an object.
Definition NameObj.hpp:11
const char * mName
A string to identify the NameObj.
Definition NameObj.hpp:38
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition PowerStar.cpp:61
Definition Spine.hpp:9