// // Generated by dtk // Translation Unit: d_grass.cpp // #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_grass.h" #include "f_op/f_op_overlap_mng.h" #include "d/d_bg_s_gnd_chk.h" #include "d/d_cc_d.h" #include "d/d_com_inf_game.h" #include "d/d_kankyo.h" #include "d/d_kankyo_wether.h" #include "d/d_procname.h" #include "m_Do/m_Do_mtx.h" #include "m_Do/m_Do_lib.h" #include "m_Do/m_Do_graphic.h" #include "SSystem/SComponent/c_counter.h" #include "dolphin/gf/GF.h" #include "assets/l_K_kusa_00TEX.h" const u32 l_K_kusa_00TEX__width = 64; const u32 l_K_kusa_00TEX__height = 128; Vec l_Vmori_pos[] = { {0.0f, -0.0f, 0.0f}, {-20.232309f, 2.398434f, -12.457211f}, {-22.421972f, 96.708992f, -32.329994f}, {-0.689661f, 28.224686f, -17.54632f}, {18.556299f, 68.562164f, -34.307945f}, {18.543142f, 2.398434f, -11.276213f}, {-0.200689f, 2.398434f, 21.652548f}, {-25.964092f, 96.708992f, 30.826571f}, {-14.926651f, 28.224686f, 6.578368f}, {-35.45715f, 68.562164f, -0.097443f}, {36.34602f, 96.708992f, 0.33899f}, {13.406961f, 28.224686f, 6.463065f}, {22.201593f, 68.562164f, 30.207361f}, {-17.307545f, 92.651337f, -11.431835f}, {-0.689661f, 28.224686f, -17.546318f}, {16.828806f, 92.651367f, -10.67745f}, {-0.098656f, 85.026367f, 19.19121f}, {-14.926647f, 28.224686f, 6.578368f}, {-0.479885f, 11.192533f, -13.94727f}, {11.278254f, 12.157036f, 6.079208f}, {-12.355106f, 13.254459f, 6.175385f}, {-15.73156f, 5.409967f, -8.529058f}, {13.355361f, 5.409967f, -8.554744f}, {-0.305629f, 4.337076f, 16.596081f}, {-0.479884f, 11.192533f, -13.94727f}, {-12.355103f, 13.254459f, 6.175385f}, {11.278254f, 12.157036f, 6.079209f}, }; GXColor l_Vmori_color[] = { {0xFF, 0xFF, 0xFF, 0xFF}, {0x41, 0x41, 0x41, 0xFF}, {0xDD, 0xCF, 0x71, 0xFF}, {0, 0x2E, 0x1, 0xFF}, {0xAE, 0xA4, 0x57, 0xFF}, }; cXy l_Vmori_texCoord[] = { {0.006063f, 0.998037f}, {0.659757f, 0.0f}, {0.974817f, 1.0f}, {-0.00456f, 1.0f}, {0.980413f, 1.0f}, {0.980413f, 1.002798f}, {0.933797f, 0.82872f}, {0.938976f, 0.84993f}, {0.940903f, 0.138216f}, }; #include "assets/l_Vmori_00DL.h" #include "assets/l_Vmori_01DL.h" #include "assets/l_Vmori_matDL.h" l_Vmori_matDL(l_K_kusa_00TEX); #include "assets/l_Txa_ob_kusa_aTEX.h" const u32 l_Txa_ob_kusa_aTEX__width = 64; const u32 l_Txa_ob_kusa_aTEX__height = 64; Vec l_pos[] = { {0.0f, -0.0f, 0.0f}, {-20.232309f, 7.048814f, -12.457211f}, {-22.421972f, 96.708992f, -32.329994f}, {-0.689661f, 28.224686f, -17.54632f}, {18.556299f, 68.562164f, -34.307945f}, {18.543142f, 7.048814f, -11.276213f}, {-0.200689f, 4.806987f, 21.652548f}, {-25.964092f, 96.708992f, 30.826571f}, {-14.926651f, 28.224686f, 6.578368f}, {-35.45715f, 68.562164f, -0.097443f}, {36.34602f, 96.708992f, 0.33899f}, {13.406961f, 28.224686f, 6.463065f}, {22.201593f, 68.562164f, 30.207361f}, {-17.307545f, 92.651337f, -11.431835f}, {-0.689661f, 28.224686f, -17.546318f}, {16.828806f, 92.651367f, -10.67745f}, {-0.098656f, 85.026367f, 19.19121f}, {-14.926647f, 28.224686f, 6.578368f}, {-0.479885f, 11.192533f, -13.94727f}, {11.278254f, 12.157036f, 6.079208f}, {-12.355106f, 13.254459f, 6.175385f}, {-15.73156f, 5.409967f, -8.529058f}, {13.355361f, 5.409967f, -8.554744f}, {-0.305629f, 4.337076f, 16.596081f}, {-0.479884f, 11.192533f, -13.94727f}, {-12.355103f, 13.254459f, 6.175385f}, {11.278254f, 12.157036f, 6.079209f}, }; GXColor l_color[] = { {0x87, 0x87, 0x87, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0x6E, 0x6E, 0x6E, 0xFF}, {0x69, 0x69, 0x69, 0xFF}, {0x7B, 0x7B, 0x7B, 0xFF}, {0x76, 0x76, 0x76, 0xFF}, {0xB1, 0xB1, 0xB1, 0xFF}, {0xCC, 0xCC, 0xCC, 0xFF}, }; cXy l_texCoord[] = { {0.375f, 0.625f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {2.0f, 1.0f}, {0.0f, 1.0f}, {1.625f, 0.625f}, {0.0f, 0.5f}, {0.5f, 0.0f}, {0.0f, 0.0f}, }; #include "assets/l_Oba_kusa_aDL.h" #include "assets/l_Oba_kusa_a_cutDL.h" #include "assets/l_matDL__d_grass.h" l_matDL__d_grass(l_Txa_ob_kusa_aTEX); static bool l_CutSoundFlag; /* 80077048-8007712C .text setBatta__FP4cXyzP8_GXColor */ void setBatta(cXyz* pos, GXColor* color) { if ( !dKy_rain_check() && !dComIfGp_event_runCheck() && strncmp(dComIfGp_getStartStageName(), "kin", sizeof("kin")-1) != 0 && strcmp(dComIfGp_getStartStageName(), "Xboss1") != 0 && cM_rnd() > 0.99f ) { dComIfGp_particle_set(dPa_name::ID_AK_JN_BATTA00, pos, NULL, NULL, 0xFF, NULL, -1, color, color); } } /* 8007712C-8007734C .text WorkCo__13dGrass_data_cFP10fopAc_ac_cUli */ void dGrass_data_c::WorkCo(fopAc_ac_c* other, u32, int roomNo) { cXyz delta; delta.x = mPos.x - other->current.pos.x; delta.z = mPos.z - other->current.pos.z; f32 distSq = delta.abs2XZ(); if (distSq > 1600.0f) return; delta.y = mPos.y - other->current.pos.y; s16 rotY = cM_atan2s(delta.x, delta.z); f32 dist = std::sqrtf(distSq); dGrass_anm_c* anm; if (mAnimIdx < 8) { if (other->speedF > 16.0f) { cXyz pos(mPos.x, mPos.y + 20.0f, mPos.z); dKy_tevstr_c* tevStr = dComIfGp_roomControl_getTevStr(roomNo); dComIfGp_particle_setSimple(dComIfGp_getGrass()->getKusaRunPID(), &pos, 0xFF, tevStr->mColorK0, tevStr->mColorK0, 1); setBatta(&mPos, &tevStr->mColorK0); } s32 anmIdx = dComIfGp_getGrass()->newAnm(); if (anmIdx < 0) return; mAnimIdx = anmIdx; anm = &dComIfGp_getGrass()->getAnm(mAnimIdx); } else { anm = &dComIfGp_getGrass()->getAnm(mAnimIdx); } anm->mRotY = rotY; anm->mRotX = cM_atan2s(40.0f - dist, 40.0f); anm->mState = 2; } /* 8007734C-800775E4 .text WorkAt_NoCutAnim__13dGrass_data_cFP10fopAc_ac_cUliP15dCcMassS_HitInfP8cCcD_Obj */ void dGrass_data_c::WorkAt_NoCutAnim(fopAc_ac_c* ac, u32 p1, int roomNo, dCcMassS_HitInf* hitInf, cCcD_Obj* hitObj) { dCcD_GObjInf* hitObjInf = dCcD_GetGObjInf(hitObj); cXyz vel = *hitObjInf->GetAtVecP(); f32 mag = vel.abs2XZ(); if (cM3d_IsZero(mag)) { if (hitObj->GetShapeAttr()->GetNVec(mPos, &vel)) { vel *= 5.0f; mag = vel.abs2XZ(); } else { vel.x = mPos.x - ac->current.pos.x; vel.y = mPos.y - ac->current.pos.y; vel.z = mPos.z - ac->current.pos.z; mag = vel.abs2XZ(); } } if (!cM3d_IsZero(mag)) { s16 angle = cM_atan2s(vel.x, vel.z); dGrass_anm_c* anm; if (mAnimIdx < 8) { s32 newIdx = dComIfGp_getGrass()->newAnm(); if (newIdx < 0) return; mAnimIdx = newIdx; anm = &dComIfGp_getGrass()->getAnm(mAnimIdx); } else { anm = &dComIfGp_getGrass()->getAnm(mAnimIdx); } anm->mRotY = angle * (cM_rnd() * 0.2f + 0.9f); anm->mRotX = cM_atan2s(mag, 40.0f) * (cM_rnd() * 0.2f + 0.9f); anm->mState = 2; } } /* 800775EC-800777CC .text WorkAt__13dGrass_data_cFP10fopAc_ac_cUliP15dCcMassS_HitInf */ void dGrass_data_c::WorkAt(fopAc_ac_c* ac, u32 p1, int roomNo, dCcMassS_HitInf* inf) { cCcD_Obj* hitObj = inf->GetAtHitObj(); if (hitObj != NULL && (hitObj->ChkAtType(AT_TYPE_WIND) || hitObj->ChkAtType(AT_TYPE_NORMAL_ARROW) || hitObj->ChkAtType(AT_TYPE_FIRE_ARROW) || hitObj->ChkAtType(AT_TYPE_ICE_ARROW) || hitObj->ChkAtType(AT_TYPE_LIGHT_ARROW) || hitObj->ChkAtType(AT_TYPE_HOOKSHOT))) { WorkAt_NoCutAnim(ac, p1, roomNo, inf, hitObj); } else { if (mAnimIdx >= 8) { dComIfGp_getGrass()->deleteAnm(mAnimIdx); } mAnimIdx = -1; static csXyz ang(0, 0, 0); cXyz pos(mPos.x, mPos.y + 25.0f, mPos.z); dKy_tevstr_c* tevStr = dComIfGp_roomControl_getTevStr(roomNo); dComIfGp_particle_setSimple(dComIfGp_getGrass()->getKusaKenPID(), &pos, 0xFF, tevStr->mColorK0, tevStr->mColorK0, 1); setBatta(&mPos, &tevStr->mColorK0); if (mItemIdx >= 0) fopAcM_createItemFromTable(&mPos, mItemIdx, -1, roomNo, daItemType_0_e, NULL, daItemAct_1_e, NULL); if (!l_CutSoundFlag) { l_CutSoundFlag = true; mDoAud_seStart(JA_SE_LK_CUT_GRASS, &mPos, 0, dComIfGp_getReverb(roomNo)); } } } /* 800777CC-800779D4 .text hitCheck__13dGrass_data_cFi */ void dGrass_data_c::hitCheck(int roomNo) { dCcMassS_HitInf hitInf; fopAc_ac_c* actor; u32 ret = dComIfG_Ccsp()->ChkMass(&mPos, &actor, &hitInf); bool checkAt = (ret & 1) && (actor != NULL && fopAcM_GetName(actor) != PROC_TSUBO && fopAcM_GetName(actor) != PROC_STONE); if ((ret & 2) == 0 && !checkAt) { if (mAnimIdx >= 8) { dGrass_anm_c& anm = dComIfGp_getGrass()->getAnm(mAnimIdx); s16 rotY = anm.mRotY; s16 targetY = rotY & 0xe000; u32 origIdx = (rotY >> 13) & 0x07; dGrass_anm_c& origAnm = dComIfGp_getGrass()->getAnm(origIdx); if (anm.mState == 2) { mDoAud_seStart(JA_SE_FT_ADD_GRASS, &mPos, 0, dComIfGp_getReverb(roomNo)); anm.mState = 1; } if (!cLib_addCalcAngleS(&anm.mRotX, origAnm.mRotX, 16, 4000, 100)) { if (cLib_chaseAngleS(&anm.mRotY, targetY, 800)) { dComIfGp_getGrass()->deleteAnm(mAnimIdx); mAnimIdx = (anm.mRotY >> 13) & 7; } } } } else { if ((ret & 2)) WorkCo(actor, ret, roomNo); if (checkAt) WorkAt(actor, ret, roomNo, &hitInf); } } /* 80077A1C-80077A2C .text newData__13dGrass_room_cFP13dGrass_data_c */ void dGrass_room_c::newData(dGrass_data_c* data) { data->mpNextData = mpData; mpData = data; } /* 80077A2C-80077A90 .text deleteData__13dGrass_room_cFv */ void dGrass_room_c::deleteData() { while (mpData != NULL) { mpData->mState = 0; mDoAud_seDeleteObject(&mpData->mPos); mpData = mpData->mpNextData; } } /* 80077A90-80077CB8 .text __ct__15dGrass_packet_cFv */ dGrass_packet_c::dGrass_packet_c() { dGrass_data_c* data = getData(); for (s32 i = 0; i < ARRAY_SIZE(mGrassData); i++, data++) data->mState = 0; mNextIdx = 0; dGrass_anm_c* anm = getAnm(); for (s32 i = 0; i < ARRAY_SIZE(mGrassAnm); i++, anm++) anm->mState = 0; s16 angle = 0; for (s32 i = 0; i < 8; i++, angle += 0x2000) setAnm(i, angle); if (strncmp(dComIfGp_getStartStageName(), "kin", sizeof("kin")-1) == 0 || strcmp(dComIfGp_getStartStageName(), "Xboss1") == 0) { mpPosArr = (f32*)l_Vmori_pos; mpColorArr = l_Vmori_color; mpTexCoordArr = (f32*)l_Vmori_texCoord; mpMatDL = l_Vmori_matDL; mMatDLSize = 0xa0; mpDL = l_Vmori_00DL; mDLSize = 0xa0; mpDLCut = l_Vmori_01DL; mDLCutSize = 0x80; mCoParticle = dPa_name::ID_IT_SN_O_KINDANKUSA_RUN; mAtParticle = dPa_name::ID_IT_SN_O_KINDANKUSA_KEN; } else { mpPosArr = (f32*)l_pos; mpColorArr = l_color; mpTexCoordArr = (f32*)l_texCoord; mpMatDL = l_matDL; mMatDLSize = 0xa0; mpDL = l_Oba_kusa_aDL; mDLSize = 0xa0; mpDLCut = l_Oba_kusa_a_cutDL; mDLCutSize = 0x80; mCoParticle = dPa_name::ID_IT_JN_O_KUSA_RUN; mAtParticle = dPa_name::ID_IT_JN_O_KUSA_KEN; } } /* 80077CB8-80077CC4 .text __ct__13dGrass_room_cFv */ dGrass_room_c::dGrass_room_c() { mpData = NULL; } /* 80077CC4-80077CD0 .text __ct__12dGrass_anm_cFv */ dGrass_anm_c::dGrass_anm_c() { mState = 0; } /* 80077CD0-80077CDC .text __ct__13dGrass_data_cFv */ dGrass_data_c::dGrass_data_c() { mState = 0; } /* 80077CDC-80077E58 .text draw__15dGrass_packet_cFv */ void dGrass_packet_c::draw() { #if VERSION > VERSION_JPN j3dSys.reinitGX(); GXSetNumIndStages(0); #endif static GXVtxDescList l_vtxDescList[] = { {GX_VA_POS, GX_INDEX8}, {GX_VA_CLR0, GX_INDEX8}, {GX_VA_TEX0, GX_INDEX8}, {GX_VA_NULL, GX_NONE}, }; static GXVtxAttrFmtList l_vtxAttrFmtList[] = { {GX_VA_POS, GX_POS_XYZ, GX_F32, 0x00}, {GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0x00}, {GX_VA_TEX0, GX_TEX_ST, GX_F32, 0x00}, {GX_VA_NULL, GX_POS_XYZ, GX_S8, 0x00}, }; GFSetVtxDescv(l_vtxDescList); GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList); GFSetArray(GX_VA_POS, mpPosArr, sizeof(cXyz)); GFSetArray(GX_VA_CLR0, mpColorArr, sizeof(*mpColorArr)); GFSetArray(GX_VA_TEX0, mpTexCoordArr, sizeof(cXy)); GXCallDisplayList(mpMatDL, mMatDLSize); dGrass_room_c* room = &mGrassRoom[0]; for (s32 i = 0; i < (s32)ARRAY_SIZE(mGrassRoom); room++, i++) { dKy_tevstr_c* tevstr = dComIfGp_roomControl_getTevStr(i); GFSetTevColorS10(GX_TEVREG0, tevstr->mColorC0); GFSetTevColor(GX_TEVREG1, tevstr->mColorK0); dKy_GfFog_tevstr_set(tevstr); for (dGrass_data_c* data = room->mpData; data != NULL; data = data->mpNextData) { if (!cLib_checkBit(data->mInitFlags, 0x02)) { GXLoadPosMtxImm(data->mModelMtx, GX_PNMTX0); if (data->mAnimIdx >= 0) GXCallDisplayList(mpDL, mDLSize); else GXCallDisplayList(mpDLCut, mDLCutSize); } } } #if VERSION > VERSION_JPN J3DShape::resetVcdVatCache(); #endif } /* 80077E58-80078008 .text calc__15dGrass_packet_cFv */ void dGrass_packet_c::calc() { dGrass_anm_c* anm = getAnm(); f32 windSpeed = 0.0f; if (!mDoGph_gInf_c::isMonotone() || strcmp(dComIfGp_getStartStageName(), "Hyrule") != 0) { windSpeed = dKyw_get_wind_pow() * 1000.0f + 1000.0f; windSpeed = cLib_maxLimit(windSpeed, 2000.0f); } for (s32 i = 0; i < 8; anm++, i++) { anm->mRotX = windSpeed + windSpeed * cM_scos(windSpeed * (g_Counter.mTimer + (i*250))); } int roomNo = dComIfGp_roomControl_getStayNo(); dGrass_data_c* data = mGrassRoom[roomNo].getData(); if (data != NULL) { l_CutSoundFlag = false; dComIfG_Ccsp()->SetMassAttr(40.0f, 80.0f, 11, 0); while (true) { if (!cLib_checkBit(data->mInitFlags, 0x02) && data->mAnimIdx >= 0) data->hitCheck(roomNo); data = data->mpNextData; if (data == NULL) break; } } } /* 80078008-800782B8 .text checkGroundY__FR4cXyz */ static f32 checkGroundY(cXyz& pos) { dBgS_GndChk chk; pos.y += 50.0f; chk.SetPos(&pos); f32 y = dComIfG_Bgsp()->GroundCross(&chk); pos.y -= 50.0f; if (y <= -G_CM3D_F_INF) return pos.y; else return y; } /* 800782B8-800784E8 .text update__15dGrass_packet_cFv */ void dGrass_packet_c::update() { dGrass_anm_c* anm = getAnm(); for (int i = 0; i < (s32)ARRAY_SIZE(mGrassAnm); i++, anm++) { mDoMtx_stack_c::YrotS(anm->mRotY); mDoMtx_stack_c::XrotM(anm->mRotX); mDoMtx_stack_c::YrotM(-anm->mRotY); mDoMtx_copy(mDoMtx_stack_c::get(), anm->mAnimMtx); } dGrass_data_c* data = getData(); anm = getAnm(); s32 numPerFrame = 0; mDoLib_clipper::changeFar(mDoLib_clipper::getFar() * 1.6363636f); for (int i = 0; i < (s32)ARRAY_SIZE(mGrassData); i++) { if (data->mState != 0) { if (data->mState == 1 && numPerFrame < 30) { data->mPos.y = checkGroundY(data->mPos); data->mState = 2; numPerFrame++; } cXyz pos(data->mPos.x, data->mPos.y + 260.0f, data->mPos.z); if (mDoLib_clipper::clip(j3dSys.getViewMtx(), pos, 260.0f)) { cLib_onBit(data->mInitFlags, 0x02); } else { cLib_offBit(data->mInitFlags, 0x02); if (data->mAnimIdx >= 0) { Mtx& mtx = anm[data->mAnimIdx].mAnimMtx; mtx[0][3] = data->mPos.x; mtx[1][3] = data->mPos.y; mtx[2][3] = data->mPos.z; mDoMtx_concat(j3dSys.getViewMtx(), mtx, data->mModelMtx); } else { mDoMtx_trans(data->mModelMtx, data->mPos.x, data->mPos.y, data->mPos.z); mDoMtx_YrotM(data->mModelMtx, i * 0xDCF); mDoMtx_concat(j3dSys.getViewMtx(), data->mModelMtx, data->mModelMtx); } } } data++; } mDoLib_clipper::resetFar(); j3dSys.getDrawBuffer(0)->entryImm(this, 0); } /* 800784E8-800785C0 .text setData__15dGrass_packet_cFP13dGrass_data_ciR4cXyziSc */ void dGrass_packet_c::setData(dGrass_data_c* data, int nextIdx, cXyz& pos, int i_roomNo, s8 itemIdx) { f32 y; if (fopOvlpM_IsPeek()) { y = checkGroundY(pos); data->mState = 2; } else { y = pos.y; data->mState = 1; } cLib_setBit(data->mInitFlags, 0x02); data->mAnimIdx = (u8)cM_rndF(7.0f); data->mPos.set(pos.x, y, pos.z); data->mItemIdx = itemIdx; mGrassRoom[i_roomNo].newData(data); mNextIdx = nextIdx; } /* 800785C0-800786FC .text newData__15dGrass_packet_cFR4cXyziSc */ dGrass_data_c* dGrass_packet_c::newData(cXyz& pos, int i_roomNo, s8 itemIdx) { JUT_ASSERT(VERSION_SELECT(1530, 1530, 1536, 1536), 0 <= i_roomNo && i_roomNo < 64); dGrass_data_c* data = &mGrassData[mNextIdx]; s32 i = mNextIdx; for (; i < (s32)ARRAY_SIZE(mGrassData); data++, i++) { if (data->mState == 0) { setData(data, i, pos, i_roomNo, itemIdx); return data; } } data = getData(); for (i = 0; i < mNextIdx; data++, i++) { if (data->mState == 0) { setData(data, i, pos, i_roomNo, itemIdx); return data; } } return NULL; } /* 800786FC-80078748 .text newAnm__15dGrass_packet_cFv */ s32 dGrass_packet_c::newAnm() { dGrass_anm_c* anm = &getAnm(8); for (s32 i = 8; i < 104; anm++, i++) { if (anm->mState == 0) { anm->mState = 1; anm->mRotY = 0; anm->mRotX = 0; return i; } } return -1; } /* 80078748-80078770 .text setAnm__15dGrass_packet_cFis */ void dGrass_packet_c::setAnm(int idx, s16 angleY) { dGrass_anm_c& anm = getAnm(idx); anm.mState = 1; anm.mRotY = angleY; anm.mRotX = 0; }