NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_enemy_death.cpp
1#include <game/bases/d_enemy.hpp>
3#include <game/bases/d_a_player_base.hpp>
4#include <game/bases/d_a_player_manager.hpp>
5#include <game/bases/d_actor_manager.hpp>
6#include <game/bases/d_effectmanager.hpp>
7#include <game/bases/d_enemy_manager.hpp>
8#include <game/bases/d_game_com.hpp>
9#include <game/bases/d_multi_manager.hpp>
10#include <game/bases/d_score_manager.hpp>
11#include <game/mLib/m_effect.hpp>
13
16STATE_VIRTUAL_DEFINE(dEn_c, DieBigFall);
18STATE_VIRTUAL_DEFINE(dEn_c, DieIceVanish);
19STATE_VIRTUAL_DEFINE(dEn_c, DieYoshiFumi);
22
23const float dEn_c::smc_DEADFALL_GRAVITY = -0.25f + 0.00625001f; // [Where is the 0.00000001 coming from?]
24const float dEn_c::smc_DEADFALL_YSPEED = 3.9f;
25const float dEn_c::smc_DEADFALL_YSPEED_MAX = -4.0f;
26const s16 dEn_c::smc_DEADFALL_SPINSPEED = 0xc00;
27
28bool dEn_c::hitCallback_Star(dCc_c *self, dCc_c *other) {
29 daPlBase_c *player = (daPlBase_c *) other->getOwner();
30 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
31 u8 plrNo = *player->getPlrNo();
32
33 mVec2_c collPos = self->mCollPos;
34 hitdamageEffect(mVec3_c(collPos, 5500.0f));
35
36 int shortCombo = 0;
37 if (mCombo.mType == dEnCombo_c::COMBO_SHORT) {
38 shortCombo = 1;
39 }
40 player->slideComboSE(player->getStarCount(), shortCombo);
41
42 int score = mCombo.getComboScore(dEnCombo_c::calcPlStarCnt(player));
43
44 mDeathInfo = (sDeathInfoData) {
45 l_base_fall_speed_x[dir],
46 smc_DEADFALL_YSPEED,
47 smc_DEADFALL_YSPEED_MAX,
48 smc_DEADFALL_GRAVITY,
49 &StateID_DieFall,
50 score,
51 -1,
52 dir,
53 plrNo
54 };
55
56 return true;
57}
58
59bool dEn_c::hitCallback_Cannon(dCc_c *self, dCc_c *other) {
60 daPlBase_c *player = (daPlBase_c *) other->getOwner();
61 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
62 u8 plrNo = *player->getPlrNo();
63
64 mVec2_c collPos = self->mCollPos;
65 hitdamageEffect(mVec3_c(collPos, 5500.0f));
66
67 int shortCombo = 0;
68 if (mCombo.mType == dEnCombo_c::COMBO_SHORT) {
69 shortCombo = 1;
70 }
71 player->slideComboSE(player->m_cee, shortCombo);
72
73 int score = mCombo.getComboScore(dEnCombo_c::calcPlComboCnt(player));
74
75 mDeathInfo = (sDeathInfoData) {
76 l_base_fall_speed_x[dir],
77 smc_DEADFALL_YSPEED,
78 smc_DEADFALL_YSPEED_MAX,
79 smc_DEADFALL_GRAVITY,
80 &StateID_DieFall,
81 score,
82 -1,
83 dir,
84 plrNo
85 };
86
87 return true;
88}
89
90bool dEn_c::hitCallback_Slip(dCc_c *self, dCc_c *other) {
91 daPlBase_c *player = (daPlBase_c *) other->getOwner();
92 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
93 u8 plrNo = *player->getPlrNo();
94
95 mVec2_c collPos = self->mCollPos;
96 hitdamageEffect(mVec3_c(collPos, 5500.0f));
97
98 setDeathSound_Slip(player);
99
100 int score = mCombo.getComboScore(dEnCombo_c::calcPlComboCnt(player));
101
102 mDeathInfo = (sDeathInfoData) {
103 l_base_fall_speed_x[dir],
104 smc_DEADFALL_YSPEED,
105 smc_DEADFALL_YSPEED_MAX,
106 smc_DEADFALL_GRAVITY,
107 &StateID_DieFall,
108 score,
109 -1,
110 dir,
111 plrNo
112 };
113
114 return true;
115}
116
117bool dEn_c::hitCallback_PenguinSlide(dCc_c *self, dCc_c *other) {
118 return hitCallback_Slip(self, other);
119}
120
121bool dEn_c::hitCallback_Screw(dCc_c *self, dCc_c *other) {
122 return false;
123}
124
125bool dEn_c::hitCallback_WireNet(dCc_c *self, dCc_c *other) {
126 daPlBase_c *player = (daPlBase_c *) other->getOwner();
127 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
128 u8 plrNo = *player->getPlrNo();
129
130 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN, mPos, 0);
131
132 mDeathInfo = (sDeathInfoData) {
133 0.75f * l_base_fall_speed_x[dir],
134 smc_DEADFALL_YSPEED,
135 smc_DEADFALL_YSPEED_MAX,
136 smc_DEADFALL_GRAVITY,
137 &StateID_DieFall,
138 mCombo.getDamageScore(),
139 -1,
140 dir,
141 plrNo
142 };
143
144 return true;
145}
146
147bool dEn_c::hitCallback_Large(dCc_c *self, dCc_c *other) {
148 daPlBase_c *player = (daPlBase_c *) other->getOwner();
149 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
150 u8 plrNo = *player->getPlrNo();
151
152 float xSpeed = l_EnMuki[dir];
153 xSpeed += player->mSpeed.x - mSpeed.x;
154 if (xSpeed > 6.0f) {
155 xSpeed = 6.0f;
156 } else if (xSpeed < -6.0f) {
157 xSpeed = -6.0f;
158 }
159
160 mDeathInfo = (sDeathInfoData) {
161 xSpeed,
162 smc_DEADFALL_YSPEED,
163 smc_DEADFALL_YSPEED_MAX,
164 smc_DEADFALL_GRAVITY,
165 &StateID_DieBigFall,
166 mCombo.getDamageScore(),
167 -1,
168 dir,
169 plrNo
170 };
171
172 return true;
173}
174
175bool dEn_c::hitCallback_Rolling(dCc_c *self, dCc_c *other) {
176 return false;
177}
178
179bool dEn_c::hitCallback_Spin(dCc_c *self, dCc_c *other) {
180 daPlBase_c *player = (daPlBase_c *) other->getOwner();
181 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
182 u8 plrNo = *player->getPlrNo();
183
184 setDeathSound_Spin();
185
186 mVec2_c playerPos;
187 playerPos.x = player->mPos.x;
188 playerPos.y = player->mPos.y;
189 hipatkEffect(mVec3_c(playerPos, 5500.0f));
190
191 int score = mCombo.getComboScore(dEnCombo_c::calcPlFumiCnt(player));
192
193 mDeathInfo = (sDeathInfoData) {
194 l_base_fall_speed_x[dir],
195 smc_DEADFALL_YSPEED,
196 smc_DEADFALL_YSPEED_MAX,
197 smc_DEADFALL_GRAVITY,
198 &StateID_DieFall,
199 score,
200 -1,
201 dir,
202 plrNo
203 };
204
205 return true;
206}
207
208bool dEn_c::hitCallback_HipAttk(dCc_c *self, dCc_c *other) {
209 daPlBase_c *player = (daPlBase_c *) other->getOwner();
210 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
211 u8 plrNo = *player->getPlrNo();
212
213 setDeathSound_HipAttk();
214
215 mVec2_c playerPos;
216 playerPos.x = player->mPos.x;
217 playerPos.y = player->mPos.y;
218 hipatkEffect(mVec3_c(playerPos, 5500.0f));
219
220 int score = mCombo.getComboScore(dEnCombo_c::calcPlFumiCnt(player));
221
222 mDeathInfo = (sDeathInfoData) {
223 l_base_fall_speed_x[dir],
224 smc_DEADFALL_YSPEED,
225 smc_DEADFALL_YSPEED_MAX,
226 smc_DEADFALL_GRAVITY,
227 &StateID_DieFall,
228 score,
229 -1,
230 dir,
231 plrNo
232 };
233
234 return true;
235}
236
237bool dEn_c::hitCallback_YoshiHipAttk(dCc_c *self, dCc_c *other) {
238 daPlBase_c *player = (daPlBase_c *) other->getOwner();
239 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
240 u8 plrNo = *player->getPlrNo();
241
242 int comboScore = mCombo.getComboScore(dEnCombo_c::calcPlFumiCnt(player));
243 if (comboScore >= 0 && plrNo < PLAYER_COUNT) {
244 dScoreMng_c::m_instance->ScoreSet(this, comboScore, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
245 }
246
247 dAudio::g_pSndObjEmy->startSound(SE_EMY_YOSHI_HPDP, mPos, 0);
248
249 setDeathInfo_YoshiFumi(player);
250
251 return true;
252}
253
254bool dEn_c::hitCallback_YoshiBullet(dCc_c *self, dCc_c *other) {
255 daPlBase_c *player = (daPlBase_c *) other->getOwner();
256 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
257 s8 plrNo = *player->getPlrNo();
258
259 setDeathSound_Fire();
260
261 hitdamageEffect(mVec3_c(self->getCollPosX(), self->getCollPosY(), 5500.0f));
262
263 dActorMng_c::m_instance->createUpCoin(getCenterPos(), dir, 1, 0);
264
265 mDeathInfo = (sDeathInfoData) {
266 l_base_fall_speed_x[dir],
267 smc_DEADFALL_YSPEED,
268 smc_DEADFALL_YSPEED_MAX,
269 smc_DEADFALL_GRAVITY,
270 &StateID_DieFall,
271 mCombo.getDamageScore(),
272 -1,
273 dir,
274 (u8) plrNo
275 };
276
277 return true;
278}
279
280bool dEn_c::hitCallback_YoshiFire(dCc_c *self, dCc_c *other) {
281 daPlBase_c *player = (daPlBase_c *) other->getOwner();
282 u8 dir = !(player->mSpeed.x >= 0.0f);
283 mVec3_c centerPos = getCenterPos();
284 dActorMng_c::m_instance->createUpCoin(centerPos, dir, 1, 0);
285 s8 plrNo = *player->getPlrNo();
286
287 mVec2_c collPos = self->mCollPos;
288 hitdamageEffect(mVec3_c(collPos, 5500.0f));
289
290 int shortCombo = 0;
291 if (mCombo.mType == dEnCombo_c::COMBO_SHORT) {
292 shortCombo = 1;
293 }
294 player->slideComboSE(player->mComboMultiplier, shortCombo);
295 player->mComboMultiplier++;
296 if (player->mComboMultiplier >= 8) {
297 player->mComboMultiplier = 8;
298 }
299 int score = mCombo.getComboScore(player->mComboMultiplier);
300
301 mDeathInfo = (sDeathInfoData) {
302 l_base_fall_speed_x[dir],
303 smc_DEADFALL_YSPEED,
304 smc_DEADFALL_YSPEED_MAX,
305 smc_DEADFALL_GRAVITY,
306 &StateID_DieFall,
307 score,
308 -1,
309 dir,
310 (u8) plrNo
311 };
312
313 return true;
314}
315
316bool dEn_c::hitCallback_Shell(dCc_c *self, dCc_c *other) {
317 daPlBase_c *player = (daPlBase_c *) other->getOwner();
318 u8 dir = player->getTrgToSrcDir_Main(getCenterX(), player->getCenterX());
319 s8 plrNo = *player->getPlrNo();
320
321 mVec2_c collPos = self->mCollPos;
322 hitdamageEffect(mVec3_c(collPos, 5500.0f));
323
324 int comboScore = -1;
325 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
326 int shortCombo = 0;
327 if (mCombo.mType == dEnCombo_c::COMBO_SHORT) {
328 shortCombo = 1;
329 }
330 player->slideComboSE(player->mComboMultiplier, shortCombo);
331 player->mComboMultiplier++;
332 if (player->mComboMultiplier >= 8) {
333 player->mComboMultiplier = 8;
334 }
335 comboScore = mCombo.getComboScore(player->mComboMultiplier);
336 } else {
337 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN, mPos, 0);
338 }
339
340 mDeathInfo = (sDeathInfoData) {
341 l_base_fall_speed_x[dir],
342 smc_DEADFALL_YSPEED,
343 smc_DEADFALL_YSPEED_MAX,
344 smc_DEADFALL_GRAVITY,
345 &StateID_DieFall,
346 comboScore,
347 -1,
348 dir,
349 (u8) plrNo
350 };
351
352 return true;
353}
354
355bool dEn_c::hitCallback_Fire(dCc_c *self, dCc_c *other) {
356 daPlBase_c *player = (daPlBase_c *) other->getOwner();
357 u8 dir = !(player->mSpeed.x >= 0.0f);
358 s8 plrNo = *player->getPlrNo();
359
360 setDeathSound_Fire();
361
362 dActorMng_c::m_instance->createUpCoin(getCenterPos(), dir, 1, 0);
363
364 mDeathInfo = (sDeathInfoData) {
365 l_base_fall_speed_x[dir],
366 smc_DEADFALL_YSPEED,
367 smc_DEADFALL_YSPEED_MAX,
368 smc_DEADFALL_GRAVITY,
369 &StateID_DieFall,
370 mCombo.getDamageScore(),
371 -1,
372 dir,
373 (u8) plrNo
374 };
375
376 return true;
377}
378
379bool dEn_c::hitCallback_Ice(dCc_c *self, dCc_c *other) {
380 if (!mIceMng.mActive){
381 daPlBase_c *player = (daPlBase_c *) other->getOwner();
382
383 if (player->mSpeed.x >= 0.0f) {
384 mBoyoMng.mDirection = 0;
385 } else {
386 mBoyoMng.mDirection = 1;
387 }
388
389 for (int i = 0; i < PLAYER_COUNT; i++) {
390 dAcPy_c *pl = daPyMng_c::getPlayer(i);
391 if (pl != nullptr && fManager_c::searchBaseByID(pl->mCarryActorID) == this) {
392 pl->cancelCarry(this);
393 break;
394 }
395 }
396 mIceMng.mPlrNo = *player->getPlrNo();
397 mStateMgr.changeToSubState(StateID_Ice);
398 }
399
400 return true;
401}
402
403void dEn_c::setDeadMode(dActor_c *actor, int i) {
404 bool dead = false;
405 if (mDeathInfo.mIsDead || mNoRespawn) {
406 dead = true;
407 }
408 if (dead) {
409 return;
410 }
411 if (isState(StateID_Ice) && mIceMng.mDestroyMode != 0) {
412 return;
413 }
414
415 removeCc();
416 if (i == 1) {
417 setDeathInfo_Smoke(actor);
418 } else {
419 setDeathInfo_SpinFumi(actor, 0);
420
421 static const float cs_effect_offset_x[] = { -6.0f, 6.0f };
422 mVec3_c center = getCenterPos();
423 center.x += cs_effect_offset_x[mDeathInfo.mDirection];
424 hitdamageEffect(center);
425
426 dAudio::SoundEffectID_t(SE_EMY_DOWN).playEmySound(mPos, 0);
427 }
428}
429
430void dEn_c::setDeathInfo_Quake(int i) {
431 mVec3_c center(getCenterX(), getCenterY(), 5500.0f);
432
433 float ySpeed = 2.0f;
434 if (i == 0) {
436 ySpeed = 2.0f;
437 } else if (i == 1) {
439 ySpeed = 3.5f;
440 }
441
442 dEnemyMng_c::m_instance->breakdownSE(dEnemyMng_c::m_instance->m_154, mPos);
443
444 dEnemyMng_c::m_instance->incQuakeComboCount(0);
445
446 int comboScore = mCombo.getQuakeScore(dEnemyMng_c::m_instance->m_154);
447
448 mDeathInfo = (sDeathInfoData) {
449 0.0f,
450 ySpeed,
451 smc_DEADFALL_YSPEED_MAX,
452 smc_DEADFALL_GRAVITY,
453 &StateID_DieFall,
454 comboScore,
455 -1,
458 };
459}
460
461void dEn_c::setDeathInfo_Smoke(dActor_c *actor) {
462 u8 plrNo = mPlayerNo;
463 if (actor != nullptr) {
464 plrNo = *actor->getPlrNo();
465 }
466
467 mDeathInfo = (sDeathInfoData) {
468 0.0f,
469 0.0f,
470 0.0f,
471 0.0f,
472 &StateID_DieSmoke,
473 -1,
474 -1,
475 (u8) -1,
476 plrNo
477 };
478}
479
480void dEn_c::setDeathInfo_Fumi(dActor_c *killedBy, mVec2_c speed, const sStateIDIf_c &id, int) {
481 bool dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
482 u8 plrNo = *killedBy->getPlrNo();
483
484 mDeathInfo = (sDeathInfoData) {
485 speed.x,
486 speed.y,
487 smc_DEADFALL_YSPEED_MAX,
488 smc_DEADFALL_GRAVITY,
489 &id,
490 -1,
491 -1,
492 dir,
493 plrNo
494 };
495}
496
497void dEn_c::setDeathInfo_YoshiFumi(dActor_c *killedBy) {
498 bool dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
499 u8 plrNo = *killedBy->getPlrNo();
500
501 mDeathInfo = (sDeathInfoData) {
502 0.0f,
503 0.0f,
504 0.0f,
505 0.0f,
506 &StateID_DieYoshiFumi,
507 -1,
508 -1,
509 dir,
510 plrNo
511 };
512}
513
514void dEn_c::setDeathInfo_Other(dActor_c *killedBy) {
515 s8 plrNo = -1;
516 if (killedBy != nullptr) {
517 plrNo = *killedBy->getPlrNo();
518 }
519
520 mDeathInfo = (sDeathInfoData) {
521 0.0f,
522 0.0f,
523 0.0f,
524 0.0f,
525 &StateID_DieOther,
526 -1,
527 -1,
528 (u8) -1,
529 (u8) plrNo
530 };
531}
532
533void dEn_c::setDeathInfo_SpinFumi(dActor_c *killedBy, int) {
534 u8 dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
535 u8 plrNo = *killedBy->getPlrNo();
536
537 mDeathInfo = (sDeathInfoData) {
538 l_base_fall_speed_x[dir],
539 smc_DEADFALL_YSPEED,
540 smc_DEADFALL_YSPEED_MAX,
541 smc_DEADFALL_GRAVITY,
542 &StateID_DieFall,
543 -1,
544 -1,
545 dir,
546 plrNo
547 };
548}
549
550void dEn_c::setDeathInfo_IceBreak() {
551 killIce();
552
553 u8 dir = mIceDeathDirection;
554 u8 plrNo = mPlayerNo;
555
556 mDeathInfo = (sDeathInfoData) {
557 l_base_fall_speed_x[dir],
558 smc_DEADFALL_YSPEED,
559 smc_DEADFALL_YSPEED_MAX,
560 smc_DEADFALL_GRAVITY,
561 &StateID_DieFall,
562 -1,
563 -1,
564 dir,
565 plrNo
566 };
567}
568
569void dEn_c::setDeathInfo_IceVanish() {
570 killIce();
571
572 int coinDir = dGameCom::rndInt(2);
573 dActorMng_c::m_instance->createUpCoin(getCenterPos(), coinDir, 1, 0);
574
575 u8 dir = mIceDeathDirection;
576 u8 plrNo = mPlayerNo;
577
578 mDeathInfo = (sDeathInfoData) {
579 0.0f,
580 0.0f,
581 0.0f,
582 0.0f,
583 &StateID_DieIceVanish,
584 -1,
585 -1,
586 dir,
587 plrNo
588 };
589}
590
591void dEn_c::initializeState_DieFumi() {
592 for (int i = 0; i < PLAYER_COUNT; i++) {
593 dAcPy_c *pl = daPyMng_c::getPlayer(i);
594 if (pl != nullptr && fManager_c::searchBaseByID(pl->mCarryActorID) == this) {
595 pl->cancelCarry(this);
596 break;
597 }
598 }
599 removeCc();
600
601 mBc.mFlags = 0;
602 mSpeed.set(mDeathInfo.getXSpeed(), mDeathInfo.getYSpeed(), 0.0f);
603 mSpeedMax.set(0.0f, mDeathInfo.getMaxYSpeed(), 0.0f);
604 mFootAttr3 = 0;
605 mIceDeathDirection = mDeathInfo.mDirection;
606 mAccelF = 0.0f;
607 mAccelY = mDeathInfo.getYAccel();
608
609 if (mAngle.y >= 0) {
610 mDirection = 0;
611 } else {
612 mDirection = 1;
613 }
614 mAngle.y = l_base_angleY[mDirection];
615
616 int score = mDeathInfo.mScore;
617 int plrNo = mDeathInfo.mKilledBy;
618 if (score >= 0) {
619 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
620 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
621 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
622 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
623 }
624 }
625
626 if (mAmiLayer == 1) {
627 mPos.z = -384.0f;
628 } else {
629 mPos.z = 4500.0f;
630 }
631}
632
633void dEn_c::finalizeState_DieFumi() {}
634
635void dEn_c::executeState_DieFumi() {
636 s16 angDelta = smc_DEADFALL_SPINSPEED / 4;
637 if (mInLiquid) {
638 angDelta *= smc_WATER_ROLL_DEC_RATE;
639 }
640 mAngle.x += angDelta;
641 calcSpeedY();
642 posMove();
643 WaterCheck(mPos, 1.0f);
644}
645
646void dEn_c::initializeState_DieFall() {
647 for (int i = 0; i < PLAYER_COUNT; i++) {
648 dAcPy_c *pl = daPyMng_c::getPlayer(i);
649 if (pl != nullptr && fManager_c::searchBaseByID(pl->mCarryActorID) == this) {
650 pl->cancelCarry(this);
651 break;
652 }
653 }
654 removeCc();
655
656 mBc.mFlags = 0;
657 mSpeed.set(mDeathInfo.getXSpeed(), mDeathInfo.getYSpeed(), 0.0f);
658 mSpeedMax.set(0.0f, mDeathInfo.getMaxYSpeed(), 0.0f);
659 mFootAttr3 = 0;
660 mIceDeathDirection = mDeathInfo.mDirection;
661 mAccelF = 0.0f;
662 mAccelY = mDeathInfo.getYAccel();
663
664 if (mAngle.y >= 0) {
665 mDirection = 0;
666 } else {
667 mDirection = 1;
668 }
669 mAngle.y = l_base_angleY[mDirection];
670
671 int score = mDeathInfo.mScore;
672 int plrNo = mDeathInfo.mKilledBy;
673 if (score >= 0) {
674 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
675 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
676 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
677 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
678 }
679 }
680
681 if (mAmiLayer == 1) {
682 mPos.z = -384.0f;
683 } else {
684 mPos.z = 4500.0f;
685 }
686}
687
688void dEn_c::finalizeState_DieFall() {}
689
690void dEn_c::executeState_DieFall() {
691 const static s16 cs_spin_speed[] = { 0x100, -0x100 };
692
693 s16 angDeltaX;
694 s16 angDeltaY;
696 angDeltaX = smc_DEADFALL_SPINSPEED;
697 angDeltaY = -cs_spin_speed[mIceDeathDirection];
698 } else {
699 angDeltaX = -smc_DEADFALL_SPINSPEED;
700 angDeltaY = cs_spin_speed[mIceDeathDirection];
701 }
702 if (mInLiquid) {
703 angDeltaX *= smc_WATER_ROLL_DEC_RATE;
704 }
705 mAngle.x += angDeltaX;
706 mAngle.y += angDeltaY;
707
708 calcSpeedY();
709 posMove();
710 WaterCheck(mPos, 1.0f);
711}
712
713void dEn_c::initializeState_DieBigFall() {
714 initializeState_DieFall();
715}
716
717void dEn_c::finalizeState_DieBigFall() {
718 finalizeState_DieFall();
719}
720
721void dEn_c::executeState_DieBigFall() {
722 mAngle.x += smc_DEADFALL_SPINSPEED;
723 calcSpeedY();
724 posMove();
725 WaterCheck(mPos, 1.0f);
726}
727
728void dEn_c::initializeState_DieSmoke() {
729 mVec3_c pos = getCenterPos();
730 mEf::createEffect("Wm_en_burst_m", 0, &pos, nullptr, nullptr);
731 removeCc();
732}
733
734void dEn_c::finalizeState_DieSmoke() {}
735
736void dEn_c::executeState_DieSmoke() {
737 deleteActor(1);
738}
739
740void dEn_c::initializeState_DieIceVanish() {
741 removeCc();
742
743 int score = mDeathInfo.mScore;
744 int plrNo = mDeathInfo.mKilledBy;
745 if (score >= 0) {
746 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
747 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
748 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
749 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
750 }
751 }
752}
753
754void dEn_c::finalizeState_DieIceVanish() {}
755
756void dEn_c::executeState_DieIceVanish() {
757 deleteActor(1);
758}
759
760void dEn_c::initializeState_DieYoshiFumi() {
761 mVec3_c pos = getCenterPos();
762 mEf::createEffect("Wm_mr_yoshistep", 0, &pos, nullptr, nullptr);
763 removeCc();
764}
765
766void dEn_c::finalizeState_DieYoshiFumi() {}
767
768void dEn_c::executeState_DieYoshiFumi() {
769 deleteActor(1);
770}
771
772void dEn_c::initializeState_DieGoal() {}
773
774void dEn_c::finalizeState_DieGoal() {}
775
776void dEn_c::executeState_DieGoal() {}
777
778void dEn_c::initializeState_DieOther() {
779 deleteActor(1);
780}
781
782void dEn_c::finalizeState_DieOther() {}
783
784void dEn_c::executeState_DieOther() {}
785
786void dEn_c::setDeathSound_Fire() {
787 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN, mPos, 0);
788}
789
790void dEn_c::setDeathSound_HipAttk() {
791 if (mFlags & EN_IS_HARD) {
792 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_H, mPos, 0);
793 } else {
794 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_S, mPos, 0);
795 }
796}
797
798void dEn_c::setDeathSound_Slip(dActor_c *killedBy) {
799 const static dAudio::SoundEffectID_t cs_combo_se[] = {
800 SE_EMY_DOWN_COMBO_1,
801 SE_EMY_DOWN_COMBO_2,
802 SE_EMY_DOWN_COMBO_3,
803 SE_EMY_DOWN_COMBO_4,
804 SE_EMY_DOWN_COMBO_5,
805 SE_EMY_DOWN_COMBO_6,
806 SE_EMY_DOWN_COMBO_7,
807 SE_EMY_DOWN_COMBO_7,
808 SE_EMY_DOWN_COMBO_7
809 };
810
811 int count = ((daPlBase_c *) killedBy)->m_cee;
812 if (count >= ARRAY_SIZE(cs_combo_se)) {
813 count = ARRAY_SIZE(cs_combo_se) - 1;
814 };
815 if (checkComboClap(count)) {
817 }
818
819 cs_combo_se[count].playEmySound(getCenterPos(), 0);
820}
821
822void dEn_c::setDeathSound_Spin() {
823 if (mFlags & EN_IS_HARD) {
824 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_H, mPos, 0);
825 } else {
826 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_S, mPos, 0);
827 }
828}
829
830void dEn_c::setDeathSound_Rolling() {}
static void SetVsHitEffect(mVec3_c *)
bool isState(const sStateIDIf_c &other) const
Checks if the actor is currently in the given state.
sFStateStateMgr_c< dActorMultiState_c, sStateMethodUsr_FI_c, sStateMethodUsr_FI_c > mStateMgr
The state manager.
The minimum required implementation for a stage actor.
Definition d_actor.hpp:15
void deleteActor(u8 deleteForever)
Deletes the actor and optionally disables respawn.
Definition d_actor.cpp:355
void slideComboSE(int multiplier, bool shortCombo)
Plays the combo kill sound effect.
Definition d_actor.cpp:700
bool mNoRespawn
Whether the actor should not respawn after being deleted.
Definition d_actor.hpp:378
dBc_c mBc
The actor-to-tile collision sensor.
Definition d_actor.hpp:342
static bool getTrgToSrcDir_Main(float trgX, float srcX)
See getTrgToSrcDirFunc.
Definition d_actor.cpp:276
u8 mAmiLayer
The actor's layer for chainlink fences.
Definition d_actor.hpp:379
u8 mDirection
The actor's facing direction.
Definition d_actor.hpp:351
virtual void removeCc()
Disables the actor's collision.
Definition d_actor.cpp:800
int mComboMultiplier
The current combo multiplier obtained by the actor by colliding with other actors.
Definition d_actor.hpp:335
s8 mPlayerNo
The player associated with the actor, -1 if not associated to any player.
Definition d_actor.hpp:375
virtual s8 * getPlrNo()
Gets the player number associated with the actor. See mPlayerNo.
Definition d_actor.hpp:105
float mAccelF
The actor's horizontal acceleration.
mVec3_c mSpeed
The actor's speed.
mVec3_c mPos
The actor's position.
mVec3_c mSpeedMax
The actor's maximum speed.
void posMove()
Moves the actor by its speed.
mVec3_c getCenterPos() const
Gets the actor's centered position.
mAng3_c mAngle
The actor's rotation (for 2D actors).
float mAccelY
The actor's vertical acceleration.
void calcSpeedY()
Updates the actor's Y speed. See here for details.
Collider ("Collision Check") class - handles collisions between actors.
Definition d_cc.hpp:111
mVec2_c mCollPos
The position where the last collision occurred.
Definition d_cc.hpp:289
dActor_c * getOwner() const
Gets the owner actor of this collider.
Definition d_cc.hpp:156
static const u8 smc_UNKNOWN_HIT
Definition d_enemy.hpp:57
An enemy actor. Note that the definition of "enemy" in this context is actually any interactible stag...
Definition d_enemy.hpp:88
u8 mIceDeathDirection
The X direction to move towards on ice death.
Definition d_enemy.hpp:277
void WaterCheck(mVec3_c &pos, float h)
Definition d_enemy.cpp:729
dDeathInfo_c mDeathInfo
The parameters for the death animation.
Definition d_enemy.hpp:270
dIceMng_c mIceMng
The ice manager for this enemy.
Definition d_enemy.hpp:285
dEnCombo_c mCombo
The enemy combo manager.
Definition d_enemy.hpp:299
u32 mFlags
Flags for this actor. See FLAGS_e.
Definition d_enemy.hpp:289
bool mInLiquid
Whether the enemy is in a liquid.
Definition d_enemy.hpp:281
virtual bool checkComboClap(int max)
Definition d_enemy.cpp:544
void setClapSE()
Plays the clap sound effect.
static dMultiMng_c * mspInstance
The instance of this class.
static fBase_c * searchBaseByID(fBaseID_e id)
Searches for a base with the given ID.
Definition f_manager.cpp:18
A two-dimensional floating point vector.
Definition m_vec.hpp:16
The interface for state IDs.
#define STATE_VIRTUAL_DEFINE(class, name)
Defines a virtual state.
Definition s_State.hpp:46