1#include <game/bases/d_enemy_boss.hpp>
2#include <game/bases/d_a_player_base.hpp>
3#include <game/bases/d_a_player_demo_manager.hpp>
4#include <game/bases/d_actor_manager.hpp>
5#include <game/bases/d_quake.hpp>
6#include <game/sLib/s_GlobalData.hpp>
20dEnBoss_c::dEnBoss_c() : mTenmetsuTime(0), m_d0(0), mQuakeDamage(0), mpBossLife(nullptr) {}
22dEnBoss_c::~dEnBoss_c() {}
34int dEnBoss_c::createInit() {
38void dEnBoss_c::allocate() {
42 mAllocator.adjustFrmHeapRestoreCurrent();
45void dEnBoss_c::createBossLife() {
46 if (mpBossLife ==
nullptr) {
47 mpBossLife =
new dBossLife_Common_c(6 * 3);
65 if (mQuakeDamage && !(dQuake_c::m_instance->
mFlags & dQuake_c::FLAG_1)) {
74 mSndObject.mPos = dAudio::cvtSndObjctPos(
mPos);
80bool dEnBoss_c::isQuakeDamage() {
84 if (
isState(StateID_DemoWait)) {
90void dEnBoss_c::Normal_VsPlHitCheck(
dCc_c *self,
dCc_c *other) {
91 if (isFumiInvalid()) {
92 dEn_c::Normal_VsPlHitCheck(self, other);
96 daPlBase_c *player = (daPlBase_c *) other->
getOwner();
98 switch (Enfumi_check(self, other, 2)) {
101 if (!isFumiDmgInvalid()) {
106 dEn_c::Normal_VsPlHitCheck(self, other);
109 if (plrNo >= 0 && plrNo < PLAYER_COUNT) {
117void dEnBoss_c::Normal_VsYoshiHitCheck(
dCc_c *self,
dCc_c *other) {
118 if (isFumiInvalid()) {
119 dEn_c::Normal_VsYoshiHitCheck(self, other);
123 switch (Enfumi_check(self, other, 0)) {
125 if (!isFumiDmgInvalid()) {
130 dEn_c::Normal_VsPlHitCheck(self, other);
135void dEnBoss_c::deadAllKill() {
136 dActorMng_c::m_instance->allEnemyDeath(0);
139void dEnBoss_c::fumiProc(
dActor_c *actor) {
141 mpBossLife->mLife = 0;
143 mpBossLife->updateFumi();
147 if (mpBossLife->mLife <= 0) {
151 mpBossLife->mLife = 0;
153 daPyDemoMng_c::mspInstance->setBossDown((daPlBase_c *) actor);
159 setFumiDamage(actor);
164bool dEnBoss_c::hitCallback_Fire(
dCc_c *self,
dCc_c *other) {
165 if (isFireInvalid()) {
166 fireballInvalid(self, other);
171 int prevLives = getLife();
172 int newLives = mpBossLife->updateFire();
175 mpBossLife->mLife = 0;
178 if (newLives >= prevLives) {
179 fireballInvalid(self, other);
182 mpBossLife->mLife = 0;
188 daPyDemoMng_c::getInstance()->setBossDown((daPlBase_c *) player);
196 setFireDamage(player);
204bool dEnBoss_c::hitCallback_Shell(
dCc_c *self,
dCc_c *other) {
205 if (isShellInvalid()) {
210 int prevLives = getLife();
211 int newLives = mpBossLife->updateShell();
214 mpBossLife->mLife = 0;
217 if (newLives >= prevLives) {
221 mpBossLife->mLife = 0;
227 daPyDemoMng_c::mspInstance->setBossDown((daPlBase_c *) player);
228 setShellDead(player);
235 setShellDamage(player);
243bool dEnBoss_c::hitCallback_HipAttk(
dCc_c *self,
dCc_c *other) {
244 if (isFumiInvalid()) {
252 mpBossLife->updateHipAtk();
255 mpBossLife->mLife = 0;
258 if (mpBossLife->mLife <= 0) {
262 mpBossLife->mLife = 0;
264 daPyDemoMng_c::mspInstance->setBossDown((daPlBase_c *) player);
265 setHipatkDead(player);
270 setHipatkDamage(player);
277bool dEnBoss_c::hitCallback_Spin(
dCc_c *self,
dCc_c *other) {
278 if (isFumiInvalid()) {
286 mpBossLife->updateFumi();
289 mpBossLife->mLife = 0;
292 if (mpBossLife->mLife <= 0) {
296 mpBossLife->mLife = 0;
298 daPyDemoMng_c::getInstance()->setBossDown((daPlBase_c *) player);
299 setHipatkDead(player);
304 setHipatkDamage(player);
311bool dEnBoss_c::hitCallback_Star(
dCc_c *self,
dCc_c *other) {
312 daPlBase_c *player = (daPlBase_c *) other->
getOwner();
314 if (isStarInvalid()) {
315 player->setForcedDamage(
this, daPlBase_c::DAMAGE_HIP_ATTACK);
321 mpBossLife->updateStar();
324 mpBossLife->mLife = 0;
328 mpBossLife->mLife = 0;
330 daPyDemoMng_c::mspInstance->setBossDown(player);
336 setStarDamage(player);
343void dEnBoss_c::setDeathInfo_Quake(
int) {
347 mpBossLife->updateQuake();
350 mpBossLife->mLife = 0;
354 mpBossLife->mLife = 0;
355 daPyDemoMng_c::mspInstance->setBossDownPlayerNo(-1);
367bool dEnBoss_c::hitCallback_PenguinSlide(
dCc_c *self,
dCc_c *other) {
371void dEnBoss_c::initializeState_DemoWait() {}
372void dEnBoss_c::finalizeState_DemoWait() {}
373void dEnBoss_c::executeState_DemoWait() {}
375void dEnBoss_c::initializeState_DieFumi() {}
376void dEnBoss_c::finalizeState_DieFumi() {}
377void dEnBoss_c::executeState_DieFumi() {}
379void dEnBoss_c::initializeState_DieFire() { initializeState_DieFumi(); }
380void dEnBoss_c::finalizeState_DieFire() { finalizeState_DieFumi(); }
381void dEnBoss_c::executeState_DieFire() { executeState_DieFumi(); }
383void dEnBoss_c::initializeState_DieSlide() { initializeState_DieFumi(); }
384void dEnBoss_c::finalizeState_DieSlide() { finalizeState_DieFumi(); }
385void dEnBoss_c::executeState_DieSlide() { executeState_DieFumi(); }
387void dEnBoss_c::initializeState_DieShell() { initializeState_DieFumi(); }
388void dEnBoss_c::finalizeState_DieShell() { finalizeState_DieFumi(); }
389void dEnBoss_c::executeState_DieShell() { executeState_DieFumi(); }
391void dEnBoss_c::initializeState_DieStar() { initializeState_DieFumi(); }
392void dEnBoss_c::finalizeState_DieStar() { finalizeState_DieFumi(); }
393void dEnBoss_c::executeState_DieStar() { executeState_DieFumi(); }
395void dEnBoss_c::initializeState_DieQuake() { initializeState_DieFumi(); }
396void dEnBoss_c::finalizeState_DieQuake() { finalizeState_DieFumi(); }
397void dEnBoss_c::executeState_DieQuake() { executeState_DieFumi(); }
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.
virtual s8 & getPlrNo()
Gets the player number associated with the actor. See mPlayerNo.
dBc_c mBc
The actor-to-tile collision sensor.
dActor_c()
Constructs a new actor.
mVec3_c mPos
The actor's position.
u32 mActorProperties
The actor's properties. See fProf::fActorProfile_c::mActorProperties.
Collider ("Collision Check") class - handles collisions between actors.
dActor_c * getOwner() const
Gets the owner actor of this collider.
The base class for boss enemies.
int mTenmetsuTime
Timer for the flashing effect when the boss takes damage.
virtual void tenmetsuFin()
Ends the flashing effect after the boss takes damage.
virtual void tenmetsuProc()
Handles the flashing effect after the boss takes damage.
virtual int create()
do method for the create operation.
void getTenmetsuTimePress(bool a)
virtual int preExecute()
pre method for the execute operation.
virtual void postExecute(MAIN_STATE_e state)
post method for the execute operation.
virtual void tenmetsuReady()
Prepares the flashing effect after the boss takes damage.
virtual void changeState(const sStateIDIf_c &newState)
Changes the actor's state to the given state.
virtual int preExecute()
pre method for the execute operation.
dPlayerDownTimer_c mNoHitPlayer
Hit cooldown timers for each player. This is used to prevent, for example, a thrown shell from hittin...
virtual void postExecute(fBase_c::MAIN_STATE_e status)
post method for the execute operation.
u32 mFlags
Flags for this actor. See FLAGS_e.
MAIN_STATE_e
The possible operation results.
@ SUCCESS
The operation was completed successfully.
@ NOT_READY
The step could not completed at this time.
@ SUCCEEDED
The step was completed successfully.
static const T::GlobalData_t mData
A generic implementation of a state ID.
@ GAME_HEAP_DEFAULT
The default game heap (alias of MEM1 or MEM2).
@ OPT_NONE
No special allocation options.
EGG::ExpHeap * g_gameHeaps[GAME_HEAP_COUNT]
The game heaps.
#define STATE_VIRTUAL_DEFINE_INH(class, name, inherit)
Defines a virtual state.
#define STATE_VIRTUAL_DEFINE(class, name)
Defines a virtual state.