From 899ae98e7df95b94280643ae347a010fb226fe59 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:28:38 -0400 Subject: [PATCH] daObj_Roten_c OK, daNpcRoten_c Almost Matching (#618) * Roten Work - daNpcRoten_c almost matching - daObj_Roten_c OK I don't think these are actually related but they had the same name so I put them together * Minor Cleanup --- configure.py | 4 +- include/d/actor/d_a_npc_roten.h | 140 +- include/d/actor/d_a_obj_roten.h | 29 +- include/d/d_com_inf_game.h | 4 + include/d/d_npc.h | 11 +- include/d/d_snap.h | 2 +- src/d/actor/d_a_npc_roten.cpp | 2753 +++++++++++++++++++++++++++++-- src/d/actor/d_a_obj_roten.cpp | 154 +- src/d/d_npc_event_cut.inc | 18 +- 9 files changed, 2943 insertions(+), 172 deletions(-) diff --git a/configure.py b/configure.py index 8ea792686..c077950c5 100644 --- a/configure.py +++ b/configure.py @@ -1283,7 +1283,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_pirateship"), ActorRel(NonMatching, "d_a_obj_quake"), ActorRel(NonMatching, "d_a_obj_rcloud"), - ActorRel(NonMatching, "d_a_obj_roten"), + ActorRel(Matching, "d_a_obj_roten", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_shelf"), ActorRel(NonMatching, "d_a_obj_shmrgrd"), ActorRel(NonMatching, "d_a_obj_swpush"), @@ -1491,7 +1491,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_pf1"), ActorRel(NonMatching, "d_a_npc_photo"), ActorRel(NonMatching, "d_a_npc_pm1"), - ActorRel(NonMatching, "d_a_npc_roten"), + ActorRel(NonMatching, "d_a_npc_roten", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_npc_rsh1"), ActorRel(NonMatching, "d_a_npc_sarace"), ActorRel(NonMatching, "d_a_npc_sv"), diff --git a/include/d/actor/d_a_npc_roten.h b/include/d/actor/d_a_npc_roten.h index 9398327c1..fc9fd7d44 100644 --- a/include/d/actor/d_a_npc_roten.h +++ b/include/d/actor/d_a_npc_roten.h @@ -2,36 +2,47 @@ #define D_A_NPC_ROTEN_H #include "f_op/f_op_actor.h" +#include "d/d_npc.h" struct sRotenAnmDat { - -}; + /* 0x00 */ u8 field_0x00; + /* 0x01 */ u8 field_0x01; + /* 0x02 */ u8 field_0x02; +}; // Size: 0x03 -class daNpcRoten_c : public fopAc_ac_c { +class daNpcRoten_c : public fopNpc_npc_c { public: - void getPhaseP() {} - void getWindVec() {} - void setNpcNo(unsigned char) {} - void setResFlag(unsigned char) {} + enum Prm_e { + PRM_RAIL_ID_W = 0x08, + PRM_RAIL_ID_S = 0x10, + + PRM_NPC_NO_W = 0x08, + PRM_NPC_NO_S = 0x18, + }; + + request_of_phase_process_class* getPhaseP() { return &mPhs; } + cXyz getWindVec() { return field_0x720; } + void setNpcNo(u8 npcNo) { mNpcNo = npcNo; } + void setResFlag(u8 flag) { field_0x9BC = flag; } daNpcRoten_c(); s32 _create(); - void createHeap(); - void createInit(); - BOOL _delete(); - BOOL _draw(); - BOOL _execute(); - void executeCommon(); - void executeSetMode(unsigned char); - void executeWaitInit(); + BOOL createHeap(); + s32 createInit(); + bool _delete(); + bool _draw(); + bool _execute(); + bool executeCommon(); + void executeSetMode(u8); + s32 executeWaitInit(); void executeWait(); - void executeTalkInit(); + s32 executeTalkInit(); void executeTalk(); - void executeWalkInit(); + s32 executeWalkInit(); void executeWalk(); - void executeTurnInit(); + s32 executeTurnInit(); void executeTurn(); - void executeWindInit(); + s32 executeWindInit(); void executeWind(); void checkOrder(); void eventOrder(); @@ -39,37 +50,96 @@ public: void privateCut(); void eventInit(); void eventMesSetInit(int); - void eventMesSet(); + bool eventMesSet(); void eventSetItemInit(); - void eventSetItem(); + bool eventSetItem(); void eventClrItemInit(); void eventGetItemInit(int); void eventSetAngleInit(); void eventOnPlrInit(); void eventOffPlrInit(); - void next_msgStatus(unsigned long*); - void getMsg(); - void setMessage(unsigned long); + u16 next_msgStatus(u32*); + u32 getMsg(); + void setMessage(u32); void setAnmFromMsgTag(); - void getPrmNpcNo(); - void getPrmRailID(); + u8 getPrmNpcNo(); + u8 getPrmRailID(); void setMtx(); void chkAttention(); void lookBack(); - void initTexPatternAnm(bool); + BOOL initTexPatternAnm(bool); void playTexPatternAnm(); void playAnm(); - void setAnm(unsigned char, int, float); - void setAnmTbl(sRotenAnmDat*); - void isHaitatuItem(unsigned char); - void isKoukanItem(unsigned char); - void isGetMap(unsigned char); - void XyEventCB(int); + void setAnm(u8, int, f32); + bool setAnmTbl(sRotenAnmDat*); + BOOL isHaitatuItem(u8); + BOOL isKoukanItem(u8); + BOOL isGetMap(u8); + s16 XyEventCB(int); void setCollisionB(); void setCollisionH(); public: - /* Place member variables here */ -}; + typedef s32(daNpcRoten_c::*InitFunc_t)(); + typedef void(daNpcRoten_c::*MoveFunc_t)(); + + /* 0x6C4 */ request_of_phase_process_class mPhs; + /* 0x6CC */ request_of_phase_process_class mPhs2; + /* 0x6D4 */ J3DModel* field_0x6D4; + /* 0x6D8 */ mDoExt_McaMorf* field_0x6D8; + /* 0x6DC */ J3DAnmTexPattern* m_head_tex_pattern; + /* 0x6E0 */ mDoExt_btpAnm mBtpAnm; + /* 0x6F4 */ u32 mShadowId; + /* 0x6F8 */ u32 field_0x6F8; + /* 0x6FC */ uint field_0x6FC; + /* 0x700 */ dNpc_PathRun_c mPathRun; + /* 0x708 */ cXyz field_0x708; + /* 0x714 */ cXyz field_0x714; + /* 0x720 */ cXyz field_0x720; + /* 0x72C */ dCcD_Cyl mCyl2; + /* 0x85C */ dCcD_Sph mSph; + /* 0x988 */ sRotenAnmDat* field_0x988; + /* 0x98C */ u32* field_0x98C; + /* 0x990 */ f32 field_0x990; + /* 0x994 */ f32 field_0x994; + /* 0x998 */ s32 field_0x998; + /* 0x99C */ bool field_0x99C; + /* 0x99E */ s16 field_0x99E; + /* 0x9A0 */ s16 field_0x9A0; + /* 0x9A2 */ s16 field_0x9A2; + /* 0x9A4 */ s16 field_0x9A4; + /* 0x9A6 */ s16 field_0x9A6; + /* 0x9A8 */ s16 field_0x9A8; + /* 0x9AA */ s16 field_0x9AA; + /* 0x9AC */ s16 field_0x9AC; + /* 0x9AE */ s16 field_0x9AE; + /* 0x9B0 */ s16 field_0x9B0; + /* 0x9B2 */ u16 field_0x9B2; + /* 0x9B4 */ bool field_0x9B4; + /* 0x9B5 */ u8 field_0x9B5; + /* 0x9B6 */ u8 field_0x9B6; + /* 0x9B7 */ u8 field_0x9B7; + /* 0x9B8 */ u8 field_0x9B8; + /* 0x9B9 */ s8 m_hand_L_jnt_num; + /* 0x9BA */ s8 m_bag_jnt_num; + /* 0x9BB */ u8 field_0x9BB; + /* 0x9BC */ u8 field_0x9BC; + /* 0x9BD */ u8 mNpcNo; + /* 0x9BE */ u8 field_0x9BE; + /* 0x9BF */ u8 field_0x9BF; + /* 0x9C0 */ u8 field_0x9C0; + /* 0x9C1 */ u8 field_0x9C1; + /* 0x9C2 */ s8 field_0x9C2; + /* 0x9C3 */ s8 field_0x9C3; + /* 0x9C4 */ u8 field_0x9C4; + /* 0x9C5 */ u8 field_0x9C5; + /* 0x9C6 */ u8 field_0x9C6; + /* 0x9C7 */ u8 field_0x9C7; + /* 0x9C8 */ u8 field_0x9C8; + /* 0x9C9 */ u8 field_0x9C9; + /* 0x9CA */ u8 field_0x9CA; + + static const char m_arcname[]; +}; // Size: 0x9CC #endif /* D_A_NPC_ROTEN_H */ diff --git a/include/d/actor/d_a_obj_roten.h b/include/d/actor/d_a_obj_roten.h index 390f1a029..f05690eab 100644 --- a/include/d/actor/d_a_obj_roten.h +++ b/include/d/actor/d_a_obj_roten.h @@ -2,6 +2,10 @@ #define D_A_OBJ_ROTEN_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" +#include "SSystem/SComponent/c_phase.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "d/d_bg_w.h" class daObj_Roten_c : public fopAc_ac_c { public: @@ -11,21 +15,30 @@ public: inline BOOL _execute(); void set_mtx(); - void CreateHeap(); - void CreateInit(); + BOOL CreateHeap(); + s32 CreateInit(); static int getCreateCount(); public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ u8 field_0x29C[0x2CC - 0x29C]; + /* 0x2CC */ dBgW* mpBgW; + /* 0x2D0 */ u8 mType; + /* 0x2D1 */ u8 field_0x2D1; -class daObj_Roten_HIO_c { + static const char M_arcname[]; +}; // Size: 0x2D2 + +class daObj_Roten_HIO_c : public JORReflexible { public: daObj_Roten_HIO_c(); + virtual ~daObj_Roten_HIO_c() {} -public: - /* Place member variables here */ -}; + /* 0x04 */ s8 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ s16 field_0x0C; +}; // Size: 0x0E #endif /* D_A_OBJ_ROTEN_H */ diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index dc8b1bb78..7c001360d 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -967,6 +967,10 @@ inline void dComIfGs_setReserveNum(int i_idx, u8 num) { g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().setReserveNum(i_idx, num); } +inline void dComIfGs_setReserveItemChange(u8 idx, u8 no) { + g_dComIfG_gameInfo.save.getPlayer().getBagItem().setReserveItemChange(idx, no); +} + inline u8 dComIfGs_checkReserveItemEmpty() { return g_dComIfG_gameInfo.save.getPlayer().getBagItem().checkReserveItemEmpty(); } diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 394f66801..edb8a117a 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -126,7 +126,7 @@ private: /* 0x50 */ s16 mAddAngle; /* 0x52 */ u8 field_0x52; /* 0x54 */ cXyz mPos; - /* 0x60 */ u8 mbAttention; + /* 0x60 */ bool mbAttention; /* 0x61 */ u8 mbNoTurn; /* 0x62 */ s16 mTurnSpeed; /* 0x64 */ u32 mTurnType; @@ -164,10 +164,19 @@ public: bool getAttnFlag() { return mbAttention; } + + void setAttnFlag(bool flag) { + mbAttention = flag; + } + cXyz getAttnPos() { return mPos; } + s16 getTurnSpeed() { + return mTurnSpeed; + } + void setJntCtrlPtr(dNpc_JntCtrl_c* ctrl) { mpJntCtrl = ctrl; } diff --git a/include/d/d_snap.h b/include/d/d_snap.h index a9cddde22..e4d9e4d94 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -131,7 +131,7 @@ enum { /* 0x7B */ DSNAP_TYPE_UNK7B, /* 0x7C */ DSNAP_TYPE_UNK7C, /* 0x7D */ DSNAP_TYPE_UNK7D, - /* 0x7E */ DSNAP_TYPE_UNK7E, + /* 0x7E */ DSNAP_TYPE_ROTEN, /* 0x7F */ DSNAP_TYPE_UNK7F, /* 0x80 */ DSNAP_TYPE_BS, /* 0x81 */ DSNAP_TYPE_UNK81, diff --git a/src/d/actor/d_a_npc_roten.cpp b/src/d/actor/d_a_npc_roten.cpp index 3bca58c03..686562f7e 100644 --- a/src/d/actor/d_a_npc_roten.cpp +++ b/src/d/actor/d_a_npc_roten.cpp @@ -5,322 +5,2881 @@ #include "d/actor/d_a_npc_roten.h" #include "m_Do/m_Do_ext.h" +#include "d/actor/d_a_player_main.h" #include "d/actor/d_a_demo_item.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/d_com_lib_game.h" +#include "d/d_a_obj.h" +#include "d/d_snap.h" + +extern dCcD_SrcCyl dNpc_cyl_src; + +// Needed for the .data section to match. +static Vec dummy1 = {1.0f, 1.0f, 1.0f}; +static Vec dummy2 = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0, 0.5}; + +static const char* l_arcname_tbl[] = { + "Ro", + "Ro", + "Ro", +}; + +static sRotenAnmDat l_npc_anm_wait[] = { + 0x00, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_talk[] = { + 0x01, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_walk[] = { + 0x02, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_talk2[] = { + 0x03, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_talk3[] = { + 0x04, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_talk4[] = { + 0x05, + 0x06, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_talk5[] = { + 0x06, + 0x0A, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_watasu[] = { + 0x07, + 0x0E, + 0x01, + 0x08, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_itemwait[] = { + 0x08, + 0x0E, + 0xFF, +}; + +static sRotenAnmDat l_npc_anm_wind[] = { + 0x09, + 0x0E, + 0x01, + 0x00, + 0x14, + 0x01, + 0x0FF, + 0x08, + 0x00, +}; + +struct NpcDatStruct { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ s16 field_0x04; + /* 0x06 */ s16 field_0x06; + /* 0x08 */ s16 field_0x08; + /* 0x0A */ s16 field_0x0A; + /* 0x0C */ s16 field_0x0C; + /* 0x0E */ s16 field_0x0E; + /* 0x10 */ s16 field_0x10; + /* 0x12 */ s16 field_0x12; + /* 0x14 */ s16 field_0x14; + /* 0x16 */ s16 field_0x16; + /* 0x18 */ s16 field_0x18; + /* 0x1A */ s16 field_0x1A; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ s16 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ f32 field_0x44; + /* 0x48 */ s16 field_0x48; + /* 0x4A */ s16 field_0x4A; + /* 0x4C */ s16 field_0x4C; + /* 0x4E */ s16 field_0x4E; + /* 0x50 */ s16 field_0x50; + /* 0x52 */ s16 field_0x52; +}; // Size: 0x54 + +static NpcDatStruct l_npc_dat[] = { + { + 0.0f, + 0x09C4, + 0x1388, + 0x1388, + 0x1388, + 0xF63C, + 0xEC78, + 0xEC78, + 0xEC78, + 0x03E8, + 0x0352, + 0x0190, + 0x0000, + 190.0f, + 0x7FFF, + 250.0f, + 150.0f, + 120.0f, + 120.0f, + 40.0f, + 60.0f, + 30.0f, + 1.0f, + 1.0f, + 0x0006, + 0x0400, + 0x003C, + 0x005A, + 0x00C8, + 0x012C, + }, + { + 0.0f, + 0x09C4, + 0x1388, + 0x1388, + 0x1388, + 0xF63C, + 0xEC78, + 0xEC78, + 0xEC78, + 0x03E8, + 0x0352, + 0x0190, + 0x0000, + 190.0f, + 0x7FFF, + 250.0f, + 150.0f, + 120.0f, + 120.0f, + 40.0f, + 50.0f, + 20.0f, + 1.0f, + 1.0f, + 0x0006, + 0x0400, + 0x003C, + 0x005A, + 0x00C8, + 0x012C, + }, + { + 0.0f, + 0x09C4, + 0x1388, + 0x1388, + 0x1388, + 0xF63C, + 0xEC78, + 0xEC78, + 0xEC78, + 0x03E8, + 0x0352, + 0x0190, + 0x0000, + 190.0f, + 0x7FFF, + 250.0f, + 150.0f, + 120.0f, + 120.0f, + 40.0f, + 60.0f, + 30.0f, + 1.0f, + 1.0f, + 0x0006, + 0x0400, + 0x003C, + 0x005A, + 0x00C8, + 0x012C, + }, +}; + +static u32 l_msg_1st_talk_A[] = { + 0x2905, + 0x2906, + 0x2907, + 0x2908, + 0x2909, + 0x0000, +}; + +static u32 l_msg_1st_talk_B[] = { + 0x2969, + 0x296A, + 0x296B, + 0x296C, + 0x296D, + 0x0000, +}; + +static u32 l_msg_1st_talk_C[] = { + 0x29CD, + 0x29CE, + 0x29CF, + 0x29D0, + 0x29D1, + 0x0000, +}; + +static u32* l_msg_1st_talk[] = { + l_msg_1st_talk_A, + l_msg_1st_talk_B, + l_msg_1st_talk_C, +}; + +static u32 l_msg_exchange3_A[] = { + 0x290C, + 0x290D, + 0x290E, + 0x0000, +}; + +static u32 l_msg_exchange3_B[] = { + 0x2970, + 0x2971, + 0x2972, + 0x0000, +}; + +static u32 l_msg_exchange3_C[] = { + 0x29D4, + 0x29D5, + 0x29D6, + 0x0000, +}; + +static u32* l_msg_exchange3[] = { + l_msg_exchange3_A, + l_msg_exchange3_B, + l_msg_exchange3_C, +}; + +static u32 l_msg_exchange_A[] = { + 0x290F, + 0x2910, + 0x0000, +}; + +static u32 l_msg_exchange_B[] = { + 0x2973, + 0x2974, + 0x0000, +}; + +static u32 l_msg_exchange_C[] = { + 0x29D7, + 0x29D8, + 0x0000, +}; + +static u32* l_msg_exchange[] = { + l_msg_exchange_A, + l_msg_exchange_B, + l_msg_exchange_C, +}; + +static u32 l_msg_etc_A[] = { + 0x290A, + 0x290B, + 0x0000, +}; + +static u32 l_msg_etc_B[] = { + 0x296E, + 0x296F, + 0x0000, +}; + +static u32 l_msg_etc_C[] = { + 0x29D2, + 0x29D3, + 0x0000, +}; + +static u32* l_msg_etc[] = { + l_msg_etc_A, + l_msg_etc_B, + l_msg_etc_C, +}; + +static u32 l_msg_xy_exchange3_A[] = { + 0x2911, + 0x2912, + 0x0000, +}; + +static u32 l_msg_xy_exchange3_B[] = { + 0x2975, + 0x2976, + 0x0000, +}; + +static u32 l_msg_xy_exchange3_C[] = { + 0x29D9, + 0x29DA, + 0x0000, +}; + +static u32* l_msg_xy_exchange3[] = { + l_msg_xy_exchange3_A, + l_msg_xy_exchange3_B, + l_msg_xy_exchange3_C, +}; + +static u32 l_msg_xy_no_roten_item_A[] = { + 0x2914, + 0x0000, +}; + +static u32 l_msg_xy_no_roten_item_B[] = { + 0x2978, + 0x0000, +}; + +static u32 l_msg_xy_no_roten_item_C[] = { + 0x29DC, + 0x0000, +}; + +static u32* l_msg_xy_no_roten_item[] = { + l_msg_xy_no_roten_item_A, + l_msg_xy_no_roten_item_B, + l_msg_xy_no_roten_item_C, +}; + +static u32 l_msg_xy_invalid_item_A[] = { + 0x2915, + 0x0000, +}; + +static u32 l_msg_xy_invalid_item_B[] = { + 0x2979, + 0x0000, +}; + +static u32 l_msg_xy_invalid_item_C[] = { + 0x29DD, + 0x0000, +}; + +static u32* l_msg_xy_invalid_item[] = { + l_msg_xy_invalid_item_A, + l_msg_xy_invalid_item_B, + l_msg_xy_invalid_item_C, +}; + +static u32 l_msg_xy_koukan_item_A0[] = { + 0x2913, + 0x2916, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A1[] = { + 0x2913, + 0x2917, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A2[] = { + 0x2913, + 0x2918, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A3[] = { + 0x2913, + 0x2919, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A4[] = { + 0x2913, + 0x291A, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A5[] = { + 0x2913, + 0x291B, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A6[] = { + 0x2913, + 0x291C, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A7[] = { + 0x2913, + 0x291D, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A8[] = { + 0x2913, + 0x291E, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_A9[] = { + 0x2913, + 0x291F, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_AA[] = { + 0x2913, + 0x2920, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_AB[] = { + 0x2913, + 0x2921, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B0[] = { + 0x2977, + 0x297A, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B1[] = { + 0x2977, + 0x297B, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B2[] = { + 0x2977, + 0x297C, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B3[] = { + 0x2977, + 0x297D, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B4[] = { + 0x2977, + 0x297E, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B5[] = { + 0x2977, + 0x297F, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B6[] = { + 0x2977, + 0x2980, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B7[] = { + 0x2977, + 0x2981, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B8[] = { + 0x2977, + 0x2982, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_B9[] = { + 0x2977, + 0x2983, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_BA[] = { + 0x2977, + 0x2984, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_BB[] = { + 0x2977, + 0x2985, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C0[] = { + 0x29DB, + 0x29DE, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C1[] = { + 0x29DB, + 0x29DF, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C2[] = { + 0x29DB, + 0x29E0, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C3[] = { + 0x29DB, + 0x29E1, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C4[] = { + 0x29DB, + 0x29E2, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C5[] = { + 0x29DB, + 0x29E3, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C6[] = { + 0x29DB, + 0x29E4, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C7[] = { + 0x29DB, + 0x29E5, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C8[] = { + 0x29DB, + 0x29E6, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_C9[] = { + 0x29DB, + 0x29E7, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_CA[] = { + 0x29DB, + 0x29E8, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item_CB[] = { + 0x29DB, + 0x29E9, + 0x0000, +}; + +static u32* l_msg_xy_koukan_item[][12] = { + { + l_msg_xy_koukan_item_A0, + l_msg_xy_koukan_item_A1, + l_msg_xy_koukan_item_A2, + l_msg_xy_koukan_item_A3, + l_msg_xy_koukan_item_A4, + l_msg_xy_koukan_item_A5, + l_msg_xy_koukan_item_A6, + l_msg_xy_koukan_item_A7, + l_msg_xy_koukan_item_A8, + l_msg_xy_koukan_item_A9, + l_msg_xy_koukan_item_AA, + l_msg_xy_koukan_item_AB, + }, + { + l_msg_xy_koukan_item_B0, + l_msg_xy_koukan_item_B1, + l_msg_xy_koukan_item_B2, + l_msg_xy_koukan_item_B3, + l_msg_xy_koukan_item_B4, + l_msg_xy_koukan_item_B5, + l_msg_xy_koukan_item_B6, + l_msg_xy_koukan_item_B7, + l_msg_xy_koukan_item_B8, + l_msg_xy_koukan_item_B9, + l_msg_xy_koukan_item_BA, + l_msg_xy_koukan_item_BB, + }, + { + l_msg_xy_koukan_item_C0, + l_msg_xy_koukan_item_C1, + l_msg_xy_koukan_item_C2, + l_msg_xy_koukan_item_C3, + l_msg_xy_koukan_item_C4, + l_msg_xy_koukan_item_C5, + l_msg_xy_koukan_item_C6, + l_msg_xy_koukan_item_C7, + l_msg_xy_koukan_item_C8, + l_msg_xy_koukan_item_C9, + l_msg_xy_koukan_item_CA, + l_msg_xy_koukan_item_CB, + }, +}; + +static u32 l_msg_xy_koukan_item2_A0[] = { + 0x2922, + 0x0001, + 0x2930, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A1[] = { + 0x2923, + 0x0001, + 0x2931, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A2[] = { + 0x2924, + 0x0001, + 0x2932, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A3[] = { + 0x2925, + 0x0001, + 0x2933, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A4[] = { + 0x2926, + 0x0001, + 0x2934, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A5[] = { + 0x2927, + 0x0001, + 0x2935, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A6[] = { + 0x2928, + 0x0001, + 0x2936, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A7[] = { + 0x2929, + 0x0001, + 0x2937, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A8[] = { + 0x292A, + 0x0001, + 0x2938, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_A9[] = { + 0x292B, + 0x0001, + 0x2939, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_AA[] = { + 0x292C, + 0x0001, + 0x293A, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_AB[] = { + 0x292D, + 0x0001, + 0x293B, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B0[] = { + 0x2986, + 0x0001, + 0x2994, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B1[] = { + 0x2987, + 0x0001, + 0x2995, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B2[] = { + 0x2988, + 0x0001, + 0x2996, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B3[] = { + 0x2989, + 0x0001, + 0x2997, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B4[] = { + 0x298A, + 0x0001, + 0x2998, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B5[] = { + 0x298B, + 0x0001, + 0x2999, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B6[] = { + 0x298C, + 0x0001, + 0x299A, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B7[] = { + 0x298D, + 0x0001, + 0x299B, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B8[] = { + 0x298E, + 0x0001, + 0x299C, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_B9[] = { + 0x298F, + 0x0001, + 0x299D, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_BA[] = { + 0x2990, + 0x0001, + 0x299E, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_BB[] = { + 0x2991, + 0x0001, + 0x299F, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C0[] = { + 0x29EA, + 0x0001, + 0x29F8, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C1[] = { + 0x29EB, + 0x0001, + 0x29F9, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C2[] = { + 0x29EC, + 0x0001, + 0x29FA, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C3[] = { + 0x29ED, + 0x0001, + 0x29FB, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C4[] = { + 0x29EE, + 0x0001, + 0x29FC, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C5[] = { + 0x29EF, + 0x0001, + 0x29FD, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C6[] = { + 0x29F0, + 0x0001, + 0x29FE, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C7[] = { + 0x29F1, + 0x0001, + 0x29FF, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C8[] = { + 0x29F2, + 0x0001, + 0x2A00, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_C9[] = { + 0x29F3, + 0x0001, + 0x2A01, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_CA[] = { + 0x29F4, + 0x0001, + 0x2A02, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item2_CB[] = { + 0x29F5, + 0x0001, + 0x2A03, + 0x0000, +}; + +static u32* l_msg_xy_koukan_item2[][12] = { + { + l_msg_xy_koukan_item2_A0, + l_msg_xy_koukan_item2_A1, + l_msg_xy_koukan_item2_A2, + l_msg_xy_koukan_item2_A3, + l_msg_xy_koukan_item2_A4, + l_msg_xy_koukan_item2_A5, + l_msg_xy_koukan_item2_A6, + l_msg_xy_koukan_item2_A7, + l_msg_xy_koukan_item2_A8, + l_msg_xy_koukan_item2_A9, + l_msg_xy_koukan_item2_AA, + l_msg_xy_koukan_item2_AB, + }, + { + l_msg_xy_koukan_item2_B0, + l_msg_xy_koukan_item2_B1, + l_msg_xy_koukan_item2_B2, + l_msg_xy_koukan_item2_B3, + l_msg_xy_koukan_item2_B4, + l_msg_xy_koukan_item2_B5, + l_msg_xy_koukan_item2_B6, + l_msg_xy_koukan_item2_B7, + l_msg_xy_koukan_item2_B8, + l_msg_xy_koukan_item2_B9, + l_msg_xy_koukan_item2_BA, + l_msg_xy_koukan_item2_BB, + }, + { + l_msg_xy_koukan_item2_C0, + l_msg_xy_koukan_item2_C1, + l_msg_xy_koukan_item2_C2, + l_msg_xy_koukan_item2_C3, + l_msg_xy_koukan_item2_C4, + l_msg_xy_koukan_item2_C5, + l_msg_xy_koukan_item2_C6, + l_msg_xy_koukan_item2_C7, + l_msg_xy_koukan_item2_C8, + l_msg_xy_koukan_item2_C9, + l_msg_xy_koukan_item2_CA, + l_msg_xy_koukan_item2_CB, + }, +}; + +static u32 l_msg_xy_koukan_item3_A0[] = { + 0x292E, + 0x2930, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A1[] = { + 0x292E, + 0x2931, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A2[] = { + 0x292E, + 0x2932, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A3[] = { + 0x292E, + 0x2933, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A4[] = { + 0x292E, + 0x2934, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A5[] = { + 0x292E, + 0x2935, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A6[] = { + 0x292E, + 0x2936, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A7[] = { + 0x292E, + 0x2937, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A8[] = { + 0x292E, + 0x2938, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_A9[] = { + 0x292E, + 0x2939, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_AA[] = { + 0x292E, + 0x293A, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_AB[] = { + 0x292E, + 0x293B, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B0[] = { + 0x2992, + 0x2994, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B1[] = { + 0x2992, + 0x2995, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B2[] = { + 0x2992, + 0x2996, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B3[] = { + 0x2992, + 0x2997, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B4[] = { + 0x2992, + 0x2998, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B5[] = { + 0x2992, + 0x2999, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B6[] = { + 0x2992, + 0x299A, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B7[] = { + 0x2992, + 0x299B, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B8[] = { + 0x2992, + 0x299C, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_B9[] = { + 0x2992, + 0x299D, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_BA[] = { + 0x2992, + 0x299E, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_BB[] = { + 0x2992, + 0x299F, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C0[] = { + 0x29F6, + 0x29F8, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C1[] = { + 0x29F6, + 0x29F9, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C2[] = { + 0x29F6, + 0x29FA, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C3[] = { + 0x29F6, + 0x29FB, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C4[] = { + 0x29F6, + 0x29FC, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C5[] = { + 0x29F6, + 0x29FD, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C6[] = { + 0x29F6, + 0x29FE, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C7[] = { + 0x29F6, + 0x29FF, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C8[] = { + 0x29F6, + 0x2A00, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_C9[] = { + 0x29F6, + 0x2A01, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_CA[] = { + 0x29F6, + 0x2A02, + 0x0002, + 0x0000, +}; + +static u32 l_msg_xy_koukan_item3_CB[] = { + 0x29F6, + 0x2A03, + 0x0002, + 0x0000, +}; + +static u32* l_msg_xy_koukan_item3[][12] = { + { + l_msg_xy_koukan_item3_A0, + l_msg_xy_koukan_item3_A1, + l_msg_xy_koukan_item3_A2, + l_msg_xy_koukan_item3_A3, + l_msg_xy_koukan_item3_A4, + l_msg_xy_koukan_item3_A5, + l_msg_xy_koukan_item3_A6, + l_msg_xy_koukan_item3_A7, + l_msg_xy_koukan_item3_A8, + l_msg_xy_koukan_item3_A9, + l_msg_xy_koukan_item3_AA, + l_msg_xy_koukan_item3_AB, + }, + { + l_msg_xy_koukan_item3_B0, + l_msg_xy_koukan_item3_B1, + l_msg_xy_koukan_item3_B2, + l_msg_xy_koukan_item3_B3, + l_msg_xy_koukan_item3_B4, + l_msg_xy_koukan_item3_B5, + l_msg_xy_koukan_item3_B6, + l_msg_xy_koukan_item3_B7, + l_msg_xy_koukan_item3_B8, + l_msg_xy_koukan_item3_B9, + l_msg_xy_koukan_item3_BA, + l_msg_xy_koukan_item3_BB, + }, + { + l_msg_xy_koukan_item3_C0, + l_msg_xy_koukan_item3_C1, + l_msg_xy_koukan_item3_C2, + l_msg_xy_koukan_item3_C3, + l_msg_xy_koukan_item3_C4, + l_msg_xy_koukan_item3_C5, + l_msg_xy_koukan_item3_C6, + l_msg_xy_koukan_item3_C7, + l_msg_xy_koukan_item3_C8, + l_msg_xy_koukan_item3_C9, + l_msg_xy_koukan_item3_CA, + l_msg_xy_koukan_item3_CB, + }, +}; + +static u32 l_msg_xy_koukan_yes[] = { + 0x292E, + 0x2992, + 0x29F6, +}; + +static u32 l_msg_xy_koukan_no[] = { + 0x292F, + 0x2993, + 0x29F7, +}; + +static u32 l_msg_xy_koukan_rupee[] = { + 0x293C, + 0x29A0, + 0x2A04, +}; + +static u32 l_msg_xy_koukan_end[] = { + 0x293D, + 0x29A1, + 0x2A05, +}; + +static u32 l_msg_xy_koukan_first[] = { + 0x293E, + 0x29A2, + 0x2A06, +}; + +static u32 l_msg_xy_after_get_demo_A[] = { + 0x293F, + 0x2940, + 0x0000, +}; + +static u32 l_msg_xy_after_get_demo_B[] = { + 0x29A3, + 0x29A4, + 0x0000, +}; + +static u32 l_msg_xy_after_get_demo_C[] = { + 0x2A07, + 0x2A08, + 0x0000, +}; + +static u32* l_msg_xy_after_get_demo[] = { + l_msg_xy_after_get_demo_A, + l_msg_xy_after_get_demo_B, + l_msg_xy_after_get_demo_C, +}; + +static u32 l_msg_xy_after_get_demo2_A[] = { + 0x2941, + 0x0000, +}; + +static u32 l_msg_xy_after_get_demo2_B[] = { + 0x29A5, + 0x0000, +}; + +static u32 l_msg_xy_after_get_demo2_C[] = { + 0x2A09, + 0x0000, +}; + +static u32* l_msg_xy_after_get_demo2[] = { + l_msg_xy_after_get_demo2_A, + l_msg_xy_after_get_demo2_B, + l_msg_xy_after_get_demo2_C, +}; + +static u32 l_msg_collect_map[] = { + 0x29A6, + 0x0000 +}; + +static u32 l_msg_try_force[] = { + 0x29A7, + 0x29A8, + 0x29A9, + 0x29AA, + 0x0003, + 0x29AB, + 0x0000 +}; + +static u32 l_get_item_no[] = { + 0x7, +}; + +static dCcD_SrcSph l_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_WIND, + /* SrcObjTg SPrm */ TG_SPRM_SET | TG_SPRM_IS_ENEMY, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ G_TG_SPRM_NO_HIT_MARK, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 50.0f, + }, +}; + +static char* l_npc_staff_id[] = { + "Roten", + "Roten", + "Roten", +}; + +const char daNpcRoten_c::m_arcname[] = "Ro"; + +static const int l_bmd_ix_tbl[] = { + 0x02, + 0x02, + 0x02, +}; + +static const int l_bck_ix_tbl[][10] = { + { + 0x00, + 0x04, + 0x07, + 0x05, + 0x06, + 0x0A, + 0x0B, + 0x08, + 0x09, + 0x13, + }, + { + 0x00, + 0x04, + 0x07, + 0x05, + 0x06, + 0x0A, + 0x0B, + 0x08, + 0x09, + 0x13, + }, + { + 0x00, + 0x04, + 0x07, + 0x05, + 0x06, + 0x0A, + 0x0B, + 0x08, + 0x09, + 0x13, + }, +}; + +static const int l_head_bmd_ix_tbl[] = { + 0x17, + 0x18, + 0x19, +}; + +static const int l_head_bck_ix_tbl[] = { + 0x12, + 0x10, + 0x11, +}; + +static const int l_btp_ix_tbl[] = { + 0x03, + 0x03, + 0x03, +}; + +static const int l_bmt_ix_tbl[] = { + -1, + 0x0E, + 0x0F, +}; + +static const int l_diff_flag_tbl[] = { + 0x11020022, + 0x37461622, + 0x37461622, +}; + +struct SaveDatStruct { + /* 0x00 */ u16 field_0x00; + /* 0x02 */ u16 field_0x02; + /* 0x04 */ u16 field_0x04; + /* 0x06 */ u16 field_0x06; +}; // Size: 0x08 + +static const SaveDatStruct l_save_dat[] = { + { + 0x1320, + 0xCB03, + 0xC803, + 0x1304, + }, + { + 0x1310, + 0xCA03, + 0xC703, + 0x1302, + }, + { + 0x1308, + 0xC903, + 0xC603, + 0x1301, + }, +}; + +static const u8 l_item_dat[][12] = { + { + 0x01, + 0x00, + 0x07, + 0x04, + 0x09, + 0x03, + 0x07, + 0x09, + 0x09, + 0x07, + 0x09, + 0x0A, + }, + { + 0x01, + 0x02, + 0x01, + 0x0A, + 0x09, + 0x03, + 0x02, + 0x09, + 0x09, + 0x08, + 0x09, + 0x0A, + }, + { + 0x01, + 0x00, + 0x06, + 0x05, + 0x07, + 0x04, + 0x02, + 0x04, + 0x05, + 0x05, + 0x0B, + 0x0A, + }, +}; /* 00000078-000002F0 .text __ct__12daNpcRoten_cFv */ daNpcRoten_c::daNpcRoten_c() { - /* Nonmatching */ + field_0x9BB = 0; + field_0x98C = NULL; + field_0x9B2 = 0; + field_0x990 = 0.0f; + field_0x9C0 = 0; + field_0x9C1 = 0; + field_0x9C4 = 0; + field_0x99C = 1; + field_0x9C5 = 3; + field_0x9BC = 0; + field_0x9C6 = 0; + field_0x9C7 = 0; + field_0x9C8 = 1; + field_0x9C9 = 0; + field_0x9CA = 0; + field_0x6FC = fpcM_ERROR_PROCESS_ID_e; + field_0x994 = -1.0f; } /* 000007B4-000008CC .text daNpc_Roten_nodeCallBack__FP7J3DNodei */ -static BOOL daNpc_Roten_nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL daNpc_Roten_nodeCallBack(J3DNode* node, int param_1) { + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpcRoten_c* i_this = (daNpcRoten_c*)model->getUserArea(); + + s32 jntNo = joint->getJntNo(); + cMtx_copy(model->getAnmMtx(jntNo), *calc_mtx); + + if(jntNo == i_this->m_jnt.getHeadJntNum()) { + mDoMtx_XrotM(*calc_mtx, i_this->m_jnt.getHead_y()); + mDoMtx_ZrotM(*calc_mtx, -i_this->m_jnt.getHead_x()); + } + if(jntNo == i_this->m_jnt.getBackboneJntNum()) { + mDoMtx_XrotM(*calc_mtx, i_this->m_jnt.getBackbone_y()); + mDoMtx_ZrotM(*calc_mtx, -i_this->m_jnt.getBackbone_x()); + } + + model->setAnmMtx(jntNo, *calc_mtx); + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + } + + return true; } /* 000008CC-000008EC .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } /* 000008EC-00000974 .text phase_1__FP12daNpcRoten_c */ -void phase_1(daNpcRoten_c*) { - /* Nonmatching */ +static s32 phase_1(daNpcRoten_c* i_this) { + fopAcM_SetupActor(i_this, daNpcRoten_c); + + i_this->setNpcNo(i_this->getPrmNpcNo()); + + if(!dComIfGs_isEventBit(0x1108)) { + return cPhs_UNK3_e; + } + + i_this->setResFlag(1); + return cPhs_NEXT_e; } /* 00000974-000009F4 .text phase_2__FP12daNpcRoten_c */ -void phase_2(daNpcRoten_c*) { - /* Nonmatching */ +static s32 phase_2(daNpcRoten_c* i_this) { + s32 result = dComIfG_resLoad(i_this->getPhaseP(), l_arcname_tbl[i_this->getPrmNpcNo()]); + if(result == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(i_this, CheckCreateHeap, 0x4620)) { + result = i_this->createInit(); + } + else { + i_this->mpMorf = NULL; + return cPhs_ERROR_e; + } + } + + return result; } /* 000009F4-00000A24 .text _create__12daNpcRoten_cFv */ s32 daNpcRoten_c::_create() { - /* Nonmatching */ + static cPhs__Handler l_method[] = { + (cPhs__Handler)phase_1, + (cPhs__Handler)phase_2, + NULL + }; + + return dComLbG_PhaseHandler(&mPhs2, l_method, this); } /* 00000A24-00000E88 .text createHeap__12daNpcRoten_cFv */ -void daNpcRoten_c::createHeap() { - /* Nonmatching */ +BOOL daNpcRoten_c::createHeap() { + /* Nonmatching - regalloc */ + + J3DModelData* modelData = static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bmd_ix_tbl[mNpcNo])); + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, + static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[mNpcNo][field_0x9C0])), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1, + NULL, + 0x00080000, + l_diff_flag_tbl[mNpcNo] + ); + + if(mpMorf == NULL || mpMorf->getModel() == NULL) { + return false; + } + + J3DModelData* headModelData = static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_head_bmd_ix_tbl[mNpcNo])); + field_0x6D8 = new mDoExt_McaMorf( + headModelData, + NULL, NULL, + static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_head_bck_ix_tbl[mNpcNo])), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1, + NULL, + 0x00080000, + 0x37441422 + ); + + if(field_0x6D8 == NULL || field_0x6D8->getModel() == NULL) { + return false; + } + + field_0x6D4 = field_0x6D8->getModel(); + + m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head")); + JUT_ASSERT(0x632, m_jnt.getHeadJntNum() >= 0); + m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone1")); + JUT_ASSERT(0x637, m_jnt.getBackboneJntNum() >= 0); + + if(!initTexPatternAnm(false)) { + return false; + } + + m_hand_L_jnt_num = modelData->getJointName()->getIndex("handL"); + JUT_ASSERT(0x63E, m_hand_L_jnt_num >= 0); + m_bag_jnt_num = modelData->getJointName()->getIndex("Bag1"); + JUT_ASSERT(0x642, m_bag_jnt_num >= 0); + + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == m_jnt.getHeadJntNum() || i == m_jnt.getBackboneJntNum()) { + modelData->getJointNodePointer(i)->setCallBack(daNpc_Roten_nodeCallBack); + } + } + + mpMorf->getModel()->setUserArea((u32)this); + mAcchCir.SetWall(30.0f, 30.0f); + mObjAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, ¤t.angle, &shape_angle); + + return true; } /* 00000E88-00000EA8 .text daNpcRoten_XyEventCB__FPvi */ -static s16 daNpcRoten_XyEventCB(void*, int) { - /* Nonmatching */ +static s16 daNpcRoten_XyEventCB(void* i_this, int param_1) { + return static_cast(i_this)->XyEventCB(param_1); } /* 00000EA8-000011C8 .text createInit__12daNpcRoten_cFv */ -void daNpcRoten_c::createInit() { +s32 daNpcRoten_c::createInit() { /* Nonmatching */ + int weight = 0xFF; + if(getPrmRailID() != 0xFF) { + mPathRun.setInf(getPrmRailID(), fopAcM_GetRoomNo(this), true); + if(mPathRun.mPath == NULL) { + return cPhs_ERROR_e; + } + + fopAcM_OffStatus(this, fopAcStts_NOCULLEXEC_e); + cXyz point = mPathRun.getPoint(mPathRun.mCurrPointIndex); + old.pos = point; + current.pos = old.pos; + mPathRun.incIdxLoop(); + point = mPathRun.getPoint(mPathRun.mCurrPointIndex); + dNpc_calc_DisXZ_AngY(current.pos, point, NULL, ¤t.angle.y); + field_0x9A6 = 1; + weight = 0xFE; + } + + gravity = -9.0f; + + field_0x99E = dComIfGp_evmng_getEventIdx("ROTEN_EXCHANGE_1ST"); + field_0x9A0 = dComIfGp_evmng_getEventIdx("ROTEN_EXCHANGE_2ND"); + field_0x9A2 = dComIfGp_evmng_getEventIdx("ROTEN_CHANGE_ITEM"); + field_0x9A4 = dComIfGp_evmng_getEventIdx("ROTEN_GET_MAP"); + mEventCut.setActorInfo2(l_npc_staff_id[mNpcNo], this); + field_0x9AC = 0; + field_0x9AE = 0; + field_0x9B4 = false; + field_0x9B5 = 0; + eventInfo.setXyEventCB(daNpcRoten_XyEventCB); + + attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAA; + attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAA; + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -200.0f, 0.0f, -200.0f, 200.0f, 300.0f, 200.0f); + + mObjAcch.CrrPos(*dComIfG_Bgsp()); + if(-1e9f != mObjAcch.GetGroundH()) { + current.pos.y = home.pos.y = mObjAcch.GetGroundH(); + } + + setMtx(); + mpMorf->getModel()->calc(); + + mStts.Init(weight, 0xFF, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + mCyl2.Set(dNpc_cyl_src); + mCyl2.SetStts(&mStts); + setCollision(l_npc_dat[mNpcNo].field_0x2C, 200.0f); + setCollisionB(); + mSph.Set(l_sph_src); + mSph.SetStts(&mStts); + + return cPhs_COMPLEATE_e; } /* 000011C8-0000122C .text _delete__12daNpcRoten_cFv */ -BOOL daNpcRoten_c::_delete() { - /* Nonmatching */ +bool daNpcRoten_c::_delete() { + dComIfG_resDelete(getPhaseP(), l_arcname_tbl[mNpcNo]); + if(heap && mpMorf) { + mpMorf->stopZelAnime(); + } + + return true; } /* 0000122C-000013F8 .text _draw__12daNpcRoten_cFv */ -BOOL daNpcRoten_c::_draw() { - /* Nonmatching */ +bool daNpcRoten_c::_draw() { + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* modelData = pModel->getModelData(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpMorf->getModel(), &tevStr); + g_env_light.setLightTevColorType(field_0x6D4, &tevStr); + mBtpAnm.entry(modelData, field_0x9B8); + + if(l_bmt_ix_tbl[mNpcNo] >= 0) { + mpMorf->updateDL((J3DMaterialTable*)dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bmt_ix_tbl[mNpcNo])); + } + else { + mpMorf->updateDL(); + } + + if(field_0x9C8 != 0) { + field_0x6D4->setBaseTRMtx(pModel->getAnmMtx(m_jnt.getHeadJntNum())); + field_0x6D8->updateDL(); + } + + mBtpAnm.remove(modelData); + + 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 + ); + if(mShadowId != 0) { + dComIfGd_addRealShadow(mShadowId, field_0x6D4); + } + + dSnap_RegistFig(DSNAP_TYPE_ROTEN, this, 1.0f, 1.0f, 1.0f); + + return true; } +static daNpcRoten_c::InitFunc_t l_execute_init[] = { + daNpcRoten_c::executeWaitInit, + daNpcRoten_c::executeTalkInit, + daNpcRoten_c::executeWalkInit, + daNpcRoten_c::executeTurnInit, + daNpcRoten_c::executeWindInit, +}; + +static daNpcRoten_c::MoveFunc_t moveProc[] = { + daNpcRoten_c::executeWait, + daNpcRoten_c::executeTalk, + daNpcRoten_c::executeWalk, + daNpcRoten_c::executeTurn, + daNpcRoten_c::executeWind, +}; + /* 000013F8-00001604 .text _execute__12daNpcRoten_cFv */ -BOOL daNpcRoten_c::_execute() { - /* Nonmatching */ +bool daNpcRoten_c::_execute() { + chkAttention(); + checkOrder(); + + dBgS* bgs = dComIfG_Bgsp(); // fakematch? + + if(dComIfGp_event_getMode() == dEvtMode_NONE_e || (eventInfo.checkCommandTalk() && (field_0x9B2 & 0x8000) == 0)) { + (this->*moveProc[field_0x9BB])(); + } + else { + eventMove(); + } + + eventOrder(); + playTexPatternAnm(); + playAnm(); + + speedF = field_0x990; + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mObjAcch.CrrPos(*bgs); + setCollision(l_npc_dat[mNpcNo].field_0x2C, 200.0f); + setCollisionH(); + + attention_info.position.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].field_0x1C, current.pos.z); + eyePos.set(current.pos.x, current.pos.y + l_npc_dat[mNpcNo].field_0x28, current.pos.z); + if(field_0x9C7) { + m_jnt.setParam(0, 0, 0, 0, l_npc_dat[mNpcNo].field_0x04, l_npc_dat[mNpcNo].field_0x08, l_npc_dat[mNpcNo].field_0x0C, l_npc_dat[mNpcNo].field_0x10, l_npc_dat[mNpcNo].field_0x14); + } + else { + m_jnt.setParam(l_npc_dat[mNpcNo].field_0x06, l_npc_dat[mNpcNo].field_0x0A, l_npc_dat[mNpcNo].field_0x0E, l_npc_dat[mNpcNo].field_0x12, l_npc_dat[mNpcNo].field_0x04, l_npc_dat[mNpcNo].field_0x08, l_npc_dat[mNpcNo].field_0x0C, l_npc_dat[mNpcNo].field_0x10, l_npc_dat[mNpcNo].field_0x14); + } + + lookBack(); + setCollisionB(); + setMtx(); + + return false; } /* 00001604-00001674 .text executeCommon__12daNpcRoten_cFv */ -void daNpcRoten_c::executeCommon() { - /* Nonmatching */ +bool daNpcRoten_c::executeCommon() { + if(field_0x9B6 != 0 && field_0x9BB != 4) { + field_0x9B7 = 1; + } + else { + field_0x9B7 = 0; + } + + if(field_0x9B4 == true) { + executeSetMode(1); + } + + return field_0x9B4; } /* 00001674-000016C8 .text executeSetMode__12daNpcRoten_cFUc */ -void daNpcRoten_c::executeSetMode(unsigned char) { - /* Nonmatching */ +void daNpcRoten_c::executeSetMode(u8 param_1) { + field_0x990 = 0.0f; + field_0x9BB = (this->*l_execute_init[param_1])(); } /* 000016C8-00001790 .text executeWaitInit__12daNpcRoten_cFv */ -void daNpcRoten_c::executeWaitInit() { - /* Nonmatching */ +s32 daNpcRoten_c::executeWaitInit() { + setAnmTbl(l_npc_anm_wait); + field_0x9A6 = l_npc_dat[mNpcNo].field_0x4C + cM_rndF(l_npc_dat[mNpcNo].field_0x4E - l_npc_dat[mNpcNo].field_0x4C); + + return 0; } /* 00001790-00001808 .text executeWait__12daNpcRoten_cFv */ void daNpcRoten_c::executeWait() { - /* Nonmatching */ + if(!executeCommon() && mPathRun.mPath != NULL && field_0x9A6 && !field_0x9B5) { + field_0x9A6--; + if(field_0x9A6 == 0) { + executeSetMode(3); + } + } } /* 00001808-00001810 .text executeTalkInit__12daNpcRoten_cFv */ -void daNpcRoten_c::executeTalkInit() { - /* Nonmatching */ +s32 daNpcRoten_c::executeTalkInit() { + return 1; } /* 00001810-000018E0 .text executeTalk__12daNpcRoten_cFv */ void daNpcRoten_c::executeTalk() { - /* Nonmatching */ + executeCommon(); + if(!dComIfGp_event_chkTalkXY() || dComIfGp_evmng_ChkPresentEnd()) { + if(talk(1) == fopMsgStts_BOX_CLOSED_e) { + field_0x9B4 = 0; + executeSetMode(0); + dComIfGp_event_reset(); + field_0x9B2 &= ~0x4000; + field_0x9C6 = 0; + } + else { + setAnmFromMsgTag(); + } + } } /* 000018E0-000019A8 .text executeWalkInit__12daNpcRoten_cFv */ -void daNpcRoten_c::executeWalkInit() { - /* Nonmatching */ +s32 daNpcRoten_c::executeWalkInit() { + setAnmTbl(l_npc_anm_walk); + field_0x9A6 = l_npc_dat[mNpcNo].field_0x50 + cM_rndF(l_npc_dat[mNpcNo].field_0x52 - l_npc_dat[mNpcNo].field_0x50); + + return 2; } /* 000019A8-00001B54 .text executeWalk__12daNpcRoten_cFv */ void daNpcRoten_c::executeWalk() { - /* Nonmatching */ + if(!executeCommon()) { + bool temp = false; + if(mPathRun.chkPointPass(current.pos, mPathRun.mbGoingForwards) && !mPathRun.nextIdxAuto()) { + temp = true; + } + + if(field_0x9B5 != 0) { + executeSetMode(0); + } + else if(!temp) { + cXyz point = mPathRun.getPoint(mPathRun.mCurrPointIndex); + s16 angle; + dNpc_calc_DisXZ_AngY(current.pos, point, NULL, &angle); + field_0x9B0 = angle; + field_0x99C = 0; + field_0x9AC = l_npc_dat[mNpcNo].field_0x18; + field_0x9C4 = 2; + m_jnt.setTrn(); + field_0x990 = l_npc_dat[mNpcNo].field_0x44; + if(field_0x9A6 != 0) { + field_0x9A6--; + if(field_0x9A6 == 0) { + executeSetMode(0); + } + } + } + else { + mPathRun.mbGoingForwards ^= 1; + executeSetMode(0); + } + } } /* 00001B54-00001C98 .text executeTurnInit__12daNpcRoten_cFv */ -void daNpcRoten_c::executeTurnInit() { - /* Nonmatching */ +s32 daNpcRoten_c::executeTurnInit() { + int ret = 3; + + cXyz point = mPathRun.getPoint(mPathRun.mCurrPointIndex); + s16 angle; + dNpc_calc_DisXZ_AngY(current.pos, point, NULL, &angle); + if(angle == current.angle.y) { + ret = 2; + + setAnmTbl(l_npc_anm_walk); + field_0x9A6 = l_npc_dat[mNpcNo].field_0x50 + cM_rndF(l_npc_dat[mNpcNo].field_0x52 - l_npc_dat[mNpcNo].field_0x50);\ + } + + return ret; } /* 00001C98-00001D5C .text executeTurn__12daNpcRoten_cFv */ void daNpcRoten_c::executeTurn() { - /* Nonmatching */ + if(!executeCommon()) { + cXyz point = mPathRun.getPoint(mPathRun.mCurrPointIndex); + s16 angle; + dNpc_calc_DisXZ_AngY(current.pos, point, NULL, &angle); + field_0x9B0 = angle; + field_0x99C = 0; + field_0x9C4 = 2; + if(!m_jnt.trnChk()) { + executeSetMode(2); + } + } } /* 00001D5C-00001E00 .text executeWindInit__12daNpcRoten_cFv */ -void daNpcRoten_c::executeWindInit() { - /* Nonmatching */ +s32 daNpcRoten_c::executeWindInit() { + setAnmTbl(l_npc_anm_wind); + J3DAnmTransform* pAnmRes = static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_head_bck_ix_tbl[mNpcNo])); + field_0x6D8->setAnm(pAnmRes, 0, 14.0f, 1.0f, 0.0f, 39.0f, NULL); + + return 4; } /* 00001E00-00001E68 .text executeWind__12daNpcRoten_cFv */ void daNpcRoten_c::executeWind() { - /* Nonmatching */ + if(!executeCommon()) { + field_0x6D8->play(NULL, 0, 0); + + if(field_0x9C1 & 1) { + executeSetMode(0); + field_0x9CA = 0; + } + } } /* 00001E68-00001FA0 .text checkOrder__12daNpcRoten_cFv */ void daNpcRoten_c::checkOrder() { - /* Nonmatching */ + if(eventInfo.checkCommandDemoAccrpt()) { + if(dComIfGp_evmng_startCheck(field_0x99E) && field_0x9B7 == 3) { + field_0x9B7 = 0; + } + else if(dComIfGp_evmng_startCheck(field_0x9A0) && field_0x9B7 == 4) { + field_0x9B7 = 0; + } + else if(dComIfGp_evmng_startCheck(field_0x9A2) && field_0x9B7 == 5) { + field_0x9B7 = 0; + } + else if(dComIfGp_evmng_startCheck(field_0x9A4) && field_0x9B7 == 6) { + field_0x9B7 = 0; + } + } + else if(eventInfo.checkCommandTalk() && (field_0x9B7 == 2 || field_0x9B7 == 1) && field_0x9B4 == false) { + field_0x9B4 = true; + field_0x990 = 0.0f; + field_0x9C6 = 1; + } } /* 00001FA0-0000211C .text eventOrder__12daNpcRoten_cFv */ void daNpcRoten_c::eventOrder() { - /* Nonmatching */ + if(field_0x9B7 == 2 || field_0x9B7 == 1) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if(dComIfGs_isEventBit(l_save_dat[mNpcNo].field_0x00)) { + eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); + } + + if(field_0x9B7 == 2) { + fopAcM_orderSpeakEvent(this); + } + } + else if(field_0x9B7 == 3) { + fopAcM_orderOtherEventId(this, field_0x99E, 0xFF, 0xFF7F, 0, 1); + field_0x9B2 |= 0x4000; + } + else if(field_0x9B7 == 4) { + fopAcM_orderOtherEventId(this, field_0x9A0, 0xFF, 0xFF7F, 0, 1); + field_0x9B2 |= 0x4000; + } + else if(field_0x9B7 == 5) { + fopAcM_orderOtherEventId(this, field_0x9A2, 0xFF, 0xFF7F, 0, 1); + field_0x9B2 |= 0x4000; + } + else if(field_0x9B7 == 6) { + fopAcM_orderChangeEventId(dComIfGp_getPlayer(0), this, field_0x9A4, 0, 0xFFFF); + field_0x9B2 |= 0x4000; + dComIfGs_setReserveItemEmpty(); + } } /* 0000211C-00002314 .text eventMove__12daNpcRoten_cFv */ void daNpcRoten_c::eventMove() { - /* Nonmatching */ + if(field_0x9B2 & 0x4000) { + if(dComIfGp_evmng_endCheck(field_0x99E)) { + dComIfGp_event_reset(); + field_0x9B2 &= ~0xC000; + executeSetMode(0); + field_0x9B4 = 0; + + if(field_0x9B2 & 8) { + field_0x9B7 = 2; + eventOnPlrInit(); + } + else { + field_0x9B7 = 4; + } + } + else if(dComIfGp_evmng_endCheck(field_0x9A0)) { + dComIfGp_event_reset(); + field_0x9B2 &= ~0x4000; + executeSetMode(0); + if(field_0x9B2 & 0x40) { + field_0x9B2 &= ~0x40; + eventOnPlrInit(); + } + else if(field_0x9B2 & 0x30) { + field_0x9B7 = 2; + eventOnPlrInit(); + } + else { + field_0x9B7 = 5; + } + } + else if(dComIfGp_evmng_endCheck(field_0x9A2)) { + field_0x9C6 = 0; + dComIfGp_event_reset(); + field_0x9B2 &= ~0x4000; + executeSetMode(0); + } + else if(dComIfGp_evmng_endCheck(field_0x9A4)) { + field_0x9B4 = 0; + field_0x9C6 = 0; + dComIfGp_event_reset(); + field_0x9B2 &= ~0xC000; + executeSetMode(0); + } + else { + bool oldFlag = mEventCut.getAttnFlag(); + if(mEventCut.cutProc()) { + if(!mEventCut.getAttnFlag()) { + mEventCut.setAttnFlag(oldFlag); + } + } + else { + privateCut(); + setAnmFromMsgTag(); + } + } + } + } /* 00002314-000025FC .text privateCut__12daNpcRoten_cFv */ void daNpcRoten_c::privateCut() { - /* Nonmatching */ + static char* cut_name_tbl[] = { + "INIT", + "MES_SET", + "SET_ITEM", + "CLR_ITEM", + "GET_ITEM", + "SET_ANGLE", + "ON_PLR", + "OFF_PLR", + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId(l_npc_staff_id[mNpcNo]); + if(staffIdx != -1) { + field_0x9C3 = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), 1, 0); + if(field_0x9C3 == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + return; + } + + if(dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(field_0x9C3) { + case 0: + eventInit(); + break; + case 1: + eventMesSetInit(staffIdx); + break; + case 2: + eventSetItemInit(); + break; + case 3: + eventClrItemInit(); + break; + case 4: + eventGetItemInit(staffIdx); + break; + case 5: + eventSetAngleInit(); + break; + case 6: + eventOnPlrInit(); + break; + case 7: + eventOffPlrInit(); + break; + } + } + + bool temp; + switch(field_0x9C3) { + case 1: + temp = eventMesSet(); + break; + case 2: + temp = eventSetItem(); + break; + default: + temp = true; + } + + if(temp) { + dComIfGp_evmng_cutEnd(staffIdx); + } + + daDitem_c* pItem; + if (fopAcM_SearchByID(field_0x6F8, (fopAc_ac_c**)&pItem) && pItem) { + if(field_0x9C0 == 7 && (s16)mpMorf->getFrame() >= 0x3C) { + cMtx_copy(mpMorf->getModel()->getAnmMtx(m_hand_L_jnt_num), *calc_mtx); + mDoMtx_stack_c::transS(20.0f, -30.0f, -30.0f); + cMtx_concat(*calc_mtx, mDoMtx_stack_c::get(), *calc_mtx); + + cXyz offset; + mDoMtx_multVecZero(*calc_mtx, &offset); + pItem->setOffsetPos(offset); + pItem->show(); + field_0x714 = offset; + } + else if(field_0x9C0 == 8) { + field_0x708 = field_0x714; + field_0x99C = 1; + field_0x9C4 = 1; + field_0x9C6 = 0; + field_0x9C7 = 1; + } + } + } } /* 000025FC-00002600 .text eventInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventInit() { - /* Nonmatching */ + return; } /* 00002600-0000280C .text eventMesSetInit__12daNpcRoten_cFi */ -void daNpcRoten_c::eventMesSetInit(int) { - /* Nonmatching */ +void daNpcRoten_c::eventMesSetInit(int staffIdx) { + u32* pData = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo"); + if(pData) { + u32 msgNo = *pData; + switch(msgNo) { + case 0x0: + field_0x98C = l_msg_xy_koukan_item[mNpcNo][field_0x9BE]; + setMessage(field_0x98C[0]); + dComIfGs_onEventBit(l_save_dat[mNpcNo].field_0x06); + break; + case 0x1: + field_0x98C = l_msg_xy_koukan_item2[mNpcNo][field_0x9BE]; + setMessage(field_0x98C[0]); + break; + case 0xA: + field_0x98C = l_msg_xy_koukan_item3[mNpcNo][field_0x9BE]; + setMessage(field_0x98C[0]); + break; + case 0x14: + field_0x98C = l_msg_xy_after_get_demo[mNpcNo]; + setMessage(field_0x98C[0]); + break; + case 0x15: + field_0x98C = l_msg_xy_after_get_demo2[mNpcNo]; + setMessage(field_0x98C[0]); + break; + case 0x63: + setMessage(getMsg()); + break; + default: + setMessage(msgNo); + break; + } + } + else { + field_0x98C = &field_0x98C[1]; + setMessage(field_0x98C[0]); + } } /* 0000280C-00002840 .text eventMesSet__12daNpcRoten_cFv */ -void daNpcRoten_c::eventMesSet() { - /* Nonmatching */ +bool daNpcRoten_c::eventMesSet() { + return talk(0) == fopMsgStts_BOX_CLOSED_e; } /* 00002840-000028C4 .text eventSetItemInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventSetItemInit() { - /* Nonmatching */ + u8 itemIdx = l_item_dat[mNpcNo][field_0x9BE]; + cXyz pos(0.0f, 0.0f, 0.0f); + field_0x6F8 = fopAcM_createItemForPresentDemo(&pos, (u8)(itemIdx + FLOWER_1), 9, -1, fopAcM_GetRoomNo(this)); // fakematch with the cast? } /* 000028C4-0000290C .text eventSetItem__12daNpcRoten_cFv */ -void daNpcRoten_c::eventSetItem() { - /* Nonmatching */ +bool daNpcRoten_c::eventSetItem() { + fopAc_ac_c* pActor; + if(fopAcM_SearchByID(field_0x6F8, &pActor)) { + if(pActor) { + return true; + } + + return false; + } + + return true; } /* 0000290C-00002978 .text eventClrItemInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventClrItemInit() { - /* Nonmatching */ + daDitem_c* pItem; + if(fopAcM_SearchByID(field_0x6F8, (fopAc_ac_c**)&pItem) && pItem != NULL) { + pItem->dead(); + } + + field_0x9C6 = 1; + field_0x9C7 = 0; + setAnmTbl(l_npc_anm_wait); } /* 00002978-00002A70 .text eventGetItemInit__12daNpcRoten_cFi */ -void daNpcRoten_c::eventGetItemInit(int) { +void daNpcRoten_c::eventGetItemInit(int staffIdx) { /* Nonmatching */ + + uint pcId; + + u32* pData = dComIfGp_evmng_getMyIntegerP(staffIdx, "ItemNo"); + if(pData != NULL) { + pcId = fopAcM_createItemForPresentDemo(¤t.pos, l_get_item_no[*pData], 0, -1, current.roomNo); + } + else { + u8 itemIdx = l_item_dat[mNpcNo][field_0x9BE]; + dComIfGs_onGetItemReserve(itemIdx); + + u8 itemNo = itemIdx + FLOWER_1; + pcId = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 1, -1, current.roomNo); + } + + if(pcId != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(pcId); + } } /* 00002A70-00002AD4 .text eventSetAngleInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventSetAngleInit() { - /* Nonmatching */ + daPy_lk_c* player = daPy_getPlayerLinkActorClass(); + cXyz delta = current.pos - player->current.pos; + player->changeDemoMoveAngle(cM_atan2s(delta.x, delta.z)); } /* 00002AD4-00002AF0 .text eventOnPlrInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventOnPlrInit() { - /* Nonmatching */ + daPy_getPlayerLinkActorClass()->offPlayerNoDraw(); } /* 00002AF0-00002B0C .text eventOffPlrInit__12daNpcRoten_cFv */ void daNpcRoten_c::eventOffPlrInit() { - /* Nonmatching */ + daPy_getPlayerLinkActorClass()->onPlayerNoDraw(); } /* 00002B0C-00002D5C .text next_msgStatus__12daNpcRoten_cFPUl */ -void daNpcRoten_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpcRoten_c::next_msgStatus(u32* pMsgNo) { + u16 status = fopMsgStts_MSG_CONTINUES_e; + + switch(*pMsgNo) { + case 0x293D: + case 0x29A1: + case 0x2A05: + status = fopMsgStts_MSG_ENDS_e; + break; + default: + if(field_0x98C) { + field_0x98C = &field_0x98C[1]; + switch(field_0x98C[0]) { + case 0: + field_0x98C = NULL; + status = fopMsgStts_MSG_ENDS_e; + break; + case 1: + if(mpCurrMsg->mSelectNum != 0) { + field_0x9B2 |= 8; + } + + field_0x98C = NULL; + status = fopMsgStts_MSG_ENDS_e; + break; + case 2: + if(mpCurrMsg->mSelectNum == 0) { + if(dComIfGs_getRupee() < dComIfGp_getMessageRupee()) { + field_0x9B2 |= 0x20; + field_0x98C = NULL; + status = fopMsgStts_MSG_ENDS_e; + break; + } + + dComIfGp_setItemRupeeCount(-dComIfGp_getMessageRupee()); + u8 temp = l_item_dat[mNpcNo][field_0x9BE]; + u8 temp2 = dComIfGs_getEventReg(l_save_dat[mNpcNo].field_0x02); + dComIfGs_setEventReg(l_save_dat[mNpcNo].field_0x02, temp2 + 1); + if(dComIfGs_isGetItemReserve(temp)) { + *pMsgNo = l_msg_xy_koukan_end[mNpcNo]; + field_0x9B2 |= 0x40; + } + else { + *pMsgNo = l_msg_xy_koukan_first[mNpcNo]; + } + + dComIfGs_setReserveItemChange(field_0x9C5, temp + FLOWER_1); + field_0x98C = NULL; + break; + } + else { + field_0x9B2 |= 0x10; + field_0x98C = NULL; + status = fopMsgStts_MSG_ENDS_e; + break; + } + + field_0x98C = NULL; + status = fopMsgStts_MSG_ENDS_e; + break; + case 3: + status = fopMsgStts_MSG_ENDS_e; + break; + default: + *pMsgNo = field_0x98C[0]; + break; + } + } + else { + status = fopMsgStts_MSG_ENDS_e; + } + + break; + } + + return status; } /* 00002D5C-000030C0 .text getMsg__12daNpcRoten_cFv */ -void daNpcRoten_c::getMsg() { - /* Nonmatching */ +u32 daNpcRoten_c::getMsg() { + u32 msgNo = 0; + + field_0x98C = NULL; + if(field_0x9B2 & 8) { + field_0x9B2 &= ~0x0008; + msgNo = l_msg_xy_koukan_no[mNpcNo]; + } + else if(field_0x9B2 & 0x10) { + field_0x9B2 &= ~0x0010; + msgNo = l_msg_xy_koukan_no[mNpcNo]; + } + else if(field_0x9B2 & 0x20) { + field_0x9B2 &= ~0x0020; + msgNo = l_msg_xy_koukan_rupee[mNpcNo]; + } + else if(dComIfGp_event_chkTalkXY()) { + int itemNo = dComIfGp_event_getPreItemNo(); + if(isGetMap(itemNo)) { + field_0x98C = l_msg_try_force; + dComIfGs_setReserveItemEmpty(); + dComIfGs_onEventBit(0x3E04); + } + else if(dComIfGs_getEventReg(l_save_dat[mNpcNo].field_0x02) >= 3) { + field_0x98C = l_msg_xy_exchange3[mNpcNo]; + } + else if(!isHaitatuItem(itemNo)) { + field_0x98C = l_msg_xy_no_roten_item[mNpcNo]; + } + else if(!isKoukanItem(itemNo)) { + field_0x98C = l_msg_xy_invalid_item[mNpcNo]; + } + else { + field_0x9BE = itemNo - FLOWER_1; + field_0x98C = l_msg_xy_koukan_item[mNpcNo][field_0x9BE]; + dComIfGs_onEventBit(l_save_dat[mNpcNo].field_0x06); + } + } + else { + if(!dComIfGs_isEventBit(l_save_dat[mNpcNo].field_0x00)) { + field_0x98C = l_msg_1st_talk[mNpcNo]; + dComIfGs_onEventBit(l_save_dat[mNpcNo].field_0x00); + } + else if(dComIfGs_getEventReg(l_save_dat[mNpcNo].field_0x02) >= 3) { + field_0x98C = l_msg_exchange3[mNpcNo]; + } + else if(mNpcNo == 1 && dComIfGs_isEventBit(0x3E04)) { + field_0x98C = l_msg_collect_map; + } + else if(dComIfGs_isEventBit(l_save_dat[mNpcNo].field_0x06)) { + field_0x98C = l_msg_exchange[mNpcNo]; + } + else { + field_0x98C = l_msg_etc[mNpcNo]; + } + } + + if(field_0x98C) { + msgNo = field_0x98C[0]; + } + + return msgNo; } /* 000030C0-000030D0 .text setMessage__12daNpcRoten_cFUl */ -void daNpcRoten_c::setMessage(unsigned long) { - /* Nonmatching */ +void daNpcRoten_c::setMessage(u32 msgNo) { + mCurrMsgBsPcId = fpcM_ERROR_PROCESS_ID_e; + mCurrMsgNo = msgNo; } /* 000030D0-00003198 .text setAnmFromMsgTag__12daNpcRoten_cFv */ void daNpcRoten_c::setAnmFromMsgTag() { - /* Nonmatching */ + 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_walk); + break; + case 5: + setAnmTbl(l_npc_anm_watasu); + break; + case 6: + setAnmTbl(l_npc_anm_itemwait); + break; + case 7: + setAnmTbl(l_npc_anm_talk4); + break; + case 8: + setAnmTbl(l_npc_anm_talk5); + break; + } + + dComIfGp_clearMesgAnimeAttrInfo(); } /* 00003198-000031C4 .text getPrmNpcNo__12daNpcRoten_cFv */ -void daNpcRoten_c::getPrmNpcNo() { - /* Nonmatching */ +u8 daNpcRoten_c::getPrmNpcNo() { + return daObj::PrmAbstract(this, PRM_NPC_NO_W, PRM_NPC_NO_S); } /* 000031C4-000031F0 .text getPrmRailID__12daNpcRoten_cFv */ -void daNpcRoten_c::getPrmRailID() { - /* Nonmatching */ +u8 daNpcRoten_c::getPrmRailID() { + return daObj::PrmAbstract(this, PRM_RAIL_ID_W, PRM_RAIL_ID_S); } /* 000031F0-00003278 .text setMtx__12daNpcRoten_cFv */ void daNpcRoten_c::setMtx() { - /* Nonmatching */ + mpMorf->getModel()->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00003278-00003558 .text chkAttention__12daNpcRoten_cFv */ void daNpcRoten_c::chkAttention() { - /* Nonmatching */ + if(mEventCut.getAttnFlag()) { + field_0x708 = mEventCut.getAttnPos(); + field_0x9C4 = 1; + if(field_0x9C6 != 0) { + field_0x99C = 0; + m_jnt.setTrn(); + } + else { + field_0x99C = 1; + } + + if(field_0x9B5 == 0) { + field_0x9B5 = 1; + field_0x9B6 = 1; + } + } + else { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + f32 temp = l_npc_dat[mNpcNo].field_0x24; + int temp2 = l_npc_dat[mNpcNo].field_0x20; + int temp3 = 0x4000; + if(field_0x9B4 != 0) { + temp3 = 0x7FFF; + } + f32 temp4; + s16 temp5; + + dNpc_calc_DisXZ_AngY(current.pos, player->current.pos, &temp4, &temp5); + if(field_0x9B5 != 0) { + temp += 40.0f; + temp2 += 0x071C; + } + + temp5 -= current.angle.y; + if(temp > temp4 && field_0x9CA == 0 && temp3 > abs(temp5)) { + field_0x708 = dNpc_playerEyePos(l_npc_dat[mNpcNo].field_0x00); + field_0x9C4 = 1; + if(field_0x9C6 != 0) { + field_0x99C = 0; + } + else { + field_0x99C = 1; + } + + if(field_0x9B5 == 0) { + field_0x9B5 = 1; + } + + field_0x9B6 = 1; + } + else if(temp > temp4 && field_0x9CA == 0 && temp2 > abs(temp5)) { + if(field_0x9B6 == 0) { + field_0x9B6 = 1; + } + + if(field_0x9B5 == 1) { + field_0x9B5 = 0; + field_0x9A8 = 0x1E; + } + } + else { + if(field_0x9B5 == 1) { + field_0x9B5 = 0; + field_0x9A8 = 0x1E; + } + + field_0x9B6 = 0; + field_0x9C4 = 0; + + if(mPathRun.mPath == NULL) { + if(field_0x9A8 != 0) { + field_0x9A8--; + } + else { + field_0x9B0 = home.angle.y; + field_0x99C = 0; + field_0x9C4 = 2; + m_jnt.setTrn(); + } + } + } + } + + field_0x9AC = l_npc_dat[mNpcNo].field_0x16; } /* 00003558-000036A4 .text lookBack__12daNpcRoten_cFv */ void daNpcRoten_c::lookBack() { /* Nonmatching */ + + cXyz temp4; + s16 temp1 = field_0x9AC; + s16 targetY = current.angle.y; + cXyz* dstPos = NULL; + cXyz temp2 = eyePos; + bool temp3 = field_0x99C; + + switch(field_0x9C4) { + case 1: + temp4 = field_0x708; + dstPos = &temp4; + break; + case 2: + targetY = field_0x9B0; + break; + } + + if(field_0x9B4 != 0 && field_0x9C6 != 0) { + temp3 = false; + m_jnt.setTrn(); + } + + if(m_jnt.trnChk()) { + s16 speed = mEventCut.getTurnSpeed(); + if(speed != 0) { + temp1 = speed; + } + + cLib_addCalcAngleS2(&field_0x9AE, temp1, 4, 0x800); + } + else { + field_0x9AE = 0; + } + + m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp2, targetY, field_0x9AE, temp3); + shape_angle = current.angle; } /* 000036A4-000037BC .text initTexPatternAnm__12daNpcRoten_cFb */ -void daNpcRoten_c::initTexPatternAnm(bool) { - /* Nonmatching */ +BOOL daNpcRoten_c::initTexPatternAnm(bool modify) { + J3DModelData* modelData = mpMorf->getModel()->getModelData(); + + m_head_tex_pattern = static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_btp_ix_tbl[mNpcNo])); + JUT_ASSERT(0xBFF, m_head_tex_pattern != 0); + + if(!mBtpAnm.init(modelData, m_head_tex_pattern, 1, 2, 1.0f, 0, -1, modify, 0)) { + return false; + } + + field_0x9B8 = 0; + field_0x9AA = 0; + return true; } /* 000037BC-00003828 .text playTexPatternAnm__12daNpcRoten_cFv */ void daNpcRoten_c::playTexPatternAnm() { - /* Nonmatching */ + if(cLib_calcTimer(&field_0x9AA) == 0) { + if(field_0x9B8 >= m_head_tex_pattern->getFrameMax()) { + field_0x9B8 -= m_head_tex_pattern->getFrameMax(); + field_0x9AA = 0x78; + } + else { + field_0x9B8++; + } + } } /* 00003828-000038E4 .text playAnm__12daNpcRoten_cFv */ void daNpcRoten_c::playAnm() { - /* Nonmatching */ + if(mpMorf->play(NULL, 0, 0) && field_0x988 && field_0x9C2 > 0) { + field_0x9C2--; + + if(field_0x9C2 == 0) { + field_0x988++; + if(setAnmTbl(field_0x988)) { + field_0x9C1 |= 1; + } + } + else { + setAnm(field_0x988->field_0x00, 0, 0.0f); + } + } } /* 000038E4-000039C8 .text setAnm__12daNpcRoten_cFUcif */ -void daNpcRoten_c::setAnm(unsigned char, int, float) { - /* Nonmatching */ +void daNpcRoten_c::setAnm(u8 param_1, int param_2, f32 param_3) { + if(field_0x994 >= 0.0f) { + param_3 = field_0x994; + field_0x994 = -1.0f; + } + + J3DAnmTransform* pAnmRes = static_cast(dComIfG_getObjectIDRes(l_arcname_tbl[mNpcNo], l_bck_ix_tbl[mNpcNo][param_1])); + mpMorf->setAnm(pAnmRes, param_2, param_3, 1.0f, 0.0f, -1.0f, NULL); + field_0x9C0 = param_1; + field_0x998 = param_2; } /* 000039C8-00003A80 .text setAnmTbl__12daNpcRoten_cFP12sRotenAnmDat */ -void daNpcRoten_c::setAnmTbl(sRotenAnmDat*) { - /* Nonmatching */ +bool daNpcRoten_c::setAnmTbl(sRotenAnmDat* param_1) { + field_0x9C1 &= ~0x1; + if(param_1->field_0x00 == 0xFF) { + field_0x988 = 0; + return true; + } + + field_0x988 = param_1; + field_0x9C2 = field_0x988->field_0x02; + int temp = 2; + if(field_0x9C2 > 0) { + temp = 0; + } + if(field_0x9C0 != field_0x988->field_0x00 || temp == 0 || field_0x998 == 0) { + setAnm(field_0x988->field_0x00, temp, field_0x988->field_0x01); + } + + return false; } /* 00003A80-00003AA4 .text isHaitatuItem__12daNpcRoten_cFUc */ -void daNpcRoten_c::isHaitatuItem(unsigned char) { - /* Nonmatching */ +BOOL daNpcRoten_c::isHaitatuItem(u8 itemNo) { + return FLOWER_1 <= itemNo && itemNo <= XXX_039; } /* 00003AA4-00003AC8 .text isKoukanItem__12daNpcRoten_cFUc */ -void daNpcRoten_c::isKoukanItem(unsigned char) { - /* Nonmatching */ +BOOL daNpcRoten_c::isKoukanItem(u8 itemNo) { + return FLOWER_1 <= itemNo && itemNo <= PRESIDENT_STATUE; } /* 00003AC8-00003B30 .text isGetMap__12daNpcRoten_cFUc */ -void daNpcRoten_c::isGetMap(unsigned char) { - /* Nonmatching */ +BOOL daNpcRoten_c::isGetMap(u8 itemNo) { + if(mNpcNo == 1 && !dComIfGs_isEventBit(0x3E04) && itemNo == PRESIDENT_STATUE) { + return true; + } + + return false; } /* 00003B30-00003C7C .text XyEventCB__12daNpcRoten_cFi */ -void daNpcRoten_c::XyEventCB(int) { - /* Nonmatching */ +s16 daNpcRoten_c::XyEventCB(int equippedItemIdx) { + s16 eventIdx; + + int itemNo = dComIfGp_getSelectItem(equippedItemIdx); + field_0x9BE = itemNo - FLOWER_1; + if(isKoukanItem(itemNo) && dComIfGs_getEventReg(l_save_dat[mNpcNo].field_0x02) < 3 && !isGetMap(itemNo)) { + if(dComIfGp_event_getTalkXYBtn() == 1) { + field_0x9C5 = 0; + } + else if(dComIfGp_event_getTalkXYBtn() == 2) { + field_0x9C5 = 1; + } + else if(dComIfGp_event_getTalkXYBtn() == 3) { + field_0x9C5 = 2; + } + else { + field_0x9C5 = 3; + } + + eventIdx = field_0x99E; + field_0x9B2 |= 0xC000; + } + else { + if(isGetMap(itemNo)) { + eventIdx = field_0x9A4; + field_0x9B2 |= 0xC000; + } + else { + eventIdx = dComIfGp_evmng_getEventIdx("DEFAULT_TALK_XY"); + } + } + + return eventIdx; } /* 00003C7C-00003DD4 .text setCollisionB__12daNpcRoten_cFv */ void daNpcRoten_c::setCollisionB() { - /* Nonmatching */ + MtxP pMtx = mpMorf->getModel()->getAnmMtx(m_bag_jnt_num); + + cXyz temp; + mDoMtx_multVecZero(pMtx, &temp); + s16 angle; + dNpc_calc_DisXZ_AngY(current.pos, temp, NULL, &angle); + + temp.x += l_npc_dat[mNpcNo].field_0x34 * cM_ssin(angle); + temp.y = current.pos.y; + temp.z += l_npc_dat[mNpcNo].field_0x34 * cM_scos(angle); + + mCyl2.SetC(temp); + mCyl2.SetR(l_npc_dat[mNpcNo].field_0x30); + mCyl2.SetH(200.0f); + dComIfG_Ccsp()->Set(&mCyl2); } /* 00003DD4-00003F08 .text setCollisionH__12daNpcRoten_cFv */ void daNpcRoten_c::setCollisionH() { - /* Nonmatching */ + cMtx_copy(mpMorf->getModel()->getAnmMtx(m_jnt.getHeadJntNum()), *calc_mtx); + mDoMtx_stack_c::transS(l_npc_dat[mNpcNo].field_0x3C, 0.0f, 0.0f); + cMtx_concat(*calc_mtx, mDoMtx_stack_c::get(), *calc_mtx); + + cXyz temp; + mDoMtx_multVecZero(*calc_mtx, &temp); + + mSph.SetC(temp); + mSph.SetR(l_npc_dat[mNpcNo].field_0x38); + dComIfG_Ccsp()->Set(&mSph); + if(field_0x9CA == 0 && mSph.ChkTgHit()) { + executeSetMode(4); + field_0x9CA = 1; + } } /* 00003F08-00003F28 .text daNpc_RotenCreate__FPv */ -static s32 daNpc_RotenCreate(void*) { - /* Nonmatching */ +static s32 daNpc_RotenCreate(void* i_this) { + return static_cast(i_this)->_create(); } /* 00003F28-00003F4C .text daNpc_RotenDelete__FPv */ -static BOOL daNpc_RotenDelete(void*) { - /* Nonmatching */ +static BOOL daNpc_RotenDelete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00003F4C-00003F70 .text daNpc_RotenExecute__FPv */ -static BOOL daNpc_RotenExecute(void*) { - /* Nonmatching */ +static BOOL daNpc_RotenExecute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00003F70-00003F94 .text daNpc_RotenDraw__FPv */ -static BOOL daNpc_RotenDraw(void*) { - /* Nonmatching */ +static BOOL daNpc_RotenDraw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00003F94-00003F9C .text daNpc_RotenIsDelete__FPv */ static BOOL daNpc_RotenIsDelete(void*) { - /* Nonmatching */ + return true; } static actor_method_class daNpc_RotenMethodTable = { diff --git a/src/d/actor/d_a_obj_roten.cpp b/src/d/actor/d_a_obj_roten.cpp index 4810dea79..ae44d50af 100644 --- a/src/d/actor/d_a_obj_roten.cpp +++ b/src/d/actor/d_a_obj_roten.cpp @@ -4,61 +4,177 @@ // #include "d/actor/d_a_obj_roten.h" +#include "m_Do/m_Do_mtx.h" +#include "d/d_com_inf_game.h" +#include "d/d_bg_s_movebg_actor.h" #include "d/d_procname.h" +daObj_Roten_HIO_c l_HIO; + /* 000000EC-00000118 .text __ct__17daObj_Roten_HIO_cFv */ daObj_Roten_HIO_c::daObj_Roten_HIO_c() { - /* Nonmatching */ + field_0x04 = -1; + field_0x08 = 0.0f; + field_0x0C = 0; } +const char daObj_Roten_c::M_arcname[] = "Roten"; + /* 00000118-00000188 .text set_mtx__13daObj_Roten_cFv */ void daObj_Roten_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000188-000001A8 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 000001A8-000002E4 .text CreateHeap__13daObj_Roten_cFv */ -void daObj_Roten_c::CreateHeap() { - /* Nonmatching */ +BOOL daObj_Roten_c::CreateHeap() { + static u32 bdl_arc_idx[] = { + 0x04, + 0x05, + 0x06 + }; + static u32 dzb_arc_idx[] = { + 0x09, + 0x0A, + 0x0B + }; + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(M_arcname, bdl_arc_idx[mType])); + JUT_ASSERT(0xB0, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + mpBgW = new dBgW(); + + mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(M_arcname, dzb_arc_idx[mType]), cBgW::MOVE_BG_e, &mpModel->getBaseTRMtx()); + + return mpModel != NULL && mpBgW != NULL; } /* 000002E4-00000348 .text CreateInit__13daObj_Roten_cFv */ -void daObj_Roten_c::CreateInit() { - /* Nonmatching */ +s32 daObj_Roten_c::CreateInit() { + set_mtx(); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + mpBgW->SetCrrFunc(dBgS_MoveBGProc_Typical); + dComIfG_Bgsp()->Regist(mpBgW, this); + + return cPhs_COMPLEATE_e; } /* 00000348-00000410 .text Roten_create_check__FUc */ -void Roten_create_check(unsigned char) { - /* Nonmatching */ +static BOOL Roten_create_check(u8 type) { + u8 i = 0; // fakematch? + int temp = 0; + for(; i <= 0xB; i++) { + if(dComIfGs_isGetItemReserve(i)) { + temp++; + } + else if(i == 0) { + temp++; + } + } + + if(type == 0 && temp > 3) { + return true; + } + + if(type == 1 && temp > 6) { + return true; + } + + if(temp > 9) { + return true; + } + + return false; +} + + +s32 daObj_Roten_c::_create() { + fopAcM_SetupActor(this, daObj_Roten_c); + + mType = fopAcM_GetParam(this) >> 0x18; + mType = cLib_minMaxLimit((int)mType, 0, 2); // fakematch? debug says this is templated to u8 + + if(Roten_create_check(mType)) { + field_0x2D1 = 0; + } + else { + field_0x2D1 = 1; + return cPhs_ERROR_e; + } + s32 result = dComIfG_resLoad(&mPhs, daObj_Roten_c::M_arcname); + + u32 heap_size[] = { + 0x2BA0, + 0x2A60, + 0x2C60, + }; + + if(result == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(this, CheckCreateHeap, heap_size[mType])) { + result = CreateInit(); + } + else { + result = cPhs_ERROR_e; + } + } + + return result; } /* 00000410-00000530 .text daObj_RotenCreate__FPv */ -static s32 daObj_RotenCreate(void*) { - /* Nonmatching */ +static s32 daObj_RotenCreate(void* i_actor) { + return static_cast(i_actor)->_create(); +} + +BOOL daObj_Roten_c::_delete() { + if(field_0x2D1 == 0) { + dComIfG_Bgsp()->Release(mpBgW); + dComIfG_resDelete(&mPhs, daObj_Roten_c::M_arcname); + } + + return true; } /* 00000530-0000058C .text daObj_RotenDelete__FPv */ -static BOOL daObj_RotenDelete(void*) { - /* Nonmatching */ +static BOOL daObj_RotenDelete(void* i_actor) { + return static_cast(i_actor)->_delete(); +} + +BOOL daObj_Roten_c::_execute() { + set_mtx(); + mpBgW->Move(); + + return false; } /* 0000058C-000005C4 .text daObj_RotenExecute__FPv */ -static BOOL daObj_RotenExecute(void*) { - /* Nonmatching */ +static BOOL daObj_RotenExecute(void* i_actor) { + return static_cast(i_actor)->_execute(); +} + +BOOL daObj_Roten_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + + return true; } /* 000005C4-00000630 .text daObj_RotenDraw__FPv */ -static BOOL daObj_RotenDraw(void*) { - /* Nonmatching */ +static BOOL daObj_RotenDraw(void* i_actor) { + return static_cast(i_actor)->_draw(); } /* 00000630-00000638 .text daObj_RotenIsDelete__FPv */ static BOOL daObj_RotenIsDelete(void*) { - /* Nonmatching */ + return true; } static actor_method_class daObj_RotenMethodTable = { diff --git a/src/d/d_npc_event_cut.inc b/src/d/d_npc_event_cut.inc index 05d4d968c..574ff66da 100644 --- a/src/d/d_npc_event_cut.inc +++ b/src/d/d_npc_event_cut.inc @@ -70,7 +70,7 @@ bool dNpc_EventCut_c::cutProc() { } else { if(dComIfGp_evmng_getIsAddvance(mEvtStaffId)) { - mbAttention = 0; + mbAttention = false; (this->*cut_tbl[mCurActIdx].start)(); } @@ -220,7 +220,7 @@ void dNpc_EventCut_c::cutTurnToActorProc() { } } - mbAttention = 1; + mbAttention = true; s16 tAngle = cLib_targetAngleY(&mpActor->current.pos, &mPos); int temp2 = tAngle - mpActor->current.angle.y; @@ -256,10 +256,10 @@ void dNpc_EventCut_c::cutMoveToActorStart() { } if(attn == 0) { - mbAttention = 0; + mbAttention = false; } else { - mbAttention = 1; + mbAttention = true; } if(offs == 0) { @@ -443,7 +443,7 @@ void dNpc_EventCut_c::cutTurnToPosStart() { /* 8021DE2C-8021DFB0 .text cutTurnToPosProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTurnToPosProc() { s16 tAngle = cLib_targetAngleY(&mpActor->current.pos, &mPos); - mbAttention = 1; + mbAttention = true; if(mpJntCtrl) { switch(mTurnType) { @@ -499,10 +499,10 @@ void dNpc_EventCut_c::cutMoveToPosStart() { } if(attn == 0) { - mbAttention = 0; + mbAttention = false; } else { - mbAttention = 1; + mbAttention = true; } if(speed == 0) { @@ -558,10 +558,10 @@ void dNpc_EventCut_c::cutTalkMsgStart() { if(mpTalkActor != 0) { u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); if(attn == 0) { - mbAttention = 0; + mbAttention = false; } else { - mbAttention = 1; + mbAttention = true; } u32* firstMsgNo = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "msg_num");