diff --git a/include/d/actor/d_a_obj_ice_s.h b/include/d/actor/d_a_obj_ice_s.h index d11323cf411..c51e5dbd2a7 100644 --- a/include/d/actor/d_a_obj_ice_s.h +++ b/include/d/actor/d_a_obj_ice_s.h @@ -2,6 +2,8 @@ #define D_A_OBJ_ICE_S_H #include "f_op/f_op_actor_mng.h" +#include "d/d_bg_s_movebg_actor.h" +#include "d/d_cc_d.h" /** * @ingroup actors-objects @@ -11,22 +13,46 @@ * @details * */ -class daObjIce_s_c : public fopAc_ac_c { +class daObjIce_s_c : public dBgS_MoveBgActor { public: /* 80C209DC */ void RideOn_Angle(s16&, f32, s16, f32); - /* 80C20A44 */ void Check_LinkRideOn(cXyz); - /* 80C20C98 */ void Check_RideOn(cXyz); + /* 80C20A44 */ bool Check_LinkRideOn(cXyz); + /* 80C20C98 */ bool Check_RideOn(cXyz); /* 80C20EC0 */ void initBaseMtx(); /* 80C20EEC */ void setBaseMtx(); - /* 80C212CC */ void create(); - /* 80C2157C */ void CreateHeap(); - /* 80C215F4 */ void Create(); - /* 80C21634 */ void Execute(f32 (**)[3][4]); - /* 80C21964 */ void Draw(); - /* 80C21A08 */ void Delete(); + /* 80C212CC */ int create(); + /* 80C2157C */ int CreateHeap(); + /* 80C215F4 */ int Create(); + /* 80C21634 */ int Execute(f32 (**)[3][4]); + /* 80C21964 */ int Draw(); + /* 80C21A08 */ int Delete(); -private: - /* 0x568 */ u8 field_0x568[0x644 - 0x568]; + /* 0x5A0 */ f32 field_0x5a0; + /* 0x5A4 */ f32 field_0x5a4; + /* 0x5A8 */ f32 field_0x5a8; + /* 0x5AC */ s16 field_0x5ac; + /* 0x5B0 */ f32 field_0x5b0; + /* 0x5AE */ u8 field_0x5b4[0x5c4 - 0x5b4]; + /* 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; + /* 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 */ dCcD_Stts mStts; + /* 0x634 */ J3DModel* mModel; + /* 0x638 */ request_of_phase_process_class mPhase; + /* 0x640 */ u8 field_0x640; }; STATIC_ASSERT(sizeof(daObjIce_s_c) == 0x644); @@ -34,7 +60,11 @@ STATIC_ASSERT(sizeof(daObjIce_s_c) == 0x644); class daOBJ_ICE_S_HIO_c { public: /* 80C209AC */ daOBJ_ICE_S_HIO_c(); - /* 80C21A60 */ ~daOBJ_ICE_S_HIO_c(); + /* 80C21A60 */ virtual ~daOBJ_ICE_S_HIO_c(); + + /* 0x4 */ s8 field_0x4; + /* 0x8 */ f32 field_0x8; + /* 0xC */ f32 field_0xc; }; diff --git a/src/d/actor/d_a_obj_ice_s.cpp b/src/d/actor/d_a_obj_ice_s.cpp index bfc2ba48e92..71c4e75896d 100644 --- a/src/d/actor/d_a_obj_ice_s.cpp +++ b/src/d/actor/d_a_obj_ice_s.cpp @@ -4,6 +4,11 @@ */ #include "d/actor/d_a_obj_ice_s.h" +#include "d/actor/d_a_player.h" +#include "d/d_com_inf_game.h" +#include "d/d_bg_w.h" +#include "SSystem/SComponent/c_lib.h" +#include "SSystem/SComponent/c_math.h" #include "dol2asm.h" @@ -81,7 +86,6 @@ extern "C" void _restgpr_29(); extern "C" extern void* __vt__9dCcD_Stts[11]; extern "C" extern void* __vt__9cCcD_Stts[8]; extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; extern "C" u8 sincosTable___5JMath[65536]; extern "C" void __register_global_object(); @@ -98,14 +102,8 @@ COMPILER_STRIP_GATE(0x80C21AF8, &lit_3644); SECTION_RODATA static f32 const lit_3645 = 20.0f; COMPILER_STRIP_GATE(0x80C21AFC, &lit_3645); -/* 80C21B8C-80C21B8C 000094 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80C21B8C = "V_Ice_s"; -#pragma pop - /* 80C21BA8-80C21BAC -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ -SECTION_DATA static void* l_arcName = (void*)&d_a_obj_ice_s__stringBase0; +static char* l_arcName = "V_Ice_s"; /* 80C21BAC-80C21BCC -00001 0020+00 1/0 0/0 0/0 .data l_daObjIce_s_Method */ static actor_method_class l_daObjIce_s_Method = { @@ -157,7 +155,9 @@ SECTION_DATA extern void* __vt__17daOBJ_ICE_S_HIO_c[3] = { /* 80C209AC-80C209DC 0000EC 0030+00 1/1 0/0 0/0 .text __ct__17daOBJ_ICE_S_HIO_cFv */ daOBJ_ICE_S_HIO_c::daOBJ_ICE_S_HIO_c() { - // NONMATCHING + field_0x4 = -1; + field_0x8 = 5000.0f; + field_0xc = 20.0f; } /* ############################################################################################## */ @@ -186,8 +186,8 @@ COMPILER_STRIP_GATE(0x80C21B08, &lit_3688); /* 80C209DC-80C20A44 00011C 0068+00 2/2 0/0 0/0 .text RideOn_Angle__12daObjIce_s_cFRsfsf */ -void daObjIce_s_c::RideOn_Angle(s16& param_0, f32 param_1, s16 param_2, f32 param_3) { - // NONMATCHING +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); } /* ############################################################################################## */ @@ -247,8 +247,29 @@ COMPILER_STRIP_GATE(0x80C21B34, &lit_3752); #pragma pop /* 80C20A44-80C20C98 000184 0254+00 1/1 0/0 0/0 .text Check_LinkRideOn__12daObjIce_s_cF4cXyz */ -void daObjIce_s_c::Check_LinkRideOn(cXyz param_0) { - // NONMATCHING +// NONMATCHING +// float register issues around abs/sin/cos +bool daObjIce_s_c::Check_LinkRideOn(cXyz param_1) { + daPy_py_c* player = daPy_getPlayerActorClass(); + s16 sVar8 = 0; + field_0x5e8 = 1; + s16 sVar7 = cLib_targetAngleY(¤t.pos, ¶m_1); + f32 dVar11 = current.pos.abs(param_1); + f32 cosangle = (f32)cM_scos(sVar7 - shape_angle.y); + cosangle = (-dVar11) * cosangle; + f32 sinangle = (f32)cM_ssin(sVar7 - shape_angle.y); + sinangle = dVar11 * sinangle; + RideOn_Angle(field_0x5da, cosangle, -0xaa0, 1000.0f * field_0x5c8.x); + RideOn_Angle(field_0x5de, sinangle, -0xaa0, 1000.0f * field_0x5c8.x); + field_0x5e8 = 1; + f32 speedF = fopAcM_GetSpeedF(player); + if (speedF > 0.0f) { + sVar8 = 98.0f * speedF; + } + field_0x5e0 = 1000.0f; + cLib_addCalc(&field_0x5a0, sVar8, 0.015f, 100.0f, 1000.0f); + cLib_chaseAngleS(&field_0x5ac, 0x120, 0x10); + return false; } /* ############################################################################################## */ @@ -266,22 +287,45 @@ static u8 data_80C21C38[4]; static u8 lit_3639[12]; /* 80C21C48-80C21C58 000018 0010+00 4/4 0/0 0/0 .bss l_HIO */ -static u8 l_HIO[16]; +static daOBJ_ICE_S_HIO_c l_HIO; /* 80C20C98-80C20EC0 0003D8 0228+00 1/1 0/0 0/0 .text Check_RideOn__12daObjIce_s_cF4cXyz */ -void daObjIce_s_c::Check_RideOn(cXyz param_0) { - // NONMATCHING +// NONMATCHING +// float issues. +bool daObjIce_s_c::Check_RideOn(cXyz param_1) { + daPy_py_c* player = daPy_getPlayerActorClass(); + field_0x5e8 = 1; + s16 sVar7 = cLib_targetAngleY(¤t.pos, ¶m_1); + f32 dVar11 = current.pos.abs(param_1); + f32 cosangle = (f32)cM_scos(sVar7 - shape_angle.y); + cosangle = (-dVar11) * cosangle; + f32 sinangle = (f32)cM_ssin(sVar7 - shape_angle.y); + sinangle = dVar11 * sinangle; + f32 fVar1; + // !@bug fVar1 might be uninitialized + if (field_0x5c5 == 0xff) { + fVar1 = l_HIO.field_0x8; + } + RideOn_Angle(field_0x5da, cosangle, (fVar1 + 1024.0f) / field_0x5c8.x, 1000.0f * field_0x5c8.x); + RideOn_Angle(field_0x5de, sinangle, (fVar1 + 1024.0f) / field_0x5c8.x, 1000.0f * field_0x5c8.x); + field_0x5e8 = 1; + field_0x5e0 = 1000.0f; + return false; } /* 80C20EC0-80C20EEC 000600 002C+00 1/1 0/0 0/0 .text initBaseMtx__12daObjIce_s_cFv */ void daObjIce_s_c::initBaseMtx() { - // NONMATCHING + fopAcM_SetMtx(this, mModel->getBaseTRMtx()); + setBaseMtx(); } /* 80C20EEC-80C20F48 00062C 005C+00 2/2 0/0 0/0 .text setBaseMtx__12daObjIce_s_cFv */ void daObjIce_s_c::setBaseMtx() { - // NONMATCHING + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mModel->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), mBgMtx); } /* ############################################################################################## */ @@ -315,36 +359,75 @@ COMPILER_STRIP_GATE(0x80C21B48, &lit_3908); /* 80C20F48-80C21234 000688 02EC+00 1/1 0/0 0/0 .text * rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ -static void rideCallBack(dBgW* param_0, fopAc_ac_c* param_1, fopAc_ac_c* param_2) { - // NONMATCHING + // NONMATCHING + // reg alloc +static void rideCallBack(dBgW* param_1, fopAc_ac_c* param_2, fopAc_ac_c* param_3) { + daObjIce_s_c* ice = (daObjIce_s_c*)param_2; + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz& playerPos = fopAcM_GetPosition(player); + cXyz* pVVar4 = player->getIronBallCenterPos(); + + // !@bug misplaced ! operator. This condition is probably always false + if (!fopAcM_GetName(param_3) == PROC_ALINK) { + ice->field_0x5d8 = 0x100; + ice->field_0x5a4 = -1.0f; + ice->field_0x5ac = 0x500; + } else { + ice->field_0x5a4 = -1.3f; + ice->Check_LinkRideOn(playerPos); + } + cXyz* icePos = &fopAcM_GetPosition(param_2); + if (pVVar4 != NULL && icePos != NULL && icePos->absXZ(*pVVar4) < ice->field_0x5c8.x * 600.0f) { + ice->field_0x5d8 = 0x300; + ice->field_0x5a4 = -11.0f; + ice->field_0x5ac = 0x1000; + ice->Check_RideOn(*icePos); + } + if (player->checkBootsOrArmorHeavy()) { + ice->field_0x5d8 = 0x300; + ice->field_0x5a4 = -11.0f; + ice->field_0x5ac = 0x1000; + ice->Check_RideOn(playerPos); + } + if (ice->field_0x5c5 == 0xff && + fopAcM_GetName(param_3) == PROC_ALINK) + { + ice->field_0x5d8 = 0x300; + ice->field_0x5a4 = -11.0f; + ice->field_0x5ac = 0x1000; + ice->Check_RideOn(playerPos); + } } /* 80C21234-80C21260 000974 002C+00 1/0 0/0 0/0 .text daObjIce_s_Draw__FP12daObjIce_s_c */ -static void daObjIce_s_Draw(daObjIce_s_c* param_0) { - // NONMATCHING +static int daObjIce_s_Draw(daObjIce_s_c* i_this) { + return i_this->MoveBGDraw(); } /* 80C21260-80C21280 0009A0 0020+00 1/0 0/0 0/0 .text daObjIce_s_Execute__FP12daObjIce_s_c */ -static void daObjIce_s_Execute(daObjIce_s_c* param_0) { - // NONMATCHING +static int daObjIce_s_Execute(daObjIce_s_c* i_this) { + return i_this->MoveBGExecute(); } /* 80C21280-80C21288 0009C0 0008+00 1/0 0/0 0/0 .text daObjIce_s_IsDelete__FP12daObjIce_s_c */ -static bool daObjIce_s_IsDelete(daObjIce_s_c* param_0) { - return true; +static int daObjIce_s_IsDelete(daObjIce_s_c* param_0) { + return 1; } /* 80C21288-80C212AC 0009C8 0024+00 1/0 0/0 0/0 .text daObjIce_s_Delete__FP12daObjIce_s_c */ -static void daObjIce_s_Delete(daObjIce_s_c* param_0) { - // NONMATCHING +static int daObjIce_s_Delete(daObjIce_s_c* i_this) { + fopAcM_GetID(i_this); + i_this->MoveBGDelete(); + return 1; } /* 80C212AC-80C212CC 0009EC 0020+00 1/0 0/0 0/0 .text daObjIce_s_Create__FP10fopAc_ac_c */ -static void daObjIce_s_Create(fopAc_ac_c* param_0) { - // NONMATCHING +static int daObjIce_s_Create(fopAc_ac_c* i_this) { + fopAcM_GetID(i_this); + return static_cast(i_this)->create(); } /* ############################################################################################## */ @@ -399,8 +482,50 @@ SECTION_DEAD static char const* const stringBase_80C21B94 = "Ice_s.dzb"; #pragma pop /* 80C212CC-80C2157C 000A0C 02B0+00 1/1 0/0 0/0 .text create__12daObjIce_s_cFv */ -void daObjIce_s_c::create() { - // NONMATCHING +int daObjIce_s_c::create() { + fopAcM_SetupActor(this, daObjIce_s_c); + int rv = dComIfG_resLoad(&mPhase, l_arcName); + if (rv == cPhs_COMPLEATE_e) { + 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); + if (rv == cPhs_ERROR_e) { + return rv; + } + } + if (data_80C21C38[0] == 0) { + data_80C21C38[0] = 1; + field_0x640 = 1; + l_HIO.field_0x4 = -1; + } + field_0x5c5 = fopAcM_GetParam(this); + if (field_0x5c5 == 0) { + field_0x5c4 = 1; + } + if (field_0x5c4 != 0) { + if (dComIfGs_getCollectSmell() == SMELL_FISH) { + field_0x5c5 = 1; + } else { + field_0x5c5 = 0xff; + } + } + f32 dVar11 = field_0x5c8.x * 500.0f; + fopAcM_setCullSizeFar(this, 3.0f); + fopAcM_setCullSizeBox(this, -dVar11, -dVar11, -dVar11, dVar11, dVar11, dVar11); + u8 uVar7 = (fopAcM_GetParam(this) & 0xffff) >> 8; + if (uVar7 == 0xff) { + uVar7 = 0; + } + field_0x5c8.set(uVar7 + 1.0f, 1.0f, uVar7 + 1.0f); + field_0x5e6 = cM_rndFX(32000.0f); + cXyz cStack_c4(current.pos.x, current.pos.y + 300.0f, current.pos.z); + dBgS_ObjGndChk_Spl adStack_b8; + adStack_b8.SetPos(&cStack_c4); + field_0x5b0 = current.pos.x; + f32 dVar12 = field_0x5c8.x * 500.0f; + fopAcM_SetMin(this, -dVar12, -dVar12, -dVar12); + fopAcM_SetMax(this, dVar12, dVar12, dVar12); + return rv; } /* ############################################################################################## */ @@ -411,13 +536,18 @@ SECTION_DEAD static char const* const stringBase_80C21B9E = "Ice_s.bmd"; #pragma pop /* 80C2157C-80C215F4 000CBC 0078+00 1/0 0/0 0/0 .text CreateHeap__12daObjIce_s_cFv */ -void daObjIce_s_c::CreateHeap() { - // NONMATCHING +int daObjIce_s_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, "Ice_s.bmd"); + JUT_ASSERT(157, modelData != 0); + mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + return mModel != NULL ? 1 : 0; } /* 80C215F4-80C21634 000D34 0040+00 1/0 0/0 0/0 .text Create__12daObjIce_s_cFv */ -void daObjIce_s_c::Create() { - // NONMATCHING +int daObjIce_s_c::Create() { + initBaseMtx(); + mpBgW->SetRideCallback(rideCallBack); + return cPhs_COMPLEATE_e; } /* ############################################################################################## */ @@ -486,24 +616,56 @@ COMPILER_STRIP_GATE(0x80C21B88, &lit_4068); /* 80C21634-80C21964 000D74 0330+00 1/0 0/0 0/0 .text Execute__12daObjIce_s_cFPPA3_A4_f */ -void daObjIce_s_c::Execute(f32 (**param_0)[3][4]) { - // NONMATCHING +int daObjIce_s_c::Execute(f32 (**param_1)[3][4]) { + daPy_py_c* player = daPy_getPlayerActorClass(); + fopAcM_GetPosition(player); + cXyz cStack_68(current.pos.x, current.pos.y + 300.0f, current.pos.z); + f32 dVar7 = l_HIO.field_0xc; + 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; + cLib_addCalc(¤t.pos.y, + field_0x5e0 + (field_0x5b0 + field_0x5a4 * (6.0f + dVar7) + + (5.0f * cM_ssin(field_0x5d6 + 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); + if (field_0x5e8 == 0) { + cLib_addCalcAngleS(&field_0x5da, 0, 2, 0x100, 1); + cLib_addCalcAngleS(&field_0x5de, 0, 2, 0x100, 1); + cLib_addCalc(&field_0x5e0, 0, 0.2f, 100.0f, 0); + cLib_addCalc(&field_0x5a0, 0, 0.05f, 100.0f, 0); + field_0x5e4 = 0; + cLib_chaseAngleS(&field_0x5ac, 0x120, 0x10); + } + field_0x5e8 = 0; + *param_1 = &mBgMtx; + setBaseMtx(); + return 1; } /* 80C21964-80C21A08 0010A4 00A4+00 1/0 0/0 0/0 .text Draw__12daObjIce_s_cFv */ -void daObjIce_s_c::Draw() { - // NONMATCHING +int daObjIce_s_c::Draw() { + g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType_MAJI(mModel, &tevStr); + dComIfGd_setListDarkBG(); + mDoExt_modelUpdateDL(mModel); + dComIfGd_setList(); + return 1; } /* 80C21A08-80C21A60 001148 0058+00 1/0 0/0 0/0 .text Delete__12daObjIce_s_cFv */ -void daObjIce_s_c::Delete() { - // NONMATCHING +int daObjIce_s_c::Delete() { + dComIfG_resDelete(&mPhase, l_arcName); + if (field_0x640 != 0) { + data_80C21C38[0] = 0; + } + return 1; } /* 80C21A60-80C21AA8 0011A0 0048+00 2/1 0/0 0/0 .text __dt__17daOBJ_ICE_S_HIO_cFv */ -daOBJ_ICE_S_HIO_c::~daOBJ_ICE_S_HIO_c() { - // NONMATCHING -} +daOBJ_ICE_S_HIO_c::~daOBJ_ICE_S_HIO_c() {} /* 80C21AA8-80C21AE4 0011E8 003C+00 0/0 1/0 0/0 .text __sinit_d_a_obj_ice_s_cpp */ void __sinit_d_a_obj_ice_s_cpp() { @@ -515,4 +677,4 @@ void __sinit_d_a_obj_ice_s_cpp() { REGISTER_CTORS(0x80C21AA8, __sinit_d_a_obj_ice_s_cpp); #pragma pop -/* 80C21B8C-80C21B8C 000094 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ \ No newline at end of file +/* 80C21B8C-80C21B8C 000094 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */