diff options
| author | Huitzi <73550465+marwernerh@users.noreply.github.com> | 2025-01-03 17:50:14 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-03 14:50:14 -0800 |
| commit | 960b08e88ca705c5953c86bdf3aabf89b0b312ee (patch) | |
| tree | 1922536fede122cedda81deed6200194b35cd155 /include | |
| parent | fac61aaf40fa9b8f868fd3dc179c67b332a747f0 (diff) | |
d_a_obj_waterPillar + d_a_obj_syRock Equivalent (weak ordering) (#2281)
* d_a_obj_waterPillar + d_a_obj_syRock Equivalent (weak ordering)
* Added fake struct padding
* Added fake Chk inlines to dBgS_Acch
* Added AT_TYPE_100 to cCcD_ObjAtType
* Addressed fakematch
* Deleted fake Chk inlines from dBgS_Acch
* Removed duplicated, but commented, static check for struct size
* Renamed two d_a_obj_waterPillar fields according to comments
* Removed explicit inline keywords & swapped use of PSMTX for debug-friendly MTX
Diffstat (limited to 'include')
| -rw-r--r-- | include/SSystem/SComponent/c_cc_d.h | 1 | ||||
| -rw-r--r-- | include/d/actor/d_a_obj_syRock.h | 114 | ||||
| -rw-r--r-- | include/d/actor/d_a_obj_waterPillar.h | 150 | ||||
| -rw-r--r-- | include/d/d_bg_s_acch.h | 2 |
4 files changed, 228 insertions, 39 deletions
diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index 00427f85e1..db50a57acd 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -37,6 +37,7 @@ enum cCcD_ObjAtType { /* 0x00000020 */ AT_TYPE_BOMB = (1 << 5), /* 0x00000040 */ AT_TYPE_40 = (1 << 6), /* 0x00000080 */ AT_TYPE_SLINGSHOT = (1 << 7), + /* 0x00000100 */ AT_TYPE_100 = (1 << 8), /* 0x00000200 */ AT_TYPE_LANTERN_SWING = (1 << 9), /* 0x00000400 */ AT_TYPE_CSTATUE_SWING = (1 << 10), /* 0x00000800 */ AT_TYPE_800 = (1 << 11), diff --git a/include/d/actor/d_a_obj_syRock.h b/include/d/actor/d_a_obj_syRock.h index 2a52b4471d..246cc726b3 100644 --- a/include/d/actor/d_a_obj_syRock.h +++ b/include/d/actor/d_a_obj_syRock.h @@ -1,57 +1,137 @@ #ifndef D_A_OBJ_SYROCK_H #define D_A_OBJ_SYROCK_H -#include "f_op/f_op_actor_mng.h" +#include "d/actor/d_a_obj_waterPillar.h" +#include "d/d_bg_s_movebg_actor.h" /** * @ingroup actors-objects * @class daSyRock_c * @brief Stalactite Rock * - * @details + * @details Breakable stalactites seen in Lakebed Temple * */ -class daSyRock_c : public fopAc_ac_c { +struct fakeSyRockPadding { + u8 a[8]; +}; + +class daSyRock_c : public dBgS_MoveBgActor, public fakeSyRockPadding, public dEvLib_callback_c { public: + daSyRock_c() : dEvLib_callback_c(this) {} + /* 80D03DAC */ ~daSyRock_c() {}; + /* 80D0237C */ void setBaseMtx(); - /* 80D02454 */ void CreateHeap(); - /* 80D02584 */ void create(); + /* 80D02454 */ int CreateHeap(); + /* 80D02584 */ cPhs__Step create(); /* 80D02AFC */ void setFallStat(); - /* 80D02BE0 */ void Execute(f32 (**)[3][4]); + /* 80D02BE0 */ int Execute(Mtx**); /* 80D02C54 */ void move(); /* 80D02E70 */ void init_modeWait(); /* 80D02E7C */ void modeWait(); - /* 80D02F88 */ void eventStart(); + /* 80D02F88 */ BOOL eventStart(); /* 80D02FB8 */ void init_modeDropInit(); /* 80D03070 */ void modeDropInit(); - /* 80D030A8 */ void searchWaterPillar(void*, void*); + /* 80D030A8 */ static void* searchWaterPillar(void*, void*); /* 80D03250 */ void init_modeDrop(); /* 80D03384 */ void modeDrop(); /* 80D033D0 */ void init_modeSink(); /* 80D03440 */ void modeSink(); /* 80D034E8 */ void init_modeMove(); /* 80D035F8 */ void modeMove(); - /* 80D036B8 */ void chkWaterLineIn(); + /* 80D036B8 */ BOOL chkWaterLineIn(); /* 80D036DC */ void bgCheck(); /* 80D03984 */ void init_modeDropEnd(); /* 80D03A48 */ void modeDropEnd(); - /* 80D03A4C */ void Draw(); - /* 80D03B08 */ void Delete(); - /* 80D03DAC */ ~daSyRock_c(); + /* 80D03A4C */ int Draw(); + /* 80D03B08 */ int Delete(); - static u8 const mCcDObjInfo[48]; - static u8 mCcDCyl[68]; + static dCcD_SrcGObjInf const mCcDObjInfo; + static dCcD_SrcCyl mCcDCyl; private: - /* 0x568 */ u8 field_0x568[0x9a0 - 0x568]; + /* 0x5B8 */ request_of_phase_process_class mPhase; + /* 0x5C0 */ J3DModel* mpModels[2]; + /* 0x5C8 */ u8 mMode; + /* 0x5C9 */ u8 mDropAutomaticallySwitchNo; + /* 0x5CC */ dCcD_Stts mStts; + /* 0x608 */ dCcD_Cyl mUnbrokenCylinderCollider; // Collider used to check for bomb/bomb arrow for breaking stalactite + /* 0x744 */ u8 mWaitFrames; + /* 0x748 */ u32 mShakeOscillationAngleStep; + /* 0x74C */ csXyz mShakeXZAngleOffset; + /* 0x754 */ f32 mShakeAmplitude; + /* 0x758 */ f32 mShakeXOscillationAngle; + /* 0x75C */ f32 mShakeZOscillationAngle; + /* 0x760 */ f32 mShakeDamping; + /* 0x764 */ f32 mShakeMaxDecay; + /* 0x768 */ f32 mShakeMinDecay; + /* 0x76C */ cXyz mUnderwaterRotatedStalactiteOffset; + /* 0x778 */ bool mInWaterPreviousFrame; + /* 0x779 */ u8 field_0x779; // Redundant variable, thus left unnamed + /* 0x77C */ dBgS_AcchCir mAcchCir; + /* 0x7BC */ dBgS_ObjAcch mAcch; + /* 0x994 */ daWtPillar_c* mpWaterPillar; + /* 0x998 */ dBgW* mpBrokenCollision; // Collision of broken stalactite + /* 0x99C */ u8 mIsUnbroken; + + // Stalactite should search for an associated water pillar on creation + BOOL getArg0() { + return shape_angle.x & 0xF; + } + + // Switch to determine whether or not the stalactite has been broken + u32 getSwBit1() { + return fopAcM_GetParamBit(this, 0, 8); + } + + // Switch to determine whether or not the stalactite should be broken automatically when player is in range + u32 getSwBit2() { + return fopAcM_GetParamBit(this, 8, 8); + } + + // Event ID for Midna to stop and note the stalactite that fell by itself + s32 getEvetID() { + return fopAcM_GetParamBit(this, 16, 8); + } + + enum Mode_e { + MODE_WAIT, + MODE_DROP_INIT, + MODE_DROP, + MODE_SINK, + MODE_MOVE, + MODE_DROP_END + }; }; STATIC_ASSERT(sizeof(daSyRock_c) == 0x9a0); -class daSyRock_HIO_c { +class daSyRock_HIO_c : public mDoHIO_entry_c { public: /* 80D022AC */ daSyRock_HIO_c(); - /* 80D03C44 */ ~daSyRock_HIO_c(); + /* 80D03C44 */ ~daSyRock_HIO_c() {}; + + /* 0x04 */ f32 mShakeAmplitude; // "揺れ強さ" "Shake strength" | Slider + /* 0x08 */ f32 mShakeXOscillationAngle; // "振幅X" "Amplitude X" | Slider + /* 0x0C */ f32 mShakeZOscillationAngle; // "振幅Z" "Amplitude Z" | Slider + /* 0x10 */ f32 mShakeDamping; // "揺れ減衰" "Shake damping" | Slider + /* 0x14 */ f32 mShakeMaxDecay; // "最大減衰量" "Maximum decay" | Slider + /* 0x18 */ f32 mShakeMinDecay; // "最小減衰量" "Minimum decay" | Slider + /* 0x1C */ f32 mFallAcceleration; // "落下速度" "Fall speed" | Slider + /* 0x20 */ f32 mMaxFallSpeed; // "最大落下速度" "Maximum falling speed" | Slider + /* 0x24 */ u8 mWaitFrames; // "wait time" | Slider (unused) + /* 0x25 */ u8 mShockStrength; // "振動" "Vibration" | Combo Box + /* "強さ1" "Strength 1" + "強さ2" "Strength 2" + "強さ3" "Strength 3" + "強さ4" "Strength 4" + "強さ5" "Strength 5" + "強さ6" "Strength 6" + "強さ7" "Strength 7" + "強さ8" "Strength 8" */ + /* 0x28 */ f32 mEffectScale; // "eff scale" | Slider + /* 0x2C */ f32 mFallWaterBouyancy; // "sink speed" | Slider + /* 0x30 */ f32 mMaxWaterPillarRange; // "renge" | "Range" | Slider }; diff --git a/include/d/actor/d_a_obj_waterPillar.h b/include/d/actor/d_a_obj_waterPillar.h index ecf3b19e48..af54ca5c79 100644 --- a/include/d/actor/d_a_obj_waterPillar.h +++ b/include/d/actor/d_a_obj_waterPillar.h @@ -1,29 +1,40 @@ #ifndef D_A_OBJ_WATERPILLAR_H #define D_A_OBJ_WATERPILLAR_H +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_event_lib.h" #include "f_op/f_op_actor_mng.h" /** * @ingroup actors-objects * @class daWtPillar_c - * @brief Water Column + * @brief Water Column/Pillar * - * @details + * @details Water columns that can carry broken stalactites (see d_a_obj_syrock) * */ -class daWtPillar_c : public fopAc_ac_c { + +struct fakeWtPillarPadding { + u8 a[8]; +}; + +class daWtPillar_c : public fopAc_ac_c, public fakeWtPillarPadding, public dEvLib_callback_c { public: + daWtPillar_c(); + ~daWtPillar_c() {} + /* 80D2C7B0 */ void setBaseMtx(); - /* 80D2C838 */ void createHeapCallBack(fopAc_ac_c*); - /* 80D2C858 */ void CreateHeap(); - /* 80D2C960 */ void create(); - /* 80D2CC0C */ void execute(); + /* 80D2C838 */ static int createHeapCallBack(fopAc_ac_c*); + /* 80D2C858 */ int CreateHeap(); + /* 80D2C960 */ cPhs__Step create(); + /* 80D2CC0C */ int execute(); /* 80D2CE4C */ void actionMain(); /* 80D2CF98 */ void effectSet(); /* 80D2D278 */ void effectSet2(); /* 80D2D3FC */ void actionSwWaitInit(); /* 80D2D408 */ void actionSwWait(); - /* 80D2D488 */ void eventStart(); + /* 80D2D488 */ virtual BOOL eventStart(); /* 80D2D4AC */ void actionWaitInit(); /* 80D2D588 */ void actionWait(); /* 80D2D5C0 */ void actionUpFirstInit(); @@ -42,27 +53,124 @@ public: /* 80D2DC2C */ void actionRockOn(); /* 80D2DD0C */ void actionEndInit(); /* 80D2DD18 */ void actionEnd(); - /* 80D2DDB0 */ void getPillarHeight(); - /* 80D2DDB8 */ void draw(); - /* 80D2DE84 */ void _delete(); - /* 80D2E054 */ daWtPillar_c(); - /* 80D2E430 */ ~daWtPillar_c(); + /* 80D2DDB0 */ f32 getPillarHeight(); + /* 80D2DDB8 */ int draw(); + /* 80D2DE84 */ int _delete(); + + static dCcD_SrcGObjInf const mCcDObjInfo; + static dCcD_SrcGObjInf const mCcDObjCoInfo; + static dCcD_SrcCps mCcDCps; + static dCcD_SrcCyl mCcDCyl; + + void onRockFlag() { + mIsCarryingStalactite = true; + } + + cXyz getPos() { + return mTopPos; + } + + u8 isRockYure() { + return mStalactiteShouldStartShaking; + } - static u8 const mCcDObjInfo[48]; - static u8 const mCcDObjCoInfo[48]; - static u8 mCcDCps[76]; - static u8 mCcDCyl[68]; + void clearRockYure() { + mStalactiteShouldStartShaking = false; + } private: - /* 0x568 */ u8 field_0x568[0xb7c - 0x568]; + /* 0x584 */ request_of_phase_process_class mPhase; + /* 0x58C */ J3DModel* mpModel; + /* 0x590 */ mDoExt_btkAnm mVerticalTextureScrollAnimation; + /* 0x5A8 */ mDoExt_bckAnm mModelRotationAnimation; + /* 0x5C4 */ dBgS_ObjAcch mAcch; + /* 0x79C */ dBgS_AcchCir mAcchCir; + /* 0x7DC */ dCcD_Stts mStts; + /* 0x818 */ dCcD_Cps mCapsuleCollider; + /* 0x95C */ dCcD_Cyl mCylinderCollider; + /* 0xA98 */ u8 pad0[0x3C]; + /* 0xAD4 */ f32 mScaleX; // Modified but never read; unused? + /* 0xAD8 */ u8 pad1[0x4]; + /* 0xADC */ f32 mScaleZ; // Modified but never read; unused? + /* 0xAE0 */ f32 mCurrentHeight; + /* 0xAE4 */ cM3dGCpsS mCapsuleSource; + /* 0xB00 */ u8 mAction; + /* 0xB02 */ u16 mWaitFrameDelay; + /* 0xB04 */ f32 mTargetMaxSpeed; + /* 0xB08 */ u8 mSwitchNo; + /* 0xB09 */ u8 mType; + /* 0xB0A */ u8 pad2[0x6]; + /* 0xB10 */ f32 mFirstTargetHeight; + /* 0xB14 */ f32 mMaxHeight; + /* 0xB18 */ f32 mTargetHeightStalactiteOffset; + /* 0xB1C */ f32 mRelativeWaterHeight; + /* 0xB20 */ u32 mEffectOscillationAngleStep; + /* 0xB24 */ cXyz mEffectOscillationVerticalOffset; + /* 0xB30 */ f32 mEffectOscillationAngle; + /* 0xB34 */ f32 mEffectOscillationAmplitude; + /* 0xB38 */ f32 mEffectOscillationDampingScale; + /* 0xB3C */ f32 mEffectOscillationMaxDecay; + /* 0xB40 */ f32 mEffectOscillationMinDecay; + /* 0xB44 */ u8 field_0xB44; // Modified, but never read; unused? + /* 0xB45 */ u8 mStartedRisingOrDoesNotRiseAndFall; + /* 0xB46 */ u8 mPillarIsPreparingToRise; + /* 0xB48 */ u32 mBottomAndTopParticleEmmitters[7]; + /* 0xB64 */ u32 mWaterSurfaceParticleEmitters[2]; + /* 0xB6C */ cXyz mTopPos; + /* 0xB78 */ s8 mStalactiteShouldStartShaking; // Modified by d_a_obj_syRock + /* 0xB79 */ u8 mIsCarryingStalactite; // Modified by d_a_obj_syRock + + s32 getEventID() { + return shape_angle.x & 0xFF; + } + + s32 getParam(u8 shift, u8 bit) { + return fopAcM_GetParamBit(this, shift, bit); + } + + enum Action_e { + ACTION_SW_WAIT, + ACTION_WAIT, + ACTION_UP_FIRST, ACTION_UP_FIRST_WAIT, + ACTION_UP, ACTION_UP_WAIT, + ACTION_DOWN, + ACTION_ROCK_WAIT, ACTION_ROCK_ON, + ACTION_END + }; + + enum Type_e { + STATIC, + RISES_AND_FALLS + }; }; + STATIC_ASSERT(sizeof(daWtPillar_c) == 0xb7c); -class daWtPillar_HIO_c { -public: +struct daWtPillar_HIO_c : public mDoHIO_entry_c { /* 80D2C6CC */ daWtPillar_HIO_c(); - /* 80D2DF34 */ ~daWtPillar_HIO_c(); + /* 80D2DF34 */ ~daWtPillar_HIO_c() {}; + + /* 0x04 */ cXyz field_0x04; + /* 0x10 */ csXyz field_0x10; + /* 0x16 */ s8 mForTesting; // "----------- テスト用 ----------" "----------- For Testing ----------" | Checkbox + /* 0x17 */ s8 mDisableDrawing; // "モデル描画OFF" "Model Drawing OFF" | Checkbox + /* 0x18 */ s8 mStopTime; // "停止時間" "Stop time" | Slider + /* 0x19 */ u8 mUpFirstWaitFrames; // "待ち時間" "Waiting time" | Slider + /* 0x1A */ u8 field_0x1A[6]; + /* 0x20 */ f32 field_0x20; // "速度" "Velocity" | Slider + /* 0x24 */ u8 field_0x24[4]; + /* 0x28 */ f32 field_0x28; // mColliderUpdateScaleFactor? + /* 0x2C */ u8 mUpWaitFrames; // "待ち時間" "Waiting time" | Slider + /* 0x2D */ u8 field_0x2D[4]; + /* 0x34 */ f32 field_0x34; // "速度" "Velocity" | Slider + /* 0x38 */ u8 field_0x38[8]; + /* 0x40 */ f32 mDownwardSpeedUnitsPerSecond; // "速度" "Velocity" | Slider + /* 0x44 */ f32 mEffectOscillationAngle; // "振幅Y" "Y Amplitude" | Slider + /* 0x48 */ f32 mEffectOscillationAmplitude; // "移動強さ" "Moving strength" | Slider + /* 0x4C */ f32 mEffectOscillationDampingScale; // "揺れ減衰" "Sway damping" | Slider + /* 0x50 */ f32 mEffectOscillationMaxDecay; // "最大減衰量" "Maximum decay" | Slider + /* 0x54 */ f32 mEffectOscillationMinDecay; // "最小減衰量" "Minimum decay" | Slider }; diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 264cf90850..512a3c9b62 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -194,7 +194,7 @@ public: // inline dupe void i_ClrGroundHit() { m_flags &= ~GROUND_HIT; } u32 i_ChkGroundHit() const { return m_flags & GROUND_HIT; } - + public: /* 0x02C */ u32 m_flags; /* 0x030 */ cXyz* pm_pos; |
