From d627dd6a0a6848bd277a3a346040ebc480e5e94d Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Sun, 25 Feb 2024 00:04:41 -0500 Subject: [PATCH] Start Orca --- configure.py | 2 +- include/JSystem/JParticle/JPAEmitter.h | 5 +- include/d/actor/d_a_npc_ji1.h | 345 ++- include/d/actor/d_a_tsubo.h | 16 +- include/d/d_attention.h | 4 +- include/d/d_com_inf_game.h | 19 +- include/d/d_item_data.h | 2 +- include/d/d_kankyo.h | 1 + include/d/d_npc.h | 33 +- include/d/d_timer.h | 2 + include/f_op/f_op_actor_mng.h | 2 + include/f_op/f_op_msg_mng.h | 4 + src/d/actor/d_a_demo_item.cpp | 2 +- src/d/actor/d_a_npc_ji1.cpp | 3099 +++++++++++++++++++++++- src/d/d_item_data.cpp | 6 +- 15 files changed, 3353 insertions(+), 189 deletions(-) diff --git a/configure.py b/configure.py index 553e72b12..98ee18d96 100644 --- a/configure.py +++ b/configure.py @@ -1469,7 +1469,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_ho"), ActorRel(NonMatching, "d_a_npc_hr"), ActorRel(NonMatching, "d_a_npc_jb1"), - ActorRel(NonMatching, "d_a_npc_ji1"), + ActorRel(NonMatching, "d_a_npc_ji1", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_npc_kamome", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_npc_kf1"), ActorRel(NonMatching, "d_a_npc_kg1"), diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index f3a511217..05f4c9dc5 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -202,6 +202,9 @@ public: void setEmitterTranslation(const JGeometry::TVec3& trans) { mEmitterTranslation.set(trans); } + void setEmitterTranslation(f32 x, f32 y, f32 z) { + mEmitterTranslation.set(x, y, z); + } void setEmitterScale(const JGeometry::TVec3& scale) { mEmitterScale.set(scale); } @@ -224,6 +227,7 @@ public: void setVolumeSize(u16 size) { mVolumeSize = size; } void setLifeTime(s16 i_lifeTime) { mLifeTime = i_lifeTime; } void setRate(f32 i_rate) { mRate = i_rate; } + void setRandomDirectionSpeed(f32 i_speed) { mInitialVelRndm = i_speed; } void setDirectionalSpeed(f32 i_speed) { mInitialVelDir = i_speed; } void setAwayFromAxisSpeed(f32 i_speed) { mInitialVelAxis = i_speed; } void setAwayFromCenterSpeed(f32 i_speed) { mInitialVelOmni = i_speed; } @@ -290,7 +294,6 @@ public: void setGlobalParticleScale(f32, f32) {} void setGlobalParticleWidthScale(f32) {} void setGlobalSRTMatrix(MtxP) {} - void setRandomDirectionSpeed(f32) {} static JPAEmitterInfo emtrInfo; diff --git a/include/d/actor/d_a_npc_ji1.h b/include/d/actor/d_a_npc_ji1.h index 46dd9271e..b74cad923 100644 --- a/include/d/actor/d_a_npc_ji1.h +++ b/include/d/actor/d_a_npc_ji1.h @@ -2,7 +2,15 @@ #define D_A_NPC_JI1_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" #include "d/d_cc_d.h" +#include "d/d_lib.h" +#include "d/d_npc.h" +#include "d/d_particle.h" +#include "SSystem/SComponent/c_angle.h" +#include "JSystem/J3DGraphAnimator/J3DNode.h" + +class mDoExt_McaMorf; class daNpc_Ji1_c : public fopAc_ac_c { public: @@ -12,59 +20,59 @@ public: void setAction(int (daNpc_Ji1_c::*)(void*), void*) {} void setSubAction(int (daNpc_Ji1_c::*)()) {} - void isGuardAnim(); - void isAttackAnim(); - void isAttackFrame(); - void isItemWaitAnim(); - void isClearRecord(short); + BOOL isGuardAnim(); + BOOL isAttackAnim(); + int isAttackFrame(); + BOOL isItemWaitAnim(); + BOOL isClearRecord(short); void setClearRecord(short); - void normalSubActionHarpoonGuard(short); - void normalSubActionGuard(short); - void normalAction(void*); - void kaitenExpAction(void*); - void kaitenspeakAction(void*); - void kaitenwaitAction(void*); - void kaitenAction(void*); - void getMsg1stType(); - void getMsg2ndType(); - void getMsg(); - void next_msgStatus(unsigned long*); - void talkAction(void*); - void speakAction(void*); - void speakBadAction(void*); - void initPosObject(void*, void*); + u32 normalSubActionHarpoonGuard(short); + u32 normalSubActionGuard(short); + u32 normalAction(void*); + u32 kaitenExpAction(void*); + u32 kaitenspeakAction(void*); + u32 kaitenwaitAction(void*); + u32 kaitenAction(void*); + u32 getMsg1stType(); + u32 getMsg2ndType(); + u32 getMsg(); + u16 next_msgStatus(u32* msgId); + u32 talkAction(void*); + u32 speakAction(void*); + u32 speakBadAction(void*); + static void* initPosObject(void*, void*); void initPos(int); void createItem(); void set_mtx(); - void getEventActionNo(int); - void eventAction(void*); - void evn_init_pos_init(int); - void evn_setAnm_init(int); - void evn_talk_init(int); - void evn_talk(); - void evn_continue_talk_init(int); - void evn_continue_talk(); - void evn_setAngle_init(int); - void evn_sound_proc_init(int); - void evn_head_swing_init(int); - void evn_harpoon_proc_init(int); - void evn_RollAtControl_init(int); - void evn_RollAtControl(); - void evn_game_mode_init(int); - void evn_turn_to_player(); - void evn_hide_init(int); + s32 getEventActionNo(int); + u32 eventAction(void*); + u32 evn_init_pos_init(int); + u32 evn_setAnm_init(int); + u32 evn_talk_init(int); + u32 evn_talk(); + u32 evn_continue_talk_init(int); + u32 evn_continue_talk(); + u32 evn_setAngle_init(int); + u32 evn_sound_proc_init(int); + u32 evn_head_swing_init(int); + u32 evn_harpoon_proc_init(int); + u32 evn_RollAtControl_init(int); + u32 evn_RollAtControl(); + u32 evn_game_mode_init(int); + u32 evn_turn_to_player(); + u32 evn_hide_init(int); void AnimeControlToWait(); - void privateCut(); - void setParticle(int, float, float); + u32 privateCut(); + u32 setParticle(int, float, float); void dtParticle(); - void setParticleAT(int, float, float); + u32 setParticleAT(int, float, float); void dtParticleAT(); void startspeakAction(void*); - void endspeakAction(void*); + u32 endspeakAction(void*); void reiAction(void*); void plmoveAction(void*); void teachMove(float); - void teachSpRollCutMove(float); + BOOL teachSpRollCutMove(float); void calcCoCorrectValue(); void calcBgCorrectValue(); void MoveToPlayer(float, unsigned char); @@ -73,13 +81,13 @@ public: void teachSubActionJumpInit(); void teachSubActionJump(); void teachAction(void*); - void teachSPRollCutAction(void*); + u32 teachSPRollCutAction(void*); void battleGameSetTimer(); void battleMove(float); void battleSubActionWaitInit(); void battleSubActionWait(); void battleSubActionNockBackInit(int); - void battleSubActionNockBack(); + u32 battleSubActionNockBack(); void battleSubActionAttackInit(); void battleSubActionAttack(); void battleSubActionTateAttackInit(); @@ -95,19 +103,19 @@ public: void battleSubActionGuardInit(); void battleSubActionGuard(); void battleAtSet(); - void battleGuardCheck(); - void battleAction(void*); - void checkCutType(int, int); + BOOL battleGuardCheck(); + u32 battleAction(void*); + BOOL checkCutType(int, int); void setAnimFromMsgNo(unsigned long); - void setAnm(int, float, int); + BOOL setAnm(int, float, int); s32 _create(); - void CreateHeap(); - void CreateInit(); + BOOL CreateHeap(); + BOOL CreateInit(); BOOL _delete(); BOOL _execute(); BOOL _draw(); - void chkAttention(cXyz, short); - void lookBack(); + BOOL chkAttention(cXyz, short); + BOOL lookBack(); void setHitParticle(cXyz*, unsigned long); void setGuardParticle(); void BackSlideInit(); @@ -116,15 +124,236 @@ public: void harpoonMove(); public: - /* 0x290 */ u8 m290[0xD88 - 0x290]; -}; + typedef u32 (daNpc_Ji1_c::*Func_t)(void*); + typedef u32 (daNpc_Ji1_c::*Func2_t)(); -class daNpc_Ji1_HIO_c { + /* 0x290 */ f32 field_0x290; + /* 0x294 */ f32 field_0x294; + /* 0x298 */ f32 field_0x298; + /* 0x29C */ f32 field_0x29C; + /* 0x2A0 */ f32 field_0x2A0; + /* 0x2A4 */ f32 field_0x2A4; + /* 0x2A8 */ u8 field_0x2A8; + /* 0x2AC */ u32 field_0x2AC; + /* 0x2B0 */ Func_t field_0x2B0; + /* 0x2BC */ Func_t field_0x2BC; + /* 0x2C8 */ Func_t field_0x2C8; + /* 0x2D4 */ Func2_t field_0x2D4; + /* 0x2E0 */ dPa_smokeEcallBack field_0x2E0; + /* 0x300 */ dPa_smokeEcallBack field_0x300; + /* 0x320 */ cXyz field_0x320; + /* 0x32C */ s16 field_0x32C; + /* 0x330 */ mDoExt_McaMorf* field_0x330; + /* 0x334 */ dNpc_EventCut_c mEventCut; + /* 0x3A0 */ dNpc_JntCtrl_c m_jnt; + /* 0x3D4 */ J3DAnmTexPattern* headTexPattern; + /* 0x3D8 */ mDoExt_btpAnm field_0x3D8; + /* 0x3EC */ u8 field_0x3EC; + /* 0x3EE */ s16 field_0x3EE; + /* 0x3F0 */ u32 field_0x3F0; + /* 0x3F4 */ mDoExt_McaMorf* mpMorf; + /* 0x3F8 */ J3DModel* field_0x3F8; + /* 0x3FC */ mDoExt_brkAnm field_0x3FC; + /* 0x414 */ f32 field_0x414; + /* 0x418 */ mDoExt_btkAnm field_0x418; + /* 0x42C */ f32 field_0x42C; + /* 0x430 */ JPABaseEmitter* field_0x430; + /* 0x434 */ dBgS_ObjAcch field_0x434; + /* 0x5F8 */ dBgS_AcchCir field_0x5F8; + /* 0x638 */ dCcD_Stts field_0x638; + /* 0x674 */ dCcD_Stts field_0x674; + /* 0x6B0 */ dCcD_Cyl field_0x6B0; + /* 0x7E0 */ dCcD_Cyl field_0x7E0; + /* 0x910 */ dCcD_Cyl field_0x910; + /* 0xA40 */ dCcD_Cps field_0xA40; + /* 0xB78 */ cXyz field_0xB78; + /* 0xB84 */ cXyz field_0xB84; + /* 0xB90 */ cXyz field_0xB90; + /* 0xB9C */ s8 handRJointNo; + /* 0xB9D */ s8 hair1JointNo; + /* 0xB9E */ s8 hair2JointNo; + /* 0xB9F */ s8 hair3JointNo; + /* 0xBA0 */ s8 armLJointNo; + /* 0xBA1 */ s8 armRJointNo; + /* 0xBA2 */ s16 field_0xBA2; + /* 0xBA4 */ s16 field_0xBA4; + /* 0xBA6 */ s16 field_0xBA6; + /* 0xBA8 */ s16 field_0xBA8; + /* 0xBAA */ s16 field_0xBAA; + /* 0xBAC */ s16 field_0xBAC; + /* 0xBAE */ s16 field_0xBAE; + /* 0xBB0 */ s16 field_0xBB0; + /* 0xBB2 */ s16 field_0xBB2; + /* 0xBB4 */ s16 field_0xBB4; + /* 0xBB6 */ s16 field_0xBB6; + /* 0xBB8 */ s16 field_0xB86; + /* 0xBBA */ s16 field_0xBBA; + /* 0xBBC */ s16 field_0xBBC; + /* 0xBBE */ s16 field_0xBBE; + /* 0xBC0 */ s16 field_0xBC0; + /* 0xBC2 */ s16 field_0xBC2; + /* 0xBC4 */ s16 field_0xBC4; + /* 0xBC6 */ s16 field_0xBC6; + /* 0xBC8 */ s16 field_0xBC8; + /* 0xBCA */ s16 field_0xBCA; + /* 0xBCC */ s16 field_0xBCC; + /* 0xBCE */ s16 field_0xBCE; + /* 0xBD0 */ s16 field_0xBD0; + /* 0xBD2 */ s16 field_0xBD2; + /* 0xBD4 */ s16 field_0xBD4; + /* 0xBD6 */ s16 field_0xBD6; + /* 0xBD8 */ cXyz field_0xBD8[3]; + /* 0xBFC */ dNpc_HeadAnm_c field_0xBFC; + /* 0xC20 */ u32 pad_0xC20; + /* 0xC24 */ s32 field_0xC24; + /* 0xC28 */ u32 field_0xC28; + /* 0xC2C */ u32 field_0xC2C; + /* 0xC30 */ s32 field_0xC30; + /* 0xC34 */ s32 field_0xC34; + /* 0xC38 */ s32 field_0xC38; + /* 0xC3C */ s32 field_0xC3C; + /* 0xC40 */ cXyz field_0xC40; + /* 0xC4C */ f32 field_0xC4C; + /* 0xC50 */ f32 field_0xC50; + /* 0xC54 */ s16 field_0xC54; + /* 0xC56 */ s16 field_0xC56; + /* 0xC58 */ s16 field_0xC58; + /* 0xC5A */ s16 field_0xC5A; + /* 0xC5C */ s16 field_0xC5C; + /* 0xC5E */ s16 field_0xC5E; + /* 0xC60 */ s16 field_0xC60; + /* 0xC62 */ s16 field_0xC62; + /* 0xC64 */ s16 field_0xC64; + /* 0xC66 */ s16 field_0xC66; + /* 0xC68 */ s16 field_0xC68; + /* 0xC6A */ s16 field_0xC6A; + /* 0xC6C */ s16 field_0xC6C; + /* 0xC6E */ s16 field_0xC6E; + /* 0xC70 */ s16 field_0xC70; + /* 0xC72 */ s16 field_0xC72; + /* 0xC74 */ s16 field_0xC74; + /* 0xC76 */ s16 field_0xC76; + /* 0xC78 */ s8 field_0xC78; + /* 0xC7C */ request_of_phase_process_class field_0xC7C; + /* 0xC84 */ u32 field_0xC84; + /* 0xC88 */ s16 field_0xC88; + /* 0xC8C */ s32 field_0xC8C; + /* 0xC90 */ s32 field_0xC90; + /* 0xC94 */ u32 field_0xC94; + /* 0xC98 */ u32 field_0xC98; + /* 0xC9C */ f32 field_0xC9C; + /* 0xCA0 */ Mtx field_0xCA0; + /* 0xCD0 */ cXyz field_0xCD0; + /* 0xCDC */ cXyz field_0xCDC; + /* 0xCE8 */ u8 pad_0xCE8[0xC]; + /* 0xCF4 */ Quaternion field_0xCF4; + /* 0xD04 */ f32 field_0xD04; + /* 0xD08 */ f32 field_0xD08; + /* 0xD0C */ f32 field_0xD0C; + /* 0xD10 */ f32 field_0xD10; + /* 0xD14 */ s16 field_0xD14; + /* 0xD16 */ s16 field_0xD16; + /* 0xD18 */ f32 field_0xD18; + /* 0xD1C */ cXyz field_0xD1C; + /* 0xD28 */ cXyz field_0xD28; + /* 0xD34 */ u32 field_0xD34; + /* 0xD38 */ cXyz field_0xD38; + /* 0xD44 */ u8 pad_0xD44[0xC]; + /* 0xD50 */ cXyz field_0xD50; + /* 0xD5C */ csXyz field_0xD5C; + /* 0xD64 */ s32 field_0xD64; + /* 0xD68 */ s32 field_0xD68; + /* 0xD6C */ s32 field_0xD6C; + /* 0xD70 */ s32 field_0xD70; + /* 0xD74 */ s32 field_0xD74; + /* 0xD78 */ u8 field_0xD78; + /* 0xD79 */ u8 field_0xD79; + /* 0xD7A */ u8 field_0xD7A; + /* 0xD7B */ u8 field_0xD7B; + /* 0xD7C */ u8 field_0xD7C; + /* 0xD7D */ u8 field_0xD7D; + /* 0xD7E */ u8 field_0xD7E; + /* 0xD80 */ u32 field_0xD80; + /* 0xD84 */ u8 field_0xD84; + /* 0xD85 */ u8 field_0xD85; + + static s8 game_life_point; +}; // Size: 0xD88 + +class daNpc_Ji1_HIO_c : JORReflexible { public: daNpc_Ji1_HIO_c(); + virtual ~daNpc_Ji1_HIO_c() {} -public: - /* Place member variables here */ -}; + /* 0x004 */ s8 field_0x04; + /* 0x008 */ f32 field_0x08; + /* 0x00C */ s16 field_0x0C; + /* 0x00E */ s16 field_0x0E; + /* 0x010 */ s16 field_0x10; + /* 0x012 */ s16 field_0x12; + /* 0x014 */ s16 field_0x14; + /* 0x016 */ s16 field_0x16; + /* 0x018 */ s16 field_0x18; + /* 0x01A */ u8 field_0x1A; + /* 0x01C */ f32 field_0x1C; + /* 0x020 */ f32 field_0x20; + /* 0x024 */ f32 field_0x24; + /* 0x028 */ u8 field_0x28; + /* 0x02C */ f32 field_0x2C; + /* 0x030 */ u8 field_0x30; + /* 0x034 */ f32 field_0x34; + /* 0x038 */ f32 field_0x38; + /* 0x03C */ f32 field_0x3C; + /* 0x040 */ f32 field_0x40; + /* 0x044 */ f32 field_0x44; + /* 0x048 */ f32 field_0x48; + /* 0x04C */ f32 field_0x4C; + /* 0x050 */ f32 field_0x50; + /* 0x054 */ s16 field_0x54[6]; + /* 0x060 */ s16 field_0x60[4]; + /* 0x068 */ u8 field_0x68; + /* 0x06C */ f32 field_0x6C; + /* 0x070 */ f32 field_0x70; + /* 0x074 */ f32 field_0x74; + /* 0x078 */ f32 field_0x78; + /* 0x07C */ f32 field_0x7C; + /* 0x080 */ f32 field_0x80; + /* 0x084 */ f32 field_0x84; + /* 0x088 */ u16 field_0x88; + /* 0x08A */ u16 field_0x8A; + /* 0x08C */ u16 field_0x8C; + /* 0x08E */ u16 field_0x8E; + /* 0x090 */ u16 field_0x90; + /* 0x092 */ u16 field_0x92; + /* 0x094 */ u16 field_0x94; + /* 0x096 */ u16 field_0x96; + /* 0x098 */ u16 field_0x98; + /* 0x09A */ u16 field_0x9A; + /* 0x09C */ u16 field_0x9C; + /* 0x09E */ u16 field_0x9E; + /* 0x0A0 */ u16 field_0xA0; + /* 0x0A2 */ u8 field_0xA2; + /* 0x0A4 */ f32 field_0xA4; + /* 0x0A8 */ f32 field_0xA8; + /* 0x0AC */ f32 field_0xAC; + /* 0x0B0 */ f32 field_0xB0; + /* 0x0B4 */ f32 field_0xB4; + /* 0x0B8 */ u8 field_0xB8; + /* 0x0BC */ f32 field_0xBC; + /* 0x0C0 */ f32 field_0xC0; + /* 0x0C4 */ cXyz field_0xC4[3]; + /* 0x0E8 */ s16 field_0xE8; + /* 0x0EA */ s16 field_0xEA; + /* 0x0EC */ s16 field_0xEC; + /* 0x0EE */ s16 field_0xEE; + /* 0x0F0 */ s16 field_0xF0; + /* 0x0F2 */ s16 field_0xF2; + /* 0x0F4 */ s16 field_0xF4; + /* 0x0F6 */ s16 field_0xF6; + /* 0x0F8 */ s16 field_0xF8; + /* 0x0FA */ s16 field_0xFA; + /* 0x0FC */ s16 field_0xFC; + /* 0x0FE */ s16 field_0xFE; +}; // Size: 0x100 #endif /* D_A_NPC_JI1_H */ diff --git a/include/d/actor/d_a_tsubo.h b/include/d/actor/d_a_tsubo.h index 3a0888b41..39937daff 100644 --- a/include/d/actor/d_a_tsubo.h +++ b/include/d/actor/d_a_tsubo.h @@ -10,6 +10,7 @@ #include "d/d_a_obj.h" #include "SSystem/SComponent/c_angle.h" #include "SSystem/SComponent/c_phase.h" +#include "m_Do/m_Do_mtx.h" namespace daTsubo { class Act_c : public fopAc_ac_c { @@ -31,7 +32,20 @@ namespace daTsubo { void data() const {} void data_spec_boko(int) {} void is_switch() const {} - void pos_init() {} + void pos_init() { + current.pos = home.pos; + current.angle = home.angle; + shape_angle = home.angle; + + m688.Val(cSAngle::_0); + m68A.Val(cSAngle::_0); + m68C.Val(cSAngle::_0); + m68E.Val(cSAngle::_0); + m690.Val(cSAngle::_0); + m692.Val(current.angle.y); + + mDoMtx_identity(mPoseMtx); + } void prmZ_get_swSave() const {} void prm_get_cull() const {} void prm_get_itemNo() const {} diff --git a/include/d/d_attention.h b/include/d/d_attention.h index 09bee7f86..bfd2c2adf 100644 --- a/include/d/d_attention.h +++ b/include/d/d_attention.h @@ -204,7 +204,9 @@ public: u8 getCatchChgItem() { return mCatch.getChangeItem(); } void getCatghTarget() {} void offAleart() {} - void revivalAleart() {} + void revivalAleart() { + clrFlag(0x80000000); + } void LookRequest(fopAc_ac_c*, f32, f32, f32, s16, int) {} void Look2RequestF(fopAc_ac_c*, s16, int) {} void ZHintRequest(fopAc_ac_c*, int) {} diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index c5685c6b6..350291090 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -280,6 +280,7 @@ public: void setMessageCountNumber(s16 num) { mMsgCountNumber = num; } s16 getMiniGameRupee() { return mMiniGameRupee; } + void setMiniGameRupee(s16 count) { mMiniGameRupee = count; } void plusMiniGameRupee(s16 count) { if(mMiniGameRupee + count > 0) { mMiniGameRupee += count; @@ -638,10 +639,10 @@ public: /* 0x4A20 */ u8 mPlayerInfoBufferStageNo; /* 0x4A24 */ daAgb_c* mpAgb; /* 0x4A28 */ u32 mPlayerStatus[2][2]; - /* 0x4A38 */ u8 field_0x4A38[0x4A3A - 0x4A38]; + /* 0x4A38 */ u16 field_0x4A38; /* 0x4A3A */ u8 mMiniGameType; /* 0x4A3C */ s16 mMiniGameRupee; - /* 0x4A3D */ u8 field_0x4A3E[0x4A40 - 0x4A3E]; + /* 0x4A3E */ u8 field_0x4A3E; /* 0x4A40 */ __d_timer_info_c mTimerInfo; /* 0x4A54 */ dDlst_window_c* mCurrentWindow; /* 0x4A58 */ view_class* mCurrentView; @@ -1922,6 +1923,10 @@ inline dAttention_c& dComIfGp_getAttention() { return g_dComIfG_gameInfo.play.getAttention(); } +inline void dComIfGp_att_revivalAleart() { + return dComIfGp_getAttention().revivalAleart(); +} + inline dDetect_c& dComIfGp_getDetect() { return g_dComIfG_gameInfo.play.getDetect(); } @@ -2246,6 +2251,12 @@ inline u8 dComIfGp_getMiniGameType() { return g_dComIfG_gameInfo.play.getMiniGameType(); } +inline void dComIfGp_endMiniGame(u16 param_1) { + g_dComIfG_gameInfo.play.mMiniGameType = 0; + g_dComIfG_gameInfo.play.field_0x4A38 ^= 1 << param_1 - 1; // what + g_dComIfG_gameInfo.play.field_0x4A3E = 0; +} + inline u8 dComIfGp_getAStatus() { return g_dComIfG_gameInfo.play.getAStatus(); } @@ -2286,6 +2297,10 @@ inline s16 dComIfGp_getMiniGameRupee() { return g_dComIfG_gameInfo.play.getMiniGameRupee(); } +inline void dComIfGp_setMiniGameRupee(s16 count) { + return g_dComIfG_gameInfo.play.setMiniGameRupee(count); +} + inline void dComIfGp_plusMiniGameRupee(s16 count) { g_dComIfG_gameInfo.play.plusMiniGameRupee(count); } diff --git a/include/d/d_item_data.h b/include/d/d_item_data.h index de19e6d8d..2af52029c 100644 --- a/include/d/d_item_data.h +++ b/include/d/d_item_data.h @@ -174,7 +174,7 @@ enum ItemTable { /* 0xA7 */ TINGLE_STATUE5, /* 0xA8 */ TINGLE_STATUE6, /* 0xA9 */ noentry169, - /* 0xAA */ noentry170, + /* 0xAA */ HURRICANE_SPIN, /* 0xAB */ MAX_RUPEE_UP1, /* 0xAC */ MAX_RUPEE_UP2, /* 0xAD */ MAX_BOMB_UP1, diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 4ac8f2c4b..cef69e11e 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -392,6 +392,7 @@ void dKy_set_nexttime(f32); void dKy_instant_timechg(f32); void dKy_instant_rainchg(); SND_INFLUENCE * dKy_Sound_get(); +void dKy_SordFlush_set(cXyz hitPos, int lightType); void dKy_Sound_set(cXyz i_pos, int param_1, unsigned int i_actorID, int param_3); void dKy_SordFlush_set(cXyz hitPos, int lightType); void dKy_itudemo_se(); diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 5a39c46e5..84548e86a 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -106,6 +106,7 @@ public: }; class dNpc_EventCut_c { +private: /* 0x00 */ char* mpEvtStaffName; /* 0x04 */ int mEvtStaffId; /* 0x08 */ fopAc_ac_c* mpActor; @@ -129,13 +130,13 @@ class dNpc_EventCut_c { /* 0x61 */ u8 mbNoTurn; /* 0x62 */ s16 mTurnSpeed; /* 0x64 */ u32 mTurnType; - /* 0x68 */ u8* field_0x68; + /* 0x68 */ dNpc_JntCtrl_c* mpJntCtrl; public: dNpc_EventCut_c() { mpActor = 0; mpTalkActor = 0; - field_0x68 = 0; + mpJntCtrl = 0; } void setActorInfo(char*, fopAc_ac_c*); @@ -155,6 +156,21 @@ public: void cutTalkMsgStart(); void cutContinueTalkStart(); void cutTalkMsgProc(); + + char* getActorName() { + return mpEvtStaffName; + } + + bool getAttnFlag() { + return mbAttention; + } + cXyz getAttnPos() { + return mPos; + } + + void setJntCtrlPtr(dNpc_JntCtrl_c* ctrl) { + mpJntCtrl = ctrl; + } static fopAc_ac_c* findActorCallBack(fopAc_ac_c*, void*); }; @@ -196,12 +212,23 @@ public: void swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, int param_4); void swing_horizone(); void move(); + + dNpc_HeadAnm_c() { + field_0x14 = 0.0f; + field_0x18 = 0.0f; + field_0x1C = 0.0f; + field_0x1E = 0; + field_0x20 = 0; + field_0x00 = 0; + field_0x02 = 0; + field_0x04 = 0; + } typedef void (dNpc_HeadAnm_c::*swing_func)(void); /* 0x00 */ s16 field_0x00; /* 0x02 */ s16 field_0x02; - /* 0x04 */ u32 field_0x04; + /* 0x04 */ s16 field_0x04; /* 0x08 */ swing_func mFunc; /* 0x14 */ f32 field_0x14; /* 0x18 */ f32 field_0x18; diff --git a/include/d/d_timer.h b/include/d/d_timer.h index ca0f88023..35694bf0c 100644 --- a/include/d/d_timer.h +++ b/include/d/d_timer.h @@ -105,4 +105,6 @@ public: s32 dTimer_createStockTimer(); +void dTimer_createTimer(int, u16, u8, u8, f32, f32, f32, f32); + #endif /* D_TIMER_H */ diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 8510bb159..6c523de7c 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -447,6 +447,8 @@ s32 fopAcM_createChild(s16 procName, unsigned int parentPId, u32 parameters, cXy int roomNo, csXyz* p_angle, cXyz* p_scale = NULL, s8 subType = -1, createFunc p_createFunc = NULL); +s32 fopAcM_createChild(char* pProcNameString, unsigned int parentPcId, u32 parameter, cXyz* pPos, int roomNo, csXyz* pAngle, cXyz* pScale, createFunc createFunc); + s32 fopAcM_createChildFromOffset(s16 procName, unsigned int parentProcID, u32 actorParams, cXyz* p_pos, int roomNo, csXyz* p_angle, cXyz* p_scale, s8 subType, createFunc p_createFunc); diff --git a/include/f_op/f_op_msg_mng.h b/include/f_op/f_op_msg_mng.h index b04018845..5bb98e922 100644 --- a/include/f_op/f_op_msg_mng.h +++ b/include/f_op/f_op_msg_mng.h @@ -102,4 +102,8 @@ void fopMsgM_messageSendOn(); u32 fopMsgM_tactMessageSet(); void fopMsgM_demoMsgFlagOn(); +void fopMsgM_demoMsgFlagOn(); +void fopMsgM_demoMsgFlagOff(); +bool fopMsgM_demoMsgFlagCheck(); + #endif diff --git a/src/d/actor/d_a_demo_item.cpp b/src/d/actor/d_a_demo_item.cpp index a877aa755..86f0ac978 100644 --- a/src/d/actor/d_a_demo_item.cpp +++ b/src/d/actor/d_a_demo_item.cpp @@ -189,7 +189,7 @@ u8 daDitem_c::m_effect_type[0x100] = { /* TINGLE_STATUE5 */ 0x00, /* TINGLE_STATUE6 */ 0x00, /* noentry169 */ 0x04, - /* noentry170 */ 0x04, + /* HURRICANE_SPIN */ 0x04, /* MAX_RUPEE_UP1 */ 0x00, /* MAX_RUPEE_UP2 */ 0x00, /* MAX_BOMB_UP1 */ 0x00, diff --git a/src/d/actor/d_a_npc_ji1.cpp b/src/d/actor/d_a_npc_ji1.cpp index 5edee54ae..4d2879804 100644 --- a/src/d/actor/d_a_npc_ji1.cpp +++ b/src/d/actor/d_a_npc_ji1.cpp @@ -4,240 +4,1374 @@ // #include "d/actor/d_a_npc_ji1.h" -#include "m_Do/m_Do_ext.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/d_snap.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_tsubo.h" +#include "f_op/f_op_msg.h" + +static void daNpc_Ji1_setHairAngle(daNpc_Ji1_c*); + +// Needed for the .data section to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0, 0.5}; + +// There's also a bunch of unreferenced stuff at the start of .bss +static u8 dummy5[0x4C]; + +static daNpc_Ji1_HIO_c l_HIO; + +static u32 l_msgId; +static msg_class* l_msg; + +static dCcD_SrcCyl l_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ TG_SPRM_SET | TG_SPRM_IS_ENEMY, + /* SrcObjCo SPrm */ CO_SPRM_SET | CO_SPRM_IS_UNK4 | CO_SPRM_VS_UNK2 | CO_SPRM_VS_UNK4 | CO_SPRM_VS_UNK8, + /* 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, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 60.0f, + /* Height */ 170.0f, + }, +}; + +static dCcD_SrcCyl l_cyl2_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* 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, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 60.0f, + /* Height */ 200.0f, + }, +}; + +static dCcD_SrcCyl l_cylAt_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_BOMB, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ AT_SPRM_SET | AT_SPRM_VS_ENEMY | AT_SPRM_VS_OTHER, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* 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, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 150.0f, + /* Height */ 100.0f, + }, +}; + +static dCcD_SrcCps l_cpsAt_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_UNK800, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ AT_SPRM_SET | AT_SPRM_VS_PLAYER | AT_SPRM_VS_OTHER, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0x01, + /* 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, + }, + // cM3dGCpsS + { + /* Start */ 0.0f, 0.0f, 0.0f, + /* End */ 0.0f, 0.0f, 0.0f, + /* Radius */ 80.0f, + }, +}; /* 000000EC-00000380 .text __ct__15daNpc_Ji1_HIO_cFv */ daNpc_Ji1_HIO_c::daNpc_Ji1_HIO_c() { - /* Nonmatching */ + field_0x04 = -1; + field_0x08 = 100.0f; + field_0x0C = 7000; + field_0x0E = 4000; + field_0x10 = 9000; + field_0x12 = 7000; + field_0x14 = 5000; + field_0x16 = 1; + field_0x18 = 2000; + field_0x1C = 0.0f; + field_0x20 = 20.0f; + field_0x24 = 20.0f; + field_0x28 = 0; + field_0x2C = 200.0f; + field_0x30 = 0; + field_0x34 = 150.0f; + field_0x38 = 20.0f; + field_0x3C = 90.0f; + field_0x40 = 10.0f; + field_0x44 = 2.0f; + field_0x48 = 2.0f; + field_0x4C = 1.25f; + field_0x50 = 1.5f; + field_0x54[0] = 9; + field_0x54[1] = 9; + field_0x54[2] = 9; + field_0x54[3] = 2; + field_0x54[4] = 2; + field_0x54[5] = 2; + field_0x60[0] = 100; + field_0x60[1] = 300; + field_0x60[2] = 500; + field_0x60[3] = 1000; + field_0x68 = 0; + field_0x6C = 0.7; + field_0x70 = 1.5; + field_0x78 = 1.4; + field_0x74 = 1.4; + field_0x80 = 1.4; + field_0x7C = 1.2; + field_0x84 = 0.1; + field_0x88 = 0xB; + field_0x8A = 0x32; + field_0x8C = 0x28; + field_0x8E = 0x1e; + field_0x90 = 0x14; + field_0x92 = 0xf; + field_0x94 = 10; + field_0x96 = 0xB4; + field_0x98 = 0x8C; + field_0x9A = 100; + field_0x9C = 0x50; + field_0x9E = 0x3C; + field_0xA0 = 0x32; + field_0xA4 = 6.0f; + field_0xA8 = 16.0f; + field_0xAC = 70.0f; + field_0xB0 = 10.0f; + field_0xB4 = 1.0f; + field_0xB8 = 0; + field_0xBC = 0.25f; + field_0xC0 = -5.0f; + field_0xC4[0].x = 90.0; + field_0xC4[0].y = 5.0; + field_0xC4[0].z = 30.0; + field_0xC4[1].x = 90.0; + field_0xC4[1].y = 5.0; + field_0xC4[1].z = -30.0; + field_0xC4[2].x = -20.0; + field_0xC4[2].y = -20.0; + field_0xC4[2].z = 0.0; + field_0xE8 = 0xC800; + field_0xEA = 0x3800; + field_0xEC = 0xC600; + field_0xEE = 0x3A00; + field_0xF0 = 0xC600; + field_0xF2 = 0x3A00; + field_0xF4 = 0xfB00; + field_0xF6 = 0x3800; + field_0xF8 = 0xf600; + field_0xFA = 0x3A00; + field_0xFC = 0xf100; + field_0xFE = 0x3A00; } /* 000003C0-000003E4 .text daNpc_Ji1_XyCheckCB__FPvi */ -static s16 daNpc_Ji1_XyCheckCB(void*, int) { - /* Nonmatching */ +s16 daNpc_Ji1_XyCheckCB(void*, int equippedItemIdx) { + return dComIfGp_getSelectItem(equippedItemIdx) == BOKO_BELT ? TRUE : FALSE; } /* 000003E4-00000404 .text daJi1_CoHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daJi1_CoHitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daJi1_CoHitCallback(fopAc_ac_c* i_this, dCcD_GObjInf*, fopAc_ac_c* actor, dCcD_GObjInf*) { + if(actor == dComIfGp_getPlayer(0)) { + static_cast(i_this)->field_0xC28 = 1; + } } /* 00000404-00000424 .text daJi1_TgHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daJi1_TgHitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daJi1_TgHitCallback(fopAc_ac_c* i_this, dCcD_GObjInf*, fopAc_ac_c* actor, dCcD_GObjInf*) { + u32 temp = daPy_getPlayerActorClass()->getCutType(); + if(actor) { + static_cast(i_this)->field_0xC24 = temp; + } } /* 00000424-000004A0 .text daJi1_AtHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daJi1_AtHitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daJi1_AtHitCallback(fopAc_ac_c* i_this, dCcD_GObjInf* param_2, fopAc_ac_c* actor, dCcD_GObjInf*) { + if(fopAc_IsActor(actor)) { + if(fpcM_GetName(actor) == PROC_PLAYER) { + if(!param_2->ChkAtShieldHit()) { + static_cast(i_this)->field_0xC3C++; + } + else { + static_cast(i_this)->battleSubActionNockBackInit(0); + } + } + } } /* 000004A0-000004CC .text isGuardAnim__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::isGuardAnim() { - /* Nonmatching */ +BOOL daNpc_Ji1_c::isGuardAnim() { + if(field_0xD64 >= 8 && field_0xD64 <= 10 || field_0xD64 == 0xF) { + return true; + } + + return false; } /* 000004CC-000004F8 .text isAttackAnim__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::isAttackAnim() { - /* Nonmatching */ +BOOL daNpc_Ji1_c::isAttackAnim() { + if(field_0xD64 == 0x13 || field_0xD64 == 0x14 || field_0xD64 == 7) { + return true; + } + + return false; } /* 000004F8-0000056C .text isAttackFrame__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::isAttackFrame() { - /* Nonmatching */ +int daNpc_Ji1_c::isAttackFrame() { + f32 frame = field_0x330->getFrame(); + f32 temp2 = 0.0f; + f32 temp3 = temp2; + + if(field_0xD64 == 0x13) { + temp2 = 28.0f; + temp3 = 35.0f; + } + else if (field_0xD64 == 0x14) { + temp2 = 25.0f; + temp3 = 35.0f; + } + else { + if(field_0xD64 == 7) { + temp2 = 12.0f; + temp3 = 28.0f; + } + } + + if(temp2 > frame) { + return -1; + } + + return temp3 < frame; } /* 0000056C-000005A0 .text isItemWaitAnim__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::isItemWaitAnim() { - /* Nonmatching */ +BOOL daNpc_Ji1_c::isItemWaitAnim() { + if(field_0xD64 == 0 || field_0xD64 == 0xC || field_0xD64 == 0xD || field_0xD64 == 0x18) { + return true; + } + + return false; } /* 000005A0-00000630 .text isClearRecord__11daNpc_Ji1_cFs */ -void daNpc_Ji1_c::isClearRecord(short) { - /* Nonmatching */ +BOOL daNpc_Ji1_c::isClearRecord(s16 param_1) { + if(dComIfGs_isEventBit(0xF20)) { + return false; + } + + u8 level = dComIfGs_getEventReg(0xD003); + return param_1 >= l_HIO.field_0x60[level] ? TRUE : FALSE; // has a clrlwi without the ternary + int literal defines } /* 00000630-000006F8 .text setClearRecord__11daNpc_Ji1_cFs */ -void daNpc_Ji1_c::setClearRecord(short) { - /* Nonmatching */ +void daNpc_Ji1_c::setClearRecord(s16 hits) { + u8 oldLevel = dComIfGs_getEventReg(0xD003); + + u8 newLevel = 0; + while(hits >= l_HIO.field_0x60[newLevel] && newLevel <= 3) { + newLevel++; + } + + if(oldLevel < newLevel) { + dComIfGs_setEventReg(0xD003, newLevel); + if(hits >= l_HIO.field_0x60[3]) { + dComIfGs_onEventBit(0xF20); + } + } } /* 000006F8-00000864 .text daNpc_Ji1_plRoomOutCheck__Fv */ -void daNpc_Ji1_plRoomOutCheck() { - /* Nonmatching */ +BOOL daNpc_Ji1_plRoomOutCheck() { + cXyz plyrPos = daPy_getPlayerActorClass()->current.pos; + static cXyz out_chk_pos(0.0f, 0.0f, 500.0f); + + cXyz temp = plyrPos - out_chk_pos; + if(temp.absXZ() < 100.0f && g_dComIfG_gameInfo.play.getDoStatus() == 0xB) { + return true; + } + + return false; } /* 00000864-00000E98 .text normalSubActionHarpoonGuard__11daNpc_Ji1_cFs */ -void daNpc_Ji1_c::normalSubActionHarpoonGuard(short) { +u32 daNpc_Ji1_c::normalSubActionHarpoonGuard(s16 param_1) { /* Nonmatching */ + + if(field_0xD6C == 0) { + if(field_0x7E0.ChkTgHit()) { + field_0xD6C = 1; + field_0xD74++; + field_0xD68 = 0; + setAnm(9, 0.0f, 1); + dComIfGp_particle_set(0xC, field_0x7E0.GetTgHitPosP()); + fopAcM_seStart(this, JA_SE_CV_JI_DEFENCE, 0); + fopAcM_seStart(this, JA_SE_OBJ_COL_SWS_NMTLP, 0); + } + else { + if(field_0xD64 == 0xD) { + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2.0f) && ++field_0xD68 > 1) { + setAnm(0, 12.0f, 0); + } + } + } + } + + if(field_0xD6C == 1) { + cLib_addCalcAngleS2(¤t.angle.y, param_1, 2, 0x2000); + if(field_0xD64 == 0xB) { + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 14.0f)) { + setParticle(3, 3.0f, 0.5f); + fopAcM_seStart(this, JA_SE_CV_JI_ATTACK, 0); + } + else if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2.0f)) { + dtParticle(); + if(field_0xD68++ > 2) { + field_0xD6C = 0; + setAnm(0, 16.0f, 0); + } + else { + setAnm(0xB, 4.0f, 1); + field_0x330->setPlaySpeed(2.0f); + } + } + } + else { + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2.0f)) { + field_0xD6C = 0; + if(field_0xD74 == 3) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xC; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else if(field_0xD74 == 5) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xD; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else if(field_0xD74 > 5) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xE; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + + field_0xD74 = 0; + } + else { + setAnm(0xD, 8.0f, 0); + } + } + } + } } /* 00000E98-00001294 .text normalSubActionGuard__11daNpc_Ji1_cFs */ -void daNpc_Ji1_c::normalSubActionGuard(short) { +u32 daNpc_Ji1_c::normalSubActionGuard(s16 param_1) { /* Nonmatching */ + + if(field_0xD6C == 0) { + if(field_0x7E0.ChkTgHit()) { + field_0xD6C = 1; + field_0xD68 = 0; + setAnm(0xF, 0.0f, 1); + fopAcM_seStart(this, JA_SE_CV_JI_DEFENCE, 0); + } + } + + if(field_0xD6C == 1) { + cLib_addCalcAngleS2(¤t.angle.y, param_1, 2, 0x2000); + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2.0f) && field_0xD68++ > 1) { + field_0xD6C = 0; + if(field_0xD74 == 3) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xC; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else if(field_0xD74 == 5) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xD; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else if(field_0xD74 > 5) { + setAnm(5, 4.0f, 0); + field_0xC84 = 0xE; + field_0x2C8 = field_0x2B0; + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + setAnm(0x1, 8.0f, 0); + } + } + } } /* 00001294-000015E4 .text normalAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::normalAction(void*) { +u32 daNpc_Ji1_c::normalAction(void*) { /* Nonmatching */ } /* 000015E4-000019B0 .text kaitenExpAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::kaitenExpAction(void*) { +u32 daNpc_Ji1_c::kaitenExpAction(void*) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + f32 temp = sqrtf((player->current.pos - current.pos).getMagXZ()); + + if(field_0xD64 == 0x10) { + if(field_0x330->checkFrame(19.0f)) { + if(field_0xD68 == 1) { + dComIfGp_getVibration().StartShock(5, -0x11, cXyz(0.0f, 1.0f, 0.0f)); + } + + fopAcM_seStart(this, JA_SE_CV_JI_ATTACK, 0); + fopAcM_seStart(this, JA_SE_CM_JI_SHOTEI, 0); + setParticle(3, 3.0f, 0.5f); + } + + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2.0f)) { + if(++field_0xD68 > 1) { + field_0xD68 = 0; + setAnm(0x11, 4.0f, 0); + } + + dtParticle(); + } + } + + if(field_0xC78 == 0) { + setAnm(0x10, 4.0f, 0); + if(!mEvtInfo.checkCommandDemoAccrpt()) { + fopAcM_orderOtherEventId(this, field_0xC60); + mEvtInfo.onCondition(dEvtCmd_INDEMO_e); + + return false; + } + + field_0xC78++; + } + else if(field_0xC78 != -1) { + int staffIdx = dComIfGp_evmng_getMyStaffId("Ji1"); + if(getEventActionNo(staffIdx) == 2) { + Func_t temp3 = &kaitenspeakAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + + return true; } /* 000019B0-00001B9C .text kaitenspeakAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::kaitenspeakAction(void*) { +u32 daNpc_Ji1_c::kaitenspeakAction(void*) { /* Nonmatching */ + + if(field_0xC78 == 0) { + setAnm(1, 8.0f, 0); + field_0xC78++; + } + else if(field_0xC78 != -1) { + cXyz temp = daPy_getPlayerActorClass()->current.pos - current.pos; + s16 temp2 = cM_atan2s(temp.x, temp.z) - current.angle.y; + m_jnt.setTrn(); + if(abs(temp2) < 0x1000) { + setAnm(3, 8.0f, 0); + } + + int staffIdx = dComIfGp_evmng_getMyStaffId("Ji1"); + if(getEventActionNo(staffIdx) == 2) { + if(temp2 == 0) { + m_jnt.clrTrn(); + + Func_t temp3 = &talkAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + } + else { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + + return true; } /* 00001B9C-0000214C .text kaitenwaitAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::kaitenwaitAction(void*) { +u32 daNpc_Ji1_c::kaitenwaitAction(void*) { /* Nonmatching */ } /* 0000214C-00002738 .text kaitenAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::kaitenAction(void*) { +u32 daNpc_Ji1_c::kaitenAction(void*) { /* Nonmatching */ } /* 00002738-00002870 .text getMsg1stType__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::getMsg1stType() { - /* Nonmatching */ +u32 daNpc_Ji1_c::getMsg1stType() { + if(!dComIfGs_isEventBit(1)) { + if(!dComIfGs_isEventBit(0x501)) { + if(dComIfGs_isEventBit(0x640)) { + return 0x964; + } + + dComIfGs_onEventBit(0x640); + return 0x961; + } + + if(dComIfGs_isEventBit(0x2F40)) { + return 0x95B; + } + + if(field_0xD79) { + return 0x977; + } + + if(!field_0xD78) { + field_0xD78 = 1; + return 0x978; + } + + return 0x97B; + } + + if(dComIfGs_isEventBit(0x2F10)) { + return 0x973; + } + + if(!dComIfGs_isEventBit(0x108)) { + dComIfGs_onEventBit(0x108); + mEvtInfo.setEventId(-1); + + return 0x965; + } + + return 0x94D; } /* 00002870-00002A08 .text getMsg2ndType__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::getMsg2ndType() { - /* Nonmatching */ +u32 daNpc_Ji1_c::getMsg2ndType() { + u32 msgNo; + + if(dComIfGp_event_chkTalkXY()) { + m_jnt.offBackBoneLock(); + if(!dComIfGs_isEventBit(0xD80)) { + dComIfGs_onEventBit(0xD80); + msgNo = 0x9AE; + } + else if(dComIfGs_getBeastNum(3) < 10) { + msgNo = 0x9BB; + } + else if(dComIfGs_isEventBit(0xB20)) { + msgNo = 0x9BC; + } + else { + msgNo = 0x9B0; + } + } + else if(dComIfGs_isEventBit(0x2)) { + if(dComIfGs_isEventBit(0xF20)) { + if(dComIfGs_getEventReg(0xCF03) >= 3) { + msgNo = 0x9AC; + } + else { + msgNo = 0x9AD; + } + } + else if(dComIfGs_getEventReg(0xCF03) >= 3) { + msgNo = 0x9AA; + } + else { + msgNo = 0x9AB; + } + } + else { + msgNo = 0x986; + dComIfGs_onEventBit(0x2); + } + + dComIfGs_setEventReg(0xCF03, 0); + return msgNo; } /* 00002A08-00002A60 .text getMsg__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Ji1_c::getMsg() { + if(dComIfGs_isEventBit(0x520)) { + return getMsg2ndType(); + } + + return getMsg1stType(); } /* 00002A60-00002C64 .text next_msgStatus__11daNpc_Ji1_cFPUl */ -void daNpc_Ji1_c::next_msgStatus(unsigned long*) { +u16 daNpc_Ji1_c::next_msgStatus(u32* msgId) { /* Nonmatching */ + + u16 status = fopMsgStts_MSG_CONTINUES_e; + switch(field_0x2AC) { + case 0x951: + case 0x952: + case 0x956: + case 0x957: + case 0x959: + case 0x95B: + case 0x95F: + case 0x961: + case 0x962: + case 0x965: + case 0x975: + case 0x978: + case 0x979: + case 0x986: + case 0x987: + case 0x988: + case 0x989: + case 0x98B: + case 0x98D: + case 0x98F: + case 0x991: + case 0x993: + case 0x99B: + case 0x99D: + case 0x99F: + case 0x9A1: + case 0x9A7: + case 0x9AA: + case 0x9AC: + case 0x9AE: + case 0x9B0: + case 0x9B1: + case 0x9B2: + case 0x9B3: + case 0x9B8: + case 0x9B9: + field_0x2AC = field_0x2AC + 1; + break; + case 0x97B: + field_0x2AC = 0x9C0; + break; + case 0x9A2: + if(dComIfGs_isEventBit(0xF10)) { + field_0x2AC = 0x9A3; + } + else { + field_0x2AC = 0x9A5; + } + + break; + case 0x9AF: + if(dComIfGs_getBeastNum(3) >= 10) { + field_0x2AC = 0x9B0; + } + else { + field_0x2AC = 0x9BB; + } + + break; + case 0x997: + case 0x999: + field_0x2AC = 0x998; + break; + case 0x99A: + if(dComIfGs_getEventReg(0xD003) == 1) { + field_0x2AC = 0x99B; + } + else if(dComIfGs_getEventReg(0xD003) == 2) { + field_0x2AC = 0x99D; + } + else { + field_0x2AC = 0x99F; + } + + break; + case 0x95C: + case 0x973: + case 0x976: + case 0x977: + case 0x97A: + case 0x9C0: + field_0x2AC = 0x967; + break; + case 0x94D: + case 0x966: + field_0x2AC = 0x94E; + break; + case 0x967: + if(l_msg->mSelectNum == 0) { + status = fopMsgStts_MSG_ENDS_e; + } + else if (l_msg->mSelectNum == 1) { + field_0x2AC = 0x968; + } + + break; + case 0x94E: + if(l_msg->mSelectNum == 0) { + status = fopMsgStts_MSG_ENDS_e; + } + else if (l_msg->mSelectNum == 1) { + field_0x2AC = 0x94F; + } + + break; + case 0x98A: + case 0x9AB: + case 0x9AD: + if(l_msg->mSelectNum == 0) { + status = fopMsgStts_MSG_ENDS_e; + } + else if (l_msg->mSelectNum == 1) { + field_0x2AC = 0x995; + } + + break; + default: + status = fopMsgStts_MSG_ENDS_e; + } + + return status; } /* 00002C64-000033D0 .text talkAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::talkAction(void*) { +u32 daNpc_Ji1_c::talkAction(void*) { /* Nonmatching */ } /* 000033D0-000039AC .text speakAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::speakAction(void*) { +u32 daNpc_Ji1_c::speakAction(void*) { /* Nonmatching */ } /* 000039AC-00003F54 .text speakBadAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::speakBadAction(void*) { +u32 daNpc_Ji1_c::speakBadAction(void*) { /* Nonmatching */ } /* 00003F54-00004050 .text initPosObject__11daNpc_Ji1_cFPvPv */ -void daNpc_Ji1_c::initPosObject(void*, void*) { - /* Nonmatching */ +void* daNpc_Ji1_c::initPosObject(void* pActor, void* pData) { + if(fopAc_IsActor(pActor) && fopAcM_GetName(pActor) == PROC_TSUBO && static_cast(pActor)->m678 == 2) { + ((daTsubo::Act_c*)pActor)->pos_init(); + } + + return 0; } /* 00004050-000040FC .text initPos__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::initPos(int) { - /* Nonmatching */ +void daNpc_Ji1_c::initPos(int param_1) { + if(param_1 >= 0) { + setAnm(param_1, 0.0f, 0); + } + + fopAcM_Search((fopAcIt_JudgeFunc)&initPosObject, this); + old.pos = field_0xD28; + current.pos = old.pos; + current.angle = csXyz(home.angle.y, 0, 0); } /* 00004138-00004268 .text createItem__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::createItem() { - /* Nonmatching */ + u8 itemNo; + + if(field_0xD7C) { + itemNo = SWORD; + } + else if(field_0xD7B == 1) { + itemNo = HURRICANE_SPIN; + } + else if(dComIfGs_getEventReg(0xD003) == 1) { + itemNo = PURPLE_RUPEE; + } + else if(dComIfGs_getEventReg(0xD003) == 2) { + itemNo = ORANGE_RUPEE; + } + else if(field_0xD70 >= l_HIO.field_0x60[3] && dComIfGs_isEventBit(0xF10)) { + itemNo = SILVER_RUPEE; + } + else { + itemNo = KAKERA_HEART; + dComIfGs_onEventBit(0xF10); + } + + u32 itemPID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, current.roomNo); + if(itemPID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemPID); + } + + field_0xD7D = itemNo; } /* 00004268-00004448 .text set_mtx__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::set_mtx() { /* Nonmatching */ + + J3DModel* pModel = field_0x330->getModel(); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); + field_0x330->calc(); + pModel->setAnmMtx(m_jnt.getHeadJntNum(), field_0x3F8->getBaseTRMtx()); + + if(field_0x430) { + field_0x430->setGlobalRTMatrix(pModel->getAnmMtx(m_jnt.getHeadJntNum())); + } + + if(field_0xD84 == 1) { + mDoMtx_stack_c::copy(pModel->getAnmMtx(handRJointNo)); + mDoMtx_stack_c::XYZrotM(field_0xD5C); + mDoMtx_stack_c::transM(field_0xD50); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + } + mpMorf->calc(); + + if(field_0xD84) { + cXyz temp(0.0f, 0.0f, 100.0f); + cXyz temp2(0.0f, 0.0f, -100.0f); + + if(field_0xD64 == 0x14) { + temp.z = 70.0f; + } + + field_0xB90 = field_0xB78; + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(1)); + mDoMtx_stack_c::multVec(&temp, &field_0xB78); + mDoMtx_stack_c::multVec(&temp2, &field_0xB84); + } } /* 00004448-00004488 .text getEventActionNo__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::getEventActionNo(int) { +s32 daNpc_Ji1_c::getEventActionNo(int staffIdx) { /* Nonmatching */ + + static char* ActionNames[] = { + "00_dummy", + "01_dummy", + "02_dummy", + "03_dummy", + "04_dummy", + "05_dummy", + "06_dummy" + }; + + return dComIfGp_evmng_getMyActIdx(staffIdx, ActionNames, 7, 0, 0); } /* 00004488-00004714 .text eventAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::eventAction(void*) { +u32 daNpc_Ji1_c::eventAction(void*) { /* Nonmatching */ } /* 00004714-00004778 .text evn_init_pos_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_init_pos_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_init_pos_init(int staffIdx) { + u32* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "AnmNo"); + + u32 value = 0; + if(data) { + value = *data; + } + + initPos(value); + return 1; } /* 00004778-00004838 .text evn_setAnm_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_setAnm_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_setAnm_init(int staffIdx) { + u32* iData = dComIfGp_evmng_getMyIntegerP(staffIdx, "AnmNo"); + f32* fData = dComIfGp_evmng_getMyFloatP(staffIdx, "hokan"); + + if(iData) { + int iVal = *iData; + f32 fVal = 0.0f; + if(fData) { + fVal = *fData; + } + + if(field_0xD84 != 1 && iVal == 5) { + iVal = 1; + } + + setAnm(iVal, fVal, 0); + } + + return 1; } /* 00004838-000049AC .text evn_talk_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_talk_init(int) { +u32 daNpc_Ji1_c::evn_talk_init(int staffIdx) { /* Nonmatching */ + + u32* pMsgNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo"); + u32* pEndMsgNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMsgNo"); + + l_msgId = -1; + l_msg = 0; + if(pMsgNo) { + field_0x2AC = *pMsgNo; + if(field_0x2AC == 0x9A4) { + if(field_0xC38 == 2) { + field_0x2AC = 0x9A9; + } + else if(field_0xD7D == 7) { + field_0x2AC = 0x9A6; + } + } + else if(field_0x2AC == 0x9A1) { + if(field_0xC38 == 2) { + field_0x2AC = 0x9A7; + } + } + else if(field_0x2AC == 0x9B7) { + if(field_0x2C8 == &daNpc_Ji1_c::kaitenwaitAction) { + field_0x2AC = 0x95E; + } + else if(field_0x2C8 == &daNpc_Ji1_c::teachAction) { + field_0x2AC = 0x95D; + } + } + } + else { + field_0x2AC = 0; + } + + if(pEndMsgNo) { + field_0xD80 = *pEndMsgNo; + } + else { + field_0xD80 = 0; + } + + return 1; } /* 000049AC-00004B1C .text evn_talk__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::evn_talk() { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_talk() { + if(l_msgId == -1) { + l_msgId = fopMsgM_messageSet(field_0x2AC, &mEyePos); + } + else if(!l_msg) { + l_msg = fopMsgM_SearchByID(l_msgId); + fopMsgM_demoMsgFlagOn(); + } + else { + setAnimFromMsgNo(field_0x2AC); + if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + l_msg->mStatus = next_msgStatus(&field_0x2AC); + if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(field_0x2AC); + } + else if(l_msg->mStatus == fopMsgStts_MSG_ENDS_e) { + if(field_0x2AC == 0x9BA) { + field_0xD7B = 0; + field_0xD6C = 0; + } + else if(field_0x2AC == 0x95A) { + field_0xD7C = 0; + field_0xD6C = 0; + } + } + } + else { + if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + l_msg = 0; + l_msgId = -1; + + return true; + } + + if((l_msg->mStatus == fopMsgStts_BOX_OPENING_e || l_msg->mStatus == fopMsgStts_MSG_TYPING_e) && field_0x2AC == field_0xD80) { + field_0xD80 = 0; + return true; + } + } + } + + return false; } /* 00004B1C-00004B84 .text evn_continue_talk_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_continue_talk_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_continue_talk_init(int staffIdx) { + u32* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMsgNo"); + + if(data) { + field_0xD80 = *data; + } + else { + field_0xD80 = 0; + } + + return 1; } /* 00004B84-00004CF4 .text evn_continue_talk__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::evn_continue_talk() { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_continue_talk() { + if(l_msgId == -1) { + l_msgId = fopMsgM_messageSet(field_0x2AC, &mEyePos); + } + else if(!l_msg) { + l_msg = fopMsgM_SearchByID(l_msgId); + fopMsgM_demoMsgFlagOn(); + } + else { + setAnimFromMsgNo(field_0x2AC); + if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + l_msg->mStatus = next_msgStatus(&field_0x2AC); + if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(field_0x2AC); + } + else if(l_msg->mStatus == fopMsgStts_MSG_ENDS_e) { + if(field_0x2AC == 0x9BA) { + field_0xD7B = 0; + field_0xD6C = 0; + } + else if(field_0x2AC == 0x95A) { + field_0xD7C = 0; + field_0xD6C = 0; + } + } + } + else { + if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + l_msg = 0; + l_msgId = -1; + + return true; + } + + if((l_msg->mStatus == fopMsgStts_BOX_OPENING_e || l_msg->mStatus == fopMsgStts_MSG_TYPING_e) && field_0x2AC == field_0xD80) { + field_0xD80 = 0; + return true; + } + } + } + + return false; } /* 00004CF4-00004D50 .text evn_setAngle_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_setAngle_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_setAngle_init(int staffIdx) { + u32* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "angle"); + + if(data) { + current.angle.y = *data; + } + + return 1; } /* 00004D50-00004E8C .text evn_sound_proc_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_sound_proc_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_sound_proc_init(int staffIdx) { + u32* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm"); + + if(data) { + switch(*data) { + case 0: + mDoAud_bgmStop(0x0000002D); + break; + case 1: + mDoAud_bgmStart(0x80000018); + break; + case 2: + fopAcM_seStart(this, JA_SE_VS_JI_ENDING, 0); + break; + case 3: + dComIfGp_getVibration().StartShock(5, -0x11, cXyz(0.0f, 1.0f, 0.0f)); + } + } + + return 1; } /* 00004E8C-00004F60 .text evn_head_swing_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_head_swing_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_head_swing_init(int staffIdx) { + u32* pData = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm"); + u32 value; + if(!pData) { + value = 0; + } + else { + value = *pData; + } + + switch(value) { + case 0: + field_0xBFC.swing_horizone_init(2, 0x1000, 0x1000, 1); + break; + case 1: + field_0xBFC.swing_vertical_init(2, 0x1000, 0x800, 1); + break; + case 2: + field_0xBFC.swing_vertical_init(1, 0x1400, 0x1000, 1); + break; + } + + return true; } /* 00004F60-00005008 .text evn_harpoon_proc_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_harpoon_proc_init(int) { - /* Nonmatching */ +u32 daNpc_Ji1_c::evn_harpoon_proc_init(int staffIdx) { + u32* pData = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm"); + u32 value; + if(!pData) { + value = 0; + } + else { + value = *pData; + } + + switch(value) { + case 0: + harpoonRelease(0); + break; + case 1: + field_0xD84 = 0; + break; + case 2: + field_0xD84 = 1; + break; + } + + return true; } /* 00005008-00005078 .text evn_RollAtControl_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_RollAtControl_init(int) { +u32 daNpc_Ji1_c::evn_RollAtControl_init(int staffIdx) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + field_0xD18 = 400.0f; + field_0xD16 = cLib_targetAngleY(¤t.pos, &player->current.pos); + field_0xD16 += 0x2000; + field_0xC30 = 30; + field_0xD68 = 0; + + return 1; } /* 00005078-00005314 .text evn_RollAtControl__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::evn_RollAtControl() { +u32 daNpc_Ji1_c::evn_RollAtControl() { /* Nonmatching */ + + static cXyz hit_scale(1.25f, 1.25f, 1.25f); + + field_0xD16 += 0x540; + cLib_chaseF(&field_0xD18, 0.0f, 1.0f); + field_0xD1C = current.pos; + field_0xD1C.x += field_0xD18 * cM_ssin(field_0xD16); + field_0xD1C.z += field_0xD18 * cM_scos(field_0xD16); + dComIfGp_evmng_setGoal(&field_0xD1C); + field_0x6B0.SetC(current.pos); + dComIfG_Ccsp()->Set(&field_0x6B0); + field_0x7E0.SetC(current.pos); + dComIfG_Ccsp()->Set(&field_0x7E0); + if(field_0xC30 == 0xA) { + setAnm(0x19, 0.0f, 0); + BackSlideInit(); + setHitParticle(&hit_scale, JA_SE_CV_JI_FUTTOBI); + } + if(field_0xD64 == 0x19) { + if(field_0x330->getFrame() < 10.0f) { + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz temp = player->current.pos - current.pos; + cLib_addCalcAngleS2(¤t.angle.y, cM_atan2s(temp.x, temp.z), 2, 0x2000); + } + else { + if(field_0x330->checkFrame(20.0f) && field_0xD68++ < 2) { + setHitParticle(&hit_scale, JA_SE_CV_JI_FUTTOBI); + BackSlideInit(); + setAnm(0x19, 4.0f, 1); + } + } + + BackSlide(120.0f, 10.0f); + } + + // what is happening here + if(field_0xC30 > 0) { + field_0xC30 -= 1; + return false; + } + + return true; } /* 00005314-000053F8 .text evn_game_mode_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_game_mode_init(int) { +u32 daNpc_Ji1_c::evn_game_mode_init(int staffIdx) { /* Nonmatching */ } /* 000053F8-0000545C .text evn_turn_to_player__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::evn_turn_to_player() { +u32 daNpc_Ji1_c::evn_turn_to_player() { /* Nonmatching */ } /* 0000545C-00005508 .text evn_hide_init__11daNpc_Ji1_cFi */ -void daNpc_Ji1_c::evn_hide_init(int) { +u32 daNpc_Ji1_c::evn_hide_init(int staffIdx) { /* Nonmatching */ } @@ -247,28 +1381,156 @@ void daNpc_Ji1_c::AnimeControlToWait() { } /* 000055E4-000057DC .text privateCut__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::privateCut() { +u32 daNpc_Ji1_c::privateCut() { /* Nonmatching */ + + int staffIdx = dComIfGp_evmng_getMyStaffId(mEventCut.getActorName()); + if(staffIdx == -1) { + return false; + } + + static char* cut_name_tbl[] = { + "SETANM", + "TALKMSG", + "INITPOS", + "CREATEITEM", + "SOUND", + "HEADSWING", + "HARPOON", + "ROLLAT_CNT", + "GAME_MODE", + "TURN_TO_PLAYER", + "HIDE", + "CONTINUETALK", + "SETANGLE", + }; + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), 1, 0); + if(actIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } + else { + if(dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(actIdx) { + case 0: + evn_setAnm_init(staffIdx); + break; + case 1: + evn_talk_init(staffIdx); + break; + case 2: + evn_init_pos_init(staffIdx); + break; + case 3: + createItem(); + break; + case 4: + evn_sound_proc_init(staffIdx); + break; + case 5: + evn_head_swing_init(staffIdx); + break; + case 6: + evn_harpoon_proc_init(staffIdx); + break; + case 7: + evn_RollAtControl_init(staffIdx); + break; + case 8: + evn_game_mode_init(staffIdx); + break; + case 0xA: + evn_hide_init(staffIdx); + break; + case 0xB: + evn_continue_talk_init(staffIdx); + break; + case 0xC: + evn_setAngle_init(staffIdx); + break; + } + } + + BOOL end; + switch(actIdx) { + case 1: + end = evn_talk(); + break; + case 7: + end = evn_RollAtControl(); + break; + case 9: + end = evn_turn_to_player(); + break; + case 0xB: + end = evn_continue_talk(); + break; + default: + end = true; + } + + if(end) { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + + return true; } /* 000057DC-000058B8 .text setParticle__11daNpc_Ji1_cFiff */ -void daNpc_Ji1_c::setParticle(int, float, float) { - /* Nonmatching */ +u32 daNpc_Ji1_c::setParticle(int max, f32 rate, f32 spread) { + dtParticle(); + if(field_0x2E0.getEmitter() == 0) { + JPABaseEmitter* emitter = dComIfGp_particle_setToon(0x2022, ¤t.pos, 0, 0, 0xB9, &field_0x2E0, fopAcM_GetRoomNo(this)); + if(emitter) { + emitter->setRate(rate); + emitter->setSpread(spread); + emitter->setRandomDirectionSpeed(1.5f); + emitter->setMaxFrame(max); + + return true; + } + } + + return false; } /* 000058B8-000058F0 .text dtParticle__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::dtParticle() { - /* Nonmatching */ + if(field_0x2E0.getEmitter()) { + field_0x2E0.end(); + } } /* 000058F0-000059E8 .text setParticleAT__11daNpc_Ji1_cFiff */ -void daNpc_Ji1_c::setParticleAT(int, float, float) { +u32 daNpc_Ji1_c::setParticleAT(int max, f32 rate, f32 spread) { /* Nonmatching */ + + if(field_0x300.getEmitter() == 0) { + JPABaseEmitter* emitter = dComIfGp_particle_setToon(0x2022, &field_0x320, 0, 0, 0xB9, &field_0x300, fopAcM_GetRoomNo(this)); + if(field_0x300.getEmitter()) { + JGeometry::TVec3 scaleVec; + scaleVec.x = 2.0f; + scaleVec.y = 2.0f; + scaleVec.z = 2.0f; + emitter->setGlobalParticleScale(scaleVec); + emitter->setVolumeSweep(0.15f); + emitter->setRate(rate); + emitter->setSpread(spread); + emitter->setRandomDirectionSpeed(1.5f); + emitter->setMaxFrame(max); + + return true; + } + } + + return false; } /* 000059E8-00005A20 .text dtParticleAT__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::dtParticleAT() { - /* Nonmatching */ + if(field_0x300.getEmitter()) { + field_0x300.end(); + } } /* 00005A20-00005F30 .text startspeakAction__11daNpc_Ji1_cFPv */ @@ -277,7 +1539,7 @@ void daNpc_Ji1_c::startspeakAction(void*) { } /* 00005F30-00006238 .text endspeakAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::endspeakAction(void*) { +u32 daNpc_Ji1_c::endspeakAction(void*) { /* Nonmatching */ } @@ -297,7 +1559,7 @@ void daNpc_Ji1_c::teachMove(float) { } /* 00007140-00007424 .text teachSpRollCutMove__11daNpc_Ji1_cFf */ -void daNpc_Ji1_c::teachSpRollCutMove(float) { +BOOL daNpc_Ji1_c::teachSpRollCutMove(float) { /* Nonmatching */ } @@ -342,13 +1604,244 @@ void daNpc_Ji1_c::teachAction(void*) { } /* 00009070-00009B64 .text teachSPRollCutAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::teachSPRollCutAction(void*) { +u32 daNpc_Ji1_c::teachSPRollCutAction(void*) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + + if(field_0xC78 == 0) { + dComIfGp_setItemMagicCount(dComIfGs_getMaxMagic()); + setAnm(5, 0.0f, 0); + mAttentionInfo.mFlags |= fopAc_Attn_LOCKON_MISC_e; + field_0xC90 = 0; + field_0xD34 = 0; + field_0xC30 = 0; + dComIfGs_onTmpBit(0x402); + field_0xD70 = 6; + field_0xC78++; + } + else if(field_0xC78 != -1) { + dComIfGp_setItemMagicCount(dComIfGs_getMaxMagic()); + if(daNpc_Ji1_plRoomOutCheck()) { + field_0xC84 = 9; + Func_t temp3 = &eventAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + field_0x2C8 = &teachSPRollCutAction; + } + + return true; + } + else { + cXyz temp = player->current.pos - current.pos; + cM_atan2s(temp.x, temp.z); + f32 what = temp.absXZ(); + + s32 cutType = player->getCutType(); + f32 y_diff = fabsf(temp.y); + if(cutType == 9 && y_diff < 20.0f) { + dComIfGs_onEventBit(0xB20); + dComIfGs_offTmpBit(0x402); + dComIfGp_setItemBeastNumCount(3, -10); + field_0x7E0.OffTgShield(); + field_0xC84 = 10; + + Func_t temp3 = &eventAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + field_0x2C8 = &teachSPRollCutAction; + } + + return 1; + } + + if(cutType == 8) { + field_0xC84 = 0xB; + + Func_t temp3 = &eventAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + field_0x2C8 = &teachSPRollCutAction; + } + + return 1; + } + + field_0x7E0.OnTgShield(); + if(field_0x7E0.ChkTgHit() && field_0xD6C != 1) { + switch(field_0xC24) { + case 1: + case 6: + case 8: + setAnm(8, 0.0f, 1); + break; + case 9: + break; + case 10: + setAnm(10, 0.0f, 1); + field_0xC9C = 0; + field_0xD38 = current.pos; + break; + default: + setAnm(9, 0.0f, 1); + } + + if(field_0xC24 == 9) { + setHitParticle(0, 0x4833); + field_0xC9C = 0; + field_0xD38 = current.pos; + setParticle(0x10, 1.0f, 0.1f); + } + else { + setGuardParticle(); + } + + field_0xD6C = 1; + field_0xC8C = field_0xC24; + } + + if(field_0xD6C == 1) { + if(!player->getCutAtFlg() || field_0x330->getFrame() > field_0x330->getEndFrame() - 2) { + if(field_0xC90 == 0) { + if(field_0xC8C == 9) { + field_0xC84 = 0xA; + + Func_t temp3 = &eventAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + + field_0x2C8 = &normalAction; + + return true; + } + + fopAcM_orderOtherEventId(this, field_0xC5A); + mEvtInfo.onCondition(dEvtCnd_UNK2_e); + field_0xC90 = 2; + } + } + + if(field_0xD64 == 10 && field_0xC8C == 9) { + cLib_addCalc2(&field_0xC9C, l_HIO.field_0x34 * 2.0f, 0.25f, l_HIO.field_0x38); + cXyz temp(field_0xD38); + temp.x -= field_0xC9C * cM_ssin(current.angle.y); + temp.z -= field_0xC9C * cM_scos(current.angle.y); + + f32 temp2 = 45.0f; + if(field_0x434.ChkWallHit()) { + temp2 = 10.0f; + } + + cLib_addCalcPos2(¤t.pos, temp, 0.8f, temp2); + fopAcM_seStart(this, JA_SE_CM_JI_SLIP, 0); + } + + if(field_0x330->getFrame() > field_0x330->getEndFrame() - 2) { + field_0x6B0.OffTgShield(); + field_0x7E0.OnTgShield(); + if(field_0xC90 == 2) { + field_0xD6C = 0; + field_0xC9C = 0.0f; + field_0xD38 = current.pos; + + field_0xC4C = 0.0f; + field_0xC50 = 0.0f; + field_0xC2C = 0.0f; + + Func_t temp3 = &speakBadAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + field_0xC90 = 0; + field_0xD6C = 0; + field_0xD38 = current.pos; + + Func_t temp3 = &speakAction; + if(field_0x2B0 != temp3) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp3; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + } + } + else { + if(!teachSpRollCutMove(1.0f)) { + if(field_0x330->checkFrame(field_0x330->getEndFrame() - 2)) { + setAnm(5, 4.0f, 0); + } + } + } + + if(field_0xD6C != 1) { + dtParticle(); + } + if(field_0xD6C != 1 && isGuardAnim()) { + if(field_0x330->getFrame() > field_0x330->getEndFrame() - 2) { + setAnm(5, 4.0f, 0); + } + } + } + } + + return true; } /* 00009B64-00009B7C .text playerCutAtCheck__Fv */ -void playerCutAtCheck() { +bool playerCutAtCheck() { /* Nonmatching */ + + return daPy_getPlayerActorClass()->getCutAtFlg(); } /* 00009B7C-00009F1C .text battleGameSetTimer__11daNpc_Ji1_cFv */ @@ -377,7 +1870,7 @@ void daNpc_Ji1_c::battleSubActionNockBackInit(int) { } /* 0000A5FC-0000A744 .text battleSubActionNockBack__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::battleSubActionNockBack() { +u32 daNpc_Ji1_c::battleSubActionNockBack() { /* Nonmatching */ } @@ -457,123 +1950,1469 @@ void daNpc_Ji1_c::battleAtSet() { } /* 0000BFE0-0000C7E4 .text battleGuardCheck__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::battleGuardCheck() { +BOOL daNpc_Ji1_c::battleGuardCheck() { /* Nonmatching */ + + if(field_0x7E0.ChkTgHit() && field_0xD6C != 1) { + switch(field_0xC24) { + case 0xF: + case 0x10: + battleSubActionJumpInit(); + break; + case 5: + current.angle.y += 0x8000; + battleSubActionDamageInit(); + break; + case 0x1: + case 0x6: + case 0x8: + case 0x9: + case 0x1A: + if(!isAttackAnim()) { + Func2_t temp = &battleSubActionNockBack; + if(field_0x2D4 != temp) { + setAnm(8, 0.0f, 1); + battleSubActionGuardInit(); + break; + } + } + + int attackFrame = isAttackFrame(); + if(field_0x2D4 == &battleSubActionNockBack) { + setAnm(8, 0.0f, 1); + battleSubActionGuardInit(); + } + else { + if(attackFrame == 0) { + battleSubActionNockBackInit(1); + field_0xD6C = 1; + return 0; + } + + if(attackFrame == 1) { + setAnm(8, 0.0f, 1); + battleSubActionGuardInit(); + break; + } + + return 0; + } + + break; + case 0xA: + battleSubActionJpGuardInit(); + break; + case 0x0: + case 0x2: + case 0x3: + case 0x4: + case 0x7: + case 0xB: + case 0xC: + case 0xD: + case 0xE: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + default: + if(!isAttackAnim()) { + Func2_t temp = &battleSubActionNockBack; + if(field_0x2D4 != temp) { + setAnm(9, 0.0f, 1); + battleSubActionGuardInit(); + break; + } + } + + attackFrame = isAttackFrame(); + if(field_0x2D4 == &battleSubActionNockBack) { + setAnm(9, 0.0f, 1); + battleSubActionGuardInit(); + } + else { + if(attackFrame == 0) { + battleSubActionNockBackInit(1); + field_0xD6C = 1; + return 0; + } + + if(attackFrame == 1) { + setAnm(9, 0.0f, 1); + battleSubActionGuardInit(); + break; + } + + return 0; + } + + break; + } + + if(field_0xC24 == 0) { + setGuardParticle(); + } + else { + if(field_0xC24 == 0xF || field_0xC24 == 0x10 || field_0xC24 == 0x5) { + fopAcM_seStart(this, JA_SE_LK_SW_CRT_HIT, 0); + + static cXyz scale(1.25f, 1.25f, 1.25f); + if(field_0xC24 == 5) { + setHitParticle(&scale, JA_SE_CV_JI_FUTTOBI); + } + else { + setHitParticle(&scale, JA_SE_CV_JI_DEFENCE); + } + + if(field_0xD70 < l_HIO.field_0x60[3] - 1) { + field_0xD70 += 2; + + dComIfGp_plusMiniGameRupee(2); + } + else { + field_0xD70 += 1; + + dComIfGp_plusMiniGameRupee(1); + } + } + else { + setHitParticle(0, JA_SE_CV_JI_DEFENCE); + field_0xD70 += 1; + + dComIfGp_plusMiniGameRupee(1); + } + + if(field_0xD70 >= l_HIO.field_0x60[3]) { + field_0xC84 = 8; + if(dComIfGs_isEventBit(0xF20)) { + field_0xC38 = 2; + } + else if(dComIfGs_isEventBit(0xF10)) { + field_0xC38 = 0; + } + else { + field_0xC38 = 1; + } + + Func_t temp = &eventAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + + dComIfGp_setMessageCountNumber(field_0xD70); + field_0x2C8 = &normalAction; + if(dComIfG_getTimerPtr()) { + dComIfG_TimerDeleteRequest(); + setClearRecord(field_0xD70); + } + + return 1; + } + } + + field_0xD6C = 1; + field_0x2A4 = 30.0f; + } + + if(!field_0xA40.ChkAtShieldHit() && field_0xA40.ChkAtHit()) { + field_0xA40.ClrAtHit(); + } + + if(field_0xC3C > 2) { + Func_t temp = &battleAction; + if(field_0x2B0 == temp) { + if(dComIfG_getTimerPtr()) { + dComIfG_TimerDeleteRequest(); + } + + if(isClearRecord(field_0xD70)) { + setClearRecord(field_0xD70); + field_0xC84 = 7; + + Func_t temp2 = &eventAction; + if(field_0x2B0 != temp2) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + + dComIfGp_setMessageCountNumber(field_0xD70); + field_0x2C8 = &normalAction; + } + else { + Func_t temp2 = &endspeakAction; + if(field_0x2B0 != temp2) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + } + } + + return 1; } /* 0000C7E4-0000CA98 .text battleAction__11daNpc_Ji1_cFPv */ -void daNpc_Ji1_c::battleAction(void*) { +u32 daNpc_Ji1_c::battleAction(void*) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + + if(field_0xC78 == 0) { + u8 icon; + switch(dComIfGs_getSelectEquip(0)) { + case SWORD: + icon = 1; + break; + icon = 2; + break; + case LV3_SWORD: + icon = 2; + break; + case MASTER_SWORD: + default: + icon = 2; + break; + } + + dTimer_createTimer(6, 1000, 2, icon, 221.0f, 439.0f, 32.0f, 419.0f); + dComIfGp_setMiniGameRupee(0); + field_0xC3C = 0; + setAnm(5, 0.0f, 0); + mAttentionInfo.mFlags |= fopAc_Attn_LOCKON_MISC_e; + mAttentionInfo.mFlags |= fopAc_Attn_LOCKON_ENEMY_e; + mAttentionInfo.mDistances[2] = 3; + field_0xC30 = (s16)cM_rndF(150.0f) + 30; + field_0xD70 = 0; + field_0xD6C = 0; + battleSubActionWaitInit(); + field_0xC38 = 0; + field_0xC78++; + } + else if(field_0xC78 == -1) { + mAttentionInfo.mFlags &= ~fopAc_Attn_LOCKON_ENEMY_e; + mAttentionInfo.mDistances[2] = 0xB5; + } + else { + cXyz temp = player->current.pos - current.pos; + cM_atan2s(temp.x, temp.z); + f32 what = temp.absXZ(); + field_0x7E0.OffTgShield(); + battleGuardCheck(); + (this->*field_0x2D4)(); + + if(field_0xD6C != 1) { + dtParticle(); + } + + if(isAttackAnim()) { + Func2_t temp = &battleSubActionNockBack; + if(field_0x2D4 == temp) { + dtParticleAT(); + } + } + + game_life_point = field_0xC3C == 3; // not sure what the srawi and andc are doing + } + + return true; } /* 0000CA98-0000CC28 .text checkCutType__11daNpc_Ji1_cFii */ -void daNpc_Ji1_c::checkCutType(int, int) { +BOOL daNpc_Ji1_c::checkCutType(int param_1, int param_2) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + + BOOL ret = false; + switch(param_2) { + case 0: + switch(param_1) { + case 3: + case 7: + case 0x1A: + case 0x1B: + case 0x1E: + case 0x1F: + ret = true; + break; + case 8: + if(player->checkComboCutTurn()) { + ret = true; + } + break; + default: + break; + } + + break; + case 1: + switch(param_1) { + case 0: + case 3: + case 6: + case 0x1A: + case 0x1B: + case 0x1E: + case 0x1F: + ret = true; + break; + case 8: + if(player->checkComboCutTurn()) { + ret = true; + } + break; + default: + break; + } + + break; + case 2: + switch(param_1) { + case 0: + case 3: + case 6: + case 0x1A: + case 0x1B: + case 0x1E: + case 0x1F: + ret = true; + break; + case 8: + if(player->checkComboCutTurn()) { + ret = true; + } + break; + default: + break; + } + + break; + case 3: + switch(param_1) { + case 8: + case 9: + ret = true; + break; + default: + break; + } + + break; + case 4: + switch(param_1) { + case 5: + case 0xF: + case 0x10: + ret = true; + break; + default: + break; + } + + break; + default: + switch(param_1) { + case 0xA: + ret = true; + break; + } + + break; + } + + return ret; } /* 0000CC28-0000CF28 .text setAnimFromMsgNo__11daNpc_Ji1_cFUl */ -void daNpc_Ji1_c::setAnimFromMsgNo(unsigned long) { +void daNpc_Ji1_c::setAnimFromMsgNo(u32 msgNo) { /* Nonmatching */ + + if(l_msg) { + msgNo = l_msg->mMsgID; + } + + // the switch cases for this are annoying to work out + switch(msgNo) { + case 0x9B1: + if(field_0xD84 == 1) { + setAnm(0, 4.0f, 0); + return; + } + + setAnm(1, 4.0f, 0); + return; + case 0x961: + case 0x986: + setAnm(3, 8.0f, 0); + return; + case 0x962: + setAnm(3, 4.0f, 0); + return; + case 0x9AF: + case 0x9B3: + case 0x9B4: + if(field_0xD84 == 1) { + setAnm(0, 4.0f, 0); + return; + } + + setAnm(2, 4.0f, 0); + return; + case 0x963: + case 0x964: + case 0x965: + case 0x966: + case 0x967: + case 0x968: + setAnm(2, 4.0f, 0); + return; + case 0x975: + setAnm(4, 4.0f, 0); + return; + case 0x9AE: + if(field_0xD64 == 0x16 && field_0x330->checkFrame(field_0x330->getEndFrame() - 1)) { + setAnm(0x15, l_HIO.field_0xA8, 0); + return; + } + + if(field_0xD64 != 0x15) { + setAnm(0x16, l_HIO.field_0xA4, 0); + } + + return; + case 0x9B9: + if(l_msg->mStatus != 0xE) { + return; + } + if(field_0xD64 != 0x17) { + return; + } + + if(field_0x430 != 0) { + field_0x430->becomeInvalidEmitter(); + field_0x430 = 0; + field_0x430 = dComIfGp_particle_set(0x81A5, ¤t.pos); + } + + setAnm(0x18, 8.0f, 0); + field_0xD84 = 1; + + return; + } } /* 0000CF28-0000DAB0 .text setAnm__11daNpc_Ji1_cFifi */ -void daNpc_Ji1_c::setAnm(int, float, int) { +BOOL daNpc_Ji1_c::setAnm(int param_1, f32 param_2, int param_3) { /* Nonmatching */ + + if(param_3 != 0 || field_0xD64 != param_1) { + return false; + } + else { + field_0xD64 = param_1; + + f32 speed = 1.0f; + if(param_1 != field_0xD64 && isGuardAnim()) { + fopAcM_seStart(this, JA_SE_CM_JI_DEFENSE, 0); + } + + J3DAnmTransform* temp1; + s32 temp2; + void* pSoundAnimRes; + + switch(param_1) { + case 0: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x38)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1C); + + break; + case 1: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x39)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1D); + + break; + case 2: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x32)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x16); + + break; + case 3: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x33)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x17); + + break; + case 4: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x24)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x8); + + break; + case 5: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2C)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x10); + + break; + case 6: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2D)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x11); + speed = l_HIO.field_0x48; + + break; + case 7: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2A)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xE); + speed = l_HIO.field_0x44; + + break; + case 8: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x35)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x19); + + break; + case 9: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x3B)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1F); + + break; + case 10: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2B)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xF); + + break; + case 11: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x36)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1A); + + break; + case 12: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x31)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x15); + + break; + case 13: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x3A)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1E); + speed = l_HIO.field_0x4C; + + break; + case 14: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2B)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xF); + speed = 2.0f; + + break; + case 15: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x29)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xD); + speed = 2.0f; + + break; + case 16: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x27)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xB); + + break; + case 17: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x26)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xA); + + break; + case 18: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x37)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x1B); + + break; + case 19: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x34)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x18); + + break; + case 20: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x3C)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x20); + + break; + case 21: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x30)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x14); + + break; + case 22: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x25)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x9); + + BackSlideInit(); + if(field_0xD84 == 1) { + harpoonRelease(0); + } + + break; + case 23: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2E)); + temp2 = 2; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x12); + + if(field_0x430 == 0) { + field_0x430 = dComIfGp_particle_set(0x81A4, ¤t.pos); + harpoonRelease(0); + } + + break; + case 24: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x2F)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0x13); + + break; + case 25: + temp1 = static_cast(dComIfG_getObjectRes("Ji", 0x28)); + temp2 = 0; + pSoundAnimRes = dComIfG_getObjectRes("Ji", 0xC); + + break; + default: + return 0; + } + + field_0x330->setAnm(temp1, temp2, param_2, speed, 0.0f, -1.0f, pSoundAnimRes); + if(field_0xD64 == 0x13) { + mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Ji", 0x3D), 2, 0.0f, 1.0f, 0.0f, -1.0f, 0); + } + else if(field_0xD64 == 0x14) { + mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("Ji", 0x3E), 2, 0.0f, 1.0f, 0.0f, -1.0f, 0); + } + + return true; + } } /* 0000DAB0-0000DC04 .text nodeCallBack1__FP7J3DNodei */ -static BOOL nodeCallBack1(J3DNode*, int) { +static BOOL nodeCallBack1(J3DNode* node, int param_1) { /* Nonmatching */ + + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Ji1_c* i_this = (daNpc_Ji1_c*)model->getUserArea(); + s32 jntNo = joint->getJntNo(); + + if(i_this) { + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + if(jntNo == i_this->m_jnt.getHeadJntNum()) { + mDoMtx_stack_c::XrotM(i_this->field_0xBFC.field_0x02 + i_this->m_jnt.getHead_y()); + mDoMtx_stack_c::ZrotM(i_this->field_0xBFC.field_0x00 - i_this->m_jnt.getHead_x()); + } + if(jntNo == 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()); + + for(int i = 0; i < 3; i++) { + mDoMtx_stack_c::multVec(&l_HIO.field_0xC4[i], &i_this->field_0xBD8[i]); + } + } + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } + } + + return true; } /* 0000DC04-0000DD68 .text nodeCallBack2__FP7J3DNodei */ -static BOOL nodeCallBack2(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack2(J3DNode* node, int param_1) { + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Ji1_c* i_this = (daNpc_Ji1_c*)model->getUserArea(); + s32 jntNo = joint->getJntNo(); + + if(i_this) { + cMtx_copy(model->getAnmMtx(jntNo), *calc_mtx); + if(jntNo == i_this->hair1JointNo) { + mDoMtx_ZrotM(*calc_mtx, i_this->field_0xBAA + i_this->field_0xBD2); + mDoMtx_YrotM(*calc_mtx, i_this->field_0xBAC); + } + else if(jntNo == i_this->hair2JointNo) { + mDoMtx_ZrotM(*calc_mtx, i_this->field_0xBAE + i_this->field_0xBD4); + mDoMtx_YrotM(*calc_mtx, i_this->field_0xBB0); + } + else { + mDoMtx_ZrotM(*calc_mtx, i_this->field_0xBB2 + i_this->field_0xBD6); + mDoMtx_YrotM(*calc_mtx, i_this->field_0xBB4); + } + + model->setAnmMtx(jntNo, *calc_mtx); + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + } + } + + return true; } /* 0000DD68-0000DE90 .text nodeCallBack3__FP7J3DNodei */ -static BOOL nodeCallBack3(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack3(J3DNode* node, int param_1) { + if (param_1) { + return true; + } + else { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Ji1_c* i_this = (daNpc_Ji1_c*)model->getUserArea(); + + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + s16 temp = i_this->field_0xBA2 * cM_ssin(i_this->field_0xBA4); + if(jntNo == i_this->armLJointNo) { + mDoMtx_stack_c::XrotM(temp); + } + else if(jntNo == i_this->armRJointNo) { + mDoMtx_stack_c::XrotM(temp); + } + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + + return true; + } } /* 0000DE90-0000DEB0 .text daNpc_Ji1_Draw__FP11daNpc_Ji1_c */ -static BOOL daNpc_Ji1_Draw(daNpc_Ji1_c*) { - /* Nonmatching */ +static BOOL daNpc_Ji1_Draw(daNpc_Ji1_c* i_this) { + return i_this->_draw(); } /* 0000DEB0-0000DED0 .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(); } /* 0000DED0-0000DF78 .text _create__11daNpc_Ji1_cFv */ s32 daNpc_Ji1_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daNpc_Ji1_c); + + s32 state = dComIfG_resLoad(&field_0xC7C, "Ji"); + if(state == cPhs_COMPLEATE_e) { + if(!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0x16840)) { + return cPhs_ERROR_e; + } + + CreateInit(); + } + + return state; } /* 0000E864-0000F324 .text CreateHeap__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::CreateHeap() { +BOOL daNpc_Ji1_c::CreateHeap() { /* Nonmatching */ + + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Ji", 0x42)); + field_0x330 = new mDoExt_McaMorf( + modelData, + NULL, NULL, + static_cast(dComIfG_getObjectRes("Ji", 0x3F)), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1, + dComIfG_getObjectRes("Ji", 0x21), + 0x00000000, + 0x11020203 + ); + + if(field_0x330 == 0 || field_0x330->getModel() == 0) { + return false; + } + + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::YrotM(current.angle.y); + field_0x330->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + + m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head")); + JUT_ASSERT(0x15AB, m_jnt.getHeadJntNum() >= 0); + + m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone1")); + JUT_ASSERT(0x15B0, m_jnt.getBackboneJntNum() >= 0); + + armLJointNo = modelData->getJointName()->getIndex("armL1"); + JUT_ASSERT(0x15B4, armLJointNo >= 0); + + armRJointNo = modelData->getJointName()->getIndex("armR1"); + JUT_ASSERT(0x15B7, armRJointNo >= 0); + + handRJointNo = modelData->getJointName()->getIndex("handR"); + JUT_ASSERT(0x15BA, handRJointNo >= 0); + + mpMorf = new mDoExt_McaMorf( + static_cast(dComIfG_getObjectRes("Ji", 0x43)), + NULL, NULL, + static_cast(dComIfG_getObjectRes("Ji", 0x3D)), + J3DFrameCtrl::LOOP_ONCE_e, 0.0f, 0, -1, 1, + 0, + 0x00000000, + 0x11020203 + ); + + + if(mpMorf == 0 || mpMorf->getModel() == 0) { + return false; + } + + modelData = static_cast(dComIfG_getObjectRes("Ji", 0x44)); + field_0x3F8 = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + + J3DAnmTevRegKey* a_brk = static_cast(dComIfG_getObjectRes("Ji", 0x47)); + JUT_ASSERT(0x15CD, a_brk != 0); + + J3DAnmTextureSRTKey* a_btk = static_cast(dComIfG_getObjectRes("Ji", 0x4A)); + JUT_ASSERT(0x15D0, a_btk != 0); + + int temp1 = field_0x3FC.init(modelData, a_brk, false, 2, 1.0f, 0, -1, false, 0); + int temp2 = field_0x418.init(modelData, a_btk, false, 2, 1.0f, 0, -1, false, 0); + + if(field_0x3F8 == 0 || temp1 == 0 || temp2 == 0) { + return false; + } + + headTexPattern = static_cast(dComIfG_getObjectRes("Ji", 0x4D)); + JUT_ASSERT(0x15D8, headTexPattern != 0); + + if(field_0x3D8.init(modelData, headTexPattern, 1, 2, 1.0f, 0, -1, false, 0) == 0) { + return false; + } + + hair1JointNo = modelData->getJointName()->getIndex("hair1"); + JUT_ASSERT(0x15DF, hair1JointNo >= 0); + hair2JointNo = modelData->getJointName()->getIndex("hair2"); + JUT_ASSERT(0x15E1, hair2JointNo >= 0); + hair3JointNo = modelData->getJointName()->getIndex("hair3"); + JUT_ASSERT(0x15E3, hair3JointNo >= 0); + + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == hair1JointNo || i == hair2JointNo || i == hair3JointNo) { + modelData->getJointNodePointer(i)->setCallBack(nodeCallBack2); + } + } + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == m_jnt.getHeadJntNum() || i == m_jnt.getBackboneJntNum()) { + modelData->getJointNodePointer(i)->setCallBack(nodeCallBack1); + } + else if(i == armLJointNo || i == armRJointNo) { + modelData->getJointNodePointer(i)->setCallBack(nodeCallBack3); + } + } + + field_0x330->getModel()->setUserArea((u32)this); + + field_0x5F8.SetWall(60.0f, 50.0f); + field_0x434.Set(¤t.pos, &old.pos, this, 1, &field_0x5F8, &speed, 0, 0); + field_0x434.OnLineCheck(); + + field_0xC54 = dComIfGp_evmng_getEventIdx("Ji1_StartSpeak", 0xFF); + field_0xC56 = dComIfGp_evmng_getEventIdx("Ji1_Speak", 0xFF); + field_0xC58 = dComIfGp_evmng_getEventIdx("Ji1_EndSpeak", 0xFF); + field_0xC5A = dComIfGp_evmng_getEventIdx("Ji1_BadSpeak", 0xFF); + field_0xC5C = dComIfGp_evmng_getEventIdx("Ji1_linkmove", 0xFF); + field_0xC5E = dComIfGp_evmng_getEventIdx("Ji1_kaiten", 0xFF); + field_0xC60 = dComIfGp_evmng_getEventIdx("Ji1_kaiten_exp", 0xFF); + field_0xC62 = dComIfGp_evmng_getEventIdx("Ji1_ItemGetEnd", 0xFF); + field_0xC64 = dComIfGp_evmng_getEventIdx("Ji1_ItemGetTalkEnd", 0xFF); + field_0xC66 = dComIfGp_evmng_getEventIdx("Ji1_pl_backroom", 0xFF); + field_0xC68 = dComIfGp_evmng_getEventIdx("Ji1_TeachSpRollCut", 0xFF); + field_0xC6A = dComIfGp_evmng_getEventIdx("Ji1_SpRollFail", 0xFF); + field_0xC6C = dComIfGp_evmng_getEventIdx("Ji1_NormAng", 0xFF); + field_0xC6E = dComIfGp_evmng_getEventIdx("Ji1_NormAng2", 0xFF); + field_0xC70 = dComIfGp_evmng_getEventIdx("Ji1_NormAngFin", 0xFF); + field_0xC72 = dComIfGp_evmng_getEventIdx("Ji1_SwordGetTalkEnd", 0xFF); + field_0xC74 = dComIfGp_evmng_getEventIdx("Ji1_KmonTalk", 0xFF); + field_0xC76 = dComIfGp_evmng_getEventIdx("Ji1_EquipTalk", 0xFF); + + if(dComIfGs_isEventBit(0x1) && !dComIfGs_isEventBit(0x108)) { + mEvtInfo.setEventId(field_0xC76); + } + + return true; } /* 0000F324-0000FB0C .text CreateInit__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::CreateInit() { +BOOL daNpc_Ji1_c::CreateInit() { /* Nonmatching */ + + cXyz temp(190.0f, 230.0f, -1100.0f); + csXyz temp2(0, 0, 0); + + fopAcM_createChild("Kmon", fopAcM_GetID(this), 0, &temp, fopAcM_GetRoomNo(this), &temp2, 0, (createFunc)0); + fopAcM_SetMtx(this, field_0x330->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -70.0f, 0.0f, -70.0f, 70.0f, 200.0f, 70.0f); + mGravity = -30.0f; + mAttentionInfo.mFlags = fopAc_Attn_LOCKON_MISC_e | fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_TALK_e; + + field_0x638.Init(0xFF, 0xFF, this); + field_0x674.Init(0xFF, 0xFF, this); + field_0x6B0.Set(l_cyl_src); + field_0x6B0.SetStts(&field_0x638); + field_0x7E0.Set(l_cyl2_src); + field_0x7E0.SetStts(&field_0x674); + field_0x7E0.SetTgHitCallback(daJi1_TgHitCallback); + field_0x7E0.SetCoHitCallback(daJi1_CoHitCallback); + field_0x6B0.OffTgShield(); + field_0x7E0.OnTgShield(); + field_0x910.Set(l_cylAt_src); + field_0x910.SetStts(&field_0x638); + field_0xA40.Set(l_cpsAt_src); + field_0xA40.SetStts(&field_0x638); + field_0xA40.SetStartEnd(field_0xB84, field_0xB78); + field_0xA40.SetR(50.0f); + field_0xA40.SetAtHitCallback(daJi1_AtHitCallback); + + field_0x290 = 240.0f; + field_0x294 = 100.0f; + field_0xD64 = -1; + field_0xD68 = 0; + field_0xD6C = 0; + field_0xD70 = 0; + field_0xD74 = 0; + field_0xD78 = 0; + field_0xD79 = 0; + field_0xC94 = 0; + field_0xC90 = 0; + field_0xC98 = l_HIO.field_0x54[field_0xD70]; + field_0xC28 = 0; + field_0xC2C = 0; + field_0xC4C = 0; + field_0xC50 = 0; + field_0xC9C = 0; + + field_0xD38 = current.pos; + if(dComIfGs_isEventBit(0x520)) { + if(!dComIfGs_isEventBit(0x2)) { + field_0xD84 = 0; + field_0xD50.x = -13.0f; + field_0xD50.y = -4.0f; + field_0xD50.z = 10.0f; + field_0xD5C.x = 0x4000; + field_0xD5C.y = 0; + field_0xD5C.z = 0x7FFF; + current.pos.x = 0.0f; + current.pos.y = 0.0f; + current.pos.z = -850.0f; + current.angle.y = -0x8000; + + Func_t temp = &kaitenExpAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + field_0xD84 = 1; + field_0xD50.x = -13.0f; + field_0xD50.y = -4.0f; + field_0xD50.z = 10.0f; + field_0xD5C.x = 0x4000; + field_0xD5C.y = 0; + field_0xD5C.z = 0x7FFF; + + Func_t temp = &normalAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + + field_0xD28 = home.pos; + } + else { + if(dComIfGs_isEventBit(0x501) || dComIfGs_isEventBit(0x1)) { + field_0xD84 = 1; + field_0xD50.x = -13.0f; + field_0xD50.y = -4.0f; + field_0xD50.z = 10.0f; + field_0xD5C.x = 0x4000; + field_0xD5C.y = 0; + field_0xD5C.z = 0x7FFF; + field_0xD28 = home.pos; + + Func_t temp = &normalAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + field_0xD84 = 0; + if(!dComIfGs_isEventBit(0x640) || l_HIO.field_0x30) { + field_0xD68 = 0; + + Func_t temp = &kaitenExpAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + else { + Func_t temp = &kaitenwaitAction; + if(field_0x2B0 != temp) { + if(field_0x2B0) { + field_0xC78 = 0xFF; + (this->*field_0x2B0)(0); + } + + field_0x2BC = field_0x2B0; + field_0x2B0 = temp; + field_0xC78 = 0; + (this->*field_0x2B0)(0); + } + } + + current.pos.x = 0.0f; + current.pos.y = 0.0f; + current.pos.z = -850.0f; + current.angle.y = -0x8000; + field_0xD28 = current.pos; + home.angle.y = current.angle.y; + } + } + + dComIfGp_getAttention().setFlag(0x80000000); + mEventCut.setActorInfo("Ji1", this); + mEventCut.setJntCtrlPtr(&m_jnt); + field_0xC84 = 0x12; + field_0xD7B = 0; + field_0xD7C = 0; + field_0xD7E = 0; + + mAttentionInfo.mFlags |= fopAc_Attn_LOCKON_MISC_e; + mAttentionInfo.mDistances[1] = 0xA9; + mAttentionInfo.mDistances[3] = 0xA9; + mAttentionInfo.mDistances[2] = 0xB5; + field_0x414 = 0.0f; + field_0x42C = 0.0f; + field_0x430 = 0; + + set_mtx(); + + return true; } /* 0000FB0C-0000FC24 .text _delete__11daNpc_Ji1_cFv */ BOOL daNpc_Ji1_c::_delete() { - /* Nonmatching */ + if(dComIfGp_getMiniGameType() == 2) { + dComIfGp_endMiniGame(2); + } + if(dComIfGp_getMiniGameType() == 6) { + dComIfGp_endMiniGame(6); + } + + dComIfG_resDelete(&field_0xC7C, "Ji"); + if(heap && field_0x330) { + field_0x330->stopZelAnime(); + } + + mDoAud_seDeleteObject(&field_0xB78); + mDoAud_seDeleteObject(&field_0xB84); + + dComIfGp_att_revivalAleart(); + + field_0x2E0.end(); + field_0x300.end(); + + return true; } /* 0000FC24-00010100 .text _execute__11daNpc_Ji1_cFv */ BOOL daNpc_Ji1_c::_execute() { /* Nonmatching */ + + if(field_0xD84 == 2) { + harpoonMove(); + } + + if(cLib_calcTimer(&field_0x3EE) == 0) { + field_0x3EC++; + if(field_0x3EC >= headTexPattern->getFrameMax()) { + field_0x3EC -= headTexPattern->getFrameMax(); + field_0x3EE = (s16)cM_rndF(100.0f) + 30; + } + } + + s8 roomNo = fopAcM_GetRoomNo(this); + u32 sound; + if(field_0x434.ChkGroundHit()) { + sound = dComIfG_Bgsp()->GetMtrlSndId(field_0x434.m_gnd); + } + else { + sound = 0; + } + field_0x330->play(¤t.pos, sound, dComIfGp_getReverb(roomNo)); + field_0x330->calc(); + + if(isItemWaitAnim()) { + static cXyz aim_offset(-13.0f, -4.0f, 10.0f); + static csXyz aim_angle(0x4000, 0, 0x7FFF); + + field_0xD5C = aim_angle; + cLib_addCalcPos2(&field_0xD50, aim_offset, 0.25f, 5.0f); + } + else { + static cXyz aim_offset(-13.06f, -4.0f, 44.35f); + static csXyz aim_angle(0x3E84, 0, 0x7E93); + + field_0xD5C = aim_angle; + cLib_addCalcPos2(&field_0xD50, aim_offset, 0.25f, 5.0f); + } + + if(field_0xD84 == 1 && (field_0xD64 == 0x13 || field_0xD64 == 0x14)) { + mpMorf->setFrame(field_0x330->getFrame()); + } + else { + mpMorf->setFrame(0.0f); + mpMorf->setPlaySpeed(0.0f); + } + + mpMorf->calc(); + + field_0xBFC.move(); + + if(field_0xD64 == 0x17) { + field_0x42C += 1.0f; + if(field_0x42C >= 60.0f) { + field_0x42C = 30.0f; + } + } + else { + if(field_0xD64 != 0x18 && field_0x430 != 0) { + field_0x430->becomeInvalidEmitter(); + field_0x430 = 0; + } + + if(field_0x42C > 0.0f) { + field_0x414 += 1.0f; + if(field_0x414 >= 30.0f) { + field_0x42C = 0; + field_0x414 = 0; + } + } + } + + (this->*field_0x2B0)(0); + lookBack(); + daNpc_Ji1_setHairAngle(this); + + mAttentionInfo.mPosition.set(current.pos.x, current.pos.y + 190.0f, current.pos.z); + shape_angle = current.angle; + mEyePos.set(current.pos.x, current.pos.y + 150.0f, current.pos.z); + fopAcM_posMoveF(this, field_0x638.GetCCMoveP()); + cXyz temp(current.pos); + field_0x434.CrrPos(*dComIfG_Bgsp()); + field_0xC40 = current.pos - temp; + mTevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(field_0x434.m_gnd); + mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(field_0x434.m_gnd); + set_mtx(); + field_0x6B0.SetC(current.pos); + dComIfG_Ccsp()->Set(&field_0x6B0); + field_0x7E0.SetC(current.pos); + dComIfG_Ccsp()->Set(&field_0x7E0); + field_0xC28 = 0; + + return true; } /* 00010100-0001031C .text _draw__11daNpc_Ji1_cFv */ BOOL daNpc_Ji1_c::_draw() { /* Nonmatching */ + + if(field_0xD85) { + return true; + } + else { + J3DModel* model1 = field_0x330->getModel(); + J3DModelData* modelData1 = model1->getModelData(); + J3DModel* model2 = mpMorf->getModel(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(model1, &mTevStr); + g_env_light.setLightTevColorType(model2, &mTevStr); + field_0x3D8.entry(modelData1, field_0x3EC); + field_0x330->entryDL(); + if(field_0xD84 == 1) { + mpMorf->entryDL(); + } + else if(field_0xD84 == 2) { + mpMorf->updateDL(); + } + + field_0x418.entry(field_0x3F8->getModelData(), (s16)field_0x42C); + field_0x3FC.entry(field_0x3F8->getModelData(), (s16)field_0x414); + mDoExt_modelUpdateDL(field_0x3F8); + cXyz temp(current.pos.x, current.pos.y + 150.0f, current.pos.z); + field_0x3F0 = dComIfGd_setShadow(field_0x3F0, 1, field_0x330->getModel(), &temp, 800.0f, 20.0f, current.pos.y, field_0x434.GetGroundH(), field_0x434.m_gnd, &mTevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + if(field_0x3F0 != 0 && field_0xD84 != 0) { + dComIfGd_addRealShadow(field_0x3F0, mpMorf->getModel()); + } + + dSnap_RegistFig(0x4D, this, current.pos, current.angle.y, 1.0f, 1.0f, 1.0f); + + return true; + } } +static cXyz l_head_front(0.0f, 1.0f, 0.0f); +static cXyz l_head_top(1.0f, 0.0f, 0.0f); + /* 0001031C-00010E3C .text daNpc_Ji1_setHairAngle__FP11daNpc_Ji1_c */ -void daNpc_Ji1_setHairAngle(daNpc_Ji1_c*) { +static void daNpc_Ji1_setHairAngle(daNpc_Ji1_c* i_this) { /* Nonmatching */ } /* 00010E3C-00010FC0 .text chkAttention__11daNpc_Ji1_cF4cXyzs */ -void daNpc_Ji1_c::chkAttention(cXyz, short) { +BOOL daNpc_Ji1_c::chkAttention(cXyz param_1, s16 param_2) { /* Nonmatching */ + + daPy_py_c* player = daPy_getPlayerActorClass(); + f32 temp = 800.0f; + s32 temp2 = l_HIO.field_0x10 + l_HIO.field_0x12; + + cXyz temp4; + temp4.x = player->current.pos.x - param_1.x; + temp4.z = player->current.pos.z - param_1.z; + + f32 dist = sqrtf(temp4.x * temp4.x + temp4.z * temp4.z); + s16 angle = cM_atan2s(temp4.x, temp4.z); + + if(field_0xD7A != 0) { + temp += 40.0f; + temp2 += 0x71C; + } + + field_0xD7A = temp2 > abs(static_cast(angle - param_2)) && temp > dist; + + return temp2 > abs(static_cast(angle - param_2)) && temp > dist; } /* 00010FC0-0001132C .text lookBack__11daNpc_Ji1_cFv */ -void daNpc_Ji1_c::lookBack() { +BOOL daNpc_Ji1_c::lookBack() { /* Nonmatching */ + + BOOL ret = false; + + daPy_py_c* player = daPy_getPlayerActorClass(); + + cXyz& this_pos = fopAcM_GetPosition(dComIfGp_getPlayer(0)); + cXyz& other_pos = fopAcM_GetPosition(this); + cXyz temp = (other_pos - this_pos); + f32 dist = temp.absXZ(); + + bool temp2 = true; + chkAttention(current.pos, current.angle.y); + + cXyz attnPos; + if(mEventCut.getAttnFlag()) { + attnPos = mEventCut.getAttnPos(); + } + + cXyz* dstPos; + if(field_0xD7E) { + attnPos = player->getLeftHandPos(); + dstPos = &attnPos; + } + else { + // no idea how to get these ptmf compares to use the stack + if((field_0xD7A != 0 || isGuardAnim()) || (field_0x2B0 == &kaitenwaitAction && !dComIfGs_isEventBit(0x501)) || (field_0x2B0 != &normalAction && dist < 600.0f)) { + if(field_0xD64 == 0xD) { + dstPos = 0; + } + else { + attnPos = dNpc_playerEyePos(0.0f); + dstPos = &attnPos; + } + } + else { + dstPos = 0; + } + } + + s16 maxHeadRot = l_HIO.field_0x10; + s16 maxSpineRot = l_HIO.field_0x12; + if(field_0xD64 == 0x10 || field_0xD64 == 0x11) { + maxHeadRot = 0x3E80; + maxSpineRot = 0x1F40; + } + + m_jnt.setParam(l_HIO.field_0x0E, maxSpineRot, -l_HIO.field_0x0E, -maxHeadRot, l_HIO.field_0x0C, maxHeadRot, -l_HIO.field_0x0C, -maxHeadRot, l_HIO.field_0x14); + if(m_jnt.trnChk()) { + cLib_addCalcAngleS2(&field_0xC88, l_HIO.field_0x18, l_HIO.field_0x16, 0x800); + temp2 = false; + ret = true; + } + else { + field_0xC88 = 0; + } + + m_jnt.lookAtTarget(¤t.angle.y, dstPos, mEyePos, current.angle.y, field_0xC88, temp2); + + return ret; } /* 0001132C-000114EC .text setHitParticle__11daNpc_Ji1_cFP4cXyzUl */ -void daNpc_Ji1_c::setHitParticle(cXyz*, unsigned long) { +void daNpc_Ji1_c::setHitParticle(cXyz* param_1, u32 param_2) { /* Nonmatching */ + + cXyz* pRVec = field_0x7E0.GetTgRVecP(); + cXyz scale(0.75f, 0.75f, 0.75f); + csXyz angle; + angle.y = cM_atan2s(pRVec->x, pRVec->z); + angle.x = cM_atan2s(pRVec->z, pRVec->y); + + if(param_1) { + scale = *param_1; + } + + dComIfGp_particle_set(0xD, field_0x7E0.GetTgHitPosP(), &angle, &scale); + dComIfGp_particle_set(0x10, field_0x7E0.GetTgHitPosP(), 0, &scale); + fopAcM_seStart(this, JA_SE_CM_JI_DAMAGE, 0); + fopAcM_seStart(this, param_2, 0); + dKy_SordFlush_set(*field_0x7E0.GetTgHitPosP(), 0); } /* 000114EC-0001161C .text setGuardParticle__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::setGuardParticle() { - /* Nonmatching */ + dComIfGp_particle_set(0xC, field_0x7E0.GetTgHitPosP()); + fopAcM_seStart(this, JA_SE_OBJ_COL_SWS_NMTLP, 0); + fopAcM_seStart(this, JA_SE_CV_JI_DEFENCE, 0); + dKy_SordFlush_set(*field_0x7E0.GetTgHitPosP(), 0); } /* 0001161C-00011644 .text BackSlideInit__11daNpc_Ji1_cFv */ void daNpc_Ji1_c::BackSlideInit() { - /* Nonmatching */ + field_0xC9C = 0; + field_0xD38 = current.pos; } /* 00011644-0001173C .text BackSlide__11daNpc_Ji1_cFff */ -void daNpc_Ji1_c::BackSlide(float, float) { +void daNpc_Ji1_c::BackSlide(f32 param_1, f32 param_2) { /* Nonmatching */ + + cLib_addCalc2(&field_0xC9C, param_1, 0.25f, 50.0f); + cXyz temp(field_0xD38); + temp.x -= field_0xC9C * cM_ssin(current.angle.y); + temp.z -= field_0xC9C * cM_scos(current.angle.y); + + if(field_0x434.ChkWallHit()) { + param_2 *= 0.35f; + } + + cLib_addCalcPosXZ(¤t.pos, temp, 0.8f, param_2, 1.0f); } /* 0001173C-000118E0 .text harpoonRelease__11daNpc_Ji1_cFP4cXyz */ -void daNpc_Ji1_c::harpoonRelease(cXyz*) { - /* Nonmatching */ +void daNpc_Ji1_c::harpoonRelease(cXyz* param_1) { + MTXCopy(mpMorf->getModel()->getAnmMtx(1), field_0xCA0); + mpMorf->setFrame(0.0f); + field_0xCD0.x = field_0xCA0[0][3]; + field_0xCD0.y = field_0xCA0[1][3]; + field_0xCD0.z = field_0xCA0[2][3]; + field_0xCA0[0][3] = 0.0f; + field_0xCA0[1][3] = 0.0f; + field_0xCA0[2][3] = 0.0f; + + if(param_1) { + field_0xCDC = *param_1; + } + else { + field_0xCDC.set(0.0f, 5.0f, 0.0f); + } + + field_0xD14 = 0x400; + + field_0xD04 = cM_ssin(field_0xD14) * cM_scos(current.angle.y); + field_0xD08 = 0.0f; + field_0xD0C = cM_ssin(field_0xD14) * cM_ssin(current.angle.y); + field_0xD10 = cM_scos(field_0xD14); + + field_0xCF4 = ZeroQuat; + + field_0xD84 = 2; } /* 000118E0-00011F74 .text harpoonMove__11daNpc_Ji1_cFv */ @@ -582,22 +3421,48 @@ void daNpc_Ji1_c::harpoonMove() { } /* 00011F74-00011F98 .text daNpc_Ji1_Execute__FP11daNpc_Ji1_c */ -static BOOL daNpc_Ji1_Execute(daNpc_Ji1_c*) { - /* Nonmatching */ +static BOOL daNpc_Ji1_Execute(daNpc_Ji1_c* i_this) { + i_this->_execute(); + return true; } /* 00011F98-00011FA0 .text daNpc_Ji1_IsDelete__FP11daNpc_Ji1_c */ static BOOL daNpc_Ji1_IsDelete(daNpc_Ji1_c*) { - /* Nonmatching */ + return true; } /* 00011FA0-00011FC0 .text daNpc_Ji1_Delete__FP11daNpc_Ji1_c */ -static BOOL daNpc_Ji1_Delete(daNpc_Ji1_c*) { - /* Nonmatching */ +static BOOL daNpc_Ji1_Delete(daNpc_Ji1_c* i_this) { + return i_this->_delete(); } /* 00011FC0-00011FE0 .text daNpc_Ji1_Create__FP10fopAc_ac_c */ -static s32 daNpc_Ji1_Create(fopAc_ac_c*) { - /* Nonmatching */ +static s32 daNpc_Ji1_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->_create(); } +static actor_method_class l_daNpc_Ji1_Method = { + (process_method_func)daNpc_Ji1_Create, + (process_method_func)daNpc_Ji1_Delete, + (process_method_func)daNpc_Ji1_Execute, + (process_method_func)daNpc_Ji1_IsDelete, + (process_method_func)daNpc_Ji1_Draw, +}; + +actor_process_profile_definition g_profile_NPC_JI1 = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_NPC_JI1, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daNpc_Ji1_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x0141, + /* Actor SubMtd */ &l_daNpc_Ji1_Method, + /* Status */ fopAcStts_UNK40000_e, + /* Group */ fopAc_ENEMY_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; + diff --git a/src/d/d_item_data.cpp b/src/d/d_item_data.cpp index 8bf5702db..67ad6ac42 100644 --- a/src/d/d_item_data.cpp +++ b/src/d/d_item_data.cpp @@ -3206,7 +3206,7 @@ dItem_data_item_resource dItem_data::item_resource[0x100] = { /* mHeapSize */ 0x0000 }, { - // 0xAA: noentry170 + // 0xAA: HURRICANE_SPIN /* mArcname */ item_arcname_tbl[ARCNAME_IDX_VSWON], /* mTexture */ NULL, /* mBmdIdx */ 0x0003, @@ -6796,7 +6796,7 @@ dItem_data_field_item_res dItem_data::field_item_res[0x100] = { /* mHeapSize */ 0x0000 }, { - // 0xAA: noentry170 + // 0xAA: HURRICANE_SPIN /* mArc */ NULL, /* mBmdIdx */ -1, /* mSrtIdx */ -1, @@ -9108,7 +9108,7 @@ dItem_data_item_info dItem_data::item_info[0x100] = { 0x00, }, { - // 0xAA: noentry170 + // 0xAA: HURRICANE_SPIN 0x00, 0x00, 0x00,