diff options
| author | Zeclos <Zeclos99@gmail.com> | 2026-07-16 23:23:52 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-16 17:23:52 -0400 |
| commit | d3d65a4d8c31f796ae6db18291447010295d8fa5 (patch) | |
| tree | 9307e65d088a775cab5ffafe4a9d841664245227 /src | |
| parent | c562f05ffa10a901c9749c6105f7446163b04f1c (diff) | |
d_a_npc_mk matching (#1115)
* matching
* cleanup
* d_a_npc_tt matching outside of _create and rodata
* matching
* all symbols matching order wrong fake inline usage
* matching
* cleanup, naming of some fields and enums
* undo changes
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/actor/d_a_npc_mk.cpp | 1617 | ||||
| -rw-r--r-- | src/d/d_a_npc_mk_static.cpp | 16 |
2 files changed, 1527 insertions, 106 deletions
diff --git a/src/d/actor/d_a_npc_mk.cpp b/src/d/actor/d_a_npc_mk.cpp index d538aeaf..3d63332d 100644 --- a/src/d/actor/d_a_npc_mk.cpp +++ b/src/d/actor/d_a_npc_mk.cpp @@ -6,300 +6,1721 @@ #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*, int) { - /* Nonmatching */ +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->m_jnt.getBackbone_x()); + } + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, *calc_mtx); + } + } + return TRUE; } /* 00000230-00000344 .text initTexPatternAnm__10daNpc_Mk_cFb */ -void daNpc_Mk_c::initTexPatternAnm(bool) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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(signed char) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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 */ -void daNpc_Mk_c::chkAttentionLocal() { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INTALK_e && ChkOrder(3)) { + setFlag(1); + talkInit(); + } + ClrOrder(); } /* 000006D4-00000750 .text next_msgStatus__10daNpc_Mk_cFPUl */ -void daNpc_Mk_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::getMsg() { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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(unsigned char) { - /* Nonmatching */ +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() { - /* Nonmatching */ + mTalkState = TALK_INIT; + mMsgAnmIdx = 0xFF; } /* 00000A5C-00000A80 .text msgPushButton__10daNpc_Mk_cFv */ void daNpc_Mk_c::msgPushButton() { - /* Nonmatching */ + if ((s32)mCurrMsgNo != 0x26CA) { + return; + } + mMsgSelectNum = l_msg->mSelectNum; } /* 00000A80-00000C04 .text talk__10daNpc_Mk_cFv */ -void daNpc_Mk_c::talk() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::checkDemoStart() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::getNowEventAction() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::init() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::getType() { - /* Nonmatching */ +u8 daNpc_Mk_c::getType() { + return fopAcM_GetParam(this) & 0xFF; } /* 00001288-00001294 .text getPath__10daNpc_Mk_cFv */ -void daNpc_Mk_c::getPath() { - /* Nonmatching */ +u8 daNpc_Mk_c::getPath() { + return fopAcM_GetParam(this) >> 8 & 0xFF; } /* 00001294-00001574 .text nextVisitMode__10daNpc_Mk_cFv */ -void daNpc_Mk_c::nextVisitMode() { - /* Nonmatching */ +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(unsigned char) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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(unsigned char) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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 */ -void daNpc_Mk_c::demoProc() { - /* Nonmatching */ +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) { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::getLookBackMode() { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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 */ -void daNpc_Mk_c::wait01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::talk01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::talk02() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::visitTalkInit() { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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 */ -void daNpc_Mk_c::visit01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::climb01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::drop01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::runaway() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::jump() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::jitanda01() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::jitanda02() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::demo01() { - /* Nonmatching */ +bool daNpc_Mk_c::demo01() { + if(!checkDemoStart()) { + mState = mPrevState; + setAnmStatus(); + return true; + } + return demoProc(); } /* 000033F0-00003564 .text demo02__10daNpc_Mk_cFv */ -void daNpc_Mk_c::demo02() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::demo03() { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::wait_action(void*) { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::seek_action(void*) { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::hind_action(void*) { - /* Nonmatching */ +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 */ -void daNpc_Mk_c::visit_action(void*) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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_MK, this, 1.0f, 1.0f, 1.0f); + return TRUE; } /* 00003DA0-00004010 .text _execute__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::_execute() { - /* Nonmatching */ + 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.ClrCoSet(); + } else { + mCyl.OnCoSetBit(); + setCollision(); + } + return TRUE; } /* 00004010-0000405C .text _delete__10daNpc_Mk_cFv */ BOOL daNpc_Mk_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Mk"); + if (mpMorf != NULL) { + mpMorf->stopZelAnime(); + } + return TRUE; } /* 0000405C-0000407C .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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 */ -void daNpc_Mk_c::CreateHeap() { - /* Nonmatching */ +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 */ diff --git a/src/d/d_a_npc_mk_static.cpp b/src/d/d_a_npc_mk_static.cpp index 895325a6..893e83e8 100644 --- a/src/d/d_a_npc_mk_static.cpp +++ b/src/d/d_a_npc_mk_static.cpp @@ -304,11 +304,11 @@ u8 daNpc_Mk_Static_c::runAwayProc(fopAc_ac_c* param_1, dNpc_PathRun_c* param_2, } /* 800CC374-800CC400 .text chkGameSet__17daNpc_Mk_Static_cFv */ -bool daNpc_Mk_Static_c::chkGameSet() { +BOOL daNpc_Mk_Static_c::chkGameSet() { if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0020) && dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0010) && dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0008) && dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0004)) { - return true; + return TRUE; } else { - return false; + return FALSE; } } @@ -333,14 +333,14 @@ void daNpc_Mk_Static_c::setRndPathPos(fopAc_ac_c* param_1, dNpc_PathRun_c* param } /* 800CC664-800CC734 .text chkPointPass__17daNpc_Mk_Static_cFP4cXyzP4cXyzP4cXyz */ -bool daNpc_Mk_Static_c::chkPointPass(cXyz* param_1, cXyz* param_2, cXyz* param_3) { +BOOL daNpc_Mk_Static_c::chkPointPass(cXyz* param_1, cXyz* param_2, cXyz* param_3) { if (param_1->x == param_2->x && param_1->z == param_2->z) { - return true; + return TRUE; } else if (param_3->x == param_2->x && param_3->z == param_2->z) { - return true; + return TRUE; } else if (cM_scos(cLib_targetAngleY(param_1, param_2) - cLib_targetAngleY(param_3, param_2)) < 0.0f) { - return true; + return TRUE; } else { - return false; + return FALSE; } } |
