// // Generated by dtk // Translation Unit: d_a_coming2.cpp // #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_coming2.h" #include "d/d_bg_s_lin_chk.h" #include "d/d_bg_s_wtr_chk.h" #include "d/d_bg_s_gnd_chk.h" #include "d/actor/d_a_player.h" #include "d/actor/d_a_ship.h" #include "d/actor/d_a_sea.h" #include "d/actor/d_a_obj_barrel2.h" s32 daComing2::coming_make_item_no_table[] = { dItemNo_GREEN_RUPEE_e, dItemNo_GREEN_RUPEE_e, dItemNo_GREEN_RUPEE_e, dItemNo_GREEN_RUPEE_e, dItemNo_GREEN_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_BLUE_RUPEE_e, dItemNo_YELLOW_RUPEE_e, dItemNo_YELLOW_RUPEE_e, dItemNo_YELLOW_RUPEE_e, dItemNo_YELLOW_RUPEE_e, dItemNo_YELLOW_RUPEE_e, }; static void dummy() { // This may have been used in some debug drawing function. static GXColor colorR = {255, 100, 100, 255}; } namespace daComing2 { namespace { const static u8 L_attr[] = { 0, 0, 0, 0xC, 0x2, 0x58, 0x00, 0x87, 0x05, 0x46, }; } } /* 000000EC-00000164 .text chase_ship__Q29daComing25Act_cFv */ void daComing2::Act_c::chase_ship() { fpc_ProcID proc = fopAcM_GetLinkId(this); fopAc_ac_c* actor = fopAcM_SearchByID(proc); if (actor != NULL) { current.pos = actor->current.pos; shape_angle = actor->shape_angle; } } /* 00000164-00000200 .text get_speed__9daComing2FP10fopAc_ac_c */ f32 daComing2::get_speed(fopAc_ac_c* actor) { f32 x = actor->current.pos.x - actor->old.pos.x; f32 z = actor->current.pos.z - actor->old.pos.z; return std::sqrtf(x * x + z * z); } /* 00000200-0000033C .text renew_scope_info__Q29daComing25Act_cFv */ void daComing2::Act_c::renew_scope_info() { Mtx sp24; cXyz sp18; cXyz sp0C; unk_2A0 = get_speed(this); f32 fVar1 = unk_2A0; if (fVar1 < 35.0f) { fVar1 = 35.0f; } else { fVar1 = unk_2A0; } sp18.x = 0.0f; sp18.y = 100.0f; sp18.z = fVar1 * 135.0f; s16 arr[2] = {0x546, -0x546}; s16 sVar3 = arr[(unk_2A4 + unk_29C) & 1]; sVar3 = sVar3 > 0 ? sVar3 + ((unk_2A4 >> 2) & 0xF) * 0x168 : sVar3 - ((unk_2A4 >> 2) & 0xF) * 0x168; s16 rot = mStartStat.unk_00 + sVar3; cXyz* paVar5; if (unk_2A4 == 0) { paVar5 = ¤t.pos; } else { paVar5 = &mBarrelInfo[unk_2A4 - 1].unk_08; } sp0C = *paVar5; mDoMtx_stack_c::transS(sp0C); mDoMtx_stack_c::YrotM(rot); MTXCopy(mDoMtx_stack_c::get(), sp24); cMtx_multVec(sp24, &sp18, &unk_4A8); } /* 0000033C-0000052C .text no_ship_obstacle__Q29daComing25Act_cFP4cXyz */ BOOL daComing2::Act_c::no_ship_obstacle(cXyz* pos) { static dBgS_ObjLinChk M_wall_work; M_wall_work.Set(¤t.pos, pos, NULL); if (!dComIfG_Bgsp()->LineCross(&M_wall_work)) { return TRUE; } return FALSE; } struct SafetyCallback { /* 0x00 */ cXyz* pos; /* 0x04 */ BOOL ret; }; // size = 0x08 /* 00000AB8-00000B50 .text position_is_safety_call_back__9daComing2FPvPv */ void* daComing2::position_is_safety_call_back(void* ac, void* cb) { SafetyCallback* callback = (SafetyCallback*)cb; if (fopAc_IsActor(ac)) { fopAc_ac_c* actor = (fopAc_ac_c*)ac; if (fopAcM_GetGroup(actor) == fopAc_ENEMY_e) { f32 x = actor->current.pos.x - callback->pos->x; f32 z = actor->current.pos.z - callback->pos->z; if (x * x + z * z < 200.0f) { callback->ret = FALSE; return NULL; } } } return ac; } /* 00000B50-00000B98 .text position_is_none_obj__9daComing2FP4cXyz */ BOOL daComing2::position_is_none_obj(cXyz* pos) { SafetyCallback callback; callback.pos = pos; callback.ret = TRUE; fopAcM_Search(position_is_safety_call_back, &callback); if (callback.ret == TRUE) { return TRUE; } return FALSE; } /* 00000B98-00000BD8 .text check_in_large_sea__Q29daComing25Act_cFPC4cXyz */ BOOL daComing2::Act_c::check_in_large_sea(const cXyz* pos) { if (std::fabsf(pos->x) < 349000.0f && std::fabsf(pos->z) < 349000.0f) { return TRUE; } return FALSE; } /* 00000BD8-00000E60 .text get_water_height__Q29daComing25Act_cFPfPC4cXyz */ BOOL daComing2::Act_c::get_water_height(float* outHeight, const cXyz* pos) { f32 waveHeight = -G_CM3D_F_INF; if (daSea_ChkArea(pos->x, pos->z)) { waveHeight = daSea_calcWave(pos->x, pos->z); } else { static dBgS_WtrChk wtr; cXyz sp14( pos->x, pos->y - 1000.0f, pos->z ); wtr.Set(sp14, pos->y + 1000.0f); if (dComIfG_Bgsp()->WaterChk(&wtr)) { waveHeight = wtr.GetHeight(); } } *outHeight = waveHeight; if (waveHeight > -G_CM3D_F_INF) { static dBgS_ObjGndChk gnd_work; cXyz sp08 = *pos; sp08.y += 20000.0f; gnd_work.SetPos(&sp08); if (dComIfG_Bgsp()->GroundCross(&gnd_work) > waveHeight - 100.0f) { return FALSE; } return TRUE; } return FALSE; } /* 0000125C-00001294 .text init_barrelN_info__Q29daComing25Act_cFi */ void daComing2::Act_c::init_barrelN_info(int idx) { mBarrelInfo[idx].unk_00 = fpcM_ERROR_PROCESS_ID_e; mBarrelInfo[idx].unk_04 = 0; mBarrelInfo[idx].unk_06 = 0; mBarrelInfo[idx].unk_08 = current.pos; } /* 00001294-000012E0 .text init_barrel_info__Q29daComing25Act_cFv */ void daComing2::Act_c::init_barrel_info() { for (u32 i = 0; i < 15; i++) { init_barrelN_info(i); } } /* 000012E0-000012F0 .text init_flag_info__Q29daComing25Act_cFv */ void daComing2::Act_c::init_flag_info() { mStartBuoy[0].unk_00 = -1; mStartBuoy[1].unk_00 = -1; } /* 000012F0-00001354 .text init_coming_info__Q29daComing25Act_cFv */ void daComing2::Act_c::init_coming_info() { unk_2A4 = 0; unk_2A6 = 600; unk_29C = (s32)cM_rndF(2.0f) & 1; unk_29A = 0; unk_2A8 = 0; } /* 00001354-0000141C .text make_coming_param__Q29daComing25Act_cFP4cXyzPQ212daObjBarrel26Type_ePiPb */ BOOL daComing2::Act_c::make_coming_param(cXyz* outPos, daObjBarrel2::Type_e* outType, int* outDroppedItem, bool* outHasFlag) { cXyz sp0C = unk_4A8; if (get_water_height(&sp0C.y, &sp0C)) { *outPos = sp0C; *outType = daObjBarrel2::Type_01_e; *outHasFlag = false; *outDroppedItem = (unk_2A4 < 0xFu) ? coming_make_item_no_table[unk_2A4] : dItemNo_RECOVER_FAIRY_e; return TRUE; } return FALSE; } /* 0000141C-00001488 .text request_barrel_exitN__Q29daComing25Act_cFi */ BOOL daComing2::Act_c::request_barrel_exitN(int idx) { fpc_ProcID barrelProc = mBarrelInfo[idx].unk_00; daObjBarrel2::Act_c* barrel; if (barrelProc != fpcM_ERROR_PROCESS_ID_e) { if (fopAcM_SearchByID(barrelProc, (fopAc_ac_c**)&barrel) != NULL && barrel != NULL) { barrel->exit_req(); return TRUE; } else { return FALSE; } } else { return TRUE; } return FALSE; } /* 00001488-000014F0 .text request_all_barrel_exit__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::request_all_barrel_exit() { u32 i; s32 count = 0; for (i = 0; i < 15; i++) { if (request_barrel_exitN(i)) { count++; } } return count == 15 ? TRUE : FALSE; } /* 000014F0-00001610 .text checkLineCrossXZ__9daComing2FP4cXyzP4cXyzP4cXyzP4cXyz */ BOOL daComing2::checkLineCrossXZ(cXyz* arg0, cXyz* arg1, cXyz* arg2, cXyz* arg3) { cXyz sp44(arg1->x - arg0->x, 0.0f, arg1->z - arg0->z); cXyz sp38(arg2->x - arg0->x, 0.0f, arg2->z - arg0->z); cXyz sp2C(arg3->x - arg0->x, 0.0f, arg3->z - arg0->z); if ((sp44.x * sp38.z - sp44.z * sp38.x) * (sp44.x * sp2C.z - sp44.z * sp2C.x) < 0.0f) { cXyz sp20(arg2->x - arg3->x, 0.0f, arg2->z - arg3->z); cXyz sp14(arg0->x - arg3->x, 0.0f, arg0->z - arg3->z); cXyz sp08(arg1->x - arg3->x, 0.0f, arg1->z - arg3->z); if ((sp20.x * sp14.z - sp20.z * sp14.x) * (sp20.x * sp08.z - sp20.z * sp08.x) < 0.0f) { return TRUE; } } return FALSE; } /* 00001610-000016C4 .text request_all_flag_exit__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::request_all_flag_exit() { for (s32 i = 0; i < 2; i++) { fpc_ProcID buoyProc = mStartBuoy[i].unk_00; daObjBarrel2::Act_c* buoy; if (buoyProc != fpcM_ERROR_PROCESS_ID_e && fopAcM_SearchByID(buoyProc, (fopAc_ac_c**)&buoy) != NULL && buoy != NULL) { buoy->exit_req(); mStartBuoy[i].unk_00 = fpcM_ERROR_PROCESS_ID_e; } } if ((mStartBuoy[0].unk_00 == fpcM_ERROR_PROCESS_ID_e) && (mStartBuoy[1].unk_00 == fpcM_ERROR_PROCESS_ID_e)) { return TRUE; } return FALSE; } /* 000016C4-000017E0 .text barrel_execute__Q29daComing25Act_cFi */ void daComing2::Act_c::barrel_execute(int idx) { fpc_ProcID barrelProc = mBarrelInfo[idx].unk_00; daObjBarrel2::Act_c* barrel; if (barrelProc != fpcM_ERROR_PROCESS_ID_e) { if ((BOOL)fopAcM_SearchByID(barrelProc, (fopAc_ac_c**)&barrel) == TRUE) { if (barrel != NULL) { mBarrelInfo[idx].unk_06 = barrel->chk_item_give(); } if (mBarrelInfo[idx].unk_04 == 0) { request_barrel_exitN(idx); } else if (mBarrelInfo[idx].unk_04 > 0) { mBarrelInfo[idx].unk_04--; } } else if (mBarrelInfo[idx].unk_06 == 0) { init_barrelN_info(idx); coming_process_init(0); } if (mBarrelInfo[idx].unk_06 == 1) { if (unk_2A4 >= 15u) { coming_process_init(0); } else { request_barrel_exitN(idx); init_barrelN_info(idx); unk_29A = 1; } } } } /* 000017E0-0000182C .text barrel_main__Q29daComing25Act_cFv */ void daComing2::Act_c::barrel_main() { for (u32 i = 0; i < 15; i++) { barrel_execute(i); } } /* 0000182C-00001850 .text coming_clear_init__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::coming_clear_init() { daPy_py_c* player = daPy_getPlayerActorClass(); if (player != NULL) { unk_299 = player->current.roomNo; } return TRUE; } /* 00001850-000018B8 .text coming_clear_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_clear_main() { if (request_all_barrel_exit() && request_all_flag_exit()) { init_barrel_info(); init_coming_info(); init_flag_info(); coming_process_init(1); } } /* 000018B8-000018D0 .text coming_wait_init__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::coming_wait_init() { unk_2A6 = 600; unk_2A4 = 0; return TRUE; } /* 000018D0-000019D4 .text coming_wait_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_wait_main() { daPy_py_c* player = daPy_getPlayerActorClass(); if (player != NULL) { if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { if (unk_2A0 > 35.0f && get_coming_point() >= 2) { if (unk_2A6 > 0) { unk_2A6--; } if (unk_299 != fopAcM_GetRoomNo(player) && unk_2A6 == 0) { mStartStat.unk_00 = shape_angle.y; unk_440 = current.pos; coming_process_init(2); } } else { coming_process_init(1); } } else { unk_299 = player->current.roomNo; coming_process_init(1); } } } /* 000019D4-00001A7C .text coming_setF_init__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::coming_setF_init() { daPy_py_c* player = daPy_getPlayerActorClass(); if (player != NULL) { unk_298 = player->current.roomNo; minus_coming_point2(); return TRUE; } return FALSE; } /* 00001A7C-00001CB8 .text coming_setF_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_setF_main() { Mtx sp4C; cXyz sp34[2]; cXyz sp28; cXyz sp1C; cXyz sp10; f32 local_a0 = 0.0f; while (std::fabsf(local_a0) <= 700.0f) { local_a0 = cM_rndFX(1600.0f); } f32 z = unk_2A0 * 120.0f; sp1C.x = local_a0 + 500.0f; sp1C.y = 0.0f; sp1C.z = z; sp34[0].x = local_a0 + 500.0f; sp34[0].y = 0.0f; sp34[0].z = z; sp10.x = local_a0 + -500.0f; sp10.y = 0.0f; sp10.z = z; sp34[1].x = local_a0 + -500.0f; sp34[1].y = 0.0f; sp34[1].z = z; mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); MTXCopy(mDoMtx_stack_c::get(), sp4C); for (s32 i = 0; i < 2; i++) { if (mStartBuoy[i].unk_00 == fpcM_ERROR_PROCESS_ID_e) { cMtx_multVec(sp4C, &sp34[i], &sp28); if (get_water_height(&sp28.y, &sp28) && check_in_large_sea(&sp28) && position_is_none_obj(&sp28) && no_ship_obstacle(&sp28)) { daObjBarrel2::Type_e type(daObjBarrel2::Type_01_e); fpc_ProcID barrel = daObjBarrel2::Act_c::make_coming( &sp28, -1, DEMO_SELECT(daObjBarrel2::Type_01_e, type), 0x3F, true, mStartStat.unk_00, daObjBuoyflag::Texture_01_e ); mStartBuoy[i].unk_00 = barrel; if (barrel != fpcM_ERROR_PROCESS_ID_e) { mStartBuoy[i].unk_04 = sp28; } } } } if ((mStartBuoy[0].unk_00 != fpcM_ERROR_PROCESS_ID_e) && (mStartBuoy[1].unk_00 != fpcM_ERROR_PROCESS_ID_e)) { coming_process_init(3); } else { coming_process_init(0); } } /* 00001CB8-00001CC8 .text coming_checkS_init__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::coming_checkS_init() { unk_46C = 0; return TRUE; } /* 00001CC8-00001D60 .text coming_checkS_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_checkS_main() { if (unk_46C < 0xB4) { if (checkLineCrossXZ(&old.pos, ¤t.pos, &mStartBuoy[0].unk_04, &mStartBuoy[1].unk_04)) { request_all_flag_exit(); coming_process_init(4); } unk_46C++; } else { daPy_py_c* player = daPy_getPlayerActorClass(); if (player != NULL) { unk_299 = player->current.roomNo; coming_process_init(0); } } } /* 00001D60-00001D8C .text coming_game_init__Q29daComing25Act_cFv */ BOOL daComing2::Act_c::coming_game_init() { unk_29A = 1; unk_2A8 = 0; unk_299 = unk_298; unk_294++; return TRUE; } /* 00001D8C-00001F58 .text coming_game_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_game_main() { cXyz sp1C; daObjBarrel2::Type_e type; int droppedItem; bool hasFlag; u32 unk294 = unk_2A4; if (unk294 >= 15) { return; } if (unk_29A == 1) { if ((mBarrelInfo[unk_2A4].unk_00 == fpcM_ERROR_PROCESS_ID_e && make_coming_param(&sp1C, &type, &droppedItem, &hasFlag))) { if (check_in_large_sea(&sp1C) != 0) { if (position_is_none_obj(&sp1C) && no_ship_obstacle(&sp1C)) { fpc_ProcID barrel = daObjBarrel2::Act_c::make_coming( &sp1C, -1, type, droppedItem, hasFlag, mStartStat.unk_00, daObjBuoyflag::Texture_00_e ); mBarrelInfo[unk_2A4].unk_00 = barrel; if (barrel != fpcM_ERROR_PROCESS_ID_e) { unk_29A = 0; mBarrelInfo[unk294].unk_06 = 0; mBarrelInfo[unk_2A4].unk_08 = sp1C; mBarrelInfo[unk_2A4].unk_04 = 0x93 - unk_2A4; unk_2A8 = 0; unk_2A4++; } } } else { coming_process_init(0); } } if (unk_2A8++ >= 60) { coming_process_init(0); } } else { unk_2A8 = 0; } } /* 00001F58-00002070 .text coming_process_init__Q29daComing25Act_cFs */ bool daComing2::Act_c::coming_process_init(short arg1) { typedef BOOL (daComing2::Act_c::*init_func)(); static init_func init_table[5] = { &daComing2::Act_c::coming_clear_init, &daComing2::Act_c::coming_wait_init, &daComing2::Act_c::coming_setF_init, &daComing2::Act_c::coming_checkS_init, &daComing2::Act_c::coming_game_init }; if (arg1 >= 0 && arg1 < 5) { if ((this->*init_table[arg1])()) { unk_46E = arg1; return true; } } return false; } /* 00002070-00002154 .text coming_process_main__Q29daComing25Act_cFv */ void daComing2::Act_c::coming_process_main() { typedef void (daComing2::Act_c::*main_func)(); static main_func main_table[5] = { &daComing2::Act_c::coming_clear_main, &daComing2::Act_c::coming_wait_main, &daComing2::Act_c::coming_setF_main, &daComing2::Act_c::coming_checkS_main, &daComing2::Act_c::coming_game_main }; if (unk_46E >= 0 && unk_46E < 5) { (this->*main_table[unk_46E])(); } } /* 00002154-00002264 .text _create__Q29daComing25Act_cFv */ cPhs_State daComing2::Act_c::_create() { fopAcM_ct(this, daComing2::Act_c); unk_299 = -1; init_barrel_info(); init_coming_info(); init_flag_info(); coming_process_init(0); daPy_py_c* player = daPy_getPlayerActorClass(); mStartStat.unk_00 = shape_angle.y; unk_440.x = current.pos.x; unk_440.y = current.pos.y; unk_440.z = current.pos.z; if (player != NULL) { unk_299 = player->current.roomNo; } return cPhs_COMPLEATE_e; } /* 000022E4-000022EC .text _delete__Q29daComing25Act_cFv */ bool daComing2::Act_c::_delete() { return true; } /* 000022EC-000023B0 .text _execute__Q29daComing25Act_cFv */ bool daComing2::Act_c::_execute() { daShip_c* ship = (daShip_c*)fopAcM_SearchByID(fopAcM_GetLinkId(this)); if (ship != NULL) { chase_ship(); renew_scope_info(); if (dComIfGp_event_runCheck() || ship->getTornadoActor() != NULL || ship->getWhirlActor() != NULL) { daPy_py_c* player = daPy_getPlayerActorClass(); unk_299 = player->current.roomNo; coming_process_init(0); } else { coming_process_main(); } barrel_main(); } return true; } /* 000023B0-000023B8 .text _draw__Q29daComing25Act_cFv */ bool daComing2::Act_c::_draw() { return true; } namespace daComing2 { namespace { /* 000023B8-000023D8 .text Mthd_Create__Q29daComing225@unnamed@d_a_coming2_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daComing2::Act_c*)i_this)->_create(); } /* 000023D8-000023FC .text Mthd_Delete__Q29daComing225@unnamed@d_a_coming2_cpp@FPv */ BOOL Mthd_Delete(void* i_this) { return ((daComing2::Act_c*)i_this)->_delete(); } /* 000023FC-00002420 .text Mthd_Execute__Q29daComing225@unnamed@d_a_coming2_cpp@FPv */ BOOL Mthd_Execute(void* i_this) { return ((daComing2::Act_c*)i_this)->_execute(); } /* 00002420-00002444 .text Mthd_Draw__Q29daComing225@unnamed@d_a_coming2_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { return ((daComing2::Act_c*)i_this)->_draw(); } /* 00002444-0000244C .text Mthd_IsDelete__Q29daComing225@unnamed@d_a_coming2_cpp@FPv */ BOOL Mthd_IsDelete(void*) { return TRUE; } static actor_method_class Mthd_Table = { (process_method_func)Mthd_Create, (process_method_func)Mthd_Delete, (process_method_func)Mthd_Execute, (process_method_func)Mthd_IsDelete, (process_method_func)Mthd_Draw, }; }; // namespace }; // namespace daComing2 actor_process_profile_definition g_profile_Coming2 = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0007, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_Coming2_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daComing2::Act_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_Coming2_e, /* Actor SubMtd */ &daComing2::Mthd_Table, /* Status */ fopAcStts_UNK4000_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };