/** * @file d_a_obj_iceleaf.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_iceleaf.h" #include "SSystem/SComponent/c_math.h" #include "d/actor/d_a_player.h" #include "d/d_com_inf_game.h" #include "d/d_s_play.h" static int CheckCreateHeap(fopAc_ac_c* i_this) { return ((daObjIceLeaf_c*)i_this)->CreateHeap(); } void daObjIceLeaf_c::initBaseMtx() { mpModel->setBaseScale(scale); setBaseMtx(); } static char* l_arcName = "V_IceLeaf"; void daObjIceLeaf_c::setBaseMtx() { if (mRide) { daPy_py_c* player = dComIfGp_getLinkPlayer(); s16 foot_angle = 0; if (!player->checkBoardNoFootAngle()) { Vec left_vec; Vec right_vec; mDoMtx_multVec(player->getInvMtx(), player->getRightFootPosP(), &right_vec); mDoMtx_multVec(player->getInvMtx(), player->getLeftFootPosP(), &left_vec); foot_angle = cM_atan2s(left_vec.y - right_vec.y, right_vec.z - left_vec.z); } cXyz sp44(KREG_F(15), -9.0f, 0.0f); mDoMtx_stack_c::copy(player->getModelMtx()); mDoMtx_stack_c::ZXYrotM(foot_angle, player->getBoardCutTurnOffsetAngleY(), 0); mDoMtx_stack_c::YrotM(0x4000); mDoMtx_stack_c::transM(sp44); mDoMtx_stack_c::multVecZero(&eyePos); } else { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); } mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); if (mpBck == NULL) { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); } else { J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x106, pbck != NULL); pbck->getTransform(0, &mTransformInfo); cXyz pos; csXyz angle; mDoMtx_stack_c::transS(mTransformInfo.mTranslate.x, mTransformInfo.mTranslate.y, mTransformInfo.mTranslate.z); mDoMtx_stack_c::transM(current.pos); mDoMtx_stack_c::multVecZero(&pos); angle.x = shape_angle.x + mTransformInfo.mRotation.x; angle.y = shape_angle.y + mTransformInfo.mRotation.y; angle.z = shape_angle.z + mTransformInfo.mRotation.z; mDoMtx_stack_c::transS(pos); mDoMtx_stack_c::ZXYrotM(angle); } MTXCopy(mDoMtx_stack_c::get(), mMtx); } static dCcD_SrcCyl l_cyl_src = { { {0x0, {{0x0, 0x0, 0x1f}, {0x400000, 0x11}, 0x78}}, // mObj {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { { {0.0f, 0.0f, 0.0f}, // mCenter 50.0f, // mRadius 100.0f // mHeight } // mCyl } }; int daObjIceLeaf_c::Create() { J3DJoint* joint = mpModel->getModelData()->getJointNodePointer(0); mTransformInfo = joint->getTransformInfo(); J3DTransformInfo trans_info(mTransformInfo); trans_info.mRotation.x = 0; trans_info.mRotation.y = 0; trans_info.mRotation.z = 0; trans_info.mTranslate.x = 0.0f; trans_info.mTranslate.y = 0.0f; trans_info.mTranslate.z = 0.0f; joint->setTransformInfo(trans_info); initBaseMtx(); fopAcM_SetMtx(this, mMtx); mAcchCir.SetWall(30.0f, 30.0f); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); mStts.Init(0, 0xFF, this); mCyl.Set(l_cyl_src); mCyl.SetStts(&mStts); mCyl.SetR(100.0f); mCyl.SetH(500.0f); fopAcM_setCullSizeBox2(this, mpModel->getModelData()); mEvId = getEvId(); mEventID = dComIfGp_getEventManager().getEventIdx(this, mEvId); if (checkRideStatus() == 1) { mRide = true; mpBck = NULL; setAnmPos(); } return 1; } void daObjIceLeaf_c::setAnmPos() { J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x168, pbck != NULL); pbck->getTransform(0, &mTransformInfo); mDoMtx_stack_c::transS(mTransformInfo.mTranslate.x, mTransformInfo.mTranslate.y, mTransformInfo.mTranslate.z); mDoMtx_stack_c::transM(current.pos); mDoMtx_stack_c::multVecZero(¤t.pos); shape_angle.x += mTransformInfo.mRotation.x; shape_angle.y += mTransformInfo.mRotation.y; shape_angle.z += mTransformInfo.mRotation.z; } int daObjIceLeaf_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 7); JUT_ASSERT(0x189, modelData != NULL); mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11000084); if (mpModel == NULL) { return 0; } J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x196, pbck != NULL); mpBck = JKR_NEW mDoExt_bckAnm(); if (mpBck == NULL || !mpBck->init(pbck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false)) { return 0; } mpBck->setPlaySpeed(0.0f); mpBck->setFrame(0.0f); return 1; } int daObjIceLeaf_c::create() { fopAcM_ct(this, daObjIceLeaf_c); int phase_state = dComIfG_resLoad(&mPhase, l_arcName); if (phase_state == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0xDA0)) { return cPhs_ERROR_e; } if (!Create()) { return cPhs_ERROR_e; } } return phase_state; } int daObjIceLeaf_c::execute() { daPy_py_c* player = daPy_getPlayerActorClass(); event_proc_call(); action(); if (mDeleteActor) { if (field_0x92b == 0) { dComIfGp_particle_set(0x8C12, &eyePos, NULL, NULL); dComIfGp_particle_set(0x8C13, &eyePos, NULL, NULL); field_0x92b = 1; player->seStartOnlyReverb(Z2SE_AL_SNOBO_ICEBREAK); } fopAcM_delete(this); // "Ice Leaf: Deleted\n" OS_REPORT("氷の葉:削除されました\n"); } if (mBreakEffect) { dComIfGp_particle_set(0x8C12, &eyePos, NULL, NULL); dComIfGp_particle_set(0x8C13, &eyePos, NULL, NULL); mBreakEffect = false; player->seStartOnlyReverb(Z2SE_AL_SNOBO_ICEBREAK); } setBaseMtx(); return 1; } void daObjIceLeaf_c::action() { typedef void (daObjIceLeaf_c::*mode_func)(); static mode_func l_func[] = { &daObjIceLeaf_c::modeDropWait, &daObjIceLeaf_c::modeDrop, &daObjIceLeaf_c::modePlayerWait, &daObjIceLeaf_c::modeRide, }; (this->*l_func[mMode])(); } void daObjIceLeaf_c::modeDropWait() { daPy_py_c* player = daPy_getPlayerActorClass(); /* dSv_event_flag_c::F_0308 - Snowpeak mountain - Watched first meeting event with Yeto at top of mountain (human) */ if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[0x134])) { bool start_drop = false; if (player->current.pos.abs(current.pos) < 250.0f && (player->checkFrontRollCrash() || player->checkWolfAttackReverse())) { start_drop = true; } if (mCyl.ChkTgHit()) { cCcD_Obj* hit_obj = mCyl.GetTgHitObj(); if (hit_obj != NULL && hit_obj->ChkAtType(AT_TYPE_IRON_BALL)) { start_drop = true; } } if (start_drop) { setAction(ACT_ORDER_EVENT_e); } } if (mRide) { mpBck = NULL; setAnmPos(); } mCyl.SetC(current.pos); dComIfG_Ccsp()->Set(&mCyl); } void daObjIceLeaf_c::modeDrop() { if (mpBck->play()) { J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x2C8, pbck != NULL); pbck->getTransform(0, &mTransformInfo); mDoMtx_stack_c::transS(mTransformInfo.mTranslate.x, mTransformInfo.mTranslate.y, mTransformInfo.mTranslate.z); mDoMtx_stack_c::transM(current.pos); mDoMtx_stack_c::multVecZero(¤t.pos); shape_angle.x += mTransformInfo.mRotation.x; shape_angle.y += mTransformInfo.mRotation.y; shape_angle.z += mTransformInfo.mRotation.z; attention_info.position = current.pos; eyePos = current.pos; mpBck = NULL; setMode(MODE_PLAYER_WAIT_e); } if (mpBck != NULL && mpBck->getFrame() == 12) { cXyz sp24(KREG_F(10) + 1.0f, KREG_F(10) + 1.0f, KREG_F(10) + 1.0f); J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x2EB, pbck != NULL); pbck->getTransform(0, &mTransformInfo); cXyz sp30; mDoMtx_stack_c::transS(mTransformInfo.mTranslate.x, mTransformInfo.mTranslate.y, mTransformInfo.mTranslate.z); mDoMtx_stack_c::transM(current.pos); mDoMtx_stack_c::multVecZero(&sp30); sp30.y += 5.0f; if (fopAcM_gc_c::gndCheck(&sp30)) { dComIfGp_particle_setPolyColor(0x881F, *fopAcM_gc_c::getGroundCheck(), &sp30, &tevStr, ¤t.angle, &sp24, 0, NULL, -1, NULL); dComIfGp_particle_setPolyColor(0x8820, *fopAcM_gc_c::getGroundCheck(), &sp30, &tevStr, ¤t.angle, &sp24, 0, NULL, -1, NULL); mFallSEPos = sp30; mDoAud_seStart(Z2SE_OBJ_LEAF_FALL_DOWN, &mFallSEPos, 0, 0); // "Ice Leaf: Falling SE\n" OS_REPORT("氷の葉:落下SE\n"); } } } void daObjIceLeaf_c::modePlayerWait() { attention_info.flags = fopAc_AttnFlag_ETC_e; } void daObjIceLeaf_c::modeRide() {} void daObjIceLeaf_c::event_proc_call() { typedef void (daObjIceLeaf_c::*action_func)(); static action_func l_func[] = { &daObjIceLeaf_c::actionWait, &daObjIceLeaf_c::actionOrderEvent, &daObjIceLeaf_c::actionEvent, &daObjIceLeaf_c::actionDead, }; (this->*l_func[mAction])(); } void daObjIceLeaf_c::actionWait() {} void daObjIceLeaf_c::actionOrderEvent() { if (eventInfo.checkCommandDemoAccrpt()) { setAction(ACT_EVENT_e); mpBck->setPlaySpeed(1.0f); setMode(MODE_DROP_e); setFallSE(); fopAcM_onSwitch(this, getSwbit()); } else { fopAcM_orderOtherEventId(this, mEventID, mEvId, 0xFFFF, 0, 1); eventInfo.onCondition(2); } } void daObjIceLeaf_c::actionEvent() { if (dComIfGp_evmng_endCheck(mEventID)) { setAction(ACT_DEAD_e); dComIfGp_event_reset(); } } void daObjIceLeaf_c::actionDead() {} void daObjIceLeaf_c::setFallSE() { J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, 4); JUT_ASSERT(0x36C, pbck != NULL); pbck->getTransform(0, &mTransformInfo); mDoMtx_stack_c::transS(mTransformInfo.mTranslate.x, mTransformInfo.mTranslate.y, mTransformInfo.mTranslate.z); mDoMtx_stack_c::transM(current.pos); mDoMtx_stack_c::multVecZero(&mFallStartSEPos); mDoAud_seStart(Z2SE_OBJ_LEAF_BEGIN_FALL, &mFallStartSEPos, 0, 0); // "Ice Leaf: Fall start SE(%.2f,%.2f,%.2f)\n" OS_REPORT("氷の葉:落下開始SE(%.2f,%.2f,%.2f)\n", mFallStartSEPos.x, mFallStartSEPos.y, mFallStartSEPos.z); } int daObjIceLeaf_c::draw() { g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); if (mpBck != NULL) { mpBck->entry(mpModel->getModelData()); } mDoExt_modelUpdateDL(mpModel); mDoExt_bckAnmRemove(mpModel->getModelData()); return 1; } int daObjIceLeaf_c::_delete() { dComIfG_resDelete(&mPhase, l_arcName); return 1; } static int daObjIceLeaf_Draw(daObjIceLeaf_c* i_this) { return i_this->draw(); } static int daObjIceLeaf_Execute(daObjIceLeaf_c* i_this) { return i_this->execute(); } static int daObjIceLeaf_Delete(daObjIceLeaf_c* i_this) { return i_this->_delete(); } static int daObjIceLeaf_Create(daObjIceLeaf_c* i_this) { return i_this->create(); } static actor_method_class l_daObjIceLeaf_Method = { (process_method_func)daObjIceLeaf_Create, (process_method_func)daObjIceLeaf_Delete, (process_method_func)daObjIceLeaf_Execute, (process_method_func)NULL, (process_method_func)daObjIceLeaf_Draw, }; actor_process_profile_definition g_profile_Obj_IceLeaf = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 7, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_Obj_IceLeaf_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daObjIceLeaf_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_Obj_IceLeaf_e, /* Actor SubMtd */ &l_daObjIceLeaf_Method, /* Status */ fopAcStts_UNK_0x40000_e | fopAcStts_NOPAUSE_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };