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
151// vtbl Address: 0x1007209C
152class Enemy : public ActorMultiState
153{
154 // getRuntimeTypeInfoStatic()::typeInfo initialization guard variable Address: 0x101E9EEC
155 // getRuntimeTypeInfoStatic()::typeInfo Address: 0x101E9EF0
156 SEAD_RTTI_OVERRIDE(Enemy, ActorMultiState)
157
158public:
160
161 // Address: 0x10072064
163
164 // Address: 0x1007206C
165 static const f32 cFumiJumpSpeed;
166 // Address: 0x10072070
167 static const f32 cDefaultGravity;
168 // Address: 0x10072074
170 // Address: 0x10072078
172 // Address: 0x1007207C
173 static const f32 cDefaultMaxSpeedF;
174 // Address: 0x10072080
175 static const f32 cDefaultMaxSpeedY;
176
177 // Address: 0x10072084
178 static const f32 cWaterGravity;
179 // Address: 0x10072088
180 static const f32 cWaterBoundSpeedY;
181 // Address: 0x1007208C
183 // Address: 0x10072090
184 static const f32 cWaterRollDecRate;
185
186 /**
187 * @brief Maps a 2D direction to a "facing" Y-angle.
188 * @details Applies a slight rotational bias towards the camera that prevents the actor from facing perfectly perpendicular to the viewer.
189 * This ensures actors remain visually clear and recognizable when facing either direction.
190 * @warning Only indexable with `cDirType_Right` and `cDirType_Left`. Anything else is out of bounds.
191 * @par Address: 0x10200DD8
192 */
194 // Address: 0x10200DE0
196
197 /**
198 * @brief Maps a 2D direction to a sign multiplier (`1` or `-1`).
199 * @details Useful for compacting ternaries for left/right->negative/positive into a multiplication operation.
200 * @code{.cpp}
201 * // Instead of branching:
202 * float speed = (mDirection == cDirType_Right) ? 2.0f : -2.0f;
203 * // Use multiplication:
204 * float speed = cEnMuki[mDirection] * 2.0f;
205 * @endcode
206 * @warning Only indexable with `cDirType_Right` and `cDirType_Left`. Anything else is out of bounds.
207 * @par Address: 0x10072094
208 */
209 static const s8 cEnMuki[cDirType_NumX];
210
211 // Address: 0x10200DE8
213
214public:
216 {
217 return 1.125f;
218 }
219
220public:
227
229 {
232 cEnFlag_9 = 1 << 9, // Immune to penguin slide?
233 cEnFlag_16 = 1 << 16,
235 };
236
243 static_assert(cQuakeDeathType_Num == 2);
244
245public:
246 // Address: 0x02328494
247 Enemy(const ActorCreateParameter& param);
248
249protected:
250 // Address: 0x02328644
252
253 // Address: 0x02328914
255
256public:
258 {
259 return mDeathInfo;
260 }
261
262public:
263 // Address: 0x02330404
264 void changeState(const StateID& state_id) override;
265
266 // Address: 0x02328608
268
269 // Address: 0x02328AEC
270 bool area_XY_check(f32 x, f32 y);
271
272 virtual bool vf18C() // is not carryable?
273 {
274 return false;
275 }
276
277 // Address: 0x0232A850
279
280 // Address: 0x02328B84
281 virtual bool setDamage(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
282
283 // Address: 0x02328C50
285
286 // Address: 0x02328C24
287 static bool ceilCheck(f32 pos_y, ActorCollisionCheck* cc);
288
289 // Address: 0x0232910C
290 virtual bool checkComboClap(s32 combo_cnt);
291
292 // Address: 0x02329130
293 s32 calcComboPlFumiCnt(Actor* player);
294
295 // Address: 0x02329168
296 void bound(f32 eps_y, f32 scale_x, f32 scale_y);
297
298 // Address: 0x0232CAEC
299 bool isDead() const;
300 // Address: 0x0232CCE8
301 void setDeadMode(Actor* actor);
302
303 // Address: 0x0232CE28
305
306 /**
307 * @brief Callback for spawning ice blocks when frozen by an ice flower.
308 * @return Forward the return value of the `createIce()` method call.
309 * @details Implement this function by calling `mIceMgr.createIce()` with your custom `IceInfo`.
310 * @par Address: 0x023304F8
311 */
312 virtual bool createIceActor();
313 // Address: 0x023310BC
314 virtual void setIceAnm();
315 // Address: 0x023310C0
316 virtual void returnAnm_Ice();
317 // Address: 0x02330568
318 virtual void returnState_Ice();
319
320 void killIce()
321 {
322 mIceMgr.removeIce();
323 }
324
325 // Address: 0x0232A858
326 virtual void calcMdl_Base();
327
328 // Address: 0x023291DC
329 void calcMdl_Normal(); // Calls calcMdl_Base is not currently frozen
330
331 // Address: 0x0232A85C
332 virtual bool vf1CC(); // Maybe related to the below?
333
334 // Address: 0x023291F8
336 // Address: 0x02329250
338 // Address: 0x02329520
339 virtual bool enemyPreDamageCheck(bool* dead, ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
340 // Address: 0x02329578
341 virtual void hitYoshiEat(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
342 // Address: 0x0232957C
344 // Address: 0x023296E8
346 // Address: 0x02329800
347 virtual bool etcDamageCheck(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
348
349 // Address: 0x023299F0
351 // Address: 0x023299F4
353 // Address: 0x02329A04
355 // Address: 0x02329A08
357
358 // Address: 0x0232CE84
360 // Address: 0x0232CF20
362 // Address: 0x0232D014
364 // Address: 0x0232D0E4
366 // Address: 0x0232D240
368 // Address: 0x0232D3B4
370 // Address: 0x0232D48C
372 // Address: 0x0232D49C
374 // Address: 0x0232D56C
375 virtual bool hitCallback_AttackUnk25(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other); // Player slip 2
376 // Address: 0x0232D57C
378 // Address: 0x0232D70C
380 // Address: 0x0232D7A4
381 virtual bool hitCallback_Ice(ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
382 // Address: 0x0232D824
384 // Address: 0x0232D938
386 // Address: 0x0232DA04
388 // Address: 0x0232DA0C
390 // Address: 0x0232DA14
392
393 // Address: 0x0232DA24
394 virtual bool hitCallback_AttackUnk27(bool* dead, ActorCollisionCheck* cc_self, ActorCollisionCheck* cc_other);
395
396 // Address: 0x0232DA34
397 void setDeathInfo_Fumi(Actor* player, const sead::Vector2f& speed, const StateID& state_id);
398
399 void setDeathInfo_Fumi(Actor* player, const sead::Vector2f& speed)
400 {
401 setDeathInfo_Fumi(player, speed, StateID_DieFumi);
402 }
403
404 void setDeathInfo_FumiFall(Actor* player, const sead::Vector2f& speed)
405 {
406 setDeathInfo_Fumi(player, speed, StateID_DieFall);
407 }
408
409 void setDeathInfo_FumiOther(Actor* player, const sead::Vector2f& speed)
410 {
411 setDeathInfo_Fumi(player, speed, StateID_DieOther);
412 }
413
414 // Address: 0x0232CBA4
415 void setDeathInfo_Fall(DirType direction, s32 player_no = -1, ScoreMgr::ScoreType score_type = ScoreMgr::cScoreType_Invalid);
416 // Address: 0x0232CB08
417 void setDeathInfo_Fall(const sead::Vector2f* speeds, DirType direction, s32 player_no = -1, ScoreMgr::ScoreType score_type = ScoreMgr::cScoreType_Invalid);
418
419 // Address: 0x0232DAF0
421
422 // Address: 0x0232CC98
423 void setDeathInfo_SpinFumi(Actor* player);
424 // Address: 0x0232D31C
425 void setDeathInfo_YoshiFumi(Actor* player);
426
427protected:
428 // Address: 0x0232DC88
429 void setSmokeDamage_(Actor* actor) override;
430
431public:
432 // Address: 0x0232DD48
433 virtual void setDeathInfo_IceBreak();
434 // Address: 0x0232DD90
436
437 // Address: 0x0232DE90
438 void setDeathInfo_Other(Actor* actor);
439
440 // Address: 0x0232DF14
442
443 // Address: 0x0232E048
445
446 // Address: 0x0232E144
448
449protected:
450 // Address: 0x0232E1A4
451 bool setTouchDrcDamage_(const sead::Vector3f& pos) override;
452
453public:
454 /**
455 * @return Enemy is on ground and can be damaged by quake (e.g. POW block).
456 * @par Address: 0x0232E2EC
457 */
458 virtual bool isQuakeDamage();
459
460 // Address: 0x0232E2F8
461 virtual void setDeathSound_Fire();
462 // Address: 0x0232E358
463 virtual void setDeathSound_HipAttk();
464 // Address: 0x0232CE94
465 void setDeathSound_Slip(Actor* player);
466
467 // Address: 0x0232E3FC
469
470 // Address: 0x0232E4A8
471 void setDeathInfo_Awa(Actor* awa);
472
473 // Address: 0x0232D694
474 void createUpCoin(DirType dir);
475
476 static void fireballInvalid(ActorCollisionCheck* cc_other) // Inline in NSMBU, but not NSMBW
477 {
478 GameAudio::getAudioObjMap()->startSound("SE_OBJ_FIREBALL_DISAPP", cc_other->getOwner()->getPos());
479 }
480
481 // Address: 0x02329A0C
482 static void iceballInvalid(ActorCollisionCheck* cc_other);
483
484 /**
485 * @brief Process a collision with a player and return which type occurred.
486 * @param se_type Which type of sounds/particles to play for this collision.
487 * @par Address: 0x02329B88
488 */
490
491 void spinFumiJumpSet(Actor* player)
492 {
493 fumiJumpSet(player);
494 }
495
496 // Address: 0x02329B6C
497 void spinFumiScoreSet(Actor* player);
498
499 // Address: 0x02329EA4
500 virtual void fumiJumpSet(Actor* player);
501 // Address: 0x02329FA8
502 virtual void fumiScoreSet(Actor* player);
503
504 // Address: 0x02329FAC
505 virtual void yoshiFumiJumpSet(Actor* player);
506 // Address: 0x02329FB0
507 virtual void yoshiFumiScoreSet(Actor* player);
508
509 // Address: 0x02329FC0
510 virtual void mameFumiJumpSet(Actor* player);
511
512 // Address: 0x02329E54
513 static void playerFumiJump(Actor* player, f32 speed_y);
514
515 // Address: 0x02329EC0
516 void setFumiComboScore(Actor* player);
517
519 {
520 setFumiSound("SE_EMY_CMN_STEP");
521 }
522
523 // Address: 0x0232A094
524 virtual void fumiSE(Actor* player);
525 // Address: 0x0232A118
526 virtual void fumiEffect(Actor* player);
527
529 {
531 }
532
533 // Address: 0x0232A1BC
534 virtual void spinfumiSE(Actor* player);
535 // Address: 0x02329B20
536 void spinfumiEffect(Actor* player); // No longer virtual...
537
539 {
540 setFumiSound("SE_EMY_MAME_STEP");
541 }
542
543 // Address: 0x0232A240
544 virtual void mamefumiSE();
545 // Address: 0x0232A24C
546 virtual void mamefumiEffect(Actor* player);
547
549 {
550 setFumiSound("SE_EMY_YOSHI_STEP");
551 }
552
553 // Address: 0x0232A250
554 virtual void yoshifumiSE(Actor* player);
555 // void yoshifumiEffect(Actor* player); // Deleted from NSMBU
556
557 // Address: 0x02329AA8
558 void setFumiSound(const char* label);
559 // Address: 0x0232A008
560 void setFumiSound(s32 combo_cnt, const GameAudio::SoundID combo_se[], u32 combo_max);
561 // Address: 0x0232A088
562 void setFumiSound(Actor* player, const GameAudio::SoundID combo_se[], u32 combo_max);
563
564 // Address: 0x023288BC
565 void hitdamageEffect(const sead::Vector3f& pos);
566
567 void hitdamageEffect(const sead::Vector2f& pos)
568 {
569 hitdamageEffect(sead::Vector3f(pos, 0.0f));
570 }
571
572 // Address: 0x0232A2D4
573 virtual void hipatkEffect(const sead::Vector3f& effect_pos);
574
575 // Address: 0x0232A2E4
576 virtual void setQuakeJump(); // Adds 2.0f to y speed
577
578 /**
579 * @return Enemy is inside the camera view.
580 * @par Address: 0x0232A2FC
581 */
582 virtual bool checkDispIn();
583
584 // Address: 0x0232A364
585 virtual void setAwaHit(Actor* awa); // Callback for ChibiYoshiAwaData
586 // Address: 0x0232A418
587 virtual void awaCatchMove(Actor* awa); // ^^^
588 // Address: 0x0232A4CC
589 virtual void setAwaCatchEnd(Actor* awa); // ^^^
590 // Address: 0x0232A864
591 virtual void setAwaInvalid(Actor* awa); // ^^^
592
593 // ------------------------------------ EnemyDeath.cpp ------------------------------------ //
594
595 // StateID_DieFumi Address: 0x10200FB0
596 // initializeState_DieFumi Address: 0x0232E518
597 // executeState_DieFumi Address: 0x0232E5E8
598 // finalizeState_DieFumi Address: 0x0232EED0
599 DECLARE_STATE_VIRTUAL_ID_BASE(Enemy, DieFumi)
600 // StateID_DieFall Address: 0x10200FD4
601 // initializeState_DieFall Address: 0x0232E63C
602 // executeState_DieFall Address: 0x0232E640
603 // finalizeState_DieFall Address: 0x0232EED4
605 // StateID_DieYoshiFumi Address: 0x10200FF8
606 // initializeState_DieYoshiFumi Address: 0x0232E72C
607 // executeState_DieYoshiFumi Address: 0x0232E79C
608 // finalizeState_DieYoshiFumi Address: 0x0232EED8
610 // StateID_DieSmoke Address: 0x1020101C
611 // initializeState_DieSmoke Address: 0x0232E7A8
612 // executeState_DieSmoke Address: 0x0232E7B8
613 // finalizeState_DieSmoke Address: 0x0232EEDC
615 // StateID_DieIceVanish Address: 0x10201040
616 // initializeState_DieIceVanish Address: 0x0232E7C4
617 // executeState_DieIceVanish Address: 0x0232E7C8
618 // finalizeState_DieIceVanish Address: 0x0232EEE0
620 // StateID_DieOther Address: 0x10201064
621 // initializeState_DieOther Address: 0x0232E7D4
622 // executeState_DieOther Address: 0x0232EEE4
623 // finalizeState_DieOther Address: 0x0232EEE8
625 // StateID_DieAwa Address: 0x10201088
626 // initializeState_DieAwa Address: 0x0232E7E0
627 // executeState_DieAwa Address: 0x0232EEEC
628 // finalizeState_DieAwa Address: 0x0232EEF0
630
631 /**
632 * @brief 1.3 * cDefaultGravity
633 * @par Address: 0x102010AC
634 */
635 static const f32 cDieFallGravity;
636 // Address: 0x10072EA8
638 // Address: 0x10072EAC
640
641 static const s32 cDieFallSpinSpeed = 0x0C000000;
642
643 // ------------------------------------ EnemyState.cpp ------------------------------------ //
644
645 // StateID_EatIn Address: 0x1020111C
646 // initializeState_EatIn Address: 0x023305E4
647 // executeState_EatIn Address: 0x023305EC
648 // finalizeState_EatIn Address: 0x023310C4
649 DECLARE_STATE_VIRTUAL_ID_BASE(Enemy, EatIn)
650 // StateID_EatNow Address: 0x10201140
651 // initializeState_EatNow Address: 0x023310C8
652 // executeState_EatNow Address: 0x023310CC
653 // finalizeState_EatNow Address: 0x023310D0
655 // StateID_EatOut Address: 0x10201164
656 // initializeState_EatOut Address: 0x023310D4
657 // executeState_EatOut Address: 0x023310D8
658 // finalizeState_EatOut Address: 0x023310DC
660 // StateID_ChibiEatIn Address: 0x10201188
661 // initializeState_ChibiEatIn Address: 0x023306E8
662 // executeState_ChibiEatIn Address: 0x023306F0
663 // finalizeState_ChibiEatIn Address: 0x023310E0
665 // StateID_ChibiEatNow Address: 0x102011AC
666 // initializeState_ChibiEatNow Address: 0x023310E4
667 // executeState_ChibiEatNow Address: 0x023310E8
668 // finalizeState_ChibiEatNow Address: 0x023310EC
670 // StateID_ChibiEatOut Address: 0x102011D0
671 // initializeState_ChibiEatOut Address: 0x023310F0
672 // executeState_ChibiEatOut Address: 0x023310F4
673 // finalizeState_ChibiEatOut Address: 0x023310F8
675 // StateID_EnemyUnk1 Address: 0x102011F4
676 // initializeState_EnemyUnk1 Address: 0x023310FC
677 // executeState_EnemyUnk1 Address: 0x02331100
678 // finalizeState_EnemyUnk1 Address: 0x02331104
680 // StateID_Ice Address: 0x10201218
681 // initializeState_Ice Address: 0x02330720
682 // executeState_Ice Address: 0x023307A0
683 // finalizeState_Ice Address: 0x02330944
685
686protected:
689 sead::BitFlag32 mEnFlag; // See EnFlag
692
694
704};
705static_assert(sizeof(Enemy) == 0x1880);
706
707#define _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, state_id, score_type, player_no)
708 EnemyDeathInfo::Arg arg_name = {
709 sead::Vector2f(),
710 0.0f,
711 0.0f,
712 state_id,
713 score_type,
714 0,
715 player_no
716 }
717
718// --- Custom state ---
719
720#define _ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_COMMON(arg_name, score_type, player_no)
721 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, nullptr, score_type, player_no)
722
723#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM(arg_name)
725
726#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_PLAYER(arg_name)
728
729#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_ALL_PLAYER(arg_name)
730 _ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_COMMON(arg_name, 0, cPlayerNum)
731
732#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_SCORE(arg_name)
734
735#define ENEMY_MAKE_DEATH_INFO_ARG_CUSTOM_NO_SCORE_NO_PLAYER(arg_name)
737
738// --- DieFall ---
739
740#define _ENEMY_MAKE_DEATH_INFO_ARG_FALL_COMMON(arg_name, score_type, player_no)
741 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieFall, score_type, player_no)
742
743#define ENEMY_MAKE_DEATH_INFO_ARG_FALL(arg_name)
745
746#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_PLAYER(arg_name)
748
749#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_ALL_PLAYER(arg_name)
750 _ENEMY_MAKE_DEATH_INFO_ARG_FALL_COMMON(arg_name, 0, cPlayerNum)
751
752#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_SCORE(arg_name)
754
755#define ENEMY_MAKE_DEATH_INFO_ARG_FALL_NO_SCORE_NO_PLAYER(arg_name)
757
758// --- DieYoshiFumi ---
759
760#define _ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_COMMON(arg_name, score_type, player_no)
761 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieYoshiFumi, score_type, player_no)
762
763#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI(arg_name)
765
766#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_PLAYER(arg_name)
768
769#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_ALL_PLAYER(arg_name)
770 _ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_COMMON(arg_name, 0, cPlayerNum)
771
772#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_SCORE(arg_name)
774
775#define ENEMY_MAKE_DEATH_INFO_ARG_YOSHI_FUMI_NO_SCORE_NO_PLAYER(arg_name)
777
778// --- DieSmoke ---
779
780#define _ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_COMMON(arg_name, score_type, player_no)
781 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieSmoke, score_type, player_no)
782
783#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE(arg_name)
785
786#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_PLAYER(arg_name)
788
789#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_ALL_PLAYER(arg_name)
790 _ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_COMMON(arg_name, 0, cPlayerNum)
791
792#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_SCORE(arg_name)
794
795#define ENEMY_MAKE_DEATH_INFO_ARG_SMOKE_NO_SCORE_NO_PLAYER(arg_name)
797
798// --- DieIceVanish ---
799
800#define _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, score_type, player_no)
801 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieIceVanish, score_type, player_no)
802
803#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH(arg_name)
805
806#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_PLAYER(arg_name)
808
809#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_ALL_PLAYER(arg_name)
810 _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, 0, cPlayerNum)
811
812#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_SCORE(arg_name)
814
815#define ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_NO_SCORE_NO_PLAYER(arg_name)
817
818// --- DieOther ---
819
820#define _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, score_type, player_no)
821 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieOther, score_type, player_no)
822
823#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER(arg_name)
825
826#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_PLAYER(arg_name)
828
829#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_ALL_PLAYER(arg_name)
830 _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, 0, cPlayerNum)
831
832#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_SCORE(arg_name)
834
835#define ENEMY_MAKE_DEATH_INFO_ARG_OTHER_NO_SCORE_NO_PLAYER(arg_name)
837
838// --- DieAwa ---
839
840#define _ENEMY_MAKE_DEATH_INFO_ARG_AWA_COMMON(arg_name, score_type, player_no)
841 _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, &Enemy::StateID_DieAwa, score_type, player_no)
842
843#define ENEMY_MAKE_DEATH_INFO_ARG_AWA(arg_name)
845
846#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_NO_PLAYER(arg_name)
848
849#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_ALL_PLAYER(arg_name)
850 _ENEMY_MAKE_DEATH_INFO_ARG_AWA_COMMON(arg_name, 0, cPlayerNum)
851
852#define ENEMY_MAKE_DEATH_INFO_ARG_AWA_NO_SCORE(arg_name)
854
855#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:840
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:720
#define _ENEMY_MAKE_DEATH_INFO_ARG_COMMON(arg_name, state_id, score_type, player_no)
Definition Enemy.h:707
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:760
#define _ENEMY_MAKE_DEATH_INFO_ARG_ICE_VANISH_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:800
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:780
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:740
#define _ENEMY_MAKE_DEATH_INFO_ARG_OTHER_COMMON(arg_name, score_type, player_no)
Definition Enemy.h:820
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:24
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:153
void setDeathInfo_Other(Actor *actor)
u8 mPreIceDirection
Definition Enemy.h:699
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:548
FumiSeType
Definition Enemy.h:222
@ cFumiSeType_Step
Definition Enemy.h:224
@ cFumiSeType_NoEffect
Definition Enemy.h:225
@ cFumiSeType_Normal
Definition Enemy.h:223
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:700
virtual void returnState_Ice()
void setDeathInfo_FumiFall(Actor *player, const sead::Vector2f &speed)
Definition Enemy.h:404
void setDeathSound_Slip(Actor *player)
virtual void setAwaCatchEnd(Actor *awa)
virtual bool vf18C()
Definition Enemy.h:272
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:180
Enemy(const ActorCreateParameter &param)
void hitdamageEffect(const sead::Vector3f &pos)
virtual void fumiJumpSet(Actor *player)
void spinFumiJumpSet(Actor *player)
Definition Enemy.h:491
sead::BitFlag32 mEnFlag
Definition Enemy.h:689
void spinfumiEffect(Actor *player)
bool mIsSpinFumiFrame
Definition Enemy.h:702
void mamefumistepSE()
Definition Enemy.h:538
void setSmokeDamage_(Actor *actor) override
IceMgr mIceMgr
Definition Enemy.h:690
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:476
virtual bool checkDispIn()
virtual void hipatkEffect(const sead::Vector3f &effect_pos)
u16 mStateSubTimer
Definition Enemy.h:696
void spinfumistepSE()
Definition Enemy.h:528
void killIce()
Definition Enemy.h:320
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:178
virtual bool enemyPreDamageCheck(bool *dead, ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
u16 mStateTimer
Definition Enemy.h:695
static const f32 cDefaultGravity
Definition Enemy.h:167
static const f32 cDieFallBoundSpeedY
Definition Enemy.h:169
virtual void yoshifumiSE(Actor *player)
virtual bool vf1CC()
static const f32 cDieFallInitSpeedX[cDirType_NumX]
Definition Enemy.h:162
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:637
EnemyFumiProc mFumiProc
Definition Enemy.h:693
static const f32 cDeadNetSpeedX[cDirType_NumX]
Definition Enemy.h:212
Angle applyWaterRollDec(Angle ang)
static const f32 cWaterMaxFallSpeed
Definition Enemy.h:182
QuakeDeathType
Definition Enemy.h:238
@ cQuakeDeathType_NormalQuake
Definition Enemy.h:239
@ cQuakeDeathType_Num
Definition Enemy.h:241
@ cQuakeDeathType_BigQuake
Definition Enemy.h:240
EnemyChibiYoshiAwaData mChibiYoshiAwaData
Definition Enemy.h:691
virtual void setDeathInfo_IceBreak()
static const s32 cDieFallSpinSpeed
Definition Enemy.h:641
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:209
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:184
virtual bool hitCallback_Fire(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
u32 _1870
Definition Enemy.h:697
virtual void setDeathSound_HipAttk()
static const Angle cBaseAngleYAdd[cDirType_NumX]
Definition Enemy.h:195
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:165
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:409
EnFlag
Definition Enemy.h:229
@ cEnFlag_9
Definition Enemy.h:232
@ cEnFlag_16
Definition Enemy.h:233
@ cEnFlag_Shell
Definition Enemy.h:230
@ cEnFlag_NoCeilCheckPlayer
Definition Enemy.h:234
@ cEnFlag_Carry
Definition Enemy.h:231
bool lineBoundaryCheck()
s8 _187e
Definition Enemy.h:703
EnemyCounter mPlayerNoHitTimer
Definition Enemy.h:688
virtual void setAwaHit(Actor *awa)
void fumistepSE()
Definition Enemy.h:518
virtual void mamefumiSE()
virtual void setIceAnm()
virtual bool isQuakeDamage()
static const f32 cDieFallMaxFallSpeed
Definition Enemy.h:639
virtual void yoshiFumiJumpSet(Actor *player)
static f32 getDeadNetSpeedX()
Definition Enemy.h:215
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:698
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:193
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:399
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:171
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:257
bool mIsDamageFrame
Definition Enemy.h:701
virtual bool hitCallback_WireNet(ActorCollisionCheck *cc_self, ActorCollisionCheck *cc_other)
static const f32 cDefaultMaxSpeedF
Definition Enemy.h:173
static const f32 cDefaultMaxSpeedY
Definition Enemy.h:175
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