diff --git a/configure.py b/configure.py index cfda1b35c..6957d2bf0 100755 --- a/configure.py +++ b/configure.py @@ -1639,7 +1639,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_gp1"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_hi1"), ActorRel(NonMatching, "d_a_npc_ho"), - ActorRel(NonMatching, "d_a_npc_hr"), + ActorRel(Matching, "d_a_npc_hr"), ActorRel(NonMatching, "d_a_npc_jb1"), ActorRel(NonMatching, "d_a_npc_ji1"), ActorRel(Matching, "d_a_npc_kamome"), diff --git a/include/d/actor/d_a_npc_hr.h b/include/d/actor/d_a_npc_hr.h index 2891c9875..f66688f38 100644 --- a/include/d/actor/d_a_npc_hr.h +++ b/include/d/actor/d_a_npc_hr.h @@ -4,170 +4,298 @@ #include "f_op/f_op_actor.h" #include "d/d_cc_d.h" #include "d/d_particle.h" +#include "d/d_npc.h" -class daNpc_Wind_Eff { +class daNpc_Wind_Eff{ public: + + enum WindEffStates { + WIND_EFF_INACTIVE = 0, + WIND_EFF_FADE_IN = 1, + WIND_EFF_ACTIVE = 2, + WIND_EFF_FADE_OUT = 3, + }; + void init(); void remove(); - void create(cXyz*); - void end(); + BOOL create(cXyz*); + BOOL end(); void proc(); void setspd(); void move(); public: - /* 0x00 */ int m00; - /* 0x04 */ u8 m04[0x14 - 0x04]; + /* 0x00 */ dPa_followEcallBack mpFollowECallBack; /* 0x14 */ cXyz mPos; - /* 0x20 */ cXyz mVel; - /* 0x2C */ cXyz* m2C; - /* 0x30 */ f32 m30; - /* 0x34 */ u8 m34; - /* 0x35 */ u8 m35[0x38 - 0x35]; -}; + /* 0x20 */ cXyz mSpeed; + /* 0x2C */ cXyz* mpSquallPos; + /* 0x30 */ f32 mAlphaFactor; + /* 0x34 */ u8 mWindEffState; + /* 0x35 */ u8 field_0x35[0x38 - 0x35]; +}; // Size: 0x38 class daNpc_Wind_Clothes { public: void setSquallPos(int); - void create(fopAc_ac_c*, unsigned char, float*, int); - void end(); + BOOL create(fopAc_ac_c*, u8, f32*, int); + BOOL end(); void proc(); void init(); void remove(); public: - /* 0x000 */ daNpc_Wind_Eff mEff[4]; + /* 0x000 */ daNpc_Wind_Eff mWindEff[4]; /* 0x0E0 */ s16 mSquallCounter[4]; /* 0x0E8 */ cXyz mSquallPos[4]; - /* 0x118 */ u8 m118; - /* 0x119 */ u8 m119[0x11C - 0x119]; - /* 0x11C */ fpc_ProcID mActorProcID; - /* 0x120 */ f32 m120; - /* 0x124 */ f32 m124; - /* 0x128 */ f32 m128; - /* 0x12C */ f32 m12C; - /* 0x130 */ f32 m130; -}; + /* 0x118 */ u8 mSquallState; + /* 0x119 */ u8 field_0x119[0x11C - 0x119]; + /* 0x11C */ fpc_ProcID mProcId; + /* 0x120 */ f32 squallOrbitParam[5]; + + /* + squallOrbitParam[0] = centerOffsetX + squallOrbitParam[1] = centerOffsetY + squallOrbitParam[2] = orbitRadius + squallOrbitParam[3] = layerSpacingZ + squallOrbitParam[4] = baseOffsetZ + */ + +}; // Size: 0x134 class daNpc_Hr_c : public fopAc_ac_c { public: - void ChkOrder(unsigned char) {} - void ClrOrder() {} - void SetOrder(unsigned char) {} - void chkEvFlag(unsigned short) {} - void chkFlag(unsigned short) {} - void clrEvFlag(unsigned short) {} - void clrFlag(unsigned short) {} - void getBackboneJntNum() {} - void getBackbone_y() {} - void getHeadJntNum() {} - void getHead_x() {} - void getHead_y() {} - void incAttnSetCount() {} - void setAction(int (daNpc_Hr_c::*)(void*), void*) {} - void setAttentionBasePos(cXyz) {} - void setEvFlag(unsigned short) {} - void setEyePos(cXyz) {} - void setFlag(unsigned short) {} + enum HrFlags { + HR_FLAG_00000001 = 0x00000001, + HR_FLAG_00000002 = 0x00000002, + HR_FLAG_00000008 = 0x00000008, + HR_FLAG_00000010 = 0x00000010, + HR_FLAG_00000020 = 0x00000020, + HR_FLAG_00000040 = 0x00000040, + HR_FLAG_00000080 = 0x00000080, + HR_FLAG_00000100 = 0x00000100, + HR_FLAG_00000200 = 0x00000200, + HR_FLAG_00000400 = 0x00000400, + HR_FLAG_00000800 = 0x00000800, + }; - void getShapeType(); - void getSwbit(); - void XyCheckCB(int); + enum EvFlags { + EVFLAG_LOCK_ROTATION = 0x00000001, + EVFLAG_SKIP_UPDATE = 0x00000002, + EVFLAG_TORNADO_ACTIVE = 0x00000008, + EVFLAG_EVENT_CHANGE_REQ = 0x00000010, + EVFLAG_TACT_SOUND_ACTIVE = 0x00000020, + }; + + enum HrStates { + HR_STATE_WAIT_01 = 0, + HR_STATE_WAIT_02 = 1, + HR_STATE_TALK = 2, + HR_STATE_HT_TACT = 3, + + HR_STATE_RT_SEARCH = 5, + HR_STATE_RT_HIDE = 6, + HR_STATE_RT_INTRO = 7, + HR_STATE_RT_ANGRY = 8, + HR_STATE_RT_HIT_0 = 9, + HR_STATE_RT_HIT_1 = 10, + + HR_STATE_HT_HIDE = 11, + HR_STATE_RT_WIN = 12, + }; + + enum ActionStatus { + ACTION_STARTING = 0, + ACTION_ONGOING = 1, + ACTION_ENDING = -1, + }; + + enum TalkStates { + TALK_INIT = 0, + TALK_MSG_CREATE = 1, + TALK_ACTIVE = 2, + TALK_FINISHED = -1 + }; + + typedef int (daNpc_Hr_c::*ActionFunc)(void*); + + bool ChkOrder(u8 temp) { return mOrderFlags & temp; } + void ClrOrder() { mOrderFlags = 0; } + void SetOrder(u8 temp) { mOrderFlags |= temp; } + bool chkEvFlag(u16 evFlag) { return (mEvFlags & evFlag) == evFlag; } + bool chkFlag(u16 flag) { return (mFlags & flag) == flag; } + void clrEvFlag(u16 evFlag) { mEvFlags &= ~evFlag; } + void clrFlag(u16 flag) { mFlags &= ~flag; } + s8 getBackboneJntNum() { return m_jnt.getBackboneJntNum(); } + s16 getBackbone_y() { return m_jnt.getBackbone_y(); } + s8 getHeadJntNum() { return m_jnt.getHeadJntNum(); } + s16 getHead_x() { return m_jnt.getHead_x(); } + s16 getHead_y() { return m_jnt.getHead_y(); } + + void incAttnSetCount() { + if (mAttnSetCount != 0xff) { + mAttnSetCount++; + } + } + + BOOL setAction(ActionFunc actionFunc, void* arg) { + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + mActionStatus = ACTION_ENDING; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + mActionStatus = ACTION_STARTING; + (this->*mCurrActionFunc)(arg); + } + return TRUE; + } + + void setAttentionBasePos(cXyz i_attnBasePos) { mAttnBasePos = i_attnBasePos; } + void setEvFlag(u16 evFlag) { mEvFlags |= evFlag;} + void setEyePos(cXyz i_eyePos) { mEyePos = i_eyePos; } + void setFlag(u16 flag) { mFlags |= flag; } + + daNpc_Hr_c(); + int getShapeType(); + int getSwbit(); + s16 XyCheckCB(int); void onHide(int); void offHide(int); void defaultSetPos(cXyz*); - void getNowEventAction(); + s32 getNowEventAction(); void demoInitWind(); - void demoProcWind(int); + bool demoProcWind(int); void demoInitWait(); - void demoProcWait(); + BOOL demoProcWait(); void demoInitSpeak(); - void demoProcSpeak(); - void demoProcPatten(); - void demoProcTact0(); - void demoProcTact1(); - void demoProcTact2(); - void demoProcTact3(); - void calcKaijou(int); + BOOL demoProcSpeak(); + BOOL demoProcPatten(); + BOOL demoProcTact0(); + BOOL demoProcTact1(); + BOOL demoProcTact2(); + BOOL demoProcTact3(); + int calcKaijou(int); void demoInitMove(); void demoInitSmall(); - void demoProcSmall(); - void demoProcMove(); + BOOL demoProcSmall(); + bool demoProcMove(); void demoInitChange(); void demoInitCom(); void demoProcCom(); - void demoProc(); + bool demoProc(); void node_Ht_ant(int); - void initTexPatternAnm(bool); + BOOL initTexPatternAnm(bool); void playTexPatternAnm(); - void setTexPtn(signed char); - void setAnm(signed char); + void setTexPtn(s8); + void setAnm(s8); void setAnmStatus(); void eventOrder(); void checkOrder(); - void next_msgStatus(unsigned long*); - void getMsg(); + u16 next_msgStatus(u32*); + u32 getMsg(); void setCollision(); - void nextAnm(signed char, int); - void msgAnm(unsigned char); + void nextAnm(s8, int); + void msgAnm(u8); void talkInit(); - void talk(); - void init(); + u16 talk(); + BOOL init(); void setAttention(bool); - void getNowJointY(); + int getNowJointY(); void getTornadoPos(int, cXyz*); - void rideTornado(); - void getLookBackMode(); + bool rideTornado(); + u8 getLookBackMode(); void lookBack(); - void rt_search(); - void rt_hide(); - void rt_intro(); + bool rt_search(); + bool rt_hide(); + bool rt_intro(); void to_rt_hit(); void to_rt_tact(); - void rt_angry(); - void rt_win(); - void rt_hit0(); - void rt_hit1(); - void ht_hide(); - void wait01(); - void wait02(); + bool rt_angry(); + bool rt_win(); + bool rt_hit0(); + bool rt_hit1(); + bool ht_hide(); + bool wait01(); + bool wait02(); void endTalk(); void endTact(); - void setEmitFlash(float); + void setEmitFlash(f32); void smokeProc(); - void talk01(); - void ht_tact01(); - void wait_action(void*); + bool talk01(); + bool ht_tact01(); + BOOL wait_action(void*); BOOL _draw(); BOOL _execute(); BOOL _delete(); cPhs_State _create(); - void CreateHeap(); + BOOL CreateHeap(); public: - /* 0x290 */ u8 m290[0x294 - 0x290]; - /* 0x294 */ cXyz mPos; - /* 0x2A0 */ u8 m2A0[0x2A8 - 0x2A0]; - /* 0x2A8 */ request_of_phase_process_class mResHrPhs; - /* 0x2B0 */ u8 m2B0[0x314 - 0x2B0]; - /* 0x314 */ cCcD_Obj mObj0; - /* 0x364 */ u8 m364[0x42C - 0x364]; - /* 0x42C */ cM3dGCyl m42C; - /* 0x444 */ u8 m444[0x598 - 0x444]; - /* 0x598 */ cM3dGCyl m598; - /* 0x5B0 */ u8 m5B0[0x608 - 0x5B0]; - /* 0x608 */ u16 m608; - /* 0x60A */ u8 m60A[0x60C - 0x60A]; - /* 0x60C */ u8 m60C; - /* 0x60D */ u8 m60D[0x610 - 0x60D]; + /* 0x290 */ s8 m_waist_jnt_num; + /* 0x291 */ u8 field_0x291[0x294 - 0x291]; + /* 0x294 */ cXyz mCloudPos; + /* 0x2A0 */ s16 mEventIdx; + /* 0x2A2 */ s8 mAnmIdx; + /* 0x2A3 */ u8 field_0x2A3[0x2A4 - 0x2A3]; + /* 0x2A4 */ s16 mHeadRotation; + /* 0x2A6 */ u8 field_0x2A6[0x2A8 - 0x2A6]; + /* 0x2A8 */ request_of_phase_process_class mPhs; + /* 0x2B0 */ mDoExt_McaMorf* mpHrMorf; + /* 0x2B4 */ J3DModel* mpBrowModel; + /* 0x2B8 */ mDoExt_McaMorf* mpAntennaMorf; + /* 0x2BC */ J3DAnmTexPattern* m_head_tex_pattern; + /* 0x2C0 */ mDoExt_btpAnm mBtpAnm; + /* 0x2D4 */ u8 mBlinkFrame; + /* 0x2D5 */ u8 field_0x2D5[0x2D6 - 0x2D5]; + /* 0x2D6 */ s16 mBlinkTimer; + /* 0x2D8 */ dCcD_Stts mStts; + /* 0x314 */ dCcD_Cyl mCyl; + /* 0x444 */ dCcD_Stts mStts2; + /* 0x480 */ dCcD_Cyl mCyl2; + /* 0x5B0 */ dNpc_JntCtrl_c m_jnt; + /* 0x5E4 */ cXyz mEyePos; + /* 0x5F0 */ cXyz mAttnBasePos; + /* 0x5FC */ s16 mMaxHeadTurnVelocity; + /* 0x5FE */ s8 mAnmEnded; + /* 0x5FF */ u8 mAttnSetCount; + /* 0x600 */ f32 mAnmTimer; + /* 0x604 */ u32 mCurrMsgNo; + /* 0x608 */ u16 mFlags; + /* 0x60A */ u8 field_0x60A; + /* 0x60B */ u8 mHitCount; + /* 0x60C */ u8 mHitDelayTimer; + /* 0x60D */ u8 field_0x60D[0x610 - 0x60D]; /* 0x610 */ dPa_followEcallBack mSmokeCallBack; - /* 0x624 */ u8 m624[0x638 - 0x624]; - /* 0x638 */ u8 m638; - /* 0x639 */ u8 m639[0x63A - 0x639]; - /* 0x63A */ u8 mType; - /* 0x63B */ u8 m63B[0x694 - 0x63B]; +#if VERSION == VERSION_DEMO + JPABaseEmitter* mpEmitter; +#endif + /* 0x624 */ fpc_ProcID mProcId; + /* 0x628 */ ActionFunc mCurrActionFunc; + /* 0x634 */ s8 mTexPatternIdx; + /* 0x635 */ u8 mMsgAnmIdx; + /* 0x636 */ u8 mAnmLoopCount; + /* 0x637 */ u8 mOrderFlags; + /* 0x638 */ s8 mState; + /* 0x639 */ s8 mReturnState; + /* 0x63A */ s8 mType; + /* 0x63B */ s8 mActionStatus; + /* 0x63C */ s8 mTalkState; + /* 0x63D */ u8 field_0x63D[0x640 - 0x63D]; + /* 0x640 */ int mStaffIdx; + /* 0x644 */ u32 mMsgNo; + /* 0x648 */ f32 mScaleFactor; + /* 0x64C */ u8 field_0x64C[0x650 - 0x64C]; + /* 0x650 */ s16 mMoveTimer; + /* 0x652 */ s16 mBrakeTime; + /* 0x654 */ cXyz mTargetPos; + /* 0x660 */ s16 mTargetAngle; + /* 0x662 */ u8 mEvFlags; + /* 0x663 */ u8 field_0x663[0x664 - 0x663]; + /* 0x664 */ cXyz mPrevAntennaPos; + /* 0x670 */ cXyz mAntennaVelocity; + /* 0x67C */ cXyz mAntennaOffset; + /* 0x688 */ cXyz mAntennaRotation; /* 0x694 */ daNpc_Wind_Clothes mClothes; - /* 0x7C8 */ u8 m7C8[0x828 - 0x7C8]; -}; +}; // Size: 0x7C8 #endif /* D_A_NPC_HR_H */ diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index 47d5651c4..26e9c68f3 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -63,6 +63,7 @@ public: MODE_CANNON_e = 9, MODE_CRANE_e = 10, MODE_CRANE_UP_e = 11, + MODE_TORNADO_UP_e = 12, MODE_START_MODE_WARP_e = 13, MODE_TACT_WARP_e = 14, MODE_START_MODE_THROW_e = 16, @@ -142,8 +143,8 @@ public: daTornado_c* getTornadoActor() const { return mTornadoActor; } fopAc_ac_c* getWhirlActor() const { return mWhirlActor; } #endif - void checkTornadoFlg() const {} - void checkTornadoUp() const {} + bool checkTornadoFlg() const { return mTornadoID != fpcM_ERROR_PROCESS_ID_e; } + bool checkTornadoUp() const { return mCurMode == MODE_TORNADO_UP_e; } f32 getBeltSpeed() const { return m1044.absXZ(); } s16 getCannonAngleX() const { return shape_angle.x + m0396 - 0x4000; } s16 getCannonAngleY() const { return shape_angle.y + m0394; } diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index cb0a5d55d..cfd0f1c06 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -3225,6 +3225,14 @@ inline u16 dComIfGp_event_checkHind(u16 i_hindFlag) { return g_dComIfG_gameInfo.play.getEvent()->checkHind(i_hindFlag); } +inline void dComIfGp_event_onHindFlag(u16 flag) { + g_dComIfG_gameInfo.play.getEvent()->onHindFlag(flag); +} + +inline void dComIfGp_event_offHindFlag(u16 flag) { + g_dComIfG_gameInfo.play.getEvent()->offHindFlag(flag); +} + /** * Returns the button (X Y or Z) that was used to start this event. * @return The dTalkXYButton_e of the button the player used to initiate this event. @@ -3389,6 +3397,10 @@ inline char* dComIfGp_evmng_getMyActName(int staffIdx) { return dComIfGp_getPEvtManager()->getMyActName(staffIdx); } +inline s32 dComIfGp_evmng_getMySubstanceNum(int staffIdx, char* name) { + return dComIfGp_getPEvtManager()->getMySubstanceNum(staffIdx, name); +} + inline f32* dComIfGp_evmng_getMyFloatP(int staffIdx, char* name) { return reinterpret_cast(dComIfGp_getPEvtManager()->getMySubstanceP(staffIdx, name, dEvDtData_c::TYPE_FLOAT)); } diff --git a/include/d/d_kankyo_wether.h b/include/d/d_kankyo_wether.h index 67683b389..bfe00f4e8 100644 --- a/include/d/d_kankyo_wether.h +++ b/include/d/d_kankyo_wether.h @@ -369,6 +369,7 @@ void dKyw_pwind_cylinder_set(WIND_INFLUENCE*); cXyz dKyw_pntwind_get_vecpow(cXyz* pPos); void dKyw_evt_wind_set(s16 i_windX, s16 i_windY); void dKyw_evt_wind_set_go(); +void dKyw_tact_wind_set(s16 i_windX, s16 i_windY); void dKyw_get_AllWind_vec(cXyz* param_0, cXyz* i_direction, f32* i_power); cXyz dKyw_get_AllWind_vecpow(cXyz* param_0); int dKyw_get_tactwind_dir(); diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 5f677ad68..7e527fc43 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -159,7 +159,7 @@ enum { /* 0x97 */ DSNAP_TYPE_UNK97, /* 0x98 */ DSNAP_TYPE_BTSW, /* 0x99 */ DSNAP_TYPE_DR, - /* 0x9A */ DSNAP_TYPE_UNK9A, + /* 0x9A */ DSNAP_TYPE_HR, /* 0x9B */ DSNAP_TYPE_UNK9B, /* 0x9C */ DSNAP_TYPE_CB1, /* 0x9D */ DSNAP_TYPE_UNK9D, diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 0286a2ef5..688ec501f 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -615,6 +615,7 @@ fopAc_ac_c* fopAcM_searchFromName4Event(char* name, s16 eventID); BOOL fopAcM_getWaterY(const cXyz*, f32*); void fpoAcM_relativePos(fopAc_ac_c* actor, cXyz* p_inPos, cXyz* p_outPos); +void fpoAcM_absolutePos(fopAc_ac_c* actor, cXyz* p_inPos, cXyz* p_outPos); void fopAcM_setGbaName(fopAc_ac_c* i_this, u8 itemNo, u8 gbaName0, u8 gbaName1); diff --git a/src/d/actor/d_a_npc_hr.cpp b/src/d/actor/d_a_npc_hr.cpp index 9e12a0ecc..6738c011b 100644 --- a/src/d/actor/d_a_npc_hr.cpp +++ b/src/d/actor/d_a_npc_hr.cpp @@ -7,460 +7,2221 @@ #include "d/actor/d_a_npc_hr.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_hr.h" +#include "d/d_snap.h" +#include "d/d_kankyo_wether.h" +#include "d/actor/d_a_player_main.h" +#include "d/actor/d_a_ship.h" +#include "d/actor/d_a_tornado.h" +#include "d/d_item.h" +#include "f_op/f_op_actor_mng.h" + +static fpc_ProcID l_msgId; +static msg_class* l_msg; /* 00000078-000000A0 .text init__14daNpc_Wind_EffFv */ void daNpc_Wind_Eff::init() { - /* Nonmatching */ + mWindEffState = WIND_EFF_INACTIVE; + mAlphaFactor = 0.0f; + mSpeed.setall(0.0f); + mpSquallPos = NULL; } /* 000000A0-000000EC .text remove__14daNpc_Wind_EffFv */ void daNpc_Wind_Eff::remove() { - /* Nonmatching */ + if (mWindEffState != WIND_EFF_INACTIVE) { + mpFollowECallBack.end(); + init(); + } } /* 000000EC-000001B0 .text create__14daNpc_Wind_EffFP4cXyz */ -void daNpc_Wind_Eff::create(cXyz*) { - /* Nonmatching */ +BOOL daNpc_Wind_Eff::create(cXyz* squallPos) { + if (mWindEffState == WIND_EFF_INACTIVE) { + mPos = *squallPos; + + mAlphaFactor = 1.0f; + mpSquallPos = squallPos; + JPABaseEmitter* pEmitter = dComIfGp_particle_set(dPa_name::ID_AK_JN_WINDLINE00, &mPos, NULL, NULL, 0xFF, &mpFollowECallBack); + + if (pEmitter == NULL) { + return FALSE; + } else { + mWindEffState = WIND_EFF_FADE_IN; + return TRUE; + } + } + return FALSE; } /* 000001B0-000001E4 .text end__14daNpc_Wind_EffFv */ -void daNpc_Wind_Eff::end() { - /* Nonmatching */ +BOOL daNpc_Wind_Eff::end() { + if (mWindEffState == WIND_EFF_FADE_IN || mWindEffState == WIND_EFF_ACTIVE) { + mWindEffState = WIND_EFF_FADE_OUT; + mpSquallPos = NULL; + return TRUE; + } + return FALSE; } /* 000001E4-0000030C .text proc__14daNpc_Wind_EffFv */ void daNpc_Wind_Eff::proc() { - /* Nonmatching */ + JPABaseEmitter* pEmitter; + switch(mWindEffState) { + case WIND_EFF_FADE_IN: + pEmitter = mpFollowECallBack.getEmitter(); + if (mAlphaFactor < 0.9f) { + mAlphaFactor += 0.1f; + + } else { + mWindEffState = WIND_EFF_ACTIVE; + mAlphaFactor = 1.0f; + } +#if VERSION > VERSION_DEMO + if (pEmitter != NULL) { + pEmitter->setGlobalAlpha(mAlphaFactor * 128.0f); + } +#else + pEmitter->setGlobalAlpha(mAlphaFactor * 128.0f); +#endif + + setspd(); + move(); + break; + case WIND_EFF_ACTIVE: + setspd(); + move(); + break; + case WIND_EFF_FADE_OUT: + pEmitter = mpFollowECallBack.getEmitter(); + + if (mAlphaFactor > 0.1f) { + mAlphaFactor -= 0.1f; + move(); + +#if VERSION == VERSION_DEMO + pEmitter->setGlobalAlpha(mAlphaFactor * 128.0f); +#else + if (pEmitter != NULL) { + pEmitter->setGlobalAlpha(mAlphaFactor * 128.0f); + } +#endif + } else { + remove(); + } + break; + } } /* 0000030C-00000368 .text setspd__14daNpc_Wind_EffFv */ void daNpc_Wind_Eff::setspd() { - /* Nonmatching */ + cXyz speed = *mpSquallPos - mPos; + mSpeed.set(speed); } /* 000003A4-000003D4 .text move__14daNpc_Wind_EffFv */ void daNpc_Wind_Eff::move() { - /* Nonmatching */ + mPos += mSpeed; } /* 000003D4-00000550 .text setSquallPos__18daNpc_Wind_ClothesFi */ -void daNpc_Wind_Clothes::setSquallPos(int) { - /* Nonmatching */ +void daNpc_Wind_Clothes::setSquallPos(int param_1) { + fopAc_ac_c* a_actor = fopAcM_SearchByID(mProcId); + JUT_ASSERT(DEMO_SELECT(398, 402), a_actor); + + mSquallPos[param_1] = a_actor->current.pos; + + cXyz temp; + f32 temp2 = squallOrbitParam[2] * (cM_ssin((int)mSquallCounter[param_1]) * 0.2f + 1.0f); // fake? + temp.x = squallOrbitParam[0] + temp2 * cM_scos(mSquallCounter[param_1]); + temp.y = squallOrbitParam[1] + temp2 * cM_ssin(mSquallCounter[param_1]); + temp.z = squallOrbitParam[4] + param_1 * squallOrbitParam[3]; + fpoAcM_absolutePos(a_actor, &temp, &mSquallPos[param_1]); } /* 00000550-00000620 .text create__18daNpc_Wind_ClothesFP10fopAc_ac_cUcPfi */ -void daNpc_Wind_Clothes::create(fopAc_ac_c*, unsigned char, float*, int) { - /* Nonmatching */ +BOOL daNpc_Wind_Clothes::create(fopAc_ac_c* i_this, u8 param_2, f32* param_3, int param_4) { + mSquallState = param_2; + mProcId = fopAcM_GetID(i_this); + if (param_3 != NULL ) { + for (int i = 0; i < param_4; i++) { + squallOrbitParam[i] = param_3[i]; + } + } + + for(int i = 0; i < 4; i++) { + mSquallCounter[i] = i*0x4000; + setSquallPos(i); + mWindEff[i].create(&mSquallPos[i]); + } + return TRUE; } /* 00000620-00000678 .text end__18daNpc_Wind_ClothesFv */ -void daNpc_Wind_Clothes::end() { - /* Nonmatching */ +BOOL daNpc_Wind_Clothes::end() { + mSquallState = 0; + for (int i = 0; i < 4; i++) { + mWindEff[i].end(); + } + return TRUE; } /* 00000678-0000075C .text proc__18daNpc_Wind_ClothesFv */ void daNpc_Wind_Clothes::proc() { - /* Nonmatching */ + switch(mSquallState) { + case 1: + fopAc_ac_c* a_actor = fopAcM_SearchByID(mProcId); + JUT_ASSERT(DEMO_SELECT(465, 469), a_actor); + + for (int i = 0; i < 4; i++) { + mSquallCounter[i] += 0x100; + setSquallPos(i); + } + break; + } + + for(int i = 0; i < 4; i++) { + mWindEff[i].proc(); + } } /* 0000075C-000007B0 .text init__18daNpc_Wind_ClothesFv */ void daNpc_Wind_Clothes::init() { - /* Nonmatching */ + mSquallState = 0; + for(int i = 0; i < 4; i++) { + mWindEff[i].init(); + } } /* 000007B0-00000800 .text remove__18daNpc_Wind_ClothesFv */ void daNpc_Wind_Clothes::remove() { - /* Nonmatching */ + for(int i = 0; i < 4; i++) { + mWindEff[i].remove(); + } } +static dCcD_SrcCyl dNpc_hr_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_NORMAL_ARROW | AT_TYPE_FIRE_ARROW | AT_TYPE_ICE_ARROW | AT_TYPE_LIGHT_ARROW, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, + /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + {{ + /* Center */ {0.0f, 0.0f, 0.0f}, + /* Radius */ 0.0f, + /* Height */ 0.0f, + }}, +}; + +extern dCcD_SrcCyl dNpc_cyl_src; + /* 00000800-0000080C .text getShapeType__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getShapeType() { - /* Nonmatching */ +int daNpc_Hr_c::getShapeType() { + return fopAcM_GetParam(this) & 0xFF; } /* 0000080C-00000818 .text getSwbit__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getSwbit() { - /* Nonmatching */ +int daNpc_Hr_c::getSwbit() { + return fopAcM_GetParam(this) >> 8 & 0xFF; } /* 00000818-00000838 .text daNpc_hr_XyCheckCB__FPvi */ -static s16 daNpc_hr_XyCheckCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_hr_XyCheckCB(void* i_this, int i_itemBtn) { + return ((daNpc_Hr_c*)i_this)->XyCheckCB(i_itemBtn); } /* 00000838-0000085C .text XyCheckCB__10daNpc_Hr_cFi */ -void daNpc_Hr_c::XyCheckCB(int) { - /* Nonmatching */ +s16 daNpc_Hr_c::XyCheckCB(int i_itemBtn) { + return dComIfGp_getSelectItem(i_itemBtn) == dItem_WIND_WAKER_e ? TRUE : FALSE; } /* 0000085C-000008AC .text daNpc_hr_XyEventCB__FPvi */ -static s16 daNpc_hr_XyEventCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_hr_XyEventCB(void* i_this, int i_itemBtn) { + daNpc_Hr_c* a_this = (daNpc_Hr_c*)i_this; + a_this->mEventIdx = dComIfGp_evmng_getEventIdx("TACT_HT"); + return a_this->mEventIdx; } /* 000008AC-000008FC .text onHide__10daNpc_Hr_cFi */ -void daNpc_Hr_c::onHide(int) { - /* Nonmatching */ +void daNpc_Hr_c::onHide(int param_1) { + if (!chkFlag(HR_FLAG_00000010) || param_1 != 0) { + setFlag(HR_FLAG_00000010); + +#if VERSION == VERSION_DEMO + if(mpEmitter != NULL) { + mSmokeCallBack.end(); + } + mpEmitter = NULL; +#else + mSmokeCallBack.end(); +#endif + } } /* 000008FC-000009F0 .text offHide__10daNpc_Hr_cFi */ -void daNpc_Hr_c::offHide(int) { - /* Nonmatching */ +void daNpc_Hr_c::offHide(int param_1) { + u16 particleID; + if (chkFlag(HR_FLAG_00000010) || param_1 != 0) { + clrFlag(HR_FLAG_00000010); + + switch (mType) { + case 1: + particleID = dPa_name::ID_IT_SN_KINTOUN_RT00; + break; + default: + particleID = dPa_name::ID_IT_SN_KINTOUN_FT00; + break; + } + + JPABaseEmitter* pEmitter = dComIfGp_particle_set(particleID, &mCloudPos, &shape_angle, &scale, 0xFF, &mSmokeCallBack, fopAcM_GetRoomNo(this)); + +#if VERSION == VERION_DEMO + mpEmitter = pEmitter; +#endif + + if(DEMO_SELECT(mpEmitter, pEmitter) != NULL && mType == 1) { + DEMO_SELECT(mpEmitter, pEmitter)->setGlobalPrmColor(0x97, 0x76, 0xA9); + DEMO_SELECT(mpEmitter, pEmitter)->setGlobalEnvColor(0x84, 0x70, 0x93); + } + } } /* 000009F0-00000A94 .text defaultSetPos__10daNpc_Hr_cFP4cXyz */ -void daNpc_Hr_c::defaultSetPos(cXyz*) { - /* Nonmatching */ +void daNpc_Hr_c::defaultSetPos(cXyz* param_1) { + current.pos.set(*param_1); + attention_info.position.set(current.pos); + attention_info.position.y += 150.0f; + + mAttnBasePos = attention_info.position; + eyePos.set(current.pos); + eyePos.y += 100.0f; + + mEyePos = eyePos; } /* 00000A94-00000ADC .text getNowEventAction__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getNowEventAction() { - /* Nonmatching */ +s32 daNpc_Hr_c::getNowEventAction() { + static char* action_table[] = { + "WAIT", + "SPEAK", + "PATTEN", + "TACT0", + "TACT1", + "TACT2", + "TACT3", + "WIND0", + "WIND1", + "HIDE_LINK", + "DISP_LINK", + "DISP_MY", + "MOVE", + "TURN_LINK", + "LOOK", + "SMALL", + "INTRO", + "CHANGE", + "DEBUG", + }; + + return dComIfGp_evmng_getMyActIdx(mStaffIdx, action_table, ARRAY_SIZE(action_table), FALSE, 1); } /* 00000ADC-00000CD0 .text demoInitWind__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitWind() { - /* Nonmatching */ + dScnKy_env_light_c& env_light = g_env_light; + env_light.mWind.mWindVec.set(0.0f, 0.0f, 1.0f); // fake? + dKyw_tact_wind_set(0, 0x4000); + dKyw_tact_wind_set_go(); + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + cXyz* pWindVec = dKyw_get_wind_vec(); + cSGlobe globe(*pWindVec); + cSAngle angle(globe.U()); + angle += cSAngle::_90; + f32 _40 = 40.0f; + mScaleFactor = 1.0f; + speed.set(0.0f, 0.0f, 40.0f); + + current.pos.set(pLink->current.pos); + current.pos.x += angle.Cos() * 20.0f; + current.pos.y += 150.0f + mScaleFactor * _40 * _40 * 0.5f; + + current.pos.z += angle.Sin() * 20.0f - _40 * speed.z; + speed.y = -(mScaleFactor * _40); + + cXyz unused(0.0f, 0.0f, 1.0f); + + current.angle.y = 0; + shape_angle.y = 0; + mMoveTimer = 0x8C; + dKyw_custom_windpower(1.0f); + pLink->setPlayerPosAndAngle(&pLink->current.pos, 0x7FFF); + dComIfGs_offSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + mDoAud_seStart(JA_SE_TAKT_WIND_DEMO); } /* 00000CD0-00000DE8 .text demoProcWind__10daNpc_Hr_cFi */ -void daNpc_Hr_c::demoProcWind(int) { - /* Nonmatching */ +bool daNpc_Hr_c::demoProcWind(int param_1) { + setFlag(HR_FLAG_00000020); + if (param_1 == 0 && mMoveTimer > 0 && mMoveTimer <= 0x6E) { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + + if (mMoveTimer > 0) { + mMoveTimer--; + if (mMoveTimer > 0x3C) { + fopAcM_posMove(this, NULL); + speed.y += mScaleFactor; + } + if (mMoveTimer < 0xF) { + dKyw_custom_windpower(0); + } + } else { + speed.setall(0.0f); + dComIfGp_evmng_cutEnd(mStaffIdx); + } + + eyePos.set(current.pos); + attention_info.position.set(current.pos); + return false; } /* 00000DE8-00000E50 .text demoInitWait__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitWait() { - /* Nonmatching */ + int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer"); + if (pTimer != NULL) { + mMoveTimer = *pTimer; + } else { + mMoveTimer = 0; + } } /* 00000E50-00000EA0 .text demoProcWait__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcWait() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcWait() { + if (mMoveTimer > 0) { + mMoveTimer--; + } else { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + return FALSE; } /* 00000EA0-00000F38 .text demoInitSpeak__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitSpeak() { - /* Nonmatching */ + talkInit(); + int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "MsgNo"); + JUT_ASSERT(DEMO_SELECT(861, 871), a_intP); + mMsgNo = *a_intP; } /* 00000F38-00000FA8 .text demoProcSpeak__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcSpeak() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcSpeak() { + u16 temp = talk(); + if (temp == fopMsgStts_BOX_CLOSED_e || temp == 0xFE) { + dComIfGp_evmng_cutEnd(mStaffIdx); + + if (chkFlag(HR_FLAG_00000002)) { + clrFlag(HR_FLAG_00000002); + } + } + return TRUE; } /* 00000FA8-00001008 .text demoProcPatten__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcPatten() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcPatten() { + u16 temp = talk(); + if (temp == fopMsgStts_BOX_CLOSED_e || temp == 0xFE || temp == fopMsgStts_INPUT_e) { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + return TRUE; } /* 00001008-000010DC .text demoProcTact0__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcTact0() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcTact0() { + if (chkFlag(HR_FLAG_00000002)) { + if (l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + fopMsgM_messageSendOn(); + clrFlag(HR_FLAG_00000200); + + if (dComIfGp_checkMesgCancelButton()) { + setFlag(HR_FLAG_00000200); + } else { + execItemGet(TACT_SONG1); + } + dComIfGp_evmng_cutEnd(mStaffIdx); + clrFlag(HR_FLAG_00000002); + } + return TRUE; + } + + dComIfGp_evmng_cutEnd(mStaffIdx); + return TRUE; } /* 000010DC-00001174 .text demoProcTact1__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcTact1() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcTact1() { + u16 temp = talk(); + if (temp == fopMsgStts_BOX_CLOSED_e || temp == fopMsgStts_MSG_DESTROYED_e || temp == 0xFE) { + if (chkFlag(HR_FLAG_00000200)) { + endTalk(); + endTact(); + } else { + dComIfGp_evmng_cutEnd(mStaffIdx); + dComIfGs_onEventBit(dSv_event_flag_c::UNK_2708); + } + } + return TRUE; } /* 00001174-000011AC .text demoProcTact2__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcTact2() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcTact2() { + dComIfGp_evmng_cutEnd(mStaffIdx); + return TRUE; } /* 000011AC-00001268 .text demoProcTact3__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcTact3() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcTact3() { + if(daPy_getPlayerLinkActorClass()->getTactTimerCancel() > 0) { + mEventIdx = dComIfGp_evmng_getEventIdx("TACTM_RT"); + setEvFlag(EVFLAG_EVENT_CHANGE_REQ); + fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF); + } else { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + return TRUE; } /* 00001268-0000128C .text calcKaijou__10daNpc_Hr_cFi */ -void daNpc_Hr_c::calcKaijou(int) { - /* Nonmatching */ +int daNpc_Hr_c::calcKaijou(int param_1) { + int sum = 0; + for (int i = 1; param_1 >= 1; i++, param_1--) { + sum += i; + } + return sum; } /* 0000128C-000015B4 .text demoInitMove__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitMove() { - /* Nonmatching */ + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + daShip_c* pShip = (daShip_c*)dComIfGp_getShipActor(); + + cXyz* pPos = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos"); + if(pPos != NULL) { + mTargetPos.set(*pPos); + } else { + cXyz* pPos3 = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos3"); + if(pPos3 != NULL && pShip != NULL) { + fpoAcM_absolutePos(pShip, pPos3, &mTargetPos); + } else { + cXyz* pPos2 = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos2"); + if(pPos2 != NULL) { + fpoAcM_absolutePos(pLink, pPos2, &mTargetPos); + } + } + } + + int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer"); + if(pTimer != NULL) { + mMoveTimer = *pTimer; + if(mMoveTimer < 10) { + mMoveTimer = 10; + } + } else { + mMoveTimer = 0x14; + } + + int* pBrake = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Brake"); + if (pBrake != NULL) { + mBrakeTime = *pBrake; + } else { + mBrakeTime = 0; + } + + int* pAngleY = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "AngleY"); + if (pAngleY != NULL) { + mTargetAngle = *pAngleY; + if (chkEvFlag(EVFLAG_LOCK_ROTATION)) { + current.angle.y = mTargetAngle; + } + } else { + mTargetAngle = current.angle.y; + } + + int* pSoundOff = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "SOUND_OFF"); + if (pSoundOff == NULL) { + fopAcM_seStart(this, JA_SE_CM_HU_RC_MOVE_RAPID, 0); + } + + setFlag(HR_FLAG_00000020); + f32 temp2; + if (mBrakeTime == 0) { + temp2 = 1.0f/mMoveTimer; + } else { + temp2 = 1.0f/(mMoveTimer - mBrakeTime + (f32)calcKaijou(mBrakeTime) / mBrakeTime); + } + + speed.x = temp2 * (mTargetPos.x - current.pos.x); + speed.y = temp2 * (mTargetPos.y - current.pos.y); + speed.z = temp2 * (mTargetPos.z - current.pos.z); } /* 000015B4-000015CC .text demoInitSmall__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitSmall() { - /* Nonmatching */ + mScaleFactor = 11.0f; + mMoveTimer = 0; } /* 000015CC-00001688 .text demoProcSmall__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcSmall() { - /* Nonmatching */ +BOOL daNpc_Hr_c::demoProcSmall() { + if (cLib_addCalc(&mScaleFactor, 1.0f, 0.1f, 100.0f, 0.3f) < 0.3f) { + mScaleFactor = 1.0f; + dComIfGp_evmng_cutEnd(mStaffIdx); + } + scale.setall(mScaleFactor); + + JPABaseEmitter* pEmitter = DEMO_SELECT(mpEmitter, mSmokeCallBack.getEmitter()); + + if(pEmitter != NULL) { + pEmitter->setGlobalScale(scale); + } + return TRUE; } /* 00001688-000017AC .text demoProcMove__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProcMove() { - /* Nonmatching */ +bool daNpc_Hr_c::demoProcMove() { + setFlag(HR_FLAG_00000020); + if (mMoveTimer <= 0) { + speed.setall(0.0f); + dComIfGp_evmng_cutEnd(mStaffIdx); + } else if (mMoveTimer < mBrakeTime) { + f32 fac = mMoveTimer / (f32)(mMoveTimer+1); + speed.x *= fac; + speed.y *= fac; + speed.z *= fac; + } + + if (mMoveTimer > 0) { + fopAcM_posMove(this, NULL); + + if (!chkEvFlag(EVFLAG_LOCK_ROTATION)) { + cLib_addCalcAngleS2(¤t.angle.y, mTargetAngle, mMoveTimer, 0x3FFF); + } + mMoveTimer--; + } + return true; } /* 000017AC-000018C0 .text demoInitChange__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitChange() { - /* Nonmatching */ + int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "prm0"); + JUT_ASSERT(DEMO_SELECT(1169, 1185), a_intP); + + if(a_intP != NULL) { + switch(*a_intP) { + case 1: + mEventIdx = dComIfGp_evmng_getEventIdx("TACT1_RT");; + break; + default: + mEventIdx = dComIfGp_evmng_getEventIdx("PATTEN_RT");; + } + setEvFlag(EVFLAG_EVENT_CHANGE_REQ); + fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF); + } } /* 000018C0-00001D84 .text demoInitCom__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoInitCom() { - /* Nonmatching */ + daShip_c* pShip = (daShip_c*)dComIfGp_getShipActor(); + daPy_lk_c* pLink = daPy_getPlayerLinkActorClass(); + + int* turnPl = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "TURN_PL"); + if (turnPl != NULL) { + if (*turnPl != 0) { + setEvFlag(EVFLAG_LOCK_ROTATION); + } else { + clrEvFlag(EVFLAG_LOCK_ROTATION); + } + } + + int* tornado = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "TORNADO"); + if (tornado != NULL) { + if (*tornado != 0) { + setEvFlag(EVFLAG_TORNADO_ACTIVE); + } else { + clrEvFlag(EVFLAG_TORNADO_ACTIVE); + } + } + + int* update = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "UPDATE"); + if (update != NULL) { + if (*update != 0) { + clrEvFlag(EVFLAG_SKIP_UPDATE); + } else { + setEvFlag(EVFLAG_SKIP_UPDATE); + } + } + + int* tornado_off = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "TORNADE_OFF"); + if (tornado_off != NULL) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_2710); + dComIfGs_onSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + mReturnState = 1; + } + + int* anm = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "ANM"); + if (anm != NULL) { + setAnm(*anm); + } + + int* texAnm = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "TEXANM"); + if (texAnm != NULL) { + setTexPtn(*texAnm); + } + + int* soundInit = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Sound_Init"); + if (soundInit != NULL) { + mDoAud_tact_reset(); + } + + int* soundPlay = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Sound_Play"); + if (soundPlay != NULL) { + mDoAud_tact_melodyPlay(1); + } + + int* soundEnd = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Sound_End"); + if (soundEnd != NULL) { + mDoAud_tact_reset(); + clrEvFlag(EVFLAG_TACT_SOUND_ACTIVE); + } + + cXyz* startPos = dComIfGp_evmng_getMyXyzP(mStaffIdx, "StartPos"); + if (startPos != NULL) { + current.pos.set(*startPos); + } + + cXyz* startPos2 = dComIfGp_evmng_getMyXyzP(mStaffIdx, "StartPos2"); + if (startPos2 != NULL) { + fpoAcM_absolutePos(pLink, startPos2, ¤t.pos); + } + + cXyz* startPos3 = dComIfGp_evmng_getMyXyzP(mStaffIdx, "StartPos3"); + if (startPos3 != NULL && pShip != NULL) { + fpoAcM_absolutePos(pShip, startPos3, ¤t.pos); + } + + int* wind = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Wind"); + f32* windPrm = dComIfGp_evmng_getMyFloatP(mStaffIdx, "WindPrm"); + + if (wind != NULL) { + switch(*wind) { + case 1: + if (windPrm != NULL) { + mClothes.create(this, *wind, windPrm, dComIfGp_evmng_getMySubstanceNum(mStaffIdx, "WindPrm")); + } + break; + default: + mClothes.end(); + break; + } + + } + + int* away = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "AWAY"); + if (away != NULL) { + mDoAud_seStart(JA_SE_CM_HU_RC_FLY_AWAY); + if (getShapeType() == 1) { + mDoAud_seStart(JA_SE_CV_RC_FLY_AWAY); + } else { + mDoAud_seStart(JA_SE_CV_HU_FLY_AWAY); + } + } } /* 00001D84-00001F08 .text demoProcCom__10daNpc_Hr_cFv */ void daNpc_Hr_c::demoProcCom() { - /* Nonmatching */ + if (chkEvFlag(EVFLAG_LOCK_ROTATION)) { + setFlag(HR_FLAG_00000080); + } + + if (chkEvFlag(EVFLAG_SKIP_UPDATE)) { + setFlag(HR_FLAG_00000100); + } + + if (chkEvFlag(EVFLAG_TACT_SOUND_ACTIVE)) { + mDoAud_tact_ambientPlay(); + } + + if (!chkFlag(HR_FLAG_00000010)) { + f32 _15 = 15.0f; + + f32 temp = speed.abs(); + if (temp > _15) { + temp = _15; + } + fopAcM_seStart(this, JA_SE_CM_HU_RC_FLYING, (temp/_15)*100.0f); + } } /* 00001F08-0000232C .text demoProc__10daNpc_Hr_cFv */ -void daNpc_Hr_c::demoProc() { - /* Nonmatching */ +bool daNpc_Hr_c::demoProc() { + bool temp; + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + + temp = true; + if (chkEvFlag(EVFLAG_EVENT_CHANGE_REQ)) { + mStaffIdx = dComIfGp_evmng_getMyStaffId("Hr2"); + clrEvFlag(EVFLAG_EVENT_CHANGE_REQ); + } + + s32 eventAction = getNowEventAction(); + if(dComIfGp_evmng_getIsAddvance(mStaffIdx)) { + demoInitCom(); + setFlag(HR_FLAG_00000002); + switch(eventAction) { + case 1: + case 2: + demoInitSpeak(); + break; + case 7: + demoInitWind(); + break; + case 9: + pLink->onPlayerNoDraw(); + dComIfGs_offSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + break; + case 10: + pLink->offPlayerNoDraw(); + break; + case 11: + cXyz* pPos = dComIfGp_evmng_getMyXyzP(mStaffIdx, "Pos"); + + if (pPos != NULL) { + current.pos.set(*pPos); + } + + int* pAngleY = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "AngleY"); + if (pAngleY != NULL) { + current.angle.y = *pAngleY; + } + + offHide(0); + demoInitWait(); + mAnmIdx = -1; + setAnm(0); + break; + case 12: + demoInitMove(); + break; + case 13: + mTargetAngle = fopAcM_searchActorAngleY(pLink, this); + int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer"); + + if (pTimer != NULL) { + mMoveTimer = *pTimer; + } else { + mMoveTimer = 0; + } + break; + case 14: + setAnm(0); + demoInitWait(); + break; + case 0: + demoInitWait(); + break; + case 15: + demoInitSmall(); + break; + case 16: + speed.y = 0.0f; + break; + case 17: + demoInitChange(); + break; + case 5: + clrFlag(HR_FLAG_00000200); + break; + } + } + + switch(eventAction) { + case 1: + demoProcSpeak(); + break; + case 2: + demoProcPatten(); + break; + case 7: + temp = demoProcWind(0); + break; + case 8: + temp = demoProcWind(1); + break; + case 12: + temp = demoProcMove(); + break; + case 11: + demoProcWait(); + break; + case 13: + if (mMoveTimer > 0) { + mMoveTimer--; + } else { + s16 angle = pLink->shape_angle.y; + cLib_addCalcAngleS(&angle, mTargetAngle, 1, 0x800, 0x800); + pLink->setPlayerPosAndAngle(NULL, angle); + if (angle == mTargetAngle) { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + } + break; + case 14: + demoProcWait(); + setFlag(HR_FLAG_00000040); + break; + case 0: + demoProcWait(); + break; + case 3: + demoProcTact0(); + break; + case 4: + demoProcTact1(); + break; + case 5: + demoProcTact2(); + break; + case 6: + demoProcTact3(); + break; + case 15: + demoProcSmall(); + break; + case 16: + if (cLib_addCalc(¤t.pos.y, home.pos.y + 6000.0f, 0.5f, 100.0f, 5.0f) < 5.0f) { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + break; + case 17: + break; + default: + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + } + + demoProcCom(); + return temp; } +static const int l_bck_ix_tbl[] = { + HR_BCK_H_WAIT01, + HR_BCK_R_WAIT01, + HR_BCK_R_WAIT02, + HR_BCK_LOOK, + HR_BCK_TALK01, + HR_BCK_TALK01, + HR_BCK_TALK01, + HR_BCK_TALK02, + HR_BCK_TALK02, + HR_BCK_TALK03, + HR_BCK_TALK03, + HR_BCK_DAMAGE, + HR_BCK_TALK03, +}; + +static const int l_btp_ix_tbl[] = { + HR_BTP_MABA_H, + HR_BTP_MABA_R01, + HR_BTP_MABA_R02, +}; + /* 0000232C-00002550 .text nodeCallBack_Hr__FP7J3DNodei */ -static BOOL nodeCallBack_Hr(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack_Hr(J3DNode* node, int calcTiming) { + cXyz temp; + cXyz temp2; + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + daNpc_Hr_c* i_this = (daNpc_Hr_c*)model->getUserArea(); + J3DJoint* joint = (J3DJoint*)node; + int jntNo = joint->getJntNo(); + + if(i_this != NULL) { + MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); + if (jntNo == i_this->getHeadJntNum()) { + cMtx_YrotM(*calc_mtx, -i_this->getHead_y()); + + s16 angle; + if (i_this->mAnmIdx != 1 && i_this->mAnmIdx != 9 && i_this->mAnmIdx != 10) { + angle = i_this->getHead_x(); + } else { + angle = 0; + } + cLib_addCalcAngleS(&i_this->mHeadRotation, angle, 8, 0x400, 0x100); + cMtx_ZrotM(*calc_mtx, -i_this->mHeadRotation); + temp.set(0.0f, 0.0f, 0.0f); + MtxPosition(&temp, &temp2); + + i_this->setAttentionBasePos(temp2); + temp.set(20.0f, -20.0f, 0.0f); + + MtxPosition(&temp, &temp2); + + i_this->setEyePos(temp2); + i_this->incAttnSetCount(); + } else if (jntNo == i_this->getBackboneJntNum()) { + mDoMtx_XrotM(*calc_mtx, i_this->getBackbone_y()); + } else if (jntNo == i_this->m_waist_jnt_num) { + temp.set(0.0f, 0.0f, 0.0f); + MtxPosition(&temp, &i_this->mCloudPos); + } + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, *calc_mtx); + } + } + return TRUE; } /* 00002550-00002868 .text node_Ht_ant__10daNpc_Hr_cFi */ -void daNpc_Hr_c::node_Ht_ant(int) { - /* Nonmatching */ +void daNpc_Hr_c::node_Ht_ant(int jntNo) { + cXyz temp; + cXyz temp2; + cXyz temp3; + if (jntNo == 0) { + temp2.setall(0.0f); + MtxPosition(&temp2, &temp); + if (!chkFlag(HR_FLAG_00000800)) { + setFlag(HR_FLAG_00000800); + mPrevAntennaPos.set(temp); + mAntennaVelocity.setall(0.0f); + mAntennaOffset.setall(0.0f); + } + + temp3 = mPrevAntennaPos - temp; + + if (scale.x >= 1.0f && scale.z >= 1.0f) { + temp3.x /= scale.x; + temp3.z /= scale.z; + } + + f32 temp4 = std::fabsf(temp3.z); + if (std::fabsf(temp3.x) > std::fabsf(temp3.z)) { + temp4 = std::fabsf(temp3.x); + } + + if (temp4 > 10.0f) { + f32 fac = 10.f / temp4; + temp3.x *= fac; + temp3.z *= fac; + } + + mAntennaVelocity.x *= 0.8f; + mAntennaVelocity.z *= 0.8f; + + mAntennaVelocity.x -= mAntennaOffset.x * 0.2f; + mAntennaVelocity.z -= mAntennaOffset.z * 0.2f; + + mAntennaVelocity.x += temp3.x; + mAntennaVelocity.z += temp3.z; + + mAntennaOffset.x += mAntennaVelocity.x; + mAntennaOffset.z += mAntennaVelocity.z; + + mAntennaRotation.x = mAntennaOffset.z * cM_ssin(current.angle.y) - mAntennaOffset.x * cM_scos(current.angle.y); + mAntennaRotation.z = mAntennaOffset.z * cM_scos(current.angle.y) + mAntennaOffset.x * cM_ssin(current.angle.y); + + mAntennaRotation.x *= 0.05f; + mAntennaRotation.z *= 0.05f; + + if (mAntennaRotation.x > 1.0f) { + mAntennaRotation.x = 1.0f; + } + + if (mAntennaRotation.z > 1.0f) { + mAntennaRotation.z = 1.0f; + } + + mPrevAntennaPos.set(temp); + + } else { + cMtx_YrotM(*calc_mtx, mAntennaRotation.x * 3000.0f); + cMtx_ZrotM(*calc_mtx, mAntennaRotation.z * 3000.0f); + } } /* 00002868-00002918 .text nodeCallBack_Ht_ant__FP7J3DNodei */ -static BOOL nodeCallBack_Ht_ant(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack_Ht_ant(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + daNpc_Hr_c* i_this = (daNpc_Hr_c*)model->getUserArea(); + J3DJoint* joint = (J3DJoint*)node; + int jntNo = joint->getJntNo(); + + if (i_this != NULL) { + MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); + i_this->node_Ht_ant(jntNo); + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, *calc_mtx); + } + } + return TRUE; } /* 00002918-00002A28 .text initTexPatternAnm__10daNpc_Hr_cFb */ -void daNpc_Hr_c::initTexPatternAnm(bool) { - /* Nonmatching */ +BOOL daNpc_Hr_c::initTexPatternAnm(bool i_modify) { + J3DModelData* modelData = mpHrMorf->getModel()->getModelData(); + + m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Hr", l_btp_ix_tbl[mTexPatternIdx]); + JUT_ASSERT(DEMO_SELECT(1768, 1784), m_head_tex_pattern != NULL); + + if (!mBtpAnm.init(modelData, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, i_modify, FALSE)) { + return FALSE; + } + + mBlinkFrame = 0; + mBlinkTimer = 0; + return TRUE; } /* 00002A28-00002AB4 .text playTexPatternAnm__10daNpc_Hr_cFv */ void daNpc_Hr_c::playTexPatternAnm() { - /* Nonmatching */ + if (cLib_calcTimer(&mBlinkTimer) == 0) { + if (mBlinkFrame >= m_head_tex_pattern->getFrameMax()) { + mBlinkFrame -= m_head_tex_pattern->getFrameMax(); + mBlinkTimer = cM_rndF(100.0f) + 30.0f; + } else { + mBlinkFrame++; + } + } } /* 00002AB4-00002AF0 .text setTexPtn__10daNpc_Hr_cFSc */ -void daNpc_Hr_c::setTexPtn(signed char) { - /* Nonmatching */ +void daNpc_Hr_c::setTexPtn(s8 param_1) { + if (param_1 != mTexPatternIdx) { + mTexPatternIdx = param_1; + initTexPatternAnm(true); + } } /* 00002AF0-00002BB0 .text setAnm__10daNpc_Hr_cFSc */ -void daNpc_Hr_c::setAnm(signed char) { - /* Nonmatching */ +void daNpc_Hr_c::setAnm(s8 anmIdx) { + f32 morf = 8.0f; + if (mAnmIdx == 3 || anmIdx == 3) { + morf = 18.0f; + } + + if (mAnmIdx == -1) { + morf = 0.0f; + } + + if (anmIdx != mAnmIdx && anmIdx != -1) { + mAnmIdx = anmIdx; + mAnmTimer = 0.0f; + + dNpc_setAnm(mpHrMorf, J3DFrameCtrl::EMode_NULL, morf, 1.0f, l_bck_ix_tbl[mAnmIdx], -1, "Hr"); + mAnmLoopCount = 0; + } } /* 00002BB0-00002C1C .text setAnmStatus__10daNpc_Hr_cFv */ void daNpc_Hr_c::setAnmStatus() { - /* Nonmatching */ + switch(mState) { + case HR_STATE_RT_ANGRY: + setAnm(2); + break; + default: + if (getShapeType() == 1) { + setAnm(1); + } else { + setAnm(0); + } + break; + } } /* 00002C1C-00002C94 .text eventOrder__10daNpc_Hr_cFv */ void daNpc_Hr_c::eventOrder() { - /* Nonmatching */ + if (ChkOrder(1)) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + } + if (ChkOrder(2)) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + fopAcM_orderSpeakEvent(this); + } + if (ChkOrder(4)) { + eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); + } } /* 00002C94-00002D3C .text checkOrder__10daNpc_Hr_cFv */ void daNpc_Hr_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.mCommand != dEvtCmd_INDEMO_e) { + if (eventInfo.mCommand == dEvtCmd_INTALK_e && ChkOrder(7)) { + if (dComIfGp_event_chkTalkXY()) { + setFlag(HR_FLAG_00000008); + } else { + setFlag(HR_FLAG_00000001); + } + talkInit(); + } + } + ClrOrder(); } /* 00002D3C-00002D88 .text next_msgStatus__10daNpc_Hr_cFPUl */ -void daNpc_Hr_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Hr_c::next_msgStatus(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + + switch (*pMsgNo) { + case 0x1906: + case 0x1933: + case 0x1934: + case 0x1938: + (*pMsgNo)++; + break; + + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + + return msgStatus; } /* 00002D88-00002E5C .text getMsg__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Hr_c::getMsg() { + u32 msgNo = 0; + switch (mState) { + case 7: + case 10: + case 3: + msgNo = mMsgNo; + switch(msgNo) { + case 0x5B3: + if (mType == 0) { + dComIfGs_onSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + dComIfGp_setMelodyNum(0); + } else { + dComIfGp_setMelodyNum(1); + } + break; + } + break; + case 2: + msgNo = 0x1901; + break; + } + return msgNo; } /* 00002E5C-00002F88 .text setCollision__10daNpc_Hr_cFv */ void daNpc_Hr_c::setCollision() { - /* Nonmatching */ + cXyz temp = current.pos; + f32 temp1 = scale.x * 45.0f; + f32 temp2 = scale.y * 100.0f; + mCyl.SetC(temp); + mCyl.SetR(temp1); + mCyl.SetH(temp2); + dComIfG_Ccsp()->Set(&mCyl); + + if (mType == 1) { + temp.y += scale.y * -30.0f; + temp1 = scale.x * 80.0f; + temp2 = scale.y * 35.0f; + mCyl2.SetC(temp); + mCyl2.SetR(temp1); + mCyl2.SetH(temp2); + dComIfG_Ccsp()->Set(&mCyl2); + } } /* 00002F88-00002FC0 .text nextAnm__10daNpc_Hr_cFSci */ -void daNpc_Hr_c::nextAnm(signed char, int) { - /* Nonmatching */ +void daNpc_Hr_c::nextAnm(s8 i_nextAnm, int loopCount) { + if (mAnmLoopCount < loopCount) { + mAnmLoopCount++; + } else { + setAnm(i_nextAnm); + } } /* 00002FC0-0000300C .text msgAnm__10daNpc_Hr_cFUc */ -void daNpc_Hr_c::msgAnm(unsigned char) { - /* Nonmatching */ +void daNpc_Hr_c::msgAnm(u8 param_1) { + static s8 msg_anm_table[] = { + 0, 1, 3, 4, 7, 5, 9, 8, 6 + }; + + if (mMsgAnmIdx != param_1) { + mMsgAnmIdx = param_1; + if (mMsgAnmIdx < 9) { + setAnm(msg_anm_table[mMsgAnmIdx]); + } + } } /* 0000300C-00003020 .text talkInit__10daNpc_Hr_cFv */ void daNpc_Hr_c::talkInit() { - /* Nonmatching */ + mTalkState = TALK_INIT; + mMsgAnmIdx = 0xFF; } /* 00003020-000031AC .text talk__10daNpc_Hr_cFv */ -void daNpc_Hr_c::talk() { - /* Nonmatching */ +u16 daNpc_Hr_c::talk() { + u16 msgStatus = 0xFF; + if (mTalkState == TALK_INIT) { + l_msgId = fpcM_ERROR_PROCESS_ID_e; + mCurrMsgNo = getMsg(); + mTalkState = TALK_MSG_CREATE; + } else if (mTalkState != TALK_FINISHED) { + if(l_msgId == fpcM_ERROR_PROCESS_ID_e) { + cXyz temp(current.pos); + temp.y += 100.0f; + l_msgId = fopMsgM_messageSet(mCurrMsgNo, &temp); + } else { + msgAnm(dComIfGp_getMesgAnimeAttrInfo()); + switch(mTalkState) { + case TALK_MSG_CREATE: + l_msg = fopMsgM_SearchByID(l_msgId); + if (l_msg != NULL) { + mTalkState = TALK_ACTIVE; + } + break; + case TALK_ACTIVE: + msgStatus = l_msg->mStatus; + if(msgStatus == fopMsgStts_MSG_DISPLAYED_e) { + l_msg->mStatus = next_msgStatus(&mCurrMsgNo); + if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(mCurrMsgNo); + } + } else if(msgStatus == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + mTalkState = TALK_FINISHED; + } + break; + } + } + } + + return msgStatus; } /* 000031AC-00003410 .text init__10daNpc_Hr_cFv */ -void daNpc_Hr_c::init() { - /* Nonmatching */ +BOOL daNpc_Hr_c::init() { + if(setAction(&daNpc_Hr_c::wait_action, NULL)) { + mCloudPos = current.pos; + } + + switch(mType) { + case 1: + +#if VERSION == VERSION_DEMO + offHide(1); +#else + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2710)) { + onHide(1); + } else { + offHide(1); + } +#endif + dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0404); + break; + default: + onHide(1); + attention_info.flags = fopAc_Attn_ACTION_SPEAK_e|fopAc_Attn_TALKFLAG_CHECK_e; + attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0x5B; + break; + } + + J3DModel* model = mpHrMorf->getModel(); + model->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mpHrMorf->calc(); + + mStts.Init(0xFE, 0xFF, this); + mStts2.Init(0xFE, 0xFF, this); + + switch(mType) { + case 1: + mCyl.Set(dNpc_hr_src); + mCyl2.Set(dNpc_hr_src); + break; + default: + mCyl.Set(dNpc_cyl_src); + eventInfo.setEventName("HT_TALK"); + break; + } + + mCyl.SetStts(&mStts); + mCyl2.SetStts(&mStts2); + defaultSetPos(¤t.pos); + mClothes.init(); + return TRUE; } /* 00003410-00003484 .text setAttention__10daNpc_Hr_cFb */ -void daNpc_Hr_c::setAttention(bool) { - /* Nonmatching */ +void daNpc_Hr_c::setAttention(bool param_1) { + if (chkFlag(HR_FLAG_00000010) || chkFlag(HR_FLAG_00000100)) { + return; + } + + if (!param_1 && mAttnSetCount >= 2) { + return; + } + + eyePos.set(mEyePos.x, mEyePos.y, mEyePos.z); + attention_info.position.set(mAttnBasePos.x, mAttnBasePos.y + 50.0f, mAttnBasePos.z); } /* 00003484-00003520 .text getNowJointY__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getNowJointY() { - /* Nonmatching */ +int daNpc_Hr_c::getNowJointY() { + daTornado_c* tornadoActor = (daTornado_c*)fopAcM_SearchByID(mProcId); + + int i = 0; + while (i < 10) { + f32 jointY = tornadoActor->getJointYPos(i); + if (current.pos.y + speed.y < jointY) { + return i; + } + i++; + } + return i; } /* 00003520-00003730 .text getTornadoPos__10daNpc_Hr_cFiP4cXyz */ -void daNpc_Hr_c::getTornadoPos(int, cXyz*) { - /* Nonmatching */ +void daNpc_Hr_c::getTornadoPos(int jointY, cXyz* tornadoPos) { + daTornado_c* tornadoActor = (daTornado_c*)fopAcM_SearchByID(mProcId); + cXyz pos1; + cXyz pos2; + + if(tornadoActor != NULL) { + if(jointY == 0) { + tornadoPos->set(tornadoActor->current.pos); + return; + } else { + f32 temp = current.pos.y + speed.y; + tornadoPos->y = temp; + if (jointY == 10) { + tornadoPos->x = tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(10)[0][3] : tornadoActor->current.pos.x; + tornadoPos->z = tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(10)[2][3] : tornadoActor->current.pos.z; + } else { + pos1.set( + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY -1)[0][3] : tornadoActor->current.pos.x, + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY -1)[1][3] : tornadoActor->current.pos.y, + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY -1)[2][3] : tornadoActor->current.pos.z + ); + + pos2.set( + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY)[0][3] : tornadoActor->current.pos.x, + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY)[1][3] : tornadoActor->current.pos.y, + tornadoActor->mpModel != NULL ? tornadoActor->mpModel->getAnmMtx(jointY)[2][3] : tornadoActor->current.pos.z + ); + + f32 ratio = (temp - pos1.y) / (pos2.y - pos1.y); + tornadoPos->x = ratio * pos2.x + (1.0f - ratio) * pos1.x; + tornadoPos->z = ratio * pos2.z + (1.0f - ratio) * pos1.z; + } + } + } } /* 00003730-00003818 .text rideTornado__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rideTornado() { - /* Nonmatching */ +bool daNpc_Hr_c::rideTornado() { + cXyz tornadoPos; + fopAc_ac_c* actor = fopAcM_SearchByID(mProcId); + if (actor == NULL) { + speed.x *= 0.95f; + speed.y = 0.0f; + speed.z *= 0.95f; + return false; + } else { + getTornadoPos(getNowJointY(), &tornadoPos); + speed.x = speed.x * 0.2f + (tornadoPos.x - current.pos.x) * 0.8f; + speed.z = speed.z * 0.2f + (tornadoPos.z - current.pos.z) * 0.8f; + } + return true; } /* 00003818-00003848 .text getLookBackMode__10daNpc_Hr_cFv */ -void daNpc_Hr_c::getLookBackMode() { - /* Nonmatching */ +u8 daNpc_Hr_c::getLookBackMode() { + if (chkFlag(HR_FLAG_00000080)) { + return 0; + } + if (chkFlag(HR_FLAG_00000040)) { + return 1; + } + return 0xff; + } /* 00003848-000039D0 .text lookBack__10daNpc_Hr_cFv */ void daNpc_Hr_c::lookBack() { - /* Nonmatching */ + cXyz temp2; + cXyz temp(0.0f, 0.0f, 0.0f); + cXyz* dstPos = NULL; + s16 desiredYRot = current.angle.y; + bool headOnlyFollow = false; + switch(getLookBackMode()) { + case 0: + m_jnt.setTrn(); + temp2 = dNpc_playerEyePos(-20.0f); + dstPos = &temp2; + temp.set(current.pos); + temp.y = eyePos.y; + break; + case 1: + temp2 = dNpc_playerEyePos(-20.0f); + dstPos = &temp2; + temp.set(current.pos); + temp.y = eyePos.y; + headOnlyFollow = true; + break; + default: + desiredYRot = current.angle.y; + headOnlyFollow = true; + break; + } + + + if (m_jnt.trnChk()) { + cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, 0x800, 4, 0x800); + } else { + mMaxHeadTurnVelocity = 0; + } + m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp, desiredYRot, mMaxHeadTurnVelocity, headOnlyFollow); + } /* 000039D0-00003B44 .text rt_search__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_search() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_search() { + daNpc_Hr_c* ac = (daNpc_Hr_c*)fopAcM_searchFromName("Ytrnd00", 0, 0); + if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2710)) { + return true; + } + + if(ac != NULL) { + mProcId = fopAcM_GetID(ac); + mState = HR_STATE_RT_HIDE; + mHitCount = 0; + current.pos.y = home.pos.y - 1500.0f; + scale.setall(11.0f); + speed.setall(0.0f); + + JPABaseEmitter* pEmitter = DEMO_SELECT(mpEmitter, mSmokeCallBack.getEmitter()); + + if(pEmitter != NULL) { + pEmitter->setGlobalScale(scale); + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3D01)) { + mEventIdx = dComIfGp_evmng_getEventIdx("INTRO_RT"); + } else { + mEventIdx = dComIfGp_evmng_getEventIdx("INTRO_RT_F"); + } + mMoveTimer = 0x14; + } + return false; + } /* 00003B44-00003CEC .text rt_hide__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_hide() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_hide() { + daShip_c* pShip = dComIfGp_getShipActor(); + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + current.angle.y = fopAcM_searchActorAngleY(this, pLink); + cXyz tornadoPos; + getTornadoPos(0, &tornadoPos); + current.pos = tornadoPos; + current.pos.y -= 1500.0f; + if(eventInfo.mCommand == dEvtCmd_INDEMO_e) { + mReturnState = 8; + mState = HR_STATE_RT_INTRO; + mStaffIdx = dComIfGp_evmng_getMyStaffId("Hr2"); + setEvFlag(EVFLAG_TORNADO_ACTIVE); + demoProc(); + mDoAud_seStart(JA_SE_CV_RC_ENTER); + mDoAud_bgmAllMute(90); + dComIfGs_onEventBit(dSv_event_flag_c::UNK_3D01); + } else if (pShip != NULL && pShip->checkTornadoFlg()) { + if (mMoveTimer > 0) { + mMoveTimer--; + } else { + fopAcM_orderOtherEventId(this, mEventIdx); + dComIfGs_onTmpBit(dSv_event_tmp_flag_c::UNK_0404); + } + } + return true; } /* 00003CEC-00003D0C .text rt_intro__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_intro() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_intro() { + rt_hit1(); } /* 00003D0C-00003DD8 .text to_rt_hit__10daNpc_Hr_cFv */ void daNpc_Hr_c::to_rt_hit() { - /* Nonmatching */ + mDoAud_seStart(JA_SE_CV_RC_DAMAGE); + mDoAud_seStart(JA_SE_CV_RC_MODAE_1); + setAnm(11); + setTexPtn(1); + setFlag(HR_FLAG_00000400); + mHitDelayTimer = 0x52; } /* 00003DD8-00003EE4 .text to_rt_tact__10daNpc_Hr_cFv */ void daNpc_Hr_c::to_rt_tact() { - /* Nonmatching */ + mDoAud_seStart(JA_SE_CV_RC_DAMAGE); + mDoAud_seStart(JA_SE_CV_RC_MODAE_2); + + mEventIdx = dComIfGp_evmng_getEventIdx("TACT0_RT"); + mReturnState = mState; + mState = HR_STATE_RT_HIT_0; + fopAcM_orderOtherEventId(this, mEventIdx); + mHitDelayTimer = 0x52; + mDoAud_subBgmStop(); } /* 00003EE4-000041D8 .text rt_angry__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_angry() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_angry() { + cXyz* hitPos; + + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + + current.angle.x += 0x100; + f32 currentY = current.pos.y; + speed.y = home.pos.y + 6000.0f + (1.0f - cM_scos(current.angle.x)) * 1000.0f - currentY; + scale.setall(11.0f); + current.angle.y = fopAcM_searchActorAngleY(this, daPy_getPlayerLinkActorClass()); + + JPABaseEmitter* pEmitter = DEMO_SELECT(mpEmitter, mSmokeCallBack.getEmitter()); + + if(pEmitter != NULL) { + pEmitter->setGlobalScale(scale); + } + + rideTornado(); + cCcD_Obj* hitObj = NULL; + if (mCyl2.ChkTgHit()) { + hitObj = mCyl2.GetTgHitObj(); + hitPos = mCyl2.GetTgHitPosP(); + } else { + if (mCyl.ChkTgHit()) { + hitObj = mCyl.GetTgHitObj(); + hitPos = mCyl.GetTgHitPosP(); + } + } + daShip_c* pShip = dComIfGp_getShipActor(); + + if (pShip->checkTornadoUp()) { + mState = HR_STATE_RT_WIN; + fopAcM_OnStatus(this, fopAcStts_UNK800_e); + + setAnm(12); + mDoAud_seStart(JA_SE_CV_RC_ENTER); + return true; + } else if (mHitDelayTimer != 0) { + return true; + + } else { + if (chkFlag(HR_FLAG_00000400)) { + clrFlag(HR_FLAG_00000400); + setAnm(2); + setTexPtn(2); + } + + if (hitObj != NULL && ((hitObj->GetAtType() & AT_TYPE_NORMAL_ARROW) != 0 || (hitObj->GetAtType() & AT_TYPE_FIRE_ARROW) != 0 || (hitObj->GetAtType() & AT_TYPE_ICE_ARROW) != 0 || (hitObj->GetAtType() & AT_TYPE_LIGHT_ARROW) != 0)) { + cXyz scale(11.0f, 11.0f, 11.0f); + cXyz temp = *hitPos - pLink->eyePos; + if(!temp.isZero()) { + temp.normalize(); + csXyz temp2; + cM3d_CalcVecZAngle(temp, &temp2); + dComIfGp_particle_set(dPa_name::ID_AK_JN_OK, hitPos, &temp2, &scale); + } + mHitCount++; + if(mHitCount >= 3) { + to_rt_tact(); + } else { + to_rt_hit(); + } + } + + } + return true; } /* 000041D8-00004208 .text rt_win__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_win() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_win() { + speed.y = 0.0f; + rideTornado(); + return true; } /* 00004208-00004328 .text rt_hit0__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_hit0() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_hit0() { + daShip_c* pShip = dComIfGp_getShipActor(); + + if(eventInfo.mCommand == dEvtCmd_INDEMO_e) { + mState = HR_STATE_RT_HIT_1; + mStaffIdx = dComIfGp_evmng_getMyStaffId("Hr2"); + setEvFlag(EVFLAG_TORNADO_ACTIVE); + demoProc(); + } else if (pShip->checkTornadoUp()) { + mState = HR_STATE_RT_WIN; + fopAcM_OnStatus(this, fopAcStts_UNK800_e); + setAnm(12); + mDoAud_seStart(JA_SE_CV_RC_ENTER); + + } else { + fopAcM_orderOtherEventId(this, mEventIdx); + } + + speed.y = 0.0f; + rideTornado(); + return true; } /* 00004328-000043D8 .text rt_hit1__10daNpc_Hr_cFv */ -void daNpc_Hr_c::rt_hit1() { - /* Nonmatching */ +bool daNpc_Hr_c::rt_hit1() { + if(chkEvFlag(EVFLAG_TORNADO_ACTIVE)) { + rideTornado(); + } + + if(dComIfGp_evmng_endCheck(mEventIdx)) { + if(mReturnState == 1) { + onHide(0); + } + if(mState == HR_STATE_RT_INTRO) { + mDoAud_subBgmStart(JA_BGM_DIOCTA_BATTLE); + } + endTalk(); + return false; + } + + demoProc(); + return true; } /* 000043D8-0000456C .text ht_hide__10daNpc_Hr_cFv */ -void daNpc_Hr_c::ht_hide() { - /* Nonmatching */ +bool daNpc_Hr_c::ht_hide() { + if (chkFlag(HR_FLAG_00000008)) { + fopAcM_seStart(this, JA_SE_PRE_TAKT, 0); + mReturnState = mState; + mState = HR_STATE_HT_TACT; + setAnmStatus(); + mStaffIdx = dComIfGp_evmng_getMyStaffId("Hr"); + demoProc(); + dComIfGs_onSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + dComIfGp_event_onHindFlag(-1); + + } else if (chkFlag(HR_FLAG_00000001)) { + mReturnState = mState; + mState = HR_STATE_TALK; + setAnmStatus(); + daPy_getPlayerLinkActorClass()->onPlayerNoDraw(); + + } else { + if (fopAcM_seenActorAngleY(daPy_getPlayerLinkActorClass(), this) < 0x2AAA) { + SetOrder(1); + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2708)) { + SetOrder(4); + } + } + } + return true; } /* 0000456C-000045F0 .text wait01__10daNpc_Hr_cFv */ -void daNpc_Hr_c::wait01() { - /* Nonmatching */ +bool daNpc_Hr_c::wait01() { + if (chkFlag(HR_FLAG_00000001)) { + mReturnState = mState; + mState = HR_STATE_TALK; + setAnmStatus(); + } else { + SetOrder(1); + } + return mpHrMorf->isMorf(); } /* 000045F0-000045F8 .text wait02__10daNpc_Hr_cFv */ -void daNpc_Hr_c::wait02() { - /* Nonmatching */ +bool daNpc_Hr_c::wait02() { + return TRUE; } /* 000045F8-00004658 .text endTalk__10daNpc_Hr_cFv */ void daNpc_Hr_c::endTalk() { - /* Nonmatching */ + mState = mReturnState; + setAnmStatus(); + dComIfGp_event_reset(); + clrFlag(HR_FLAG_00000008|HR_FLAG_00000001); + field_0x60A = 5; } /* 00004658-000046F4 .text endTact__10daNpc_Hr_cFv */ void daNpc_Hr_c::endTact() { - /* Nonmatching */ + onHide(0); + defaultSetPos(&home.pos); + current.angle.y = home.angle.y; + shape_angle.y = home.angle.y; + speed.setall(0.0f); + speedF = 0.0f; + if (mType == 0) { + dComIfGs_offSwitch(getSwbit(), fopAcM_GetRoomNo(this)); + } } /* 000046F4-000047F4 .text setEmitFlash__10daNpc_Hr_cFf */ -void daNpc_Hr_c::setEmitFlash(float) { - /* Nonmatching */ +void daNpc_Hr_c::setEmitFlash(f32 param_1) { + if(param_1 > 1.0f) { + param_1 = 1.0f; + } + + if(param_1 < 0.0f) { + param_1 = 0.0f; + } + +#if VERSION == VERSION_DEMO + mpEmitter->setGlobalPrmColor(param_1 * 104.0f + 151.0f, param_1 * 137.0f + 118.0f, param_1 * 86.0f + 169.0f); + mpEmitter->setGlobalEnvColor(param_1 * 123.0f + 132.0f, param_1 * 143.0f + 112.0f, param_1 * 33.0f + 147.0f); +#else + JPABaseEmitter* pEmitter = mSmokeCallBack.getEmitter(); + if(pEmitter != NULL) { + pEmitter->setGlobalPrmColor(param_1 * 104.0f + 151.0f, param_1 * 137.0f + 118.0f, param_1 * 86.0f + 169.0f); + pEmitter->setGlobalEnvColor(param_1 * 123.0f + 132.0f, param_1 * 143.0f + 112.0f, param_1 * 33.0f + 147.0f); + } +#endif + } /* 000047F4-000049B8 .text smokeProc__10daNpc_Hr_cFv */ void daNpc_Hr_c::smokeProc() { - /* Nonmatching */ +#if VERSION > VERSION_DEMO + JPABaseEmitter* pEmitter = mSmokeCallBack.getEmitter(); +#endif + + if(!chkFlag(HR_FLAG_00000010) && DEMO_SELECT(mpEmitter, pEmitter) != NULL && mType == 1 && mHitDelayTimer != 0) { + mHitDelayTimer--; + if(mHitDelayTimer >= 0x50) { + DEMO_SELECT(mpEmitter, pEmitter)->setGlobalPrmColor(0x7F, 0x5E, 0x91); + DEMO_SELECT(mpEmitter, pEmitter)->setGlobalEnvColor(0x6C, 0x58, 0x7B); + } else { + if(mHitDelayTimer > 0xF) { + int temp = (mHitDelayTimer - 0x10); + setEmitFlash((temp % 8) / 7.0f); + } else { + setEmitFlash(mHitDelayTimer / 15.0f); + + } + } + + if(mHitDelayTimer < 0x50) { + if(mHitDelayTimer > 0xf) { + f32 ratio = (mHitDelayTimer - 0xf) / 65.0f; + dKy_actor_addcol_set(0x80, 0x80, 0x5A, ratio); + dKy_vrbox_addcol_set(0x80, 0x80, 0x5A, ratio); + } else { + dKy_actor_addcol_set(0x80, 0x80, 0x5A, 0.0f); + dKy_vrbox_addcol_set(0x80, 0x80, 0x5A, 0.0f); + + } + } + } } /* 000049B8-00004A38 .text talk01__10daNpc_Hr_cFv */ -void daNpc_Hr_c::talk01() { - /* Nonmatching */ +bool daNpc_Hr_c::talk01() { + if (talk() == fopMsgStts_BOX_CLOSED_e) { + endTalk(); + daPy_getPlayerLinkActorClass()->offPlayerNoDraw(); + } + return mpHrMorf->isMorf(); } /* 00004A38-00004AEC .text ht_tact01__10daNpc_Hr_cFv */ -void daNpc_Hr_c::ht_tact01() { - /* Nonmatching */ +bool daNpc_Hr_c::ht_tact01() { + if(dComIfGp_evmng_endCheck(mEventIdx)) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2708)) { + dScnKy_env_light_c& env_light = g_env_light; + env_light.mWind.mWindVec.set(1.0f, 0.0f, 0.0f); // fake? + dKyw_tact_wind_set(0, 0); + dKyw_tact_wind_set_go(); + } + endTalk(); + endTact(); + return false; + } + + return demoProc(); } /* 00004AEC-00004CB4 .text wait_action__10daNpc_Hr_cFPv */ -void daNpc_Hr_c::wait_action(void*) { - /* Nonmatching */ +BOOL daNpc_Hr_c::wait_action(void*) { + if(mActionStatus == ACTION_STARTING) { + switch(mType) { + case 0: + mState = HR_STATE_HT_HIDE; + eventInfo.setXyCheckCB(&daNpc_hr_XyCheckCB); + eventInfo.setXyEventCB(&daNpc_hr_XyEventCB); + break; + case 1: +#if VERSION == VERSION_DEMO + mState = HR_STATE_RT_SEARCH; +#else + if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2710)) { + mState = HR_STATE_WAIT_02; + } else { + mState = HR_STATE_RT_SEARCH; + } +#endif + break; + default: + mState = HR_STATE_WAIT_01; + break; + } + setAnmStatus(); + mActionStatus++; // set to ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + clrFlag(HR_FLAG_00000100|HR_FLAG_00000080|HR_FLAG_00000040); + bool temp; + switch (mState) { + case HR_STATE_WAIT_01: + temp = wait01(); + break; + case HR_STATE_WAIT_02: + temp = wait02(); + break; + case HR_STATE_TALK: + temp = talk01(); + break; + case HR_STATE_HT_TACT: + temp = ht_tact01(); + break; + case HR_STATE_RT_SEARCH: + temp = rt_search(); + break; + case HR_STATE_RT_HIDE: + temp = rt_hide(); + break; + case HR_STATE_RT_INTRO: + temp = rt_intro(); + break; + case HR_STATE_RT_ANGRY: + temp = rt_angry(); + break; + case HR_STATE_RT_WIN: + temp = rt_win(); + break; + case HR_STATE_RT_HIT_0: + temp = rt_hit0(); + break; + case HR_STATE_RT_HIT_1: + temp = rt_hit1(); + break; + case HR_STATE_HT_HIDE: + temp = ht_hide(); + break; + default: + temp = false; + break; + } + lookBack(); + setAttention(temp); + smokeProc(); + } + return TRUE; } /* 00004CB4-00004E6C .text _draw__10daNpc_Hr_cFv */ BOOL daNpc_Hr_c::_draw() { - /* Nonmatching */ + J3DModel* hrModel = mpHrMorf->getModel(); + J3DModelData* modelData = hrModel->getModelData(); + J3DModel* antennaModel = mpAntennaMorf->getModel(); + if(chkFlag(HR_FLAG_00000010)) { + return FALSE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(hrModel, &tevStr); + g_env_light.setLightTevColorType(mpBrowModel, &tevStr); + g_env_light.setLightTevColorType(antennaModel, &tevStr); + mBtpAnm.entry(modelData, mBlinkFrame); + + if(getShapeType() == 1) { + J3DMaterialTable* bmt = (J3DMaterialTable*)dComIfG_getObjectRes("Hr", HR_BMT_R_BODY); + modelData->setMaterialTable(bmt, J3DMatCopyFlag_Texture); + mpHrMorf->entryDL(bmt); + } else { + mpHrMorf->entryDL(); + } + + mpBrowModel->setBaseTRMtx(hrModel->getAnmMtx(getHeadJntNum())); + mDoExt_modelUpdateDL(mpBrowModel); + antennaModel->setBaseTRMtx(hrModel->getAnmMtx(getHeadJntNum())); + mpAntennaMorf->updateDL(); + mBtpAnm.remove(modelData); + if (getShapeType() == 1 && mState == HR_STATE_RT_ANGRY) { + dSnap_RegistFig(DSNAP_TYPE_HR, this, 1.0f, 1.0f, 1.0f); + } + + return TRUE; } /* 00004E6C-000050FC .text _execute__10daNpc_Hr_cFv */ BOOL daNpc_Hr_c::_execute() { - /* Nonmatching */ + m_jnt.setParam( + /* mMaxBackboneX */ 0, + /* mMaxBackboneY */ 0x1C70, + /* mMinBackboneX */ 0, + /* mMinBackboneY */ -0x1C70, + /* mMaxHeadX */ 0x1FFE, + /* mMaxHeadY */ 9000, + /* mMinHeadX */ -0x1FFE, + /* mMinHeadY */ -9000, + /* mMaxTurnStep */ 0x1000 + ); + + playTexPatternAnm(); + + mAnmEnded = mpHrMorf->play(&eyePos, 0, 0); + if(mpHrMorf->getFrame() < mAnmTimer) { + mAnmEnded = 1; + } + mAnmTimer = mpHrMorf->getFrame(); + + if(mAnmEnded != 0) { + switch(mAnmIdx) { + case 3: + nextAnm(0, 2); + break; + case 4: + nextAnm(0, 3); + break; + case 5: + nextAnm(1, 3); + break; + case 8: + nextAnm(1, 3); + break; + case 9: + nextAnm(1, 3); + break; + case 10: + nextAnm(2, 2); + break; + case 2: + nextAnm(10,(int)(cM_rndF(4.0f) + 4.0f)); + break; + } + } + checkOrder(); + (this->*mCurrActionFunc)(NULL); + eventOrder(); + shape_angle.y = current.angle.y; + if (!chkFlag(HR_FLAG_00000020)) { + fopAcM_posMove(this, mStts.GetCCMoveP()); + } + + clrFlag(HR_FLAG_00000020); + tevStr.mRoomNo = current.roomNo; + J3DModel* hrModel = mpHrMorf->getModel(); + hrModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + hrModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpHrMorf->calc(); + if(chkFlag(HR_FLAG_00000010)) { + mCyl.ClrCoSet(); + } else { + if(mType != 1) { + mCyl.OnCoSetBit(); + } + setCollision(); + } + mClothes.proc(); + return TRUE; } /* 000050FC-00005188 .text _delete__10daNpc_Hr_cFv */ BOOL daNpc_Hr_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Hr"); + if(mpHrMorf != NULL) { + mpHrMorf->stopZelAnime(); + } + + mSmokeCallBack.end(); + if(mType == 1) { + dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0404); + } + + mClothes.remove(); + return TRUE; } /* 00005188-000051A8 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daNpc_Hr_c*)i_this)->CreateHeap(); } /* 000051A8-000052C4 .text _create__10daNpc_Hr_cFv */ cPhs_State daNpc_Hr_c::_create() { - /* Nonmatching */ + +#if VERSION > VERSION_DEMO + fopAcM_SetupActor(this, daNpc_Hr_c); +#endif + cPhs_State state = dComIfG_resLoad(&mPhs, "Hr"); + if (state == cPhs_COMPLEATE_e) { +#if VERSION == VERSION_DEMO + fopAcM_SetupActor(this, daNpc_Hr_c); +#endif + switch(fopAcM_GetName(this)) { + case PROC_NPC_HR: + switch (getShapeType()) { + case 1: + mType = 1; + break; + default: + mType = 0; + break; + } + break; + default: + return cPhs_ERROR_e; + } + + if (!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0xB7B0)) { +#if VERSION > VERSION_DEMO + mpHrMorf = NULL; +#endif + return cPhs_ERROR_e; + } + + cullMtx = mpHrMorf->getModel()->getBaseTRMtx(); + if (!init()) { +#if VERSION > VERSION_DEMO + mpHrMorf = NULL; +#endif + return cPhs_ERROR_e; + } + } + return state; } +daNpc_Hr_c::daNpc_Hr_c() {} + /* 000057E4-00005CE8 .text CreateHeap__10daNpc_Hr_cFv */ -void daNpc_Hr_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_Hr_c::CreateHeap() { + static int brow_bdl_table[] = { + HR_BDL_H_BROW, + HR_BDL_R_BROW + }; + + static int ant_bdl_table[] = { + HR_BDL_H_ANT, + HR_BDL_R_ANT + }; + + static u32 ant_bck_table[] = { + HR_BCK_H_ANT, + HR_BCK_R_ANT + }; + + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Hr", HR_BDL_HR); + JUT_ASSERT(DEMO_SELECT(3341, 3392), modelData); + + mpHrMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectRes("Hr", HR_BCK_H_WAIT01), + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x15021222 + ); + + if (mpHrMorf == NULL || mpHrMorf->getModel() == NULL) { + return FALSE; + } + + m_jnt.setHeadJntNum(modelData->getJointName()->getIndex("head")); + JUT_ASSERT(DEMO_SELECT(3363, 3414), m_jnt.getHeadJntNum() >= 0); + + m_jnt.setBackboneJntNum(modelData->getJointName()->getIndex("backbone1")); + JUT_ASSERT(DEMO_SELECT(3368, 3419), m_jnt.getBackboneJntNum() >= 0); + + m_waist_jnt_num = modelData->getJointName()->getIndex("waist"); + JUT_ASSERT(DEMO_SELECT(3372, 3423), m_waist_jnt_num >= 0); + + + J3DModelData* browModelData = (J3DModelData*)dComIfG_getObjectRes("Hr", brow_bdl_table[getShapeType()]); + JUT_ASSERT(DEMO_SELECT(3383, 3434), browModelData); + + mpBrowModel = mDoExt_J3DModel__create(browModelData, 0x80000, 0x11000022); + + if(mpBrowModel == NULL) { + return FALSE; + } + + J3DModelData* antModelData = (J3DModelData*)dComIfG_getObjectRes("Hr", ant_bdl_table[getShapeType()]); + JUT_ASSERT(DEMO_SELECT(3404, 3455), antModelData); + + mpAntennaMorf = new mDoExt_McaMorf( + antModelData, + NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectRes("Hr", ant_bck_table[getShapeType()]), + J3DFrameCtrl::EMode_NULL, 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x11000022 + ); + + if (mpAntennaMorf == NULL || mpAntennaMorf->getModel() == NULL) { + return FALSE; + } + + if(getShapeType() == 1) { + mTexPatternIdx = 2; + } else { + mTexPatternIdx = 0; + } + +#if VERSION == VERSION_DEMO + initTexPatternAnm(false); +#else + if(!initTexPatternAnm(false)) { + return FALSE; + } +#endif + + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == getHeadJntNum() || i == getBackboneJntNum() || i == m_waist_jnt_num) { + mpHrMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Hr); + } + } + + mpHrMorf->getModel()->setUserArea((u32)this); + + for(u16 i = 0; i < antModelData->getJointNum(); i++) { + mpAntennaMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Ht_ant); + } + mpAntennaMorf->getModel()->setUserArea((u32)this); + + return TRUE; } /* 00005CE8-00005D08 .text daNpc_Hr_Create__FP10fopAc_ac_c */