Match and link CBSDie

This commit is contained in:
Henrique Gemignani Passos Lima 2022-10-28 11:57:00 +03:00
parent 3c1358dab1
commit 8996496d00
No known key found for this signature in database
GPG Key ID: E224F951761145F8
6 changed files with 91 additions and 9 deletions

View File

@ -3,8 +3,8 @@
.section .data .section .data
.balign 8 .balign 8
.global lbl_803E13A8 .global __vt__6CBSDie
lbl_803E13A8: __vt__6CBSDie:
# ROM: 0x3DE3A8 # ROM: 0x3DE3A8
.4byte 0 .4byte 0
.4byte 0 .4byte 0
@ -31,8 +31,8 @@ __dt__6CBSDieFv:
/* 80135658 001325B8 93 E1 00 0C */ stw r31, 0xc(r1) /* 80135658 001325B8 93 E1 00 0C */ stw r31, 0xc(r1)
/* 8013565C 001325BC 7C 7F 1B 79 */ or. r31, r3, r3 /* 8013565C 001325BC 7C 7F 1B 79 */ or. r31, r3, r3
/* 80135660 001325C0 41 82 00 30 */ beq lbl_80135690 /* 80135660 001325C0 41 82 00 30 */ beq lbl_80135690
/* 80135664 001325C4 3C 60 80 3E */ lis r3, lbl_803E13A8@ha /* 80135664 001325C4 3C 60 80 3E */ lis r3, __vt__6CBSDie@ha
/* 80135668 001325C8 38 03 13 A8 */ addi r0, r3, lbl_803E13A8@l /* 80135668 001325C8 38 03 13 A8 */ addi r0, r3, __vt__6CBSDie@l
/* 8013566C 001325CC 90 1F 00 00 */ stw r0, 0(r31) /* 8013566C 001325CC 90 1F 00 00 */ stw r0, 0(r31)
/* 80135670 001325D0 41 82 00 10 */ beq lbl_80135680 /* 80135670 001325D0 41 82 00 10 */ beq lbl_80135680
/* 80135674 001325D4 3C 60 80 3E */ lis r3, __vt__10CBodyState@ha /* 80135674 001325D4 3C 60 80 3E */ lis r3, __vt__10CBodyState@ha
@ -232,11 +232,11 @@ lbl_801358F0:
.global __ct__6CBSDieFv .global __ct__6CBSDieFv
__ct__6CBSDieFv: __ct__6CBSDieFv:
/* 8013590C 0013286C 3C A0 80 3E */ lis r5, __vt__10CBodyState@ha /* 8013590C 0013286C 3C A0 80 3E */ lis r5, __vt__10CBodyState@ha
/* 80135910 00132870 3C 80 80 3E */ lis r4, lbl_803E13A8@ha /* 80135910 00132870 3C 80 80 3E */ lis r4, __vt__6CBSDie@ha
/* 80135914 00132874 38 05 13 18 */ addi r0, r5, __vt__10CBodyState@l /* 80135914 00132874 38 05 13 18 */ addi r0, r5, __vt__10CBodyState@l
/* 80135918 00132878 C0 02 99 B0 */ lfs f0, lbl_805AB6D0@sda21(r2) /* 80135918 00132878 C0 02 99 B0 */ lfs f0, lbl_805AB6D0@sda21(r2)
/* 8013591C 0013287C 90 03 00 00 */ stw r0, 0(r3) /* 8013591C 0013287C 90 03 00 00 */ stw r0, 0(r3)
/* 80135920 00132880 38 84 13 A8 */ addi r4, r4, lbl_803E13A8@l /* 80135920 00132880 38 84 13 A8 */ addi r4, r4, __vt__6CBSDie@l
/* 80135924 00132884 38 00 00 00 */ li r0, 0 /* 80135924 00132884 38 00 00 00 */ li r0, 0
/* 80135928 00132888 90 83 00 00 */ stw r4, 0(r3) /* 80135928 00132888 90 83 00 00 */ stw r4, 0(r3)
/* 8013592C 0013288C D0 03 00 04 */ stfs f0, 4(r3) /* 8013592C 0013288C D0 03 00 04 */ stfs f0, 4(r3)

View File

@ -185,7 +185,7 @@ LIBS = [
"MetroidPrime/BodyState/CBodyStateCmdMgr", "MetroidPrime/BodyState/CBodyStateCmdMgr",
["MetroidPrime/BodyState/CBodyStateInfo", False], ["MetroidPrime/BodyState/CBodyStateInfo", False],
"MetroidPrime/BodyState/CBSAttack", "MetroidPrime/BodyState/CBSAttack",
"MetroidPrime/BodyState/CBSDie", ["MetroidPrime/BodyState/CBSDie", True],
"MetroidPrime/BodyState/CBSFall", "MetroidPrime/BodyState/CBSFall",
"MetroidPrime/BodyState/CBSGetup", "MetroidPrime/BodyState/CBSGetup",
"MetroidPrime/BodyState/CBSKnockBack", "MetroidPrime/BodyState/CBSKnockBack",

View File

@ -0,0 +1,22 @@
#ifndef _CBSDIE
#define _CBSDIE
#include "MetroidPrime/BodyState/CBodyState.hpp"
class CBSDie : public CBodyState {
public:
CBSDie();
~CBSDie();
bool IsDead() const override;
bool IsDying() const override;
void Start(CBodyController& bc, CStateManager& mgr) override;
pas::EAnimationState UpdateBody(float dt, CBodyController& bc, CStateManager& mgr) override;
void Shutdown(CBodyController&) override;
private:
float x4_remTime;
bool x8_isDead;
};
#endif // _CBSDIE

View File

@ -24,9 +24,12 @@ public:
void SetDeltaRotation(const CQuaternion& q); void SetDeltaRotation(const CQuaternion& q);
void SetCurrentAnimation(const CAnimPlaybackParms& parms, bool loop, bool noTrans); void SetCurrentAnimation(const CAnimPlaybackParms& parms, bool loop, bool noTrans);
void FaceDirection(const CVector3f& v0, float dt); void FaceDirection(const CVector3f& v0, float dt);
void EnableAnimation(bool enable);
bool IsAnimationOver() const { return x300_24_animationOver; } pas::EFallState GetFallState() const; // { return x2f0_fallState; }
pas::ELocomotionType GetLocomotionType() const { return x2ec_locomotionType; } pas::ELocomotionType GetLocomotionType() const { return x2ec_locomotionType; }
bool IsAnimationOver() const { return x300_24_animationOver; }
bool ShouldPlayDeathAnims() const { return x300_28_playDeathAnims; }
private: private:
CActor& x0_actor; CActor& x0_actor;
@ -39,6 +42,10 @@ private:
int x2f8_curAnim ; int x2f8_curAnim ;
float x2fc_turnSpeed; float x2fc_turnSpeed;
bool x300_24_animationOver : 1; bool x300_24_animationOver : 1;
bool x300_25_active : 1;
bool x300_26_frozen : 1;
bool x300_27_hasBeenFrozen : 1;
bool x300_28_playDeathAnims : 1;
}; };
#endif // _CBODYCONTROLLER #endif // _CBODYCONTROLLER

View File

@ -150,7 +150,7 @@ METROIDPRIME :=\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBodyStateCmdMgr.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBodyStateCmdMgr.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBodyStateInfo.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBodyStateInfo.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSAttack.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSAttack.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSDie.o\ $(BUILD_DIR)/src/MetroidPrime/BodyState/CBSDie.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSFall.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSFall.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSGetup.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSGetup.o\
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSKnockBack.o\ $(BUILD_DIR)/asm/MetroidPrime/BodyState/CBSKnockBack.o\

View File

@ -0,0 +1,53 @@
#include "MetroidPrime/BodyState/CBSDie.hpp"
#include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/CAnimPlaybackParms.hpp"
#include "MetroidPrime/BodyState/CBodyController.hpp"
#include "Kyoto/Animation/CPASAnimParmData.hpp"
#include "Kyoto/Animation/CPASDatabase.hpp"
CBSDie::CBSDie() : x4_remTime(0.0f), x8_isDead(false) {}
void CBSDie::Start(CBodyController& bc, CStateManager& mgr) override {
const CPASDatabase& db = bc.GetPASDatabase();
int fallState = bc.GetFallState();
bool shouldReset = true;
if (bc.ShouldPlayDeathAnims()) {
const CPASAnimParmData parms(pas::kAS_Death, CPASAnimParm::FromEnum(fallState));
const rstl::pair<float, int> best = db.FindBestAnimation(parms, *mgr.Random(), -1);
if (best.first > 0.f) {
const CAnimPlaybackParms playParms(best.second, -1, 1.f, true);
bc.SetCurrentAnimation(playParms, false, false);
x4_remTime = bc.GetAnimTimeRemaining();
shouldReset = false;
}
}
if (shouldReset) {
bc.EnableAnimation(false);
x4_remTime = bc.ShouldPlayDeathAnims() ? 3.f : 4.f;
}
x8_isDead = false;
}
pas::EAnimationState CBSDie::UpdateBody(float dt, CBodyController& bc,
CStateManager& mgr) override {
x4_remTime -= dt;
if (x4_remTime <= 0.f) {
bc.EnableAnimation(false);
x8_isDead = true;
}
return pas::kAS_Invalid;
}
void CBSDie::Shutdown(CBodyController&) override {}
bool CBSDie::IsDying() const override { return true; }
bool CBSDie::IsDead() const override { return x8_isDead; }
CBSDie::~CBSDie() {}