/** * d_a_canon.cpp * Cannon Minigame */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_canon.h" #include "d/actor/d_a_npc_kg2.h" #include "d/actor/d_a_player.h" #include "d/actor/d_a_bomb.h" #include "d/actor/d_a_sea.h" #include "d/res/res_bomber.h" #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" #include "d/d_2dnumber.h" #include "d/d_kankyo.h" #include "d/d_kankyo_wether.h" #include "d/d_priority.h" #include "d/d_s_play.h" #include "d/d_com_inf_game.h" #include "f_op/f_op_actor_mng.h" #include "f_op/f_op_kankyo_mng.h" #include "f_op/f_op_camera.h" #include "f_op/f_op_camera_mng.h" #include "m_Do/m_Do_controller_pad.h" LIGHT_INFLUENCE plight; WIND_INFLUENCE pwind; const char daCanon_c::M_arcname[] = "Bomber"; static const s16 angle_x_tbl[] = {0xF000, 0xF24A, 0xF493, 0xF6DC, 0xF925, 0xFB6E, 0xFDB7, 0x0000}; static const s16 angle_y_tbl[] = {0xEE00, 0xF324, 0xF895, 0xFD6C, 0x294, 0x76B, 0xCDC, 0x1200}; static dCcD_SrcCyl canon_cyl_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ 0, /* SrcObjTg SPrm */ 0, /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ 0, /* SrcGObjCo SPrm */ 0, }, // cM3dGCylS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 75.0f, /* Height */ 50.0f, }}, }; static dCcD_SrcCyl canon_cyl2_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ AT_TYPE_BOMB, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsEnemy_e | cCcD_AtSPrm_VsOther_e, /* SrcObjTg Type */ 0, /* SrcObjTg SPrm */ 0, /* SrcObjCo SPrm */ 0, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e, /* SrcGObjCo SPrm */ 0, }, // cM3dGCylS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 300.0f, /* Height */ 500.0f, }}, }; /* 000000EC-000002C8 .text set_mtx__9daCanon_cFv */ void daCanon_c::set_mtx() { cXyz sp14(REG10_F(26) + 0.65f, REG10_F(26) + 0.65f, REG10_F(26) + 0.65f); mDoMtx_stack_c::transS(current.pos.x, current.pos.y + sp14.x * 100.0f, current.pos.z); mDoMtx_stack_c::YrotM(shape_angle.y - -0x8000); if (checkProcess(&daCanon_c::fire_proc)) { mDoMtx_stack_c::YrotM(m660 * cM_ssin(m65E)); mDoMtx_stack_c::XrotM(m660 * cM_scos(m65E)); mDoMtx_stack_c::transM(0.0f, m638, 0.0f); } mpModel1->setBaseScale(sp14); mpModel1->setBaseTRMtx(mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), m5C4); } /* 000002C8-00000340 .text bul_set_mtx__9daCanon_cFP4cXyz */ void daCanon_c::bul_set_mtx(cXyz* arg1) { cXyz scale(1.0f, 1.0f, 1.0f); mpModel2->setBaseScale(scale); mDoMtx_stack_c::transS(arg1->x, arg1->y, arg1->z); mpModel2->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000340-00000448 .text getGridPos__9daCanon_cFii */ cXyz daCanon_c::getGridPos(int arg1, int arg2) { cXyz sp08 = current.pos; f32 fVar2 = arg2 * 1500.0f + 10500.0f + REG10_F(11); sp08.x += fVar2 * cM_ssin(home.angle.y + angle_y_tbl[arg1]); sp08.z += fVar2 * cM_scos(home.angle.y + angle_y_tbl[arg1]); sp08.y = daSea_calcWave(sp08.x, sp08.z); return sp08; } /* 00000448-00000554 .text getBulEndPos__9daCanon_cFss */ cXyz daCanon_c::getBulEndPos(short arg1, short arg2) { cXyz sp08 = current.pos; f32 fVar2 = (((home.angle.x + 0x1000) - arg2) / 4096.0f); f32 fVar3 = fVar2 * 1500.0f * 7.0f + 10500.0f + REG10_F(10); sp08.x += fVar3 * cM_ssin(arg1); sp08.z += fVar3 * cM_scos(arg1); sp08.y = daSea_calcWave(sp08.x, sp08.z); return sp08; } /* 00000554-000005A0 .text createCheck__9daCanon_cFiii */ BOOL daCanon_c::createCheck(int arg1, int arg2, int arg3) { s32 idx = arg3; while (idx != 0) { if (arg1 == m5F4[--idx * 2]) { return FALSE; } } m5F4[arg3 * 2] = arg1; m5F4[arg3 * 2 + 1] = arg2; return TRUE; } /* 000005A0-00000628 .text daCanon_nodeCallBack__FP7J3DNodei */ static BOOL daCanon_nodeCallBack(J3DNode* node, int calcTiming) { if (calcTiming == 0) { J3DModel* pJVar2 = j3dSys.getModel(); J3DJoint* joint = (J3DJoint*)node; s32 uVar1 = joint->getJntNo(); daCanon_c* pvVar3 = (daCanon_c*)pJVar2->getUserArea(); mDoMtx_stack_c::copy(pJVar2->getAnmMtx(uVar1)); mDoMtx_stack_c::YrotM(pvVar3->shape_angle.x); pJVar2->setAnmMtx(uVar1, mDoMtx_stack_c::get()); } return TRUE; } /* 00000628-0000063C .text target_createCB__FPv */ BOOL target_createCB(void* v_this) { fopAcM_OffStatus((daCanon_c*)v_this, fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e); return TRUE; } /* 0000063C-0000074C .text createTargetObj__9daCanon_cFv */ void daCanon_c::createTargetObj() { int i = 5; while (i != 0) { int iVar1 = cM_rndF(8.0f); int fVar5 = cM_rndF(8.0f); if (createCheck(iVar1, fVar5, 5 - i)) { cXyz sp1C = getGridPos(iVar1, fVar5); m600[5 - i] = fopAcM_createChild(tk_Obj_Barrel2_e, fopAcM_GetID(this), 0x37f003f, &sp1C, -1, NULL, NULL, -1, target_createCB); i--; } } } /* 0000074C-000007F4 .text daCanon_BreakTarget__FPvPv */ void* daCanon_BreakTarget(void* arg1, void* arg2) { if (fopAcM_IsActor(arg1) && fopAcM_GetName(arg1) == tk_Obj_Barrel2_e) { fopAc_ac_c* ac1 = (fopAc_ac_c*)arg1; if (fopAcM_GetID(arg2) == fopAcM_GetLinkId(ac1)) { fopAcM_create(PROC_BOMB, daBomb_c::prm_make(daBomb_c::STATE_0, false, false), &ac1->current.pos, -1, NULL, NULL, -1, dEv_extra_createCB); } } return NULL; } /* 000007F4-00000820 .text breakAllObj__9daCanon_cFv */ void daCanon_c::breakAllObj() { fopAcM_Search(daCanon_BreakTarget, this); } /* 00000820-00000A8C .text makeFireEffect__9daCanon_cFR4cXyzR5csXyzi */ void daCanon_c::makeFireEffect(cXyz& arg1, csXyz& arg2, int arg3) { camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); cXyz sp2C(0.75f, 0.75f, 0.75f); csXyz sp18; sp18.x = -fopCamM_GetAngleX(camera); sp18.y = fopCamM_GetAngleY(camera) - -0x8000; sp18.z = 0; if (arg3 == 0) { dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CIRCLE, &arg1, &arg2, &sp2C); } else { dComIfGp_particle_set(dPa_name::ID_COMMON_LIGHT_FLASH, &arg1, &sp18, &sp2C); dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CLOUD, &arg1, &arg2, &sp2C); dComIfGp_particle_setBombSmoke(dPa_name::ID_COMMON_SMOKE_CIRCLE, &arg1, &arg2, &sp2C); dComIfGp_particle_setToon(dPa_name::ID_COMMON_SMOKE_DEBRIS, &arg1, &arg2, &sp2C); } plight.mPos = arg1; plight.mPos.y += 100.0f; plight.mColor.r = 200; plight.mColor.g = 200; plight.mColor.b = 0xa0; plight.mPower = 600.0f; plight.mFluctuation = 100.0f; dKy_efplight_set(&plight); pwind.mPos = arg1; pwind.mDir.x = 0.0f; pwind.mDir.y = 1.0f; pwind.mDir.z = 0.0f; pwind.mRadius = 1000.0f; pwind.field_0x20 = 0.0f; pwind.mStrength = 1.0f; dKyw_pntwind_set(&pwind); m664 = true; fopAcM_seStart(this, JA_SE_OBJ_BOMB_EXPLODE, 0); dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } /* 00000A8C-00000AB8 .text wait_proc_init__9daCanon_cFv */ void daCanon_c::wait_proc_init() { attention_info.flags = fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e; setProcess(&daCanon_c::wait_proc); } /* 00000AB8-00000D14 .text wait_proc__9daCanon_cFv */ void daCanon_c::wait_proc() { static char* cut_name_tbl[] = {"Canon_game"}; f32 unused_abs = (dComIfGp_getPlayer(0)->current.pos - current.pos).absXZ(); int iVar2 = dComIfGp_evmng_getMyStaffId("Canon"); if (iVar2 != -1) { if (!dComIfGp_evmng_getMyActIdx(iVar2, cut_name_tbl, ARRAY_SSIZE(cut_name_tbl), TRUE, 0)) { cXyz sp24 = current.pos; daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); createTargetObj(); m65A = 0; m65C = 10; sp24.x -= cM_ssin(home.angle.y) * 200.0f; sp24.z -= cM_scos(home.angle.y) * 200.0f; player->setPlayerPosAndAngle(&sp24, home.angle.y); dComIfGp_startMiniGame(3); for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { m584[i]->onBeforeTex(); } for (s32 i = 0; i < ARRAY_SSIZE(m5AC); i++) { m5AC[i]->onBeforeTex(); } game_start_proc_init(); } else { dComIfGp_evmng_cutEnd(iVar2); } } } /* 00000D14-00000DD4 .text game_start_proc_init__9daCanon_cFv */ void daCanon_c::game_start_proc_init() { m656 = 60; shape_angle.y = home.angle.y; shape_angle.x = 0x2aaa; if (daNpc_Kg2_c::l_kg2_pointer != NULL) { fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_START, 0); } setProcess(&daCanon_c::game_start_proc); } /* 00000DD4-00000E08 .text game_start_proc__9daCanon_cFv */ void daCanon_c::game_start_proc() { if (m656-- < 0) { game_proc_init(); } } /* 00000E08-00000E2C .text game_proc_init__9daCanon_cFv */ void daCanon_c::game_proc_init() { setProcess(&daCanon_c::game_proc); } /* 00000E2C-00000FA0 .text game_proc__9daCanon_cFv */ void daCanon_c::game_proc() { PadMove(); if (CPad_CHECK_TRIG_A(0)) { cXyz sp08 = current.pos; sp08.x += cM_ssin(shape_angle.x) * 200.0f * cM_ssin(shape_angle.y); sp08.y += cM_scos(shape_angle.x) * 200.0f; sp08.z += cM_ssin(shape_angle.x) * 200.0f * cM_scos(shape_angle.y); makeFireEffect(sp08, shape_angle, 0); m614 = sp08; fopAcM_seStart(this, JA_SE_LK_SHIP_CANNON_FIRE, 0); fire_proc_init(); } } /* 00000FA0-00001074 .text fire_proc_init__9daCanon_cFv */ void daCanon_c::fire_proc_init() { f32 tmp = (((home.angle.x + 0x1000) - shape_angle.x) / 4096.0f); m652 = tmp * 8.0f * 7.0f + 64.0f; m654 = m652; m65E = 0; m660 = 0x400; m638 = -20.0f; setProcess(&daCanon_c::fire_proc); m65C--; m584[m65C]->offBeforeTex(); } /* 00001074-000013AC .text fire_proc__9daCanon_cFv */ void daCanon_c::fire_proc() { cLib_addCalcAngleS2(&m660, 0, 4, 0x100); m65E += 0x3800; cLib_addCalc2(&m638, 0.0, 0.25, 5.0); m620 = getBulEndPos(shape_angle.y, shape_angle.x); if (m652-- != 0 && !mCyl2.ChkAtHit()) { f32 fVar4 = (f32)m652 / m654; f32 tmp2 = 1.0f - (fVar4 - 0.5f) * (fVar4 - 0.5f) * 4.0f; cXyz sp54 = m620 - m614; s16 idx = 0x4000 - shape_angle.x; f32 tmp1 = sp54.absXZ() * 0.25f * (cM_ssin(idx) / cM_scos(idx)); m62C = (m614 * fVar4) + (m620 * (1.0f - fVar4)); m62C.y += tmp1 * tmp2; bul_set_mtx(&m62C); mCyl2.SetC(m62C); dComIfG_Ccsp()->Set(&mCyl2); mDoAud_seStart(JA_SE_LK_SHIP_CANNON_FLY, &m62C, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } else { mDoAud_seStopActor(&m62C); fopKyM_createWpillar(&m62C, 2.0f, 1.0f, 1); pause_proc_init(); } } /* 000013AC-00001654 .text pause_proc_init__9daCanon_cFv */ void daCanon_c::pause_proc_init() { m656 = 30; if (mCyl2.ChkAtHit()) { m5AC[m65A]->offBeforeTex(); csXyz sp08(csXyz::Zero); makeFireEffect(m62C, sp08, 1); m65A++; dComIfGp_setMiniGameRupee(m65A); dComIfGp_getVibration().StartShock(7, 0x3e, cXyz(cM_ssin(shape_angle.y), 0.0f, cM_scos(shape_angle.y))); if (m65A == 5) { if (daNpc_Kg2_c::l_kg2_pointer != NULL) { fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_S, 0); } } else if (m65C == 0) { if (daNpc_Kg2_c::l_kg2_pointer != NULL) { fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_F, 0); } } else if (daNpc_Kg2_c::l_kg2_pointer != NULL) { fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_DESTROY, 0); } mCyl2.ClrAtHit(); } else if (m65C == 0 && daNpc_Kg2_c::l_kg2_pointer != NULL) { fopAcM_seStart(daNpc_Kg2_c::l_kg2_pointer, JA_SE_PLAYSPOT_END_F, 0); } setProcess(&daCanon_c::pause_proc); } /* 00001654-000016A8 .text pause_proc__9daCanon_cFv */ void daCanon_c::pause_proc() { if (m656-- < 0) { if (m65C > 0 && m65A < 5) { game_proc_init(); } else { end_proc_init(); } } } /* 000016A8-00001714 .text end_proc_init__9daCanon_cFv */ void daCanon_c::end_proc_init() { m656 = 60; setProcess(&daCanon_c::end_proc); if (m65A == 5) { dComIfGp_setMiniGameResult(1); daNpc_Kg2_c::setCanonGameResult(1); } else { dComIfGp_setMiniGameResult(2); daNpc_Kg2_c::setCanonGameResult(2); } } /* 00001714-00001814 .text end_proc__9daCanon_cFv */ void daCanon_c::end_proc() { static char* cut_name_tbl[] = {"Canon_game"}; if (m656 > 0) { if (m656 == 30) { breakAllObj(); } m656--; } else { int staffIdx = dComIfGp_evmng_getMyStaffId("Canon"); if (staffIdx == -1) { wait_proc_init(); } else if (!dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0)) { dComIfGp_evmng_cutEnd(staffIdx); if (dComIfGp_getMiniGameType() == 3) { dComIfGp_endMiniGame(3); } wait_proc_init(); } } } /* 00001814-00001A18 .text PadMove__9daCanon_cFv */ void daCanon_c::PadMove() { interface_of_controller_pad* pad = &g_mDoCPd_cpadInfo[0]; f32 stickX = pad->mMainStickPosX; f32 stickY = pad->mMainStickPosY; s16 target1 = shape_angle.y; s16 target2 = shape_angle.x; if (stickX > 0.5f) { target1 += (s16)((0.5f - stickX) * 1024.0f); s16 sVar1 = home.angle.y + -0x1200; if (shape_angle.y >= sVar1 && target1 < sVar1) { target1 = sVar1; } } else if (stickX < -0.5f) { target1 += (s16)((-0.5f - stickX) * 1024.0f); s16 sVar1 = home.angle.y + 0x1200; if (shape_angle.y <= sVar1 && target1 > sVar1) { target1 = sVar1; } } if (stickY > 0.5f) { target2 += (s16)((stickY - 0.5f) * 512.0f); s16 sVar1 = home.angle.x + 0x1000; if (shape_angle.x <= sVar1 && target2 > sVar1) { target2 = sVar1; } } else if (stickY < -0.5f) { target2 += (s16)((stickY + 0.5f) * 512.0f); s16 sVar1 = home.angle.x; if (shape_angle.x >= sVar1 && target2 < sVar1) { target2 = sVar1; } } s16 sVar2 = cLib_addCalcAngleS(&shape_angle.y, target1, 4, 0x100, 0x10); s16 sVar4 = cLib_addCalcAngleS(&shape_angle.x, target2, 4, 0x100, 0x10); if (sVar2 != 0 || sVar4 != 0) { fopAcM_seStart(this, JA_SE_LK_SHIP_CANNON_MOVE, 0); } } /* 00001A18-00001A38 .text CheckCreateHeap__FP10fopAc_ac_c */ static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { return ((daCanon_c*)a_this)->CreateHeap(); } /* 00001A38-00001E04 .text CreateHeap__9daCanon_cFv */ BOOL daCanon_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(M_arcname, BOMBER_INDEX_BDL_VCANK); JUT_ASSERT(823, modelData != NULL); mpModel1 = mDoExt_J3DModel__create(modelData, 0, 0x11020203); if (mpModel1 == NULL) { return FALSE; } J3DModelData* modelData2 = (J3DModelData*)dComIfG_getObjectRes(M_arcname, BOMBER_INDEX_BMD_AISI); JUT_ASSERT(831, modelData2 != NULL); s8 cVar10 = modelData->getJointName()->getIndex("canon"); modelData->getJointNodePointer(cVar10)->setCallBack(daCanon_nodeCallBack); mpModel1->setUserArea((u32)this); mpModel2 = mDoExt_J3DModel__create(modelData2, 0, 0x11020203); if (mpModel2 == NULL) { return FALSE; } ResTIMG* pRVar3 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BOMB_01); ResTIMG* pRVar4 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BOMB_02); for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { m584[i] = new dDlst_2DObject_c(); if (m584[i] == NULL) { return FALSE; } if (!m584[i]->init(pRVar3, pRVar4)) { return FALSE; } } ResTIMG* pRVar5 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_SHIP_NODAMAGE); ResTIMG* pRVar6 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_HUNE_DAMAGE); // Bug: m5AC only has 5 elements, copy-paste mistake. for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { m5AC[i] = new dDlst_2DObject_c(); if (m5AC[i] == NULL) { return FALSE; } if (!m5AC[i]->init(pRVar5, pRVar6)) { return FALSE; } } ResTIMG* pRVar7 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_RULE); ResTIMG* pRVar8 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BATTERY); ResTIMG* pRVar9 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_GAME_BATTERY_BASE); ResTIMG* pRVar10 = (ResTIMG*)dComIfG_getObjectRes("Bomber", BOMBER_INDEX_BTI_RUPY_NUM_DEGREE); m5C0 = new dDlst_2DBattery_c(); if (m5C0 == NULL) { return FALSE; } if (!m5C0->init(pRVar7, pRVar8, pRVar9, pRVar10)) { return FALSE; } return TRUE; } const f32 unused_4851[] = {0.8f, -0.8f, 0.1f}; /* 00001E4C-00002074 .text GameInfo2DDraw__9daCanon_cFv */ void daCanon_c::GameInfo2DDraw() { for (s32 i = 0; i < ARRAY_SSIZE(m584); i++) { m584[i]->setPosition(REG10_F(5) + 30.0f, (REG10_F(6) + 368.0f) + (REG10_F(7) + -27.0f) * i); m584[i]->setScale(unused_4851[0] + REG10_F(20)); dComIfGd_set2DOpa(m584[i]); } for (s32 i = 0; i < ARRAY_SSIZE(m5AC); i++) { m5AC[i]->setPosition(REG10_F(8) + 540.0f, (REG10_F(9) + 115.0f) + (REG10_F(10) + 47.0f) * i); m5AC[i]->setScale(REG10_F(21) + 1.0f); dComIfGd_set2DOpa(m5AC[i]); } m5C0->setRotate(cM_sht2d((s16)(0x4000 - shape_angle.x))); dComIfGd_set2DOpa(m5C0); } /* 00002074-00002094 .text daCanonCreate__FPv */ static cPhs_State daCanonCreate(void* i_this) { return ((daCanon_c*)i_this)->_create(); } /* 00002094-000023C0 .text _create__9daCanon_cFv */ cPhs_State daCanon_c::_create() { fopAcM_SetupActor(this, daCanon_c); cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); if (PVar1 == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x62E0)) { return cPhs_ERROR_e; } set_mtx(); MTXCopy(mDoMtx_stack_c::get(), m5C4); fopAcM_SetMtx(this, mpModel1->getBaseTRMtx()); MTXCopy(mpModel1->getBaseTRMtx(), m5C4); mStts1.Init(0xff, 0xff, this); mCyl1.Set(canon_cyl_src); mCyl1.SetStts(&mStts1); mCyl2.Set(canon_cyl2_src); mCyl2.SetStts(&mStts1); shape_angle.x = 0x2AAA; home.angle.x = 0x2000; wait_proc_init(); m64E = 0; m650 = 3; m63C = current.pos; m63C.x += cM_ssin(shape_angle.x) * 200.0f * cM_ssin(shape_angle.y); m63C.z += cM_ssin(shape_angle.x) * 200.0f * cM_scos(shape_angle.y); m648 = csXyz::Zero; m648.y = shape_angle.y; canon_p = this; } return PVar1; } bool daCanon_c::_delete() { dComIfG_resDeleteDemo(&mPhase, M_arcname); if (dComIfGp_getMiniGameType() == 3) { dComIfGp_endMiniGame(3); } mDoAud_seDeleteObject(&m62C); daCanon_c::canon_p = NULL; return true; } /* 00002578-00002600 .text daCanonDelete__FPv */ static BOOL daCanonDelete(void* i_this) { return ((daCanon_c*)i_this)->_delete(); } bool daCanon_c::_execute() { if (m664) { dKy_actor_addcol_set(0, 0, 0, 0.0f); dKy_efplight_cut(&plight); dKyw_pntwind_cut(&pwind); m664 = false; } set_mtx(); (this->*m290)(); cXyz sp08 = current.pos; sp08.x += REG10_F(12) * cM_ssin(shape_angle.y); sp08.z += REG10_F(12) * cM_scos(shape_angle.y); mCyl1.SetC(sp08); mCyl1.SetR(REG10_F(13) + 75.0f); dComIfG_Ccsp()->Set(&mCyl1); return false; } /* 00002600-0000274C .text daCanonExecute__FPv */ static BOOL daCanonExecute(void* i_this) { return ((daCanon_c*)i_this)->_execute(); } bool daCanon_c::_draw() { g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); g_env_light.setLightTevColorType(mpModel1, &tevStr); mDoExt_modelUpdateDL(mpModel1); if (checkProcess(&daCanon_c::fire_proc)) { g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &m62C, &tevStr); g_env_light.setLightTevColorType(mpModel2, &tevStr); mDoExt_modelUpdateDL(mpModel2); } if (dComIfGp_getMiniGameType() == 3) { GameInfo2DDraw(); } return true; } /* 0000274C-0000283C .text daCanonDraw__FPv */ static BOOL daCanonDraw(void* i_this) { return ((daCanon_c*)i_this)->_draw(); } /* 0000283C-00002844 .text daCanonIsDelete__FPv */ static BOOL daCanonIsDelete(void*) { return TRUE; } static actor_method_class daCanonMethodTable = { (process_method_func)daCanonCreate, (process_method_func)daCanonDelete, (process_method_func)daCanonExecute, (process_method_func)daCanonIsDelete, (process_method_func)daCanonDraw, }; actor_process_profile_definition g_profile_Canon = { /* LayerID */ fpcLy_CURRENT_e, /* ListID */ 0x0003, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_Canon, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daCanon_c), /* SizeOther */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Priority */ PRIO_Canon, /* Actor SubMtd */ &daCanonMethodTable, /* Status */ fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* CullType */ fopAc_CULLBOX_0_e, };