/** * @file d_a_bg_obj.cpp * */ #include "d/actor/d_a_bg_obj.h" #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "stdio.h" #include "dol2asm.h" #include "dolphin/os.h" #include "d/actor/d_a_set_bgobj.h" #include "d/d_s_play.h" #include "SSystem/SComponent/c_math.h" SECTION_DATA extern void* __vt__10cCcD_GStts[3]; SECTION_DATA extern void* __vt__10dCcD_GStts[3]; SECTION_DATA extern void* __vt__8cM3dGPla[3]; SECTION_DATA extern void* __vt__8cM3dGTri[3]; SECTION_DATA extern void* __vt__8cM3dGCyl[3]; SECTION_DATA extern void* __vt__8cM3dGAab[3]; SECTION_DATA extern void* __vt__9daBgObj_c[10]; SECTION_DATA extern void* __vt__12J3DFrameCtrl[3]; // // Forward References: // extern "C" static void getBmdName__Fii(); extern "C" static void getBtkName__Fii(); extern "C" static void getBrkName__Fii(); extern "C" static void getDzbName__Fi(); extern "C" void initParticleBlock__Q29daBgObj_c11spec_data_cFPUc(); extern "C" void initSoundBlock__Q29daBgObj_c11spec_data_cFPUc(); extern "C" void initTexShareBlock__Q29daBgObj_c11spec_data_cFPUc(); extern "C" void initFarInfoBlock__Q29daBgObj_c11spec_data_cFPUc(); extern "C" void Set__Q29daBgObj_c11spec_data_cFPv(); extern "C" void release__9daBgObj_cFP4dBgW(); extern "C" void regist__9daBgObj_cFP4dBgW(); extern "C" void initAtt__9daBgObj_cFv(); extern "C" void setAttentionInfo__9daBgObj_cFP10fopAc_ac_c(); extern "C" void initBaseMtx__9daBgObj_cFv(); extern "C" void setBaseMtx__9daBgObj_cFv(); extern "C" void settingCullSizeBoxForCo__9daBgObj_cFi(); extern "C" void settingCullSizeBoxForCull__9daBgObj_cFi(); extern "C" void CreateInitType0__9daBgObj_cFv(); extern "C" void CreateInitType1__9daBgObj_cFv(); extern "C" void Create__9daBgObj_cFv(); extern "C" void CreateHeapType0__9daBgObj_cFv(); extern "C" void __dt__12J3DFrameCtrlFv(); extern "C" void CreateHeapType1__9daBgObj_cFv(); extern "C" void doShareTexture__9daBgObj_cFv(); extern "C" void CreateHeap__9daBgObj_cFv(); extern "C" void create1st__9daBgObj_cFv(); extern "C" void setColCommon__9daBgObj_cFv(); extern "C" void set_tri_0__9daBgObj_cFv(); extern "C" void set_tri_1__9daBgObj_cFv(); extern "C" void set_cyl_0__9daBgObj_cFv(); extern "C" void set_tri_2__9daBgObj_cFv(); extern "C" void set_tri_3__9daBgObj_cFv(); extern "C" void setParticle__9daBgObj_cFv(); extern "C" void setSe__9daBgObj_cFv(); extern "C" void checkDestroy__9daBgObj_cFv(); extern "C" void checkHitAt__9daBgObj_cFP8cCcD_Obj(); extern "C" void orderWait_tri__9daBgObj_cFv(); extern "C" void orderWait_cyl__9daBgObj_cFv(); extern "C" void orderWait_spec__9daBgObj_cFv(); extern "C" void actionOrderWait__9daBgObj_cFv(); extern "C" void actionOrder__9daBgObj_cFv(); extern "C" void actionEvent__9daBgObj_cFv(); extern "C" bool actionWait__9daBgObj_cFv(); extern "C" void ExecuteType0__9daBgObj_cFv(); extern "C" void ExecuteType1__9daBgObj_cFv(); extern "C" void Execute__9daBgObj_cFPPA3_A4_f(); extern "C" void Draw__9daBgObj_cFv(); extern "C" void indirectProc__9daBgObj_cFP8J3DModel(); extern "C" void Delete__9daBgObj_cFv(); extern "C" static void daBgObj_create1st__FP9daBgObj_c(); extern "C" void __dt__8cM3dGCylFv(); extern "C" void __dt__8cM3dGAabFv(); extern "C" void __dt__8dCcD_TriFv(); extern "C" void __ct__8dCcD_TriFv(); extern "C" void __dt__8cM3dGTriFv(); extern "C" void __dt__8cM3dGPlaFv(); extern "C" void __dt__10dCcD_GSttsFv(); extern "C" static void daBgObj_MoveBGDelete__FP9daBgObj_c(); extern "C" static void daBgObj_MoveBGExecute__FP9daBgObj_c(); extern "C" static void daBgObj_MoveBGDraw__FP9daBgObj_c(); extern "C" void __dt__10cCcD_GSttsFv(); extern "C" void __sinit_d_a_bg_obj_cpp(); extern "C" extern char const* const d_a_bg_obj__stringBase0; extern "C" u8 mCreateHeapFunc__9daBgObj_c[48]; extern "C" u8 mCreateInitFunc__9daBgObj_c[48]; extern "C" u8 mExecuteFunc__9daBgObj_c[48]; extern "C" u8 mTgSetFunc__9daBgObj_c[60]; // // External References: // extern "C" void mDoMtx_YrotS__FPA4_fs(); extern "C" void mDoMtx_YrotM__FPA4_fs(); extern "C" void transS__14mDoMtx_stack_cFRC4cXyz(); extern "C" void play__14mDoExt_baseAnmFv(); extern "C" void init__13mDoExt_btkAnmFP16J3DMaterialTableP19J3DAnmTextureSRTKeyiifss(); extern "C" void entry__13mDoExt_btkAnmFP16J3DMaterialTablef(); extern "C" void init__13mDoExt_brkAnmFP16J3DMaterialTableP15J3DAnmTevRegKeyiifss(); extern "C" void entry__13mDoExt_brkAnmFP16J3DMaterialTablef(); extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); extern "C" void mDoExt_setupShareTexture__FP12J3DModelDataP12J3DModelData(); extern "C" void mDoExt_setupStageTexture__FP12J3DModelData(); extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); extern "C" void fopAcM_fastCreate__FsUlPC4cXyziPC5csXyzPC4cXyzScPFPv_iPv(); extern "C" void fopAcM_setCullSizeBox__FP10fopAc_ac_cffffff(); extern "C" void fopAcM_orderOtherEventId__FP10fopAc_ac_csUcUsUsUs(); extern "C" void fpcM_Execute__FPv(); extern "C" void fpcSch_JudgeByID__FPvPv(); extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); extern "C" void dComIfGp_getReverb__Fi(); extern "C" void getArcName__12daSetBgObj_cFP10fopAc_ac_c(); extern "C" void onSwitch__10dSv_info_cFii(); extern "C" void isSwitch__10dSv_info_cCFii(); extern "C" void getRes__14dRes_control_cFPCcPCcP11dRes_info_ci(); extern "C" void getObjectResName2Index__14dRes_control_cFPCcPCc(); extern "C" void reset__14dEvt_control_cFv(); extern "C" void getEventIdx__16dEvent_manager_cFP10fopAc_ac_cUc(); extern "C" void endCheck__16dEvent_manager_cFs(); extern "C" void setModel__18dPa_modelEcallBackFP14JPABaseEmitterP12J3DModelDataRC12dKy_tevstr_cUcPvUcUc(); extern "C" void set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); extern "C" void StartShock__12dVibration_cFii4cXyz(); extern "C" void Release__4cBgSFP9dBgW_Base(); extern "C" void Regist__4dBgSFP9dBgW_BaseP10fopAc_ac_c(); extern "C" void __ct__16dBgS_MoveBgActorFv(); extern "C" bool IsDelete__16dBgS_MoveBgActorFv(); extern "C" bool ToFore__16dBgS_MoveBgActorFv(); extern "C" bool ToBack__16dBgS_MoveBgActorFv(); extern "C" void MoveBGCreate__16dBgS_MoveBgActorFPCciPFP4dBgWPvRC13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz_vUlPA3_A4_f(); extern "C" void MoveBGDelete__16dBgS_MoveBgActorFv(); extern "C" void MoveBGExecute__16dBgS_MoveBgActorFv(); extern "C" void Set__4cBgWFP6cBgD_tUlPA3_A4_f(); extern "C" void __ct__4dBgWFv(); extern "C" void Move__4dBgWFv(); extern "C" void GetAc__22dCcD_GAtTgCoCommonBaseFv(); extern "C" void __ct__10dCcD_GSttsFv(); extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); extern "C" void __ct__12dCcD_GObjInfFv(); extern "C" void __dt__12dCcD_GObjInfFv(); extern "C" void ChkTgHit__12dCcD_GObjInfFv(); extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); extern "C" void Set__8dCcD_TriFRC11dCcD_SrcTri(); extern "C" void Set__8dCcD_CylFRC11dCcD_SrcCyl(); extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); extern "C" void dKy_bg_MAxx_proc__FPv(); extern "C" void Set__4cCcSFP8cCcD_Obj(); extern "C" void __mi__4cXyzCFRC3Vec(); extern "C" void cM_atan2s__Fff(); extern "C" void ChkUsed__9cBgW_BgIdCFv(); extern "C" void SetC__8cM3dGCylFRC4cXyz(); extern "C" void SetH__8cM3dGCylFf(); extern "C" void SetR__8cM3dGCylFf(); extern "C" void setPos__8cM3dGTriFPC3VecPC3VecPC3Vec(); extern "C" void seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); extern "C" void* __nw__FUl(); extern "C" void __dl__FPv(); extern "C" void J3DGetTranslateRotateMtx__FRC16J3DTransformInfoPA4_f(); extern "C" void init__12J3DFrameCtrlFs(); extern "C" void __construct_array(); extern "C" void __ptmf_scall(); extern "C" void _savegpr_21(); extern "C" void _savegpr_23(); extern "C" void _savegpr_24(); extern "C" void _savegpr_25(); extern "C" void _savegpr_27(); extern "C" void _savegpr_28(); extern "C" void _savegpr_29(); extern "C" void _restgpr_21(); extern "C" void _restgpr_23(); extern "C" void _restgpr_24(); extern "C" void _restgpr_25(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); extern "C" extern void* __vt__8dCcD_Cyl[36]; extern "C" extern void* __vt__8dCcD_Tri[36]; extern "C" extern void* __vt__9dCcD_Stts[11]; extern "C" extern void* __vt__12cCcD_CylAttr[25]; extern "C" extern void* __vt__12cCcD_TriAttr[25]; extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; extern "C" extern void* __vt__9cCcD_Stts[8]; extern "C" u8 now__14mDoMtx_stack_c[48]; extern "C" u8 mStatus__20dStage_roomControl_c[65792]; extern "C" u8 mEcallback__18dPa_modelEcallBack[4]; extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; // // Declarations: // /* 80459658-804596C4 000078 006C+00 2/2 0/0 0/0 .text getBmdName__Fii */ static const char* getBmdName(int param_0, int param_1) { static char l_bmdName[16]; switch (param_1) { case 0: sprintf(l_bmdName, "model%d.bmd", param_0); break; default: sprintf(l_bmdName, "model%d_%d.bmd", param_0, param_1); break; } return l_bmdName; } static const char* getBtkName(int param_0, int param_1) { static char l_btkName[16]; switch (param_1) { case 0: sprintf(l_btkName, "model%d.btk", param_0); break; default: sprintf(l_btkName, "model%d_%d.btk", param_0, param_1); break; } return l_btkName; } /* 80459734-804597A4 000154 0070+00 2/2 0/0 0/0 .text getBrkName__Fii */ static const char* getBrkName(int param_0, int param_1) { static char l_brkName[16]; switch (param_1) { case 0: sprintf(l_brkName, "model%d.brk", param_0); break; default: sprintf(l_brkName, "model%d_%d.brk", param_0, param_1); break; } return l_brkName; } /* 804597A4-804597E8 0001C4 0044+00 2/2 0/0 0/0 .text getDzbName__Fi */ static const char* getDzbName(int param_0) { static char l_dzbName[16]; sprintf(l_dzbName, "model%d.dzb", param_0); return l_dzbName; } /* 804597E8-80459814 000208 002C+00 1/1 0/0 0/0 .text * initParticleBlock__Q29daBgObj_c11spec_data_cFPUc */ u8* daBgObj_c::spec_data_c::initParticleBlock(u8* i_dataPtr) { mpParticleBlock = i_dataPtr; mParticleNum = *(u32*)mpParticleBlock >> 4 & 0xFFFFF; return i_dataPtr + ((*(u32*)mpParticleBlock & 0xFFFFFF) + 4); } /* 80459814-80459840 000234 002C+00 1/1 0/0 0/0 .text * initSoundBlock__Q29daBgObj_c11spec_data_cFPUc */ u8* daBgObj_c::spec_data_c::initSoundBlock(u8* i_dataPtr) { mpSoundBlock = i_dataPtr; mSoundNum = *(u32*)mpSoundBlock >> 2 & 0x3FFFFF; return i_dataPtr + ((*(u32*)mpSoundBlock & 0xFFFFFF) + 4); } /* 80459840-804598F4 000260 00B4+00 1/1 0/0 0/0 .text * initTexShareBlock__Q29daBgObj_c11spec_data_cFPUc */ u8* daBgObj_c::spec_data_c::initTexShareBlock(u8* i_dataPtr) { char sp48[64]; char sp8[64]; mpTexShareBlock = i_dataPtr; mTexShareNum = i_dataPtr[4]; int i = 0; u8* dataPos = i_dataPtr + 8; for (; i < mTexShareNum; i++) { strcpy(sp48, (char*)dataPos); int len = strlen((char*)dataPos); dataPos += len + 1; if (*dataPos != 0) { strcpy(sp8, (char*)dataPos); dataPos += strlen((char*)dataPos) + 1; } else if (*dataPos == 0 && dataPos[1] == 1) { dataPos += 2; } } return dataPos; } /* 804598F4-80459904 000314 0010+00 1/1 0/0 0/0 .text * initFarInfoBlock__Q29daBgObj_c11spec_data_cFPUc */ u8* daBgObj_c::spec_data_c::initFarInfoBlock(u8* i_dataPtr) { mpFarInfoBlock = *(f32*)(i_dataPtr + 4); return i_dataPtr + 8; } /* ############################################################################################## */ /* 8045CA20-8045CA20 000068 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8045CA7D = "spec.dat"; #pragma pop /* 80459904-80459B64 000324 0260+00 1/1 0/0 1/1 .text Set__Q29daBgObj_c11spec_data_cFPv */ // NONMATCHING - close-ish bool daBgObj_c::spec_data_c::Set(void* i_ptr) { JUT_ASSERT(496, i_ptr != 0); u8* data = (u8*)i_ptr; mSpecType = *(u16*)i_ptr; u8 block_type; u16 temp_r3; switch (mSpecType) { case 0: { block_type = data[4]; data += 4; do { switch (block_type) { case 0: break; case 3: data = initTexShareBlock(data); break; case 4: data = initFarInfoBlock(data); break; default: // Invalid data block type OS_REPORT_ERROR("データブロックタイプが不正です<%d>\n", block_type); JUT_PANIC(527, "0"); } if (block_type == 0) { break; } block_type = *data; } while (1); break; } case 1: { temp_r3 = *(u16*)(data + 2); field_0x02 = temp_r3 & 0xF; field_0x03 = (temp_r3 >> 0xE) & 3; field_0x15 = (temp_r3 >> 0xC) & 3; field_0x14 = (temp_r3 >> 9) & 7; field_0x16 = (temp_r3 >> 8) & 1; block_type = data[4]; data += 4; do { switch (block_type) { case 0: break; case 3: data = initTexShareBlock(data); break; case 1: data = initParticleBlock(data); break; case 2: data = initSoundBlock(data); break; case 4: data = initFarInfoBlock(data); break; default: // Invalid data block type OS_REPORT_ERROR("データブロックタイプが不正です<%d>\n", block_type); JUT_PANIC(570, "0"); } if (block_type == 0) { break; } block_type = *data; } while (1); break; } case 2: { temp_r3 = *(u16*)(data + 2); field_0x02 = temp_r3 & 0xF; field_0x03 = (temp_r3 >> 0xE) & 3; field_0x15 = (temp_r3 >> 0xC) & 3; field_0x14 = (temp_r3 >> 9) & 7; field_0x16 = (temp_r3 >> 8) & 1; block_type = data[4]; data += 4; do { switch (block_type) { case 0: break; case 3: data = initTexShareBlock(data); break; case 1: data = initParticleBlock(data); break; case 2: data = initSoundBlock(data); break; case 4: data = initFarInfoBlock(data); break; default: // "Data Block type invalid<%d>\n" OSReport_Error("データブロックタイプが不正です<%d>\n", block_type); JUT_PANIC(619, "0"); break; } if (block_type == 0) { break; } block_type = *data; } while (1); break; } default: // Terrain unit MoveBG: performance undefined error<%d>!!! OS_REPORT_ERROR("地形ユニットMoveBG : 性能未定義エラー!!!<%d>\n\n", mSpecType); return 0; } return 1; } /* 80459B64-80459BB4 000584 0050+00 4/4 0/0 0/0 .text release__9daBgObj_cFP4dBgW */ void daBgObj_c::release(dBgW* param_0) { if (param_0 != NULL && param_0->ChkUsed()) { dComIfG_Bgsp().Release(param_0); } } /* 80459BB4-80459BEC 0005D4 0038+00 3/3 0/0 3/3 .text regist__9daBgObj_cFP4dBgW */ void daBgObj_c::regist(dBgW* param_0) { if (param_0 != NULL) { dComIfG_Bgsp().Regist(param_0, this); } } /* ############################################################################################## */ /* 8045C9B8-8045C9FC 000000 0044+00 6/6 0/0 0/0 .rodata l_cyl_src */ static const dCcD_SrcCyl l_cyl_src = { { {0, {{0, 0, 0}, {0xD8400422, 0x11}, 0}}, {dCcD_SE_NONE, 0, 0, 0, {8}}, {dCcD_SE_NONE, 0, 0, 0, {4}}, {0}, }, { {0.0f, 0.0f, 0.0f}, 0.0f, 0.0f, }, }; /* 80459BEC-80459D0C 00060C 0120+00 1/1 0/0 0/1 .text initAtt__9daBgObj_cFv */ void daBgObj_c::initAtt() { u32 actor_params = 0; u32 cd3_val; if (mSpecData.field_0x03 == 0) { cd3_val = 3; } else { cd3_val = mSpecData.field_0x03 - 1; } u32 ce5_val; if (mSpecData.field_0x15 == 0) { ce5_val = 3; } else { ce5_val = mSpecData.field_0x15 - 1; } u32 ce4_val; if (mSpecData.field_0x14 == 0) { ce4_val = 7; } else { ce4_val = mSpecData.field_0x14 - 1; } u32 arg0; if (daBgObj_prm::getObjArg0(this) == 0) { arg0 = 0; } else { arg0 = 1; } u32 temp = 0; u32 swbit = daBgObj_prm::getSwBit(this); u32 swbit2 = daBgObj_prm::getSwBit2(this); actor_params = (swbit2 << 24) | (swbit << 16) | (temp << 8) | (arg0 << 7) | (ce4_val << 4) | (ce5_val << 2) | (cd3_val); fopAc_ac_c* actor = fopAcM_fastCreate(PROC_Tag_Attp, actor_params, ¤t.pos, fopAcM_GetRoomNo(this), ¤t.angle, &scale, -1, NULL, NULL); if (actor != NULL) { setAttentionInfo(actor); } else { // Failed to generate focus actor OS_REPORT_ERROR("「注目点」生成失敗!!!\n"); } mAttnActorID = fopAcM_GetID(actor); const Vec* box = fopAcM_getCullSizeBoxMax(this); eyePos.y += 0.5f * box->y; } /* 80459D0C-80459D3C 00072C 0030+00 2/2 0/0 0/0 .text setAttentionInfo__9daBgObj_cFP10fopAc_ac_c */ void daBgObj_c::setAttentionInfo(fopAc_ac_c* param_0) { param_0->eyePos.y += 0.5f * fopAcM_getCullSizeBoxMax(this)->y; param_0->attention_info.position.y += fopAcM_getCullSizeBoxMax(this)->y; } /* 80459D3C-80459D94 00075C 0058+00 2/2 0/0 0/0 .text initBaseMtx__9daBgObj_cFv */ void daBgObj_c::initBaseMtx() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); MTXCopy(mDoMtx_stack_c::get(), mBgMtx); setBaseMtx(); } /* 80459D94-80459E04 0007B4 0070+00 2/2 0/0 0/0 .text setBaseMtx__9daBgObj_cFv */ void daBgObj_c::setBaseMtx() { for (int i = 0; i < 2; i++) { if (field_0x5a8[field_0xcc8][i] != NULL) { field_0x5a8[field_0xcc8][i]->setBaseTRMtx(mBgMtx); } } } /* 80459E04-80459F14 000824 0110+00 1/1 0/0 0/0 .text settingCullSizeBoxForCo__9daBgObj_cFi */ void daBgObj_c::settingCullSizeBoxForCo(int param_0) { J3DModel* cur_model = field_0x5a8[param_0][0]; if (cur_model != NULL) { Vec min_transformed; Vec max_transformed; J3DModelData* model_data = cur_model->mModelData; mDoMtx_stack_c::identity(); J3DJointTree& joint_tree = model_data->getJointTree(); J3DJoint* joint; for (u16 i = 0; i < joint_tree.getJointNum(); i++) { joint = joint_tree.getJointNodePointer(i); Mtx trans_rot_mat; J3DGetTranslateRotateMtx(joint->getTransformInfo(), trans_rot_mat); mDoMtx_stack_c::concat(trans_rot_mat); } PSMTXMultVec(mDoMtx_stack_c::get(), joint->getMin(), &min_transformed); PSMTXMultVec(mDoMtx_stack_c::get(), joint->getMax(), &max_transformed); fopAcM_setCullSizeBox(this, min_transformed.x, min_transformed.y, min_transformed.z, max_transformed.x, max_transformed.y, max_transformed.z); } else { fopAcM_setCullSizeBox(this, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); } } /* 80459F14-8045A0EC 000934 01D8+00 3/3 0/0 0/0 .text settingCullSizeBoxForCull__9daBgObj_cFi */ void daBgObj_c::settingCullSizeBoxForCull(int param_0) { cXyz max(1000000000.0f, 1000000000.0f, 1000000000.0f); cXyz min(-1000000000.0f, -1000000000.0f, -1000000000.0f); for (int i = 0; i < 2; i++) { J3DModel* cur_model = field_0x5a8[param_0][i]; if (cur_model != NULL) { J3DModelData* model_data = cur_model->mModelData; mDoMtx_stack_c::identity(); J3DJoint* joint; for (u16 j = 0; j < model_data->getJointNum(); j++) { joint = model_data->getJointNodePointer(j); Mtx trans_rot_mat; J3DGetTranslateRotateMtx(joint->getTransformInfo(), trans_rot_mat); MTXConcat(mDoMtx_stack_c::get(), trans_rot_mat, mDoMtx_stack_c::get()); } Vec min_transformed, max_transformed; PSMTXMultVec(mDoMtx_stack_c::get(), joint->getMin(), &min_transformed); PSMTXMultVec(mDoMtx_stack_c::get(), joint->getMax(), &max_transformed); if (max.x > min_transformed.x) { max.x = min_transformed.x; } if (max.y > min_transformed.y) { max.y = min_transformed.y; } if (max.z > min_transformed.z) { max.z = min_transformed.z; } if (min.x < max_transformed.x) { min.x = max_transformed.x; } if (min.y < max_transformed.y) { min.y = max_transformed.y; } if (min.z < max_transformed.z) { min.z = max_transformed.z; } } } if (1000000000.0f != max.x) { fopAcM_setCullSizeBox(this, max.x, max.y, max.z, min.x, min.y, min.z); } else { fopAcM_setCullSizeBox(this, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); } } /* 8045A0EC-8045A160 000B0C 0074+00 1/0 0/0 0/0 .text CreateInitType0__9daBgObj_cFv */ int daBgObj_c::CreateInitType0() { field_0xcc8 = 0; initBaseMtx(); fopAcM_SetMtx(this, field_0x5a8[field_0xcc8][0]->getBaseTRMtx()); settingCullSizeBoxForCull(field_0xcc8); if (0.0f != mSpecData.mpFarInfoBlock) { fopAcM_setCullSizeFar(this, mSpecData.mpFarInfoBlock); } return 1; } /* 8045A160-8045A2B8 000B80 0158+00 3/0 0/0 0/0 .text CreateInitType1__9daBgObj_cFv */ int daBgObj_c::CreateInitType1() { if (fopAcM_isSwitch(this, daBgObj_prm::getSwBit(this))) { field_0xcc8 = 1; release(mpBgW); regist(mpBgW2); mAction = 3; } else { field_0xcc8 = 0; mAction = 0; } initBaseMtx(); if (field_0xcc8 == 1 && field_0x5a8[field_0xcc8][0] == NULL) { fopAcM_SetMtx(this, field_0x5a8[0][0]->getBaseTRMtx()); } else { fopAcM_SetMtx(this, field_0x5a8[field_0xcc8][0]->getBaseTRMtx()); } settingCullSizeBoxForCo(field_0xcc8); if (0.0f != mSpecData.mpFarInfoBlock) { fopAcM_setCullSizeFar(this, mSpecData.mpFarInfoBlock); } mStts.Init(0xFF, 0xFF, this); setColCommon(); settingCullSizeBoxForCull(field_0xcc8); mEventIdx = dComIfGp_getEventManager().getEventIdx(this, daBgObj_prm::getEvId(this)); if (mpBgW2 != NULL) { mpBgW2->Move(); } initAtt(); return 1; } /* ############################################################################################## */ /* 8045CAC4-8045CAD0 000000 000C+00 2/2 0/0 0/0 .data cNullVec__6Z2Calc */ SECTION_DATA static u8 cNullVec__6Z2Calc[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; /* 8045CAD0-8045CAE4 00000C 0004+10 0/0 0/0 0/0 .data @1787 */ #pragma push #pragma force_active on SECTION_DATA static u32 lit_1787[1 + 4 /* padding */] = { 0x02000201, /* padding */ 0x40080000, 0x00000000, 0x3FE00000, 0x00000000, }; #pragma pop /* 8045CAE4-8045CB38 000020 0054+00 4/4 0/0 0/0 .data l_tri_src */ static dCcD_SrcTri l_tri_src = { { {0, {{0, 0, 0}, {0xD8400422, 0x11}, 0}}, {dCcD_SE_NONE, 0, 0, 0, {0}}, {dCcD_SE_NONE, 0, 0, 0, {4}}, {0}, }, { { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, }, }, }; /* 8045CB38-8045CB3C -00001 0004+00 1/1 0/0 0/0 .data l_specName */ SECTION_DATA static const char* const l_specName = "spec.dat"; /* 8045CB6C-8045CB9C 0000A8 0030+00 1/2 0/0 0/0 .data mCreateHeapFunc__9daBgObj_c */ SECTION_DATA createHeapFunc daBgObj_c::mCreateHeapFunc[] = { &daBgObj_c::CreateHeapType0, &daBgObj_c::CreateHeapType1, &daBgObj_c::CreateHeapType1, &daBgObj_c::CreateHeapType1, }; /* 8045CBCC-8045CBFC 000108 0030+00 1/2 0/0 0/0 .data mCreateInitFunc__9daBgObj_c */ SECTION_DATA createInitFunc daBgObj_c::mCreateInitFunc[] = { &daBgObj_c::CreateInitType0, &daBgObj_c::CreateInitType1, &daBgObj_c::CreateInitType1, &daBgObj_c::CreateInitType1, }; /* 8045A2B8-8045A2F0 000CD8 0038+00 1/0 0/0 0/0 .text Create__9daBgObj_cFv */ int daBgObj_c::Create() { return (this->*mCreateInitFunc[mSpecData.mSpecType])(); } /* 8045CC2C-8045CC5C 000168 0030+00 1/2 0/0 0/0 .data mExecuteFunc__9daBgObj_c */ SECTION_DATA executeFunc daBgObj_c::mExecuteFunc[] = { &daBgObj_c::ExecuteType0, &daBgObj_c::ExecuteType1, &daBgObj_c::ExecuteType1, &daBgObj_c::ExecuteType1, }; /* 8045CC98-8045CCD4 0001D4 003C+00 1/2 0/0 0/0 .data mTgSetFunc__9daBgObj_c */ SECTION_DATA tgSetFunc daBgObj_c::mTgSetFunc[] = { &daBgObj_c::set_tri_0, &daBgObj_c::set_tri_1, &daBgObj_c::set_cyl_0, &daBgObj_c::set_tri_2, &daBgObj_c::set_tri_3, }; /* 8045A2F0-8045A52C 000D10 023C+00 1/0 0/0 0/0 .text CreateHeapType0__9daBgObj_cFv */ int daBgObj_c::CreateHeapType0() { for (int i = 0; i < 2; i++) { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), getBmdName(0, i)); if (modelData != NULL) { field_0x5a8[0][i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11001284); if (field_0x5a8[0][i] == NULL) { return 0; } field_0x5b8[0][i] = NULL; field_0x5c8[0][i] = NULL; J3DAnmTextureSRTKey* btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes( daSetBgObj_c::getArcName(this), getBtkName(0, i)); if (btk != NULL) { field_0x5b8[0][i] = new mDoExt_btkAnm(); if (field_0x5b8[0][i] == NULL || !field_0x5b8[0][i]->init(modelData, btk, TRUE, 2, 1.0f, 0, -1)) { return 0; } field_0x5b8[0][i]->setPlaySpeed(1.0f); } J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes( daSetBgObj_c::getArcName(this), getBrkName(0, i)); if (brk != NULL) { field_0x5c8[0][i] = new mDoExt_brkAnm(); if (field_0x5c8[0][i] == NULL || !field_0x5c8[0][i]->init(modelData, brk, TRUE, 2, 1.0f, 0, -1)) { return 0; } field_0x5c8[0][i]->setPlaySpeed(1.0f); } field_0x5a8[1][i] = NULL; field_0x5b8[1][i] = NULL; field_0x5c8[1][i] = NULL; } } doShareTexture(); return 1; } /* 8045A574-8045A83C 000F94 02C8+00 3/0 0/0 0/0 .text CreateHeapType1__9daBgObj_cFv */ int daBgObj_c::CreateHeapType1() { for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { field_0x5a8[i][j] = NULL; field_0x5b8[i][j] = NULL; field_0x5c8[i][j] = NULL; J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes( daSetBgObj_c::getArcName(this), getBmdName(i, j)); if (modelData != NULL) { field_0x5a8[i][j] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11001284); if (field_0x5a8[i][j] == NULL) { return 0; } J3DAnmTextureSRTKey* btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes( daSetBgObj_c::getArcName(this), getBtkName(i, j)); if (btk != NULL) { field_0x5b8[i][j] = new mDoExt_btkAnm(); if (field_0x5b8[i][j] == NULL || !field_0x5b8[i][j]->init(modelData, btk, TRUE, 2, 1.0f, 0, -1)) { return 0; } field_0x5b8[i][j]->setPlaySpeed(1.0f); } J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes( daSetBgObj_c::getArcName(this), getBrkName(i, j)); if (brk != NULL) { field_0x5c8[i][j] = new mDoExt_brkAnm(); if (field_0x5c8[i][j] == NULL || !field_0x5c8[i][j]->init(modelData, brk, TRUE, 2, 1.0f, 0, -1)) { return 0; } field_0x5c8[i][j]->setPlaySpeed(1.0f); } } } } doShareTexture(); cBgD_t* dzb = (cBgD_t*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), getDzbName(1)); if (dzb != NULL) { mpBgW2 = new dBgW(); if (mpBgW2 == NULL || mpBgW2->Set(dzb, cBgW::MOVE_BG_e, &mBgMtx)) { mpBgW2 = NULL; return 0; } } return 1; } /* 8045A83C-8045A940 00125C 0104+00 2/2 0/0 0/0 .text doShareTexture__9daBgObj_cFv */ void daBgObj_c::doShareTexture() { char res_name[64]; char share_res_name[64]; u8* spec_res_name = mSpecData.mpTexShareBlock + 8; for (int i = 0; i < mSpecData.mTexShareNum; i++) { strcpy(res_name, (char*)spec_res_name); spec_res_name += strlen((char*)spec_res_name) + 1; J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), res_name); if (*spec_res_name != 0) { strcpy(share_res_name, (char*)spec_res_name); spec_res_name += strlen((char*)spec_res_name) + 1; J3DModelData* shareModelData = (J3DModelData*)dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), share_res_name); mDoExt_setupShareTexture(modelData, shareModelData); } else if (*spec_res_name == 0 && spec_res_name[1] == 1) { spec_res_name += 2; mDoExt_setupStageTexture(modelData); } } } /* 8045A940-8045A9E8 001360 00A8+00 1/0 0/0 0/0 .text CreateHeap__9daBgObj_cFv */ int daBgObj_c::CreateHeap() { const char* const specName = l_specName; void* spec_data_p = dComIfG_getObjectRes(daSetBgObj_c::getArcName(this), specName); if (field_0xd02 == 0) { if (!mSpecData.Set(spec_data_p)) { return 0; } field_0xd02 = 1; } return (this->*mCreateHeapFunc[mSpecData.mSpecType])(); } /* 8045A9E8-8045AAF0 001408 0108+00 1/1 0/0 0/0 .text create1st__9daBgObj_cFv */ int daBgObj_c::create1st() { if (field_0xcc9 == 0) { field_0xcca = home.angle.x; field_0xccc = home.angle.z; field_0xcc9 = 1; home.angle.z = 0; home.angle.x = 0; current.angle.z = 0; current.angle.x = 0; shape_angle.z = 0; shape_angle.x = 0; } int phase = dComIfG_resLoad(&mPhase, daSetBgObj_c::getArcName(this)); if (phase == cPhs_COMPLEATE_e) { int resnameIdx = dComIfG_getObjctResName2Index(daSetBgObj_c::getArcName(this), getDzbName(0)); phase = MoveBGCreate(daSetBgObj_c::getArcName(this), resnameIdx, NULL, 0x80022110, NULL); if (phase == cPhs_ERROR_e) { return phase; } MoveBGExecute(); } return phase; } /* 8045AAF0-8045AB80 001510 0090+00 1/1 0/0 0/0 .text setColCommon__9daBgObj_cFv */ void daBgObj_c::setColCommon() { if (field_0xcc8 == 0) { (this->*mTgSetFunc[mSpecData.field_0x02])(); } if (mSpecData.field_0x16 == 1) { u32 tg_type = mTris[0].GetTgType(); for (int i = 0; i < field_0xcc4; i++) { mTris[i].SetTgType(tg_type | 0x40); } mCyl.SetTgType(tg_type | 0x40); } } /* 8045AB80-8045ACC0 0015A0 0140+00 1/0 0/0 0/0 .text set_tri_0__9daBgObj_cFv */ void daBgObj_c::set_tri_0() { field_0xcc4 = 2; for (int i = 0; i < field_0xcc4; i++) { mTris[i].Set(l_tri_src); mTris[i].SetStts(&mStts); } cXyz cull_params[4]; cull_params[0].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMin(this)->y, 0.0f); cull_params[1].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMin(this)->y, 0.0f); cull_params[2].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMax(this)->y, 0.0f); cull_params[3].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMax(this)->y, 0.0f); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(current.angle.y); for (int i = 0; i < (s32)(sizeof(cull_params) / sizeof(Vec)); i++) { mDoMtx_stack_c::multVec(&cull_params[i], &cull_params[i]); } mTris[0].setPos(&cull_params[0], &cull_params[1], &cull_params[2]); mTris[1].setPos(&cull_params[0], &cull_params[2], &cull_params[3]); } /* 8045ACC0-8045AE00 0016E0 0140+00 1/0 0/0 0/0 .text set_tri_1__9daBgObj_cFv */ void daBgObj_c::set_tri_1() { field_0xcc4 = 2; for (int i = 0; i < field_0xcc4; i++) { mTris[i].Set(l_tri_src); mTris[i].SetStts(&mStts); } cXyz cull_bounds[4]; cull_bounds[0].set(fopAcM_getCullSizeBoxMax(this)->x, 0.0f, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[1].set(fopAcM_getCullSizeBoxMin(this)->x, 0.0f, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[2].set(fopAcM_getCullSizeBoxMin(this)->x, 0.0f, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[3].set(fopAcM_getCullSizeBoxMax(this)->x, 0.0f, fopAcM_getCullSizeBoxMax(this)->z); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(current.angle.y); for (int i = 0; i < (s32)(sizeof(cull_bounds) / sizeof(Vec)); i++) { PSMTXMultVec(mDoMtx_stack_c::get(), &cull_bounds[i], &cull_bounds[i]); } mTris[0].setPos(&cull_bounds[0], &cull_bounds[1], &cull_bounds[2]); mTris[1].setPos(&cull_bounds[0], &cull_bounds[2], &cull_bounds[3]); } /* 8045AE00-8045AE98 001820 0098+00 1/0 0/0 0/0 .text set_cyl_0__9daBgObj_cFv */ void daBgObj_c::set_cyl_0() { field_0xcc4 = 0; mCyl.Set(l_cyl_src); mCyl.SetStts(&mStts); f32 radius; if (fopAcM_getCullSizeBoxMax(this)->x > fopAcM_getCullSizeBoxMax(this)->z) { radius = fopAcM_getCullSizeBoxMax(this)->x; } else { radius = fopAcM_getCullSizeBoxMax(this)->z; } mCyl.SetC(current.pos); mCyl.SetH(fopAcM_getCullSizeBoxMax(this)->y); mCyl.SetR(radius); } /* 8045AE98-8045AFD4 0018B8 013C+00 1/0 0/0 0/0 .text set_tri_2__9daBgObj_cFv */ void daBgObj_c::set_tri_2() { field_0xcc4 = 2; for (int i = 0; i < field_0xcc4; i++) { mTris[i].Set(l_tri_src); mTris[i].SetStts(&mStts); } cXyz cull_bounds[4]; cull_bounds[0].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[1].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[2].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[3].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMax(this)->z); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(current.angle.y); for (int i = 0; i < (s32)(sizeof(cull_bounds) / sizeof(Vec)); i++) { PSMTXMultVec(mDoMtx_stack_c::get(), &cull_bounds[i], &cull_bounds[i]); } mTris[0].setPos(&cull_bounds[0], &cull_bounds[1], &cull_bounds[2]); mTris[1].setPos(&cull_bounds[0], &cull_bounds[2], &cull_bounds[3]); } /* 8045AFD4-8045B17C 0019F4 01A8+00 1/0 0/0 0/0 .text set_tri_3__9daBgObj_cFv */ void daBgObj_c::set_tri_3() { field_0xcc4 = 4; for (int i = 0; i < field_0xcc4; i++) { mTris[i].Set(l_tri_src); mTris[i].SetStts(&mStts); } cXyz cull_bounds[8]; cull_bounds[0].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[1].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[2].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[3].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMin(this)->z); cull_bounds[4].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[5].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMin(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[6].set(fopAcM_getCullSizeBoxMin(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMax(this)->z); cull_bounds[7].set(fopAcM_getCullSizeBoxMax(this)->x, fopAcM_getCullSizeBoxMax(this)->y, fopAcM_getCullSizeBoxMax(this)->z); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(current.angle.y); for (int i = 0; i < 8; i++) { Vec* src = &cull_bounds[i]; mDoMtx_stack_c::multVec(src, src); } mTris[0].setPos(&cull_bounds[0], &cull_bounds[1], &cull_bounds[2]); mTris[1].setPos(&cull_bounds[0], &cull_bounds[2], &cull_bounds[3]); mTris[2].setPos(&cull_bounds[4], &cull_bounds[5], &cull_bounds[6]); mTris[3].setPos(&cull_bounds[4], &cull_bounds[6], &cull_bounds[7]); } struct blockItem { u32 flags; u32 res_id; u8 primA; u8 primR; u8 primG; u8 primB; u8 envA; u8 envR; u8 envG; u8 envB; }; /* 8045B17C-8045B3A0 001B9C 0224+00 3/3 0/0 0/0 .text setParticle__9daBgObj_cFv */ void daBgObj_c::setParticle() { u32 partNum = mSpecData.mParticleNum; u32* partBlockItems = (u32*)mSpecData.mpParticleBlock; partBlockItems++; for (; partNum != 0; partNum--) { u32 flags = *partBlockItems++; u16 res_id = *partBlockItems; *partBlockItems++; GXColor prmColor = { 0xFF, 0xFF, 0xFF, 0xFF }; GXColor envColor = { 0xFF, 0xFF, 0xFF, 0xFF }; u8 alpha = 0xff; GXColor* prmColorPtr = NULL; GXColor* envColorPtr = NULL; u8 hasColor = 0; u8* pColors = (u8*)partBlockItems; if ((flags & 0x80000000) != 0) { prmColor.r = pColors[1]; prmColor.g = pColors[2]; prmColor.b = pColors[3]; hasColor = 1; } if ((flags & 0x40000000) != 0) { alpha = pColors[0]; } pColors += 4; if ((flags & 0x20000000) != 0) { envColor.a = pColors[0]; envColor.r = pColors[1]; envColor.g = pColors[2]; envColor.b = pColors[3]; hasColor = 1; } f32 fVar2 = 0.0f; if (hasColor) { prmColorPtr = &prmColor; envColorPtr = &envColor; fVar2 = 1.0f; } dKy_tevstr_c* status; u8 modelNumber = (flags & 0xf00000) >> 20; u8 unusedFlag = (flags & 0xf0000) >> 16; if (modelNumber != 0) { J3DModelData* bmd = NULL; int unused_sp28 = 0; cXyz scale(1.0f, 1.0f, 1.0f); switch (modelNumber) { case 1: bmd = (J3DModelData*)dComIfG_getObjectRes("Always", "BreakWoodBox.bmd"); JUT_ASSERT(1683, bmd != 0); scale.setall(KREG_F(29) + 0.9f); break; default: // Multi MoveBG: Particle model number is invalid <%d> OS_REPORT_ERROR("マルチMoveBG:パーティクルモデル番号が不正<%d>\n", modelNumber); JUT_PANIC(1689, "0"); break; } JPABaseEmitter* emitter = dComIfGp_particle_set( res_id, ¤t.pos, &mRotation, NULL, 0xff, &dPa_modelEcallBack::getEcallback(), fopAcM_GetRoomNo(this), NULL, NULL, &scale ); dPa_modelEcallBack::setModel(emitter, bmd, tevStr, 3, NULL, 0, 0); } else { fopAc_ac_c* unused_player = dComIfGp_getPlayer(0); dComIfGp_particle_setColor( res_id, ¤t.pos, dComIfGp_roomControl_getTevStr(fopAcM_GetRoomNo(this)), prmColorPtr, envColorPtr, fVar2, alpha, &mRotation, NULL, NULL, fopAcM_GetRoomNo(this), NULL ); } partBlockItems += 2; } } /* 8045B3A0-8045B44C 001DC0 00AC+00 3/3 0/0 0/0 .text setSe__9daBgObj_cFv */ void daBgObj_c::setSe() { u32 i = mSpecData.mSoundNum; u32* temp = (u32*)mSpecData.mpSoundBlock; temp++; for (; i != 0; i--) { fopAcM_seStart(this, *temp, 0); temp++; } } /* 8045B44C-8045B534 001E6C 00E8+00 1/1 0/0 0/0 .text checkDestroy__9daBgObj_cFv */ BOOL daBgObj_c::checkDestroy() { if (mSpecData.mSpecType != 1 && mSpecData.mSpecType != 2) { return false; } if (!fopAcM_isSwitch(this, daBgObj_prm::getSwBit(this)) && (daBgObj_prm::getSwBit2(this) == 0xFF || (fopAcM_isSwitch(this, daBgObj_prm::getSwBit2(this)) && daBgObj_prm::getObjArg0(this) == 0xFF) || (daBgObj_prm::getSwBit2(this) != 0xFF && !fopAcM_isSwitch(this, daBgObj_prm::getSwBit2(this)) && daBgObj_prm::getObjArg0(this) == 0))) { return true; } return false; } /* 8045B534-8045B5E0 001F54 00AC+00 2/2 0/0 0/0 .text checkHitAt__9daBgObj_cFP8cCcD_Obj */ BOOL daBgObj_c::checkHitAt(cCcD_Obj* i_hitObj) { u32 hit_flags = 0; u32 var_r8 = 0; if (i_hitObj != NULL) { switch (mSpecData.mSpecType) { case 1: var_r8 = i_hitObj->ChkAtType(AT_TYPE_IRON_BALL) && i_hitObj->GetAtAtp() == 3; hit_flags = var_r8 | i_hitObj->ChkAtType(AT_TYPE_BOMB); break; case 2: u32 tmp2 = i_hitObj->ChkAtType(AT_TYPE_IRON_BALL); var_r8 = tmp2; hit_flags = tmp2 | (i_hitObj->ChkAtType(AT_TYPE_NORMAL_SWORD) | i_hitObj->ChkAtType(AT_TYPE_BOMB) | i_hitObj->ChkAtType(AT_TYPE_CSTATUE_SWING) | i_hitObj->ChkAtType(AT_TYPE_UNK)); break; } field_0xd01 = i_hitObj->ChkAtType(AT_TYPE_BOMB) != 0; field_0xd01 |= var_r8 != 0; } return hit_flags != 0; } /* 8045B5E0-8045B7FC 002000 021C+00 1/1 0/0 0/0 .text orderWait_tri__9daBgObj_cFv */ void daBgObj_c::orderWait_tri() { for (int i = 0; i < field_0xcc4; i++) { if (mTris[i].ChkTgHit()) { if (checkHitAt(mTris[i].GetTgHitObj())) { setSe(); fopAc_ac_c* hit_ac = mTris[i].GetTgHitAc(); if (hit_ac != NULL) { cXyz sp1C(hit_ac->current.pos); sp1C = sp1C - current.pos; mDoMtx_stack_c::YrotS(-shape_angle.y); mDoMtx_stack_c::multVec(&sp1C, &sp1C); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); cXyz sp28; if (sp1C.z > 0.0f) { sp28 = cXyz(0.0, 0.0, 1.0); } else { sp28 = cXyz(0.0, 0.0, -1.0); } mDoMtx_stack_c::multVec(&sp28, &sp28); sp28 = sp28 - current.pos; mRotation.y = cM_atan2s(sp28.x, sp28.z); } setParticle(); setAction(1); break; } mTris[i].ClrTgHit(); } } for (int i = 0; i < field_0xcc4; i++) { dComIfG_Ccsp()->Set(&mTris[i]); } } /* 8045B7FC-8045B9C4 00221C 01C8+00 1/1 0/0 0/0 .text orderWait_cyl__9daBgObj_cFv */ void daBgObj_c::orderWait_cyl() { if (mCyl.ChkTgHit()) { cCcD_Obj* hitObj = mCyl.GetTgHitObj(); if (checkHitAt(hitObj)) { setSe(); fopAc_ac_c* hit_ac = mCyl.GetTgHitAc(); if (hit_ac != NULL) { cXyz sp1C(hit_ac->current.pos); sp1C = sp1C - current.pos; mDoMtx_stack_c::YrotS(-shape_angle.y); mDoMtx_stack_c::multVec(&sp1C, &sp1C); cXyz sp28; mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); if (sp1C.z > 0.0f) { sp28 = cXyz(0.0f, 0.0f, 1.0f); } else { sp28 = cXyz(0.0f, 0.0f, -1.0f); } mDoMtx_stack_c::multVec(&sp28, &sp28); sp28 = sp28 - current.pos; mRotation.y = cM_atan2s(sp28.x, sp28.z); } setParticle(); setAction(1); } mCyl.ClrTgHit(); } dComIfG_Ccsp()->Set(&mCyl); } /* 8045B9C4-8045BB38 0023E4 0174+00 1/1 0/0 0/0 .text orderWait_spec__9daBgObj_cFv */ void daBgObj_c::orderWait_spec() { setSe(); fopAc_ac_c* player_p = dComIfGp_getPlayer(0); if (player_p != NULL) { cXyz sp1C(player_p->current.pos); sp1C = sp1C - current.pos; mDoMtx_stack_c::YrotS(-shape_angle.y); mDoMtx_stack_c::multVec(&sp1C, &sp1C); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); cXyz sp28; if (sp1C.z > 0.0f) { sp28 = cXyz(0.0, 0.0, 1.0); } else { sp28 = cXyz(0.0, 0.0, -1.0); } mDoMtx_stack_c::multVec(&sp28, &sp28); sp28 = sp28 - current.pos; mRotation.y = cM_atan2s(sp28.x, sp28.z); } setParticle(); setAction(1); } /* 8045BB38-8045BBE0 002558 00A8+00 1/0 0/0 0/0 .text actionOrderWait__9daBgObj_cFv */ int daBgObj_c::actionOrderWait() { if (checkDestroy()) { switch (mSpecData.field_0x02) { case 0: case 1: case 3: case 4: orderWait_tri(); break; case 2: orderWait_cyl(); break; } } else if (fopAcM_isSwitch(this, daBgObj_prm::getSwBit(this))) { orderWait_spec(); field_0xd00 = 1; } return 1; } /* 8045BBE0-8045BD50 002600 0170+00 1/0 0/0 0/0 .text actionOrder__9daBgObj_cFv */ int daBgObj_c::actionOrder() { if (eventInfo.checkCommandDemoAccrpt()) { setAction(2); if (field_0xd01 < 5) { dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); } } else { if (daBgObj_prm::getEvId(this) != 0xFF) { fopAcM_orderOtherEventId(this, mEventIdx, daBgObj_prm::getEvId(this), 0xFFFF, 0, 1); } else { setAction(3); } if (!fopAcM_isSwitch(this, daBgObj_prm::getSwBit(this)) || field_0xd00 != 0 || field_0xcc8 == 0) { release(mpBgW); regist(mpBgW2); field_0xcc8 = 1; settingCullSizeBoxForCull(field_0xcc8); fopAc_ac_c* attn_actor_p = fopAcM_SearchByID(mAttnActorID); if (attn_actor_p != NULL) { setAttentionInfo(attn_actor_p); } fopAcM_onSwitch(this, daBgObj_prm::getSwBit(this)); field_0xd00 = 0; } } return 1; } /* 8045BD50-8045BDB0 002770 0060+00 1/0 0/0 0/0 .text actionEvent__9daBgObj_cFv */ int daBgObj_c::actionEvent() { if (dComIfGp_evmng_endCheck(mEventIdx)) { setAction(3); dComIfGp_event_reset(); } return 1; } /* 8045BDB0-8045BDB8 0027D0 0008+00 1/0 0/0 0/0 .text actionWait__9daBgObj_cFv */ int daBgObj_c::actionWait() { return 1; } /* 8045BDB8-8045BED0 0027D8 0118+00 1/0 0/0 0/0 .text ExecuteType0__9daBgObj_cFv */ int daBgObj_c::ExecuteType0() { u8 swBit = daBgObj_prm::getSwBit(this); u8 arg0 = daBgObj_prm::getObjArg0(this); if (swBit != 0xFF) { if (arg0 == 0xFF) { if (fopAcM_isSwitch(this, swBit)) { if (field_0xcc8 == 1) { regist(mpBgW); field_0xcc8 = 0; } } else if (field_0xcc8 == 0) { release(mpBgW); field_0xcc8 = 1; } } else if (arg0 == 0) { if (fopAcM_isSwitch(this, swBit)) { if (field_0xcc8 == 0) { release(mpBgW); field_0xcc8 = 1; } } else if (field_0xcc8 == 1) { regist(mpBgW); field_0xcc8 = 0; } } } return 1; } /* 8045BED0-8045BFBC 0028F0 00EC+00 3/0 0/0 0/0 .text ExecuteType1__9daBgObj_cFv */ int daBgObj_c::ExecuteType1() { static actionFunc l_func[] = {&daBgObj_c::actionOrderWait, &daBgObj_c::actionOrder, &daBgObj_c::actionEvent, &daBgObj_c::actionWait}; (this->*l_func[mAction])(); if (field_0xd01 != 0 && field_0xd01 < 100) { field_0xd01++; } return 1; } /* 8045BFBC-8045C078 0029DC 00BC+00 1/0 0/0 0/0 .text Execute__9daBgObj_cFPPA3_A4_f */ int daBgObj_c::Execute(f32 (**param_0)[3][4]) { (this->*mExecuteFunc[mSpecData.mSpecType])(); for (int i = 0; i < 2; i++) { if (field_0x5b8[field_0xcc8][i] != NULL) { field_0x5b8[field_0xcc8][i]->play(); } if (field_0x5c8[field_0xcc8][i] != NULL) { field_0x5c8[field_0xcc8][i]->play(); } } *param_0 = &mBgMtx; setBaseMtx(); return 1; } /* 8045C078-8045C25C 002A98 01E4+00 1/0 0/0 0/0 .text Draw__9daBgObj_cFv */ int daBgObj_c::Draw() { bool bvar = true; for (int i = 0; i < 2; i++) { if (field_0x5a8[field_0xcc8][i] != NULL) { bvar = false; } } if (bvar) { return 1; } g_env_light.settingTevStruct(0x20, ¤t.pos, &tevStr); for (int i = 0; i < 2; i++) { if (field_0x5a8[field_0xcc8][i] != NULL) { g_env_light.setLightTevColorType_MAJI(field_0x5a8[field_0xcc8][i], &tevStr); } } for (int i = 0; i < 2; i++) { dComIfGd_setListBG(); if (field_0x5a8[field_0xcc8][i] != NULL) { indirectProc(field_0x5a8[field_0xcc8][i]); dKy_bg_MAxx_proc(field_0x5a8[field_0xcc8][i]); if (field_0x5b8[field_0xcc8][i] != NULL) { field_0x5b8[field_0xcc8][i]->entry(field_0x5a8[field_0xcc8][i]->getModelData()); } if (field_0x5c8[field_0xcc8][i] != NULL) { field_0x5c8[field_0xcc8][i]->entry(field_0x5a8[field_0xcc8][i]->getModelData()); } mDoExt_modelUpdateDL(field_0x5a8[field_0xcc8][i]); } } dComIfGd_setList(); return 1; } /* 8045C25C-8045C2E8 002C7C 008C+00 1/1 0/0 0/0 .text indirectProc__9daBgObj_cFP8J3DModel */ void daBgObj_c::indirectProc(J3DModel* i_model) { if (i_model != NULL) { J3DModelData* modelData = i_model->getModelData(); for (u16 i = 0; i < modelData->getMaterialNum(); i++) { J3DMaterial* mat_p = modelData->getMaterialNodePointer(i); mat_p->change(); mat_p->setCullMode(0); } } } /* 8045C2E8-8045C330 002D08 0048+00 1/0 0/0 0/0 .text Delete__9daBgObj_cFv */ int daBgObj_c::Delete() { release(mpBgW2); dComIfG_resDelete(&mPhase, daSetBgObj_c::getArcName(this)); return 1; } /* 8045C330-8045C444 002D50 0114+00 1/0 0/0 0/0 .text daBgObj_create1st__FP9daBgObj_c */ static int daBgObj_create1st(daBgObj_c* i_this) { fopAcM_SetupActor(i_this, daBgObj_c); return i_this->create1st(); } /* 8045C744-8045C764 003164 0020+00 1/0 0/0 0/0 .text daBgObj_MoveBGDelete__FP9daBgObj_c */ static int daBgObj_MoveBGDelete(daBgObj_c* i_this) { return i_this->MoveBGDelete(); } /* 8045C764-8045C784 003184 0020+00 1/0 0/0 0/0 .text daBgObj_MoveBGExecute__FP9daBgObj_c */ static int daBgObj_MoveBGExecute(daBgObj_c* i_this) { return i_this->MoveBGExecute(); } /* 8045C784-8045C7B0 0031A4 002C+00 1/0 0/0 0/0 .text daBgObj_MoveBGDraw__FP9daBgObj_c */ static int daBgObj_MoveBGDraw(daBgObj_c* i_this) { return i_this->MoveBGDraw(); } /* 8045CD34-8045CD54 -00001 0020+00 1/0 0/0 0/0 .data daBgObj_METHODS */ static actor_method_class daBgObj_METHODS = { (process_method_func)daBgObj_create1st, (process_method_func)daBgObj_MoveBGDelete, (process_method_func)daBgObj_MoveBGExecute, (process_method_func)NULL, (process_method_func)daBgObj_MoveBGDraw, }; /* 8045CD54-8045CD84 -00001 0030+00 0/0 0/0 1/0 .data g_profile_BG_OBJ */ extern actor_process_profile_definition g_profile_BG_OBJ = { fpcLy_CURRENT_e, 7, fpcPi_CURRENT_e, PROC_BG_OBJ, &g_fpcLf_Method.base, sizeof(daBgObj_c), 0, 0, &g_fopAc_Method.base, 752, &daBgObj_METHODS, 0x10044100, fopAc_ACTOR_e, fopAc_CULLBOX_CUSTOM_e, };