#pragma once #include #include #include #include #include #include #include namespace ksys::phys { class RagdollConfig : public agl::utl::IParameterIO, public sead::hostio::Node { public: class PartImpulseInfo : public agl::utl::ParameterList, public sead::hostio::Node { public: class ReceiveObj : public agl::utl::ParameterObj { public: ReceiveObj(); const auto& getTypeName() const { return *mTypeName; } const auto& getDivideFlag() const { return *mDivideFlag; } const auto& getImpulseRate() const { return *mImpulseRate; } const auto& getDivideRate() const { return *mDivideRate; } bool is100() const { return _100; } private: agl::utl::Parameter> mTypeName; agl::utl::Parameter mDivideFlag; agl::utl::Parameter mImpulseRate; agl::utl::Parameter mDivideRate; bool _100 = true; }; class ImpulseObj : public agl::utl::ParameterObj { public: ImpulseObj(); const auto& getTypeName() const { return *mTypeName; } const auto& getUseFlag() const { return *mUseFlag; } const auto& getAttackVector() const { return *mAttackVector; } const auto& getAttackPoint() const { return *mAttackPoint; } const auto& getImpulsePower() const { return *mImpulsePower; } bool is130() const { return _130; } private: agl::utl::Parameter> mTypeName; agl::utl::Parameter mUseFlag; agl::utl::Parameter mAttackVector; agl::utl::Parameter mAttackPoint; agl::utl::Parameter mImpulsePower; bool _130 = false; }; PartImpulseInfo(); const auto& getReceiveObjs() const { return mReceiveObjs; } const auto& getImpulseObjs() const { return mImpulseObjs; } const bool& isUseReceiveImpulse() const { return *mIsUseReceiveImpulse; } const bool& isUseFixedImpulse() const { return *mIsUseFixedImpulse; } private: sead::SafeArray mReceiveObjs; sead::SafeArray mImpulseObjs; agl::utl::IParameterObj mObj; agl::utl::Parameter mIsUseReceiveImpulse; agl::utl::Parameter mIsUseFixedImpulse; }; class ImpactImpulseInfo : public agl::utl::ParameterList, public sead::hostio::Node { public: ImpactImpulseInfo(); const auto& getPartImpulseInfo() const { return mPartImpulseInfo; } bool isUsed(int idx) const { return *mUseFlags[idx]; } private: static constexpr int NumParts = 3; sead::SafeArray mPartImpulseInfo; agl::utl::IParameterObj mObj; sead::SafeArray, NumParts> mUseFlags; }; RagdollConfig(); ~RagdollConfig() override; const auto& getImpactImpulseInfo() const { return mImpactImpulseInfo; } const float& getImpulseUseRate() const { return *mImpulseUseRate; } const float& getImpulsePower() const { return *mImpulsePower; } const float& getLargeAttackRate() const { return *mLargeAttackRate; } const float& getBlastOffAttackRateSmall() const { return *mBlastOffAttackRateSmall; } const float& getBlastOffAttackRateLarge() const { return *mBlastOffAttackRateLarge; } const float& getSpecialAttackRate() const { return *mSpecialAttackRate; } const PartImpulseInfo& getImpulseInfo(u32 impact_idx, int part_idx) const; float getImpulsePower(int attack_rate_type, bool is_blast_off) const; private: sead::SafeArray mImpactImpulseInfo; agl::utl::IParameterObj mObj; agl::utl::Parameter mImpulseUseRate; agl::utl::Parameter mImpulsePower; agl::utl::Parameter mLargeAttackRate; agl::utl::Parameter mBlastOffAttackRateSmall; agl::utl::Parameter mBlastOffAttackRateLarge; agl::utl::Parameter mSpecialAttackRate; }; } // namespace ksys::phys