prime/include/MetroidPrime/Player/CMorphBall.hpp

287 lines
12 KiB
C++

#ifndef _CMORPHBALL
#define _CMORPHBALL
#include "Kyoto/Audio/CSfxHandle.hpp"
#include "Kyoto/CRandom16.hpp"
#include "Kyoto/Math/CQuaternion.hpp"
#include "Kyoto/Math/CTransform4f.hpp"
#include "Kyoto/Math/CVector3f.hpp"
#include "MetroidPrime/CActor.hpp"
#include "MetroidPrime/CEntityInfo.hpp"
#include "MetroidPrime/TGameTypes.hpp"
#include "Kyoto/Math/CFrustumPlanes.hpp"
#include "Kyoto/TOneStatic.hpp"
#include "Kyoto/TReservedAverage.hpp"
#include "Kyoto/TToken.hpp"
#include "Collision/CCollidableSphere.hpp"
#include "Collision/CCollisionInfoList.hpp"
class CActor;
class CActorLights;
class CElementGen;
class CFinalInput;
class CFrustumPlanes;
class CGenDescription;
class CModelData;
class CMorphBallShadow;
class CParticleSwoosh;
class CPlayer;
class CQuaternion;
class CRainSplashGenerator;
class CStateManager;
class CSwooshDescription;
class CToken;
class CWorldShadow;
class CMorphBall : public TOneStatic< CMorphBall > {
public:
enum EBallBoostState { kBBS_BoostAvailable, kBBS_BoostDisabled };
enum ESpiderBallState { kSBS_Inactive, kSBS_Active };
enum EBombJumpState { kBJS_BombJumpAvailable, kBJS_BombJumpDisabled };
CMorphBall(CPlayer&, float);
~CMorphBall();
EBallBoostState GetBallBoostState() const;
void SetBallBoostState(EBallBoostState state);
EBombJumpState GetBombJumpState() const;
void SetBombJumpState(EBombJumpState state);
void LoadMorphBallModel(CStateManager& mgr);
void Update(float dt, CStateManager& mgr);
void StopSounds();
void UpdateEffects(float dt, CStateManager& mgr);
void SetBallLightActive(CStateManager& mgr, const bool active);
CTransform4f GetBallToWorld() const;
float GetBallRadius() const;
void TakeDamage(float damage);
bool IsProjectile() const { return x1954_isProjectile; }
// LeaveMorphBallState__10CMorphBallFR13CStateManager global
// LeaveBoosting__10CMorphBallFv global
// CancelBoosting__10CMorphBallFv global
// InSpiderMode__10CMorphBallCFv weak
// SetAsProjectile__10CMorphBallFRC11CDamageInfoRC11CDamageInfo global
// CollidedWith__10CMorphBallFRC9TUniqueIdRC18CCollisionInfoListR13CStateManager global
// SwitchToMarble__10CMorphBallFv global
bool GetIsInHalfPipeMode() const;
// DampLinearAndAngularVelocities__10CMorphBallFff global
// IsClimbable__10CMorphBallCFRC14CCollisionInfo global
void FluidFXThink(CActor::EFluidState state, CScriptWater& water, CStateManager& mgr);
// GetCollidableSphere__10CMorphBallCFv weak
// DrawCollisionPrimitive__10CMorphBallCFv global
// GetPrimitiveTransform__10CMorphBallCFv global
void TouchModel(const CStateManager&) const;
void Render(const CStateManager&, const CActorLights*) const;
// RenderDamageEffects__10CMorphBallCFRC13CStateManagerRC12CTransform4f global
// RenderSpiderBallElectricalEffects__10CMorphBallCFv global
// RenderEnergyDrainEffects__10CMorphBallCFRC13CStateManager global
void RenderMorphBallTransitionFlash(const CStateManager&) const;
const CModelData& GetModel() const { return *x58_ballModel.get(); }
// GetBallContactSurfaceNormal__10CMorphBallCFv weak
void PreRender(CStateManager&, const CFrustumPlanes&);
bool IsInFrustum(const CFrustumPlanes&) const;
float GetBallTouchRadius() const;
void Touch(CActor& actor, CStateManager& mgr);
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&);
// DeleteLight__10CMorphBallFR13CStateManager global
// EnterMorphBallState__10CMorphBallFR13CStateManager
// GetSwooshToWorld__10CMorphBallCFv global
// IsMorphBallTransitionFlashValid__10CMorphBallCFv global
// AddSpiderBallElectricalEffect__10CMorphBallFv global
// UpdateSpiderBallElectricalEffects__10CMorphBallFv global
// UpdateMorphBallTransitionFlash__10CMorphBallFf global
// DisableHalfPipeStatus__10CMorphBallFv global
// SetIsInHalfPipeMode__10CMorphBallFb global
// SetIsInHalfPipeModeInAir__10CMorphBallFb global
// SetTouchedHalfPipeRecently__10CMorphBallFb global
// ResetMorphBallTransitionFlash__10CMorphBallFv global
// CreateSpiderBallParticles__10CMorphBallFRC9CVector3fRC9CVector3f global
ESpiderBallState GetSpiderBallState() const { return x187c_spiderBallState; }
// GetMorphBallModel__10CMorphBallFRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>f global
// LoadAnimationTokens__10CMorphBallFRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator> global
// IsBoosting__10CMorphBallCFv weak
// GetBoostChargeTimer__10CMorphBallCFv weak
// GetWallBumpCounter__10CMorphBallCFv weak
// GetBallContactMaterials__10CMorphBallCFv weak
void ComputeBallMovement(const CFinalInput&, CStateManager&, float);
// ComputeBoostBallMovement__10CMorphBallFRC11CFinalInputRC13CStateManagerf global
// IsMovementAllowed__10CMorphBallCFv global
// EnterBoosting__10CMorphBallFv global
// SwitchToTire__10CMorphBallFv global
// ComputeMarioMovement__10CMorphBallFRC11CFinalInputR13CStateManagerf global
// SetSpiderBallState__10CMorphBallFQ210CMorphBall16ESpiderBallState weak
// UpdateSpiderBall__10CMorphBallFRC11CFinalInputR13CStateManagerf global
// CheckForSwitchToSpiderBallSwinging__10CMorphBallCFR13CStateManager global
// FindClosestSpiderBallWaypoint__10CMorphBallCFR13CStateManagerRC9CVector3fR9CVector3fR9CVector3fR9CVector3fRfR9CVector3fRbR12CTransform4f global
// SetSpiderBallSwingingState__10CMorphBallFb global
// ResetSpiderBallSwingControllerMovementTimer__10CMorphBallFv global
// ApplySpiderBallSwingingForces__10CMorphBallFRC11CFinalInputR13CStateManagerf global
// GetSpiderBallControllerMovement__10CMorphBallCFRC11CFinalInputbb global
// UpdateSpiderBallSwingControllerMovementTimer__10CMorphBallFff global
// GetSpiderBallSwingControllerMovementScalar__10CMorphBallCFv global
// ApplySpiderBallRollForces__10CMorphBallFRC11CFinalInputR13CStateManagerf global
// CalculateSpiderBallAttractionSurfaceForces__10CMorphBallCFRC11CFinalInputR13CStateManagerRC12CTransform4f global
// ForwardInput__10CMorphBallCFRC11CFinalInput global
// BallTurnInput__10CMorphBallCFRC11CFinalInput global
// ComputeMaxSpeed__10CMorphBallCFv global
bool GetIsInHalfPipeModeInAir() const;
// GetTouchedHalfPipeRecently__10CMorphBallCFv global
// ComputeLiftForces__10CMorphBallFRC9CVector3fRC9CVector3fRC13CStateManager global
void UpdateBallDynamics(CStateManager&, float);
bool BallCloseToCollision(const CStateManager& mgr, float dist, const CMaterialFilter& filter) const;
// UpdateHalfPipeStatus__10CMorphBallFR13CStateManagerf global
// CalculateSurfaceToWorld__10CMorphBallCFRC9CVector3fRC9CVector3fRC9CVector3f global
// UpdateMarbleDynamics__10CMorphBallFR13CStateManagerfRC9CVector3f global
// SpinToSpeed__10CMorphBallFfRC9CVector3ff global
// GetMinimumAlignmentSpeed__10CMorphBallCFv global
// CalculateBallContactInfo__10CMorphBallCFR9CVector3fR9CVector3f global
// CalculateSurfaceFriction__10CMorphBallCFv global
// ApplyFriction__10CMorphBallFf global
// ApplyGravity__10CMorphBallFR13CStateManager global
void Land();
void ResetMorphBallIceBreak();
void StopParticleWakes();
void EnableBallShadow();
void DisableBallShadow();
void PreRenderBallShadow(CStateManager&);
void SetDisableSpiderBallTime(float time);
u32 GetMorphballModelShader() const { return x5c_ballModelShader; } // name?
private:
struct CSpiderBallElectricityManager {
uint x0_effectIdx;
uint x4_lifetime;
uint x8_curFrame;
CSpiderBallElectricityManager(uint effectIdx, uint lifetime)
: x0_effectIdx(effectIdx), x4_lifetime(lifetime) {}
};
CPlayer& x0_player;
int x4_loadedModelId;
uint x8_ballGlowColorIdx;
float xc_radius;
CVector3f x10_boostControlForce;
CVector3f x1c_controlForce;
bool x28_tireMode;
float x2c_tireLeanAngle;
float x30_ballTiltAngle;
CCollidableSphere x38_collisionSphere;
rstl::single_ptr< CModelData > x58_ballModel;
uint x5c_ballModelShader;
rstl::single_ptr< CModelData > x60_spiderBallGlassModel;
uint x64_spiderBallGlassModelShader;
rstl::single_ptr< CModelData > x68_lowPolyBallModel;
uint x6c_lowPolyBallModelShader;
rstl::single_ptr< CModelData > x70_frozenBallModel;
CCollisionInfoList x74_collisionInfos;
char xc78_[0x187c - 0xc78];
ESpiderBallState x187c_spiderBallState;
CVector3f x1880_playerToSpiderNormal;
float x188c_spiderPullMovement;
CVector3f x1890_spiderTrackPoint;
CVector3f x189c_spiderInterpBetweenPoints;
CVector3f x18a8_spiderBetweenPoints;
float x18b4_linVelDamp;
float x18b8_angVelDamp;
bool x18bc_spiderNearby;
bool x18bd_touchingSpider;
bool x18be_spiderBallSwinging;
bool x18bf_spiderSwingInAir;
bool x18c0_isSpiderSurface;
CTransform4f x18c4_spiderSurfaceTransform;
float x18f4_spiderSurfacePivotAngle;
float x18f8_spiderSurfacePivotTargetAngle;
float x18fc_refPullVel;
float x1900_playerToSpiderTrackDist;
float x1904_swingControlDir;
float x1908_swingControlTime;
CVector2f x190c_normSpiderSurfaceForces;
float x1914_spiderTrackForceMag;
float x1918_spiderViewControlMag;
float x191c_damageTimer;
bool x1920_spiderForcesReset;
CTransform4f x1924_surfaceToWorld;
bool x1954_isProjectile;
rstl::vector< CToken > x1958_animationTokens;
TToken< CSwooshDescription > x1968_slowBlueTailSwoosh;
TToken< CSwooshDescription > x1970_slowBlueTailSwoosh2;
TToken< CSwooshDescription > x1978_jaggyTrail;
TToken< CGenDescription > x1980_wallSpark;
TToken< CGenDescription > x1988_ballInnerGlow;
TToken< CGenDescription > x1990_spiderBallMagnetEffect;
TToken< CGenDescription > x1998_boostBallGlow;
TToken< CSwooshDescription > x19a0_spiderElectric;
TToken< CGenDescription > x19a8_morphBallTransitionFlash;
TToken< CGenDescription > x19b0_effect_morphBallIceBreak;
rstl::single_ptr< CParticleSwoosh > x19b8_slowBlueTailSwooshGen;
rstl::single_ptr< CParticleSwoosh > x19bc_slowBlueTailSwooshGen2;
rstl::single_ptr< CParticleSwoosh > x19c0_slowBlueTailSwoosh2Gen;
rstl::single_ptr< CParticleSwoosh > x19c4_slowBlueTailSwoosh2Gen2;
rstl::single_ptr< CParticleSwoosh > x19c8_jaggyTrailGen;
rstl::single_ptr< CElementGen > x19cc_wallSparkGen;
rstl::single_ptr< CElementGen > x19d0_ballInnerGlowGen;
rstl::single_ptr< CElementGen > x19d4_spiderBallMagnetEffectGen;
rstl::single_ptr< CElementGen > x19d8_boostBallGlowGen;
rstl::single_ptr< CElementGen > x19dc_morphBallTransitionFlashGen;
rstl::single_ptr< CElementGen > x19e0_effect_morphBallIceBreakGen;
rstl::reserved_vector< rstl::pair< rstl::single_ptr< CParticleSwoosh >, bool >, 48 >
x19e4_spiderElectricGens;
rstl::list< CSpiderBallElectricityManager > x1b68_activeSpiderElectricList;
CRandom16 x1b80_rand;
rstl::reserved_vector< TToken< CGenDescription >, 8 > x1b84_wakeEffects;
rstl::reserved_vector< rstl::auto_ptr< CElementGen >, 8 > x1bc8_wakeEffectGens;
int x1c0c_wakeEffectIdx;
TUniqueId x1c10_ballInnerGlowLight;
rstl::single_ptr< CWorldShadow > x1c14_worldShadow;
rstl::single_ptr< CActorLights > x1c18_actorLights;
rstl::single_ptr< CRainSplashGenerator > x1c1c_rainSplashGen;
float x1c20_tireFactor;
float x1c24_maxTireFactor;
float x1c28_tireInterpSpeed;
bool x1c2c_tireInterpolating;
float x1c30_boostOverLightFactor;
float x1c34_boostLightFactor;
float x1c38_spiderLightFactor;
TReservedAverage< CQuaternion, 5 > x1c3c_ballOrientAvg;
TReservedAverage< CVector3f, 5 > x1c90_ballPosAvg;
TReservedAverage< float, 15 > x1cd0_liftSpeedAvg;
TReservedAverage< CVector3f, 15 > x1d10_liftControlForceAvg;
uint x1dc8_failsafeCounter;
CVector3f x1dcc_;
CVector3f x1dd8_;
bool x1de4_24_inBoost : 1;
bool x1de4_25_boostEnabled : 1;
float x1de8_boostChargeTime;
float x1dec_timeNotInBoost;
float x1df0_;
float x1df4_boostDrainTime;
bool x1df8_24_inHalfPipeMode : 1;
bool x1df8_25_inHalfPipeModeInAir : 1;
bool x1df8_26_touchedHalfPipeRecently : 1;
bool x1df8_27_ballCloseToCollision : 1;
float x1dfc_touchHalfPipeCooldown;
float x1e00_disableControlCooldown;
float x1e04_touchHalfPipeRecentCooldown;
CVector3f x1e08_prevHalfPipeNormal;
CVector3f x1e14_halfPipeNormal;
uint x1e20_ballAnimIdx;
CSfxHandle x1e24_boostSfxHandle;
CSfxHandle x1e28_wallHitSfxHandle;
CSfxHandle x1e2c_rollSfxHandle;
CSfxHandle x1e30_spiderSfxHandle;
ushort x1e34_rollSfx;
ushort x1e36_landSfx;
uint x1e38_wallSparkFrameCountdown;
EBallBoostState x1e3c_boostState;
EBombJumpState x1e40_bombJumpState;
float x1e44_damageEffect;
float x1e48_damageEffectDecaySpeed;
float x1e4c_damageTime;
rstl::single_ptr< CMorphBallShadow > x1e50_shadow;
};
CHECK_SIZEOF(CMorphBall, 0x1e58);
#endif // _CMORPHBALL