/** * d_a_npc_mk.cpp * NPC - Ivan */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_mk.h" #include "m_Do/m_Do_ext.h" #include "res/Object/Mk.h" #include "d/actor/d_a_player_main.h" #include "m_Do/m_Do_lib.h" #include "d/actor/d_a_npc_uk.h" #include "d/d_snap.h" static fpc_ProcID l_msgId; static msg_class* l_msg; static const int l_bck_ix_tbl[] = { dRes_INDEX_MK_BCK_MK_WAIT_e, dRes_INDEX_MK_BCK_MK_TALK01_e, dRes_INDEX_MK_BCK_MK_TALK02_e, dRes_INDEX_MK_BCK_MK_TIRABARE_e, dRes_INDEX_MK_BCK_MK_WALK_e, dRes_INDEX_MK_BCK_MK_RUN_e, dRes_INDEX_MK_BCK_MK_KEIKAI_e, dRes_INDEX_MK_BCK_MK_JIDA01_e, dRes_INDEX_MK_BCK_MK_JIDA02_e, dRes_INDEX_MK_BCK_MK_DA_e, dRes_INDEX_MK_BCK_MK_JUMP_e, dRes_INDEX_MK_BCK_MK_LAND_e, }; static const int l_btp_ix_tbl[] = { dRes_INDEX_MK_BTP_MK_MABA_e }; /* 00000078-00000230 .text nodeCallBack_Mk__FP7J3DNodei */ static BOOL nodeCallBack_Mk(J3DNode* node, int calcTiming) { cXyz temp; cXyz temp2; if (calcTiming == J3DNodeCBCalcTiming_In) { J3DModel* model = j3dSys.getModel(); daNpc_Mk_c* i_this = (daNpc_Mk_c*)model->getUserArea(); J3DJoint* joint = (J3DJoint*)node; int jntNo = joint->getJntNo(); if(i_this != NULL) { MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); if (jntNo == i_this->getHeadJntNum()) { temp.setall(0.0f); mDoMtx_XrotM(*calc_mtx, (s16)i_this->getHead_y()); mDoMtx_ZrotM(*calc_mtx, (s16)i_this->getHead_x()); MtxPosition(&temp, &temp2); i_this->setAttentionBasePos(temp2); temp.set(20.0f, -20.0f, 0.0f); MtxPosition(&temp, &temp2); i_this->setEyePos(temp2); i_this->incAttnSetCount(); } else if (jntNo == i_this->getBackboneJntNum()) { mDoMtx_XrotM(*calc_mtx, i_this->getBackbone_y()); mDoMtx_ZrotM(*calc_mtx, i_this->getBackbone_x()); } cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); model->setAnmMtx(jntNo, *calc_mtx); } } return TRUE; } /* 00000230-00000344 .text initTexPatternAnm__10daNpc_Mk_cFb */ BOOL daNpc_Mk_c::initTexPatternAnm(bool i_modify) { J3DModelData* modelData = mpMorf->getModel()->getModelData(); m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Mk", l_btp_ix_tbl[mTexPatternIdx]); JUT_ASSERT(366, m_head_tex_pattern != NULL); if (!mBtpAnm.init(modelData, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, i_modify, FALSE)) { return FALSE; } mBlinkFrame = 0; mBlinkTimer = 0; return TRUE; } /* 00000344-000003D0 .text playTexPatternAnm__10daNpc_Mk_cFv */ void daNpc_Mk_c::playTexPatternAnm() { if (cLib_calcTimer(&mBlinkTimer) == 0) { if (mBlinkFrame >= m_head_tex_pattern->getFrameMax()) { mBlinkFrame -= m_head_tex_pattern->getFrameMax(); mBlinkTimer = cM_rndF(100.0f) + 30.0f; } else { mBlinkFrame++; } } } /* 000003D0-00000470 .text setAnm__10daNpc_Mk_cFSc */ void daNpc_Mk_c::setAnm(s8 newAnmIdx) { f32 morf = 8.0f; if (newAnmIdx == 5 && mAnmIdx == 11) { morf = 0.0f; } if (newAnmIdx != mAnmIdx && newAnmIdx != -1) { mAnmIdx = newAnmIdx; mAnmTimer = 0.0f; dNpc_setAnm(mpMorf, J3DFrameCtrl::EMode_NULL, morf, 1.0f, l_bck_ix_tbl[mAnmIdx], -1, "Mk"); } } /* 00000470-000004E4 .text setAnmStatus__10daNpc_Mk_cFv */ void daNpc_Mk_c::setAnmStatus() { switch(mState) { case STATE_DEMO01: setAnm(2); break; case STATE_CLIMB01: case STATE_RUNAWAY: setAnm(6); break; case STATE_JITANDA02: break; default: setAnm(0); break; } } /* 000004E4-00000598 .text chkAttentionLocal__10daNpc_Mk_cFv */ bool daNpc_Mk_c::chkAttentionLocal() { dAttention_c& attention = dComIfGp_getAttention(); if (chkFlag(0x1)) { return true; } if (mAttentionTimer != 0) { mAttentionTimer--; return true; } if(attention.LockonTruth()) { return this == attention.LockonTarget(0); } return this == attention.ActionTarget(0); } /* 00000598-00000634 .text chkAttention__10daNpc_Mk_cFv */ void daNpc_Mk_c::chkAttention() { bool temp = chkFlag(0x4); if(chkAttentionLocal()) { setFlag(0x4); } else { clrFlag(0x4); } if(temp != chkFlag(0x4) && temp == true) { m_jnt.setTrn(); } } /* 00000634-00000678 .text eventOrder__10daNpc_Mk_cFv */ void daNpc_Mk_c::eventOrder() { if (ChkOrder(3)) { eventInfo.onCondition(dEvtCnd_CANTALK_e); if(ChkOrder(2)){ fopAcM_orderSpeakEvent(this); } } } /* 00000678-000006D4 .text checkOrder__10daNpc_Mk_cFv */ void daNpc_Mk_c::checkOrder() { if (eventInfo.mCommand == dEvtCmd_INTALK_e && ChkOrder(3)) { setFlag(1); talkInit(); } ClrOrder(0xFF); } /* 000006D4-00000750 .text next_msgStatus__10daNpc_Mk_cFPUl */ u16 daNpc_Mk_c::next_msgStatus(u32* pMsgNo) { u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; switch (*pMsgNo) { case 0x26BD: case 0x26C5: case 0x26C6: case 0x26C7: case 0x26C8: case 0x26C9: case 0x26CB: case 0x26CD: case 0x26D0: case 0x26D1: case 0x26D3: case 0x26D4: case 0x26D8: *pMsgNo += 1; break; case 0x26CA: if (mMsgSelectNum == 0) { setFlag(0x8); msgStatus = fopMsgStts_MSG_ENDS_e; } else { field_0x6A4 = 1; *pMsgNo = 0x26CB; } break; default: msgStatus = fopMsgStts_MSG_ENDS_e; break; } return msgStatus; } /* 00000750-000008A8 .text getMsg__10daNpc_Mk_cFv */ u32 daNpc_Mk_c::getMsg() { u32 msgNo = 0; clrFlag(0x8); switch(mType) { case TYPE_NORMAL: if(mState == STATE_DEMO01 || mState == STATE_DEMO02 || mState == STATE_DEMO03) { msgNo = mMsgNo; } else if(dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0040)) { msgNo = 0x26B5; } else if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1340)) { msgNo = 0x26AD; } else if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1380)) { msgNo = 0x26C5; } else if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1210)) { msgNo = 0x26B9; } else { msgNo = 0x26BD; dComIfGs_onEventBit(dSv_event_flag_c::UNK_1210); } break; case TYPE_MINIGAME: if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0020)) { msgNo = 0x26B5; } else { msgNo = 0x26B1; dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0020); } break; } return msgNo; } /* 000008A8-00000940 .text setCollision__10daNpc_Mk_cFv */ void daNpc_Mk_c::setCollision() { cXyz temp(0.0f, 0.0f, 0.0f); // unused cXyz centerPos(current.pos); f32 cylCollisionRadius = 40.0f; f32 height = 80.0f; mCyl.SetC(centerPos); mCyl.SetR(cylCollisionRadius); mCyl.SetH(height); dComIfG_Ccsp()->Set(&mCyl); } /* 00000940-00000A48 .text msgAnm__10daNpc_Mk_cFUc */ void daNpc_Mk_c::msgAnm(u8 param_1) { if(mMsgAnmIdx != param_1) { mMsgAnmIdx = param_1; switch(mMsgAnmIdx) { case 0: setAnm(0); break; case 1: setAnm(1); break; case 2: setAnm(2); break; case 3: mDoAud_seStart(JA_SE_START_WHISTLE); setAnm(3); break; case 4: setAnm(7); break; case 5: setAnm(4); break; case 6: setAnm(5); break; case 7: setAnm(6); break; case 8: setAnm(9); break; } } } /* 00000A48-00000A5C .text talkInit__10daNpc_Mk_cFv */ void daNpc_Mk_c::talkInit() { mTalkState = TALK_INIT; mMsgAnmIdx = 0xFF; } /* 00000A5C-00000A80 .text msgPushButton__10daNpc_Mk_cFv */ void daNpc_Mk_c::msgPushButton() { if ((s32)mCurrMsgNo != 0x26CA) { return; } mMsgSelectNum = l_msg->mSelectNum; } /* 00000A80-00000C04 .text talk__10daNpc_Mk_cFv */ u16 daNpc_Mk_c::talk() { u16 msgStatus = 0xFF; if (mTalkState == TALK_INIT) { l_msgId = fpcM_ERROR_PROCESS_ID_e; mCurrMsgNo = getMsg(); mTalkState = TALK_MSG_CREATE; } else if (mTalkState == TALK_FINISHED) { msgStatus = 0xFE; } else if (l_msgId == fpcM_ERROR_PROCESS_ID_e) { l_msgId = fopMsgM_messageSet(mCurrMsgNo, this); } else { if(!chkFlag(0x100)) { msgAnm(dComIfGp_getMesgAnimeAttrInfo()); } switch(mTalkState) { case 1: l_msg = fopMsgM_SearchByID(l_msgId); if (l_msg != NULL) { mTalkState = TALK_ACTIVE; } break; case 2: msgStatus = l_msg->mStatus; if (msgStatus == fopMsgStts_MSG_DISPLAYED_e) { msgPushButton(); l_msg->mStatus = next_msgStatus(&mCurrMsgNo); if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { fopMsgM_messageSet(mCurrMsgNo); } } else if (msgStatus == fopMsgStts_BOX_CLOSED_e) { l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; mTalkState = TALK_FINISHED; } break; } } return msgStatus; } /* 00000C04-00000C70 .text checkDemoStart__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::checkDemoStart() { mStaffIdx = dComIfGp_evmng_getMyStaffId(mpName); if(mStaffIdx != -1) { mEventAction = getNowEventAction(); return TRUE; } return FALSE; } /* 00000C70-00000CB8 .text getNowEventAction__10daNpc_Mk_cFv */ s32 daNpc_Mk_c::getNowEventAction() { static char* action_table[] = { "WAIT", "TALK", "HOME", "RUN", "RUN3", "SPEAK", "PARTNER", "JUMP", "JUMP2", "JITABATA", "LOOK_P", "HIND", "DISP", "MAKEITEM", "GAMESET", "WARP", "TURN" }; return dComIfGp_evmng_getMyActIdx(mStaffIdx, action_table, ARRAY_SIZE(action_table), FALSE, 0); } /* 00000CB8-0000127C .text init__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::init() { attention_info.flags = fopAc_Attn_ACTION_SPEAK_e|fopAc_Attn_LOCKON_TALK_e; attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xA9; attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xA9; gravity = -30.0f; J3DModel* pModel = mpMorf->getModel(); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); pModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpMorf->calc(); mStts.Init(0xA0, 0xFF, this); mCyl.Set(dNpc_cyl_src); mCyl.SetStts(&mStts); fopAcM_SetStatusMap(this, 0x27); fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); switch(mType) { case TYPE_NORMAL: if(dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0040) && !dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0020)) { if(setAction(&daNpc_Mk_c::hind_action, NULL)) { setFlag(0x10); fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); } } else { if(setAction(&daNpc_Mk_c::visit_action, NULL)) { if(dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0580)) { fopAcM_OnStatus(this, fopAcStts_UNK4000_e); } } } field_0x688.setInf(getPath(), fopAcM_GetRoomNo(this), true); if (field_0x688.getPath() == NULL) { return FALSE; } field_0x690.setInfDrct(field_0x688.nextPath(fopAcM_GetRoomNo(this))); if(field_0x690.getPath() == NULL) { return FALSE; } field_0x698.setInfDrct(field_0x690.nextPath(fopAcM_GetRoomNo(this))); if(field_0x698.getPath() == NULL) { return FALSE; } break; case TYPE_MINIGAME: mStts.SetWeight(0xFE); field_0x688.setInf(getPath(), fopAcM_GetRoomNo(this), true); if (field_0x688.getPath() == NULL) { return FALSE; } if(dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0040) && !dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0020)) { setAction(&daNpc_Mk_c::seek_action, NULL); } else { if(setAction(&daNpc_Mk_c::hind_action, NULL)) { setFlag(0x10); } fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); } fopAcM_OnStatus(this, fopAcStts_UNK40_e); break; default: setAction(&daNpc_Mk_c::wait_action, NULL); break; } mAttnBasePos.set(current.pos); mEyePos.set(current.pos); if (mDoLib_clipper::getFar() > 1.0f) { fopAcM_setCullSizeFar(this, 5000.0f / mDoLib_clipper::getFar()); } mMtrlSndId = 0; mReverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this)); return TRUE; } /* 0000127C-00001288 .text getType__10daNpc_Mk_cFv */ u8 daNpc_Mk_c::getType() { return fopAcM_GetParam(this) & 0xFF; } /* 00001288-00001294 .text getPath__10daNpc_Mk_cFv */ u8 daNpc_Mk_c::getPath() { return fopAcM_GetParam(this) >> 8 & 0xFF; } /* 00001294-00001574 .text nextVisitMode__10daNpc_Mk_cFv */ u8 daNpc_Mk_c::nextVisitMode() { cXyz dist; daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); switch(mVisitMode) { case VISIT_START: return VISIT_WALK_PATH; case VISIT_TALK: // idk if correct if (field_0x6A4 != 0) { return VISIT_WALK_PATH_FAST; } return VISIT_RUN_LINK; case VISIT_WALK_PATH: dist = pLink->current.pos - current.pos; if(dist.abs2XZ() < 160000.0f && field_0x698.chkInside(&pLink->current.pos)) { return VISIT_NOTICE_LINK; } return VISIT_WALK_PATH; case VISIT_RUN_LINK: if (!field_0x690.chkInside(&pLink->current.pos)) { return VISIT_LEFT_PATH; } dist = pLink->current.pos - current.pos; if (dist.abs2XZ() < 22500.0f) { return VISIT_REACHED_LINK; } return VISIT_RUN_LINK; case VISIT_WALK_AROUND_LINK: case VISIT_REACHED_LINK: if (!field_0x690.chkInside(&pLink->current.pos)) { return VISIT_LEFT_PATH; } dist = pLink->current.pos - current.pos; if (dist.abs2XZ() > 32400.0f) { return VISIT_RUN_LINK; } if (mVisitMode == VISIT_REACHED_LINK) { if (mRunAroundLinkTimer != 0) { mRunAroundLinkTimer--; } else { return VISIT_WALK_AROUND_LINK; } } return mVisitMode; case VISIT_NOTICE_LINK: case VISIT_LEFT_PATH: if (mWaitTimer != 0) { mWaitTimer--; break; } dist = pLink->current.pos - current.pos; if (dist.abs2XZ() < 160000.0f && field_0x698.chkInside(&pLink->current.pos)) { return VISIT_RUN_LINK; } return VISIT_WALK_PATH; case VISIT_WALK_PATH_FAST: if (field_0x6A4 != 0) { field_0x6A4--; break; } return VISIT_WALK_PATH_IGNORE_LINK; case VISIT_WALK_PATH_IGNORE_LINK: if (field_0x6A4 != 0) { field_0x6A4--; break; } return VISIT_WALK_PATH; } return mVisitMode; } /* 00001574-000016F8 .text visitInit__10daNpc_Mk_cFUc */ void daNpc_Mk_c::visitInit(u8 i_nextVisitMode) { switch(i_nextVisitMode) { case VISIT_WALK_PATH: field_0x688.setNearPathIndx(¤t.pos, 100.0f); setAnm(4); break; case VISIT_RUN_LINK: setAnm(5); if (mVisitMode == 6) { mTimerToReachLink = 55; } else { mTimerToReachLink = 0; } break; case VISIT_WALK_AROUND_LINK: setAnm(4); break; case VISIT_REACHED_LINK: mRunAroundLinkTimer = mTimerToReachLink; setAnm(5); break; case VISIT_NOTICE_LINK: setAnm(0); speedF = 0.0f; mWaitTimer = 0xF; break; case VISIT_LEFT_PATH: setAnm(0); speedF = 0.0f; mWaitTimer = 0x19; break; case VISIT_WALK_PATH_FAST: field_0x688.setNearPathIndx(¤t.pos, 100.0f); setAnm(5); field_0x6A4 = 0x64; break; case VISIT_WALK_PATH_IGNORE_LINK: setAnm(4); field_0x6A4 = 0x258; break; default: JUT_ASSERT(0x452, 0); break; } mVisitMode = i_nextVisitMode; } /* 000016F8-000017A8 .text visitProc__10daNpc_Mk_cFv */ void daNpc_Mk_c::visitProc() { switch(mVisitMode) { case VISIT_WALK_PATH: case VISIT_WALK_PATH_IGNORE_LINK: walkPath(0); break; case VISIT_WALK_PATH_FAST: walkPath(2); break; case VISIT_RUN_LINK: runLink(); if (mTimerToReachLink < 55){ mTimerToReachLink++; } break; case VISIT_WALK_AROUND_LINK: case VISIT_REACHED_LINK: aroundLink(); break; case VISIT_NOTICE_LINK: case VISIT_LEFT_PATH: setFlag(0x20); break; } } /* 000017A8-00001900 .text runawayInit__10daNpc_Mk_cFv */ void daNpc_Mk_c::runawayInit() { switch(mMkStatic.m0) { case 1: case 2: case 5: if (mAnmIdx == 6) { fopAcM_seStart(this, JA_SE_CV_TR_KO_A_FOUND, 0); } speedF = 0.0f; setAnm(5); break; case 3: speedF = 0.0f; setAnm(6); break; case 4: speed.y = 25.0f; gravity = -3.3f; speedF = 8.0f; setFlag(0x40); setAnm(9); mState = STATE_JUMP; current.angle.y = field_0x6F0; fopAcM_seStart(this, JA_SE_CV_TR_KO_A_CAUGHT, 0); break; } } /* 00001900-00001950 .text walkPath__10daNpc_Mk_cFUc */ void daNpc_Mk_c::walkPath(u8 param_1) { if (mMkStatic.walkPath(this, &field_0x688, param_1)) { setFlag(0x80); } } /* 00001950-000019DC .text runLink__10daNpc_Mk_cFv */ void daNpc_Mk_c::runLink() { daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); s16 temp; dNpc_calc_DisXZ_AngY(current.pos, pLink->current.pos, NULL, &temp); cLib_addCalcAngleS2(¤t.angle.y, temp, 8, 0x800); } /* 000019DC-00001A14 .text aroundLink__10daNpc_Mk_cFv */ void daNpc_Mk_c::aroundLink() { daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); // this makes the codegen work for all versions there might be an inline instead that doesnt need this? speedF = speedF; mMkStatic.aroundWalk(this, pLink, mRunAroundLinkTimer); } /* 00001A14-00001A68 .text remove_Um2__10daNpc_Mk_cFv */ void daNpc_Mk_c::remove_Um2() { daNpc_Uk_c* ac = (daNpc_Uk_c*)fopAcM_searchFromName("Um2", 0, 0); if(ac != NULL) { fopAcM_SetParam(ac, fopAcM_GetParam(ac) | 0x80000000); fopAcM_OnStatus(ac, fopAcStts_UNK800_e); } } /* 00001A68-00001BA4 .text demoInitCom__10daNpc_Mk_cFv */ void daNpc_Mk_c::demoInitCom() { int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "RM_Um2"); if(a_intP != NULL) { remove_Um2(); } a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "SOUND"); if(a_intP != NULL) { switch(*a_intP) { case 1: fopAcM_seStart(this, JA_SE_CV_TR_KO_A_RUN_AWAY, 0); break; case 2: fopAcM_seStart(this, JA_SE_CV_TR_KO_A_FOUND, 0); break; } } } /* 00001BA4-000024C8 .text demoProc__10daNpc_Mk_cFv */ bool daNpc_Mk_c::demoProc() { daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); BOOL temp = FALSE; cXyz* a_xyz; int* a_intP; if(dComIfGp_evmng_getIsAddvance(mStaffIdx)) { demoInitCom(); switch(mEventAction) { case 0: speedF = 0.0f; setAnm(0); break; case 1: case 10: speedF = 0.0f; setAnm(0); break; case 2: speedF = 0.0f; old.pos = home.pos; current.pos = home.pos; current.angle.y = home.angle.y; break; case 3: case 4: { if (mAnmIdx == 5) { speedF = 12.0f; } else if (mAnmIdx == 11) { speedF = 6.0f; setAnm(5); } else { setAnm(5); } a_xyz = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos"); JUT_ASSERT(1299, a_xyz); field_0x6D0 = current.pos; field_0x6DC = *a_xyz; int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer"); if (pTimer != NULL) { field_0x6E8 = *pTimer; } else { field_0x6E8 = -1; } break; } case 5: talkInit(); dComIfGp_event_setTalkPartner(this); a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "MsgNo"); JUT_ASSERT(1313, a_intP); mMsgNo = *a_intP; temp = TRUE; break; case 6: dComIfGp_event_setTalkPartner(this); break; case 8: setFlag(0x2); gravity = -3.3f; speed.y = 20.0f; speedF = 8.0f; setFlag(0x40); setAnm(10); break; case 7: setFlag(0x2); gravity = -2.1f; speed.y = 30.0f; speedF = 10.0f; setFlag(0x40); setAnm(10); break; case 9: setFlag(0x2); setAnm(7); break; case 11: speedF = 0.0f; setFlag(0x10); fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); mPrevState = 13; break; case 12: mCurrActionFunc = NULL; setAction(&daNpc_Mk_c::visit_action, NULL); mPrevState = mState; mState = STATE_DEMO01; clrFlag(0x10); fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); break; case 13: { fpc_ProcID itemID = fopAcM_createItemForPresentDemo(¤t.pos, dItemNo_HEART_PIECE_e); if (itemID != fpcM_ERROR_PROCESS_ID_e) { dComIfGp_event_setItemPartnerId(itemID); } dComIfGs_onEventBit(dSv_event_flag_c::UNK_1340); break; } case 14: dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0040); dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0120); break; case 15: speedF = 0.0f; a_xyz = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos"); JUT_ASSERT(1379, a_xyz); current.pos = *a_xyz; old.pos = *a_xyz; a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Angle"); JUT_ASSERT(1385, a_intP); current.angle.y = *a_intP; shape_angle.y = *a_intP; break; case 16: a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Angle"); JUT_ASSERT(1391, a_intP); field_0x6F0 = *a_intP; break; } } switch(mEventAction) { case 3: case 4: f32 temp2; s16 temp3; dNpc_calc_DisXZ_AngY(current.pos, field_0x6DC, &temp2, &temp3); if(temp2 < speedF || mMkStatic.chkPointPass(&field_0x6D0, &field_0x6DC, ¤t.pos) != 0) { if(mEventAction == 4) { current.pos.x = field_0x6DC.x; current.pos.z = field_0x6DC.z; speedF = 0.0f; } dComIfGp_evmng_cutEnd(mStaffIdx); } else { cLib_addCalcAngleS(¤t.angle.y, temp3, 8, 0x1000, 0x400); cLib_chaseF(&speedF, 12.0f, 1.1f); if (field_0x6E8 > 0) { field_0x6E8--; } if (field_0x6E8 == 0) { dComIfGp_evmng_cutEnd(mStaffIdx); } } return true; case 5: { u16 temp4 = talk(); if (temp4 == fopMsgStts_BOX_CLOSED_e || temp4 == 0xFE) { dComIfGp_evmng_cutEnd(mStaffIdx); } setFlag(0x20); break; } case 2: case 6: case 15: dComIfGp_evmng_cutEnd(mStaffIdx); return true; case 1: setFlag(0x20); dComIfGp_evmng_cutEnd(mStaffIdx); break; case 10: setFlag(0x200); dComIfGp_evmng_cutEnd(mStaffIdx); break; case 7: case 8: if (!chkFlag(0x40)) { setAnm(11); gravity = -30.0f; speedF = 0.0f; if (chkFlag(0x2)) { clrFlag(0x2); if (mEventAction == 7) { dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } } else if (mAnmEnded != 0) { dComIfGp_evmng_cutEnd(mStaffIdx); } } return true; case 9: if (chkFlag(0x2)) { if (mAnmEnded != 0) { dComIfGp_evmng_cutEnd(mStaffIdx); clrFlag(0x2); } } else { dComIfGp_evmng_cutEnd(mStaffIdx); } break; case 16: if (cLib_addCalcAngleS(¤t.angle.y, field_0x6F0, 8, 0x1000, 0x400) == 0) { dComIfGp_evmng_cutEnd(mStaffIdx); } break; default: dComIfGp_evmng_cutEnd(mStaffIdx); break; } if (temp) { return true; } return mpMorf->isMorf(); } /* 000024C8-0000251C .text setAttention__10daNpc_Mk_cFb */ void daNpc_Mk_c::setAttention(bool param_1) { if (!param_1 && mAttnSetCount >= 2) { return; } eyePos.set(mEyePos.x, mEyePos.y, mEyePos.z); attention_info.position.set(mAttnBasePos.x, mAttnBasePos.y + 45.0f, mAttnBasePos.z); } /* 0000251C-000025CC .text getLookBackMode__10daNpc_Mk_cFv */ u8 daNpc_Mk_c::getLookBackMode() { if (chkFlag(0x200)) { return 3; } if (chkFlag(0x20)) { return 0; } if (field_0x6A4 != 0) { return 2; } if (chkFlag(0x400) || mAnmIdx == 7 || mAnmIdx == 8) { return 2; } if (chkFlag(0x4)) { return 1; } if (mState == STATE_VISIT && (mVisitMode == VISIT_WALK_AROUND_LINK || mVisitMode == VISIT_REACHED_LINK)) { return 1; } return 2; } /* 000025CC-000027C8 .text lookBack__10daNpc_Mk_cFv */ void daNpc_Mk_c::lookBack() { cXyz temp2; cXyz temp(0.0f, 0.0f, 0.0f); cXyz* dstPos = NULL; s16 desiredYRot = current.angle.y; bool headOnlyFollow = false; switch(getLookBackMode()) { case 0: m_jnt.setTrn(); temp2 = dNpc_playerEyePos(-20.0f); dstPos = &temp2; temp.set(current.pos); temp.y = eyePos.y; break; case 1: temp2 = dNpc_playerEyePos(-20.0f); dstPos = &temp2; temp.set(current.pos); temp.y = eyePos.y; headOnlyFollow = true; break; case 2: desiredYRot = current.angle.y; headOnlyFollow = true; break; case 3: daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); pLink = (daPy_lk_c*)fopAcM_getTalkEventPartner(pLink); if(pLink == NULL) { pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); } m_jnt.setTrn(); temp2 = pLink->eyePos; dstPos = &temp2; temp.set(current.pos); temp.y = eyePos.y; break; } if (m_jnt.trnChk()) { cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, 0x5DC, 4, 0x800); } else { mMaxHeadTurnVelocity = 0; } m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp, desiredYRot, mMaxHeadTurnVelocity, headOnlyFollow); } /* 000027C8-0000284C .text wait01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::wait01() { if (chkFlag(0x1)) { mPrevState = mState; mState = STATE_TALK01; setAnmStatus(); } else { SetOrder(0x1); } return mpMorf->isMorf(); } /* 0000284C-0000297C .text talk01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::talk01() { if(talk() == fopMsgStts_BOX_CLOSED_e) { if(chkFlag(0x8)) { mEventIdx = dComIfGp_evmng_getEventIdx("MK_GAMESTART"); fopAcM_orderChangeEventId(this, mEventIdx, 0, 0xFFFF); mState = STATE_DEMO02; setFlag(0x400); dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0040); dComIfGs_onEventBit(dSv_event_flag_c::UNK_2201); } else { mState = mPrevState; setAnmStatus(); dComIfGp_event_reset(); clrFlag(0x1); mAttentionTimer = 5; } } setFlag(0x20); return mpMorf->isMorf(); } /* 0000297C-00002AC0 .text talk02__10daNpc_Mk_cFv */ bool daNpc_Mk_c::talk02() { if(talk() == fopMsgStts_BOX_CLOSED_e) { if(!mMkStatic.chkGameSet()) { mState = mPrevState; setAnmStatus(); dComIfGp_event_reset(); } else { mEventIdx = dComIfGp_evmng_getEventIdx("MK_GAMESET"); fopAcM_orderChangeEventId(this, mEventIdx, 0, 0xFFFF); mDoAud_seStart(JA_SE_END_WHISTLE); mState = STATE_DEMO02; setFlag(0x400); } clrFlag(0x1); mAttentionTimer = 5; } setFlag(0x20); return mpMorf->isMorf(); } /* 00002AC0-00002BB4 .text visitTalkInit__10daNpc_Mk_cFv */ u8 daNpc_Mk_c::visitTalkInit() { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1F80) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1E02)) { mEventIdx = eventInfo.mEventId; mState = STATE_DEMO03; demo03(); dComIfGs_onEventBit(dSv_event_flag_c::UNK_1E04); return 12; } if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1208) && !dComIfGs_checkGetItem(dItemNo_PICTO_BOX_e) && !dComIfGs_checkGetItem(dItemNo_DELUXE_PICTO_BOX_e)) { mEventIdx = eventInfo.mEventId; mState = STATE_DEMO03; demo03(); dComIfGs_onEventBit(dSv_event_flag_c::UNK_1602); return 12; } return 1; } /* 00002BB4-00002C90 .text visitSetEvent__10daNpc_Mk_cFv */ void daNpc_Mk_c::visitSetEvent() { if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1F80)) { if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1E02)){ eventInfo.setEventName("MK_TALK3"); return; } } if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1208) && !dComIfGs_checkGetItem(dItemNo_PICTO_BOX_e) && !dComIfGs_checkGetItem(dItemNo_DELUXE_PICTO_BOX_e)) { eventInfo.setEventName("MK_TALK2"); return; } eventInfo.setEventName("MK_TALK"); } /* 00002C90-00002F2C .text visit01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::visit01() { f32 temp; if (chkFlag(0x1)) { mPrevState = mState; mState = visitTalkInit(); setAnmStatus(); speedF = 0.0f; mVisitMode = VISIT_TALK; if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0580)) { dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0580); fopAcM_OffStatus(this, fopAcStts_UNK4000_e); } } else { if(checkDemoStart()) { mPrevState = mState; mState = STATE_DEMO01; setAnmStatus(); speedF = 0.0f; mVisitMode = VISIT_TALK; demo01(); } else { u8 nextvisitMode = nextVisitMode(); if(nextvisitMode != mVisitMode) { visitInit(nextvisitMode); } visitProc(); if (mAnmIdx == 4) { temp = 2.5f; } else if (mAnmIdx == 5) { if (mVisitMode == 5) { temp = 9.0f; } else { temp = 12.0f; } } if (speedF > temp) { cLib_chaseF(&speedF, temp, 2.8f); } else { cLib_chaseF(&speedF, temp, 1.1f); } SetOrder(0x1); if (mVisitMode == 4 || mVisitMode == 5) { daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); s16 angle = fopAcM_searchActorAngleY(pLink, this); angle -= pLink->shape_angle.y; if (angle < 0) { angle = -angle; } if (angle > 0x1800) { mOrderFlags &= ~0x01; // is this an inline? } } if (field_0x6A4 != 0) { mOrderFlags &= ~0x01; // is this an inline? } if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1F80) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1E02) && dComIfGs_isTmpBit(dSv_event_flag_c::UNK_0580)) { SetOrder(0x2); eventInfo.setEventName("MK_TALK4"); } else { if (ChkOrder(0x1)) { visitSetEvent(); } } } } return true; } /* 00002F2C-00003064 .text climb01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::climb01() { daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); if (chkFlag(0x40)) { return false; } if (pLink->checkFrontRollCrash()) { f32 temp; dNpc_calc_DisXZ_AngY(current.pos, pLink->current.pos, &temp, NULL); if(temp < 200.0f) { mState = STATE_DROP01; mEventIdx = dComIfGp_evmng_getEventIdx("MK_DROP"); fopAcM_orderOtherEventId(this, mEventIdx); dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0002); } } return mpMorf->isMorf(); } /* 00003064-00003108 .text drop01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::drop01() { if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { mPrevState = STATE_RUNAWAY; mState = STATE_DEMO03; mMkStatic.init(0x50, 0x12C); return demo03(); } fopAcM_orderOtherEventId(this, mEventIdx); return mpMorf->isMorf(); } /* 00003108-00003234 .text runaway__10daNpc_Mk_cFv */ bool daNpc_Mk_c::runaway() { u8 temp = mMkStatic.runAwayProc(this, &field_0x688, &mCyl, &field_0x6F0); if (temp != mMkStatic.m0) { if ((temp == 1 && mMkStatic.m0 == 2) || (temp == 2 && mMkStatic.m0 == 1)) { if (cM_rndF(1.0f) < 0.5f) { fopAcM_seStart(this, JA_SE_CV_TR_KO_A_TURN, 0); } } mMkStatic.m0 = temp; runawayInit(); } if (temp == 3) { setFlag(0x20); } if (mAnmIdx == 5) { cLib_chaseF(&speedF, mMkStatic.getSpeedF(15.0f, 18.0f), 2.8f); } return true; } /* 00003234-000032CC .text jump__10daNpc_Mk_cFv */ bool daNpc_Mk_c::jump() { if (!chkFlag(0x40)) { setAnm(0); gravity = -30.0f; speedF = 0.0f; if (mpMorf->isMorf()) { mState = STATE_JITANDA01; setAnm(7); SetOrder(0x2); } } return true; } /* 000032CC-0000330C .text jitanda01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::jitanda01() { if (chkFlag(0x1)) { setFlag(0x100); mPrevState = STATE_JITANDA02; mState = STATE_TALK02; } else { SetOrder(0x2); } return true; } /* 0000330C-0000339C .text jitanda02__10daNpc_Mk_cFv */ bool daNpc_Mk_c::jitanda02() { if(chkFlag(0x1)) { mPrevState = 9; mState = STATE_TALK02; } else { if(checkDemoStart()) { mPrevState = mState; mState = STATE_DEMO01; speedF = 0.0f; demo01(); } else { SetOrder(0x1); } } return true; } /* 0000339C-000033F0 .text demo01__10daNpc_Mk_cFv */ bool daNpc_Mk_c::demo01() { if(!checkDemoStart()) { mState = mPrevState; setAnmStatus(); return true; } return demoProc(); } /* 000033F0-00003564 .text demo02__10daNpc_Mk_cFv */ bool daNpc_Mk_c::demo02() { if(dComIfGp_evmng_endCheck(mEventIdx)) { dComIfGp_event_reset(); setAction(&daNpc_Mk_c::hind_action, NULL); setFlag(0x10); fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); clrFlag(0x1); clrFlag(0x400); return true; } if(!checkDemoStart()) { JUT_ASSERT(2058, NULL); } return demoProc(); } /* 00003564-00003638 .text demo03__10daNpc_Mk_cFv */ bool daNpc_Mk_c::demo03() { if(dComIfGp_evmng_endCheck(mEventIdx)) { mState = mPrevState; setAnmStatus(); dComIfGp_event_reset(); clrFlag(0x1); mAttentionTimer = 5; return true; } if(!checkDemoStart()) { JUT_ASSERT(2077, NULL); } return demoProc(); } /* 00003638-0000370C .text wait_action__10daNpc_Mk_cFPv */ BOOL daNpc_Mk_c::wait_action(void*) { if(mActionStatus == ACTION_STARTING) { mState = STATE_WAIT; setAnmStatus(); mActionStatus++; // set to ACTION_ONGOING } else if(mActionStatus != ACTION_ENDING) { chkAttention(); clrFlag(0x200 | 0x20); bool temp; switch(mState) { case STATE_WAIT: temp = wait01(); break; case STATE_TALK01: temp = talk01(); break; default: temp = false; break; } lookBack(); setAttention(temp); } return TRUE; } /* 0000370C-00003964 .text seek_action__10daNpc_Mk_cFPv */ BOOL daNpc_Mk_c::seek_action(void*) { if(mActionStatus == ACTION_STARTING) { if(dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0002)) { mState = STATE_RUNAWAY; mMkStatic.init(0x50, 0x12C); mMkStatic.setRndPathPos(this, &field_0x688); } else { mState = STATE_CLIMB01; } setAnmStatus(); mActionStatus++; // set to ACTION_ONGOING } else if(mActionStatus != ACTION_ENDING) { chkAttention(); clrFlag(0x200 | 0x20); bool temp; switch(mState) { case STATE_CLIMB01: temp = climb01(); break; case STATE_DROP01: temp = drop01(); break; case STATE_RUNAWAY: temp = runaway(); break; case STATE_JUMP: temp = jump(); break; case STATE_JITANDA01: temp = jitanda01(); break; case STATE_JITANDA02: temp = jitanda02(); break; case STATE_DEMO01: temp = demo01(); break; case STATE_DEMO02: temp = demo02(); break; case STATE_DEMO03: temp = demo03(); break; case STATE_TALK02: temp = talk02(); break; case STATE_13: temp = false; setAction(&daNpc_Mk_c::hind_action, NULL); break; default: temp = false; break; } lookBack(); if(chkFlag(0x40)) { temp = true; } setAttention(temp); } return TRUE; } /* 00003964-00003B00 .text hind_action__10daNpc_Mk_cFPv */ BOOL daNpc_Mk_c::hind_action(void*) { if(mActionStatus == ACTION_STARTING) { mActionStatus++; // set to ACTION_ONGOING } else if(mActionStatus != ACTION_ENDING) { clrFlag(0x200 | 0x20); if(mType == TYPE_MINIGAME && dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0040) && !dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0020)) { if(setAction(&daNpc_Mk_c::seek_action, NULL)) { clrFlag(0x10); fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); } } if((mType == TYPE_NORMAL || mType == TYPE_MINIGAME) && checkDemoStart()) { bool temp = demoProc(); lookBack(); setAttention(temp); } } return TRUE; } /* 00003B00-00003C7C .text visit_action__10daNpc_Mk_cFPv */ BOOL daNpc_Mk_c::visit_action(void*) { if(mActionStatus == ACTION_STARTING) { if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0040)) { mState = STATE_JITANDA02; setAnm(7); mStts.SetWeight(0xFE); } else { mState = STATE_VISIT; setAnmStatus(); mStts.SetWeight(0xA0); } mActionStatus++; // set to ACTION_ONGOING mVisitMode = 0; } else if (mActionStatus != ACTION_ENDING) { bool temp; chkAttention(); clrFlag(0x200 | 0x20); switch(mState) { case STATE_VISIT: temp = visit01(); break; case STATE_JITANDA02: temp = jitanda02(); break; case STATE_TALK01: temp = talk01(); break; case STATE_TALK02: temp = talk02(); break; case STATE_DEMO01: temp = demo01(); break; case STATE_DEMO02: temp = demo02(); break; case STATE_DEMO03: temp = demo03(); break; default: temp = false; break; } lookBack(); setAttention(temp); } return TRUE; } /* 00003C7C-00003DA0 .text _draw__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::_draw() { J3DModel* pModel = mpMorf->getModel(); J3DModelData* pModelData = pModel->getModelData(); if (chkFlag(0x10)) { return TRUE; } g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); g_env_light.setLightTevColorType(pModel, &tevStr); mBtpAnm.entry(pModelData, mBlinkFrame); mpMorf->entry(); mBtpAnm.remove(pModelData); cXyz shadowPos(current.pos.x, current.pos.y + 50.0f, current.pos.z); mShadowId = dComIfGd_setShadow( mShadowId, 1, pModel, &shadowPos, 300.0f, 20.0f, current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr ); dSnap_RegistFig(DSNAP_TYPE_NPC_MK, this, 1.0f, 1.0f, 1.0f); return TRUE; } /* 00003DA0-00004010 .text _execute__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::_execute() { m_jnt.setParam( /* mMaxBackboneX */ 0, /* mMaxBackboneY */ 7000, /* mMinBackboneX */ 0, /* mMinBackboneY */ -7000, /* mMaxHeadX */ 8000, /* mMaxHeadY */ 9000, /* mMinHeadX */ -2000, /* mMinHeadY */ -9000, /* mMaxTurnStep */ 1000 ); playTexPatternAnm(); mAnmEnded = mpMorf->play(&eyePos, mMtrlSndId, mReverb); if(mpMorf->getFrame() < mAnmTimer) { mAnmEnded = 1; } mAnmTimer = mpMorf->getFrame(); if (mAnmEnded != 0) { switch(mAnmIdx) { case 7: if(cM_rnd() < 0.4f) { setAnm(8); } break; case 8: setAnm(7); break; } } checkOrder(); (this->*mCurrActionFunc)(NULL); eventOrder(); if(!chkFlag(0x80)) { shape_angle.y = current.angle.y; } clrFlag(0x80); mMtrlSndId = 0; if(!chkFlag(0x10)) { fopAcM_posMoveF(this, mStts.GetCCMoveP()); mObjAcch.CrrPos(*dComIfG_Bgsp()); if (mObjAcch.ChkGroundHit()) { clrFlag(0x40); mMtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd); } else { setFlag(0x40); } tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); } else { setFlag(0x40); } J3DModel* pModel = mpMorf->getModel(); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); pModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpMorf->calc(); if(chkFlag(0x10)) { mCyl.OffCoSetBit(); } else { mCyl.OnCoSetBit(); setCollision(); } return TRUE; } /* 00004010-0000405C .text _delete__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::_delete() { dComIfG_resDelete(&mPhs, "Mk"); if (mpMorf != NULL) { mpMorf->stopZelAnime(); } return TRUE; } /* 0000405C-0000407C .text CheckCreateHeap__FP10fopAc_ac_c */ static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { return ((daNpc_Mk_c*)i_this)->CreateHeap(); } /* 0000407C-000042F8 .text _create__10daNpc_Mk_cFv */ cPhs_State daNpc_Mk_c::_create() { fopAcM_ct_Retail(this, daNpc_Mk_c); cPhs_State state = dComIfG_resLoad(&mPhs, "Mk"); if (state == cPhs_COMPLEATE_e) { fopAcM_ct_Demo(this, daNpc_Mk_c); mpName = "Mk"; switch(fopAcM_GetName(this)) { case fpcNm_NPC_MK_e: switch(getType()) { case TYPE_NORMAL: mType = TYPE_NORMAL; break; case TYPE_MINIGAME: mType = TYPE_MINIGAME; argument = 4; mpName = "Mk2"; break; default: mType = TYPE_NONE; break; } break; default: return cPhs_ERROR_e; } tevStr.mRoomNo = current.roomNo; if (!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0xB7B0)) { #if VERSION > VERSION_DEMO mpMorf = NULL; #endif return cPhs_ERROR_e; } fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -35.0f, -10.0f, -35.0f, 35.0f, 100.0f, 35.0f); if(!init()) { #if VERSION > VERSION_DEMO mpMorf = NULL; #endif return cPhs_ERROR_e; } } return state; } /* 000046A8-00004954 .text CreateHeap__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Mk", dRes_INDEX_MK_BDL_MK_e); mpMorf = new mDoExt_McaMorf( modelData, NULL, NULL, (J3DAnmTransformKey*)dComIfG_getObjectRes("Mk", dRes_INDEX_MK_BCK_MK_WAIT_e), J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, NULL, 0x80000, 0x11020022 ); if (mpMorf == NULL || mpMorf->getModel() == NULL) { return FALSE; } m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head2")); JUT_ASSERT(DEMO_SELECT(2574, 2576), m_jnt.getHeadJntNum() >= 0); m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone")); JUT_ASSERT(DEMO_SELECT(2579, 2581), m_jnt.getBackboneJntNum() >= 0); mTexPatternIdx = 0; #if VERSION == VERSION_DEMO initTexPatternAnm(false); #else if (!initTexPatternAnm(false)) { return FALSE; } #endif for(u16 i = 0; i < modelData->getJointNum(); i++) { if(i == getHeadJntNum() || i == getBackboneJntNum()) { mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Mk); } } mpMorf->getModel()->setUserArea((u32)(this)); mAcchCir.SetWall(60.0f, 30.0f); mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); mObjAcch.SetGroundCheckOffset(100.0f); fopAcM_SetMaxFallSpeed(this, -90.0f); mVisitMode = 0; return TRUE; } /* 00004954-00004974 .text daNpc_Mk_Create__FP10fopAc_ac_c */ static cPhs_State daNpc_Mk_Create(fopAc_ac_c* i_this) { return ((daNpc_Mk_c*)i_this)->_create(); } /* 00004974-00004994 .text daNpc_Mk_Delete__FP10daNpc_Mk_c */ static BOOL daNpc_Mk_Delete(daNpc_Mk_c* i_this) { return ((daNpc_Mk_c*)i_this)->_delete(); } /* 00004994-000049B4 .text daNpc_Mk_Execute__FP10daNpc_Mk_c */ static BOOL daNpc_Mk_Execute(daNpc_Mk_c* i_this) { return ((daNpc_Mk_c*)i_this)->_execute(); } /* 000049B4-000049D4 .text daNpc_Mk_Draw__FP10daNpc_Mk_c */ static BOOL daNpc_Mk_Draw(daNpc_Mk_c* i_this) { return ((daNpc_Mk_c*)i_this)->_draw(); } /* 000049D4-000049DC .text daNpc_Mk_IsDelete__FP10daNpc_Mk_c */ static BOOL daNpc_Mk_IsDelete(daNpc_Mk_c*) { return TRUE; } static actor_method_class l_daNpc_Mk_Method = { (process_method_func)daNpc_Mk_Create, (process_method_func)daNpc_Mk_Delete, (process_method_func)daNpc_Mk_Execute, (process_method_func)daNpc_Mk_IsDelete, (process_method_func)daNpc_Mk_Draw, }; actor_process_profile_definition g_profile_NPC_MK = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0006, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_NPC_MK_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daNpc_Mk_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_NPC_MK_e, /* Actor SubMtd */ &l_daNpc_Mk_Method, /* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e, /* Group */ fopAc_NPC_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };