mirror of https://github.com/PrimeDecomp/prime.git
parent
d005719e62
commit
8b1f83efd8
|
@ -2,8 +2,8 @@
|
|||
|
||||
.section .data
|
||||
.balign 8
|
||||
.global lbl_803E6758
|
||||
lbl_803E6758:
|
||||
.global __vt__12CABSReaction
|
||||
__vt__12CABSReaction:
|
||||
# ROM: 0x3E3758
|
||||
.4byte 0
|
||||
.4byte 0
|
||||
|
@ -24,8 +24,8 @@ __dt__12CABSReactionFv:
|
|||
/* 801F154C 001EE4AC 93 E1 00 0C */ stw r31, 0xc(r1)
|
||||
/* 801F1550 001EE4B0 7C 7F 1B 79 */ or. r31, r3, r3
|
||||
/* 801F1554 001EE4B4 41 82 00 30 */ beq lbl_801F1584
|
||||
/* 801F1558 001EE4B8 3C 60 80 3E */ lis r3, lbl_803E6758@ha
|
||||
/* 801F155C 001EE4BC 38 03 67 58 */ addi r0, r3, lbl_803E6758@l
|
||||
/* 801F1558 001EE4B8 3C 60 80 3E */ lis r3, __vt__12CABSReaction@ha
|
||||
/* 801F155C 001EE4BC 38 03 67 58 */ addi r0, r3, __vt__12CABSReaction@l
|
||||
/* 801F1560 001EE4C0 90 1F 00 00 */ stw r0, 0(r31)
|
||||
/* 801F1564 001EE4C4 41 82 00 10 */ beq lbl_801F1574
|
||||
/* 801F1568 001EE4C8 3C 60 80 3E */ lis r3, __vt__18CAdditiveBodyState@ha
|
||||
|
@ -377,11 +377,11 @@ lbl_801F1A14:
|
|||
.global __ct__12CABSReactionFv
|
||||
__ct__12CABSReactionFv:
|
||||
/* 801F1A30 001EE990 3C A0 80 3E */ lis r5, __vt__18CAdditiveBodyState@ha
|
||||
/* 801F1A34 001EE994 3C 80 80 3E */ lis r4, lbl_803E6758@ha
|
||||
/* 801F1A34 001EE994 3C 80 80 3E */ lis r4, __vt__12CABSReaction@ha
|
||||
/* 801F1A38 001EE998 38 05 13 50 */ addi r0, r5, __vt__18CAdditiveBodyState@l
|
||||
/* 801F1A3C 001EE99C C0 02 AE D8 */ lfs f0, lbl_805ACBF8@sda21(r2)
|
||||
/* 801F1A40 001EE9A0 90 03 00 00 */ stw r0, 0(r3)
|
||||
/* 801F1A44 001EE9A4 38 A4 67 58 */ addi r5, r4, lbl_803E6758@l
|
||||
/* 801F1A44 001EE9A4 38 A4 67 58 */ addi r5, r4, __vt__12CABSReaction@l
|
||||
/* 801F1A48 001EE9A8 38 80 FF FF */ li r4, -1
|
||||
/* 801F1A4C 001EE9AC 38 00 00 00 */ li r0, 0
|
||||
/* 801F1A50 001EE9B0 90 A3 00 00 */ stw r5, 0(r3)
|
||||
|
|
|
@ -302,7 +302,7 @@ LIBS = [
|
|||
"MetroidPrime/CMessageScreen",
|
||||
"MetroidPrime/Enemies/CFlaahgraTentacle",
|
||||
"MetroidPrime/Weapons/GunController/CGSFidget",
|
||||
"MetroidPrime/BodyState/CABSReaction",
|
||||
["MetroidPrime/BodyState/CABSReaction", True],
|
||||
"MetroidPrime/Weapons/CIceProjectile",
|
||||
"MetroidPrime/Enemies/CFlyingPirate",
|
||||
"MetroidPrime/ScriptObjects/CScriptColorModulate",
|
||||
|
|
|
@ -16,6 +16,8 @@ class CPASDatabase {
|
|||
public:
|
||||
bool HasState(int id) const;
|
||||
const CPASAnimState* GetAnimState(int) const;
|
||||
|
||||
rstl::pair< float, int > FindBestAnimation(const CPASAnimParmData& data, int ignoreAnim) const;
|
||||
rstl::pair< float, int > FindBestAnimation(const CPASAnimParmData&, CRandom16&, int) const;
|
||||
|
||||
size_t GetNumAnimStates() const; // { return x0_states.size(); }
|
||||
|
|
|
@ -4,18 +4,25 @@
|
|||
#include "MetroidPrime/BodyState/CAdditiveBodyState.hpp"
|
||||
|
||||
class CABSReaction : public CAdditiveBodyState {
|
||||
float x4_weight;
|
||||
s32 x8_anim;
|
||||
pas::EAdditiveReactionType xc_type;
|
||||
bool x10_active;
|
||||
pas::EAnimationState GetBodyStateTransition(float dt, CBodyController& bc) const;
|
||||
void StopAnimation(CBodyController& bc);
|
||||
|
||||
public:
|
||||
CABSReaction();
|
||||
~CABSReaction();
|
||||
|
||||
void Start(CBodyController& bc, CStateManager& mgr) override;
|
||||
pas::EAnimationState UpdateBody(float dt, CBodyController& bc, CStateManager& mgr) override;
|
||||
void Shutdown(CBodyController& bc) override { StopAnimation(bc); }
|
||||
void Shutdown(CBodyController& bc) override;
|
||||
|
||||
float GetWeight() const { return x4_weight; }
|
||||
bool IsActive() const { return x10_active; }
|
||||
|
||||
private:
|
||||
float x4_weight;
|
||||
int x8_anim;
|
||||
pas::EAdditiveReactionType xc_type;
|
||||
bool x10_active;
|
||||
|
||||
pas::EAnimationState GetBodyStateTransition(float dt, CBodyController& bc);
|
||||
void StopAnimation(CBodyController& bc);
|
||||
};
|
||||
|
||||
#endif // _CABSREACTION
|
||||
|
|
|
@ -28,6 +28,7 @@ public:
|
|||
void FaceDirection(const CVector3f& v0, float dt);
|
||||
void EnableAnimation(bool enable);
|
||||
void PlayBestAnimation(const CPASAnimParmData& parms, CRandom16& r);
|
||||
bool HasIceBreakoutState();
|
||||
|
||||
void SetFallState(pas::EFallState state); // { x2f0_fallState = state; }
|
||||
pas::EFallState GetFallState() const; // { return x2f0_fallState; }
|
||||
|
|
|
@ -128,6 +128,29 @@ private:
|
|||
|
||||
//
|
||||
|
||||
class CBCAdditiveReactionCmd : public CBodyStateCmd {
|
||||
public:
|
||||
explicit CBCAdditiveReactionCmd()
|
||||
: CBodyStateCmd(kBSC_AdditiveReaction)
|
||||
, x8_weight(1.f)
|
||||
, xc_type(pas::kART_Invalid)
|
||||
, x10_active(false) {}
|
||||
|
||||
explicit CBCAdditiveReactionCmd(pas::EAdditiveReactionType type, float weight, bool active)
|
||||
: CBodyStateCmd(kBSC_AdditiveReaction), x8_weight(weight), xc_type(type), x10_active(active) {}
|
||||
|
||||
pas::EAdditiveReactionType GetType() const { return xc_type; }
|
||||
float GetWeight() const { return x8_weight; }
|
||||
bool GetIsActive() const { return x10_active; }
|
||||
|
||||
private:
|
||||
float x8_weight;
|
||||
pas::EAdditiveReactionType xc_type;
|
||||
bool x10_active;
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
class CBCSlideCmd : public CBodyStateCmd {
|
||||
public:
|
||||
explicit CBCSlideCmd()
|
||||
|
|
|
@ -61,7 +61,6 @@ public:
|
|||
count = x218_passedSoundCount;
|
||||
return mSoundPOINodes.data();
|
||||
}
|
||||
|
||||
CParticleDatabase& GetParticleDB() { return x120_particleDB; }
|
||||
const CParticleDatabase& GetParticleDB() const { return x120_particleDB; }
|
||||
// SetIsAnimating__9CAnimDataFb
|
||||
|
@ -108,12 +107,13 @@ public:
|
|||
// SetPhase__9CAnimDataFf -> SetPhase__11IAnimReaderFf
|
||||
void SetPhase(float ph);
|
||||
void AddAdditiveAnimation(uint idx, float weight, bool active, bool fadeOut);
|
||||
// DelAdditiveAnimation__9CAnimDataFUi
|
||||
void DelAdditiveAnimation(uint idx);
|
||||
// IsAdditiveAnimationActive__9CAnimDataCFUi
|
||||
const rstl::rc_ptr<CAnimTreeNode>& GetAdditiveAnimationTree(uint idx) const;
|
||||
// GetAnimationTree__9CAnimDataCFv
|
||||
// AnimationTree__9CAnimDataFv
|
||||
// IsAdditiveAnimation__9CAnimDataCFUi
|
||||
bool IsAdditiveAnimationAdded(uint idx) const;
|
||||
// UpdateAdditiveAnims__9CAnimDataFf
|
||||
// AdvanceAdditiveAnims__9CAnimDataFf
|
||||
// AddAdditiveSegData__9CAnimDataCFRC10CSegIdListR16CSegStatementSet
|
||||
|
|
|
@ -267,7 +267,7 @@ METROIDPRIME :=\
|
|||
$(BUILD_DIR)/asm/MetroidPrime/CMessageScreen.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CFlaahgraTentacle.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/Weapons/GunController/CGSFidget.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/BodyState/CABSReaction.o\
|
||||
$(BUILD_DIR)/src/MetroidPrime/BodyState/CABSReaction.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/Weapons/CIceProjectile.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CFlyingPirate.o\
|
||||
$(BUILD_DIR)/asm/MetroidPrime/ScriptObjects/CScriptColorModulate.o\
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
#include "MetroidPrime/BodyState/CABSReaction.hpp"
|
||||
|
||||
#include "MetroidPrime/BodyState/CBodyController.hpp"
|
||||
#include "MetroidPrime/CActor.hpp"
|
||||
#include "MetroidPrime/CAnimData.hpp"
|
||||
#include "MetroidPrime/CModelData.hpp"
|
||||
#include "MetroidPrime/CStateManager.hpp"
|
||||
|
||||
#include "Kyoto/Animation/CAnimTreeNode.hpp"
|
||||
#include "Kyoto/Animation/CPASAnimParmData.hpp"
|
||||
#include "Kyoto/Math/CloseEnough.hpp"
|
||||
|
||||
|
||||
CABSReaction::CABSReaction()
|
||||
: x4_weight(1.f), x8_anim(-1), xc_type(pas::kART_Invalid), x10_active(false) {}
|
||||
|
||||
void CABSReaction::Start(CBodyController& bc, CStateManager& mgr) {
|
||||
const CBCAdditiveReactionCmd* cmd =
|
||||
static_cast< const CBCAdditiveReactionCmd* >(bc.CommandMgr().GetCmd(kBSC_AdditiveReaction));
|
||||
x4_weight = cmd->GetWeight();
|
||||
xc_type = cmd->GetType();
|
||||
x10_active = cmd->GetIsActive();
|
||||
|
||||
CPASAnimParmData parms(pas::kAS_AdditiveReaction, CPASAnimParm::FromEnum(xc_type));
|
||||
rstl::pair< float, int > best = bc.GetPASDatabase().FindBestAnimation(parms, *mgr.Random(), -1);
|
||||
x8_anim = best.second;
|
||||
|
||||
if (x8_anim != -1) {
|
||||
CAnimData& animData = *bc.GetOwner().ModelData()->AnimationData();
|
||||
animData.AddAdditiveAnimation(x8_anim, GetWeight(), IsActive(), false);
|
||||
}
|
||||
}
|
||||
|
||||
pas::EAnimationState CABSReaction::UpdateBody(float dt, CBodyController& bc, CStateManager& mgr) {
|
||||
pas::EAnimationState st = GetBodyStateTransition(dt, bc);
|
||||
if (st == pas::kAS_Invalid) {
|
||||
if (x8_anim == -1)
|
||||
return pas::kAS_AdditiveIdle;
|
||||
|
||||
CAnimData& animData = *bc.GetOwner().ModelData()->AnimationData();
|
||||
if (x10_active) {
|
||||
if (bc.CommandMgr().GetCmd(kBSC_StopReaction)) {
|
||||
StopAnimation(bc);
|
||||
st = pas::kAS_AdditiveIdle;
|
||||
bc.GetOwner().RemoveEmitter();
|
||||
}
|
||||
} else {
|
||||
if (animData.IsAdditiveAnimationAdded(x8_anim)) {
|
||||
CCharAnimTime rem = animData.GetAdditiveAnimationTree(x8_anim)->VGetTimeRemaining();
|
||||
if (close_enough(rem.GetSeconds(), 0.0f)) {
|
||||
StopAnimation(bc);
|
||||
st = pas::kAS_AdditiveIdle;
|
||||
}
|
||||
} else {
|
||||
st = pas::kAS_AdditiveIdle;
|
||||
}
|
||||
}
|
||||
}
|
||||
return st;
|
||||
}
|
||||
|
||||
void CABSReaction::Shutdown(CBodyController& bc) override { StopAnimation(bc); }
|
||||
|
||||
bool CBodyController::HasIceBreakoutState() {
|
||||
// Inline function that ends here?
|
||||
CPASAnimParmData parms(pas::kAS_AdditiveReaction, CPASAnimParm::FromEnum(pas::kART_IceBreakout));
|
||||
const CPASDatabase& db = GetPASDatabase();
|
||||
rstl::pair< float, int > best = db.FindBestAnimation(parms, -1);
|
||||
return best.first > 0.f;
|
||||
}
|
||||
|
||||
pas::EAnimationState CABSReaction::GetBodyStateTransition(float dt, CBodyController& bc) {
|
||||
CBodyStateCmdMgr& commandMgr = bc.CommandMgr();
|
||||
|
||||
const CBCAdditiveReactionCmd* cmd =
|
||||
static_cast< const CBCAdditiveReactionCmd* >(bc.CommandMgr().GetCmd(kBSC_AdditiveReaction));
|
||||
if (cmd != nullptr && cmd->GetType() == pas::kART_IceBreakout)
|
||||
return pas::kAS_AdditiveReaction;
|
||||
|
||||
return pas::kAS_Invalid;
|
||||
}
|
||||
|
||||
void CABSReaction::StopAnimation(CBodyController& bc) {
|
||||
if (x8_anim != -1) {
|
||||
CAnimData& animData = *bc.GetOwner().ModelData()->AnimationData();
|
||||
animData.DelAdditiveAnimation(x8_anim);
|
||||
x8_anim = -1;
|
||||
}
|
||||
}
|
||||
|
||||
CABSReaction::~CABSReaction() {}
|
|
@ -3,7 +3,6 @@
|
|||
#include "MetroidPrime/BodyState/CBodyController.hpp"
|
||||
#include "MetroidPrime/CStateManager.hpp"
|
||||
|
||||
|
||||
#include "Kyoto/Animation/CPASAnimParmData.hpp"
|
||||
|
||||
CBSStep::CBSStep() {}
|
||||
|
|
Loading…
Reference in New Issue