New Super Mario Bros. U Headers
Loading...
Searching...
No Matches
Enemy.h
Go to the documentation of this file.
1#pragma once
2
3#include <actor/ActorState.h>
4#include <audio/GameAudio.h>
5#include <enemy/Combo.h>
6#include <enemy/EnemyChibiYoshiAwaData.h>
7#include <enemy/EnemyDeathInfo.h>
8#include <enemy/IceMgr.h>
9#include <player/PlayerEnum.h>
10#include <state/FStateVirtualID.h>
11
15
16constexpr f32 ENEMY_FUMI_JUMP_SPEED = 0.2815f;
17
18// TODO: Move to own header
19class Enemy;
20
22{
23public:
24 FumiCcInfo(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other)
27 {
28 }
29
30 // Address: 0x023311B4
32
33private:
36};
37
39{
40public:
41 virtual bool operate(bool&, Enemy*, FumiCcInfo&) = 0;
42};
43static_assert(sizeof(UniqueFumiCheckInf) == 4);
44
46{
47public:
48 EnemyFumiCheck(Enemy* enemy, UniqueFumiCheckInf* fumi_check_inf)
49 : mEnemy(enemy)
50 , mFumiCheckInf(fumi_check_inf)
51 , mFumiRevType(0)
52 {
53 }
54
55 void setFumiRevType(u8 type)
56 {
57 mFumiRevType = type;
58 }
59
60private:
64};
65static_assert(sizeof(EnemyFumiCheck) == 0xC);
66
67/**
68* @brief Defines the classification of player-enemy stomp and collision interactions.
69* @note "Fumi" (踏み) translates to "stomp" in Japanese.
70*/
72{
73 cFumiType_Hit = 0, ///< **Lateral Impact:** Moving into the enemy (also includes penguin slides & slope slides).
74 cFumiType_Fumi, ///< **Standard Stomp:** Jumping onto the enemy (e.g. normal jumps, ground pounds).
75 cFumiType_MameFumi, ///< **Mini Stomp:** Jumping onto the enemy as Mini ("Mame") Mario. Also includes Mini Mario's spin-jump.
76 cFumiType_SpinFumi ///< **Spin Stomp:** Spin-jumping onto the enemy. Also includes Propeller Mario drills.
77};
78
80{
81public:
82 EnemyFumiProc(Enemy* enemy, UniqueFumiCheckInf* fumi_check_inf)
84 {
85 }
86
87 void setFumiRevType(u8 type)
88 {
89 mFumiCheck.setFumiRevType(type);
90 }
91
92 // Address: 0x0232F818
94
95 FumiType operate(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other)
96 {
97 FumiCcInfo info(cc_self, cc_other);
98 return operate(info);
99 }
100
101private:
103};
104static_assert(sizeof(EnemyFumiProc) == 0xC);
105
107{
109
110public:
111 static UniqueFumiCheckInf* instance() { return &sInstance; }
112
113public:
114 bool operate(bool&, Enemy*, FumiCcInfo&) override;
115};
116static_assert(sizeof(NonUniqueFumiCheck) == sizeof(UniqueFumiCheckInf));
117
119{
120public:
122 {
123 mTime.fill(0);
124 }
125
126 // Address: 0x0232B188
127 void update();
128
129 void reset(s32 player_no, u16 initial_time)
130 {
131 mTime[player_no] = initial_time;
132 }
133
134 u16 getTime(s32 player_no) const
135 {
136 return mTime[player_no];
137 }
138
139 bool isOver(s32 player_no) const
140 {
141 return getTime(player_no) == 0;
142 }
143
144private:
146};
147static_assert(sizeof(EnemyCounter) == 8);
148
150
151class Enemy : public ActorMultiState // vtbl Address: 0x1007209C
152{
153 // getRuntimeTypeInfoStatic()::typeInfo initialization guard variable Address: 0x101E9EEC
154 // getRuntimeTypeInfoStatic()::typeInfo Address: 0x101E9EF0
155 SEAD_RTTI_OVERRIDE(Enemy, ActorMultiState)
156
157public:
159
160 // Address: 0x10072064
162
163 // Address: 0x1007206C
164 static const f32 cFumiJumpSpeed;
165 // Address: 0x10072070
166 static const f32 cDefaultGravity;
167 // Address: 0x10072074
169 // Address: 0x10072078
171 // Address: 0x1007207C
172 static const f32 cDefaultMaxSpeedF;
173 // Address: 0x10072080
174 static const f32 cDefaultMaxSpeedY;
175
176 // Address: 0x10072084
177 static const f32 cWaterGravity;
178 // Address: 0x10072088
179 static const f32 cWaterBoundSpeedY;
180 // Address: 0x1007208C
182 // Address: 0x10072090
183 static const f32 cWaterRollDecRate;
184
185 /**
186 * @brief Maps a 2D direction to a "facing" Y-angle.
187 * @details Applies a slight rotational bias towards the camera that prevents the actor from facing perfectly perpendicular to the viewer.
188 * This ensures actors remain visually clear and recognizable when facing either direction.
189 * @warning Only indexable with `cDirType_Right` and `cDirType_Left`. Anything else is out of bounds.
190 * @endcode
191 * ---
192 * Address: 0x10200DD8
193 */
195 // Address: 0x10200DE0
197
198 /**
199 * @brief Maps a 2D direction to a sign multiplier (`1` or `-1`).
200 * @details Useful for compacting ternaries for left/right->negative/positive into a multiplication operation.
201 * @code{.cpp}
202 * // Instead of branching:
203 * float speed = (mDirection == cDirType_Right) ? 2.0f : -2.0f;
204 * // Use multiplication:
205 * float speed = cEnMuki[mDirection] * 2.0f;
206 * @endcode
207 * @warning Only indexable with `cDirType_Right` and `cDirType_Left`. Anything else is out of bounds.
208 * @endcode
209 * ---
210 * Address: 0x10072094
211 */
212 static const s8 cEnMuki[cDirType_NumX];
213
214 // Address: 0x10200DE8
216
217public:
219 {
220 return 1.125f;
221 }
222
223public:
230
232 {
235 cEnFlag_9 = 1 << 9, // Immune to penguin slide?
236 cEnFlag_16 = 1 << 16,
238 };
239
246 static_assert(cQuakeDeathType_Num == 2);
247
248public:
249 // Address: 0x02328494
250 Enemy(const ActorCreateParam& param);
251
252protected:
253 // Address: 0x02328644
255
256 // Address: 0x02328914
258
259public:
261 {
262 return mDeathInfo;
263 }
264
265public:
266 // Address: 0x02330404
267 void changeState(const StateID& state_id) override;
268
269 // Address: 0x02328608
271
272 // Address: 0x02328AEC
273 bool area_XY_check(f32 x, f32 y);
274
275 virtual bool vf18C() // is not carryable?
276 {
277 return false;
278 }
279
280 // Address: 0x0232A850
282
283 // Address: 0x02328B84
284 virtual bool setDamage(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
285
286 // Address: 0x02328C50
288
289 // Address: 0x02328C24
290 static bool ceilCheck(f32 pos_y, ActorCollisionCheck* cc);
291
292 // Address: 0x0232910C
293 virtual bool checkComboClap(s32 combo_cnt);
294
295 // Address: 0x02329130
296 s32 calcComboPlFumiCnt(Actor* player);
297
298 // Address: 0x02329168
299 void bound(f32 eps_y, f32 scale_x, f32 scale_y);
300
301 // Address: 0x0232CAEC
302 bool isDead() const;
303 // Address: 0x0232CCE8
304 void setDeadMode(Actor* actor);
305
306 // Address: 0x0232CE28
308
309 /**
310 * @brief Callback for spawning ice blocks when frozen by an ice flower.
311 * @return Forward the return value of the `createIce()` method call.
312 * @details Implement this function by calling `mIceMgr.createIce()` with your custom `IceInfo`.
313 * @endcode
314 * ---
315 * Address: 0x023304F8
316 */
317 virtual bool createIceActor();
318 // Address: 0x023310BC
319 virtual void setIceAnm();
320 // Address: 0x023310C0
321 virtual void returnAnm_Ice();
322 // Address: 0x02330568
323 virtual void returnState_Ice();
324
325 void killIce()
326 {
327 mIceMgr.removeIce();
328 }
329
330 // Address: 0x0232A858
331 virtual void calcMdl_Base();
332
333 // Address: 0x023291DC
334 void calcMdl_Normal(); // Calls calcMdl_Base is not currently frozen
335
336 // Address: 0x0232A85C
337 virtual bool vf1CC(); // Maybe related to the below?
338
339 // Address: 0x023291F8
341 // Address: 0x02329250
343 // Address: 0x02329520
344 virtual bool enemyPreDamageCheck(bool* dead, ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
345 // Address: 0x02329578
346 virtual void hitYoshiEat(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
347 // Address: 0x0232957C
349 // Address: 0x023296E8
351 // Address: 0x02329800
352 virtual bool etcDamageCheck(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
353
354 // Address: 0x023299F0
356 // Address: 0x023299F4
358 // Address: 0x02329A04
360 // Address: 0x02329A08
362
363 // Address: 0x0232CE84
365 // Address: 0x0232CF20
367 // Address: 0x0232D014
369 // Address: 0x0232D0E4
371 // Address: 0x0232D240
373 // Address: 0x0232D3B4
375 // Address: 0x0232D48C
377 // Address: 0x0232D49C
379 // Address: 0x0232D56C
380 virtual bool hitCallback_AttackUnk25(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other); // Player slip 2
381 // Address: 0x0232D57C
383 // Address: 0x0232D70C
385 // Address: 0x0232D7A4
386 virtual bool hitCallback_Ice(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
387 // Address: 0x0232D824
389 // Address: 0x0232D938
391 // Address: 0x0232DA04
393 // Address: 0x0232DA0C
395 // Address: 0x0232DA14
397
398 // Address: 0x0232DA24
399 virtual bool hitCallback_AttackUnk27(bool* dead, ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
400
401 // Address: 0x0232DA34
402 void setDeathInfo_Fumi(Actor* player, const sead::Vector2f& speed, const StateID& state_id);
403
404 void setDeathInfo_Fumi(Actor* player, const sead::Vector2f& speed)
405 {
406 setDeathInfo_Fumi(player, speed, StateID_DieFumi);
407 }
408
409 void setDeathInfo_FumiFall(Actor* player, const sead::Vector2f& speed)
410 {
411 setDeathInfo_Fumi(player, speed, StateID_DieFall);
412 }
413
414 void setDeathInfo_FumiOther(Actor* player, const sead::Vector2f& speed)
415 {
416 setDeathInfo_Fumi(player, speed, StateID_DieOther);
417 }
418
419 // Address: 0x0232CBA4
420 void setDeathInfo_Fall(DirType direction, s32 player_no = -1, ScoreMgr::ScoreType score_type = ScoreMgr::cScoreType_Invalid);
421 // Address: 0x0232CB08
422 void setDeathInfo_Fall(const sead::Vector2f* speeds, DirType direction, s32 player_no = -1, ScoreMgr::ScoreType score_type = ScoreMgr::cScoreType_Invalid);
423
424 // Address: 0x0232DAF0
426
427 // Address: 0x0232CC98
428 void setDeathInfo_SpinFumi(Actor* player);
429 // Address: 0x0232D31C
430 void setDeathInfo_YoshiFumi(Actor* player);
431
432protected:
433 // Address: 0x0232DC88
434 void setSmokeDamage_(Actor* actor) override;
435
436public:
437 // Address: 0x0232DD48
438 virtual void setDeathInfo_IceBreak();
439 // Address: 0x0232DD90
441
442 // Address: 0x0232DE90
443 void setDeathInfo_Other(Actor* actor);
444
445 // Address: 0x0232DF14
447
448 // Address: 0x0232E048
450
451 // Address: 0x0232E144
453
454protected:
455 // Address: 0x0232E1A4
456 bool setTouchDrcDamage_(const sead::Vector3f& pos) override;
457
458public:
459 /**
460 * @return Enemy is on ground and can be damaged by quake (e.g. POW block).
461 * @endcode
462 * ---
463 * Address: 0x0232E2EC
464 */
465 virtual bool isQuakeDamage();
466
467 // Address: 0x0232E2F8
468 virtual void setDeathSound_Fire();
469 // Address: 0x0232E358
470 virtual void setDeathSound_HipAttk();
471 // Address: 0x0232CE94
472 void setDeathSound_Slip(Actor* player);
473
474 // Address: 0x0232E3FC
476
477 // Address: 0x0232E4A8
478 void setDeathInfo_Awa(Actor* awa);
479
480 // Address: 0x0232D694
481 void createUpCoin(DirType dir);
482
483 static void fireballInvalid(ActorCollisionCheck* cc_other) // Inline in NSMBU, but not NSMBW
484 {
485 GameAudio::getAudioObjMap()->startSound("SE_OBJ_FIREBALL_DISAPP", cc_other->getOwner()->getPos());
486 }
487
488 // Address: 0x02329A0C
489 static void iceballInvalid(ActorCollisionCheck* cc_other);
490
491 /**
492 * @brief Process a collision with a player and return which type occurred.
493 * @param se_type Which type of sounds/particles to play for this collision.
494 * @endcode
495 * ---
496 * Address: 0x02329B88
497 */
499
500 void spinFumiJumpSet(Actor* player)
501 {
502 fumiJumpSet(player);
503 }
504
505 // Address: 0x02329B6C
506 void spinFumiScoreSet(Actor* player);
507
508 // Address: 0x02329EA4
509 virtual void fumiJumpSet(Actor* player);
510 // Address: 0x02329FA8
511 virtual void fumiScoreSet(Actor* player);
512
513 // Address: 0x02329FAC
514 virtual void yoshiFumiJumpSet(Actor* player);
515 // Address: 0x02329FB0
516 virtual void yoshiFumiScoreSet(Actor* player);
517
518 // Address: 0x02329FC0
519 virtual void mameFumiJumpSet(Actor* player);
520
521 // Address: 0x02329E54
522 static void playerFumiJump(Actor* player, f32 speed_y);
523
524 // Address: 0x02329EC0
525 void setFumiComboScore(Actor* player);
526
528 {
529 setFumiSound("SE_EMY_CMN_STEP");
530 }
531
532 // Address: 0x0232A094
533 virtual void fumiSE(Actor* player);
534 // Address: 0x0232A118
535 virtual void fumiEffect(Actor* player);
536
538 {
540 }
541
542 // Address: 0x0232A1BC
543 virtual void spinfumiSE(Actor* player);
544 // Address: 0x02329B20
545 void spinfumiEffect(Actor* player); // No longer virtual...
546
548 {
549 setFumiSound("SE_EMY_MAME_STEP");
550 }
551
552 // Address: 0x0232A240
553 virtual void mamefumiSE();
554 // Address: 0x0232A24C
555 virtual void mamefumiEffect(Actor* player);
556
558 {
559 setFumiSound("SE_EMY_YOSHI_STEP");
560 }
561
562 // Address: 0x0232A250
563 virtual void yoshifumiSE(Actor* player);
564 // void yoshifumiEffect(Actor* player); // Deleted from NSMBU
565
566 // Address: 0x02329AA8
567 void setFumiSound(const char* label);
568 // Address: 0x0232A008
569 void setFumiSound(s32 combo_cnt, const GameAudio::SoundID combo_se[], u32 combo_max);
570 // Address: 0x0232A088
571 void setFumiSound(Actor* player, const GameAudio::SoundID combo_se[], u32 combo_max);
572
573 // Address: 0x023288BC
574 void hitdamageEffect(const sead::Vector3f& pos);
575
576 void hitdamageEffect(const sead::Vector2f& pos)
577 {
578 hitdamageEffect(sead::Vector3f(pos, 0.0f));
579 }
580
581 // Address: 0x0232A2D4
582 virtual void hipatkEffect(const sead::Vector3f& effect_pos);
583
584 // Address: 0x0232A2E4
585 virtual void setQuakeJump(); // Adds 2.0f to y speed
586
587 /**
588 * @return Enemy is inside the camera view.
589 * @endcode
590 * ---
591 * Address: 0x0232A2FC
592 */
593 virtual bool checkDispIn();
594
595 // Address: 0x0232A364
596 virtual void setAwaHit(Actor* awa); // Callback for ChibiYoshiAwaData
597 // Address: 0x0232A418
598 virtual void awaCatchMove(Actor* awa); // ^^^
599 // Address: 0x0232A4CC
600 virtual void setAwaCatchEnd(Actor* awa); // ^^^
601 // Address: 0x0232A864
602 virtual void setAwaInvalid(Actor* awa); // ^^^
603
604 // ------------------------------------ EnemyDeath.cpp ------------------------------------ //
605
606 // StateID_DieFumi Address: 0x10200FB0
607 // initializeState_DieFumi Address: 0x0232E518
608 // executeState_DieFumi Address: 0x0232E5E8
609 // finalizeState_DieFumi Address: 0x0232EED0
610 DECLARE_STATE_VIRTUAL_ID_BASE(Enemy, DieFumi)
611 // StateID_DieFall Address: 0x10200FD4
612 // initializeState_DieFall Address: 0x0232E63C
613 // executeState_DieFall Address: 0x0232E640
614 // finalizeState_DieFall Address: 0x0232EED4
616 // StateID_DieYoshiFumi Address: 0x10200FF8
617 // initializeState_DieYoshiFumi Address: 0x0232E72C
618 // executeState_DieYoshiFumi Address: 0x0232E79C
619 // finalizeState_DieYoshiFumi Address: 0x0232EED8
621 // StateID_DieSmoke Address: 0x1020101C
622 // initializeState_DieSmoke Address: 0x0232E7A8
623 // executeState_DieSmoke Address: 0x0232E7B8
624 // finalizeState_DieSmoke Address: 0x0232EEDC
626 // StateID_DieIceVanish Address: 0x10201040
627 // initializeState_DieIceVanish Address: 0x0232E7C4
628 // executeState_DieIceVanish Address: 0x0232E7C8
629 // finalizeState_DieIceVanish Address: 0x0232EEE0
631 // StateID_DieOther Address: 0x10201064
632 // initializeState_DieOther Address: 0x0232E7D4
633 // executeState_DieOther Address: 0x0232EEE4
634 // finalizeState_DieOther Address: 0x0232EEE8
636 // StateID_DieAwa Address: 0x10201088
637 // initializeState_DieAwa Address: 0x0232E7E0
638 // executeState_DieAwa Address: 0x0232EEEC
639 // finalizeState_DieAwa Address: 0x0232EEF0
641
642 // Address: 0x102010AC
643 static const f32 cDieFallGravity; // 1.3 * cDefaultGravity
644 // Address: 0x10072EA8
646 // Address: 0x10072EAC
648
649 static const s32 cDieFallSpinSpeed = 0x0C000000;
650
651 // ------------------------------------ EnemyState.cpp ------------------------------------ //
652
653 // StateID_EatIn Address: 0x1020111C
654 // initializeState_EatIn Address: 0x023305E4
655 // executeState_EatIn Address: 0x023305EC
656 // finalizeState_EatIn Address: 0x023310C4
657 DECLARE_STATE_VIRTUAL_ID_BASE(Enemy, EatIn)
658 // StateID_EatNow Address: 0x10201140
659 // initializeState_EatNow Address: 0x023310C8
660 // executeState_EatNow Address: 0x023310CC
661 // finalizeState_EatNow Address: 0x023310D0
663 // StateID_EatOut Address: 0x10201164
664 // initializeState_EatOut Address: 0x023310D4
665 // executeState_EatOut Address: 0x023310D8
666 // finalizeState_EatOut Address: 0x023310DC
668 // StateID_ChibiEatIn Address: 0x10201188
669 // initializeState_ChibiEatIn Address: 0x023306E8
670 // executeState_ChibiEatIn Address: 0x023306F0
671 // finalizeState_ChibiEatIn Address: 0x023310E0
673 // StateID_ChibiEatNow Address: 0x102011AC
674 // initializeState_ChibiEatNow Address: 0x023310E4
675 // executeState_ChibiEatNow Address: 0x023310E8
676 // finalizeState_ChibiEatNow Address: 0x023310EC
678 // StateID_ChibiEatOut Address: 0x102011D0
679 // initializeState_ChibiEatOut Address: 0x023310F0
680 // executeState_ChibiEatOut Address: 0x023310F4
681 // finalizeState_ChibiEatOut Address: 0x023310F8
683 // StateID_EnemyUnk1 Address: 0x102011F4
684 // initializeState_EnemyUnk1 Address: 0x023310FC
685 // executeState_EnemyUnk1 Address: 0x02331100
686 // finalizeState_EnemyUnk1 Address: 0x02331104
688 // StateID_Ice Address: 0x10201218
689 // initializeState_Ice Address: 0x02330720
690 // executeState_Ice Address: 0x023307A0
691 // finalizeState_Ice Address: 0x02330944
693
694protected:
697 sead::BitFlag32 mEnFlag; // See EnFlag
700
702
712};
713static_assert(sizeof(Enemy) == 0x1880);
714
715#define _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, state_id, score_type, player_no)
716 EnemyDeathInfo::Arg arg_name = {
717 sead::Vector2f(),
718 0.0f,
719 0.0f,
720 state_id,
721 score_type,
722 0,
723 player_no
724 }
725
726// --- Custom state ---
727
728#define _ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_COMMON(arg_name, score_type, player_no)
729 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, nullptr, score_type, player_no)
730
731#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM(arg_name)
733
734#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_PLAYER(arg_name)
736
737#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_ALL_PLAYER(arg_name)
738 _ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_COMMON(arg_name, 0, cPlayerNum)
739
740#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_SCORE(arg_name)
742
743#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_SCORE_NO_PLAYER(arg_name)
745
746// --- DieFall ---
747
748#define _ENEMY_MAKE_DEATH_INFO_ARG_FALL_COMMON(arg_name, score_type, player_no)
749 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieFall, score_type, player_no)
750
751#define ENEMY_MAKE_DEATH_INFO_ARG_FALL(arg_name)
753
754#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_PLAYER(arg_name)
756
757#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_ALL_PLAYER(arg_name)
758 _ENEMY_MAKE_DEATH_INFO_ARG_FALL_COMMON(arg_name, 0, cPlayerNum)
759
760#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_SCORE(arg_name)
762
763#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_SCORE_NO_PLAYER(arg_name)
765
766// --- DieYoshiFumi ---
767
768#define _ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_COMMON(arg_name, score_type, player_no)
769 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieYoshiFumi, score_type, player_no)
770
771#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI(arg_name)
773
774#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_PLAYER(arg_name)
776
777#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_ALL_PLAYER(arg_name)
778 _ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_COMMON(arg_name, 0, cPlayerNum)
779
780#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_SCORE(arg_name)
782
783#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_SCORE_NO_PLAYER(arg_name)
785
786// --- DieSmoke ---
787
788#define _ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_COMMON(arg_name, score_type, player_no)
789 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieSmoke, score_type, player_no)
790
791#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE(arg_name)
793
794#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_PLAYER(arg_name)
796
797#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_ALL_PLAYER(arg_name)
798 _ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_COMMON(arg_name, 0, cPlayerNum)
799
800#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_SCORE(arg_name)
802
803#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_SCORE_NO_PLAYER(arg_name)
805
806// --- DieIceVanish ---
807
808#define _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, score_type, player_no)
809 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieIceVanish, score_type, player_no)
810
811#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH(arg_name)
813
814#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_PLAYER(arg_name)
816
817#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_ALL_PLAYER(arg_name)
818 _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, 0, cPlayerNum)
819
820#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_SCORE(arg_name)
822
823#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_SCORE_NO_PLAYER(arg_name)
825
826// --- DieOther ---
827
828#define _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, score_type, player_no)
829 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieOther, score_type, player_no)
830
831#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER(arg_name)
833
834#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_PLAYER(arg_name)
836
837#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_ALL_PLAYER(arg_name)
838 _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, 0, cPlayerNum)
839
840#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_SCORE(arg_name)
842
843#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_SCORE_NO_PLAYER(arg_name)
845
846// --- DieAwa ---
847
848#define _ENEMY_MAKE_DEATH_INFO_ARG_AWA_COMMON(arg_name, score_type, player_no)
849 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieAwa, score_type, player_no)
850
851#define ENEMY_MAKE_DEATH_INFO_ARG_AWA(arg_name)
853
854#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_NO_PLAYER(arg_name)
856
857#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_ALL_PLAYER(arg_name)
858 _ENEMY_MAKE_DEATH_INFO_ARG_AWA_COMMON(arg_name, 0, cPlayerNum)
859
860#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_NO_SCORE(arg_name)
862
863#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_NO_SCORE_NO_PLAYER(arg_name)
#define _ENEMY_MAKE_DEATH_INFO_ARG_AWA_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:848
constexpr f32 ENEMY_DIE_FALL_BOUND_SPEED_Y
Definition Enemy.h:14
#define _ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:728
#define _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, state_id, score_type, player_no)
Definition Enemy.h:715
constexpr f32 ENEMY_DIE_FALL_INIT_SPEED_Y
Definition Enemy.h:13
#define _ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:768
#define _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:808
constexpr f32 ENEMY_DIE_FALL_INIT_SPEED_X
Definition Enemy.h:12
#define _ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:788
constexpr f32 ENEMY_FUMI_JUMP_SPEED
Definition Enemy.h:16
#define _ENEMY_MAKE_DEATH_INFO_ARG_FALL_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:748
#define _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:828
FumiType
Defines the classification of player-enemy stomp and collision interactions.
Definition Enemy.h:72
@ cFumiType_Fumi
Standard Stomp: Jumping onto the enemy (e.g. normal jumps, ground pounds).
Definition Enemy.h:74
@ cFumiType_MameFumi
Mini Stomp: Jumping onto the enemy as Mini ("Mame") Mario. Also includes Mini Mario's spin-jump.
Definition Enemy.h:75
@ cFumiType_SpinFumi
Spin Stomp: Spin-jumping onto the enemy. Also includes Propeller Mario drills.
Definition Enemy.h:76
@ cFumiType_Hit
Lateral Impact: Moving into the enemy (also includes penguin slides & slope slides).
Definition Enemy.h:73
Definition ActorCollisionCheck.h:23
Definition Enemy.h:119
EnemyCounter()
Definition Enemy.h:121
sead::SafeArray< u16, cPlayerNum > mTime
Definition Enemy.h:145
void reset(s32 player_no, u16 initial_time)
Definition Enemy.h:129
u16 getTime(s32 player_no) const
Definition Enemy.h:134
bool isOver(s32 player_no) const
Definition Enemy.h:139
Definition Enemy.h:46
void setFumiRevType(u8 type)
Definition Enemy.h:55
Enemy * mEnemy
Definition Enemy.h:61
UniqueFumiCheckInf * mFumiCheckInf
Definition Enemy.h:62
EnemyFumiCheck(Enemy *enemy, UniqueFumiCheckInf *fumi_check_inf)
Definition Enemy.h:48
u8 mFumiRevType
Definition Enemy.h:63
Definition Enemy.h:80
EnemyFumiCheck mFumiCheck
Definition Enemy.h:102
FumiType operate(FumiCcInfo &info)
FumiType operate(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
Definition Enemy.h:95
EnemyFumiProc(Enemy *enemy, UniqueFumiCheckInf *fumi_check_inf)
Definition Enemy.h:82
void setFumiRevType(u8 type)
Definition Enemy.h:87
Definition Enemy.h:152
void setDeathInfo_Other(Actor *actor)
u8 mPreIceDirection
Definition Enemy.h:707
void setDeathInfo_Awa(Actor *awa)
void setFumiSound(const char *label)
static void playerFumiJump(Actor *player, f32 speed_y)
virtual bool hitCallback_Slip(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual void setQuakeJump()
void yoshifumistepSE()
Definition Enemy.h:557
FumiSeType
Definition Enemy.h:225
@ cFumiSeType_Step
Definition Enemy.h:227
@ cFumiSeType_NoEffect
Definition Enemy.h:228
@ cFumiSeType_Normal
Definition Enemy.h:226
virtual bool hitCallback_Shell(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool hitCallback_Spin(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool hitCallback_ChibiYoshiUnk(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void spinFumiScoreSet(Actor *player)
Combo mCombo
Definition Enemy.h:708
virtual void returnState_Ice()
void setDeathInfo_FumiFall(Actor *player, const sead::Vector2f &speed)
Definition Enemy.h:409
void setDeathSound_Slip(Actor *player)
virtual void setAwaCatchEnd(Actor *awa)
virtual bool vf18C()
Definition Enemy.h:275
virtual void returnAnm_Ice()
virtual bool hitCallback_ChibiYoshiStar(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool hitCallback_ChibiYoshiLight(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool playerDamageCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const f32 cWaterBoundSpeedY
Definition Enemy.h:179
void hitdamageEffect(const sead::Vector3f &pos)
virtual void fumiJumpSet(Actor *player)
void spinFumiJumpSet(Actor *player)
Definition Enemy.h:500
sead::BitFlag32 mEnFlag
Definition Enemy.h:697
void spinfumiEffect(Actor *player)
bool mIsSpinFumiFrame
Definition Enemy.h:710
void mamefumistepSE()
Definition Enemy.h:547
void setSmokeDamage_(Actor *actor) override
IceMgr mIceMgr
Definition Enemy.h:698
void bound(f32 eps_y, f32 scale_x, f32 scale_y)
virtual bool hitCallback_AttackUnk27(bool *dead, ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
FumiType fumiCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other, FumiSeType se_type)
Process a collision with a player and return which type occurred.
virtual void vsPlayerHitCheck_Normal(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual void vsChibiYoshiHitCheck_Normal(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void cancelCarry()
void setFumiComboScore(Actor *player)
static void fireballInvalid(ActorCollisionCheck *cc_other)
Definition Enemy.h:483
virtual bool checkDispIn()
virtual void hipatkEffect(const sead::Vector3f &effect_pos)
u16 mStateSubTimer
Definition Enemy.h:704
void spinfumistepSE()
Definition Enemy.h:537
void killIce()
Definition Enemy.h:325
virtual bool yoshiDamageCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setFumiSound(s32 combo_cnt, const GameAudio::SoundID combo_se[], u32 combo_max)
bool isDead() const
s32 calcComboPlFumiCnt(Actor *player)
virtual void vsYoshiHitCheck_Normal(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const f32 cWaterGravity
Definition Enemy.h:177
virtual bool enemyPreDamageCheck(bool *dead, ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
u16 mStateTimer
Definition Enemy.h:703
static const f32 cDefaultGravity
Definition Enemy.h:166
static const f32 cDieFallBoundSpeedY
Definition Enemy.h:168
virtual void yoshifumiSE(Actor *player)
virtual bool vf1CC()
static const f32 cDieFallInitSpeedX[cDirType_NumX]
Definition Enemy.h:161
virtual bool setDeathInfo_Star(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeathInfo_YoshiFumi(Actor *player)
void setNicePoint_Death()
virtual void setDeathInfo_Quake(QuakeDeathType type)
static const f32 cDieFallInitSpeedY
Definition Enemy.h:645
EnemyFumiProc mFumiProc
Definition Enemy.h:701
static const f32 cDeadNetSpeedX[cDirType_NumX]
Definition Enemy.h:215
Angle applyWaterRollDec(Angle ang)
static const f32 cWaterMaxFallSpeed
Definition Enemy.h:181
QuakeDeathType
Definition Enemy.h:241
@ cQuakeDeathType_NormalQuake
Definition Enemy.h:242
@ cQuakeDeathType_Num
Definition Enemy.h:244
@ cQuakeDeathType_BigQuake
Definition Enemy.h:243
EnemyChibiYoshiAwaData mChibiYoshiAwaData
Definition Enemy.h:699
virtual void setDeathInfo_IceBreak()
static const s32 cDieFallSpinSpeed
Definition Enemy.h:649
virtual void setAwaInvalid(Actor *awa)
virtual bool enemyDamageCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeathInfo_Fall(DirType direction, s32 player_no=-1, ScoreMgr::ScoreType score_type=ScoreMgr::cScoreType_Invalid)
static bool ceilCheck(f32 pos_y, ActorCollisionCheck *cc)
virtual void mameFumiJumpSet(Actor *player)
void setDeathInfo_SpinFumi(Actor *player)
static void normal_collcheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
bool preExecute() override
Callback invoked before the execute operation.
virtual bool hitCallback_YoshiFire(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const s8 cEnMuki[cDirType_NumX]
Maps a 2D direction to a sign multiplier (1 or -1).
Definition Enemy.h:212
virtual bool hitCallback_HipAttk(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool hitCallback_Ice(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const f32 cWaterRollDecRate
Definition Enemy.h:183
virtual bool hitCallback_Fire(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
Enemy(const ActorCreateParam &param)
u32 _1870
Definition Enemy.h:705
virtual void setDeathSound_HipAttk()
static const Angle cBaseAngleYAdd[cDirType_NumX]
Definition Enemy.h:196
void createUpCoin(DirType dir)
virtual bool hitCallback_AttackUnk25(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual void spinfumiSE(Actor *player)
static const f32 cFumiJumpSpeed
Definition Enemy.h:164
void changeState(const StateID &state_id) override
virtual void hitYoshiEat(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeathInfo_FumiOther(Actor *player, const sead::Vector2f &speed)
Definition Enemy.h:414
EnFlag
Definition Enemy.h:232
@ cEnFlag_9
Definition Enemy.h:235
@ cEnFlag_16
Definition Enemy.h:236
@ cEnFlag_Shell
Definition Enemy.h:233
@ cEnFlag_NoCeilCheckPlayer
Definition Enemy.h:237
@ cEnFlag_Carry
Definition Enemy.h:234
bool lineBoundaryCheck()
s8 _187e
Definition Enemy.h:711
EnemyCounter mPlayerNoHitTimer
Definition Enemy.h:696
virtual void setAwaHit(Actor *awa)
void fumistepSE()
Definition Enemy.h:527
virtual void mamefumiSE()
virtual void setIceAnm()
virtual bool isQuakeDamage()
static const f32 cDieFallMaxFallSpeed
Definition Enemy.h:647
virtual void yoshiFumiJumpSet(Actor *player)
static f32 getDeadNetSpeedX()
Definition Enemy.h:218
void initDieState()
virtual void fumiSE(Actor *player)
virtual void fumiEffect(Actor *player)
virtual bool hitCallback_PenguinSlide(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeathInfo_IceVanish()
bool area_XY_check(f32 x, f32 y)
u8 mDieDirection
Definition Enemy.h:706
virtual bool checkComboClap(s32 combo_cnt)
virtual void awaCatchMove(Actor *awa)
virtual bool chibiYoshiDamageCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static void iceballInvalid(ActorCollisionCheck *cc_other)
virtual bool hitCallback_YoshiBullet(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeadMode(Actor *actor)
static const Angle cBaseAngleY[cDirType_NumX]
Maps a 2D direction to a "facing" Y-angle.
Definition Enemy.h:194
virtual void vsEnemyHitCheck_Normal(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool hitCallback_YoshiHipAttk(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual void calcMdl_Base()
virtual bool hitCallback_Cannon(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
void setDeathInfo_Fumi(Actor *player, const sead::Vector2f &speed, const StateID &state_id)
void setDeathInfo_Fumi(Actor *player, const sead::Vector2f &speed)
Definition Enemy.h:404
virtual void yoshiFumiScoreSet(Actor *player)
void calcMdl_Normal()
virtual bool hitCallback_Star(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual bool createIceActor()
Callback for spawning ice blocks when frozen by an ice flower.
bool setTouchDrcDamage_(const sead::Vector3f &pos) override
void blockHitInit_() override
virtual bool etcDamageCheck(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
virtual void fumiScoreSet(Actor *player)
void setDeathInfo_Fall(const sead::Vector2f *speeds, DirType direction, s32 player_no=-1, ScoreMgr::ScoreType score_type=ScoreMgr::cScoreType_Invalid)
static const f32 cDefaultMaxFallSpeed
Definition Enemy.h:170
virtual void mamefumiEffect(Actor *player)
void setFumiSound(Actor *player, const GameAudio::SoundID combo_se[], u32 combo_max)
virtual bool setDamage(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
const EnemyDeathInfo & getDeathInfo() const
Definition Enemy.h:260
bool mIsDamageFrame
Definition Enemy.h:709
virtual bool hitCallback_WireNet(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const f32 cDefaultMaxSpeedF
Definition Enemy.h:172
static const f32 cDefaultMaxSpeedY
Definition Enemy.h:174
virtual void setDeathSound_Fire()
void setDeathInfo_Hasami()
Definition Enemy.h:22
f32 getFumiRev()
ActorCollisionCheck * mCcSelf
Definition Enemy.h:34
FumiCcInfo(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
Definition Enemy.h:24
ActorCollisionCheck * mCcOther
Definition Enemy.h:35
Definition Enemy.h:107
bool operate(bool &, Enemy *, FumiCcInfo &) override
static UniqueFumiCheckInf * instance()
Definition Enemy.h:111
static NonUniqueFumiCheck sInstance
Definition Enemy.h:108
Definition Enemy.h:39
virtual bool operate(bool &, Enemy *, FumiCcInfo &)=0