/** * @file d_a_boomerang.cpp * */ #include "d/actor/d_a_boomerang.h" #include "JSystem/J2DGraph/J2DAnmLoader.h" #include "d/actor/d_a_alink.h" #include "d/d_pane_class.h" #include "m_Do/m_Do_lib.h" #include "d/actor/d_a_mirror.h" #include "Z2AudioLib/Z2Instances.h" #include "SSystem/SComponent/c_math.h" /* 8049E0B8-8049E36C 000078 02B4+00 1/1 0/0 0/0 .text createHeap__19daBoomerang_sight_cFv */ int daBoomerang_sight_c::createHeap() { void* tmpData; JKRArchive* archive = dComIfG_getObjectResInfo(daAlink_c::getAlinkArcName())->getArchive(); m_cursorYellowScrn = new J2DScreen(); if (m_cursorYellowScrn == NULL) { return 0; } m_cursorYellowScrn->setPriority("zelda_v_cursor_new_yellow.blo", 0x100000, archive); dPaneClass_showNullPane(m_cursorYellowScrn); tmpData = JKRGetNameResource("zelda_v_cursor_new_yellow.bpk", archive); JUT_ASSERT(398, tmpData); m_cursorYellowBpk = (J2DAnmColor*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorYellowBpk == NULL) { return 0; } tmpData = JKRGetNameResource("zelda_v_cursor_new_yellow.bck", archive); JUT_ASSERT(406, tmpData); m_cursorYellowBck = (J2DAnmTransform*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorYellowBck == NULL) { return 0; } tmpData = JKRGetNameResource("zelda_v_cursor_new_yellow_02.brk", archive); JUT_ASSERT(415, tmpData); m_cursorYellow2Brk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorYellow2Brk == NULL) { return 0; } tmpData = JKRGetNameResource("zelda_v_cursor_new_yellow.brk", archive); JUT_ASSERT(423, tmpData); m_cursorYellowBrk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorYellowBrk == NULL) { return 0; } m_cursorRedScrn = new J2DScreen(); if (m_cursorRedScrn == NULL) { return 0; } m_cursorRedScrn->setPriority("zelda_v_cursor_new_red.blo", 0x100000, archive); dPaneClass_showNullPane(m_cursorRedScrn); tmpData = JKRGetNameResource("zelda_v_cursor_new_red_02.brk", archive); JUT_ASSERT(440, tmpData); m_cursorRed2Brk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorRed2Brk == NULL) { return 0; } tmpData = JKRGetNameResource("zelda_v_cursor_new_red.brk", archive); JUT_ASSERT(448, tmpData); m_cursorRedBrk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorRedBrk == NULL) { return 0; } m_cursorOrangeScrn = new J2DScreen(); if (m_cursorOrangeScrn == NULL) { return 0; } m_cursorOrangeScrn->setPriority("zelda_v_cursor_new_orange.blo", 0x100000, archive); dPaneClass_showNullPane(m_cursorOrangeScrn); tmpData = JKRGetNameResource("zelda_v_cursor_new_orange_02.brk", archive); JUT_ASSERT(493, tmpData); m_cursorOrange2Brk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorOrange2Brk == NULL) { return 0; } tmpData = JKRGetNameResource("zelda_v_cursor_new_orange.brk", archive); JUT_ASSERT(501, tmpData); m_cursorOrangeBrk = (J2DAnmTevRegKey*)J2DAnmLoaderDataBase::load(tmpData); if (m_cursorOrangeBrk == NULL) { return 0; } return 1; } /* 804A2850-804A285C 000000 000C+00 7/7 0/0 0/0 .rodata @4078 */ // unused static u8 const lit_4078[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* 804A285C-804A2868 00000C 000C+00 0/0 0/0 0/0 .rodata l_blurTop */ // unused static u8 const l_blurTop[12] = { 0x42, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* 804A2868-804A287A 000018 000C+06 0/0 0/0 0/0 .rodata l_blurRoot */ // unused static u8 const l_blurRoot[12 + 6] = { 0xC2, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xA0, 0x8C, 0x3C, 0x1E, 0x1E, }; /* 804A287A-804A287C 00002A 0002+00 0/0 0/0 0/0 .rodata m_lockWaitTime__18daBoomerang_HIO_c0 */ const u16 daBoomerang_HIO_c0::m_lockWaitTime = 10; /* 804A287C-804A2880 00002C 0004+00 0/0 0/0 0/0 .rodata m_minCircleR__18daBoomerang_HIO_c0 */ const f32 daBoomerang_HIO_c0::m_minCircleR = 28.0f; /* 804A2880-804A2884 000030 0004+00 0/0 0/0 0/0 .rodata m_middleCircleR__18daBoomerang_HIO_c0 */ const f32 daBoomerang_HIO_c0::m_middleCircleR = 35.0f; /* 804A2884-804A2888 000034 0004+00 0/0 0/0 0/0 .rodata m_maxCircleR__18daBoomerang_HIO_c0 */ const f32 daBoomerang_HIO_c0::m_maxCircleR = 80.0f; /* 804A2888-804A288C 000038 0004+00 0/0 0/0 0/0 .rodata m_scale__18daBoomerang_HIO_c0 */ const f32 daBoomerang_HIO_c0::m_scale = 3.0f / 5.0f; /* 804A288C-804A2890 00003C 0004+00 0/0 0/0 0/0 .rodata m_lockWindScale__18daBoomerang_HIO_c0 */ const f32 daBoomerang_HIO_c0::m_lockWindScale = 2.0f; /* 804A2890-804A28A4 000040 0014+00 0/1 0/0 0/0 .rodata l_lockSeFlg */ static const u32 l_lockSeFlg[BOOMERANG_LOCK_MAX] = { Z2SE_SY_BOOM_LOCK_ON_1, Z2SE_SY_BOOM_LOCK_ON_2, Z2SE_SY_BOOM_LOCK_ON_3, Z2SE_SY_BOOM_LOCK_ON_4, Z2SE_SY_BOOM_LOCK_ON_5, }; /* 8049E36C-8049EB64 00032C 07F8+00 1/1 0/0 0/0 .text initialize__19daBoomerang_sight_cFv */ void daBoomerang_sight_c::initialize() { m_cursorYellowAllPane = m_cursorYellowScrn->search('n_all'); m_cursorYellow0Pane = m_cursorYellowScrn->search('cursor0'); m_cursorYellow1Pane = m_cursorYellowScrn->search('cursor1'); m_cursorYellow2Pane = m_cursorYellowScrn->search('cursor2'); m_cursorYellowBck->searchUpdateMaterialID(m_cursorYellowScrn); m_cursorYellowAllPane->setAnimation(m_cursorYellowBck); m_cursorYellow0Pane->setAnimation(m_cursorYellowBck); m_cursorYellow1Pane->setAnimation(m_cursorYellowBck); m_cursorYellow2Pane->setAnimation(m_cursorYellowBck); m_cursorYellowBck->setFrame(0.0f); m_cursorYellowBpk->searchUpdateMaterialID(m_cursorYellowScrn); m_cursorYellow0Pane->setAnimation(m_cursorYellowBpk); m_cursorYellow1Pane->setAnimation(m_cursorYellowBpk); m_cursorYellow2Pane->setAnimation(m_cursorYellowBpk); m_cursorYellowScrn->search('flash')->setAnimation(m_cursorYellowBpk); m_cursorYellowBpk->setFrame(0.0f); m_cursorYellow2Brk->searchUpdateMaterialID(m_cursorYellowScrn); m_cursorYellowBrk->searchUpdateMaterialID(m_cursorYellowScrn); m_cursorYellow0Pane->setAnimation(m_cursorYellow2Brk); m_cursorYellow1Pane->setAnimation(m_cursorYellow2Brk); m_cursorYellow2Pane->setAnimation(m_cursorYellow2Brk); m_cursorYellow0Pane->setAnimation(m_cursorYellowBrk); m_cursorYellow1Pane->setAnimation(m_cursorYellowBrk); m_cursorYellow2Pane->setAnimation(m_cursorYellowBrk); m_cursorYellow2Brk->setFrame(0.0f); m_cursorYellowBrk->setFrame(0.0f); m_cursorYellowScrn->animation(); m_cursorYellowScrn->setUserInfo('n_43'); m_cursorYellowAllPane->setUserInfo(' '); m_cursorRedAllPane = m_cursorRedScrn->search('n_all'); m_cursorRed0Pane = m_cursorRedScrn->search('cursor0'); m_cursorRed1Pane = m_cursorRedScrn->search('cursor1'); m_cursorRed2Pane = m_cursorRedScrn->search('cursor2'); m_cursorRedAllPane->setAnimation(m_cursorYellowBck); m_cursorRed0Pane->setAnimation(m_cursorYellowBck); m_cursorRed1Pane->setAnimation(m_cursorYellowBck); m_cursorRed2Pane->setAnimation(m_cursorYellowBck); m_cursorRed0Pane->setAnimation(m_cursorYellowBpk); m_cursorRed1Pane->setAnimation(m_cursorYellowBpk); m_cursorRed2Pane->setAnimation(m_cursorYellowBpk); m_cursorRedScrn->search('flash')->setAnimation(m_cursorYellowBpk); m_cursorRed2Brk->searchUpdateMaterialID(m_cursorRedScrn); m_cursorRedBrk->searchUpdateMaterialID(m_cursorRedScrn); m_cursorRed0Pane->setAnimation(m_cursorRed2Brk); m_cursorRed1Pane->setAnimation(m_cursorRed2Brk); m_cursorRed2Pane->setAnimation(m_cursorRed2Brk); m_cursorRed0Pane->setAnimation(m_cursorRedBrk); m_cursorRed1Pane->setAnimation(m_cursorRedBrk); m_cursorRed2Pane->setAnimation(m_cursorRedBrk); m_cursorRed2Brk->setFrame(0.0f); m_cursorRedBrk->setFrame(0.0f); m_cursorRedScrn->animation(); m_cursorRedScrn->setUserInfo('n_43'); m_cursorRedAllPane->setUserInfo(' '); m_cursorOrangeAllPane = m_cursorOrangeScrn->search('n_all'); m_cursorOrange0Pane = m_cursorOrangeScrn->search('cursor0'); m_cursorOrange1Pane = m_cursorOrangeScrn->search('cursor1'); m_cursorOrange2Pane = m_cursorOrangeScrn->search('cursor2'); m_cursorOrangeAllPane->setAnimation(m_cursorYellowBck); m_cursorOrange0Pane->setAnimation(m_cursorYellowBck); m_cursorOrange1Pane->setAnimation(m_cursorYellowBck); m_cursorOrange2Pane->setAnimation(m_cursorYellowBck); m_cursorOrange0Pane->setAnimation(m_cursorYellowBpk); m_cursorOrange1Pane->setAnimation(m_cursorYellowBpk); m_cursorOrange2Pane->setAnimation(m_cursorYellowBpk); m_cursorOrangeScrn->search('flash')->setAnimation(m_cursorYellowBpk); m_cursorOrange2Brk->searchUpdateMaterialID(m_cursorOrangeScrn); m_cursorOrangeBrk->searchUpdateMaterialID(m_cursorOrangeScrn); m_cursorOrange0Pane->setAnimation(m_cursorOrange2Brk); m_cursorOrange1Pane->setAnimation(m_cursorOrange2Brk); m_cursorOrange2Pane->setAnimation(m_cursorOrange2Brk); m_cursorOrange0Pane->setAnimation(m_cursorOrangeBrk); m_cursorOrange1Pane->setAnimation(m_cursorOrangeBrk); m_cursorOrange2Pane->setAnimation(m_cursorOrangeBrk); m_cursorOrange2Brk->setFrame(0.0f); m_cursorOrangeBrk->setFrame(0.0f); m_cursorOrangeScrn->animation(); m_cursorOrangeScrn->setUserInfo('n_43'); m_cursorOrangeAllPane->setUserInfo(' '); } /* 8049EB64-8049EDA8 000B24 0244+00 1/1 0/0 0/0 .text playAnime__19daBoomerang_sight_cFii */ int daBoomerang_sight_c::playAnime(int param_0, int param_1) { int i; f32* var_r30 = field_0x98; f32* var_r29 = field_0xb0; u8* alpha_p = m_alpha; for (i = 0; i < BOOMERANG_LOCK_MAX; i++, var_r30++, var_r29++, alpha_p++) { *var_r30 += 1.1f; if (*var_r30 >= 50.0f) { *var_r30 += -29.0f; } *var_r29 += 1.1f; if (*var_r29 >= (f32)m_cursorYellow2Brk->getFrameMax()) { *var_r29 -= (f32)m_cursorYellow2Brk->getFrameMax(); } if (param_0 <= i && param_1 > i) { cLib_chaseUC(alpha_p, 0xFF, 30); } else { cLib_chaseUC(alpha_p, 0, 30); if (*alpha_p == 0 && i == 0) { m_redSight = false; } } } if (*var_r30 < 21.0f) { *var_r30 = 21.0f; } *var_r30 += 0.9f; if (*var_r30 >= 50.0f) { *var_r30 += -29.0f; } *var_r29 += 0.9f; if (*var_r29 >= m_cursorYellow2Brk->getFrameMax()) { *var_r29 -= (f32)m_cursorYellow2Brk->getFrameMax(); } if (mReserve != 0) { return cLib_chaseUC(alpha_p, 0x80, 30); } return cLib_chaseUC(alpha_p, 0, 30); } /* 8049EDA8-8049EDE8 000D68 0040+00 2/2 0/0 0/0 .text initFrame__19daBoomerang_sight_cFi */ void daBoomerang_sight_c::initFrame(int i_no) { m_alpha[i_no] = 0; field_0x98[i_no] = 4.0f; field_0xb0[i_no] = 0.0f; if (i_no == 0) { m_redSight = true; } } /* 8049EDE8-8049EE8C 000DA8 00A4+00 1/1 0/0 0/0 .text copyNumData__19daBoomerang_sight_cFi */ void daBoomerang_sight_c::copyNumData(int i_no) { int next_no = i_no + 1; u8 temp_alpha = m_alpha[i_no]; m_alpha[i_no] = m_alpha[next_no]; m_alpha[next_no] = temp_alpha; f32 temp_frame; temp_frame = field_0x98[i_no]; field_0x98[i_no] = field_0x98[next_no]; field_0x98[next_no] = temp_frame; temp_frame = field_0xb0[i_no]; field_0xb0[i_no] = field_0xb0[next_no]; field_0xb0[next_no] = temp_frame; cXyz temp_pos = m_pos[i_no]; m_pos[i_no] = m_pos[next_no]; m_pos[next_no] = temp_pos; } /* 8049EEC8-8049EF60 000E88 0098+00 1/1 0/0 0/0 .text setSight__19daBoomerang_sight_cFPC4cXyzi */ void daBoomerang_sight_c::setSight(const cXyz* i_pos, int i_no) { if (m_alpha[i_no]) { if (i_pos != NULL) { m_pos[i_no] = *i_pos; } Vec proj; mDoLib_project(&m_pos[i_no], &proj); m_proj_posX[i_no] = proj.x; m_proj_posY[i_no] = proj.y; } } /* 8049EF60-8049F280 000F20 0320+00 1/0 0/0 0/0 .text draw__19daBoomerang_sight_cFv */ void daBoomerang_sight_c::draw() { J2DGrafContext* ctx = dComIfGp_getCurrentGrafPort(); u8* alpha_p = m_alpha; J2DPane* cursor0_pane; J2DPane* cursor1_pane; J2DPane* cursor2_pane; J2DScreen* screen; J2DPane* cursorAll_pane; f32 var_f30; f32 var_f31; for (int i = 0; i < 6; i++, alpha_p++) { if (*alpha_p != 0) { m_cursorYellowBck->setFrame(field_0x98[i]); m_cursorYellowBpk->setFrame(field_0x98[i] > 21.0f ? 21.0f : field_0x98[i]); if (i == 5) { m_cursorYellow2Brk->setFrame(field_0xb0[i]); cursor0_pane = m_cursorYellow0Pane; cursor1_pane = m_cursorYellow1Pane; cursor2_pane = m_cursorYellow2Pane; screen = m_cursorYellowScrn; cursorAll_pane = m_cursorYellowAllPane; var_f31 = 80.0f; } else if (i == 0 && m_redSight) { m_cursorRed2Brk->setFrame(field_0xb0[i]); cursor0_pane = m_cursorRed0Pane; cursor1_pane = m_cursorRed1Pane; cursor2_pane = m_cursorRed2Pane; screen = m_cursorRedScrn; cursorAll_pane = m_cursorRedAllPane; var_f31 = 35.0f; } else { m_cursorOrange2Brk->setFrame(field_0xb0[i]); cursor0_pane = m_cursorOrange0Pane; cursor1_pane = m_cursorOrange1Pane; cursor2_pane = m_cursorOrange2Pane; screen = m_cursorOrangeScrn; cursorAll_pane = m_cursorOrangeAllPane; var_f31 = 35.0f; } screen->animation(); cursorAll_pane->scale(0.6f, 0.6f); cursorAll_pane->translate(m_proj_posX[i], m_proj_posY[i]); field_0x98[i] = field_0x98[i]; if (!(field_0x98[i] < 15.0f)) { if (field_0x98[i] < 21.0f) { var_f30 = var_f31 * (field_0x98[i] - 15.0f) * 0.16666667f; } else if (i == 5) { var_f30 = var_f31 * (*alpha_p * 0.00390625f + 0.5f); } else { var_f30 = var_f31 * (*alpha_p * 0.0019607844f + 0.5f); } cursor0_pane->translate(0.0f, -var_f30); cursor1_pane->translate(var_f30 * cM_fcos(2.6179938f), var_f30 * cM_fsin(2.6179938f)); cursor2_pane->translate(var_f30 * cM_fcos(0.5235988f), var_f30 * cM_fsin(0.5235988f)); } screen->draw(0.0f, 0.0f, ctx); } } } /* 8049F280-8049F360 001240 00E0+00 1/1 0/0 0/0 .text windModelCallBack__13daBoomerang_cFv */ void daBoomerang_c::windModelCallBack() { mDoMtx_stack_c::YrotS(shape_angle.y); mDoMtx_stack_c::ZrotM(-shape_angle.z); mDoMtx_stack_c::XrotM(-shape_angle.x); mDoMtx_stack_c::YrotM(-shape_angle.y); mDoMtx_stack_c::concat(J3DSys::mCurrentMtx); mDoMtx_stack_c::get()[0][3] = J3DSys::mCurrentMtx[0][3]; mDoMtx_stack_c::get()[1][3] = J3DSys::mCurrentMtx[1][3]; mDoMtx_stack_c::get()[2][3] = J3DSys::mCurrentMtx[2][3]; cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); mp_shippuModel->setAnmMtx(4, mDoMtx_stack_c::get()); } /* 8049F360-8049F39C 001320 003C+00 1/1 0/0 0/0 .text daBoomeang_windModelCallBack__FP8J3DJointi */ static int daBoomeang_windModelCallBack(J3DJoint* i_joint, int param_1) { daBoomerang_c* boomerang = (daBoomerang_c*)j3dSys.getModel()->getUserArea(); if (param_1 == 0) { boomerang->windModelCallBack(); } return 1; } /* 8049F39C-8049F5D4 00135C 0238+00 1/1 0/0 0/0 .text draw__13daBoomerang_cFv */ int daBoomerang_c::draw() { if (!checkStateFlg0(FLG0_4)) { for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { if (m_sight.getAlpha(i) != 0) { if (m_lockActors[i] != NULL) { m_lockActors[i] = fopAcM_SearchByID(m_lockActorIDs[i]); if (m_lockActors[i] == NULL) { pushLockList(i); i--; } else { m_sight.setSight(&m_lockActors[i]->eyePos, i); } } else { if (field_0x718[i] != 0) { m_sight.setSight(&m_lockActorsPositions[i], i); } else { m_sight.setSight(NULL, i); } } } } if (m_sight.getAlpha(5) != 0) { if (field_0x6d8 != NULL) { field_0x6d8 = fopAcM_SearchByID(field_0x6d4); } if (field_0x6d8 != NULL) { m_sight.setSight(&field_0x6d8->eyePos, 5); } else { m_sight.setSight(NULL, 5); } } if (!dComIfGp_event_runCheck()) { dComIfGd_set2DXlu(&m_sight); } } g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(mp_boomModel, &tevStr); mDoExt_modelUpdateDL(mp_boomModel); daMirror_c::entry(mp_boomModel); if (fopAcM_GetParam(this) != 0) { g_env_light.setLightTevColorType_MAJI(mp_shippuModel, &tevStr); mDoExt_modelEntryDL(mp_shippuModel); daMirror_c::entry(mp_shippuModel); } else if (dComIfGp_checkPlayerStatus0(0, 0x80000)) { g_env_light.setLightTevColorType_MAJI(mp_setboomEfModel, &tevStr); mDoExt_modelUpdateDL(mp_setboomEfModel); } return 1; } /* 8049F5D4-8049F5F4 001594 0020+00 1/0 0/0 0/0 .text daBoomerang_Draw__FP13daBoomerang_c */ static int daBoomerang_Draw(daBoomerang_c* i_this) { return i_this->draw(); } /* 8049F5F4-8049F63C 0015B4 0048+00 1/1 0/0 0/0 .text * lockLineCallback__13daBoomerang_cFP10fopAc_ac_c */ void daBoomerang_c::lockLineCallback(fopAc_ac_c* i_actor) { if (i_actor != NULL && fopAcM_GetName(i_actor) != PROC_Obj_glowSphere && fopAcM_GetName(i_actor) != PROC_E_VT && fopAcM_GetName(i_actor) != PROC_OBJ_BRG) { setLockActor(i_actor, TRUE); } } /* 8049F63C-8049F660 0015FC 0024+00 1/1 0/0 0/0 .text * daBoomerang_lockLineCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ static void daBoomerang_lockLineCallback(fopAc_ac_c* i_actorP1, dCcD_GObjInf* param_1, fopAc_ac_c* i_actorP2, dCcD_GObjInf* param_3) { daBoomerang_c* boomerang = (daBoomerang_c*)i_actorP1; boomerang->lockLineCallback(i_actorP2); } /* 8049F660-8049F6EC 001620 008C+00 1/1 0/0 0/0 .text * moveLineCallback__13daBoomerang_cFP10fopAc_ac_c */ void daBoomerang_c::moveLineCallback(fopAc_ac_c* i_actor) { if (i_actor != NULL) { for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { if (m_lockActors[i] == i_actor) { m_lockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; m_lockActors[i] = NULL; if (i == field_0x951) { field_0x957 = 10; m_moveTargetPos = i_actor->eyePos; m_movePos = current.pos; } } } } } /* 8049F6EC-8049F710 0016AC 0024+00 1/1 0/0 0/0 .text * daBoomerang_moveLineCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ static void daBoomerang_moveLineCallback(fopAc_ac_c* i_actorP1, dCcD_GObjInf* param_1, fopAc_ac_c* i_actorP2, dCcD_GObjInf* param_3) { daBoomerang_c* boomerang = (daBoomerang_c*)i_actorP1; boomerang->moveLineCallback(i_actorP2); } /* 8049F710-8049F818 0016D0 0108+00 3/3 0/0 0/0 .text pushLockList__13daBoomerang_cFi */ void daBoomerang_c::pushLockList(int param_0) { if (param_0 == 0) { m_sight.offRedSight(); } if (fopAcM_GetParam(this) == 1 && param_0 < field_0x951) { field_0x951--; } int i; for (i = param_0; i < m_lockCnt - 1; i++) { m_lockActorIDs[i] = m_lockActorIDs[i + 1]; m_lockActors[i] = m_lockActors[i + 1]; m_lockActorsPositions[i] = m_lockActorsPositions[i + 1]; field_0x718[i] = field_0x718[i + 1]; m_sight.copyNumData(i); } m_lockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; m_lockActors[i] = NULL; field_0x718[i] = 0; if (m_lockCnt != 0) { m_lockCnt--; } } /* 8049F818-8049F874 0017D8 005C+00 1/0 0/0 0/0 .text * cancelLockActorBase__13daBoomerang_cFP10fopAc_ac_c */ void daBoomerang_c::cancelLockActorBase(fopAc_ac_c* i_actor) { for (int i = 0; i < m_lockCnt; i++) { if (m_lockActors[i] == i_actor) { pushLockList(i); break; } } } /* 8049F874-8049F8B0 001834 003C+00 1/0 0/0 0/0 .text * setAimActorBase__13daBoomerang_cFP10fopAc_ac_c */ void daBoomerang_c::setAimActorBase(fopAc_ac_c* i_actor) { if (m_lockCnt == 0) { onStateFlg0(FLG0_4); setLockActor(i_actor, FALSE); } } /* 8049F8B0-8049F9A4 001870 00F4+00 2/2 0/0 0/0 .text setLockActor__13daBoomerang_cFP10fopAc_ac_ci */ int daBoomerang_c::setLockActor(fopAc_ac_c* i_actor, BOOL i_isLockline) { if (m_lockCnt >= BOOMERANG_LOCK_MAX) { return 0; } fpc_ProcID lock_actor_id = fopAcM_GetID(i_actor); for (int i = 0; i < m_lockCnt; i++) { if (m_lockActorIDs[i] == lock_actor_id) { return 0; } } if (i_isLockline) { f32 sqdist = i_actor->eyePos.abs2(current.pos); if (sqdist > m_lockLineSqdist) { return 0; } m_lockLineSqdist = sqdist; m_lockLineActorID = lock_actor_id; } else { m_lockActorIDs[m_lockCnt] = lock_actor_id; m_lockActors[m_lockCnt] = i_actor; m_sight.initFrame(m_lockCnt); m_lockCnt++; } return 1; } /* 8049F9A4-8049F9F0 001964 004C+00 3/3 0/0 0/0 .text resetLockActor__13daBoomerang_cFv */ void daBoomerang_c::resetLockActor() { for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { m_lockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; m_lockActors[i] = NULL; field_0x718[i] = 0; } m_lockCnt = 0; field_0x951 = 0; } /* 8049F9F0-8049FAA4 0019B0 00B4+00 2/2 0/0 0/0 .text setRoomInfo__13daBoomerang_cFv */ void daBoomerang_c::setRoomInfo() { m_gndChk.SetPos(¤t.pos); mGroundY = dComIfG_Bgsp().GroundCross(&m_gndChk); int roomNo; if (mGroundY != -1000000000.0f) { roomNo = dComIfG_Bgsp().GetRoomId(m_gndChk); tevStr.YukaCol = dComIfG_Bgsp().GetPolyColor(m_gndChk); } else { roomNo = dComIfGp_roomControl_getStayNo(); } tevStr.room_no = roomNo; m_reverb = dComIfGp_getReverb(roomNo); m_colliderStts.SetRoomId(roomNo); fopAcM_SetRoomNo(this, roomNo); } /* 8049FAA4-8049FBAC 001A64 0108+00 2/2 0/0 0/0 .text setKeepMatrix__13daBoomerang_cFv */ void daBoomerang_c::setKeepMatrix() { daAlink_c* player = daAlink_getAlinkActorClass(); mDoMtx_stack_c::copy(player->getLeftItemMatrix()); mDoMtx_stack_c::transM(32.0f, -5.0f, -6.0f); mDoMtx_stack_c::XYZrotM(cM_deg2s(-4.0f), cM_deg2s(39.0f), cM_deg2s(-9.0f)); mp_boomModel->setBaseTRMtx(mDoMtx_stack_c::get()); mp_shippuModel->setBaseTRMtx(player->getLeftItemMatrix()); mDoMtx_stack_c::multVecZero(¤t.pos); daAlink_c::simpleAnmPlay(m_waitEffBtk); mp_setboomEfModel->setBaseTRMtx(player->getLeftItemMatrix()); } /* 8049FBAC-8049FCD0 001B6C 0124+00 1/1 0/0 0/0 .text setMoveMatrix__13daBoomerang_cFv */ void daBoomerang_c::setMoveMatrix() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mp_shippuModel->setBaseTRMtx(mDoMtx_stack_c::get()); daAlink_c::simpleAnmPlay(m_windBtk); m_shippuFrame += 1.0f; s32 maxFrame = m_shippuBck.getBckAnm()->getFrameMax(); if (m_shippuFrame >= maxFrame) { m_shippuFrame -= maxFrame; } m_shippuBck.entry(mp_shippuModel->getModelData(), m_shippuFrame); mp_shippuModel->calc(); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mDoMtx_stack_c::YrotM(m_modelRotY); mDoMtx_stack_c::XrotM(0x7FFF); mp_boomModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 8049FCD0-8049FD6C 001C90 009C+00 1/1 0/0 0/0 .text setRotAngle__13daBoomerang_cFv */ void daBoomerang_c::setRotAngle() { s16 prev_rot = m_modelRotY; m_modelRotY -= 0x1F00; if (prev_rot >= 0 && m_modelRotY < 0) { fopAcM_seStart(this, JA_SE_LK_BOOM_FLY, 0); } } /* 8049FD6C-8049FE6C 001D2C 0100+00 2/2 0/0 0/0 .text setAimPos__13daBoomerang_cFv */ void daBoomerang_c::setAimPos() { if (checkStateFlg0(FLG0_1)) { if (fopAcM_GetParam(this) != 1) return; m_aimPos = daAlink_getAlinkActorClass()->getBoomerangCatchPos(); return; } if (field_0x957 != 0) { m_aimPos = m_moveTargetPos; return; } for (int i = field_0x951; i < m_lockCnt; i++, field_0x951++) { if (m_lockActors[i] != NULL) { m_aimPos = m_lockActors[i]->eyePos; return; } if (field_0x718[i] != 0) { m_aimPos = m_lockActorsPositions[i]; return; } } } /* 8049FE6C-804A006C 001E2C 0200+00 2/2 0/0 0/0 .text checkBgHit__13daBoomerang_cFP4cXyzP4cXyz */ void daBoomerang_c::checkBgHit(cXyz* i_start, cXyz* i_end) { m_lineChk.Set(i_start, i_end, this); if (dComIfG_Bgsp().LineCross(&m_lineChk)) { current.pos = m_lineChk.GetCross(); onStateFlg0(FLG0_1); field_0x957 = 0; current.angle.y -= -0x8000; shape_angle.y = current.angle.y; resetLockActor(); return; } if (field_0x962 != 0) { return; } m_boomLineChk.Set(i_start, i_end, this); if (!dComIfG_Bgsp().LineCross(&m_boomLineChk)) return; if (checkStateFlg0(FLG0_200)) { return; } if (field_0x718[field_0x951] != 0) { if (m_lockActorsPositions[field_0x951].abs2(m_boomLineChk.GetCross()) < 2500.0f) { if (field_0x951 < m_lockCnt - 1) { field_0x718[field_0x951] = 0; field_0x951++; return; } } } if (field_0x957 == 0) { if (checkStateFlg0(FLG0_10) == 0 && m_lockCnt > field_0x951) { return; } current.pos = m_boomLineChk.GetCross(); onStateFlg0(FLG0_1); field_0x957 = 0; current.angle.y -= -0x8000; if (dBgS_CheckBRoofPoly(m_boomLineChk)) { current.angle.x *= -1; current.pos.y -= 30.0f; } shape_angle.y = current.angle.y; resetLockActor(); } } /* 804A006C-804A012C 00202C 00C0+00 1/1 0/0 0/0 .text setEffectTraceMatrix__13daBoomerang_cFPUlUs */ JPABaseEmitter* daBoomerang_c::setEffectTraceMatrix(u32* i_emitterID, u16 i_name) { *i_emitterID = dComIfGp_particle_set(*i_emitterID, i_name, ¤t.pos, &tevStr); JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(*i_emitterID); if (emitter != NULL) { emitter->setGlobalRTMatrix(mp_boomModel->getBaseTRMtx()); } return emitter; } UNK_REL_DATA; UNK_REL_BSS; /* 804A2D10-804A2D14 000040 0001+03 0/0 0/0 0/0 .bss l_HIO */ static daBoomerang_HIO_c0 l_HIO; /* 804A012C-804A082C 0020EC 0700+00 1/1 0/0 0/0 .text setEffect__13daBoomerang_cFv */ void daBoomerang_c::setEffect() { static JGeometry::TVec3 effDirection(0.0f, 1.0f, 0.0f); static JGeometry::TVec3 effScale0(1.5f, 1.5f, 1.5f); static JGeometry::TVec3 effScaleSand(1.8f, 1.8f, 1.8f); static JGeometry::TVec3 effScaleGrass(1.2f, 1.2f, 1.2f); if (fopAcM_GetParam(this) != 0) { setEffectTraceMatrix(&field_0x96c, 0x1FE); setEffectTraceMatrix(&field_0x970, 0x1FF); field_0x974 = dComIfGp_particle_set(field_0x974, 0x24C, ¤t.pos, &tevStr); cXyz no_crr_pos(current.pos); m_acch.CrrPos(dComIfG_Bgsp()); current.pos = no_crr_pos; cXyz eff_center(mp_shippuModel->getAnmMtx(4)[0][3], mp_shippuModel->getAnmMtx(5)[1][3], mp_shippuModel->getAnmMtx(4)[2][3]); cXyz* eff_pos = NULL; cM3dGPla plane; if (m_acch.ChkWaterHit() && dComIfG_Bgsp().GetPolyAtt0(m_acch.m_wtr) != 6) { if (m_acch.m_wtr.GetHeight() > m_acch.GetGroundH() && m_acch.m_wtr.GetHeight() > eff_center.y) { eff_center.y = m_acch.m_wtr.GetHeight(); eff_pos = &eff_center; dComIfG_Bgsp().GetTriPla(m_acch.m_wtr, &plane); } } if (eff_pos == NULL && m_acch.GetGroundH() > eff_center.y) { eff_center.y = m_acch.GetGroundH(); eff_pos = &eff_center; dComIfG_Bgsp().GetTriPla(m_acch.m_gnd, &plane); } m_papo.setEffectCenter(&tevStr, &eff_center, 4, 0x60000, eff_pos, ¤t.angle, NULL, fopAcM_GetRoomNo(this), 0.0f, speedF); for (int i = 0; i < 2; i++) { u8 eff_type = m_papo.getCenterEffType(i); for (int j = 0; j < 4; j++) { JPABaseEmitter* emitter = m_papo.getCenterEmitter(i, j); if (emitter != NULL) { if (eff_type == 0) { emitter->setVolumeSize(60); emitter->setLifeTime(20); emitter->setRate(3.0f); emitter->setAwayFromAxisSpeed(5.0f); emitter->setDirectionalSpeed(0.0f); emitter->setGlobalParticleScale(effScale0); } else if (eff_type == 1) { emitter->setVolumeSize(50); emitter->setAwayFromAxisSpeed(10.0f); emitter->setDirectionalSpeed(10.0f); emitter->setDirection(effDirection); emitter->setGlobalParticleScale(effScaleGrass); } else if (eff_type == 2) { emitter->setDirection(effDirection); emitter->setGlobalScale(effScale0); } else if (eff_type == 3) { emitter->setVolumeSize(60); emitter->setLifeTime(0xF); emitter->setAwayFromAxisSpeed(3.0f); emitter->setDirection(effDirection); emitter->setGlobalParticleScale(effScaleSand); } else if (eff_type == 4) { emitter->setVolumeSize(60); emitter->setAwayFromAxisSpeed(5.0f); emitter->setDirection(effDirection); emitter->setGlobalParticleScale(effScale0); } } } } if (eff_pos != NULL) { csXyz eff_angle(cM_atan2s(plane.mNormal.absXZ(), plane.mNormal.y), 0, 0); if (eff_angle.x != 0) { eff_angle.y = plane.mNormal.atan2sX_Z(); } field_0x978 = dComIfGp_particle_set(field_0x978, 0x256, eff_pos, &tevStr, &eff_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); field_0x97c = dComIfGp_particle_set(field_0x97c, 0x257, eff_pos, &tevStr, &eff_angle, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); } cXyz wind_cyl_pos(current.pos.x, eff_center.y, current.pos.z); m_windAtCyl.SetC(wind_cyl_pos); f32 wind_cyl_height = current.pos.y - eff_center.y; if (wind_cyl_height < 0.01f) { wind_cyl_height = 0.01f; } m_windAtCyl.SetH(wind_cyl_height); } if (dComIfGp_checkPlayerStatus0(0, 0x80000) && fopAcM_GetParam(this) == 0) { setEffectTraceMatrix(&field_0x968, 0x740); } else { JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x968); if (emitter != NULL) { emitter->stopDrawParticle(); } } } /* 804A0874-804A0F0C 002834 0698+00 2/0 0/0 0/0 .text procWait__13daBoomerang_cFv */ // NONMATCHING - small regalloc int daBoomerang_c::procWait() { daAlink_c* player = daAlink_getAlinkActorClass(); speedF = 0.0f; setKeepMatrix(); if (fopAcM_GetParam(this) == 1) { speedF = player->getBoomSpeed(); field_0x988 = speedF; m_windBtk->setFrame(0.0f); m_shippuFrame = 0.0f; m_atCps.ResetAtHit(); m_windAtCyl.ResetAtHit(); field_0x957 = 0; offStateFlg0(daBoomerang_FLG0(FLG0_80 | FLG0_2 | FLG0_1)); field_0x951 = 0; setAimPos(); if (m_lockCnt == 0) { resetLockActor(); f32 fly_max = player->getBoomFlyMax(); m_aimPos.set(current.pos.x + (fly_max * cM_ssin(current.angle.y) * cM_scos(current.angle.x)), current.pos.y + (fly_max * cM_ssin(current.angle.x)), current.pos.z + (fly_max * cM_scos(current.angle.y) * cM_scos(current.angle.x))); } else { cXyz sp24 = m_aimPos - current.pos; current.angle.x = sp24.atan2sY_XZ(); current.angle.y = sp24.atan2sX_Z(); } m_modelRotY = 0; if (m_lockCnt == 0) { onStateFlg0(FLG0_10); } else { offStateFlg0(FLG0_10); } current.angle.y += 0x1830; shape_angle.x = current.angle.x; shape_angle.y = current.angle.y; shape_angle.z = 0x1000; field_0x958 = 0x1000; m_procFn = &daBoomerang_c::procMove; offStateFlg0(FLG0_20); cXyz line_chk_start(player->current.pos.x, 60.0f + player->current.pos.y, player->current.pos.z); checkBgHit(&line_chk_start, ¤t.pos); field_0x960 = 10; field_0x954 = 30; field_0x955 = 0; field_0x962 = player->getBoomBgThroughTime(); procMove(); } else if (dCam_getBody()->Mode() != 8) { if (dComIfGp_checkPlayerStatus0(0, 0x80000) && player->getAtnActor() != NULL && m_lockCnt < BOOMERANG_LOCK_MAX) { fpc_ProcID atn_actor_id = fopAcM_GetID(player->getAtnActor()); int var_r27 = 0; while (var_r27 < m_lockCnt) { if (m_lockActorIDs[var_r27] == atn_actor_id) { break; } var_r27 += 1; } if (var_r27 == m_lockCnt) { m_lockActors[m_lockCnt] = player->getAtnActor(); m_lockActorIDs[m_lockCnt] = atn_actor_id; m_sight.initFrame(m_lockCnt); mDoAud_seStart(l_lockSeFlg[m_lockCnt], NULL, 0, 0); m_lockCnt++; } } else if (!dComIfGp_checkPlayerStatus0(0, 0x80000)) { resetLockActor(); } m_lockLineActorID = fpcM_ERROR_PROCESS_ID_e; } else if (player->checkBoomerangLockAccept()) { int sp10 = 0; fopAc_ac_c* lock_line_actor; if (m_lockLineActorID != fpcM_ERROR_PROCESS_ID_e) { lock_line_actor = fopAcM_SearchByID(m_lockLineActorID); } else { lock_line_actor = NULL; } if (lock_line_actor != NULL && checkStateFlg0(FLG0_100)) { m_lockActorIDs[m_lockCnt] = m_lockLineActorID; m_lockActors[m_lockCnt] = lock_line_actor; m_sight.initFrame(m_lockCnt); mDoAud_seStart(l_lockSeFlg[m_lockCnt], NULL, 0, 0); m_lockCnt++; sp10 = 1; } else if (checkStateFlg0(FLG0_400) && m_lockCnt < BOOMERANG_LOCK_MAX) { m_sight.initFrame(m_lockCnt); m_lockActorsPositions[m_lockCnt] = field_0x99c; field_0x718[m_lockCnt] = 1; mDoAud_seStart(l_lockSeFlg[m_lockCnt], NULL, 0, 0); m_lockCnt++; } if (m_lockCnt < BOOMERANG_LOCK_MAX && lock_line_actor != NULL && sp10 == 0) { m_sight.onReserve(); field_0x6d4 = m_lockLineActorID; field_0x6d8 = lock_line_actor; } camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); f32 cps_size; if (field_0x6d8 != NULL) { cps_size = 30.0f; } else { cps_size = 15.0f; } m_atCps.cM3dGCps::Set(*fopCamM_GetEye_p(camera), *player->getLineTopPosP(), cps_size); m_atCps.CalcAtVec(); dComIfG_Ccsp()->Set(&m_atCps); m_lockLineSqdist = (100.0f + player->getBoomLockMax()) * (100.0f + player->getBoomLockMax()); m_lockLineActorID = fpcM_ERROR_PROCESS_ID_e; offStateFlg0(FLG0_400); if (player->checkBoomerangLockTrigger()) { onStateFlg0(FLG0_100); if (player->checkItemSightBgHit()) { onStateFlg0(FLG0_400); } field_0x99c = *player->getBoomerangLockPosP(); } else { offStateFlg0(FLG0_100); } } else { m_lockLineActorID = fpcM_ERROR_PROCESS_ID_e; } if (dComIfGp_checkPlayerStatus0(0, 0x80000)) { m_sound.startLevelSound(Z2SE_BOOM_POWER_RESUME, 0, -1); } return 1; } /* 804A0F0C-804A1814 002ECC 0908+00 2/1 0/0 0/0 .text procMove__13daBoomerang_cFv */ int daBoomerang_c::procMove() { daAlink_c* player = daAlink_getAlinkActorClass(); if (field_0x957 != 0) { speedF = 40.0f; field_0x957--; if (field_0x957 == 0) { onStateFlg0(FLG0_2); offStateFlg0(FLG0_10); } cLib_addCalc(&m_shippuSize, 2.0f, 0.5f, 0.5f, 0.1f); } else { if (checkStateFlg0(FLG0_80)) { speedF = player->getBoomCatchSpeed(); } else { speedF = field_0x988; } cLib_addCalc(&m_shippuSize, 1.0f, 0.5f, 0.5f, 0.1f); } Vec shippu_size = {0.0f, 1.0f, 0.0f}; shippu_size.x = m_shippuSize; shippu_size.z = m_shippuSize; mp_shippuModel->setBaseScale(shippu_size); offStateFlg0(daBoomerang_FLG0(FLG0_200 | FLG0_80)); setRotAngle(); setAimPos(); if (checkStateFlg0(FLG0_40)) { offStateFlg0(FLG0_40); if (player->returnBoomerang(checkStateFlg0(FLG0_20))) { fopAcM_SetParam(this, 0); m_procFn = &daBoomerang_c::procWait; offStateFlg0(daBoomerang_FLG0(FLG0_400 | FLG0_100 | FLG0_20 | FLG0_4)); m_lockLineActorID = fpcM_ERROR_PROCESS_ID_e; current.pos = m_aimPos; setMoveMatrix(); resetLockActor(); } else { fopAcM_delete(this); } return 1; } cXyz sp38 = m_aimPos - current.pos; f32 temp_f30 = sp38.abs(); cXyz sp2C; if (temp_f30 > 0.1f) { sp2C = sp38 / temp_f30; } else { sp2C = sp38; } s16 var_r26 = sp2C.atan2sX_Z(); s16 var_r28 = var_r26 - current.angle.y; if (checkStateFlg0(FLG0_2)) { offStateFlg0(FLG0_2); if (checkStateFlg0(FLG0_1)) { current.angle.y = var_r26 + 0x3000; } else if ((s16)(var_r26 - current.angle.y) >= 0) { current.angle.y = var_r26 - 0x3000; } else { current.angle.y = var_r26 + 0x3000; } var_r28 = var_r26 - current.angle.y; } if (field_0x960 != 0) { field_0x960--; } if (field_0x954 != 0) { field_0x954--; if (field_0x954 == 0) { field_0x954 = 30; field_0x955++; if (field_0x955 > 48) { field_0x955 = 48; } } } bool sp9 = field_0x960 == 0 && (current.pos.abs2(player->getBoomerangCatchPos()) < 4.0f * speedF * speedF); if ((checkStateFlg0(FLG0_1) || sp9) && (sp9 || temp_f30 < 2.0f * speedF)) { field_0x957 = 0; onStateFlg0(daBoomerang_FLG0(FLG0_40 | FLG0_1)); resetLockActor(); } if (!checkStateFlg0(FLG0_1) && field_0x957 == 0 && !checkStateFlg0(FLG0_10) && m_lockCnt <= field_0x951) { onStateFlg0(daBoomerang_FLG0(FLG0_2 | FLG0_1)); resetLockActor(); offStateFlg0(FLG0_10); } if (checkStateFlg0(FLG0_2)) { current.angle.y = var_r26; field_0x955 = 0; field_0x954 = 30; } else if (field_0x957 != 0) { cLib_chaseAngleS(¤t.angle.y, var_r26, 0x2000); } else { f32 var_f31 = 20.0f - ((2.0f * temp_f30) / speedF); if (var_f31 < 0.0f) { var_f31 = 0.0f; } else if (var_f31 > 18.0f) { var_f31 = 20.0f + (40.0f * (var_f31 - 18.0f)); } s16 var_r27 = 1024.0f + (256.0f * var_f31); if (var_r27 > 0x4000) { var_r27 = 0x4000; } else { var_r27 += field_0x955 * 256; if (var_r27 > 0x4000) { var_r27 = 0x4000; } } if (var_r28 > var_r27) { var_r28 = var_r27; } else if (var_r28 < -var_r27) { var_r28 = -var_r27; } current.angle.y += var_r28; } current.angle.x = sp2C.atan2sY_XZ(); current.pos.x += speedF * cM_scos(current.angle.x) * cM_ssin(current.angle.y); current.pos.y -= speedF * cM_ssin(current.angle.x); current.pos.z += speedF * cM_scos(current.angle.x) * cM_scos(current.angle.y); cXyz sp20 = m_aimPos - current.pos; if (temp_f30 < speedF && field_0x957 == 0 && !checkStateFlg0(FLG0_1)) { if (sp20.inprod(sp38) <= 0.0f) { if (checkStateFlg0(FLG0_10)) { onStateFlg0(FLG0_2); offStateFlg0(FLG0_10); } else { field_0x957 = 10; m_moveTargetPos = m_aimPos; m_movePos = current.pos; } m_lockActors[field_0x951] = NULL; m_lockActorIDs[field_0x951] = fpcM_ERROR_PROCESS_ID_e; if (field_0x718[field_0x951] != 0) { onStateFlg0(FLG0_200); } field_0x718[field_0x951] = 0; field_0x951++; } } cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 3, 0x1000, 0x400); cLib_addCalcAngleS(&shape_angle.x, current.angle.x, 3, 0x1000, 0x400); if (!checkStateFlg0(FLG0_1)) { checkBgHit(&old.pos, ¤t.pos); } var_r28 = -(var_r28 * 2); if (var_r28 > 0x100) { var_r28 = 0x1000; } else if (var_r28 < -0x100) { var_r28 = -0x1000; } else { var_r28 = field_0x958; } field_0x958 = var_r28; cLib_addCalcAngleS(&shape_angle.z, var_r28, 0x10, 0x1000, 0x10); setMoveMatrix(); m_sound.startLevelSound(Z2SE_BOOM_TORNADO, 0, -1); if (!dComIfGp_event_runCheck()) { dComIfG_Ccsp()->Set(&m_windAtCyl); g_dComIfG_gameInfo.play.mCcs.mMass_Mng.Set(&m_windAtCyl, 1); //dComIfG_Ccsp()->SetMass(&m_windAtCyl, 1); } else { m_atCps.ResetAtHit(); m_windAtCyl.ResetAtHit(); } return 1; } /* 804A1814-804A1BD4 0037D4 03C0+00 1/1 0/0 0/0 .text execute__13daBoomerang_cFv */ int daBoomerang_c::execute() { if (field_0x957 != 0) { current.pos = field_0x9b8; } if (checkStateFlg0(FLG0_1) && fopAcM_wt_c::waterCheck(¤t.pos)) { cXyz spC(current.pos.x, current.pos.y - 50.0f, current.pos.z); f32 roof_y; if (fopAcM_rc_c::roofCheck(&spC) && dComIfG_Bgsp().GetUnderwaterRoofCode(*fopAcM_rc_c::getRoofCheck()) == 0) { roof_y = fopAcM_rc_c::getRoofY(); } else { roof_y = 1000000000.0f; } if (roof_y > fopAcM_wt_c::getWaterY() && current.pos.y < fopAcM_wt_c::getWaterY() - 50.0f) { fopAcM_delete(this); return 1; } } if (m_forceDelete) { fopAcM_delete(this); return 1; } m_sight.offReserve(); field_0x6d4 = fpcM_ERROR_PROCESS_ID_e; field_0x6d8 = 0; if (field_0x962 != 0) { field_0x962--; } camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); s16 cam_angleY = fopCamM_GetAngleY(camera); s16 cam_angleX = fopCamM_GetAngleX(camera); for (int i = 0; i < m_lockCnt; i++) { if (m_lockActorIDs[i] != fpcM_ERROR_PROCESS_ID_e) { m_lockActors[i] = fopAcM_SearchByID(m_lockActorIDs[i]); if (m_lockActors[i] == NULL) { pushLockList(i); i--; } } } daAlink_c* player = daAlink_getAlinkActorClass(); if (dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo()) != ST_BOSS_ROOM) { f32 temp_f31 = 500.0f + player->getBoomLockMax(); int var_r26 = 0; temp_f31 *= temp_f31; for (int i = 0; i < m_lockCnt; i++) { f32 var_f29; if (field_0x718[i] != 0) { var_f29 = player->current.pos.abs2(m_lockActorsPositions[i]); } else if (m_lockActors[i] != NULL) { var_f29 = player->current.pos.abs2(m_lockActors[i]->eyePos); } else { continue; } if (var_f29 > temp_f31) { pushLockList(i); i--; var_r26 = 1; } } if (var_r26 != 0 && m_lockCnt == 0) { onStateFlg0(FLG0_1); field_0x957 = 0; } } (this->*m_procFn)(); setRoomInfo(); m_sight.playAnime(field_0x951, m_lockCnt); field_0x95c = cam_angleY; field_0x95e = cam_angleX; setEffect(); m_sound.framework(0, m_reverb); field_0x9b8 = current.pos; if (field_0x957 != 0) { cLib_chasePos(&m_movePos, m_moveTargetPos, speedF); current.pos = m_movePos; } attention_info.position = current.pos; eyePos = current.pos; if (dComIfGp_event_runCheck()) { daPy_boomerangMove_c::onEventKeepFlg(); } return 1; } /* 804A1BD4-804A1BF4 003B94 0020+00 1/0 0/0 0/0 .text daBoomerang_Execute__FP13daBoomerang_c */ static int daBoomerang_Execute(daBoomerang_c* i_this) { return i_this->execute(); } /* 804A1BF4-804A1EBC 003BB4 02C8+00 1/1 0/0 0/0 .text __dt__13daBoomerang_cFv */ daBoomerang_c::~daBoomerang_c() { m_sound.deleteObject(); } /* 804A1EBC-804A1EE4 003E7C 0028+00 1/0 0/0 0/0 .text daBoomerang_Delete__FP13daBoomerang_c */ static int daBoomerang_Delete(daBoomerang_c* i_this) { i_this->~daBoomerang_c(); return 1; } /* 804A1EE4-804A2064 003EA4 0180+00 1/1 0/0 0/0 .text createHeap__13daBoomerang_cFv */ int daBoomerang_c::createHeap() { if (!m_sight.createHeap()) { return 0; } m_sight.initialize(); J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x1F); JUT_ASSERT(2882, modelData != 0); mp_boomModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (mp_boomModel == NULL) { return 0; } modelData = (J3DModelData*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x34); JUT_ASSERT(2898, modelData != 0); mp_shippuModel = mDoExt_J3DModel__create(modelData, 0, 0x11000284); if (mp_shippuModel == NULL) { return 0; } J3DAnmTransform* transAnm = (J3DAnmTransform*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x13); JUT_ASSERT(2911, transAnm != 0); if (m_shippuBck.init(transAnm, 0, 2, 1.0f, 0, -1, false) == 0) { return 0; } modelData = (J3DModelData*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x19); mp_setboomEfModel = mDoExt_J3DModel__create(modelData, 0, 0x11000284); if (mp_setboomEfModel == NULL) { return 0; } m_sound.init(¤t.pos, 2); return 1; } /* 804A2064-804A2084 004024 0020+00 1/1 0/0 0/0 .text daBoomerang_createHeap__FP10fopAc_ac_c */ static int daBoomerang_createHeap(fopAc_ac_c* i_this) { return ((daBoomerang_c*)i_this)->createHeap(); } /* 804A2B14-804A2B60 000038 004C+00 0/1 0/0 0/0 .data l_atCpsSrc */ static dCcD_SrcCps l_atCpsSrc = { { {0, {{AT_TYPE_BOOMERANG, 0, 0x3B}, {0, 0}, 0}}, {dCcD_SE_WOOD, 4, 0, 0, {0}}, {dCcD_SE_NONE, 0, 0, 0, {0}}, {0}, }, { { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, 15.0f, }, } }; /* 804A2B60-804A2BA4 000084 0044+00 0/1 0/0 0/0 .data l_windAtCylSrc */ static dCcD_SrcCyl l_windAtCylSrc = { { {0, {{AT_TYPE_BOOMERANG, 0, 0x1B}, {0, 0}, 0}}, {dCcD_SE_13, 0, 0, dCcD_MTRL_WIND, {2}}, {dCcD_SE_NONE, 0, 0, 0, {0}}, {0}, }, { {0.0f, 0.0f, 0.0f}, 150.0f, 600.0f, } }; /* 804A2084-804A230C 004044 0288+00 1/1 0/0 0/0 .text create__13daBoomerang_cFv */ int daBoomerang_c::create() { fpc_ProcID id = fopAcM_GetID(this); fopAcM_SetupActor(this, daBoomerang_c); if (!fopAcM_entrySolidHeap(this, daBoomerang_createHeap, 0xC0D0)) { return cPhs_ERROR_e; } m_lockLineActorID = fpcM_ERROR_PROCESS_ID_e; m_acch.Set(this, 0, NULL); m_papo.init(&m_acch, 600.0f, 600.0f); setKeepMatrix(); fopAcM_SetMtx(this, mp_boomModel->getBaseTRMtx()); m_procFn = &daBoomerang_c::procWait; m_colliderStts.Init(60, 0xFF, this); m_atCps.Set(l_atCpsSrc); m_atCps.SetStts(&m_colliderStts); m_atCps.SetAtHitCallback(daBoomerang_lockLineCallback); m_windAtCyl.Set(l_windAtCylSrc); m_windAtCyl.SetStts(&m_colliderStts); m_windAtCyl.SetAtHitCallback(daBoomerang_moveLineCallback); m_boomLineChk.ClrSttsRoofOff(); for (int i = 0; i < BOOMERANG_LOCK_MAX; i++) { m_lockActorIDs[i] = fpcM_ERROR_PROCESS_ID_e; } m_windBtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x48); JUT_ASSERT(2997, m_windBtk); m_windBtk->searchUpdateMaterialID(mp_shippuModel->getModelData()); mp_shippuModel->getModelData()->entryTexMtxAnimator(m_windBtk); mp_shippuModel->getModelData()->getJointNodePointer(4)->setCallBack(daBoomeang_windModelCallBack); mp_shippuModel->setUserArea((u32)this); m_waitEffBtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), 0x47); JUT_ASSERT(3011, m_waitEffBtk); m_waitEffBtk->searchUpdateMaterialID(mp_setboomEfModel->getModelData()); mp_setboomEfModel->getModelData()->entryTexMtxAnimator(m_waitEffBtk); setRoomInfo(); model = mp_boomModel; attention_info.field_0xa = 150; fopAcM_setStageLayer(this); m_setAimActorFn = &daBoomerang_c::setAimActorBase; m_cancelLockActorFn = &daBoomerang_c::cancelLockActorBase; m_lineChk.OffFullGrp(); m_lineChk.OnWaterGrp(); m_shippuSize = 1.0f; return cPhs_COMPLEATE_e; } /* 804A230C-804A2524 0042CC 0218+00 1/1 0/0 0/0 .text __ct__13daBoomerang_cFv */ daBoomerang_c::daBoomerang_c() {} /* 804A26F8-804A2718 0046B8 0020+00 1/0 0/0 0/0 .text daBoomerang_Create__FP10fopAc_ac_c */ static int daBoomerang_Create(fopAc_ac_c* i_this) { return ((daBoomerang_c*)i_this)->create(); } /* 804A2BC8-804A2BE8 -00001 0020+00 1/0 0/0 0/0 .data l_daBoomerang_Method */ static actor_method_class l_daBoomerang_Method = { (process_method_func)daBoomerang_Create, (process_method_func)daBoomerang_Delete, (process_method_func)daBoomerang_Execute, (process_method_func)NULL, (process_method_func)daBoomerang_Draw, }; /* 804A2BE8-804A2C18 -00001 0030+00 0/0 0/0 1/0 .data g_profile_BOOMERANG */ extern actor_process_profile_definition g_profile_BOOMERANG = { fpcLy_CURRENT_e, // mLayerID 6, // mListID fpcPi_CURRENT_e, // mListPrio PROC_BOOMERANG, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daBoomerang_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 686, // mPriority &l_daBoomerang_Method, // sub_method 0x00060000, // mStatus fopAc_UNK_GROUP_5_e, // mActorType fopAc_CULLBOX_0_e, // cullType }; AUDIO_INSTANCES;