Files
tww/src/d/actor/d_a_npc_mt.cpp
T
LagoLunatic 4efda6f355 Minor cleanup
Inlines, wrong indentation, enums, private fields, etc
2026-07-23 17:48:51 -04:00

1469 lines
38 KiB
C++

/**
* d_a_npc_mt.cpp
* NPC - Carlov
*/
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_npc_mt.h"
#include "d/d_com_lib_game.h"
#include "d/d_com_inf_game.h"
#include "d/d_snap.h"
#include "d/d_picture_box.h"
#include "res/Object/Niten.h"
#define TOTAL_FIGURE_COUNT 0x86
const char daNpcMt_c::m_arcname[] = "Niten";
static char* l_npc_staff_id[] = {
"Mt"
};
static const char* l_arcname_tbl[] = {
"Niten"
};
static const int l_bmd_ix_tbl[] = {
dRes_ID_NITEN_BDL_MT_e,
};
static const int l_bck_ix_tbl[] = {
dRes_ID_NITEN_BCK_MT_WAIT01_e,
dRes_ID_NITEN_BCK_MT_TALK01_e,
dRes_ID_NITEN_BCK_MT_TALK02_e,
dRes_ID_NITEN_BCK_MT_TALK03_e,
dRes_ID_NITEN_BCK_MT_TALK04_e,
dRes_ID_NITEN_BCK_MT_TUKURU_e,
};
static const int l_btp_ix_tbl[] = {
dRes_ID_NITEN_BTP_MT_MABA_e,
};
static sMtAnmDat l_npc_anm_wait[] = {
{
0x00,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_talk[] = {
{
0x01,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_talk2[] = {
{
0x02,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_talk3[] = {
{
0x03,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_talk4[] = {
{
0x04,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_talk5[] = {
{
0x04,
0x08,
0x02,
},
{
0x01,
0x08,
0xFF,
},
};
static sMtAnmDat l_npc_anm_tukuru[] = {
{
0x05,
0x08,
0x01,
},
{
0x00,
0x08,
0xFF,
},
};
static NpcDatStruct l_npc_dat[] = {
{
0x0FA0,
0x1B58,
0,
0,
0xF448,
0xE4A8,
0,
0,
0x01F4,
0,
0,
190.0f,
150.0f,
250.0f,
400.0f,
0x4000,
0x0800,
0x0190,
0,
60.0f,
0.5f,
3.0f,
0x0006,
0x0400,
0x003C,
0x005A,
0x00C8,
0x012C,
0x001E,
false,
true,
},
};
static u32 l_msg_mt_1st_talk[] = {
0x365E,
0x365F,
0x3660,
0x3661,
0x3662,
0x3663,
0x3664,
0x0000,
};
static u32 l_msg_mt_2nd_talk[] = {
0x3665,
0x3666,
0x3667,
0x0000,
};
static u32 l_msg_mt_3rd_talk[] = {
0x3668,
0x0000,
};
static u32 l_msg_mt_4th_talk[] = {
0x3669,
0x0000,
};
static u32 l_msg_mt_making[] = {
0x3654,
0x0000,
};
static u32 l_msg_mt_1st_kansei[] = {
0x364D,
0x364E,
0x3650,
0x0001,
0x0000,
};
static u32 l_msg_mt_2nd_kansei[] = {
0x364D,
0x364F,
0x3650,
0x0001,
0x0000,
};
static u32 l_msg_mt_room[] = {
0x366B,
0x366B,
0x366C,
0x366D,
0x366E,
0x366F,
0x3670,
0x3671,
};
static u32 l_msg_mt_gallery[] = {
0x3651,
0x0000,
};
static u32 l_msg_mt_room_in[] = {
0x3652,
0x0000,
};
static u32 l_msg_mt_kansei_end[] = {
0x3653,
0x0000,
};
static u32 l_msg_mt_no_color[] = {
0x3655,
0x0000,
};
static u32 l_msg_mt_no_figure[] = {
0x3656,
0x0000,
};
static u32 l_msg_mt_maked[] = {
0x3658,
0x0000,
};
static u32 l_msg_mt_face_ng[] = {
0x3659,
0x0000,
};
static u32 l_msg_mt_body_ng[] = {
0x365A,
0x0000,
};
static u32 l_msg_mt_make_1st[] = {
0x365B,
0x3674,
0x365C,
0x0002,
};
static u32 l_msg_mt_make_2nd[] = {
0x365B,
0x3674,
0x365D,
0x0002,
};
static u32 l_msg_mt_make_1st_mt[] = {
0x3672,
0x3674,
0x365C,
0x0002,
};
static u32 l_msg_mt_make_2nd_mt[] = {
0x3672,
0x3674,
0x365D,
0x0002,
};
static u32 l_msg_mt_make_1st_mn[] = {
0x3673,
0x3674,
0x365C,
0x0002,
};
static u32 l_msg_mt_make_2nd_mn[] = {
0x3673,
0x3674,
0x365D,
0x0002,
};
static u32* l_msg_mt_make[] = {
l_msg_mt_make_1st,
l_msg_mt_make_2nd,
};
static u32* l_msg_mt_make_mt[] = {
l_msg_mt_make_1st_mt,
l_msg_mt_make_2nd_mt,
};
static u32* l_msg_mt_make_mn[] = {
l_msg_mt_make_1st_mn,
l_msg_mt_make_2nd_mn,
};
static u16 l_figure_comp[] = {
dSv_event_flag_c::UNK_95FF,
dSv_event_flag_c::UNK_94FF,
dSv_event_flag_c::UNK_93FF,
dSv_event_flag_c::UNK_92FF,
dSv_event_flag_c::UNK_91FF,
dSv_event_flag_c::UNK_90FF,
dSv_event_flag_c::UNK_8FFF,
dSv_event_flag_c::UNK_8EFF,
dSv_event_flag_c::UNK_8DFF,
dSv_event_flag_c::UNK_8CFF,
dSv_event_flag_c::UNK_B1FF,
dSv_event_flag_c::UNK_9CFF,
dSv_event_flag_c::UNK_84FF,
dSv_event_flag_c::UNK_83FF,
dSv_event_flag_c::UNK_82FF,
dSv_event_flag_c::UNK_81FF,
dSv_event_flag_c::UNK_80FF,
};
static char* l_figure_room_name[] = {
"Pfigure",
"figureA",
"figureB",
"figureC",
"figureD",
"figureE",
"figureF",
"figureG",
};
/* 00000078-00000228 .text __ct__9daNpcMt_cFv */
daNpcMt_c::daNpcMt_c() {
mNpcNo = getPrmNpcNo();
m747 = 0;
m746 = 0;
m718 = 0.0f;
m72C = 0;
m71C = -1.0f;
m74F = 0;
m728 = 1;
m732 = home.angle.y;
m74A = 0;
m736 = 0;
}
/* 000005D8-000006F4 .text daNpc_Mt_nodeCallBack__FP7J3DNodei */
static BOOL daNpc_Mt_nodeCallBack(J3DNode* node, int calcTiming) {
if (calcTiming == 0) {
J3DModel* model = j3dSys.getModel();
daNpcMt_c* i_this = (daNpcMt_c*)model->getUserArea();
J3DJoint* joint = (J3DJoint*)node;
s32 jntNo = joint->getJntNo();
MTXCopy(model->getAnmMtx(jntNo), *calc_mtx);
if(jntNo == i_this->m_jnt.getHeadJntNum()) {
cMtx_XrotM(*calc_mtx, (s16)i_this->m_jnt.getHead_y());
cMtx_ZrotM(*calc_mtx, (s16)-i_this->m_jnt.getHead_x());
}
else if(jntNo == i_this->m_jnt.getBackboneJntNum()) {
cMtx_XrotM(*calc_mtx, (s16)i_this->m_jnt.getBackbone_y());
cMtx_ZrotM(*calc_mtx, (s16)-i_this->m_jnt.getBackbone_x());
}
model->setAnmMtx(jntNo, *calc_mtx);
MTXCopy(*calc_mtx, J3DSys::mCurrentMtx);
}
return TRUE;
}
/* 000006F4-00000714 .text CheckCreateHeap__FP10fopAc_ac_c */
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
return static_cast<daNpcMt_c*>(i_this)->createHeap();
}
/* 00000714-00000858 .text phase_1__FP9daNpcMt_c */
static cPhs_State phase_1(daNpcMt_c* i_this) {
BOOL bVar1 = FALSE;
cPhs_State phase_state = cPhs_NEXT_e;
fopAcM_ct(i_this, daNpcMt_c);
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3D08)) {
bVar1 = TRUE;
}
else if (!dComIfGp_getStartStagePoint()) {
if (i_this->isComp()) {
bVar1 = TRUE;
dComIfGs_onEventBit(dSv_event_flag_c::UNK_3D08);
}
else {
dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0202);
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4080)) {
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_2F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4040);
}
}
}
if (bVar1) {
i_this->setFigure(0x40);
phase_state = cPhs_STOP_e;
}
else {
i_this->setResFlag(1);
phase_state = cPhs_NEXT_e;
}
return phase_state;
}
/* 00000858-000008D8 .text phase_2__FP9daNpcMt_c */
static cPhs_State phase_2(daNpcMt_c* i_this) {
cPhs_State phase_state = dComIfG_resLoad(i_this->getPhaseP(), l_arcname_tbl[i_this->getNpcNo()]);
if (phase_state == cPhs_COMPLEATE_e) {
if (fopAcM_entrySolidHeap(i_this, CheckCreateHeap, 0x2900)) {
return i_this->createInit();
} else {
#if VERSION > VERSION_DEMO
i_this->mpMorf = NULL;
#endif
return cPhs_ERROR_e;
}
}
return phase_state;
}
/* 000008D8-00000908 .text _create__9daNpcMt_cFv */
cPhs_State daNpcMt_c::_create() {
static cPhs__Handler l_method[] = {
(cPhs__Handler)phase_1,
(cPhs__Handler)phase_2,
NULL,
};
return dComLbG_PhaseHandler(&mPhs, l_method, this);
}
/* 00000908-00000B98 .text createHeap__9daNpcMt_cFv */
BOOL daNpcMt_c::createHeap() {
J3DModelData* modelData = (J3DModelData *)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bmd_ix_tbl[mNpcNo]);
mpMorf = new mDoExt_McaMorf(
modelData,
NULL, NULL,
(J3DAnmTransform*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[m74A]),
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, NULL,
0x80000, 0x11020022
);
m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head"));
JUT_ASSERT(DEMO_SELECT(904, 905), m_jnt.getHeadJntNum() >= 0);
m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone"));
JUT_ASSERT(DEMO_SELECT(908, 909), m_jnt.getBackboneJntNum() >= 0);
if (!initTexPatternAnm(false)) {
return FALSE;
}
for(u16 i = 0; i < modelData->getJointNum(); i++) {
if(i == m_jnt.getHeadJntNum() || i == m_jnt.getBackboneJntNum()) {
modelData->getJointNodePointer(i)->setCallBack(daNpc_Mt_nodeCallBack);
}
}
mpMorf->getModel()->setUserArea((u32)this);
mAcchCir.SetWall(30.0f, 30.0f);
mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this));
return TRUE;
}
/* 00000B98-00000BB8 .text daNpcMt_XyCheckCB__FPvi */
static s16 daNpcMt_XyCheckCB(void* i_this, int i_itemBtn) {
return ((daNpcMt_c*)i_this)->XyCheckCB(i_itemBtn);
}
/* 00000BB8-00000DEC .text createInit__9daNpcMt_cFv */
cPhs_State daNpcMt_c::createInit() {
#if VERSION == VERSION_DEMO
mStts.Init(0xFF, 0xFF, this);
mCyl.Set(dNpc_cyl_src);
mCyl.SetStts(&mStts);
setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].field_0x30, 150.0f);
#endif
gravity = -9.0f;
setAnmTbl(l_npc_anm_wait);
mMtGetItemEventIdx = dComIfGp_evmng_getEventIdx("MT_GET_ITEM", 0xff);
eventInfo.mpCheckCB = daNpcMt_XyCheckCB;
mEventCut.setActorInfo2(l_npc_staff_id[mNpcNo], this);
#if VERSION == VERSION_DEMO
setMtx();
#endif
m73E = 0;
m742 = 0;
m743 = 0;
m752 = 0;
attnOff();
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
fopAcM_setCullSizeBox(this, -70.0f, 0.0f, -70.0f, 70.0f, 200.0f, 70.0f);
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0x6E;
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0x6E;
attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_UNK1000000_e;
m_jnt.setParam(
l_npc_dat[mNpcNo].mMax_backbone_x,
l_npc_dat[mNpcNo].mMax_backbone_y,
l_npc_dat[mNpcNo].mMin_backbone_x,
l_npc_dat[mNpcNo].mMin_backbone_y,
l_npc_dat[mNpcNo].mMax_head_x,
l_npc_dat[mNpcNo].mMax_head_y,
l_npc_dat[mNpcNo].mMin_head_x,
l_npc_dat[mNpcNo].mMin_head_y,
l_npc_dat[mNpcNo].mMax_turn_step
);
m750 = l_npc_dat[mNpcNo].field_0x4A;
m751 = l_npc_dat[mNpcNo].field_0x4B;
m720 = l_npc_dat[mNpcNo].field_0x20;
m730 = l_npc_dat[mNpcNo].field_0x28;
mObjAcch.CrrPos(*dComIfG_Bgsp());
#if VERSION > VERSION_DEMO
setMtx();
mpMorf->getModel()->calc();
mStts.Init(0xFF, 0xFF, this);
mCyl.Set(dNpc_cyl_src);
mCyl.SetStts(&mStts);
setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].field_0x30, 150.0f);
#endif
return cPhs_COMPLEATE_e;
}
/* 00000DEC-00000F6C .text _delete__9daNpcMt_cFv */
bool daNpcMt_c::_delete() {
#if VERSION == VERSION_DEMO
if (m747 != 0) {
dComIfG_resDeleteDemo(&mPhsArcname, l_arcname_tbl[mNpcNo]);
}
if(mpMorf != NULL){
mpMorf->stopZelAnime();
}
#else
dComIfG_resDeleteDemo(&mPhsArcname, l_arcname_tbl[mNpcNo]);
if(heap != NULL && mpMorf != NULL){
mpMorf->stopZelAnime();
}
#endif
if(dComIfGp_isEnableNextStage()){
int roomId;
for(roomId = 1; roomId <= 7; roomId++) {
if(!strcmp(dComIfGp_getNextStageName(), l_figure_room_name[roomId])) {
break;
}
}
if (roomId <= 7) {
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4080)) {
int temp = dSnap_GetFigRoomId(dComIfGs_getEventReg(dSv_event_flag_c::UNK_A9FF));
if(temp == roomId) {
dComIfGs_onEventBit(dSv_event_flag_c::UNK_3F01);
}
}
} else {
dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0202);
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4080)) {
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_2F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4040);
}
}
}
return true;
}
/* 00000F6C-0000107C .text _draw__9daNpcMt_cFv */
bool daNpcMt_c::_draw() {
J3DModel* model = mpMorf->getModel();
J3DModelData *model_data = model->getModelData();
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &current.pos, &tevStr);
g_env_light.setLightTevColorType(model, &tevStr);
mBtpAnm.entry(model_data, mFrame);
mpMorf->updateDL();
mBtpAnm.remove(model_data);
cXyz shadowPos(
current.pos.x,
current.pos.y + 150.0f,
current.pos.z
);
mShadowId = dComIfGd_setShadow(
mShadowId, 1, mpMorf->getModel(), &shadowPos, 800.0f, 20.0f,
current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr
);
dSnap_RegistFig(DSNAP_TYPE_NPC_MT, this, 1.0f, 1.0f, 1.0f);
return true;
}
static daNpcMt_c::InitFunc_t l_execute_init[] = {
&daNpcMt_c::executeWaitInit,
&daNpcMt_c::executeTalkInit,
};
static daNpcMt_c::MoveFunc_t moveProc[] = {
&daNpcMt_c::executeWait,
&daNpcMt_c::executeTalk,
};
/* 0000107C-000011D0 .text _execute__9daNpcMt_cFv */
bool daNpcMt_c::_execute() {
chkAttention();
checkOrder();
if (!dComIfGp_event_runCheck() || eventInfo.checkCommandTalk()) {
(this->*moveProc[m746])();
} else {
eventMove();
}
eventOrder();
playTexPatternAnm();
playAnm();
setCollision(&mCyl, current.pos, l_npc_dat[mNpcNo].field_0x30, 150.0f);
attention_info.position.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].field_0x18, current.pos.z);
eyePos.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].field_0x1C, current.pos.z);
lookBack();
setMtx();
return false;
}
/* 000011D0-00001240 .text executeCommon__9daNpcMt_cFv */
BOOL daNpcMt_c::executeCommon() {
if (m743) {
m744 = 1;
}
else {
m744 = 0;
}
if (m742 == 1 && m746 != 1) {
executeSetMode(1);
}
return m742;
}
/* 00001240-00001294 .text executeSetMode__9daNpcMt_cFUc */
void daNpcMt_c::executeSetMode(u8 param_1) {
m718 = 0.0f;
m746 = (this->*l_execute_init[param_1])();
}
/* 00001294-00001320 .text executeWaitInit__9daNpcMt_cFv */
s32 daNpcMt_c::executeWaitInit() {
speedF = 0.0f;
setAnmTbl(l_npc_anm_wait);
m_jnt.setParam(
l_npc_dat[mNpcNo].mMax_backbone_x,
l_npc_dat[mNpcNo].mMax_backbone_y,
l_npc_dat[mNpcNo].mMin_backbone_x,
l_npc_dat[mNpcNo].mMin_backbone_y,
l_npc_dat[mNpcNo].mMax_head_x,
l_npc_dat[mNpcNo].mMax_head_y,
l_npc_dat[mNpcNo].mMin_head_x,
l_npc_dat[mNpcNo].mMin_head_y,
l_npc_dat[mNpcNo].mMax_turn_step
);
return FALSE;
}
/* 00001320-00001368 .text executeWait__9daNpcMt_cFv */
void daNpcMt_c::executeWait() {
executeCommon();
if(m74A) {
setAnmTbl(l_npc_anm_wait);
}
}
/* 00001368-00001370 .text executeTalkInit__9daNpcMt_cFv */
s32 daNpcMt_c::executeTalkInit() {
return TRUE;
}
/* 00001370-000013E8 .text executeTalk__9daNpcMt_cFv */
void daNpcMt_c::executeTalk() {
executeCommon();
if(talk2(1) == fopMsgStts_BOX_CLOSED_e) {
m742 = 0;
executeSetMode(0);
dComIfGp_event_reset();
}
else {
setAnmFromMsgTag();
}
}
/* 000013E8-00001480 .text checkOrder__9daNpcMt_cFv */
void daNpcMt_c::checkOrder() {
if(eventInfo.checkCommandDemoAccrpt()) {
if(dComIfGp_evmng_startCheck(mMtGetItemEventIdx) && m744 == 3) {
m744 = 0;
}
}
else if (eventInfo.checkCommandTalk() && (m744 == 2 || m744 == 1)) {
m742 = 1;
executeSetMode(1);
}
}
/* 00001480-0000150C .text eventOrder__9daNpcMt_cFv */
void daNpcMt_c::eventOrder() {
if(m744 == 2 || m744 == 1) {
eventInfo.onCondition(dEvtCnd_CANTALK_e);
eventInfo.onCondition(dEvtCnd_CANTALKITEM_e);
if(m744 == 2) {
fopAcM_orderSpeakEvent(this);
}
}
else if(m744 == 3) {
fopAcM_orderChangeEventId(dComIfGp_getPlayer(0), this, mMtGetItemEventIdx, 0, 0xffff);
}
}
/* 0000150C-00001580 .text eventMove__9daNpcMt_cFv */
void daNpcMt_c::eventMove() {
if(!chkEndEvent()) {
bool oldFlag = mEventCut.getAttnFlag();
if(mEventCut.cutProc()) {
if(!mEventCut.getAttnFlag()) {
mEventCut.setAttnFlag(oldFlag);
}
}
else {
privateCut();
setAnmFromMsgTag();
}
}
}
/* 00001580-000016B0 .text privateCut__9daNpcMt_cFv */
void daNpcMt_c::privateCut() {
static char* cut_name_tbl[] = {
"MES_SET",
"GET_ITEM",
};
int staffIdx = dComIfGp_evmng_getMyStaffId(l_npc_staff_id[mNpcNo]);
if(staffIdx != -1) {
m74D = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0);
if(m74D == -1) {
dComIfGp_evmng_cutEnd(staffIdx);
return;
}
if(dComIfGp_evmng_getIsAddvance(staffIdx)) {
switch(m74D) {
case 0:
eventMesSetInit(staffIdx);
break;
case 1:
eventGetItemInit();
break;
}
}
bool temp;
switch(m74D) {
case 0:
temp = eventMesSet();
break;
default:
temp = true;
}
if(temp) {
dComIfGp_evmng_cutEnd(staffIdx);
}
}
}
/* 000016B0-00001788 .text eventMesSetInit__9daNpcMt_cFi */
void daNpcMt_c::eventMesSetInit(int staffIdx) {
int* pData = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo");
if(pData) {
mpMsgTbl = NULL;
int msg = *pData;
switch(msg){
case 1:
break;
case 0:
setMessage(getMsg());
break;
default:
setMessage(msg);
}
if (mpMsgTbl != NULL) {
setMessage(*mpMsgTbl);
}
}
else {
mpMsgTbl++;
setMessage(*mpMsgTbl);
}
}
/* 00001788-0000181C .text eventMesSet__9daNpcMt_cFv */
bool daNpcMt_c::eventMesSet() {
u16 temp = talk2(0);
if (temp == fopMsgStts_BOX_CLOSED_e) {
if(m749 & 1) {
m749 &= ~1;
mItemNo = 7;
m744 = 3;
}
else if (m749 & 2) {
m749 &= ~2;
mItemNo = 5;
m744 = 3;
}
}
return temp == fopMsgStts_BOX_CLOSED_e;
}
/* 0000181C-00001874 .text eventGetItemInit__9daNpcMt_cFv */
void daNpcMt_c::eventGetItemInit() {
fpc_ProcID itemID = fopAcM_createItemForPresentDemo(&current.pos, mItemNo, 0, -1, -1);
if (itemID != fpcM_ERROR_PROCESS_ID_e) {
dComIfGp_event_setItemPartnerId(itemID);
}
}
/* 00001874-000019BC .text talk2__9daNpcMt_cFi */
u16 daNpcMt_c::talk2(int i_param) {
u16 status = 0xFF;
if(mCurrMsgBsPcId == fpcM_ERROR_PROCESS_ID_e) {
if(i_param == 1) {
mCurrMsgNo = getMsg();
}
mCurrMsgBsPcId = fopMsgM_messageSet(mCurrMsgNo, this);
mpCurrMsg = NULL;
m734 = -1;
}
else if(mpCurrMsg) {
status = mpCurrMsg->mStatus;
switch(status) {
case fopMsgStts_MSG_DISPLAYED_e:
mpCurrMsg->mStatus = next_msgStatus(&mCurrMsgNo);
if(mpCurrMsg->mStatus == fopMsgStts_MSG_CONTINUES_e) {
fopMsgM_messageSet(mCurrMsgNo);
}
break;
case fopMsgStts_MSG_TYPING_e:
if (m734 == fopMsgStts_MSG_CONTINUES_e) {
chkMsg();
}
break;
case fopMsgStts_BOX_CLOSED_e:
mpCurrMsg->mStatus = fopMsgStts_MSG_DESTROYED_e;
mCurrMsgBsPcId = -1;
break;
}
m734 = status;
anmAtr(status);
} else {
mpCurrMsg = fopMsgM_SearchByID(mCurrMsgBsPcId);
}
return status;
}
/* 000019BC-00001A8C .text next_msgStatus__9daNpcMt_cFPUl */
u16 daNpcMt_c::next_msgStatus(u32* pMsgNo) {
u16 status = fopMsgStts_MSG_CONTINUES_e;
if (mpMsgTbl) {
mpMsgTbl++;
switch(*mpMsgTbl) {
case 2:
dPb_erasePicture();
case 0:
mpMsgTbl = NULL;
status = fopMsgStts_MSG_ENDS_e;
break;
case 1:
*pMsgNo = l_msg_mt_room[dSnap_GetFigRoomId(dComIfGs_getEventReg(dSv_event_flag_c::UNK_A9FF))];
break;
default:
*pMsgNo = *mpMsgTbl;
break;
}
}
else {
status = fopMsgStts_MSG_ENDS_e;
}
return status;
}
/* 00001A8C-00001FC8 .text getMsg__9daNpcMt_cFv */
u32 daNpcMt_c::getMsg() {
u32 msgNo = 0;
mpMsgTbl = NULL;
if (g_dComIfG_gameInfo.play.getEvent()->chkPhoto()){
u8 photoNo = changePhotoNo(dComIfGp_getPictureResult());
if ((photoNo <= DSNAP_TYPE_UNK48) || (photoNo >= DSNAP_TYPE_UNKCF)) {
photoNo = 0xff;
}
else {
photoNo = dSnap_PhotoIndex2TableIndex(photoNo);
}
if (dComIfGp_getPictureFormat() == GX_TF_I4 || dComIfGp_getPictureFormat() == GX_TF_I8) {
mpMsgTbl = l_msg_mt_no_color;
}
else if (photoNo == 0xff) {
mpMsgTbl = l_msg_mt_no_figure;
}
else if (isFigureGet(photoNo)) {
mpMsgTbl = l_msg_mt_maked;
}
else if (dComIfGp_getPictureResultDetail() == 1) {
mpMsgTbl = l_msg_mt_face_ng;
}
else if (dComIfGp_getPictureResultDetail() == 2) {
mpMsgTbl = l_msg_mt_body_ng;
}
// !@bug: dComIfGp_getPictureResultDetail() == 3 is never checked
else {
dComIfGs_onEventBit(dSv_event_flag_c::UNK_2F01);
dComIfGs_onEventBit(dSv_event_flag_c::UNK_3401);
dComIfGs_setEventReg(dSv_event_flag_c::UNK_A9FF, photoNo);
s32 bVar1 = 0;
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_3A01)) {
bVar1 = 1;
}
switch(photoNo) {
case DSNAP_TYPE_NPC_PHOTO:
mpMsgTbl = l_msg_mt_make_mt[bVar1];
break;
case DSNAP_TYPE_NPC_RSH1:
mpMsgTbl = l_msg_mt_make_mn[bVar1];
break;
default:
mpMsgTbl = l_msg_mt_make[bVar1];
}
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4080)) {
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4040);
}
}
}
else if (dComIfGp_event_chkTalkXY()) {
} else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_3080)) {
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4080) == 0) {
if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_3A01)) {
mpMsgTbl = l_msg_mt_1st_kansei;
}
else {
mpMsgTbl = l_msg_mt_2nd_kansei;
}
u8 evReg = dComIfGs_getEventReg(dSv_event_flag_c::UNK_A9FF);
setFigure(evReg);
if (evReg == (u8)dSnap_PhotoIndex2TableIndex(0x4a)) {
setFigure(dSnap_PhotoIndex2TableIndex(0x49));
}
else if (evReg == (u8)dSnap_PhotoIndex2TableIndex(0x72)) {
setFigure(dSnap_PhotoIndex2TableIndex(0x73));
setFigure(dSnap_PhotoIndex2TableIndex(0x74));
setFigure(dSnap_PhotoIndex2TableIndex(0x75));
setFigure(dSnap_PhotoIndex2TableIndex(0x76));
setFigure(dSnap_PhotoIndex2TableIndex(0x77));
setFigure(dSnap_PhotoIndex2TableIndex(0x78));
}
#if VERSION > VERSION_DEMO
else if (evReg == (u8)dSnap_PhotoIndex2TableIndex(0x8c)) {
setFigure(dSnap_PhotoIndex2TableIndex(0x8d));
}
else if (evReg == (u8)dSnap_PhotoIndex2TableIndex(0x88)) {
setFigure(dSnap_PhotoIndex2TableIndex(0x87));
}
#endif
dComIfGs_onEventBit(dSv_event_flag_c::UNK_4080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_2F01);
}
else if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_3F01)) {
mpMsgTbl = l_msg_mt_gallery;
}
else if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_4040) == 0) {
dComIfGs_onEventBit(dSv_event_flag_c::UNK_4040);
mpMsgTbl = l_msg_mt_room_in;
}
else {
mpMsgTbl = l_msg_mt_kansei_end;
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4080);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_3F01);
dComIfGs_offEventBit(dSv_event_flag_c::UNK_4040);
dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0202);
}
}
else if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2F01)) {
mpMsgTbl = l_msg_mt_making;
}
else if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2F02)) {
dComIfGs_onEventBit(dSv_event_flag_c::UNK_2F02);
mpMsgTbl = l_msg_mt_1st_talk;
}
else if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_3A01)) {
mpMsgTbl = l_msg_mt_2nd_talk;
}
else if(!dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0202)) {
dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0202);
mpMsgTbl = l_msg_mt_3rd_talk;
}
else {
mpMsgTbl = l_msg_mt_4th_talk;
}
if (mpMsgTbl != NULL) {
msgNo = *mpMsgTbl;
}
return msgNo;
}
/* 00001FC8-00001FCC .text chkMsg__9daNpcMt_cFv */
void daNpcMt_c::chkMsg() {
return;
}
/* 00001FCC-00001FD4 .text setMessage__9daNpcMt_cFUl */
void daNpcMt_c::setMessage(u32 msgNo) {
mCurrMsgNo = msgNo;
}
/* 00001FD4-00002084 .text setAnmFromMsgTag__9daNpcMt_cFv */
void daNpcMt_c::setAnmFromMsgTag() {
switch(dComIfGp_getMesgAnimeAttrInfo()) {
case 0:
setAnmTbl(l_npc_anm_wait);
break;
case 1:
setAnmTbl(l_npc_anm_talk);
break;
case 2:
setAnmTbl(l_npc_anm_talk2);
break;
case 3:
setAnmTbl(l_npc_anm_talk3);
break;
case 4:
setAnmTbl(l_npc_anm_talk4);
break;
case 5:
setAnmTbl(l_npc_anm_talk5);
break;
case 6:
setAnmTbl(l_npc_anm_tukuru);
break;
}
dComIfGp_setMesgAnimeAttrInfo(0xff);
}
/* 00002084-000020A4 .text getPrmNpcNo__9daNpcMt_cFv */
u8 daNpcMt_c::getPrmNpcNo() {
if(0 <= argument && argument < 1) {
return argument;
}
return 0;
}
/* 000020A4-0000212C .text setMtx__9daNpcMt_cFv */
void daNpcMt_c::setMtx() {
mpMorf->getModel()->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(current.angle.y);
mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
}
/* 0000212C-00002474 .text chkAttention__9daNpcMt_cFv */
void daNpcMt_c::chkAttention() {
m752 = 0;
if(mEventCut.getAttnFlag()) {
mLookAtPos = mEventCut.getAttnPos();
m74F = 1;
if(m750 != 0) {
m728 = false;
m_jnt.setTrn();
}
else {
m728 = true;
}
if(m743 == 0) {
m743 = 1;
}
}
else {
fopAc_ac_c* player = dComIfGp_getLinkPlayer();
f32 temp = m720;
int temp2 = m730;
f32 temp4;
s16 temp5;
dNpc_calc_DisXZ_AngY(current.pos, player->current.pos, &temp4, &temp5);
if(m743 != 0) {
temp += 40.0f;
temp2 += 0x71C;
}
temp5 -= shape_angle.y;
if(temp > temp4 && temp2 > abs(temp5)) {
mLookAtPos = dNpc_playerEyePos(l_npc_dat[mNpcNo].field_0x14);
m74F = 1;
if(m750 != 0) {
m728 = false;
}
else {
m728 = true;
}
if(m751 == 0) {
m740 = m732;
m728 = false;
m74F = 2;
m_jnt.setTrn();
}
if (m743 == 0) {
m743 = 1;
}
}
else {
if(m743 == 1) {
m743 = 0;
m72E = l_npc_dat[mNpcNo].field_0x48;
}
if(l_npc_dat[mNpcNo].field_0x24 > temp4 || m753 != 0){
mLookAtPos = dNpc_playerEyePos(l_npc_dat[mNpcNo].field_0x14);
m74F = 1;
if (m750 != 0) {
m728 = 0;
} else {
m728 = 1;
}
if (m751 == 0) {
m740 = m732;
m728 = 0;
m74F = 2;
m_jnt.setTrn();
}
m752 = 1;
} else {
m74F = 0;
if(m6F0 == 0) {
if(m72E) {
m72E--;
}
else {
m740 = m732;
m728 = false;
m74F = 2;
m_jnt.setTrn();
}
}
}
}
}
m73C = l_npc_dat[mNpcNo].field_0x2A;
}
/* 00002474-000025C0 .text lookBack__9daNpcMt_cFv */
void daNpcMt_c::lookBack() {
short target = m73C;
short desiredYRot = current.angle.y;
cXyz* dstTemp = NULL;
cXyz temp2;
cXyz dstPos = eyePos;
bool headOnlyFollow = m728;
switch(m74F) {
case 1:
temp2 = mLookAtPos;
dstTemp = &temp2;
break;
case 2:
desiredYRot = m740;
break;
case 0:
default:
break;
}
if (m742 && m750) {
headOnlyFollow = false;
m_jnt.setTrn();
}
if (m_jnt.trnChk()) {
if(mEventCut.getTurnSpeed() != 0) {
target = mEventCut.getTurnSpeed();
}
cLib_addCalcAngleS2(&m73E, target, 4, 0x800);
} else {
m73E = 0;
}
m_jnt.lookAtTarget(&current.angle.y, dstTemp, dstPos, desiredYRot, m73E, headOnlyFollow);
shape_angle = current.angle;
}
/* 000025C0-000026D8 .text initTexPatternAnm__9daNpcMt_cFb */
BOOL daNpcMt_c::initTexPatternAnm(bool i_modify) {
J3DModelData *modelData = mpMorf->getModel()->getModelData();
m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_btp_ix_tbl[mNpcNo]);
JUT_ASSERT(DEMO_SELECT(2032, 2049), 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;
}
mFrame = 0;
mTimer = 0;
return TRUE;
}
/* 000026D8-00002744 .text playTexPatternAnm__9daNpcMt_cFv */
void daNpcMt_c::playTexPatternAnm() {
if(cLib_calcTimer(&mTimer) == 0) {
if(mFrame >= m_head_tex_pattern->getFrameMax()) {
mFrame -= m_head_tex_pattern->getFrameMax();
mTimer = 0x78;
}
else {
mFrame++;
}
}
}
/* 00002744-0000280C .text playAnm__9daNpcMt_cFv */
void daNpcMt_c::playAnm() {
mAnmFlag &= ~1;
if(mpMorf->play(0, 0, 0)) {
if(mpAnmDat) {
if(m74C > 0) {
m74C--;
if(m74C == 0) {
mpAnmDat++;
if(setAnmTbl(mpAnmDat)) {
mAnmFlag |= 1;
}
}
else {
setAnm(mpAnmDat->field_0x00, 0, 0.0f);
}
}
}
}
}
/* 0000280C-000028E4 .text setAnm__9daNpcMt_cFUcif */
void daNpcMt_c::setAnm(u8 param_1, int param_2, f32 morf) {
if (m71C >= 0.0f) {
morf = m71C;
m71C = -1.0f;
}
mpMorf->setAnm(
(J3DAnmTransformKey*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[param_1]),
param_2, morf, 1.0f, 0.0f, -1.0f, NULL
);
m74A = param_1;
}
/* 000028E4-00002984 .text setAnmTbl__9daNpcMt_cFP9sMtAnmDat */
bool daNpcMt_c::setAnmTbl(sMtAnmDat* anmDat) {
if (anmDat->field_0x00 == 0xFF) {
mpAnmDat = NULL;
return true;
}
else {
mpAnmDat = anmDat;
m74C = mpAnmDat->field_0x02;
int temp = 2;
if (m74C > 0) {
temp = 0;
}
if (m74A != mpAnmDat->field_0x00 || temp == 0) {
setAnm(mpAnmDat->field_0x00, temp, mpAnmDat->field_0x01);
}
return false;
}
}
/* 00002984-00002A28 .text XyCheckCB__9daNpcMt_cFi */
s16 daNpcMt_c::XyCheckCB(int i_itemBtn) {
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2F02) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_2F01)) {
u8 itemNo = dComIfGp_getSelectItem(i_itemBtn);
if(itemNo == dItemNo_PICTO_BOX_e || itemNo == dItemNo_DELUXE_PICTO_BOX_e){
if(dComIfGs_getPictureNum()){
return true;
}
}
}
return false;
}
/* 00002A28-00002AA0 .text setCollision__9daNpcMt_cFP8dCcD_Cyl4cXyzff */
void daNpcMt_c::setCollision(dCcD_Cyl* cyl, cXyz center, f32 radius, f32 height) {
cyl->SetC(center);
cyl->SetR(radius);
cyl->SetH(height);
dComIfG_Ccsp()->Set(cyl);
}
/* 00002AA0-00002AFC .text chkEndEvent__9daNpcMt_cFv */
BOOL daNpcMt_c::chkEndEvent() {
if (dComIfGp_evmng_endCheck(mMtGetItemEventIdx)) {
g_dComIfG_gameInfo.play.getEvent()->onEventFlag(8);
return TRUE;
}
return FALSE;
}
/* 00002AFC-00002B98 .text isFigureGet__9daNpcMt_cFUc */
u8 daNpcMt_c::isFigureGet(u8 figureNo) {
if(figureNo >= TOTAL_FIGURE_COUNT){
return false;
}
if(figureNo / 8 < 0x11) {
int r31 = (figureNo % 8);
u8 reg = dComIfGs_getEventReg(l_figure_comp[figureNo / 8]);
u32 ret = reg & (1 << r31);
return ret;
}
return false;
}
/* 00002B98-00002C38 .text setFigure__9daNpcMt_cFUc */
void daNpcMt_c::setFigure(u8 figure) {
if(figure < TOTAL_FIGURE_COUNT) {
u32 r28 = figure % 8;
u8 reg = dComIfGs_getEventReg(l_figure_comp[figure / 8]);
reg |= 1 << r28;
dComIfGs_setEventReg(l_figure_comp[figure / 8], reg);
dComIfGs_onEventBit(dSv_event_flag_c::UNK_3A01);
}
}
/* 00002C38-00002CA0 .text getFigureMakeNum__9daNpcMt_cFv */
int daNpcMt_c::getFigureMakeNum() {
int num = 0;
for(u8 i = 0; i < TOTAL_FIGURE_COUNT; i++) {
if(isFigureGet(i)) {
num++;
}
}
return num;
}
/* 00002CA0-00002D08 .text isComp__9daNpcMt_cFv */
BOOL daNpcMt_c::isComp() {
int ownedNum = getFigureMakeNum();
int totalNum = 0x84;
if(isFigureGet(0x32)) {
totalNum = 0x85;
}
if(ownedNum >= totalNum) {
return true;
}
return false;
}
/* 00002D08-00002D4C .text changePhotoNo__9daNpcMt_cFUc */
u8 daNpcMt_c::changePhotoNo(u8 photoNo) {
switch(photoNo) {
case DSNAP_TYPE_BIKUTSUKI:
photoNo = DSNAP_TYPE_NPC_UO2;
break;
case DSNAP_TYPE_UNK04:
photoNo = DSNAP_TYPE_NPC_UW2;
break;
case DSNAP_TYPE_UNK06:
photoNo = DSNAP_TYPE_NPC_UB4;
break;
}
return photoNo;
}
/* 00002D4C-00002D6C .text daNpc_MtCreate__FPv */
static cPhs_State daNpc_MtCreate(void* i_this) {
return ((daNpcMt_c*)i_this)->_create();
}
/* 00002D6C-00002D90 .text daNpc_MtDelete__FPv */
static BOOL daNpc_MtDelete(void* i_this) {
return ((daNpcMt_c*)i_this)->_delete();
}
/* 00002D90-00002DB4 .text daNpc_MtExecute__FPv */
static BOOL daNpc_MtExecute(void* i_this) {
return ((daNpcMt_c*)i_this)->_execute();
}
/* 00002DB4-00002DD8 .text daNpc_MtDraw__FPv */
static BOOL daNpc_MtDraw(void* i_this) {
return ((daNpcMt_c*)i_this)->_draw();
}
/* 00002DD8-00002DE0 .text daNpc_MtIsDelete__FPv */
static BOOL daNpc_MtIsDelete(void*) {
return TRUE;
}
static actor_method_class daNpc_MtMethodTable = {
(process_method_func)daNpc_MtCreate,
(process_method_func)daNpc_MtDelete,
(process_method_func)daNpc_MtExecute,
(process_method_func)daNpc_MtIsDelete,
(process_method_func)daNpc_MtDraw,
};
actor_process_profile_definition g_profile_NPC_MT = {
/* Layer ID */ fpcLy_CURRENT_e,
/* List ID */ 0x0007,
/* List Prio */ fpcPi_CURRENT_e,
/* Proc Name */ fpcNm_NPC_MT_e,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(daNpcMt_c),
/* Size Other */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Draw Prio */ fpcDwPi_NPC_MT_e,
/* Actor SubMtd */ &daNpc_MtMethodTable,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* Cull Type */ fopAc_CULLBOX_CUSTOM_e,
};