diff --git a/data/file_list.yml b/data/file_list.yml index 3e6398931d..06443fb032 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -2348,7 +2348,7 @@ Boss/BombTail/BombTailBomb.o: - offset: 0x0101bc size: 4 label: _ZN12BombTailBomb20exeBeforeBattleStartEv - status: NotDecompiled + status: Matching - offset: 0x0101c0 size: 264 label: _ZN12BombTailBomb9exeAppearEv @@ -2589,7 +2589,7 @@ Boss/BombTail/BombTailCap.o: - offset: 0x0122ac size: 4 label: _ZN11BombTailCap20exeBeforeBattleStartEv - status: NotDecompiled + status: Matching - offset: 0x0122b0 size: 72 label: _ZN11BombTailCap7exeWaitEv @@ -3005,7 +3005,7 @@ Boss/BombTail/BombTailTail.o: - offset: 0x014ff8 size: 4 label: _ZN26BombTailTailJointCalulator10calcBounceEPKN4sead8Matrix34IfEEf - status: NotDecompiled + status: Matching - offset: 0x014ffc size: 172 label: _ZN26BombTailTailJointCalulator10calcReturnEv @@ -3097,7 +3097,7 @@ Boss/BombTail/BombTailTail.o: - offset: 0x0164c4 size: 4 label: _ZN12BombTailTail16startResetAttackEv - status: NotDecompiled + status: Matching - offset: 0x0164c8 size: 8 label: _ZN12BombTailTail14onAnimDynamicsEv @@ -3188,7 +3188,7 @@ Boss/BombTail/BombTailTailPartsModelUpdater.o: - offset: 0x016cfc size: 4 label: _ZN29BombTailTailPartsModelUpdater11preCalcAnimEv - status: NotDecompiled + status: Matching - offset: 0x016d00 size: 1076 label: _ZN29BombTailTailPartsModelUpdater10updatePoseEv @@ -3196,7 +3196,7 @@ Boss/BombTail/BombTailTailPartsModelUpdater.o: - offset: 0x017134 size: 4 label: _ZN29BombTailTailPartsModelUpdater14postEndClippedEv - status: NotDecompiled + status: Matching - offset: 0x017138 size: 16 label: _ZN29BombTailTailPartsModelUpdater12attackSensorEPN2al9HitSensorES2_ diff --git a/src/Boss/BombTail/BombTailBomb.cpp b/src/Boss/BombTail/BombTailBomb.cpp new file mode 100644 index 0000000000..a59ccd7c4d --- /dev/null +++ b/src/Boss/BombTail/BombTailBomb.cpp @@ -0,0 +1,3 @@ +#include "Boss/BombTail/BombTailBomb.h" + +void BombTailBomb::exeBeforeBattleStart() {} diff --git a/src/Boss/BombTail/BombTailBomb.h b/src/Boss/BombTail/BombTailBomb.h new file mode 100644 index 0000000000..974bbaca31 --- /dev/null +++ b/src/Boss/BombTail/BombTailBomb.h @@ -0,0 +1,61 @@ +#pragma once + +#include +#include + +#include "Library/LiveActor/LiveActor.h" + +class BombTailDamage; + +class BombTailBomb : public al::LiveActor { +public: + BombTailBomb(const char* name, const al::LiveActor* parent_actor); + void init(const al::ActorInitInfo& info) override; + bool tryStartFollow(const char* action_name); + void kill() override; + void calcAnim() override; + bool isChanceBomb() const; + void changeAtOnGround(const sead::Vector3f* position); + void startWaitForDemo(BombTailDamage* damage, const sead::Matrix34f* matrix); + void startBattle(); + void setTailThrowTargetPos(const sead::Vector3f& position); + void startAppear(BombTailDamage* damage, const sead::Matrix34f* matrix); + void startPrepareAttackChance(BombTailDamage* damage, const sead::Matrix34f* matrix); + void startPopUp(const sead::Vector3f& position, const sead::Vector3f& velocity, + BombTailDamage* damage, s32 delay); + void startExplosion(bool is_chance); + bool isReflect() const; + bool isReflectChance() const; + bool isLandChance() const; + bool isExplosioned() const; + void calcThrowChancePos(sead::Vector3f* position, f32 rate); + void attackSensor(al::HitSensor* self, al::HitSensor* other) override; + bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self) override; + void startAttackChanceSign(bool is_first, bool is_last); + void startAttackStart(al::LiveActor* actor); + void startThrow(f32 speed); + void invalidateFollowForChanceReflect(); + void syncReflectChance(); + void tryChanceEnd(); + void exeBeforeBattleStart(); + void exeAppear(); + void exeAppearChance(); + void exeFollowWait(); + void exeThrowPopup(); + void exeBound(); + void exeLand(); + void exeLandChance(); + void exeThrow(); + void exeReflect(); + void exeReflectCorrect(); + void exeExplosionSign(); + void exeBlowDown(); + void exeExplosion(); + void validateFollowForChanceReflect(); + +private: + char filler[0xe8]; +}; + +static_assert(sizeof(BombTailBomb) == 0x1f0); diff --git a/src/Boss/BombTail/BombTailCap.cpp b/src/Boss/BombTail/BombTailCap.cpp new file mode 100644 index 0000000000..46438e4a23 --- /dev/null +++ b/src/Boss/BombTail/BombTailCap.cpp @@ -0,0 +1,3 @@ +#include "Boss/BombTail/BombTailCap.h" + +void BombTailCap::exeBeforeBattleStart() {} diff --git a/src/Boss/BombTail/BombTailCap.h b/src/Boss/BombTail/BombTailCap.h new file mode 100644 index 0000000000..5ab78f9b2e --- /dev/null +++ b/src/Boss/BombTail/BombTailCap.h @@ -0,0 +1,33 @@ +#pragma once + +#include "Library/LiveActor/LiveActor.h" + +class BombTailCap : public al::LiveActor { +public: + BombTailCap(al::LiveActor* parent_actor); + void initCap(al::LiveActor* parent_actor, const al::ActorInitInfo& info); + void attackSensor(al::HitSensor* self, al::HitSensor* other) override; + bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self) override; + void appear() override; + void disappear(); + void startBattle(); + void startPanicEnd(); + void startResetAttack(); + void endResetAttack(); + void startReaction(); + void startReactionWithoutAnim(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self); + void exeAppearPanicEnd(); + void exeBeforeBattleStart(); + void exeWait(); + void exeBlowDown(); + void exeDisappear(); + void exeReaction(); + void exeResetAttackState(); + +private: + char filler[0x58]; +}; + +static_assert(sizeof(BombTailCap) == 0x160); diff --git a/src/Boss/BombTail/BombTailTail.cpp b/src/Boss/BombTail/BombTailTail.cpp new file mode 100644 index 0000000000..895fbed1f7 --- /dev/null +++ b/src/Boss/BombTail/BombTailTail.cpp @@ -0,0 +1,7 @@ +#include "Boss/BombTail/BombTailTail.h" + +void BombTailTailJointCalulator::calcBounce(const sead::Matrix34f* matrix, f32 value) { + calcTailBombThrowOld(matrix); +} + +void BombTailTail::startResetAttack() {} diff --git a/src/Boss/BombTail/BombTailTail.h b/src/Boss/BombTail/BombTailTail.h new file mode 100644 index 0000000000..246e1dc0d6 --- /dev/null +++ b/src/Boss/BombTail/BombTailTail.h @@ -0,0 +1,77 @@ +#pragma once + +#include +#include + +#include "Library/Joint/JointControllerBase.h" +#include "Library/LiveActor/LiveActor.h" + +class BombTailBomb; + +class BombTailTailJointController : public al::JointControllerBase { +public: + BombTailTailJointController(const sead::Matrix34f* matrix, const bool* is_control, f32 rate); + void calcJointCallback(s32 joint_index, sead::Matrix34f* matrix) override; + const char* getCtrlTypeName() const override; + +private: + char filler[0x48]; +}; + +static_assert(sizeof(BombTailTailJointController) == 0x70); + +class BombTailTailJointCalulator { +public: + BombTailTailJointCalulator(al::LiveActor* actor, const al::LiveActor* parent_actor); + void calcTailBombThrow(const sead::Matrix34f* matrix, s32 index, f32 rate); + void calcTailBombThrowOld(const sead::Matrix34f* matrix); + void calcBounce(const sead::Matrix34f* matrix, f32 value); + void calcReturn(); + void calcBombFollowMtx(sead::Matrix34f* matrix, f32 rate); + void validateControl(); + void controlTailVisAnim(); + void resetSampleFromAnim(); + +private: + char filler[0x58]; +}; + +static_assert(sizeof(BombTailTailJointCalulator) == 0x58); + +class BombTailTail : public al::LiveActor { +public: + BombTailTail(); + void initTail(const al::ActorInitInfo& info, al::LiveActor* parent_actor, const char* suffix, + s32 index); + void calcAnim() override; + void updateDepthShadowMap(); + void endClipped() override; + void control() override; + void attackSensor(al::HitSensor* self, al::HitSensor* other) override; + bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self) override; + void startBattle(); + void endBattle(); + void reset(); + void startThrow(BombTailBomb* bomb); + void endThrow(bool is_attack_end); + bool tryStartBounce(); + void updateBounce(const sead::Matrix34f& matrix, f32 rate); + void hitBounce(); + void startResetAttack(); + void onAnimDynamics(); + void offAnimDynamics(); + const sead::Matrix34f* getControlTopJointMtx() const; + f32 calcTailLength() const; + void exeBeforeBattleStart(); + void exeFollow(); + void exeThrow(); + void exeReturn(); + void exeBounce(); + void exeReflect(); + +private: + char filler[0xc8]; +}; + +static_assert(sizeof(BombTailTail) == 0x1d0); diff --git a/src/Boss/BombTail/BombTailTailPartsModelUpdater.cpp b/src/Boss/BombTail/BombTailTailPartsModelUpdater.cpp new file mode 100644 index 0000000000..1532c1b0fc --- /dev/null +++ b/src/Boss/BombTail/BombTailTailPartsModelUpdater.cpp @@ -0,0 +1,9 @@ +#include "Boss/BombTail/BombTailTailPartsModelUpdater.h" + +void BombTailTailPartsModelUpdater::preCalcAnim() { + updatePose(); +} + +void BombTailTailPartsModelUpdater::postEndClipped() { + updatePose(); +} diff --git a/src/Boss/BombTail/BombTailTailPartsModelUpdater.h b/src/Boss/BombTail/BombTailTailPartsModelUpdater.h new file mode 100644 index 0000000000..db81a77c1d --- /dev/null +++ b/src/Boss/BombTail/BombTailTailPartsModelUpdater.h @@ -0,0 +1,26 @@ +#pragma once + +namespace al { +class HitSensor; +class LiveActor; +class SensorMsg; +} // namespace al + +class BombTailTailPartsModelUpdater { +public: + BombTailTailPartsModelUpdater(); + void initPartsFixFileNoRegister(al::LiveActor* actor, al::LiveActor* parent_actor, + const char* suffix, const char* archive_name); + void preCalcAnim(); + void updatePose(); + void postEndClipped(); + void attackSensor(al::HitSensor* self, al::HitSensor* other); + bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other, al::HitSensor* self); + void offSyncAppearAndHide(); + void onSyncAppearAndHide(); + +private: + char filler[0x48]; +}; + +static_assert(sizeof(BombTailTailPartsModelUpdater) == 0x48);