mirror of
https://github.com/zeldaret/tww.git
synced 2026-08-18 05:08:57 -04:00
1710 lines
52 KiB
C++
1710 lines
52 KiB
C++
/**
|
|
* d_a_npc_bmsw.cpp
|
|
* NPC - Koboli (Rito mail sorter)
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_npc_bmsw.h"
|
|
#include "res/Object/Bmsw.h"
|
|
#include "d/d_shop.h"
|
|
#include "d/d_snap.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_cc_d.h"
|
|
#include "SSystem/SComponent/c_angle.h"
|
|
#include "f_op/f_op_camera.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
#include "m_Do/m_Do_hostIO.h"
|
|
|
|
class daNpc_Bmsw_HIO_c : public JORReflexible {
|
|
public:
|
|
daNpc_Bmsw_HIO_c();
|
|
virtual ~daNpc_Bmsw_HIO_c() {}
|
|
|
|
void genMessage(JORMContext* ctx) {}
|
|
|
|
public:
|
|
/* 0x04 */ s8 mNo;
|
|
/* 0x05 */ u8 field_0x05[0x08 - 0x05];
|
|
/* 0x08 */ dNpc_HIO_c mNpc;
|
|
/* 0x30 */ s16 field_0x30;
|
|
/* 0x32 */ s16 field_0x32;
|
|
/* 0x34 */ s16 field_0x34;
|
|
/* 0x36 */ s16 r_1;
|
|
/* 0x38 */ s16 g_1;
|
|
/* 0x3A */ s16 b_1;
|
|
/* 0x3C */ s16 r_2;
|
|
/* 0x3E */ s16 g_2;
|
|
/* 0x40 */ s16 b_2;
|
|
/* 0x42 */ u8 field_0x42[0x44 - 0x42];
|
|
/* 0x44 */ f32 field_0x44;
|
|
/* 0x48 */ f32 field_0x48;
|
|
/* 0x4C */ f32 field_0x4C;
|
|
/* 0x50 */ f32 field_0x50;
|
|
/* 0x54 */ f32 field_0x54;
|
|
}; // Size: 0x58
|
|
|
|
static daNpc_Bmsw_HIO_c l_HIO;
|
|
|
|
|
|
static dCcD_SrcCyl l_cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG,
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsGrpAll_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 30.0f,
|
|
/* Height */ 80.0f,
|
|
}},
|
|
};
|
|
|
|
/* 000000EC-000001E4 .text __ct__16daNpc_Bmsw_HIO_cFv */
|
|
daNpc_Bmsw_HIO_c::daNpc_Bmsw_HIO_c() {
|
|
mNpc.m04 = -20.0f;
|
|
mNpc.mMaxHeadX = 0x1FFE;
|
|
mNpc.mMaxHeadY = 3000;
|
|
mNpc.mMaxBackboneX = 0;
|
|
mNpc.mMaxBackboneY = 0x1C70;
|
|
mNpc.mMinHeadX = -0x9C4;
|
|
mNpc.mMinHeadY = -3000;
|
|
mNpc.mMinBackboneX = 0;
|
|
mNpc.mMinBackboneY = -0x1C70;
|
|
mNpc.mMaxTurnStep = 0x1000;
|
|
mNpc.mMaxHeadTurnVel = 0x800;
|
|
mNpc.mAttnYOffset = 50.0f;
|
|
mNpc.mMaxAttnAngleY = 0x2000;
|
|
mNpc.m22 = 0;
|
|
mNpc.mMaxAttnDistXZ = 300.0f;
|
|
|
|
field_0x30 = 0x1E;
|
|
field_0x32 = 0xF;
|
|
field_0x34 = 0x3C;
|
|
r_1 = 192;
|
|
g_1 = 174;
|
|
b_1 = 192;
|
|
r_2 = 192;
|
|
g_2 = 174;
|
|
b_2 = 192;
|
|
field_0x44 = 40.0f;
|
|
field_0x48 = 80.0f;
|
|
field_0x4C = 50.0f;
|
|
field_0x50 = 0.8f;
|
|
field_0x54 = 0.75f;
|
|
mNo = -1;
|
|
}
|
|
|
|
|
|
static const s32 l_bck_ix_tbl[] = {
|
|
dRes_ID_BMSW_BCK_BM_WAIT01_e, dRes_ID_BMSW_BCK_BM_WAIT02_e, dRes_ID_BMSW_BCK_BM_TALK01_e, dRes_ID_BMSW_BCK_BM_TALK02_e,
|
|
dRes_ID_BMSW_BCK_BM_TALK03_e, dRes_ID_BMSW_BCK_BM_SHIWAKE01_e, dRes_ID_BMSW_BCK_BM_SHIWAKE02_e,
|
|
};
|
|
static const s32 l_arm_bck_ix_tbl[] = {
|
|
dRes_ID_BMSW_BCK_BMARM_WAIT01_e, dRes_ID_BMSW_BCK_BMARM_WAIT02_e, dRes_ID_BMSW_BCK_BMARM_TALK01_e, dRes_ID_BMSW_BCK_BMARM_TALK02_e,
|
|
dRes_ID_BMSW_BCK_BMARM_TALK03_e, dRes_ID_BMSW_BCK_BMARM_SHIWAKE01_e, dRes_ID_BMSW_BCK_BMARM_SHIWAKE02_e,
|
|
};
|
|
|
|
static const u32 l_btp_ix_tbl[] = {dRes_ID_BMSW_BTP_BMHEAD11_e, dRes_ID_BMSW_BTP_BMHEAD11_e};
|
|
|
|
|
|
/* 000001E4-000003FC .text nodeCallBack__FP7J3DNodei */
|
|
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
daNpc_Bmsw_c* i_this = (daNpc_Bmsw_c*)model->getUserArea();
|
|
|
|
if (i_this != NULL) {
|
|
static cXyz a_att_pos_offst(0.0f, 0.0f, 0.0f);
|
|
static cXyz a_eye_pos_offst(26.0f, 26.0f, 0.0f);
|
|
|
|
u16 jointNo = joint->getJntNo();
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jointNo));
|
|
|
|
if (jointNo == i_this->m_neck_jnt_num) {
|
|
mDoMtx_stack_c::XrotM(i_this->m_jnt.getHead_y());
|
|
mDoMtx_stack_c::ZrotM(-i_this->m_jnt.getHead_x());
|
|
} else if (jointNo == i_this->m_jnt.getHeadJntNum()) {
|
|
mDoMtx_stack_c::multVec(&a_att_pos_offst, &i_this->getAttentionBasePos());
|
|
mDoMtx_stack_c::multVec(&a_eye_pos_offst, &i_this->eyePos);
|
|
} else if (jointNo == i_this->m_jnt.getBackboneJntNum()) {
|
|
mDoMtx_stack_c::XrotM(i_this->m_jnt.getBackbone_y());
|
|
mDoMtx_stack_c::ZrotM(-i_this->m_jnt.getBackbone_x());
|
|
} else if (jointNo == i_this->m_body_ArmL) {
|
|
cMtx_copy(mDoMtx_stack_c::get(), i_this->getArmLMtx());
|
|
} else if (jointNo == i_this->m_body_ArmR) {
|
|
cMtx_copy(mDoMtx_stack_c::get(), i_this->getArmRMtx());
|
|
}
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jointNo, mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000438-00000550 .text nodeCallBackArm__FP7J3DNodei */
|
|
static BOOL nodeCallBackArm(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
daNpc_Bmsw_c* i_this = (daNpc_Bmsw_c*)model->getUserArea();
|
|
|
|
if (i_this != NULL) {
|
|
static cXyz a_eff_pos_offst(0.0f, 0.0f, 0.0f);
|
|
u16 jointNo = joint->getJntNo();
|
|
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jointNo));
|
|
if (jointNo == i_this->m_ArmL) {
|
|
cMtx_copy(i_this->getArmLMtx(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jointNo, i_this->getArmLMtx());
|
|
} else if (jointNo == i_this->m_ArmR) {
|
|
cMtx_copy(i_this->getArmRMtx(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jointNo, i_this->getArmRMtx());
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000550-000006F4 .text daNpc_Bmsw_getGameEndMsg__Fs */
|
|
static u32 daNpc_Bmsw_getGameEndMsg(short rupees) {
|
|
u8 reg_val = dComIfGs_getEventReg(dSv_event_flag_c::UNK_C203);
|
|
u32 msgNo;
|
|
switch (reg_val) {
|
|
case 0:
|
|
if (rupees == 0) {
|
|
msgNo = 0x1A3A;
|
|
} else if (rupees == 1) {
|
|
msgNo = 0x1A3B;
|
|
} else if (rupees < 10) {
|
|
msgNo = 0x1A3C;
|
|
} else {
|
|
msgNo = 0x1A37;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (rupees == 0) {
|
|
msgNo = 0x1A4F;
|
|
} else if (rupees == 1) {
|
|
msgNo = 0x1A50;
|
|
} else if (rupees < 20) {
|
|
msgNo = 0x1A52;
|
|
} else {
|
|
msgNo = 0x1A4C;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (rupees == 0) {
|
|
msgNo = 0x1A5C;
|
|
} else if (rupees == 1) {
|
|
msgNo = 0x1A5D;
|
|
} else if (rupees < 25) {
|
|
msgNo = 0x1A60;
|
|
} else {
|
|
msgNo = 0x1A57;
|
|
}
|
|
break;
|
|
case 3:
|
|
default:
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
if (rupees == 0) {
|
|
msgNo = 0x1A69;
|
|
} else if (rupees == 1) {
|
|
msgNo = 0x1A6A;
|
|
} else if (rupees <= dComIfGs_getEventReg(dSv_event_flag_c::UNK_8AFF)) {
|
|
msgNo = 0x1A6B;
|
|
} else {
|
|
dComIfGs_setEventReg(dSv_event_flag_c::UNK_8AFF, rupees);
|
|
msgNo = 0x1A6D;
|
|
}
|
|
} else {
|
|
msgNo = 0x1A62;
|
|
}
|
|
break;
|
|
}
|
|
return msgNo;
|
|
}
|
|
|
|
/* 000006F4-00000808 .text initTexPatternAnm__12daNpc_Bmsw_cFb */
|
|
BOOL daNpc_Bmsw_c::initTexPatternAnm(bool i_modify) {
|
|
J3DModelData* modelData = field_0x6D4->getModelData();
|
|
|
|
m_head_tex_pattern = (J3DAnmTexPattern*) dComIfG_getObjectIDRes("Bmsw", (u16)l_btp_ix_tbl[field_0x9D4]);
|
|
JUT_ASSERT(385, m_head_tex_pattern != NULL);
|
|
|
|
if (!field_0x7F8.init(modelData, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, i_modify, FALSE)) {
|
|
return FALSE;
|
|
}
|
|
field_0x80C = 0;
|
|
field_0x964 = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000808-00000894 .text playTexPatternAnm__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::playTexPatternAnm() {
|
|
if (cLib_calcTimer(&field_0x964) == 0) {
|
|
if (field_0x80C >= m_head_tex_pattern->getFrameMax()) {
|
|
field_0x80C -= m_head_tex_pattern->getFrameMax();
|
|
field_0x964 = cM_rndF(100.0f) + 30.0f;
|
|
} else {
|
|
field_0x80C++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000894-00000984 .text setAnm__12daNpc_Bmsw_cFSc */
|
|
void daNpc_Bmsw_c::setAnm(signed char idx) {
|
|
static u32 a_play_mode_tbl[] = {
|
|
J3DFrameCtrl::EMode_LOOP, J3DFrameCtrl::EMode_LOOP,
|
|
J3DFrameCtrl::EMode_LOOP, J3DFrameCtrl::EMode_LOOP,
|
|
J3DFrameCtrl::EMode_LOOP, J3DFrameCtrl::EMode_LOOP,
|
|
J3DFrameCtrl::EMode_LOOP,
|
|
};
|
|
static f32 a_morf_frame_tbl[] = {8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f};
|
|
static f32 a_play_speed_tbl[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
|
|
if (idx != field_0x9D5) {
|
|
field_0x9D5 = idx;
|
|
|
|
dNpc_setAnmIDRes(mpMorf,
|
|
a_play_mode_tbl[field_0x9DA],
|
|
a_morf_frame_tbl[field_0x9DA],
|
|
a_play_speed_tbl[field_0x9DA],
|
|
l_bck_ix_tbl[field_0x9D5],
|
|
-1,
|
|
"Bmsw"
|
|
);
|
|
dNpc_setAnmIDRes(mpMorfHand,
|
|
a_play_mode_tbl[field_0x9DA],
|
|
a_morf_frame_tbl[field_0x9DA],
|
|
a_play_speed_tbl[field_0x9DA],
|
|
l_arm_bck_ix_tbl[field_0x9D5],
|
|
-1,
|
|
"Bmsw"
|
|
);
|
|
}
|
|
}
|
|
|
|
/* 00000984-00000AD8 .text chkAttention__12daNpc_Bmsw_cF4cXyzs */
|
|
bool daNpc_Bmsw_c::chkAttention(cXyz pos, short angle) {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
f32 maxAttnDistXZ = l_HIO.mNpc.mMaxAttnDistXZ;
|
|
int maxAttnAngleY = l_HIO.mNpc.mMaxAttnAngleY;
|
|
|
|
cXyz delta;
|
|
delta.x = player->current.pos.x - pos.x;
|
|
delta.z = player->current.pos.z - pos.z;
|
|
f32 distXZ = std::sqrtf(delta.x*delta.x + delta.z*delta.z);
|
|
s16 targetAngleY = cM_atan2s(delta.x, delta.z);
|
|
if (mHasAttention) {
|
|
maxAttnDistXZ += 40.0f;
|
|
maxAttnAngleY += cAngle::d2s(10.0f);
|
|
}
|
|
targetAngleY -= angle;
|
|
return maxAttnAngleY > abs(targetAngleY) && maxAttnDistXZ > distXZ;
|
|
}
|
|
|
|
/* 00000AD8-00000B28 .text eventOrder__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::eventOrder() {
|
|
if (field_0x9D7 == 1 || field_0x9D7 == 2) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
if (field_0x9D7 == 1) {
|
|
fopAcM_orderSpeakEvent(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000B28-00000B68 .text checkOrder__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::checkOrder() {
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
return;
|
|
}
|
|
if (!eventInfo.checkCommandTalk()) {
|
|
return;
|
|
}
|
|
if (field_0x9D7 != 1 && field_0x9D7 != 2) {
|
|
return;
|
|
}
|
|
field_0x9D7 = 0;
|
|
field_0x9B9 = 1;
|
|
}
|
|
|
|
/* 00000B68-00000EF8 .text next_msgStatus__12daNpc_Bmsw_cFPUl */
|
|
u16 daNpc_Bmsw_c::next_msgStatus(unsigned long* currMsgNo) {
|
|
u16 ret = fopMsgStts_MSG_CONTINUES_e;
|
|
|
|
switch (*currMsgNo) {
|
|
case 0x1A2D:
|
|
case 0x1A31:
|
|
case 0x1A32:
|
|
case 0x1A35:
|
|
case 0x1A37:
|
|
case 0x1A41:
|
|
case 0x1A42:
|
|
case 0x1A47:
|
|
case 0x1A4A:
|
|
case 0x1A4C:
|
|
case 0x1A50:
|
|
case 0x1A55:
|
|
case 0x1A57:
|
|
case 0x1A59:
|
|
case 0x1A5A:
|
|
case 0x1A5D:
|
|
case 0x1A67:
|
|
case 0x1A6D:
|
|
case 0x1A6E:
|
|
(*currMsgNo)++;
|
|
break;
|
|
case 0x1A63:
|
|
case 0x1A66:
|
|
*currMsgNo = 0x1A64;
|
|
break;
|
|
case 0x1A6A:
|
|
case 0x1A6B:
|
|
*currMsgNo = 0x1A6C;
|
|
break;
|
|
case 0x1A52:
|
|
if (dComIfGp_getMiniGameRupee() < 15) {
|
|
*currMsgNo = 0x1A51;
|
|
} else {
|
|
*currMsgNo = 0x1A53;
|
|
}
|
|
break;
|
|
case 0x1A60:
|
|
if (dComIfGp_getMiniGameRupee() < 20) {
|
|
*currMsgNo = 0x1A5E;
|
|
} else {
|
|
*currMsgNo = 0x1A61;
|
|
}
|
|
break;
|
|
case 0x1A2E:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1A01);
|
|
*currMsgNo = 0x1A31;
|
|
} else if (mpCurrMsg->mSelectNum == 1) {
|
|
if (dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_DRC)) {
|
|
*currMsgNo = 0x1A2F;
|
|
} else {
|
|
*currMsgNo = 0x1A30;
|
|
}
|
|
}
|
|
break;
|
|
case 0x1A33:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A35;
|
|
} else if (mpCurrMsg->mSelectNum == 1) {
|
|
*currMsgNo = 0x1A34;
|
|
}
|
|
break;
|
|
case 0x1A34:
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A01)) {
|
|
*currMsgNo = 0x1A32;
|
|
} else {
|
|
*currMsgNo = 0x1A42;
|
|
}
|
|
break;
|
|
case 0x1A38:
|
|
(*currMsgNo)++;
|
|
dComIfGs_setEventReg(dSv_event_flag_c::UNK_C203, 1);
|
|
break;
|
|
case 0x1A3D:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1A01);
|
|
*currMsgNo = 0x1A31;
|
|
} else {
|
|
*currMsgNo = 0x1A3E;
|
|
}
|
|
break;
|
|
case 0x1A4D:
|
|
dComIfGs_setEventReg(dSv_event_flag_c::UNK_C203, 2);
|
|
// fallthrough
|
|
case 0x1A51:
|
|
case 0x1A53:
|
|
*currMsgNo = 0x1A4E;
|
|
break;
|
|
case 0x1A58:
|
|
dComIfGs_setEventReg(dSv_event_flag_c::UNK_C203, 3);
|
|
(*currMsgNo)++;
|
|
break;
|
|
case 0x1A5E:
|
|
case 0x1A61:
|
|
*currMsgNo = 0x1A5F;
|
|
break;
|
|
case 0x1A3F:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A41;
|
|
} else {
|
|
*currMsgNo = 0x1A40;
|
|
}
|
|
break;
|
|
case 0x1A43:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A35;
|
|
} else {
|
|
*currMsgNo = 0x1A34;
|
|
}
|
|
break;
|
|
case 0x1A44:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A46;
|
|
} else {
|
|
*currMsgNo = 0x1A45;
|
|
}
|
|
break;
|
|
case 0x1A46:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A4A;
|
|
} else {
|
|
*currMsgNo = 0x1A47;
|
|
}
|
|
break;
|
|
case 0x1A48:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A4A;
|
|
} else {
|
|
*currMsgNo = 0x1A49;
|
|
}
|
|
break;
|
|
case 0x1A49:
|
|
*currMsgNo = 0x1A47;
|
|
break;
|
|
case 0x1A54:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A55;
|
|
} else {
|
|
*currMsgNo = 0x1A45;
|
|
}
|
|
break;
|
|
case 0x1A64:
|
|
if (mpCurrMsg->mSelectNum == 0) {
|
|
*currMsgNo = 0x1A67;
|
|
} else {
|
|
*currMsgNo = 0x1A65;
|
|
}
|
|
break;
|
|
default:
|
|
ret = fopMsgStts_MSG_ENDS_e;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00000EF8-0000102C .text getMsg__12daNpc_Bmsw_cFv */
|
|
u32 daNpc_Bmsw_c::getMsg() {
|
|
u32 msg = field_0x9C0;
|
|
|
|
if (field_0x9C0 != fpcM_ERROR_PROCESS_ID_e) {
|
|
field_0x9C0 = fpcM_ERROR_PROCESS_ID_e;
|
|
} else {
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
if (!dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0320)) {
|
|
dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0320);
|
|
msg = 0x1A63;
|
|
} else {
|
|
msg = 0x1A66;
|
|
}
|
|
} else {
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A02)) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1A02);
|
|
msg = 0x1A2D;
|
|
} else {
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A01)) {
|
|
msg = 0x1A3D;
|
|
} else {
|
|
u8 reg = dComIfGs_getEventReg(dSv_event_flag_c::UNK_C203);
|
|
switch (reg) {
|
|
case 0:
|
|
msg = 0x1A3F;
|
|
break;
|
|
case 1:
|
|
msg = 0x1A44;
|
|
break;
|
|
case 2:
|
|
msg = 0x1A54;
|
|
break;
|
|
case 3:
|
|
default:
|
|
msg = 0x1A62;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return msg;
|
|
}
|
|
|
|
/* 0000102C-000010C0 .text anmAtr__12daNpc_Bmsw_cFUs */
|
|
void daNpc_Bmsw_c::anmAtr(u16 i_msgStatus) {
|
|
switch (dComIfGp_getMesgAnimeAttrInfo()) {
|
|
case 5:
|
|
setAnm(1);
|
|
break;
|
|
case 6:
|
|
setAnm(2);
|
|
break;
|
|
case 9:
|
|
setAnm(3);
|
|
break;
|
|
case 14:
|
|
setAnm(4);
|
|
break;
|
|
}
|
|
|
|
dComIfGp_clearMesgAnimeAttrInfo();
|
|
}
|
|
|
|
/* 000010C0-00001340 .text CreateInit__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::CreateInit() {
|
|
field_0x97E = current.angle;
|
|
|
|
attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e;
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAA;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAA;
|
|
|
|
gravity = -30.0f;
|
|
setAction(&daNpc_Bmsw_c::wait_action, NULL);
|
|
|
|
mAttPos = current.pos;
|
|
mStts.Init(0xFF, 0xFF, this);
|
|
mCyl.Set(l_cyl_src);
|
|
mCyl.SetStts(&mStts);
|
|
|
|
setCollision(60.0f, 150.0f);
|
|
|
|
field_0x9C4 = 0;
|
|
mEventCut.setActorInfo2("Bmsw", this);
|
|
field_0x962 = 0;
|
|
field_0x963 = 0;
|
|
field_0x9C0 = fpcM_ERROR_PROCESS_ID_e;
|
|
field_0x988.setWaitParm(5, 2, 3, 2, 1.0, 0.9, 0, 0x2000);
|
|
set_mtx();
|
|
|
|
mpMorf->calc();
|
|
mpMorfHand->calc();
|
|
|
|
dKy_tevstr_init(&field_0x6E0, home.roomNo, 0xFF);
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
field_0x9E0 = fopAcM_createChild(
|
|
"Btsw",
|
|
fopAcM_GetID(this),
|
|
fopAcM_GetParam(this),
|
|
¤t.pos,
|
|
fopAcM_GetRoomNo(this),
|
|
¤t.angle
|
|
);
|
|
*fopAcM_GetOldPosition_p(this) = cXyz(120.0f, 700.0f, 810.0f);
|
|
current.pos = *fopAcM_GetOldPosition_p(this);
|
|
} else {
|
|
field_0x9E0 = fpcM_ERROR_PROCESS_ID_e;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001340-00001508 .text set_mtx__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::set_mtx() {
|
|
J3DModel* model = mpMorf->getModel();
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
field_0x6D4->setBaseTRMtx(model->getAnmMtx(m_jnt.getHeadJntNum()));
|
|
field_0x6D8->setBaseTRMtx(model->getAnmMtx(m_jnt.getBackboneJntNum()));
|
|
|
|
if (field_0x9D5 == 6 || field_0x9D5 == 5) {
|
|
if ((field_0x9D5 == 5 && mpMorfHand->getFrame() < 18.0f) || (field_0x9D5 == 6 && mpMorfHand->getFrame() < 18.0f)) {
|
|
mDoMtx_stack_c::copy(mpMorfHand->getModel()->getAnmMtx(m_handR));
|
|
mDoMtx_stack_c::transM(24.77f, -3.73f, 22.69f);
|
|
mDoMtx_stack_c::XYZrotM(0x45B4, -0x2BE7, 0xE6C);
|
|
} else {
|
|
mDoMtx_stack_c::copy(mpMorfHand->getModel()->getAnmMtx(m_handL));
|
|
mDoMtx_stack_c::transM(26.18f, 8.72f, 18.55f);
|
|
mDoMtx_stack_c::XYZrotM(0x5065, 0x28A0, -0x7F80);
|
|
}
|
|
field_0x6DC->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
/* 00001508-00001534 .text setAttention__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::setAttention() {
|
|
attention_info.position.set(mAttPos.x, mAttPos.y + l_HIO.mNpc.mAttnYOffset, mAttPos.z);
|
|
}
|
|
|
|
/* 00001534-000016EC .text lookBack__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::lookBack() {
|
|
cXyz vec2;
|
|
cXyz vec(0.0f, 0.0f, 0.0f);
|
|
|
|
cXyz* dstPos = NULL;
|
|
s16 desired_y_rot = current.angle.y;
|
|
|
|
switch (field_0x9DA) {
|
|
case 1:
|
|
case 2:
|
|
if (mHasAttention) {
|
|
vec2 = dNpc_playerEyePos(l_HIO.mNpc.m04);
|
|
dstPos = &vec2;
|
|
|
|
vec = current.pos;
|
|
vec.y = eyePos.y;
|
|
} else {
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701) && field_0x9E0 != fpcM_ERROR_PROCESS_ID_e) {
|
|
fopAc_ac_c* ac = fopAcM_SearchByID(field_0x9E0);
|
|
if (ac != NULL) {
|
|
vec2 = ac->eyePos;
|
|
dstPos = &vec2;
|
|
|
|
vec = current.pos;
|
|
vec.y = eyePos.y;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_jnt.trnChk()) {
|
|
cLib_addCalcAngleS2(&field_0x97A, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800);
|
|
} else {
|
|
field_0x97A = 0;
|
|
}
|
|
|
|
m_jnt.lookAtTarget(¤t.angle.y, dstPos, vec, desired_y_rot, field_0x97A, true);
|
|
}
|
|
|
|
/* 000016EC-0000184C .text wait01__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::wait01() {
|
|
if (field_0x9B9) {
|
|
field_0x9DA = 2;
|
|
m_jnt.offHeadLock();
|
|
m_jnt.offBackBoneLock();
|
|
} else {
|
|
if (mHasAttention) {
|
|
field_0x9D7 = 2;
|
|
}
|
|
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
if (mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)) {
|
|
if (--field_0x9D6 <= 0) {
|
|
if (field_0x9D5 == 5) {
|
|
field_0x9D6 = 1;
|
|
setAnm(6);
|
|
} else {
|
|
field_0x9D6 = cM_rndF(4.0f) + 2.0f;
|
|
setAnm(5);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (field_0x9D5 == 5 || field_0x9D5 == 6) {
|
|
m_jnt.onHeadLock();
|
|
m_jnt.onBackBoneLock();
|
|
} else {
|
|
m_jnt.offHeadLock();
|
|
m_jnt.offBackBoneLock();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 0000184C-00001A84 .text talk01__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::talk01() {
|
|
u16 talk_res = talk(1);
|
|
if (dComIfGp_checkMesgSendButton() == 1) {
|
|
if (mCurrMsgNo == 0x1A32 || mCurrMsgNo == 0x1A42 || mCurrMsgNo == 0x1A47 || mCurrMsgNo == 0x1A4A
|
|
|| mCurrMsgNo == 0x1A55 || mCurrMsgNo == 0x1A67) {
|
|
mSwCam.ActiveOn();
|
|
} else if (mCurrMsgNo == 0x1A39 || mCurrMsgNo == 0x1A4E || mCurrMsgNo == 0x1A5F || mCurrMsgNo == 0x1A59 || mCurrMsgNo == 0x1A6F) {
|
|
dComIfGp_setItemRupeeCount(field_0x960);
|
|
}
|
|
}
|
|
|
|
if (talk_res == fopMsgStts_BOX_CLOSED_e) {
|
|
field_0x9DA = 1;
|
|
dComIfGp_event_reset();
|
|
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
setAnm(0);
|
|
} else {
|
|
setAnm(1);
|
|
}
|
|
field_0x9D6 = 1;
|
|
field_0x9B9 = 0;
|
|
|
|
if (mCurrMsgNo == 0x1A36 || mCurrMsgNo == 0x1A4B || mCurrMsgNo == 0x1A56 || mCurrMsgNo == 0x1A68) {
|
|
setAction(&daNpc_Bmsw_c::shiwake_game_action, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001A84-00001BA4 .text wait_action__12daNpc_Bmsw_cFPv */
|
|
BOOL daNpc_Bmsw_c::wait_action(void*) {
|
|
if (mActionStatus == ACTION_STARTING) {
|
|
field_0x9DA = 1;
|
|
field_0x9D6 = 1;
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
setAnm(FALSE);
|
|
} else {
|
|
setAnm(TRUE);
|
|
}
|
|
mActionStatus++;
|
|
} else if (mActionStatus != ACTION_ENDING) {
|
|
s16 angle = current.angle.y + m_jnt.getHead_y() + m_jnt.getBackbone_y();
|
|
mHasAttention = chkAttention(current.pos, angle);
|
|
field_0x9D7 = 0;
|
|
|
|
switch (field_0x9DA) {
|
|
case 1:
|
|
wait01();
|
|
break;
|
|
case 2:
|
|
talk01();
|
|
break;
|
|
}
|
|
lookBack();
|
|
setAttention();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001BA4-00001C70 .text checkNextMailThrowOK__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::checkNextMailThrowOK() {
|
|
u8 mailIdx = field_0x93C;
|
|
if (mailIdx < 2) {
|
|
mailIdx++;
|
|
} else {
|
|
mailIdx = 0;
|
|
}
|
|
u8 ret = 1;
|
|
|
|
if (field_0x930[mailIdx]->CheckProc(&SwMail_c::Dummy) == FALSE) {
|
|
if (field_0x930[mailIdx]->CheckProc(&SwMail_c::End) == FALSE) {
|
|
ret = 0;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* 00001C70-00001DA4 .text setGameGetRupee__12daNpc_Bmsw_cFs */
|
|
void daNpc_Bmsw_c::setGameGetRupee(short rupees) {
|
|
u8 reg_val = dComIfGs_getEventReg(dSv_event_flag_c::UNK_C203);
|
|
switch (reg_val) {
|
|
case 0:
|
|
if (rupees < 10) {
|
|
field_0x960 = 0;
|
|
} else {
|
|
// Does not match with `rupees / 2`, maybe hand-optimized?
|
|
field_0x960 = rupees >> 1;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (rupees < 15) {
|
|
field_0x960 = 0;
|
|
} else if (rupees < 20) {
|
|
field_0x960 = rupees >> 1;
|
|
} else {
|
|
field_0x960 = rupees;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (rupees < 20) {
|
|
field_0x960 = 0;
|
|
} else if (rupees < 25) {
|
|
field_0x960 = rupees;
|
|
} else {
|
|
field_0x960 = rupees * 3;
|
|
}
|
|
break;
|
|
case 3:
|
|
default:
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
field_0x960 = rupees;
|
|
} else {
|
|
field_0x960 = rupees * 3;
|
|
}
|
|
break;
|
|
}
|
|
|
|
dComIfGp_setMessageCountNumber(field_0x960);
|
|
}
|
|
|
|
/* 00001DA4-00001E88 .text TimerCountDown__12daNpc_Bmsw_cFv */
|
|
void daNpc_Bmsw_c::TimerCountDown() {
|
|
if (field_0x9B4 > dComIfG_getTimerRestTimeMs()) {
|
|
if (field_0x9B4 <= 10000) {
|
|
mDoAud_seStart(JA_SE_MINIGAME_TIMER_30);
|
|
field_0x9B4 -= 1000;
|
|
} else {
|
|
mDoAud_seStart(JA_SE_MINIGAME_TIMER_10);
|
|
field_0x9B4 -= 10000;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001E88-00002950 .text shiwake_game_action__12daNpc_Bmsw_cFPv */
|
|
BOOL daNpc_Bmsw_c::shiwake_game_action(void*) {
|
|
static cXyz aim_pos_data[2][3] = {
|
|
cXyz(-40.0f, 772.0f, 1035.0f),
|
|
cXyz(-139.0f, 772.0f, 1035.0f),
|
|
cXyz(-240.0f, 772.0f, 1035.0f),
|
|
cXyz(-40.0f, 855.0f, 1035.0f),
|
|
cXyz(-139.0f, 855.0f, 1035.0f),
|
|
cXyz(-240.0f, 855.0f, 1035.0f)
|
|
};
|
|
static cXyz cursor_pos_data[2][3] = {
|
|
cXyz(-52.0f, 804.0f, 996.0f),
|
|
cXyz(-140.0f, 804.0f, 996.0f),
|
|
cXyz(-227.0f, 804.0f, 996.0f),
|
|
cXyz(-52.0f, 889.0f, 996.0f),
|
|
cXyz(-140.0f, 889.0f, 996.0f),
|
|
cXyz(-227.0f, 889.0f, 996.0f)
|
|
};
|
|
|
|
if (mActionStatus == ACTION_STARTING) {
|
|
field_0x9DA = 3;
|
|
field_0x9B0 = 0;
|
|
field_0x9B1 = 0;
|
|
|
|
if (!eventInfo.checkCommandDemoAccrpt()) {
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
field_0x9D8 = dComIfGp_evmng_getEventIdx("SHIWAKEGAME");
|
|
} else {
|
|
field_0x9D8 = dComIfGp_evmng_getEventIdx("SHIWAKEGAME2");
|
|
}
|
|
|
|
fopAcM_orderOtherEventId(this, field_0x9D8);
|
|
eventInfo.onCondition(dEvtCnd_UNK2_e);
|
|
return FALSE;
|
|
}
|
|
|
|
if (!field_0x962) {
|
|
dTimer_createTimer(6, l_HIO.field_0x30, 3, 4, 221.0f, l_HIO.field_0x48, 32.0f, l_HIO.field_0x4C);
|
|
field_0x962 = 1;
|
|
|
|
dComIfGp_setMiniGameRupee(0);
|
|
dComIfGp_startMiniGame(7);
|
|
}
|
|
|
|
if (dComIfG_getTimerPtr() == NULL) {
|
|
return FALSE;
|
|
}
|
|
// Possibly wrong inline for dComIfG_TimerStart here.
|
|
dComIfG_TimerStart(6, l_HIO.field_0x32);
|
|
|
|
field_0x963 = 1;
|
|
field_0x930[0]->init();
|
|
field_0x930[0]->AppearInit();
|
|
field_0x930[1]->init();
|
|
field_0x930[1]->DummyInit();
|
|
field_0x930[2]->init();
|
|
field_0x930[2]->DummyInit();
|
|
field_0x93C = 0;
|
|
mActionStatus++;
|
|
|
|
mpShopCursor->setPos(cursor_pos_data[field_0x9B1][1 + field_0x9B0]);
|
|
mpShopCursor->show();
|
|
field_0x9B4 = 20000;
|
|
} else if (mActionStatus == ACTION_ENDING) {
|
|
field_0x962 = 0;
|
|
field_0x963 = 0;
|
|
} else {
|
|
if (dComIfG_getTimerRestTimeMs() > 0) {
|
|
TimerCountDown();
|
|
|
|
field_0x988.checkTrigger();
|
|
if (field_0x9B0 > -1 && field_0x988.checkLeftTrigger()) {
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_CURSOR);
|
|
field_0x9B0--;
|
|
} else if (field_0x9B0 < 1 && field_0x988.checkRightTrigger()) {
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_CURSOR);
|
|
field_0x9B0++;
|
|
}
|
|
|
|
if (field_0x9B1 < 1 && field_0x988.checkUpTrigger()) {
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_CURSOR);
|
|
field_0x9B1++;
|
|
} else if (field_0x9B1 > 0 && field_0x988.checkDownTrigger()) {
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_CURSOR);
|
|
field_0x9B1--;
|
|
}
|
|
|
|
if (field_0x930[field_0x93C]->CheckProc(&SwMail_c::Wait)
|
|
&& dComIfG_getTimerPtr()->getStatus() != 1 && CPad_CHECK_TRIG_A(0)
|
|
&& checkNextMailThrowOK()) {
|
|
|
|
s32 row = field_0x9B0 + 1;
|
|
u8 col = field_0x9B1;
|
|
u8 idx = row + (1 - col) * 3;
|
|
|
|
cXyz& aim_pos = aim_pos_data[field_0x9B1][row];
|
|
field_0x930[field_0x93C]->ThrowInit(
|
|
aim_pos,
|
|
idx
|
|
);
|
|
|
|
if (field_0x93C < 2) {
|
|
field_0x93C++;
|
|
} else {
|
|
field_0x93C = 0;
|
|
}
|
|
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_OK);
|
|
field_0x930[field_0x93C]->AppearInit();
|
|
}
|
|
|
|
mSwCam.setAimIdx(field_0x9B0, field_0x9B1);
|
|
|
|
mpShopCursor->setPos(cursor_pos_data[field_0x9B1][1 + field_0x9B0]);
|
|
mpShopCursor->setScale(0.65f, 0.9f, 0.5f, 27.0f, 20.0f);
|
|
mpShopCursor->anm_play();
|
|
} else {
|
|
if (mActionStatus == ACTION_ONGOING) {
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_TIMER_0);
|
|
|
|
dComIfG_getTimerPtr()->end(l_HIO.field_0x34);
|
|
|
|
mpShopCursor->hide();
|
|
mActionStatus++;
|
|
} else if (mActionStatus == ACTION_UNK_2) {
|
|
if (dComIfG_getTimerPtr()->deleteCheck()) {
|
|
dComIfG_getTimerPtr()->deleteRequest();
|
|
mActionStatus++;
|
|
}
|
|
} else if (dComIfG_getTimerPtr() == NULL) {
|
|
s32 staff_id = dComIfGp_evmng_getMyStaffId("Bmsw");
|
|
dComIfGp_evmng_cutEnd(staff_id);
|
|
|
|
if (dComIfGp_evmng_endCheck(field_0x9D8)) {
|
|
dComIfGp_event_reset();
|
|
s16 rupees = dComIfGp_getMiniGameRupee();
|
|
fpc_ProcID msg = daNpc_Bmsw_getGameEndMsg(rupees);
|
|
field_0x9C0 = msg;
|
|
|
|
setGameGetRupee(rupees);
|
|
field_0x9D7 = 1;
|
|
|
|
setAction(&daNpc_Bmsw_c::wait_action, NULL);
|
|
|
|
mSwCam.ActiveOff();
|
|
if (dComIfGp_getMiniGameType() == 7) {
|
|
dComIfGp_endMiniGame(7);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
field_0x930[0]->move();
|
|
field_0x930[1]->move();
|
|
field_0x930[2]->move();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00002950-00002B24 .text _draw__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::_draw() {
|
|
GXColor unused[] = {
|
|
{0xFF, 0x00, 0x00, 0x80},
|
|
{0x00, 0x00, 0xFF, 0x80},
|
|
}; // Unused colors, needed for the .rodata section to match.
|
|
|
|
J3DModel* model = mpMorf->getModel();
|
|
J3DModelData* unkModelData = field_0x6D4->getModelData();
|
|
J3DModel* handModel = mpMorfHand->getModel();
|
|
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(model, &tevStr);
|
|
g_env_light.setLightTevColorType(field_0x6D4, &tevStr);
|
|
g_env_light.setLightTevColorType(field_0x6D8, &tevStr);
|
|
g_env_light.setLightTevColorType(handModel, &tevStr);
|
|
|
|
field_0x7F8.entry(unkModelData, field_0x80C);
|
|
mpMorf->entryDL();
|
|
mpMorfHand->entryDL();
|
|
mDoExt_modelUpdateDL(field_0x6D4);
|
|
mDoExt_modelUpdateDL(field_0x6D8);
|
|
|
|
if (field_0x9D5 == 5 || field_0x9D5 == 6) {
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &field_0x6E0);
|
|
|
|
field_0x6E0.mColorK0.r = l_HIO.r_1;
|
|
field_0x6E0.mColorK0.g = l_HIO.g_1;
|
|
field_0x6E0.mColorK0.b = l_HIO.b_1;
|
|
field_0x6E0.mColorC0.r = l_HIO.r_2;
|
|
field_0x6E0.mColorC0.g = l_HIO.g_2;
|
|
field_0x6E0.mColorC0.b = l_HIO.b_2;
|
|
|
|
g_env_light.setLightTevColorType(field_0x6DC, &field_0x6E0);
|
|
mDoExt_modelUpdateDL(field_0x6DC);
|
|
}
|
|
|
|
field_0x7F8.remove(unkModelData);
|
|
if (field_0x963 != 0) {
|
|
for (s32 i = 0; i < 3; i++) {
|
|
field_0x930[i]->draw(&tevStr);
|
|
}
|
|
}
|
|
|
|
mpShopCursor->draw();
|
|
dSnap_RegistFig(DSNAP_TYPE_BMSW, this, current.pos, current.angle.y, 1.0f, 1.0f, 1.0f);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00002B24-00002CA4 .text _execute__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::_execute() {
|
|
m_jnt.setParam(
|
|
l_HIO.mNpc.mMaxBackboneX, l_HIO.mNpc.mMaxBackboneY,
|
|
l_HIO.mNpc.mMinBackboneX, l_HIO.mNpc.mMinBackboneY,
|
|
l_HIO.mNpc.mMaxHeadX, l_HIO.mNpc.mMaxHeadY,
|
|
l_HIO.mNpc.mMinHeadX, l_HIO.mNpc.mMinHeadY,
|
|
l_HIO.mNpc.mMaxTurnStep);
|
|
field_0x988.setWaitParm(5, 2, 3, 2, l_HIO.field_0x50, l_HIO.field_0x54, 0, 0x2000);
|
|
|
|
playTexPatternAnm();
|
|
|
|
mpMorf->play(&eyePos, 0, 0);
|
|
mpMorf->calc();
|
|
mpMorfHand->play(NULL, 0, 0);
|
|
mpMorfHand->calc();
|
|
|
|
checkOrder();
|
|
|
|
if (!mEventCut.cutProc()) {
|
|
(this->*mCurrActionFunc)(NULL);
|
|
}
|
|
mSwCam.Move();
|
|
eventOrder();
|
|
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mObjAcch.CrrPos(*dComIfG_Bgsp());
|
|
|
|
tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd);
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd);
|
|
set_mtx();
|
|
setCollision(60.0f, 150.0f);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00002CA4-00002D40 .text _delete__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::_delete() {
|
|
dComIfG_resDelete(&mPhs, "Bmsw");
|
|
|
|
if (heap != NULL && mpMorf != NULL) {
|
|
mpMorf->stopZelAnime();
|
|
}
|
|
|
|
mSwMail0.SeDelete();
|
|
mSwMail1.SeDelete();
|
|
mSwMail2.SeDelete();
|
|
if (l_HIO.mNo >= 0) {
|
|
mDoHIO_deleteChild(l_HIO.mNo);
|
|
l_HIO.mNo = -1;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00002D40-00002D60 .text CallbackCreateHeap__FP10fopAc_ac_c */
|
|
static BOOL CallbackCreateHeap(fopAc_ac_c* i_this) {
|
|
return ((daNpc_Bmsw_c*)i_this)->CreateHeap();
|
|
}
|
|
|
|
/* 00002D60-00002ECC .text _create__12daNpc_Bmsw_cFv */
|
|
cPhs_State daNpc_Bmsw_c::_create() {
|
|
fopAcM_ct(this, daNpc_Bmsw_c);
|
|
|
|
u8 reg_val = dComIfGs_getEventReg(dSv_event_flag_c::UNK_C203);
|
|
if (reg_val >= 3 && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_2701)) {
|
|
fopAcM_create(
|
|
"Btsw",
|
|
fopAcM_GetParam(this),
|
|
fopAcM_GetPosition_p(this),
|
|
fopAcM_GetRoomNo(this),
|
|
fopAcM_GetAngle_p(this)
|
|
);
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
cPhs_State res = dComIfG_resLoad(&mPhs, "Bmsw");
|
|
if (res == cPhs_COMPLEATE_e) {
|
|
if (!fopAcM_entrySolidHeap(this, CallbackCreateHeap, 0xCDA0)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
|
|
if (l_HIO.mNo < 0) {
|
|
l_HIO.mNo = mDoHIO_createChild("リト族(仕分けゲーム)", &l_HIO);
|
|
}
|
|
|
|
if (!CreateInit()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
return res;
|
|
}
|
|
|
|
/* 00003524-00003CB0 .text CreateHeap__12daNpc_Bmsw_cFv */
|
|
BOOL daNpc_Bmsw_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_BM_e);
|
|
JUT_ASSERT(1499, modelData != NULL);
|
|
|
|
mpMorf = new mDoExt_McaMorf(
|
|
modelData,
|
|
NULL,
|
|
NULL,
|
|
(J3DAnmTransform*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BCK_BM_TALK01_e),
|
|
J3DFrameCtrl::EMode_LOOP,
|
|
1.0f,
|
|
0,
|
|
-1,
|
|
TRUE,
|
|
NULL,
|
|
0,
|
|
0x11020203
|
|
);
|
|
if (mpMorf == NULL || mpMorf->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head"));
|
|
JUT_ASSERT(1513, m_jnt.getHeadJntNum() >= 0);
|
|
m_neck_jnt_num = modelData->getJointName()->getIndex("neck");
|
|
JUT_ASSERT(1515, m_neck_jnt_num >= 0);
|
|
m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone"));
|
|
m_body_ArmL = modelData->getJointName()->getIndex("armL");
|
|
m_body_ArmR = modelData->getJointName()->getIndex("armR");
|
|
JUT_ASSERT(1519, m_body_ArmL >= 0 || m_body_ArmR >= 0);
|
|
|
|
J3DModelData* headModelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_BMHEAD11_e);
|
|
field_0x6D4 = mDoExt_J3DModel__create(headModelData, 0x80000,0x11020022);
|
|
if (field_0x6D4 == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
J3DModelData* armModelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_BMARM_e);
|
|
mpMorfHand = new mDoExt_McaMorf(
|
|
armModelData,
|
|
NULL,
|
|
NULL,
|
|
(J3DAnmTransform*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BCK_BMARM_TALK01_e),
|
|
J3DFrameCtrl::EMode_LOOP,
|
|
1.0f,
|
|
0,
|
|
-1,
|
|
TRUE,
|
|
NULL,
|
|
0,
|
|
0x11020203
|
|
);
|
|
if (mpMorfHand == NULL || mpMorfHand->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_ArmL = armModelData->getJointName()->getIndex("armLloc");
|
|
m_ArmR = armModelData->getJointName()->getIndex("armRloc");
|
|
m_handL = armModelData->getJointName()->getIndex("handL");
|
|
m_handR = armModelData->getJointName()->getIndex("handR");
|
|
JUT_ASSERT(1555, m_ArmL >= 0 || m_ArmR >= 0);
|
|
JUT_ASSERT(1556, m_handL >= 0 || m_handR >= 0);
|
|
|
|
J3DModelData* bagModelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_BM_BAG_e);
|
|
field_0x6D8 = mDoExt_J3DModel__create(bagModelData, 0, 0x11020203);
|
|
if (field_0x6D8 == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
J3DModelData* letterModelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_BM_LETTER_e);
|
|
field_0x6DC = mDoExt_J3DModel__create(letterModelData, 0,0x11020203);
|
|
if (field_0x6DC == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
field_0x9D4 = 0;
|
|
if (!initTexPatternAnm(false)) {
|
|
return FALSE;
|
|
}
|
|
|
|
for (u16 i = 0; i < modelData->getJointNum(); i++) {
|
|
if (i == m_jnt.getHeadJntNum() || i == m_jnt.getBackboneJntNum() ||
|
|
i == m_neck_jnt_num || i == m_body_ArmL || i == m_body_ArmR) {
|
|
mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
|
|
}
|
|
}
|
|
for (u16 i = 0; i < armModelData->getJointNum(); i++) {
|
|
if (i == m_ArmR || i == m_ArmL) {
|
|
armModelData->getJointNodePointer(i)->setCallBack(nodeCallBackArm);
|
|
}
|
|
}
|
|
mpMorf->getModel()->setUserArea((u32) this);
|
|
mpMorfHand->getModel()->setUserArea((u32) this);
|
|
|
|
field_0x930[0] = &mSwMail0;
|
|
field_0x930[1] = &mSwMail1;
|
|
field_0x930[2] = &mSwMail2;
|
|
field_0x93C = 0;
|
|
|
|
cXyz* eyeP = mSwCam.getEyeP();
|
|
cXyz* cameraCenter = mSwCam.getCenterP();
|
|
if (field_0x930[0]->MailCreateInit(eyeP, cameraCenter) == FALSE) {
|
|
return FALSE;
|
|
}
|
|
if (field_0x930[1]->MailCreateInit(eyeP, cameraCenter) == FALSE) {
|
|
return FALSE;
|
|
}
|
|
if (field_0x930[2]->MailCreateInit(eyeP, cameraCenter) == FALSE) {
|
|
return FALSE;
|
|
}
|
|
|
|
J3DAnmTevRegKey* tevRegKey = (J3DAnmTevRegKey*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BRK_SHOP_CURSOR01_e);
|
|
J3DModelData* cursorModelData = (J3DModelData*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BMD_SHOP_CURSOR01_e);
|
|
|
|
mpShopCursor = ShopCursor_create(cursorModelData, tevRegKey, 0.65f);
|
|
if (mpShopCursor == NULL) {
|
|
return FALSE;
|
|
}
|
|
mpShopCursor->m54 = 0;
|
|
|
|
mAcchCir.SetWall(30.0f, 0.0f);
|
|
mObjAcch.Set(
|
|
fopAcM_GetPosition_p(this),
|
|
fopAcM_GetOldPosition_p(this),
|
|
this,
|
|
1,
|
|
&mAcchCir,
|
|
fopAcM_GetSpeed_p(this),
|
|
NULL,
|
|
NULL
|
|
);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003CB0-00003DBC .text MailCreateInit__8SwMail_cFP4cXyzP4cXyz */
|
|
BOOL SwMail_c::MailCreateInit(cXyz* param_1, cXyz* param_2) {
|
|
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BDL_QMAIL_e));
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11020002);
|
|
if (mpModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
J3DAnmTexPattern* texPattern = (J3DAnmTexPattern*) dComIfG_getObjectIDRes("Bmsw", dRes_ID_BMSW_BTP_QMAIL_e);
|
|
if (!field_0x10.init(modelData, texPattern, TRUE, J3DFrameCtrl::EMode_LOOP, 0.0f, 0, -1, false, FALSE)) {
|
|
return FALSE;
|
|
}
|
|
|
|
field_0x58 = param_1;
|
|
field_0x5C = param_2;
|
|
field_0x54 = 0;
|
|
init();
|
|
DummyInit();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003DBC-00003FE8 .text getNextNo__8SwMail_cFUc */
|
|
u8 SwMail_c::getNextNo(unsigned char previous_no) {
|
|
f32 random = cM_rndF(10.0f);
|
|
f32 fVar4 = 2.5f - (m_same_count * 1.25f);
|
|
|
|
s32 box_y = previous_no % 3;
|
|
s32 box_x = previous_no / 3;
|
|
|
|
if (random < fVar4) {
|
|
m_same_count++;
|
|
} else {
|
|
f32 new_threshold = fVar4 + 2.5f;
|
|
if (random < new_threshold) {
|
|
if (cM_rndF(1.0f) > 0.5f) {
|
|
if (box_y == 0 || box_y == 2) {
|
|
box_y = 1;
|
|
} else if (cM_rndF(1.0f) > 0.5f) {
|
|
box_y = 0;
|
|
} else {
|
|
box_y = 2;
|
|
}
|
|
} else {
|
|
box_x = box_x == 0;
|
|
}
|
|
|
|
m_same_count = 0;
|
|
} else if (random >= new_threshold) {
|
|
fVar4 = cM_rndF(1.0f);
|
|
if (fVar4 < 0.3333f) {
|
|
if (box_y == 0 || box_y == 2) {
|
|
box_y = 1;
|
|
} else {
|
|
if (cM_rndF(1.0f) > 0.5f) {
|
|
box_y = 0;
|
|
} else {
|
|
box_y = 2;
|
|
}
|
|
}
|
|
box_x = box_x == 0;
|
|
} else if (fVar4 < 0.6666f) {
|
|
if (box_y == 0) {
|
|
box_y = 2;
|
|
} else if (box_y == 2) {
|
|
box_y = 0;
|
|
} else {
|
|
if (cM_rndF(1.0f) > 0.5f) {
|
|
box_y = 0;
|
|
} else {
|
|
box_y = 2;
|
|
}
|
|
}
|
|
} else {
|
|
if (box_y == 0) {
|
|
box_y = 2;
|
|
} else if (box_y == 2) {
|
|
box_y = 0;
|
|
} else {
|
|
if (cM_rndF(1.0f) > 0.5f) {
|
|
box_y = 0;
|
|
} else {
|
|
box_y = 2;
|
|
}
|
|
}
|
|
box_x = box_x == 0;
|
|
}
|
|
m_same_count = 0;
|
|
}
|
|
}
|
|
|
|
u8 res = box_y + (box_x * 3);
|
|
m_no_buff = res;
|
|
return res;
|
|
}
|
|
|
|
/* 00003FE8-00004074 .text init__8SwMail_cFv */
|
|
void SwMail_c::init() {
|
|
field_0x54 = 0;
|
|
field_0x56 = 0;
|
|
field_0x30 = cXyz::Zero;
|
|
field_0x3C = cXyz::Zero;
|
|
field_0x55 = 0;
|
|
|
|
field_0x24.set(
|
|
field_0x5C->x,
|
|
field_0x5C->y - 200.0f,
|
|
field_0x5C->z
|
|
);
|
|
set_mtx();
|
|
}
|
|
|
|
/* 00004074-000040F8 .text set_mtx__8SwMail_cFv */
|
|
void SwMail_c::set_mtx() {
|
|
mDoMtx_stack_c::transS(
|
|
field_0x24.x + field_0x3C.x,
|
|
field_0x24.y + field_0x3C.y,
|
|
field_0x24.z + field_0x3C.z
|
|
);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x48);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 000040F8-00004184 .text set_mtx_throw__8SwMail_cFv */
|
|
void SwMail_c::set_mtx_throw() {
|
|
mDoMtx_stack_c::transS(
|
|
field_0x24.x + field_0x3C.x,
|
|
field_0x24.y + field_0x3C.y,
|
|
field_0x24.z + field_0x3C.z
|
|
);
|
|
mDoMtx_stack_c::XrotM(field_0x48.x);
|
|
mDoMtx_stack_c::YrotM(field_0x48.y);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 00004184-0000425C .text DummyInit__8SwMail_cFv */
|
|
void SwMail_c::DummyInit() {
|
|
cLib_targetAngleY(field_0x58, field_0x5C);
|
|
field_0x48.set(0, -0x4000, 0);
|
|
field_0x24.set(field_0x5C->x - 150.0f, field_0x5C->y - 200.0f, field_0x5C->z);
|
|
|
|
field_0x54 = getNextNo(field_0x54);
|
|
field_0x4E.set(0, -0x4000, -0x4000);
|
|
|
|
field_0x3C = cXyz::Zero;
|
|
SetProc(&SwMail_c::Dummy);
|
|
}
|
|
|
|
/* 0000425C-0000427C .text Dummy__8SwMail_cFv */
|
|
void SwMail_c::Dummy() {
|
|
set_mtx();
|
|
}
|
|
|
|
/* 0000427C-0000438C .text AppearInit__8SwMail_cFv */
|
|
void SwMail_c::AppearInit() {
|
|
cLib_targetAngleY(field_0x58, field_0x5C);
|
|
field_0x48.set(0, -0x4000, 0);
|
|
field_0x24.set(field_0x5C->x, field_0x5C->y - 200.0f, field_0x5C->z);
|
|
|
|
field_0x54 = getNextNo(field_0x54);
|
|
field_0x4E.set(0, -0x4000, -0x4000);
|
|
|
|
field_0x3C = cXyz::Zero;
|
|
field_0x56 = 0;
|
|
mDoAud_seStart(JA_SE_LETTER_GAME_NEW);
|
|
SetProc(&SwMail_c::Appear);
|
|
}
|
|
|
|
/* 0000438C-000044E8 .text Appear__8SwMail_cFv */
|
|
void SwMail_c::Appear() {
|
|
s16 new_y = cLib_targetAngleY(field_0x58, field_0x5C);
|
|
|
|
cXyz diff = *field_0x58 - *field_0x5C;
|
|
if (!diff.normalizeRS()) {
|
|
diff.set(0.0f, 0.0f, 1.0f);
|
|
}
|
|
|
|
cXyz vec = *field_0x5C;
|
|
diff = diff * 120.0f;
|
|
vec += diff;
|
|
|
|
vec.y -= 40.0f;
|
|
field_0x48.x = field_0x4E.x;
|
|
field_0x48.y = field_0x4E.y + new_y;
|
|
cLib_addCalcAngleS2(&field_0x48.z, field_0x4E.z, 4, 0x1000);
|
|
|
|
if (std::abs(cLib_addCalcPos(&field_0x24, vec, 0.25f, 30.0f, 2.5f)) < 2.5f) {
|
|
WaitInit();
|
|
}
|
|
set_mtx();
|
|
}
|
|
|
|
/* 000044E8-0000450C .text WaitInit__8SwMail_cFv */
|
|
void SwMail_c::WaitInit() {
|
|
SetProc(&SwMail_c::Wait);
|
|
}
|
|
|
|
/* 0000450C-00004628 .text Wait__8SwMail_cFv */
|
|
void SwMail_c::Wait() {
|
|
s16 new_y = cLib_targetAngleY(field_0x58, field_0x5C);
|
|
|
|
cXyz diff = *field_0x58 - *field_0x5C;
|
|
if (!diff.normalizeRS()) {
|
|
diff.set(0.0f, 0.0f, 1.0f);
|
|
}
|
|
|
|
field_0x24 = *field_0x5C;
|
|
diff = diff * 120.0f;
|
|
field_0x24 += diff;
|
|
|
|
field_0x24.y -= 40.0f;
|
|
field_0x48.set(field_0x4E.x, field_0x4E.y + new_y, field_0x4E.z);
|
|
set_mtx();
|
|
}
|
|
|
|
/* 00004628-00004670 .text ThrowInit__8SwMail_cF4cXyzUc */
|
|
void SwMail_c::ThrowInit(cXyz param_1, unsigned char param_2) {
|
|
field_0x30 = param_1;
|
|
field_0x56 = 0;
|
|
field_0x55 = param_2;
|
|
|
|
SetProc(&SwMail_c::Throw);
|
|
}
|
|
|
|
/* 00004670-00004954 .text Throw__8SwMail_cFv */
|
|
void SwMail_c::Throw() {
|
|
if (field_0x56 == 0) {
|
|
s16 x_angle = cLib_targetAngleX(&field_0x30, field_0x5C);
|
|
s16 y_angle = cLib_targetAngleY(field_0x58, field_0x5C);
|
|
|
|
cXyz multVec;
|
|
cXyz vec(-40.0f, -50.0f, 0.0f);
|
|
mDoMtx_stack_c::ZXYrotS(x_angle, y_angle, 0);
|
|
mDoMtx_stack_c::multVec(&vec, &multVec);
|
|
multVec += *field_0x5C;
|
|
|
|
if (cLib_addCalcPos(&field_0x24, multVec, 0.5f, 30.0f, 2.0f) < 1.0f) {
|
|
field_0x48.y = 0;
|
|
field_0x4E.x = 0;
|
|
mDoAud_seStart(JA_SE_LK_SW_KAZEKIRI_S);
|
|
field_0x56++;
|
|
}
|
|
|
|
set_mtx();
|
|
} else {
|
|
s16 x_angle = cLib_targetAngleX(&field_0x30, field_0x5C);
|
|
field_0x48.x = -x_angle;
|
|
s16 new_y = (field_0x54 * 0x80) + 0x1000;
|
|
field_0x48.y += new_y;
|
|
field_0x48.z = 0;
|
|
|
|
f32 pos_step = cLib_addCalcPos(&field_0x24, field_0x30, 0.5f, l_HIO.field_0x44, 1.0f);
|
|
|
|
field_0x4E.x += 4000;
|
|
field_0x3C.y = (1.0f - cM_scos(field_0x4E.x)) * 20.0f;
|
|
|
|
if (pos_step < 1.0f) {
|
|
mDoAud_seStart(JA_SE_LETTER_IN_BOX, &field_0x24);
|
|
if (field_0x55 == field_0x54) {
|
|
dComIfGp_plusMiniGameRupee(1);
|
|
mDoAud_seStart(JA_SE_MINIGAME_RIGHT);
|
|
} else {
|
|
dComIfGp_getVibration().StartShock(3, 0x9, cXyz(0.0f, 1.0f, 0.0f));
|
|
mDoAud_seStart(JA_SE_MINIGAME_WRONG);
|
|
}
|
|
|
|
EndInit();
|
|
}
|
|
|
|
set_mtx_throw();
|
|
}
|
|
}
|
|
|
|
/* 00004954-000049A0 .text EndInit__8SwMail_cFv */
|
|
void SwMail_c::EndInit() {
|
|
field_0x30 = cXyz::Zero;
|
|
field_0x30.z = -10.0f;
|
|
SetProc(&SwMail_c::End);
|
|
}
|
|
|
|
/* 000049A0-00004B34 .text End__8SwMail_cFv */
|
|
void SwMail_c::End() {
|
|
if (field_0x55 == field_0x54) {
|
|
cLib_addCalcAngleS2(&field_0x48.y, 0, 4, 0x1000);
|
|
cXyz target = cXyz::Zero;
|
|
cLib_addCalcPos2(&field_0x3C, target, 0.25f, 5.0f);
|
|
} else {
|
|
cLib_addCalcAngleS2(&field_0x48.y, -0x8000, 4, 0x1000);
|
|
cXyz target = cXyz::Zero;
|
|
cLib_addCalcPos2(&field_0x3C, target, 0.25f, 5.0f);
|
|
|
|
if (field_0x24.z < 995.0f) {
|
|
s16 target;
|
|
if (field_0x24.y > 720.0f) {
|
|
target = -0x4000;
|
|
field_0x30.y -= 3.0f;
|
|
} else {
|
|
target = 0;
|
|
field_0x30.y *= 0.6f;
|
|
field_0x30.x *= 0.9f;
|
|
field_0x30.z *= 0.9f;
|
|
}
|
|
|
|
if (field_0x24.y <= 700.0f) {
|
|
field_0x30.y = 0.0f;
|
|
field_0x24.y = 700.0f;
|
|
}
|
|
|
|
cLib_addCalcAngleS2(&field_0x48.x, target, 2, 0x800);
|
|
}
|
|
field_0x30 *= 0.9f;
|
|
field_0x24 += field_0x30;
|
|
}
|
|
set_mtx_throw();
|
|
}
|
|
|
|
/* 00004B34-00004B68 .text SeDelete__8SwMail_cFv */
|
|
void SwMail_c::SeDelete() {
|
|
mDoAud_seDeleteObject((Vec*) &field_0x24);
|
|
}
|
|
|
|
/* 00004B68-00004B90 .text move__8SwMail_cFv */
|
|
void SwMail_c::move() {
|
|
(this->*mFunc)();
|
|
}
|
|
|
|
/* 00004B90-00004C04 .text draw__8SwMail_cFP12dKy_tevstr_c */
|
|
void SwMail_c::draw(dKy_tevstr_c* tevStr) {
|
|
J3DModelData* modelData = mpModel->getModelData();
|
|
field_0x10.entry(modelData, field_0x54);
|
|
g_env_light.setLightTevColorType(mpModel, tevStr);
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
field_0x10.remove(modelData);
|
|
}
|
|
|
|
/* 00004C04-00004D0C .text Move__7SwCam_cFv */
|
|
void SwCam_c::Move() {
|
|
if (field_0x1E != 0) {
|
|
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
|
|
|
|
cXyz center = camera_center_data[field_0x1D][field_0x1C + 1];
|
|
cLib_addCalcPos(&field_0x00, center, 0.25f, 10.0f, 1.0f);
|
|
|
|
camera->mCamera.Stay();
|
|
camera->mCamera.Set(*getEyeP(), *getCenterP(), field_0x18, 0);
|
|
}
|
|
}
|
|
|
|
/* 00004D0C-00004D2C .text daNpc_Bmsw_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daNpc_Bmsw_Create(fopAc_ac_c* i_this) {
|
|
return ((daNpc_Bmsw_c*)i_this)->_create();
|
|
}
|
|
|
|
/* 00004D2C-00004D4C .text daNpc_Bmsw_Delete__FP12daNpc_Bmsw_c */
|
|
static BOOL daNpc_Bmsw_Delete(daNpc_Bmsw_c* i_this) {
|
|
return ((daNpc_Bmsw_c*)i_this)->_delete();
|
|
}
|
|
|
|
/* 00004D4C-00004D6C .text daNpc_Bmsw_Execute__FP12daNpc_Bmsw_c */
|
|
static BOOL daNpc_Bmsw_Execute(daNpc_Bmsw_c* i_this) {
|
|
return ((daNpc_Bmsw_c*)i_this)->_execute();
|
|
}
|
|
|
|
/* 00004D6C-00004D8C .text daNpc_Bmsw_Draw__FP12daNpc_Bmsw_c */
|
|
static BOOL daNpc_Bmsw_Draw(daNpc_Bmsw_c* i_this) {
|
|
return ((daNpc_Bmsw_c*)i_this)->_draw();
|
|
}
|
|
|
|
/* 00004D8C-00004D94 .text daNpc_Bmsw_IsDelete__FP12daNpc_Bmsw_c */
|
|
static BOOL daNpc_Bmsw_IsDelete(daNpc_Bmsw_c*) {
|
|
return TRUE;
|
|
}
|
|
|
|
u8 SwMail_c::m_no_buff;
|
|
u8 SwMail_c::m_same_count;
|
|
|
|
cXyz SwCam_c::camera_center_data[2][3] = {
|
|
cXyz(-104.0f, 805.0f, 875.0f),
|
|
cXyz(-139.0f, 805.0f, 882.0f),
|
|
cXyz(-173.0f, 805.0f, 875.0f),
|
|
cXyz(-104.0f, 825.0f, 868.0f),
|
|
cXyz(-139.0f, 825.0f, 875.0f),
|
|
cXyz(-173.0f, 825.0f, 868.0f),
|
|
};
|
|
cXyz SwCam_c::camera_eye(-139.0f, 815.0f, 662.0f);
|
|
|
|
static actor_method_class l_daNpc_Bmsw_Method = {
|
|
(process_method_func)daNpc_Bmsw_Create,
|
|
(process_method_func)daNpc_Bmsw_Delete,
|
|
(process_method_func)daNpc_Bmsw_Execute,
|
|
(process_method_func)daNpc_Bmsw_IsDelete,
|
|
(process_method_func)daNpc_Bmsw_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_NPC_BMSW = {
|
|
/* Layer ID */ fpcLy_CURRENT_e,
|
|
/* List ID */ 0x0007,
|
|
/* List Prio */ fpcPi_CURRENT_e,
|
|
/* Proc Name */ fpcNm_NPC_BMSW_e,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daNpc_Bmsw_c),
|
|
/* Size Other */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Draw Prio */ fpcDwPi_NPC_BMSW_e,
|
|
/* Actor SubMtd */ &l_daNpc_Bmsw_Method,
|
|
/* Status */ fopAcStts_NOCULLEXEC_e | fopAcStts_UNK40000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* Cull Type */ fopAc_CULLBOX_12_e,
|
|
};
|