Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions include/game/bases/d_a_player_demo_manager.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once
#include <types.h>
#include <game/mLib/m_vec.hpp>
#include <game/bases/d_a_player_base.hpp>

class daPyDemoMng_c {
public:
Expand All @@ -21,6 +22,18 @@ class daPyDemoMng_c {
int getControlDemoPlayerNum() const;
int getNextDemoNo();

void setBossDownPlayerNo(int plNo);
void setBossDown(daPlBase_c *player) {
setBossDownPlayerNo(player->getPlrNo());
}

int getPlrNo() const { return mPlayerNo; }
void setPlrNo(int playerNo) { mPlayerNo = playerNo; }
int get_88() const { return m_88; }
void inc_88() { m_88++; }

static daPyDemoMng_c *getInstance() { return mspInstance; }

char mPad1[0x10];
u32 mFlags;
u32 mGoalType;
Expand All @@ -41,10 +54,5 @@ class daPyDemoMng_c {
u8 mPad8[0x8];
int m_94;

int getPlrNo() const { return mPlayerNo; }
void setPlrNo(int playerNo) { mPlayerNo = playerNo; }
int get_88() const { return m_88; }
void inc_88() { m_88++; }

static daPyDemoMng_c *mspInstance;
};
1 change: 1 addition & 0 deletions include/game/bases/d_actor_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class dActorMng_c {
u8 mPad2[0x218];

void createUpCoin(const mVec3_c &pos, u8 dir, u8 count, u8 layer);
void allEnemyDeath(int);

static dActorMng_c *m_instance;
};
2 changes: 1 addition & 1 deletion include/game/bases/d_bc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class dBc_c {
u32 isWallL() { return mFlags & FLAG_WALL_L; }
u32 isWall() { return mFlags & (FLAG_WALL_R | FLAG_WALL_L); }
u32 isWall(u8 dir) { return mFlags & (FLAG_WALL_R << dir); }
u32 isFoot(); // { return mFlags & FLAG_FOOT; }
bool isFoot(); // { return mFlags & FLAG_FOOT; }
u32 isHead() { return mFlags & FLAG_HEAD; }
u32 isCollision() { return mFlags & (FLAG_WALL_L | FLAG_WALL_R | FLAG_FOOT | FLAG_HEAD); }

Expand Down
75 changes: 75 additions & 0 deletions include/game/bases/d_boss_life.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#pragma once

/// @brief Interface for tracking the life of a boss enemy.
class dBossLifeInf_c {
public:
dBossLifeInf_c(int life) : mLife(life) {}

virtual ~dBossLifeInf_c() {}
virtual bool isNonDamage() const = 0;
virtual bool isOneDamage() const = 0;
virtual bool isTwoDamage() const = 0;
virtual bool isDmgSection() const { return false; }
virtual int getDamage_Fire() const = 0;
virtual int getDamage_Fumi() const = 0;
virtual int getDamage_HipAtk() const = 0;
virtual int getDamage_Star() const = 0;
virtual int getDamage_PenguinSlide() const = 0;
virtual int getDamage_BlockHit() const = 0;
virtual int getDamage_Shell() const = 0;
virtual int getDamage_Quake() const = 0;
virtual void damageRev(int) {}

int updateCommon(int dmg) {
mLife -= dmg;
if (mLife > 0) {
damageRev(dmg);
}
return mLife;
}

int updateFire() { return updateCommon(getDamage_Fire()); }
int updateFumi() { return updateCommon(getDamage_Fumi()); }
int updateHipAtk() { return updateCommon(getDamage_HipAtk()); }
int updateStar() { return updateCommon(getDamage_Star()); }
int updatePenguinSlide() { return updateCommon(getDamage_PenguinSlide()); }
int updateBlockHit() { return updateCommon(getDamage_BlockHit()); }
int updateShell() { return updateCommon(getDamage_Shell()); }
int updateQuake() { return updateCommon(getDamage_Quake()); }

int mLife;
};

/// @brief A base implementation of dBossLifeInf_c.
/// @details The boss's life is divided into sections of 6 HP each.
class dBossLife_Common_c : public dBossLifeInf_c {
public:
dBossLife_Common_c(int num) : dBossLifeInf_c(num) {}
virtual ~dBossLife_Common_c() {}

int getSection() const { return (mLife - 1) / 6; }

virtual bool isNonDamage() const override {
return getSection() > 1;
}
virtual bool isOneDamage() const override {
return getSection() > 0 && getSection() < 2;
}
virtual bool isTwoDamage() const override {
return getSection() <= 0;
}

virtual bool isDmgSection() const override { return mLife % 6 == 0; }
virtual void damageRev(int dmg) override {
int sections = mLife / 6;
if (mLife - sections * 6 != 0 && dmg >= 6) { mLife = (sections + 1) * 6; };
}
virtual int getDamage_Fire() const override { return 1; }
virtual int getDamage_Fumi() const override { return 6; }
virtual int getDamage_HipAtk() const override { return 6; }
virtual int getDamage_Star() const override { return 6; }
virtual int getDamage_PenguinSlide() const override { return 6; }
virtual int getDamage_BlockHit() const override { return 6; }
virtual int getDamage_Shell() const override { return 6; }
virtual int getDamage_Quake() const override { return 6; }
};
1 change: 1 addition & 0 deletions include/game/bases/d_enemy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ class dEn_c : public dActorMultiState_c {
enum FLAGS_e {
EN_IS_SHELL = BIT_FLAG(0),
EN_IS_HARD = BIT_FLAG(1),
EN_FLAG_4 = BIT_FLAG(4),
EN_FLAG_16 = BIT_FLAG(16),
EN_FLAG_24 = BIT_FLAG(24)
};
Expand Down
125 changes: 125 additions & 0 deletions include/game/bases/d_enemy_boss.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#pragma once

#include <game/bases/d_enemy.hpp>
#include <game/bases/d_boss_life.hpp>
#include <game/bases/d_audio.hpp>
#include <game/bases/d_heap_allocator.hpp>
#include <constants/sound_list.h>

/// @brief The base class for boss enemies.
class dEnBoss_c : public dEn_c {
public:
struct GlobalData_t {
bool mInstantKill;
};

dEnBoss_c();
virtual ~dEnBoss_c();

// fBase_c overrides

virtual int create();
virtual int preExecute();
virtual void postExecute(MAIN_STATE_e state);

// dEn_c overrides

virtual void FumiScoreSet(dActor_c *actor) {}
virtual void Normal_VsPlHitCheck(dCc_c *self, dCc_c *other);
virtual void Normal_VsYoshiHitCheck(dCc_c *self, dCc_c *other);
virtual bool hitCallback_Fire(dCc_c *self, dCc_c *other);
virtual bool hitCallback_Shell(dCc_c *self, dCc_c *other);
virtual bool hitCallback_HipAttk(dCc_c *self, dCc_c *other);
virtual bool hitCallback_Spin(dCc_c *self, dCc_c *other);
virtual bool hitCallback_Star(dCc_c *self, dCc_c *other);
virtual bool hitCallback_Ice(dCc_c *self, dCc_c *other) { iceballInvalid(self, other); return false; }
virtual bool hitCallback_Slip(dCc_c *self, dCc_c *other) { return false; }
virtual bool hitCallback_WireNet(dCc_c *self, dCc_c *other) { return false; }
virtual bool hitCallback_PenguinSlide(dCc_c *self, dCc_c *other);
virtual void setDeathInfo_Quake(int);
virtual bool isQuakeDamage();

// New virtual functions

STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DemoWait);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieFumi);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieFire);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieSlide);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieShell);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieStar);
STATE_VIRTUAL_FUNC_DECLARE(dEnBoss_c, DieQuake);

virtual void setBattleReady() {}
virtual void createModel() {}
virtual void createBossLife();
virtual int createInit();
virtual void tenmetsuReady() {} ///< Prepares the flashing effect after the boss takes damage.
virtual void tenmetsuProc() {} ///< Handles the flashing effect after the boss takes damage.
virtual void tenmetsuFin() {} ///< Ends the flashing effect after the boss takes damage.
virtual int getTenmetsuTime_Fire() { return 40; }
virtual int getTenmetsuTime_Shell() { return 40; }
virtual int getTenmetsuTime_Press() { return 40; }
virtual void deadAllKill();
virtual void setFumiDamage(dActor_c *) {}
virtual void setFumiDead(dActor_c *) {}
virtual void setFireDamage(dActor_c *) {}
virtual void setFireDead(dActor_c *) {}
virtual void setHipatkDamage(dActor_c *actor) { setFumiDamage(actor); }
virtual void setHipatkDead(dActor_c *actor) { setFumiDead(actor); }
virtual void setSlideDamage(dActor_c *) {}
virtual void setSlideDead(dActor_c *) {}
virtual void setStarDamage(dActor_c *) {}
virtual void setStarDead(dActor_c *) {}
virtual void setQuakeDamage() {}
virtual void setQuakeDead() {}
virtual void setShellDamage(dActor_c *) {}
virtual void setShellDead(dActor_c *) {}
virtual void damageProc() {}
virtual void deadProc() {}
virtual bool isFumiInvalid() const { return false; }
virtual bool isFumiDmgInvalid() const { return false; }
virtual bool isFireInvalid() const { return false; }
virtual bool isSlideInvalid() const { return true; }
virtual bool isShellInvalid() const { return false; }
virtual bool isStarInvalid() const { return false; }
virtual void fumideadEffect() {}
virtual void fumidmgEffect() {}
virtual void hitFireEffect() {}
virtual void hitShellEffect() {}
virtual void fumidmgSE() { playSE(SE_BOSS_CMN_STOMPED); }
virtual void fumideadSE() { playSE(SE_BOSS_CMN_STOMPED_LAST1); }
virtual void stardmgSE() { playSE(SE_BOSS_CMN_DAMAGE_STAR_DEF); }
virtual void stardeadSE() { playSE(SE_BOSS_CMN_DAMAGE_STAR_LAST); }
virtual void shelldmgSE() { playSE(SE_BOSS_CMN_DAMAGE_DEF);}
virtual void shelldeadSE() { playSE(SE_BOSS_CMN_DAMAGE_LAST);}
virtual void firedmgSE() { mpBossLife->isDmgSection() ? playSE(SE_BOSS_CMN_DAMAGE_FIRE_DEF) : playSE(SE_BOSS_CMN_DAMAGE_FIRE); }
virtual void firedeadSE() { playSE(SE_BOSS_CMN_DAMAGE_FIRE_LAST); }
virtual void quakedmgSE() { playSE(SE_BOSS_CMN_DAMAGE_STAR_DEF); }
virtual void quakedeadSE() { playSE(SE_BOSS_CMN_DAMAGE_STAR_LAST);}
virtual void fumiDeadVo() {}
virtual void damageSVo() {}
virtual void damageLVo() {}

void getTenmetsuTimePress(bool a) {
/// [Get weak function placement to work out]
if (a) {
tenmetsuReady();
}
mTenmetsuTime = getTenmetsuTime_Press();
tenmetsuReady();
}

void playSE(ulong soundID) { mSndObject.startSound(soundID, m_d0, 0); }
int getLife() const { return mpBossLife->mLife; }
bool isDead() const { return mpBossLife->mLife <= 0; }

void allocate();
void fumiProc(dActor_c *actor);

dHeapAllocator_c mAllocator;
int mTenmetsuTime; ///< Timer for the flashing effect when the boss takes damage.
dAudio::SndObjctEmy_c mSndObject;
u16 m_d0;
u32 mQuakeDamage;
dBossLifeInf_c *mpBossLife;
};
21 changes: 21 additions & 0 deletions include/game/sLib/s_State.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,24 @@
&class::executeState_##name, \
&class::finalizeState_##name \
);

/// @brief Defines a virtual state.
/// @param class The class name.
/// @param name The state name.
/// @hideinitializer
#define STATE_VIRTUAL_DEFINE_INH(class, name, inherit) \
template <typename T> \
static const sStateIDIf_c &baseID_##name() { \
return T::StateID_##name; \
} \
template <> \
const sStateIDIf_c &baseID_##name<sStateID_c>() { \
return sStateID::null; \
} \
sFStateVirtualID_c<class> class::StateID_##name( \
baseID_##name<inherit>(), \
#class "::StateID_" #name, \
&class::initializeState_##name, \
&class::executeState_##name, \
&class::finalizeState_##name \
);
14 changes: 13 additions & 1 deletion slices/wiimj2d.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@
"GetRuntimeTypeInfo__Q34nw4r3lyt4PaneCFv",
"setPosParam__Q23EGG14CoreControllerFff",
"getFileSize__Q23EGG7DvdFileCFv",
"isItemKinopio__7dAcPy_cFv"
"isItemKinopio__7dAcPy_cFv",
"__dt__11SndObjctEmyFv"
],
"slices": [
{
Expand Down Expand Up @@ -306,6 +307,17 @@
".sdata2": "0x1120-0x11a8"
}
},
{
"source": "dol/bases/d_enemy_boss.cpp",
"memoryRanges": {
".text": "0x91bd0-0x94520",
".ctors": "0xd8-0xdc",
".data": "0x13be8-0x142a0",
".bss": "0x6028-0x61e8",
".sdata2": "0x11a8-0x11b0",
".sbss2": "0x8-0x10"
}
},
{
"source": "dol/bases/d_enemy_carry.cpp",
"memoryRanges": {
Expand Down
Loading
Loading