mirror of
https://github.com/zeldaret/tww.git
synced 2026-07-07 13:23:27 -04:00
5adfe20ead
closes #1026 closes #1011
1002 lines
28 KiB
C++
1002 lines
28 KiB
C++
/**
|
|
* d_a_npc_tt.cpp
|
|
* NPC - Tott
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_npc_tt.h"
|
|
#include "m_Do/m_Do_ext.h"
|
|
#include "res/Object/Tt.h"
|
|
#include "d/d_snap.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
|
|
static fpc_ProcID l_msgId;
|
|
static msg_class* l_msg;
|
|
|
|
/* 00000078-00000098 .text daNpc_tt_XyCheckCB__FPvi */
|
|
static s16 daNpc_tt_XyCheckCB(void* i_this, int i_itemBtn) {
|
|
return ((daNpc_Tt_c*)i_this)->XyCheckCB(i_itemBtn);
|
|
}
|
|
|
|
/* 00000098-000000BC .text XyCheckCB__10daNpc_Tt_cFi */
|
|
s16 daNpc_Tt_c::XyCheckCB(int i_itemBtn) {
|
|
return dComIfGp_getSelectItem(i_itemBtn) == dItemNo_WIND_WAKER_e ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 000000BC-00000108 .text daNpc_tt_XyEventCB__FPvi */
|
|
static s16 daNpc_tt_XyEventCB(void* i_this, int i_itemBtn) {
|
|
daNpc_Tt_c* a_this = (daNpc_Tt_c*)i_this;
|
|
a_this->mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT10");
|
|
return a_this->mEventIdx;
|
|
}
|
|
|
|
/* 00000108-000002D8 .text nodeCallBack_Tt__FP7J3DNodei */
|
|
static BOOL nodeCallBack_Tt(J3DNode* node, int calcTiming) {
|
|
cXyz temp;
|
|
cXyz temp2;
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daNpc_Tt_c* i_this = (daNpc_Tt_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->m_head_jnt_num) {
|
|
temp.setall(0.0f);
|
|
cMtx_YrotM(*calc_mtx, -i_this->getHead_y());
|
|
cMtx_ZrotM(*calc_mtx, -i_this->getHead_x() - i_this->mHeadAnm.field_0x00);
|
|
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->m_backbone_jnt_num) {
|
|
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;
|
|
}
|
|
|
|
/* 000002D8-00000368 .text setAnmStatus__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::setAnmStatus() {
|
|
switch(mState) {
|
|
case 1:
|
|
case 2:
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40)) {
|
|
danceInit(0);
|
|
} else {
|
|
setAnm(4);
|
|
}
|
|
break;
|
|
case 3:
|
|
break;
|
|
default:
|
|
setAnm(0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//probably unused JUT_ASSERT
|
|
static void dummy() {
|
|
OSReport("Tt");
|
|
OSReport("d_a_npc_tt.cpp");
|
|
OSReport("0");
|
|
OSReport("Halt");
|
|
}
|
|
|
|
#include "d/actor/d_a_npc_tt_anm.inc"
|
|
|
|
/* 00000368-000003DC .text eventOrder__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::eventOrder() {
|
|
if (ChkOrder(1)) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
fopAcM_orderSpeakEvent(this);
|
|
}
|
|
if (ChkOrder(2)) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
}
|
|
if (ChkOrder(4)) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALKITEM_e);
|
|
}
|
|
}
|
|
|
|
/* 000003DC-00000484 .text checkOrder__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::checkOrder() {
|
|
if (eventInfo.mCommand != dEvtCmd_INDEMO_e) {
|
|
if (eventInfo.mCommand == dEvtCmd_INTALK_e && ChkOrder(7)) {
|
|
if (dComIfGp_event_chkTalkXY()) {
|
|
setFlag(0x4);
|
|
} else {
|
|
setFlag(0x2);
|
|
}
|
|
talkInit();
|
|
}
|
|
}
|
|
ClrOrder();
|
|
}
|
|
|
|
/* 00000484-000004F4 .text next_msgStatus__10daNpc_Tt_cFPUl */
|
|
u16 daNpc_Tt_c::next_msgStatus(u32* pMsgNo) {
|
|
u16 msgStatus = fopMsgStts_MSG_CONTINUES_e;
|
|
|
|
switch (*pMsgNo) {
|
|
case 0x22C5:
|
|
case 0x22C7:
|
|
case 0x22C8:
|
|
case 0x22D5:
|
|
case 0x22D6:
|
|
(*pMsgNo)++;
|
|
break;
|
|
|
|
case 0x22C6:
|
|
*pMsgNo = 0x22D5;
|
|
break;
|
|
case 0x22D7:
|
|
*pMsgNo = 0x22C7;
|
|
break;
|
|
|
|
default:
|
|
msgStatus = fopMsgStts_MSG_ENDS_e;
|
|
break;
|
|
}
|
|
return msgStatus;
|
|
}
|
|
|
|
|
|
/* 000004F4-000005D0 .text getMsg__10daNpc_Tt_cFv */
|
|
u32 daNpc_Tt_c::getMsg() {
|
|
u32 msgNo;
|
|
clrFlag(0x20);
|
|
switch(mState) {
|
|
case 2:
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40)) {
|
|
msgNo = 0x22CB;
|
|
} else {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B08)) {
|
|
msgNo = 0x22CA;
|
|
setFlag(0x20);
|
|
} else {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B08);
|
|
msgNo = 0x22C5;
|
|
setFlag(0x20);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
msgNo = mMsgNo;
|
|
switch(msgNo) {
|
|
case 0x5B3:
|
|
dComIfGp_setMelodyNum(5);
|
|
break;
|
|
}
|
|
}
|
|
return msgNo;
|
|
}
|
|
|
|
/* 000005D0-00000650 .text setCollision__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::setCollision() {
|
|
|
|
cXyz centerPos(current.pos);
|
|
f32 cylCollisionRadius = 48.0f;
|
|
f32 height = 140.0f;
|
|
mCyl.SetC(centerPos);
|
|
mCyl.SetR(cylCollisionRadius);
|
|
mCyl.SetH(height);
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
/* 00000650-00000664 .text talkInit__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::talkInit() {
|
|
mTalkState = TALK_INIT;;
|
|
mMsgAnmIdx = 0xFF;
|
|
}
|
|
|
|
/* 00000664-00000718 .text msgAnm__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::msgAnm() {
|
|
if(mMsgAnmIdx != dComIfGp_getMesgAnimeAttrInfo()) {
|
|
mMsgAnmIdx = dComIfGp_getMesgAnimeAttrInfo();
|
|
switch(mMsgAnmIdx) {
|
|
case 0:
|
|
setAnm(0);
|
|
break;
|
|
case 1:
|
|
setAnm(1);
|
|
break;
|
|
case 2:
|
|
setAnm(3);
|
|
break;
|
|
case 3:
|
|
setAnm(4);
|
|
break;
|
|
case 4:
|
|
danceInit(0);
|
|
break;
|
|
case 5:
|
|
setAnm(2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000718-00000730 .text msgPushButton__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::msgPushButton() {
|
|
if ((s32)mCurrMsgNo != 0x22C6) {
|
|
return;
|
|
}
|
|
mNoticeLinkTimer = 0xF;
|
|
}
|
|
|
|
/* 00000730-00000778 .text msgContinue__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::msgContinue() {
|
|
switch(mCurrMsgNo) {
|
|
case 0x22D5:
|
|
if (mNoticeLinkTimer > 0) {
|
|
mNoticeLinkTimer--;
|
|
} else {
|
|
fopMsgM_messageSendOn();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 00000778-00000900 .text talk__10daNpc_Tt_cFv */
|
|
u16 daNpc_Tt_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) {
|
|
if(l_msgId == fpcM_ERROR_PROCESS_ID_e) {
|
|
l_msgId = fopMsgM_messageSet(mCurrMsgNo, this);
|
|
} else {
|
|
msgAnm();
|
|
switch(mTalkState) {
|
|
case TALK_MSG_CREATE:
|
|
l_msg = fopMsgM_SearchByID(l_msgId);
|
|
if (l_msg != NULL) {
|
|
mTalkState = TALK_ACTIVE;
|
|
}
|
|
break;
|
|
|
|
case TALK_ACTIVE:
|
|
if(l_msg != NULL) {
|
|
msgStatus = l_msg->mStatus;
|
|
if(msgStatus == fopMsgStts_MSG_CONTINUES_e) {
|
|
msgContinue();
|
|
} else 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;
|
|
l_msgId = fpcM_ERROR_PROCESS_ID_e;
|
|
l_msg = NULL;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return msgStatus;
|
|
}
|
|
|
|
/* 00000900-000009EC .text demoInitChange__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoInitChange() {
|
|
int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "prm0");
|
|
JUT_ASSERT(DEMO_SELECT(758, 758), a_intP);
|
|
|
|
if(a_intP != NULL) {
|
|
mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT11");
|
|
setEvFlag(0x1);
|
|
fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF);
|
|
}
|
|
}
|
|
|
|
/* 000009EC-00000B1C .text demoProcTact1__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::demoProcTact1() {
|
|
switch(daPy_getPlayerLinkActorClass()->getTactTimerCancel()) {
|
|
case 1:
|
|
mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT12");
|
|
setEvFlag(0x1);
|
|
fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF);
|
|
break;
|
|
case 2:
|
|
mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT13");
|
|
setEvFlag(0x1);
|
|
fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF);
|
|
break;
|
|
default:
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_0C40);
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000B1C-00000BA0 .text demoInitPatten__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoInitPatten() {
|
|
setEvFlag(0x4);
|
|
mSoundTimer = 0;
|
|
danceInit(0);
|
|
int* cnt = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Cnt");
|
|
if(cnt != NULL) {
|
|
field_0xE7A = *cnt;
|
|
} else {
|
|
field_0xE7A = 2;
|
|
}
|
|
}
|
|
|
|
/* 00000BA0-00000D40 .text demoProcPatten__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::demoProcPatten() {
|
|
if (field_0xE7A == 0) {
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
clrEvFlag(0x4);
|
|
} else {
|
|
if(danceProc()) {
|
|
field_0xE7A--;
|
|
}
|
|
if(mSoundTimer > 0) {
|
|
mSoundTimer--;
|
|
if(mSoundTimer == 0) {
|
|
switch(mCurrAnmIdx) {
|
|
case 8:
|
|
fopAcM_seStart(this, JA_SE_CV_TT_DANCE_FIN, 0);
|
|
break;
|
|
case 9:
|
|
fopAcM_seStart(this, JA_SE_CV_TT_DANCE_2, 0);
|
|
break;
|
|
case 10:
|
|
fopAcM_seStart(this, JA_SE_CV_TT_DANCE_1, 0);
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00000D40-00000E04 .text demoInitSpeak__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoInitSpeak() {
|
|
talkInit();
|
|
int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "MsgNo");
|
|
JUT_ASSERT(882, a_intP);
|
|
mMsgNo = *a_intP;
|
|
switch(mMsgNo) {
|
|
case 0x22CE:
|
|
if(dKy_daynight_check() == dKy_TIME_NIGHT_e) {
|
|
mMsgNo = 0x22CF;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 00000E04-00000E5C .text demoProcSpeak__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::demoProcSpeak() {
|
|
u16 temp = talk();
|
|
if (temp == fopMsgStts_BOX_CLOSED_e || temp == 0xFE) {
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/* 00000E5C-00000EC4 .text demoInitWait__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoInitWait() {
|
|
int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer");
|
|
if (pTimer != NULL) {
|
|
mTimer = *pTimer;
|
|
} else {
|
|
mTimer = 0;
|
|
}
|
|
}
|
|
|
|
/* 00000EC4-00000F14 .text demoProcWait__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::demoProcWait() {
|
|
if (mTimer > 0) {
|
|
mTimer--;
|
|
} else {
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00000F14-00001020 .text demoInitCom__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoInitCom() {
|
|
daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass();
|
|
int* hidePl = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "HIDE_PL");
|
|
if (hidePl != NULL) {
|
|
if (*hidePl != 0) {
|
|
pLink->onPlayerNoDraw();
|
|
} else {
|
|
pLink->offPlayerNoDraw();
|
|
}
|
|
}
|
|
|
|
int* disp = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "DISP");
|
|
if (disp != NULL) {
|
|
if (*disp != 0) {
|
|
clrEvFlag(0x2);
|
|
} else {
|
|
setEvFlag(0x2);
|
|
}
|
|
}
|
|
|
|
int* anm = dComIfGp_evmng_getMyIntegerP(mStaffIdx,"Anm");
|
|
if (anm != NULL) {
|
|
setAnm(*anm & 0xff);
|
|
}
|
|
}
|
|
|
|
/* 00001020-00001040 .text demoProcCom__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::demoProcCom() {
|
|
if (chkEvFlag(0x2)) {
|
|
setFlag(0x8);
|
|
}
|
|
}
|
|
|
|
/* 00001040-00001088 .text getNowEventAction__10daNpc_Tt_cFv */
|
|
s32 daNpc_Tt_c::getNowEventAction() {
|
|
static char* action_table[] = {
|
|
"WAIT",
|
|
"SPEAK",
|
|
"PATTEN",
|
|
"CHANGE",
|
|
"TACT0",
|
|
"TACT1",
|
|
};
|
|
|
|
return dComIfGp_evmng_getMyActIdx(mStaffIdx, action_table, ARRAY_SIZE(action_table), FALSE, 1);
|
|
}
|
|
|
|
/* 00001088-00001238 .text demoProc__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::demoProc() {
|
|
bool temp = false;
|
|
|
|
if(chkEvFlag(0x1)) {
|
|
mStaffIdx = dComIfGp_evmng_getMyStaffId("Tt");
|
|
clrEvFlag(0x1);
|
|
}
|
|
s32 eventAction = getNowEventAction();
|
|
if(dComIfGp_evmng_getIsAddvance(mStaffIdx)) {
|
|
demoInitCom();
|
|
setFlag(0x80);
|
|
switch(eventAction) {
|
|
case 1:
|
|
demoInitSpeak();
|
|
break;
|
|
case 0:
|
|
demoInitWait();
|
|
break;
|
|
case 2:
|
|
demoInitPatten();
|
|
temp = true;
|
|
break;
|
|
case 3:
|
|
demoInitChange();
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch(eventAction) {
|
|
case 1:
|
|
temp = demoProcSpeak();
|
|
break;
|
|
case 0:
|
|
demoProcWait();
|
|
break;
|
|
case 2:
|
|
demoProcPatten();
|
|
break;
|
|
case 3:
|
|
break;
|
|
case 4:
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
break;
|
|
case 5:
|
|
demoProcTact1();
|
|
break;
|
|
default:
|
|
dComIfGp_evmng_cutEnd(mStaffIdx);
|
|
break;
|
|
}
|
|
|
|
demoProcCom();
|
|
if(eventAction != 2) {
|
|
danceProc();
|
|
}
|
|
return temp;
|
|
}
|
|
|
|
/* 00001238-00001420 .text init__10daNpc_Tt_cFv */
|
|
BOOL daNpc_Tt_c::init() {
|
|
attention_info.flags = fopAc_Attn_ACTION_SPEAK_e|fopAc_Attn_LOCKON_TALK_e;
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAB;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAB;
|
|
gravity = -30.0f;
|
|
fopAcM_SetStatusMap(this, 0x27);
|
|
fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e);
|
|
|
|
switch(mType) {
|
|
case 0:
|
|
setAction(&daNpc_Tt_c::wait_action, NULL);
|
|
break;
|
|
}
|
|
|
|
mAttnBasePos.set(current.pos);
|
|
mEyePos.set(current.pos);
|
|
|
|
J3DModel* model = mpMorf->getModel();
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
ke_execute();
|
|
mStts.Init(0xFF, 0xFF, this);
|
|
mCyl.Set(dNpc_cyl_src);
|
|
mCyl.SetStts(&mStts);
|
|
eventInfo.setXyCheckCB(daNpc_tt_XyCheckCB);
|
|
eventInfo.setXyEventCB(daNpc_tt_XyEventCB);
|
|
mMtrlSndId = 0;
|
|
mReverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this));
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001420-00001474 .text setAttention__10daNpc_Tt_cFb */
|
|
void daNpc_Tt_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 + 65.0f, mAttnBasePos.z);
|
|
}
|
|
|
|
/* 00001474-000015D8 .text lookBack__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::lookBack() {
|
|
cXyz temp2;
|
|
cXyz temp(0.0f, 0.0f, 0.0f);
|
|
cXyz* dstPos = NULL;
|
|
s16 desiredYRot = current.angle.y;
|
|
bool headOnlyFollow = false;
|
|
|
|
switch(mState) {
|
|
case 1:
|
|
desiredYRot = home.angle.y;
|
|
if(desiredYRot != current.angle.y) {
|
|
m_jnt.setTrn();
|
|
} else {
|
|
m_jnt.clrTrn();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
if (chkFlag(0x20)) {
|
|
desiredYRot = home.angle.y;
|
|
m_jnt.clrTrn();
|
|
} else {
|
|
m_jnt.setTrn();
|
|
temp2 = dNpc_playerEyePos(-20.0f);
|
|
dstPos = &temp2;
|
|
temp.set(current.pos);
|
|
temp.y = eyePos.y;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (m_jnt.trnChk()) {
|
|
cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, 0x800, 4, 0x800);
|
|
} else {
|
|
mMaxHeadTurnVelocity = 0;
|
|
}
|
|
|
|
m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp, desiredYRot, mMaxHeadTurnVelocity, headOnlyFollow);
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 000015D8-00001734 .text wait01__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::wait01() {
|
|
if(chkFlag(0x4)) {
|
|
mReturnToState = mState;
|
|
mState = 3;
|
|
setAnmStatus();
|
|
mTimer = 0x14;
|
|
setEvFlag(0x1);
|
|
fopAcM_seStart(this, JA_SE_PRE_TAKT, 0);
|
|
return demoProc();
|
|
|
|
} else if(chkFlag(0x2)) {
|
|
mReturnToState = mState;
|
|
mState = 2;
|
|
setAnmStatus();
|
|
} else {
|
|
SetOrder(0x2);
|
|
if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40) && dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B08)) {
|
|
SetOrder(0x4);
|
|
}
|
|
}
|
|
danceProc();
|
|
return mpMorf->isMorf();
|
|
}
|
|
|
|
/* 00001734-00001804 .text talk01__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::talk01() {
|
|
u16 temp = talk();
|
|
if(mCurrMsgNo == 0x22C6 && dComIfGp_checkMesgSendButton()) {
|
|
clrFlag(0x20);
|
|
}
|
|
|
|
if(temp == fopMsgStts_BOX_CLOSED_e) {
|
|
mState = mReturnToState;
|
|
setAnmStatus();
|
|
dComIfGp_event_reset();
|
|
clrFlag(0x2);
|
|
clrFlag(0x4);
|
|
}
|
|
danceProc();
|
|
return mpMorf->isMorf();
|
|
}
|
|
|
|
/* 00001804-00001894 .text tact00__10daNpc_Tt_cFv */
|
|
bool daNpc_Tt_c::tact00() {
|
|
if(dComIfGp_evmng_endCheck(mEventIdx)) {
|
|
mState = mReturnToState;
|
|
setAnmStatus();
|
|
dComIfGp_event_reset();
|
|
clrFlag(0x2);
|
|
clrFlag(0x4);
|
|
return true;
|
|
}
|
|
return demoProc();
|
|
}
|
|
|
|
/* 00001894-00001970 .text wait_action__10daNpc_Tt_cFPv */
|
|
BOOL daNpc_Tt_c::wait_action(void*) {
|
|
if(mActionStatus == ACTION_STARTING) {
|
|
mState = 1;
|
|
setAnmStatus();
|
|
mActionStatus++; // set to ACTION_ONGOING
|
|
} else if(mActionStatus != ACTION_ENDING) {
|
|
bool temp;
|
|
clrFlag(0x8);
|
|
switch(mState) {
|
|
case 1:
|
|
temp = wait01();
|
|
break;
|
|
case 2:
|
|
temp = talk01();
|
|
break;
|
|
case 3:
|
|
temp = tact00();
|
|
break;
|
|
default:
|
|
temp = false;
|
|
break;
|
|
}
|
|
lookBack();
|
|
setAttention(temp);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001970-00001BAC .text ke_control__7tt_ke_sFf */
|
|
void tt_ke_s::ke_control(f32 param_1) {
|
|
int i;
|
|
cXyz* temp2 = &field_0x00[1];
|
|
cXyz* temp3 = &field_0x78[1];
|
|
cXyz temp;
|
|
cXyz temp6;
|
|
cXyz temp4;
|
|
temp.set(0.0f, 0.0f, 7.875f);
|
|
|
|
f32 _065 = 0.65f;
|
|
|
|
for(i = 1; i < 10; i++, temp2++, temp3++) {
|
|
temp4.x = temp3->x + (temp2->x - (temp2 - 1)->x);
|
|
temp4.z = temp3->z + (temp2->z - (temp2 - 1)->z);
|
|
|
|
f32 temp7 = temp2->y + temp3->y +-3.0f;
|
|
|
|
if(temp7 < param_1) {
|
|
temp7 = param_1;
|
|
}
|
|
|
|
temp4.y = temp7 - (temp2-1)->y;
|
|
mDoMtx_XrotS(*calc_mtx, -cM_atan2s(temp4.y, temp4.z));
|
|
mDoMtx_YrotM(*calc_mtx, (s16)cM_atan2s(temp4.x, std::sqrtf(temp4.y * temp4.y + temp4.z * temp4.z)));
|
|
MtxPosition(&temp, &temp6);
|
|
*temp3 = *temp2;
|
|
*temp2 = *(temp2-1) + temp6;
|
|
temp3->x = (temp2->x - temp3->x) * _065;
|
|
temp3->y = (temp2->y - temp3->y) * _065;
|
|
temp3->z = (temp2->z - temp3->z) * _065;
|
|
}
|
|
}
|
|
|
|
/* 00001BAC-00001BE4 .text ke_pos_set__7tt_ke_sFP4cXyz */
|
|
void tt_ke_s::ke_pos_set(cXyz* i_param) {
|
|
for(int i = 0; i < 10; i_param++) {
|
|
*i_param = field_0x00[i];
|
|
i++;
|
|
}
|
|
}
|
|
|
|
/* 00001BE4-00001D48 .text set_ke_root__10daNpc_Tt_cFiii */
|
|
void daNpc_Tt_c::set_ke_root(int param_1, int param_2, int param_3) {
|
|
cXyz temp(0.0f, 0.0f, 0.0f);
|
|
MTXCopy(mpMorf->getModel()->getAnmMtx(param_1), *calc_mtx);
|
|
MtxPosition(&temp, &mLineKe.field_0x6C8[param_3].field_0x00[0]);
|
|
|
|
MTXCopy(mpMorf->getModel()->getAnmMtx(param_2), *calc_mtx);
|
|
MtxPosition(&temp, &mLineKe.field_0x6C8[param_3 + 3].field_0x00[0]);
|
|
|
|
mLineKe.field_0x6C8[param_3+1].field_0x00[0] = (mLineKe.field_0x6C8[param_3 + 3].field_0x00[0] - mLineKe.field_0x6C8[param_3].field_0x00[0]) * 0.3333f + mLineKe.field_0x6C8[param_3].field_0x00[0];
|
|
|
|
mLineKe.field_0x6C8[param_3+2].field_0x00[0] = (mLineKe.field_0x6C8[param_3 + 3].field_0x00[0] - mLineKe.field_0x6C8[param_3].field_0x00[0]) * 0.6667f + mLineKe.field_0x6C8[param_3].field_0x00[0];
|
|
}
|
|
|
|
/* 00001D48-00001E04 .text ke_execute__10daNpc_Tt_cFv */
|
|
void daNpc_Tt_c::ke_execute() {
|
|
mpMorf->calc();
|
|
|
|
set_ke_root(6, 7, 0);
|
|
set_ke_root(10, 11, 4);
|
|
int i;
|
|
tt_ke_s* ke = mLineKe.field_0x6C8;
|
|
f32 y = current.pos.y + 3.0f;
|
|
|
|
for (i = 0; i < 8; i++, ke++) {
|
|
ke->ke_control(y);
|
|
ke->ke_pos_set(mLineKe.mLineMat.getPos(i));
|
|
}
|
|
}
|
|
|
|
/* 00001E04-00001F84 .text _draw__10daNpc_Tt_cFv */
|
|
BOOL daNpc_Tt_c::_draw() {
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
J3DModelData* pModelData = pModel->getModelData();
|
|
if (chkFlag(0x8)) {
|
|
return TRUE;
|
|
}
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(pModel, &tevStr);
|
|
mBtpAnm.entry(pModelData, mBlinkFrame);
|
|
mpMorf->entryDL();
|
|
mBtpAnm.remove(pModelData);
|
|
f32 _100 = 100.0f;
|
|
f32 _450 = 450.0f;
|
|
cXyz shadowPos(current.pos.x, current.pos.y + _100, current.pos.z);
|
|
|
|
mShadowId = dComIfGd_setShadow(
|
|
mShadowId, 1, pModel, &shadowPos, _450, 20.0f,
|
|
current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr
|
|
);
|
|
|
|
#ifdef __MWERKS__
|
|
mLineKe.mLineMat.update(10, 0.8f, (GXColor){0xC9, 0xCA, 0xE4, 0xFF}, 0, &tevStr);
|
|
#else
|
|
GXColor color = (GXColor){0xC9, 0xCA, 0xE4, 0xFF};
|
|
mLineKe.mLineMat.update(10, 0.8f, color, 0, &tevStr);
|
|
#endif
|
|
dComIfGd_set3DlineMat(&mLineKe.mLineMat);
|
|
|
|
dSnap_RegistFig(DSNAP_TYPE_TT, this, 1.0f, 1.0f, 1.0f);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001F84-00002158 .text _execute__10daNpc_Tt_cFv */
|
|
BOOL daNpc_Tt_c::_execute() {
|
|
m_jnt.setParam(
|
|
/* mMaxBackboneX */ 0,
|
|
/* mMaxBackboneY */ 0x1C70,
|
|
/* mMinBackboneX */ 0,
|
|
/* mMinBackboneY */ -0x1C70,
|
|
/* mMaxHeadX */ 0x1FFE,
|
|
/* mMaxHeadY */ 9000,
|
|
/* mMinHeadX */ -0x1FFE,
|
|
/* mMinHeadY */ -9000,
|
|
/* mMaxTurnStep */ 0x1000
|
|
);
|
|
|
|
playTexPatternAnm();
|
|
|
|
mAnmEnded = mpMorf->play(&eyePos, mMtrlSndId, mReverb);
|
|
if(mpMorf->getFrame() < mAnmTimer) {
|
|
mAnmEnded = 1;
|
|
}
|
|
|
|
mAnmTimer = mpMorf->getFrame();
|
|
if (mAnmEnded != 0) {
|
|
switch(mCurrAnmIdx) {
|
|
case 3:
|
|
if (mAnmLoopCount > 0) {
|
|
setAnm(0);
|
|
} else {
|
|
mAnmLoopCount++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
mHeadAnm.move();
|
|
checkOrder();
|
|
(this->*mCurrActionFunc)(NULL);
|
|
eventOrder();
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mObjAcch.CrrPos(*dComIfG_Bgsp());
|
|
mMtrlSndId = 0;
|
|
|
|
if (!mObjAcch.ChkGroundHit()) {
|
|
mMtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd);
|
|
}
|
|
|
|
tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd);
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd);
|
|
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
pModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
setCollision();
|
|
ke_execute();
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00002158-000021A8 .text _delete__10daNpc_Tt_cFv */
|
|
BOOL daNpc_Tt_c::_delete() {
|
|
dComIfG_resDelete(&mPhs, "Tt");
|
|
if (mpMorf != NULL) {
|
|
mpMorf->stopZelAnime();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000021A8-000021C8 .text CheckCreateHeap__FP10fopAc_ac_c */
|
|
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
|
|
return ((daNpc_Tt_c*)i_this)->CreateHeap();
|
|
}
|
|
|
|
/* 000021C8-0000241C .text _create__10daNpc_Tt_cFv */
|
|
cPhs_State daNpc_Tt_c::_create() {
|
|
fopAcM_ct_Retail(this, daNpc_Tt_c);
|
|
cPhs_State state = dComIfG_resLoad(&mPhs, "Tt");
|
|
if (state == cPhs_COMPLEATE_e) {
|
|
fopAcM_ct_Demo(this, daNpc_Tt_c);
|
|
switch(fopAcM_GetName(this)) {
|
|
case fpcNm_NPC_TT_e:
|
|
mType = 0;
|
|
break;
|
|
default:
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0xE880)) {
|
|
#if VERSION > VERSION_DEMO
|
|
mpMorf = NULL;
|
|
#endif
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
|
|
if(!init()) {
|
|
#if VERSION > VERSION_DEMO
|
|
mpMorf = NULL;
|
|
#endif
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
return state;
|
|
}
|
|
|
|
/* 000027D0-00002AB0 .text CreateHeap__10daNpc_Tt_cFv */
|
|
BOOL daNpc_Tt_c::CreateHeap() {
|
|
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BDL_TT_e);
|
|
|
|
mpMorf = new mDoExt_McaMorf(
|
|
modelData,
|
|
NULL, NULL,
|
|
(J3DAnmTransformKey*)dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BCK_WAIT01_e),
|
|
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1,
|
|
dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BAS_WAIT01_e),
|
|
0x80000,
|
|
0x11020022
|
|
);
|
|
|
|
if (mpMorf == NULL || mpMorf->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_head_jnt_num = modelData->getJointName()->getIndex("head");
|
|
JUT_ASSERT(DEMO_SELECT(1706, 1708), m_head_jnt_num >= 0);
|
|
|
|
m_backbone_jnt_num = modelData->getJointName()->getIndex("backbone1");
|
|
JUT_ASSERT(DEMO_SELECT(1708, 1710), m_backbone_jnt_num >= 0);
|
|
|
|
switch(mType) {
|
|
case 0:
|
|
mTexPatternIdx = false;
|
|
break;
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
initTexPatternAnm(false);
|
|
#else
|
|
if (!initTexPatternAnm(false)) {
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
|
|
for(u16 i = 0; i < modelData->getJointNum(); i++) {
|
|
if(i == m_head_jnt_num || i == m_backbone_jnt_num) {
|
|
mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Tt);
|
|
}
|
|
}
|
|
|
|
mpMorf->getModel()->setUserArea((u32)(this));
|
|
|
|
mAcchCir.SetWall(30.0f, 0.0f);
|
|
mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this));
|
|
return mLineKe.mLineMat.init(8, 10, 0) == FALSE ? FALSE : TRUE;
|
|
}
|
|
|
|
/* 00002AB0-00002AD0 .text daNpc_Tt_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daNpc_Tt_Create(fopAc_ac_c* i_this) {
|
|
return ((daNpc_Tt_c*)i_this)->_create();
|
|
}
|
|
|
|
/* 00002AD0-00002AF0 .text daNpc_Tt_Delete__FP10daNpc_Tt_c */
|
|
static BOOL daNpc_Tt_Delete(daNpc_Tt_c* i_this) {
|
|
return ((daNpc_Tt_c*)i_this)->_delete();
|
|
}
|
|
|
|
/* 00002AF0-00002B10 .text daNpc_Tt_Execute__FP10daNpc_Tt_c */
|
|
static BOOL daNpc_Tt_Execute(daNpc_Tt_c* i_this) {
|
|
return ((daNpc_Tt_c*)i_this)->_execute();
|
|
}
|
|
|
|
/* 00002B10-00002B30 .text daNpc_Tt_Draw__FP10daNpc_Tt_c */
|
|
static BOOL daNpc_Tt_Draw(daNpc_Tt_c* i_this) {
|
|
return ((daNpc_Tt_c*)i_this)->_draw();
|
|
}
|
|
|
|
/* 00002B30-00002B38 .text daNpc_Tt_IsDelete__FP10daNpc_Tt_c */
|
|
static BOOL daNpc_Tt_IsDelete(daNpc_Tt_c*) {
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static actor_method_class l_daNpc_Tt_Method = {
|
|
(process_method_func)daNpc_Tt_Create,
|
|
(process_method_func)daNpc_Tt_Delete,
|
|
(process_method_func)daNpc_Tt_Execute,
|
|
(process_method_func)daNpc_Tt_IsDelete,
|
|
(process_method_func)daNpc_Tt_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_NPC_TT = {
|
|
/* Layer ID */ fpcLy_CURRENT_e,
|
|
/* List ID */ 0x0007,
|
|
/* List Prio */ fpcPi_CURRENT_e,
|
|
/* Proc Name */ fpcNm_NPC_TT_e,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daNpc_Tt_c),
|
|
/* Size Other */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Draw Prio */ fpcDwPi_NPC_TT_e,
|
|
/* Actor SubMtd */ &l_daNpc_Tt_Method,
|
|
/* Status */ fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e,
|
|
/* Group */ fopAc_NPC_e,
|
|
/* Cull Type */ fopAc_CULLBOX_12_e,
|
|
};
|