diff --git a/config/ShieldD/rels/d_a_obj_ice_sD/symbols.txt b/config/ShieldD/rels/d_a_obj_ice_sD/symbols.txt index 2b57b302f33..6579a71a393 100644 --- a/config/ShieldD/rels/d_a_obj_ice_sD/symbols.txt +++ b/config/ShieldD/rels/d_a_obj_ice_sD/symbols.txt @@ -94,5 +94,5 @@ __RTTI__12daObjIce_s_c = .data:0x00000160; // type:object size:0x8 scope:global @STRING@CreateHeap__12daObjIce_s_cFv@0 = .data:0x0000028C; // type:object size:0x12 scope:local data:string @STRING@CreateHeap__12daObjIce_s_cFv = .data:0x000002A0; // type:object size:0xA scope:local data:string lbl_468_data_2AA = .data:0x000002AA; // type:object size:0x72 -lbl_468_bss_0 = .bss:0x00000000; // type:object size:0x1 data:byte +l_HIOInit = .bss:0x00000000; // type:object size:0x1 data:byte l_HIO = .bss:0x00000008; // type:object size:0x10 scope:global data:byte diff --git a/include/d/actor/d_a_obj_ice_s.h b/include/d/actor/d_a_obj_ice_s.h index f5f77d4c39a..e59ed016bfc 100644 --- a/include/d/actor/d_a_obj_ice_s.h +++ b/include/d/actor/d_a_obj_ice_s.h @@ -20,8 +20,8 @@ public: bool Check_RideOn(cXyz); void initBaseMtx(); void setBaseMtx(); - int create(); - int CreateHeap(); + inline int create(); + inline int CreateHeap(); int Create(); int Execute(Mtx**); int Draw(); @@ -32,23 +32,21 @@ public: /* 0x5A8 */ f32 field_0x5a8; /* 0x5AC */ s16 field_0x5ac; /* 0x5B0 */ f32 field_0x5b0; - /* 0x5AE */ u8 field_0x5b4[0x5c4 - 0x5b4]; + /* 0x5B4 */ u8 field_0x5b4[0x5bc - 0x5b4]; + /* 0x5BC */ csXyz field_0x5bc; + /* 0x5C2 */ u8 field_0x5c2[0x5c4 - 0x5c2]; /* 0x5C4 */ u8 field_0x5c4; /* 0x5C5 */ u8 field_0x5c5; /* 0x5C8 */ cXyz field_0x5c8; /* 0x5D8 */ s16 field_0x5d4; /* 0x5D8 */ s16 field_0x5d6; /* 0x5D8 */ s16 field_0x5d8; - /* 0x5DA */ s16 field_0x5da; - /* 0x5DC */ s16 field_0x5dc; - /* 0x5DE */ s16 field_0x5de; + /* 0x5DA */ csXyz field_0x5da; /* 0x5E0 */ f32 field_0x5e0; /* 0x5E4 */ s16 field_0x5e4; /* 0x5E6 */ s16 field_0x5e6; /* 0x5E8 */ u8 field_0x5e8; - /* 0x5EC */ int field_0x5ec; - /* 0x5F0 */ int field_0x5f0; - /* 0x5F4 */ int field_0x5f4; + /* 0x5EC */ cXyz field_0x5ec; /* 0x5EC */ dCcD_Stts mStts; /* 0x634 */ J3DModel* mModel; /* 0x638 */ request_of_phase_process_class mPhase; @@ -57,15 +55,4 @@ public: STATIC_ASSERT(sizeof(daObjIce_s_c) == 0x644); -class daOBJ_ICE_S_HIO_c { -public: - daOBJ_ICE_S_HIO_c(); - virtual ~daOBJ_ICE_S_HIO_c() {} - - /* 0x4 */ s8 field_0x4; - /* 0x8 */ f32 field_0x8; - /* 0xC */ f32 field_0xc; -}; - - #endif /* D_A_OBJ_ICE_S_H */ diff --git a/src/d/actor/d_a_obj_ice_s.cpp b/src/d/actor/d_a_obj_ice_s.cpp index 57e0924c335..ba32890870d 100644 --- a/src/d/actor/d_a_obj_ice_s.cpp +++ b/src/d/actor/d_a_obj_ice_s.cpp @@ -14,15 +14,41 @@ #include "SSystem/SComponent/c_math.h" #include +class daOBJ_ICE_S_HIO_c : public JORReflexible { +public: + daOBJ_ICE_S_HIO_c(); + virtual ~daOBJ_ICE_S_HIO_c(); + + void genMessage(JORMContext*); + + /* 0x4 */ s8 mId; + /* 0x8 */ f32 mSlopeMagnitude; + /* 0xC */ f32 mSinkingAmount; +}; + static char* l_arcName = "V_Ice_s"; +daOBJ_ICE_S_HIO_c::~daOBJ_ICE_S_HIO_c() {} + daOBJ_ICE_S_HIO_c::daOBJ_ICE_S_HIO_c() { - field_0x4 = -1; - field_0x8 = 5000.0f; - field_0xc = 20.0f; + mId = -1; + mSlopeMagnitude = 5000.0f; + mSinkingAmount = 20.0f; } -f32 dummyLiteral() { return 0.0f; } +#if DEBUG + +void daOBJ_ICE_S_HIO_c::genMessage(JORMContext* ctx) { + ctx->genLabel("氷の足場小", 0x80000001, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); + ctx->genSlider("傾きの大きさ", &mSlopeMagnitude, 0.0f, 50000.0f, 0, NULL, 0xffff, 0xffff, 0x200, + 0x18); + ctx->genSlider("沈みの量", &mSinkingAmount, 0.0f, 1000.0f, 0, NULL, 0xffff, 0xffff, 0x200, + 0x18); +} + +#endif + +static f32 dummyLiteral() { return 0.0f; } void daObjIce_s_c::RideOn_Angle(s16& param_1, f32 param_2, s16 param_3, f32 param_4) { cLib_addCalcAngleS(¶m_1, param_3 * (param_2 / param_4), 5, 0x100, 1); @@ -43,10 +69,10 @@ bool daObjIce_s_c::Check_LinkRideOn(cXyz param_1) { f32 sinangle = dVar11 * cM_ssin(sVar7 - shape_angle.y); f32 var_f27; if (field_0x5c5 == 0xff) { - var_f27 = l_HIO.field_0x8; + var_f27 = l_HIO.mSlopeMagnitude; } - RideOn_Angle(field_0x5da, cosangle, -0xaa0, (XREG_F(0) + 1000.0f) * field_0x5c8.x); - RideOn_Angle(field_0x5de, sinangle, -0xaa0, (XREG_F(0) + 1000.0f) * field_0x5c8.x); + RideOn_Angle(field_0x5da.x, cosangle, -0xaa0, (XREG_F(0) + 1000.0f) * field_0x5c8.x); + RideOn_Angle(field_0x5da.z, sinangle, -0xaa0, (XREG_F(0) + 1000.0f) * field_0x5c8.x); f32 var_f26 = 0.0f; field_0x5e8 = 1; speedF = fopAcM_GetSpeedF(player); @@ -71,10 +97,10 @@ bool daObjIce_s_c::Check_RideOn(cXyz param_1) { f32 fVar1; // !@bug fVar1 might be uninitialized if (field_0x5c5 == 0xff) { - fVar1 = l_HIO.field_0x8; + fVar1 = l_HIO.mSlopeMagnitude; } - RideOn_Angle(field_0x5da, cosangle, (yREG_F(0) + 1024.0f + fVar1) / field_0x5c8.x, (XREG_F(0) + 1000.0f) * field_0x5c8.x); - RideOn_Angle(field_0x5de, sinangle, (yREG_F(0) + 1024.0f + fVar1) / field_0x5c8.x, (XREG_F(0) + 1000.0f) * field_0x5c8.x); + RideOn_Angle(field_0x5da.x, cosangle, (yREG_F(0) + 1024.0f + fVar1) / field_0x5c8.x, (XREG_F(0) + 1000.0f) * field_0x5c8.x); + RideOn_Angle(field_0x5da.z, sinangle, (yREG_F(0) + 1024.0f + fVar1) / field_0x5c8.x, (XREG_F(0) + 1000.0f) * field_0x5c8.x); f32 var_f26 = 0.0f; field_0x5e8 = 1; field_0x5e0 = HREG_F(3) * (1.0f - std::abs(cosangle) / 2500.0f * (1.0f - (std::abs(sinangle) / 300.0f)));; @@ -147,20 +173,21 @@ static int daObjIce_s_IsDelete(daObjIce_s_c* param_0) { } static int daObjIce_s_Delete(daObjIce_s_c* i_this) { - fopAcM_GetID(i_this); + fopAcM_RegisterDeleteID(i_this, "Obj_Ice_s"); i_this->MoveBGDelete(); return 1; } static int daObjIce_s_Create(fopAc_ac_c* i_this) { - fopAcM_GetID(i_this); - return static_cast(i_this)->create(); + fopAcM_RegisterCreateID(daObjIce_s_c, i_this, "Obj_Ice_s"); + return a_this->create(); } -int daObjIce_s_c::create() { +inline int daObjIce_s_c::create() { fopAcM_ct(this, daObjIce_s_c); int rv = dComIfG_resLoad(&mPhase, l_arcName); if (rv == cPhs_COMPLEATE_e) { + OS_REPORT("ICE_S PARAM %x\n", fopAcM_GetParam(this)); int dzb_id = dComIfG_getObjctResName2Index(l_arcName, "Ice_s.dzb"); JUT_ASSERT(185, dzb_id != -1); rv = MoveBGCreate(l_arcName, dzb_id, dBgS_MoveBGProc_TypicalRotY, 0x1440, NULL); @@ -171,7 +198,7 @@ int daObjIce_s_c::create() { if (!l_HIOInit) { l_HIOInit = TRUE; field_0x640 = 1; - l_HIO.field_0x4 = -1; + l_HIO.mId = mDoHIO_CREATE_CHILD("氷の足場小", &l_HIO); } field_0x5c5 = fopAcM_GetParam(this); if (field_0x5c5 == 0) { @@ -203,11 +230,15 @@ int daObjIce_s_c::create() { return rv; } -int daObjIce_s_c::CreateHeap() { +inline int daObjIce_s_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, "Ice_s.bmd"); JUT_ASSERT(157, modelData != NULL); mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); - return mModel != NULL ? 1 : 0; + if (mModel == NULL) { + return 0; + } + + return 1; } int daObjIce_s_c::Create() { @@ -218,24 +249,25 @@ int daObjIce_s_c::Create() { int daObjIce_s_c::Execute(f32 (**param_1)[3][4]) { daPy_py_c* player = daPy_getPlayerActorClass(); - fopAcM_GetPosition(player); + cXyz& playerPos = fopAcM_GetPosition(player); cXyz cStack_68(current.pos.x, current.pos.y + 300.0f, current.pos.z); - f32 dVar7 = l_HIO.field_0xc; + f32 dVar7 = 0.0f; + dVar7 = l_HIO.mSinkingAmount; cLib_chaseF(&field_0x5a4, 0.0f, 0.04f); cLib_chaseS(&field_0x5d8, 0, 0x100); - field_0x5d4 += 848.0f + 1.8f * field_0x5a0; - field_0x5d6 += 848.0f + 1.8f * field_0x5a0; + field_0x5d4 += (TREG_S(1) + 848) + (HREG_F(1) + 1.8f) * field_0x5a0 + field_0x5a4 * HREG_F(9); + field_0x5d6 += (TREG_S(2) + 848) + (HREG_F(2) + 1.8f) * field_0x5a0 + field_0x5a4 * HREG_F(9); cLib_addCalc(¤t.pos.y, - field_0x5e0 + (field_0x5b0 + field_0x5a4 * (6.0f + dVar7) + - (5.0f * cM_ssin(field_0x5d6 + field_0x5e6))), + field_0x5e0 + (field_0x5b0 + field_0x5a4 * ((yREG_F(1) + 6.0f) + dVar7) + + ((HREG_F(4) + 5.0f) * cM_ssin(field_0x5d6 + oREG_S(3) + field_0x5e6))), 0.1f, 1000.0f, 0.1f); - cLib_addCalcAngleS(&shape_angle.x, field_0x5da + ((0.5f * field_0x5ac) * cM_ssin(0x2000 + field_0x5d4 + field_0x5e6 + field_0x5d8)), 2, 0x100, 1); - cLib_addCalcAngleS(&shape_angle.z, field_0x5de + ((0.5f * field_0x5ac) * cM_ssin(field_0x5d6 + field_0x5e6 + field_0x5d8)), 2, 0x100, 1); + cLib_addCalcAngleS(&shape_angle.x, field_0x5da.x + (((nREG_F(0) + 0.5f) * field_0x5ac) * cM_ssin(0x2000 + field_0x5d4 + oREG_S(1) + field_0x5e6 + field_0x5d8)), 2, 0x100, 1); + cLib_addCalcAngleS(&shape_angle.z, field_0x5da.z + (((nREG_F(1) + 0.5f) * field_0x5ac) * cM_ssin(field_0x5d6 + oREG_S(2) + field_0x5e6 + field_0x5d8)), 2, 0x100, 1); if (field_0x5e8 == 0) { - cLib_addCalcAngleS(&field_0x5da, 0, 2, 0x100, 1); - cLib_addCalcAngleS(&field_0x5de, 0, 2, 0x100, 1); + cLib_addCalcAngleS(&field_0x5da.x, 0, 2, 0x100, 1); + cLib_addCalcAngleS(&field_0x5da.z, 0, 2, 0x100, 1); cLib_addCalc(&field_0x5e0, 0, 0.2f, 100.0f, 0); - cLib_addCalc(&field_0x5a0, 0, 0.05f, 100.0f, 0); + cLib_addCalc(&field_0x5a0, 0, HREG_F(13) + 0.05f, 100.0f, 0); field_0x5e4 = 0; cLib_chaseAngleS(&field_0x5ac, 0x120, 0x10); } @@ -258,6 +290,7 @@ int daObjIce_s_c::Delete() { dComIfG_resDelete(&mPhase, l_arcName); if (field_0x640 != 0) { l_HIOInit = FALSE; + mDoHIO_DELETE_CHILD(l_HIO.mId); } return 1; }