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.m_0c == 0){
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 && (!isState(StateID_Ice) || mIceMng.m_18 == 0)) {
409 removeCc();
410 if (i == 1) {
411 setDeathInfo_Smoke(actor);
412 } else {
413 setDeathInfo_SpinFumi(actor, 0);
414
415 static const float cs_effect_offset_x[] = { -6.0f, 6.0f };
416 mVec3_c center = getCenterPos();
417 center.x += cs_effect_offset_x[mDeathInfo.mDirection];
418 hitdamageEffect(center);
419
420 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN, mPos, 0);
421 }
422 }
423}
424
425void dEn_c::setDeathInfo_Quake(int i) {
426 mVec3_c center(getCenterX(), getCenterY(), 5500.0f);
427
428 float ySpeed = 2.0f;
429 if (i == 0) {
431 ySpeed = 2.0f;
432 } else if (i == 1) {
434 ySpeed = 3.5f;
435 }
436
437 dEnemyMng_c::m_instance->breakdownSE(dEnemyMng_c::m_instance->m_154, mPos);
438
439 dEnemyMng_c::m_instance->incQuakeComboCount(0);
440
441 int comboScore = mCombo.getQuakeScore(dEnemyMng_c::m_instance->m_154);
442
443 mDeathInfo = (sDeathInfoData) {
444 0.0f,
445 ySpeed,
446 smc_DEADFALL_YSPEED_MAX,
447 smc_DEADFALL_GRAVITY,
448 &StateID_DieFall,
449 comboScore,
450 -1,
453 };
454}
455
456void dEn_c::setDeathInfo_Smoke(dActor_c *actor) {
457 u8 plrNo = mPlayerNo;
458 if (actor != nullptr) {
459 plrNo = *actor->getPlrNo();
460 }
461
462 mDeathInfo = (sDeathInfoData) {
463 0.0f,
464 0.0f,
465 0.0f,
466 0.0f,
467 &StateID_DieSmoke,
468 -1,
469 -1,
470 (u8) -1,
471 plrNo
472 };
473}
474
475void dEn_c::setDeathInfo_Fumi(dActor_c *killedBy, mVec2_c speed, const sStateIDIf_c &id, int) {
476 bool dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
477 u8 plrNo = *killedBy->getPlrNo();
478
479 mDeathInfo = (sDeathInfoData) {
480 speed.x,
481 speed.y,
482 smc_DEADFALL_YSPEED_MAX,
483 smc_DEADFALL_GRAVITY,
484 &id,
485 -1,
486 -1,
487 dir,
488 plrNo
489 };
490}
491
492void dEn_c::setDeathInfo_YoshiFumi(dActor_c *killedBy) {
493 bool dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
494 u8 plrNo = *killedBy->getPlrNo();
495
496 mDeathInfo = (sDeathInfoData) {
497 0.0f,
498 0.0f,
499 0.0f,
500 0.0f,
501 &StateID_DieYoshiFumi,
502 -1,
503 -1,
504 dir,
505 plrNo
506 };
507}
508
509void dEn_c::setDeathInfo_Other(dActor_c *killedBy) {
510 s8 plrNo = -1;
511 if (killedBy != nullptr) {
512 plrNo = *killedBy->getPlrNo();
513 }
514
515 mDeathInfo = (sDeathInfoData) {
516 0.0f,
517 0.0f,
518 0.0f,
519 0.0f,
520 &StateID_DieOther,
521 -1,
522 -1,
523 (u8) -1,
524 (u8) plrNo
525 };
526}
527
528void dEn_c::setDeathInfo_SpinFumi(dActor_c *killedBy, int) {
529 u8 dir = killedBy->getTrgToSrcDir_Main(getCenterX(), killedBy->getCenterX());
530 u8 plrNo = *killedBy->getPlrNo();
531
532 mDeathInfo = (sDeathInfoData) {
533 l_base_fall_speed_x[dir],
534 smc_DEADFALL_YSPEED,
535 smc_DEADFALL_YSPEED_MAX,
536 smc_DEADFALL_GRAVITY,
537 &StateID_DieFall,
538 -1,
539 -1,
540 dir,
541 plrNo
542 };
543}
544
545void dEn_c::setDeathInfo_IceBreak() {
546 killIce();
547
548 u8 dir = mIceDeathDirection;
549 u8 plrNo = mPlayerNo;
550
551 mDeathInfo = (sDeathInfoData) {
552 l_base_fall_speed_x[dir],
553 smc_DEADFALL_YSPEED,
554 smc_DEADFALL_YSPEED_MAX,
555 smc_DEADFALL_GRAVITY,
556 &StateID_DieFall,
557 -1,
558 -1,
559 dir,
560 plrNo
561 };
562}
563
564void dEn_c::setDeathInfo_IceVanish() {
565 killIce();
566
567 int coinDir = dGameCom::rndInt(2);
568 dActorMng_c::m_instance->createUpCoin(getCenterPos(), coinDir, 1, 0);
569
570 u8 dir = mIceDeathDirection;
571 u8 plrNo = mPlayerNo;
572
573 mDeathInfo = (sDeathInfoData) {
574 0.0f,
575 0.0f,
576 0.0f,
577 0.0f,
578 &StateID_DieIceVanish,
579 -1,
580 -1,
581 dir,
582 plrNo
583 };
584}
585
586void dEn_c::initializeState_DieFumi() {
587 for (int i = 0; i < PLAYER_COUNT; i++) {
588 dAcPy_c *pl = daPyMng_c::getPlayer(i);
589 if (pl != nullptr && fManager_c::searchBaseByID(pl->mCarryActorID) == this) {
590 pl->cancelCarry(this);
591 break;
592 }
593 }
594 removeCc();
595
596 mBc.mFlags = 0;
597 mSpeed.set(mDeathInfo.getXSpeed(), mDeathInfo.getYSpeed(), 0.0f);
598 mSpeedMax.set(0.0f, mDeathInfo.getMaxYSpeed(), 0.0f);
599 mFootAttr3 = 0;
600 mIceDeathDirection = mDeathInfo.mDirection;
601 mAccelF = 0.0f;
602 mAccelY = mDeathInfo.getYAccel();
603
604 if (mAngle.y >= 0) {
605 mDirection = 0;
606 } else {
607 mDirection = 1;
608 }
609 mAngle.y = l_base_angleY[mDirection];
610
611 int score = mDeathInfo.mScore;
612 int plrNo = mDeathInfo.mKilledBy;
613 if (score >= 0) {
614 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
615 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
616 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
617 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
618 }
619 }
620
621 if (mAmiLayer == 1) {
622 mPos.z = -384.0f;
623 } else {
624 mPos.z = 4500.0f;
625 }
626}
627
628void dEn_c::finalizeState_DieFumi() {}
629
630void dEn_c::executeState_DieFumi() {
631 s16 angDelta = smc_DEADFALL_SPINSPEED / 4;
632 if (mInLiquid) {
633 angDelta *= smc_WATER_ROLL_DEC_RATE;
634 }
635 mAngle.x += angDelta;
636 calcSpeedY();
637 posMove();
638 WaterCheck(mPos, 1.0f);
639}
640
641void dEn_c::initializeState_DieFall() {
642 for (int i = 0; i < PLAYER_COUNT; i++) {
643 dAcPy_c *pl = daPyMng_c::getPlayer(i);
644 if (pl != nullptr && fManager_c::searchBaseByID(pl->mCarryActorID) == this) {
645 pl->cancelCarry(this);
646 break;
647 }
648 }
649 removeCc();
650
651 mBc.mFlags = 0;
652 mSpeed.set(mDeathInfo.getXSpeed(), mDeathInfo.getYSpeed(), 0.0f);
653 mSpeedMax.set(0.0f, mDeathInfo.getMaxYSpeed(), 0.0f);
654 mFootAttr3 = 0;
655 mIceDeathDirection = mDeathInfo.mDirection;
656 mAccelF = 0.0f;
657 mAccelY = mDeathInfo.getYAccel();
658
659 if (mAngle.y >= 0) {
660 mDirection = 0;
661 } else {
662 mDirection = 1;
663 }
664 mAngle.y = l_base_angleY[mDirection];
665
666 int score = mDeathInfo.mScore;
667 int plrNo = mDeathInfo.mKilledBy;
668 if (score >= 0) {
669 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
670 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
671 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
672 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
673 }
674 }
675
676 if (mAmiLayer == 1) {
677 mPos.z = -384.0f;
678 } else {
679 mPos.z = 4500.0f;
680 }
681}
682
683void dEn_c::finalizeState_DieFall() {}
684
685void dEn_c::executeState_DieFall() {
686 const static s16 cs_spin_speed[] = { 0x100, -0x100 };
687
688 s16 angDeltaX;
689 s16 angDeltaY;
691 angDeltaX = smc_DEADFALL_SPINSPEED;
692 angDeltaY = -cs_spin_speed[mIceDeathDirection];
693 } else {
694 angDeltaX = -smc_DEADFALL_SPINSPEED;
695 angDeltaY = cs_spin_speed[mIceDeathDirection];
696 }
697 if (mInLiquid) {
698 angDeltaX *= smc_WATER_ROLL_DEC_RATE;
699 }
700 mAngle.x += angDeltaX;
701 mAngle.y += angDeltaY;
702
703 calcSpeedY();
704 posMove();
705 WaterCheck(mPos, 1.0f);
706}
707
708void dEn_c::initializeState_DieBigFall() {
709 initializeState_DieFall();
710}
711
712void dEn_c::finalizeState_DieBigFall() {
713 finalizeState_DieFall();
714}
715
716void dEn_c::executeState_DieBigFall() {
717 mAngle.x += smc_DEADFALL_SPINSPEED;
718 calcSpeedY();
719 posMove();
720 WaterCheck(mPos, 1.0f);
721}
722
723void dEn_c::initializeState_DieSmoke() {
724 mVec3_c pos = getCenterPos();
725 mEf::createEffect("Wm_en_burst_m", 0, &pos, nullptr, nullptr);
726 removeCc();
727}
728
729void dEn_c::finalizeState_DieSmoke() {}
730
731void dEn_c::executeState_DieSmoke() {
732 deleteActor(1);
733}
734
735void dEn_c::initializeState_DieIceVanish() {
736 removeCc();
737
738 int score = mDeathInfo.mScore;
739 int plrNo = mDeathInfo.mKilledBy;
740 if (score >= 0) {
741 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
742 dScoreMng_c::m_instance->ScoreSet(this, score, plrNo, dScoreMng_c::smc_SCORE_X, dScoreMng_c::smc_SCORE_Y);
743 } else if (plrNo == dDeathInfo_c::smc_UNKNOWN_HIT) {
744 dScoreMng_c::m_instance->UnKnownScoreSet(this, score, 0.0f, 24.0f);
745 }
746 }
747}
748
749void dEn_c::finalizeState_DieIceVanish() {}
750
751void dEn_c::executeState_DieIceVanish() {
752 deleteActor(1);
753}
754
755void dEn_c::initializeState_DieYoshiFumi() {
756 mVec3_c pos = getCenterPos();
757 mEf::createEffect("Wm_mr_yoshistep", 0, &pos, nullptr, nullptr);
758 removeCc();
759}
760
761void dEn_c::finalizeState_DieYoshiFumi() {}
762
763void dEn_c::executeState_DieYoshiFumi() {
764 deleteActor(1);
765}
766
767void dEn_c::initializeState_DieGoal() {}
768
769void dEn_c::finalizeState_DieGoal() {}
770
771void dEn_c::executeState_DieGoal() {}
772
773void dEn_c::initializeState_DieOther() {
774 deleteActor(1);
775}
776
777void dEn_c::finalizeState_DieOther() {}
778
779void dEn_c::executeState_DieOther() {}
780
781void dEn_c::setDeathSound_Fire() {
782 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN, mPos, 0);
783}
784
785void dEn_c::setDeathSound_HipAttk() {
786 if (mFlags & EN_IS_HARD) {
787 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_H, mPos, 0);
788 } else {
789 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_S, mPos, 0);
790 }
791}
792
793void dEn_c::setDeathSound_Slip(dActor_c *killedBy) {
794 const static dAudio::SoundEffectID_t cs_combo_se[] = {
795 SE_EMY_DOWN_COMBO_1,
796 SE_EMY_DOWN_COMBO_2,
797 SE_EMY_DOWN_COMBO_3,
798 SE_EMY_DOWN_COMBO_4,
799 SE_EMY_DOWN_COMBO_5,
800 SE_EMY_DOWN_COMBO_6,
801 SE_EMY_DOWN_COMBO_7,
802 SE_EMY_DOWN_COMBO_7,
803 SE_EMY_DOWN_COMBO_7
804 };
805
806 int count = ((daPlBase_c *) killedBy)->m_cee;
807 if (count >= ARRAY_SIZE(cs_combo_se)) {
808 count = ARRAY_SIZE(cs_combo_se) - 1;
809 };
810 if (checkComboClap(count)) {
812 }
813
814 cs_combo_se[count].playEmySound(getCenterPos(), 0);
815}
816
817void dEn_c::setDeathSound_Spin() {
818 if (mFlags & EN_IS_HARD) {
819 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_H, mPos, 0);
820 } else {
821 dAudio::g_pSndObjEmy->startSound(SE_EMY_DOWN_HPDP_S, mPos, 0);
822 }
823}
824
825void 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:274
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:267
dIceMng_c mIceMng
The ice manager for this enemy.
Definition d_enemy.hpp:282
dEnCombo_c mCombo
The enemy combo manager.
Definition d_enemy.hpp:296
u32 mFlags
Flags for this actor. See FLAGS_e.
Definition d_enemy.hpp:286
bool mInLiquid
Whether the enemy is in a liquid.
Definition d_enemy.hpp:278
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