diff --git a/include/JAZelAudio/JAIZelBasic.h b/include/JAZelAudio/JAIZelBasic.h index 64e93fa09..e92163696 100644 --- a/include/JAZelAudio/JAIZelBasic.h +++ b/include/JAZelAudio/JAIZelBasic.h @@ -186,7 +186,8 @@ public: /* 0x0058 */ f32 field_0x0058; /* 0x005C */ f32 field_0x005c; /* 0x0060 */ u8 mbLandingDemoStarted; - /* 0x0061 */ u8 field_0x0061[0x0063 - 0x0061]; + /* 0x0061 */ u8 field_0x0061[0x0062 - 0x0061]; + /* 0x0062 */ u8 field_0x0062; /* 0x0063 */ u8 field_0x0063; /* 0x0064 */ u8 field_0x0064[0x0066 - 0x0064]; /* 0x0066 */ u8 field_0x0066; diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index f1465a9f8..414443df1 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -69,15 +69,17 @@ struct TVec3 { f32 y; f32 z; - // inline TVec3(const Vec& i_vec) { - // setTVec3f(&i_vec.x, &x); - // } + inline TVec3(const Vec& i_vec) { + setTVec3f(&i_vec.x, &x); + } - // inline TVec3(const TVec3& i_vec) { - // setTVec3f(&i_vec.x, &x); - // } + inline TVec3(const TVec3& i_vec) { + setTVec3f(&i_vec.x, &x); + } - // TVec3() {} + TVec3() {} + + TVec3(f32 x, f32 y, f32 z) { set(x, y, z); } operator Vec*() { return (Vec*)&x; } operator const Vec*() const { return (Vec*)&x; } diff --git a/include/SSystem/SComponent/c_bg_s_lin_chk.h b/include/SSystem/SComponent/c_bg_s_lin_chk.h index c690833f3..a71dd3357 100644 --- a/include/SSystem/SComponent/c_bg_s_lin_chk.h +++ b/include/SSystem/SComponent/c_bg_s_lin_chk.h @@ -32,6 +32,8 @@ public: void SetCross(const cXyz& pos) { mLin.SetEnd(pos); } cXyz& i_GetCross() { return mLin.GetEnd(); } cM3dGLin* GetLinP() { return &mLin; } + void OnBackFlag() { mBackFlag = true; } + void OffBackFlag() { mBackFlag = false; } bool ChkBackFlag() const { return mBackFlag; } bool ChkFrontFlag() const { return mFrontFlag; } bool GetPreWallChk() const { return mPreWallChk; } diff --git a/include/SSystem/SComponent/c_bg_s_poly_info.h b/include/SSystem/SComponent/c_bg_s_poly_info.h index 4ac08bc4d..e4106264e 100644 --- a/include/SSystem/SComponent/c_bg_s_poly_info.h +++ b/include/SSystem/SComponent/c_bg_s_poly_info.h @@ -22,7 +22,9 @@ public: mpBgW = NULL; mActorId = -1; } - void SetPolyInfo(const cBgS_PolyInfo&); + void SetPolyInfo(const cBgS_PolyInfo& other) { + *this = other; + } void SetActorInfo(int, void*, unsigned int); bool ChkSafe(const void*, unsigned int) const; void SetPolyIndex(int); diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index b4af704de..37ea1051e 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -329,7 +329,11 @@ public: void Init(int, int, void*, unsigned int); virtual void Ct(); void PlusCcMove(f32, f32, f32); - void ClrCcMove(); + void ClrCcMove() { + mXyz.z = 0.0f; + mXyz.y = 0.0f; + mXyz.x = 0.0f; + } void PlusDmg(int); f32 GetWeightF() const; virtual void ClrAt() {} diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index c963473d5..0a9d87d33 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -93,7 +93,7 @@ T cLib_getRndValue(T min, T range) { template T cLib_calcTimer(T* value) { - if ((s32)*value != 0) { + if (*value != (u16)0) { *value = *value - 1; } return *value; diff --git a/include/d/actor/d_a_npc_kamome.h b/include/d/actor/d_a_npc_kamome.h new file mode 100644 index 000000000..18e1c546c --- /dev/null +++ b/include/d/actor/d_a_npc_kamome.h @@ -0,0 +1,209 @@ +#ifndef D_A_NPC_KAMOME_H +#define D_A_NPC_KAMOME_H + +#include "d/actor/d_a_player_npc.h" +#include "d/d_bg_s_lin_chk.h" +#include "m_Do/m_Do_hostIO.h" + +class JORMContext; +class daNpc_kam_c; + +class daNpc_kam_HIO1_c { +public: + daNpc_kam_HIO1_c(); + virtual ~daNpc_kam_HIO1_c() {} + + void genMessage(JORMContext*); + +public: + /* 0x04 */ f32 mSpeedF; + /* 0x08 */ f32 mUnused08; + /* 0x0C */ f32 mFlappingSpeedF; + /* 0x10 */ f32 mAccelF; + /* 0x14 */ s16 mGlidingAngVelY; + /* 0x16 */ s16 mGlidingAngVelX; + /* 0x18 */ s16 mMaxAngleZ; + /* 0x1A */ s16 mFlappingAngVelY; + /* 0x1C */ s16 mFlappingAngVelX; + /* 0x1E */ s16 mAngVelStepScale; + /* 0x20 */ s16 mAngVelMaxStep; + /* 0x22 */ s16 mAngVelMinStep; + /* 0x24 */ s16 mFlapDuration; + /* 0x26 */ s16 mFlapExhaustedDuration; + /* 0x28 */ s16 mFlapEnergyDuration; + /* 0x2A */ u8 field_2A[0x2C - 0x2A]; +}; // Size: 0x2C + +class daNpc_kam_HIO_c : public JORReflexible { +public: + struct hio_prm_c { + // Note: Offsets are relative to daNpc_kam_HIO_c instead of hio_prm_c for convenience. + /* 0x08 */ f32 m08; + /* 0x0C */ f32 m0C; + /* 0x10 */ f32 m10; + /* 0x14 */ f32 m14; + /* 0x18 */ f32 m18; + /* 0x1C */ s16 m1C; + /* 0x1E */ u8 m1E; + }; // Size: 0x18 + + daNpc_kam_HIO_c(); + virtual ~daNpc_kam_HIO_c() {} + +public: + /* 0x04 */ s8 mChildID; + /* 0x08 */ hio_prm_c prm; + /* 0x20 */ daNpc_kam_c* mpActor; + /* 0x24 */ daNpc_kam_HIO1_c mHio1; +}; // Size: 0x50 + +class daNpc_kam_c : public daPy_npc_c { +public: + enum ActionStatus { + ACTION_STARTING = 0, + ACTION_ONGOING_1 = 1, + ACTION_ONGOING_2 = 2, + ACTION_ONGOING_3 = 3, + ACTION_ENDING = -1, + }; + + enum Animation { + ANM_WAIT1 = 0, + ANM_WAIT2 = 1, + ANM_SING = 2, + }; + + typedef int (daNpc_kam_c::*ActionFunc)(void*); + typedef void (daNpc_kam_c::*EventActionInitFunc)(int evtStaffId); + typedef BOOL (daNpc_kam_c::*EventActionFunc)(int evtStaffId); + + void offLineHit() { cLib_offBit(mHitFlags, 0x07UL); } + void onFrontLineHit() { cLib_onBit(mHitFlags, 0x01UL); } + u32 isFrontLineHit() { return cLib_checkBit(mHitFlags, 0x01UL); } + void onLeftLineHit() { cLib_onBit(mHitFlags, 0x02UL); } + u32 isLeftLineHit() { return cLib_checkBit(mHitFlags, 0x02UL); } + void onRightLineHit() { cLib_onBit(mHitFlags, 0x04UL); } + u32 isRightLineHit() { return cLib_checkBit(mHitFlags, 0x04UL); } + void onWaterHit() { cLib_onBit(mHitFlags, 0x08UL); } + void offWaterHit() { cLib_offBit(mHitFlags, 0x08UL); } + u32 isWaterHit() { return cLib_checkBit(mHitFlags, 0x08UL); } + void onNoBgCheck() { cLib_onBit(mHitFlags, 0x10UL); } + void offNoBgCheck() { cLib_offBit(mHitFlags, 0x10UL); } + u32 isNoBgCheck() { return cLib_checkBit(mHitFlags, 0x10UL); } + + void onHyoiKamome() { m_hyoi_kamome = true; } + void offHyoiKamome() { m_hyoi_kamome = false; } + + s16 XyCheckCB(int); + int callDemoStartCheck(); + s16 XyEventCB(int); + ~daNpc_kam_c(); + void setAttention(bool, int); + void setBaseMtx(); + BOOL createHeap(); + s32 create(); + daNpc_kam_c() {} + BOOL init(); + BOOL setAction(ActionFunc*, ActionFunc, void*); + void npcAction(void*); + void setNpcAction(ActionFunc, void*); + void playerAction(void*); + void setPlayerAction(ActionFunc, void*); + BOOL returnLinkCheck(); + BOOL changeAreaCheck(); + BOOL areaOutCheck(); + BOOL getStickAngY(s16*, s16*); + s16 getAngleX(); + int wallHitCheck(); + BOOL npcTurnCheck(s16*); + int waitNpcAction(void*); + BOOL keyProc(); + int waitPlayerAction(void*); + BOOL damagePlayerAction(void*); + void eventOrder(); + void checkOrder(); + BOOL checkCommandTalk(); + void returnLinkPlayer(); + BOOL eventProc(); + void eventEnd(); + BOOL actionDefault(int); + void initialWaitEvent(int); + BOOL actionWaitEvent(int); + void initialChangeEvent(int); + void initialDescendEvent(int); + BOOL actionDescendEvent(int); + void initialAreaOutTurn(int); + BOOL actionAreaOutTurn(int); + void setAnm(int); + void setCollision(); + void setLineBgCheck(); + void animationPlay(); + BOOL execute(); + BOOL draw(); + f32 getGroundY() { return mAcch.GetGroundH(); } + MtxP getLeftHandMatrix() { return mCullMtx; } + MtxP getRightHandMatrix() { return mCullMtx; } + f32 getBaseAnimeFrameRate() { return 1.0f; } + f32 getBaseAnimeFrame() { return 0.0f; } + void restartPoint(s16) {} + + static bool m_hyoi_kamome; + +public: + /* 0x4EC */ request_of_phase_process_class mPhs; + /* 0x4F4 */ mDoExt_McaMorf* mpMorf; + /* 0x4F8 */ dBgS_ObjAcch mAcch; + /* 0x6BC */ dBgS_AcchCir mAcchCirs[2]; + /* 0x73C */ dBgS_LinChk mLinChk; + /* 0x7A8 */ dCcD_Stts mStts; + /* 0x7E4 */ dCcD_Sph mAtSph; + /* 0x910 */ dCcD_Sph mTgSph; + /* 0xA3C */ dCcD_Cps mCps; + /* 0xB74 */ cXyz mDescendStartPos; + /* 0xB80 */ cXyz mDescendStartPosUnangled; + /* 0xB8C */ csXyz mDescendStartAngle; + /* 0xB92 */ u8 mB92[0xBA0 - 0xB92]; + /* 0xBA0 */ cBgS_PolyInfo mPolyInfo; + /* 0xBB0 */ ActionFunc mCurrNpcActionFunc; + /* 0xBBC */ ActionFunc mCurrPlayerActionFunc; + /* 0xBC8 */ u32 mShadowId; + /* 0xBCC */ u32 mHitFlags; + /* 0xBD0 */ u8 mBD0[0xBD4 - 0xBD0]; + /* 0xBD4 */ int mAnmIdx; + /* 0xBD8 */ f32 mMaxY; + /* 0xBDC */ f32 mMinY; + /* 0xBE0 */ f32 mPrevMorfFrame; + /* 0xBE4 */ f32 mTargetSpeedF; + /* 0xBE8 */ f32 mAccelF; + /* 0xBEC */ s16 mTargetAngleX; + /* 0xBEE */ s16 mLockAngleXTimer; + /* 0xBF0 */ s16 mAngVelY; + /* 0xBF2 */ s16 mAngVelX; + /* 0xBF4 */ s16 mTargetAngVelY; + /* 0xBF6 */ s16 mTargetAngVelX; + /* 0xBF8 */ s16 m_jnt_body; + /* 0xBFA */ s16 mFlapTimer; + /* 0xBFC */ s16 mFlapExhaustedTimer; + /* 0xBFE */ s16 mFlapEnergyTimer; + /* 0xC00 */ s8 mAnmTblIdx; + /* 0xC01 */ s8 mReachedAnimEnd; + /* 0xC02 */ s8 mEventState; + /* 0xC03 */ s8 mCurrEventIdxIdx; + /* 0xC04 */ u8 mC04[0xC05 - 0xC04]; + /* 0xC05 */ s8 mActionStatus; + /* 0xC06 */ u8 mUnusedC06; + /* 0xC07 */ u8 mC07[0xC08 - 0xC07]; + /* 0xC08 */ s16 mC08; + /* 0xC08 */ s16 mC0A; + /* 0xC08 */ s16 mC0C; + /* 0xC08 */ s16 mUnusedC0E; + /* 0xC10 */ u8 mC10[0xC14 - 0xC10]; + /* 0xC14 */ f32 mUnusedC14; + /* 0xC18 */ u8 mC18[0xC1C - 0xC18]; + /* 0xC1C */ s16 mWaitTimer; + /* 0xC1E */ s16 mAreaOutTimer; + /* 0xC20 */ s16 mEventIdxs[3]; + /* 0xC26 */ u8 field_C26[0xC28 - 0xC26]; +}; + +#endif /* D_A_NPC_KAMOME_H */ diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 7831c0fd1..9a96216e3 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -161,47 +161,48 @@ public: virtual MtxP getLeftHandMatrix() = 0; virtual MtxP getRightHandMatrix() = 0; - virtual void getGroundY() = 0; - virtual void getTactMusic() const; - virtual void getTactTimerCancel() const; - virtual BOOL checkPlayerGuard() const; - virtual void getGrabMissActor(); - virtual u32 checkPlayerFly() const; - virtual void checkFrontRoll() const; - virtual void checkBottleSwing() const; - virtual void checkCutCharge() const; - virtual void getBokoFlamePos(cXyz*); - virtual void checkTactWait() const; - virtual void setTactZev(unsigned int, int, char*); - virtual void onDekuSpReturnFlg(u8); - virtual void checkComboCutTurn() const; + virtual f32 getGroundY() = 0; + virtual int getTactMusic() const { return -1; } + virtual int getTactTimerCancel() const { return 0; } + virtual BOOL checkPlayerGuard() const { return FALSE; } + virtual fopAc_ac_c* getGrabMissActor() { return NULL; } + virtual BOOL checkPlayerFly() const { return FALSE; } + virtual BOOL checkFrontRoll() const { return FALSE; } + virtual BOOL checkBottleSwing() const { return FALSE; } + virtual BOOL checkCutCharge() const { return FALSE; } + virtual BOOL getBokoFlamePos(cXyz*) { return FALSE; } + virtual BOOL checkTactWait() const { return FALSE; } + virtual void setTactZev(unsigned int, int, char*) {} + virtual void onDekuSpReturnFlg(u8) {} + virtual bool checkComboCutTurn() const { return false; } virtual f32 getBaseAnimeFrameRate() = 0; - virtual void getBaseAnimeFrame() = 0; - virtual void getItemID() const; - virtual void getThrowBoomerangID() const; - virtual u32 getGrabActorID() const; - virtual void checkGrabBarrel(); - virtual void checkPlayerNoDraw(); - virtual void checkRopeTag(); - virtual void checkRopeReadyAnime() const; - virtual void voiceStart(u32); - virtual void setOutPower(f32, s16, int); - virtual void onFrollCrashFlg(u32); - virtual void getModelJointMtx(u16); - virtual void getOldSpeedY(); - virtual void setHookshotCarryOffset(unsigned int, const cXyz*); - virtual void setPlayerPosAndAngle(cXyz*, s16); - virtual void setPlayerPosAndAngle(cXyz*, csXyz*); - virtual void setPlayerPosAndAngle(MtxP); - virtual void setThrowDamage(cXyz*, s16, f32, f32, int); - virtual void changeTextureAnime(u16, u16, int); - virtual void cancelChangeTextureAnime(); + virtual f32 getBaseAnimeFrame() = 0; + virtual u32 getItemID() const { return -1; } + virtual u32 getThrowBoomerangID() const { return -1; } + virtual u32 getGrabActorID() const { return -1; } + virtual BOOL checkGrabBarrel() { return FALSE; } + virtual BOOL checkPlayerNoDraw() { return FALSE; } + virtual BOOL checkRopeTag() { return FALSE; } + virtual BOOL checkRopeReadyAnime() const { return FALSE; } + virtual void voiceStart(u32) {} + virtual void setOutPower(f32, s16, int) {} + virtual void onFrollCrashFlg(u32) {} + virtual MtxP getModelJointMtx(u16) { return NULL; } + virtual f32 getOldSpeedY() { return 0.0f; } + virtual BOOL setHookshotCarryOffset(unsigned int, const cXyz*) { return FALSE; } + virtual void setPlayerPosAndAngle(cXyz*, s16) {} + virtual void setPlayerPosAndAngle(cXyz*, csXyz*) {} + virtual void setPlayerPosAndAngle(MtxP) {} + virtual BOOL setThrowDamage(cXyz*, s16, f32, f32, int) { return FALSE; } + virtual void changeTextureAnime(u16, u16, int) {} + virtual void cancelChangeTextureAnime() {} void getSwordTopPos() const; void getLeftHandPos() const; void getRopeJumpLand() const; void checkRopeForceEnd() const; cXyz getHeadTopPos() const { return mHeadTopPos; } + cXyz* getHeadTopPosP() { return &mHeadTopPos; } void changePlayer(fopAc_ac_c*); void objWindHitCheck(dCcD_Cyl*); void setDoButtonQuake(); diff --git a/include/d/actor/d_a_player_link.h b/include/d/actor/d_a_player_link.h index 27523e115..f5287c68d 100644 --- a/include/d/actor/d_a_player_link.h +++ b/include/d/actor/d_a_player_link.h @@ -1004,39 +1004,39 @@ public: virtual MtxP getLeftHandMatrix(); virtual MtxP getRightHandMatrix(); - virtual void getGroundY(); - virtual void getTactMusic() const; - virtual void getTactTimerCancel() const; + virtual f32 getGroundY(); + virtual int getTactMusic() const; + virtual int getTactTimerCancel() const; virtual BOOL checkPlayerGuard() const; - virtual void getGrabMissActor(); - virtual u32 checkPlayerFly() const; - virtual void checkFrontRoll() const; - virtual void checkBottleSwing() const; - virtual void checkCutCharge() const; - virtual void getBokoFlamePos(cXyz*); - virtual void checkTactWait() const; + virtual fopAc_ac_c* getGrabMissActor(); + virtual BOOL checkPlayerFly() const; + virtual BOOL checkFrontRoll() const; + virtual BOOL checkBottleSwing() const; + virtual BOOL checkCutCharge() const; + virtual BOOL getBokoFlamePos(cXyz*); + virtual BOOL checkTactWait() const; virtual void setTactZev(unsigned int, int, char*); virtual void onDekuSpReturnFlg(u8); - virtual void checkComboCutTurn() const; + virtual bool checkComboCutTurn() const; virtual f32 getBaseAnimeFrameRate(); - virtual void getBaseAnimeFrame(); - virtual void getItemID() const; - virtual void getThrowBoomerangID() const; + virtual f32 getBaseAnimeFrame(); + virtual u32 getItemID() const; + virtual u32 getThrowBoomerangID() const; virtual u32 getGrabActorID() const; - virtual void checkGrabBarrel(); - virtual void checkPlayerNoDraw(); - virtual void checkRopeTag(); - virtual void checkRopeReadyAnime() const; + virtual BOOL checkGrabBarrel(); + virtual BOOL checkPlayerNoDraw(); + virtual BOOL checkRopeTag(); + virtual BOOL checkRopeReadyAnime() const; virtual void voiceStart(u32); virtual void setOutPower(f32, s16, int); virtual void onFrollCrashFlg(u32); - virtual void getModelJointMtx(u16); - virtual void getOldSpeedY(); - virtual void setHookshotCarryOffset(unsigned int, const cXyz*); + virtual MtxP getModelJointMtx(u16); + virtual f32 getOldSpeedY(); + virtual BOOL setHookshotCarryOffset(unsigned int, const cXyz*); virtual void setPlayerPosAndAngle(cXyz*, s16); virtual void setPlayerPosAndAngle(cXyz*, csXyz*); virtual void setPlayerPosAndAngle(float (*)[4]); - virtual void setThrowDamage(cXyz*, s16, f32, f32, int); + virtual BOOL setThrowDamage(cXyz*, s16, f32, f32, int); virtual void changeTextureAnime(u16, u16, int); virtual void cancelChangeTextureAnime(); diff --git a/include/d/actor/d_a_player_npc.h b/include/d/actor/d_a_player_npc.h index 003ffd439..eb7c35d4e 100644 --- a/include/d/actor/d_a_player_npc.h +++ b/include/d/actor/d_a_player_npc.h @@ -6,7 +6,7 @@ class daPy_npc_c : public daPy_py_c { public: - /* 0x320 */ dBgS_Acch mAcch; + /* 0x320 */ dBgS_ObjAcch mAcch; /* 0x4E4 */ u32 m4E4; /* 0x4E8 */ u8 m4E8; /* 0x4E9 */ u8 mDamageFogTimer; @@ -24,7 +24,7 @@ public: void executeDamageFog() { cLib_calcTimer(&mDamageFogTimer); } virtual void restartPoint(s16) {} - virtual void isTagCheckOK() {} + virtual BOOL isTagCheckOK() { return TRUE; } virtual void setMessageAnimation(u8) {} int check_initialRoom(); diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index fe43c3caf..0e7edeabe 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -116,7 +116,7 @@ public: cXyz* GetPos() { return pm_pos; } cXyz* GetOldPos() { return pm_old_pos; } f32 GetGroundH() { return m_ground_h; } - f32 GetRoofHeight() { return m_roof_height; } + f32 GetRoofHeight() { return m_roof_crr_height; } f32 GetSeaHeight() { return m_sea_height; } void SetLin() { m_lin.SetStartEnd(*pm_old_pos, *pm_pos); } bool ChkGroundFind() { return m_flags & GROUND_FIND; } @@ -160,7 +160,9 @@ public: bool ChkMoveBGOnly() const { return m_flags & MOVE_BG_ONLY; } void SetWallHit() { m_flags |= WALL_HIT; } void ClrWallNone() { m_flags &= ~WALL_NONE; } + void OnSeaCheckOn() { m_flags |= SEA_CHECK;} bool ChkSeaCheckOn() { return m_flags & SEA_CHECK;} + void OnSeaWaterHeight() { m_flags |= SEA_WATER_HEIGHT;} bool ChkSeaWaterHeight() { return m_flags & SEA_WATER_HEIGHT;} bool ChkSeaIn() { return m_flags & SEA_IN;} cM3dGCyl* GetWallBmdCylP() { return &m_wall_cyl; } @@ -189,8 +191,8 @@ public: /* 0x0B4 */ f32 field_0xb4; /* 0x0B8 */ f32 field_0xb8; /* 0x0BC */ f32 m_roof_y; - /* 0x0C0 */ f32 m_roof_height; - /* 0x0C4 */ f32 m_roof_crr_height; + /* 0x0C0 */ f32 m_roof_crr_height; + /* 0x0C4 */ f32 m_roof_height; /* 0x0C8 */ f32 field_0xc8; /* 0x0CC */ cBgS_PolyInfo* pm_out_poly_info; /* 0x0D0 */ f32 m_sea_height; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 6f92b7b27..e9a3b257c 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -375,6 +375,10 @@ public: bool checkPlayerStatus(int param_0, int i, u32 flag) { return flag & mPlayerStatus[param_0][i]; } u8 getSelectItem(int idx) { return mEquippedItems[idx]; } + + void setAStatus(u8 status) { mCurrButtonBAction = status; } + void setDoStatus(u8 status) { mCurrButtonAAction = status; } + void setRStatusForce(u8 status) { field_0x4930 = status; } void setCurrentGrafPort(J2DOrthoGraph* i_graf) { mCurrentGrafPort = i_graf; } void setCurrentWindow(dDlst_window_c* i_window) { mCurrentWindow = i_window; } @@ -666,6 +670,10 @@ inline u8 dComIfGs_getBait(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItem().getBait(i_idx); } +inline void dComIfGs_setBaitItemEmpty() { + g_dComIfG_gameInfo.save.getPlayer().getBagItem().setBaitItemEmpty(); +} + inline u8 dComIfGs_getReserve(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItem().getReserve(i_idx); } @@ -1409,8 +1417,12 @@ inline daPy_py_c* daPy_getPlayerActorClass() { return (daPy_py_c*)dComIfGp_getPlayer(0); } +inline fopAc_ac_c* dComIfGp_getLinkPlayer() { + return g_dComIfG_gameInfo.play.getPlayerPtr(0); +} + inline daPy_lk_c* daPy_getPlayerLinkActorClass() { - return (daPy_lk_c*)g_dComIfG_gameInfo.play.getPlayerPtr(0); + return (daPy_lk_c*)dComIfGp_getLinkPlayer(); } inline s8 dComIfGp_getPlayerCameraID(int idx) { @@ -1483,6 +1495,18 @@ inline u8 dComIfGp_getMiniGameType() { return g_dComIfG_gameInfo.play.mMiniGameType; } +inline void dComIfGp_setAStatus(u8 status) { + g_dComIfG_gameInfo.play.setAStatus(status); +} + +inline void dComIfGp_setDoStatus(u8 status) { + g_dComIfG_gameInfo.play.setDoStatus(status); +} + +inline void dComIfGp_setRStatusForce(u8 status) { + g_dComIfG_gameInfo.play.setRStatusForce(status); +} + inline dDlst_window_c * dComIfGp_getWindow(int idx) { return &g_dComIfG_gameInfo.play.mDlstWindow[idx]; } inline dADM_CharTbl* dComIfGp_CharTbl() { @@ -1580,72 +1604,72 @@ inline void dComIfGp_event_setCullRate(f32 ratio) { g_dComIfG_gameInfo.play.getEvent().setCullRate(ratio); } -inline dEvent_manager_c& dComIfGp_getEventManager() { - return g_dComIfG_gameInfo.play.getEvtManager(); +inline dEvent_manager_c* dComIfGp_getPEvtManager() { + return &g_dComIfG_gameInfo.play.getEvtManager(); } inline s16 dComIfGp_evmng_getEventPrio(s16 eventIdx) { - return dComIfGp_getEventManager().getEventPrio(eventIdx); + return dComIfGp_getPEvtManager()->getEventPrio(eventIdx); } inline s16 dComIfGp_evmng_getEventIdx(const char* pName, u8 evNo) { - return dComIfGp_getEventManager().getEventIdx(pName, evNo); + return dComIfGp_getPEvtManager()->getEventIdx(pName, evNo); } inline int dComIfGp_evmng_getMyStaffId(const char* pName, fopAc_ac_c* pActor, s32 param_3) { - return dComIfGp_getEventManager().getMyStaffId(pName, pActor, param_3); + return dComIfGp_getPEvtManager()->getMyStaffId(pName, pActor, param_3); } inline int dComIfGp_evmng_getMyActIdx(int staffIdx, const char* const* pActions, int actionCount, int force, int param_5) { - return dComIfGp_getEventManager().getMyActIdx(staffIdx, pActions, actionCount, force, param_5); + return dComIfGp_getPEvtManager()->getMyActIdx(staffIdx, pActions, actionCount, force, param_5); } inline f32* dComIfGp_evmng_getMyFloatP(int staffIdx, const char* name) { - return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 0)); //type 0 is float + return reinterpret_cast(dComIfGp_getPEvtManager()->getMySubstanceP(staffIdx, name, 0)); //type 0 is float } inline Vec* dComIfGp_evmng_getMyXyzP(int staffIdx, const char* name) { - return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 1)); //type 1 is vec3f + return reinterpret_cast(dComIfGp_getPEvtManager()->getMySubstanceP(staffIdx, name, 1)); //type 1 is vec3f } inline u32* dComIfGp_evmng_getMyIntegerP(int staffIdx, const char* name) { - return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 3)); //type 3 is int + return reinterpret_cast(dComIfGp_getPEvtManager()->getMySubstanceP(staffIdx, name, 3)); //type 3 is int } inline char* dComIfGp_evmng_getMyStringP(int staffIdx, const char* name) { - return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 4)); //type 4 is string + return reinterpret_cast(dComIfGp_getPEvtManager()->getMySubstanceP(staffIdx, name, 4)); //type 4 is string } inline BOOL dComIfGp_evmng_startCheck(s16 eventID) { - return dComIfGp_getEventManager().startCheck(eventID); + return dComIfGp_getPEvtManager()->startCheck(eventID); } inline BOOL dComIfGp_evmng_startCheck(const char* pName) { - return dComIfGp_getEventManager().startCheckOld(pName); + return dComIfGp_getPEvtManager()->startCheckOld(pName); } inline BOOL dComIfGp_evmng_endCheck(const char* pName) { - return dComIfGp_getEventManager().endCheckOld(pName); + return dComIfGp_getPEvtManager()->endCheckOld(pName); } inline BOOL dComIfGp_evmng_endCheck(s16 eventID) { - return dComIfGp_getEventManager().endCheck(eventID); + return dComIfGp_getPEvtManager()->endCheck(eventID); } inline BOOL dComIfGp_evmng_ChkPresentEnd() { - return dComIfGp_getEventManager().ChkPresentEnd(); + return dComIfGp_getPEvtManager()->ChkPresentEnd(); } inline void dComIfGp_evmng_CancelPresent() { - return dComIfGp_getEventManager().CancelPresent(); + return dComIfGp_getPEvtManager()->CancelPresent(); } inline BOOL dComIfGp_evmng_getIsAddvance(s32 staffIdx) { - return dComIfGp_getEventManager().getIsAddvance(staffIdx); + return dComIfGp_getPEvtManager()->getIsAddvance(staffIdx); } inline void dComIfGp_evmng_cutEnd(int staffIdx) { - return dComIfGp_getEventManager().cutEnd(staffIdx); + return dComIfGp_getPEvtManager()->cutEnd(staffIdx); } inline void dComIfGp_evmng_execute() { @@ -1653,15 +1677,15 @@ inline void dComIfGp_evmng_execute() { } inline void dComIfGp_evmng_create() { - g_dComIfG_gameInfo.play.getEvtManager().create(); + dComIfGp_getPEvtManager()->create(); } inline void dComIfGp_evmng_remove() { - g_dComIfG_gameInfo.play.getEvtManager().remove(); + dComIfGp_getPEvtManager()->remove(); } inline void dComIfGp_evmng_setGoal(cXyz* pos) { - g_dComIfG_gameInfo.play.getEvtManager().setGoal(pos); + dComIfGp_getPEvtManager()->setGoal(pos); } /** @@ -1991,7 +2015,16 @@ inline JPABaseEmitter* dComIfGp_particle_set2DmenuFore(u16 particleID, const cXy pPrmColor, pEnvColor, pScale2D); } -inline void dComIfGp_particle_setStripes(u16 particleID, cXyz* pos, csXyz* angle, cXyz* scale, u8 param_4, u16 param_5) { +inline JPABaseEmitter* dComIfGp_particle_setSingleRipple(u16 particleID, const cXyz* pos, + const csXyz* angle = NULL, + const cXyz* scale = NULL, + u8 alpha = 0xFF) { + dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle(); + return pParticle->setSingleRipple(particleID, pos, angle, scale, alpha); +} + +inline void dComIfGp_particle_setStripes(u16 particleID, const cXyz* pos, const csXyz* angle, + const cXyz* scale, u8 param_4, u16 param_5) { dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle(); pParticle->setNormalStripes(particleID, pos, angle, scale, param_4, param_5); } diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 4e0de30be..2848c0be8 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -204,12 +204,12 @@ public: bool dNpc_setAnmIDRes(mDoExt_McaMorf* pMorf, int loopMode, float morf, float speed, int animResId, int soundResId, const char* arcName); bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, char* soundFilename, const char* arcName); -bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName); +bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName); void dNpc_setShadowModel(J3DModel*, J3DModelData*, J3DModel*); cXyz dNpc_playerEyePos(f32); void dNpc_calc_DisXZ_AngY(cXyz, cXyz, float*, short*); bool dNpc_chkArasoi(); BOOL dNpc_chkLetterPassed(); -bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName); +bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName); #endif /* D_NPC_H */ diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 1eb87f315..9a2024a28 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -376,15 +376,15 @@ public: return set(0, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* setNormalP1(u16 particleID, const cXyz* pos, const csXyz* angle, - const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, - s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, - const cXyz* pScale2D) { + const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, + s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { return set(1, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* setToon(u16 particleID, const cXyz* pos, const csXyz* angle, - const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, - s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, - const cXyz* pScale2D) { + const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, + s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { return set(2, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* setToonP1(u16 particleID, const cXyz* pos, const csXyz* angle, @@ -394,15 +394,15 @@ public: return set(3, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* setProjection(u16 particleID, const cXyz* pos, const csXyz* angle, - const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, - s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, - const cXyz* pScale2D) { + const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, + s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { return set(4, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* setShipTail(u16 particleID, const cXyz* pos, const csXyz* angle, - const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, - s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, - const cXyz* pScale2D) { + const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, + s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { return set(5, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* set2Dfore(u16 particleID, const cXyz* pos, const csXyz* angle, @@ -418,15 +418,21 @@ public: return set(8, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } JPABaseEmitter* set2DmenuFore(u16 particleID, const cXyz* pos, const csXyz* angle, - const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, - s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, - const cXyz* pScale2D) { + const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, + s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { return set(9, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } + JPABaseEmitter* setSingleRipple(u16 particleID, const cXyz* pos, const csXyz* angle, + const cXyz* scale, u8 alpha) { + return set(5, particleID, pos, angle, scale, alpha, &mSingleRippleEcallBack, -1, NULL, NULL, NULL); + } void drawModelParticle() { mModelCtrl->draw(); } JKRHeap * getHeap() { return mpHeap; } + + static dPa_rippleEcallBack mSingleRippleEcallBack; /* 0x0000 */ JKRHeap* mpHeap; /* 0x0004 */ JPAResourceManager* mpCommonResMgr; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 6ad09c513..a3c67aaf2 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -851,7 +851,7 @@ public: } void offStatusFlag(int i_roomNo, u8 flag) { - return cLib_offBit(mStatus[i_roomNo].mFlags, flag); + cLib_offBit(mStatus[i_roomNo].mFlags, flag); } void onStatusFlag(int i_roomNo, u8 flag) { return cLib_onBit(mStatus[i_roomNo].mFlags, flag); } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 384aeed5e..f4f800ec5 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -135,6 +135,10 @@ inline void fopAcM_OffStatus(fopAc_ac_c* pActor, u32 flag) { pActor->mStatus &= ~flag; } +inline void fopAcM_SetStatusMap(fopAc_ac_c* pActor, u32 flag) { + pActor->mStatus = (pActor->mStatus & ~0x3F) | fopAcStts_SHOWMAP_e | flag; +} + inline fopAc_ac_c* fopAcM_Search(fopAcIt_JudgeFunc func, void* param) { return (fopAc_ac_c*)fopAcIt_Judge(func, param); } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 0b20ce83d..abea4c101 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -315,7 +315,7 @@ public: void entry(); void entryDL(); void entryDL(J3DMaterialTable*); - void play(Vec *, u32, s8); + bool play(Vec *, u32, s8); void stopZelAnime(); J3DModel* getModel() { return mpModel; } diff --git a/include/m_Do/m_Do_mtx.h b/include/m_Do/m_Do_mtx.h index 838c7dddb..cb9ca2672 100644 --- a/include/m_Do/m_Do_mtx.h +++ b/include/m_Do/m_Do_mtx.h @@ -197,7 +197,7 @@ public: */ static void XYZrotM(csXyz const& xyz); - static void ZXYrotS(csXyz const& xyz); + static void ZXYrotS(csXyz const& xyz) { ZXYrotS(xyz.x, xyz.y, xyz.z); } /** * Rotates the `now` matrix by the given csXyz in the order Z, X, Y diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index 44fc4b656..202cd776e 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -427,7 +427,7 @@ void daAgb_c::modeLookAttention() { se_flag = true; } - if (dComIfGp_getEventManager().endCheckOld("DEFAULT_AGB_LOOK_ATTENTION")) { + if (dComIfGp_evmng_endCheck("DEFAULT_AGB_LOOK_ATTENTION")) { dComIfGp_event_onEventFlag(8); mMode = 0; se_flag = false; @@ -1056,7 +1056,7 @@ int daAgb_Draw(daAgb_c* i_this) { if (g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { if (i_this->field_0x66f != 0 && !(daAgb_c::mFlags.field_0xa & 1) && (!dComIfGp_event_runCheck() || - dComIfGp_getEventManager().startCheckOld("DEFAULT_AGB_LOOK_ATTENTION") || + dComIfGp_evmng_startCheck("DEFAULT_AGB_LOOK_ATTENTION") || i_this->mMode == 2) && (i_this->field_0x65c == 0 || i_this->mMode == 1 || i_this->field_0x66b == 0x10 || i_this->field_0x66b == 3 || i_this->field_0x66b == 12 || i_this->field_0x66b == 4 || diff --git a/src/d/actor/d_a_agbsw0.cpp b/src/d/actor/d_a_agbsw0.cpp index 31ba2f2af..04d2cee92 100644 --- a/src/d/actor/d_a_agbsw0.cpp +++ b/src/d/actor/d_a_agbsw0.cpp @@ -1052,7 +1052,7 @@ BOOL daAgbsw0_c::ExeSubMW() { mEyePos.z += cM_scos(player->shape_angle.y) * 10.0f; } - if(dComIfGp_getEventManager().endCheckOld("DEFAULT_AGB_LOOK_ATTENTION")) { + if(dComIfGp_evmng_endCheck("DEFAULT_AGB_LOOK_ATTENTION")) { dComIfGp_event_reset(); if(sw == 0xFF || getParamNo() == -1) { fopAcM_delete(this); diff --git a/src/d/actor/d_a_bomb2.cpp b/src/d/actor/d_a_bomb2.cpp index ab2f9297d..d38533968 100644 --- a/src/d/actor/d_a_bomb2.cpp +++ b/src/d/actor/d_a_bomb2.cpp @@ -217,7 +217,7 @@ namespace daBomb2 { mAcch.Set(¤t.pos, &next.pos, this, true, &mCir, &speed, ¤t.angle, &shape_angle); mAcch.ClrWaterNone(); mAcch.ClrRoofNone(); - mAcch.m_roof_height = 50.0f; + mAcch.m_roof_crr_height = 50.0f; mAcch.OnLineCheck(); field_0x51C = -1.0e9f; field_0x520 = -1.0e9f; diff --git a/src/d/actor/d_a_kytag04.cpp b/src/d/actor/d_a_kytag04.cpp index 086e5175d..1448ab872 100644 --- a/src/d/actor/d_a_kytag04.cpp +++ b/src/d/actor/d_a_kytag04.cpp @@ -61,7 +61,7 @@ int daKytag04_Create(fopAc_ac_c* i_this) { a_this->mState = 0; a_this->mOffColPat = a_this->mBase.mParameters; a_this->mOnColPat = a_this->mBase.mParameters >> 8; - a_this->mSwitchId = a_this->current.angle.x;; + a_this->mSwitchId = a_this->current.angle.x; a_this->mScaleX = a_this->mScale.x * 100.0f; a_this->mScaleY = a_this->mScale.y * 100.0f; a_this->mTimer = 0; diff --git a/src/d/actor/d_a_nh.cpp b/src/d/actor/d_a_nh.cpp index 7f0f2f99f..1250ee942 100644 --- a/src/d/actor/d_a_nh.cpp +++ b/src/d/actor/d_a_nh.cpp @@ -46,8 +46,8 @@ public: public: /* 0x04 */ s8 mChildID; /* 0x08 */ hio_prm_c prm; - /* 0x44 */ daNh_c* mActor; -}; // Size: 0x44 + /* 0x44 */ daNh_c* mpActor; +}; // Size: 0x48 static daNh_HIO_c l_HIO; @@ -243,9 +243,9 @@ s32 daNh_c::create() { if (l_HIO.mChildID < 0) { l_HIO.mChildID = mDoHIO_root.mDoHIO_createChild("森のほたる", &l_HIO); - l_HIO.mActor = this; + l_HIO.mpActor = this; } - if (!this->init()) { + if (!init()) { phase_state = cPhs_ERROR_e; } diff --git a/src/d/actor/d_a_npc_kamome.cpp b/src/d/actor/d_a_npc_kamome.cpp index 49ccbe5dc..2857992a3 100644 --- a/src/d/actor/d_a_npc_kamome.cpp +++ b/src/d/actor/d_a_npc_kamome.cpp @@ -3,811 +3,1458 @@ // Translation Unit: d_a_npc_kamome.cpp // -#include "d_a_npc_kamome.h" +#include "d/actor/d_a_npc_kamome.h" #include "dolphin/types.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_hostIO.h" +#include "d/d_item_data.h" +#include "d/actor/d_a_player_link.h" +#include "m_Do/m_Do_mtx.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "m_Do/m_Do_controller_pad.h" +#include "d/d_npc.h" +#include "d/d_snap.h" + +s16 dCam_getControledAngleY(camera_class*); + +// 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}; + +static char* l_staff_name = "HyoiKam"; +static u8 temp[0x4C]; // TODO +static daNpc_kam_HIO_c l_HIO; +static int l_hio_counter; +static int l_msgId; +static int l_msg; +static daNpc_kam_c* l_act; +static s16 l_demo_start_chk_cnt; +static s16 l_demo_start_chk_flag; +static cXyz l_ms_at_local_vec(0.0f, 0.0f, -1.0f); +static cXyz l_ms_at_local_start(100.0f, 20.0f, 0.0f); +static cXyz l_ms_at_local_end(-100.0f, 20.0f, 0.0f); +static cXyz l_line_bg_local_end(0.0f, 0.0f, 500.0f); +static cXyz l_call_local_kyori(0.0f, 0.0f, 500.0f); + +enum KAMOME_RES_FILE_ID { // IDs and indexes are synced + /* BAS */ + KAMOME_BAS_KA_FLY1=0x5, + KAMOME_BAS_KA_LAND1=0x6, + KAMOME_BAS_KA_MOVE1=0x7, + KAMOME_BAS_KA_WAIT1=0x8, + KAMOME_BAS_KA_WAIT2=0x9, + + /* BCK */ + KAMOME_BCK_KA_EAT1=0xC, + KAMOME_BCK_KA_FLY1=0xD, + KAMOME_BCK_KA_LAND1=0xE, + KAMOME_BCK_KA_MOVE1=0xF, + KAMOME_BCK_KA_SING1=0x10, + KAMOME_BCK_KA_SING2=0x11, + KAMOME_BCK_KA_WAIT1=0x12, + KAMOME_BCK_KA_WAIT2=0x13, + KAMOME_BCK_KA_WAIT3=0x14, + + /* BDL */ + KAMOME_BDL_KA=0x17, + KAMOME_BDL_KA_HYOI=0x18, +}; /* 000000EC-00000174 .text __ct__16daNpc_kam_HIO1_cFv */ daNpc_kam_HIO1_c::daNpc_kam_HIO1_c() { - /* Nonmatching */ + mSpeedF = 17.0f; + mUnused08 = 0.1f; + mGlidingAngVelY = 0x2000; + mGlidingAngVelX = 0x0AAA; + mMaxAngleZ = 0x2000; + mAccelF = 0.7f; + mFlappingSpeedF = 23.0f; + mFlappingAngVelY = 0x2710; + mFlappingAngVelX = 0x1555; + mAngVelStepScale = 5; + mAngVelMaxStep = 0x1000; + mAngVelMinStep = 0x0400; + mFlapDuration = 30; + mFlapExhaustedDuration = 150; + mFlapEnergyDuration = 150; } /* 00000174-000001F8 .text __ct__15daNpc_kam_HIO_cFv */ daNpc_kam_HIO_c::daNpc_kam_HIO_c() { - /* Nonmatching */ -} - -/* 000001F8-00000240 .text __dt__16daNpc_kam_HIO1_cFv */ -daNpc_kam_HIO1_c::~daNpc_kam_HIO1_c() { - /* Nonmatching */ + mChildID = -1; + static const hio_prm_c init_data = { + /* m08 */ 3000.0f, + /* m0C */ 1000.0f, + /* m10 */ 250.0f, + /* m14 */ 0.0f, + /* m18 */ 0.0f, + /* m1C */ 0x4000, + /* m1E */ 0, + }; + prm = init_data; } /* 00000240-00000260 .text daNpc_kam_XyCheckCB__FPvi */ -void daNpc_kam_XyCheckCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_kam_XyCheckCB(void* i_this, int equippedItemIdx) { + return ((daNpc_kam_c*)i_this)->XyCheckCB(equippedItemIdx); } /* 00000260-000002A4 .text XyCheckCB__11daNpc_kam_cFi */ -void daNpc_kam_c::XyCheckCB(int) { - /* Nonmatching */ +s16 daNpc_kam_c::XyCheckCB(int equippedItemIdx) { + if (dComIfGp_getSelectItem(equippedItemIdx) == ANIMAL_ESA) { + return callDemoStartCheck(); + } else { + return FALSE; + } } /* 000002A4-000004F0 .text callDemoStartCheck__11daNpc_kam_cFv */ -void daNpc_kam_c::callDemoStartCheck() { - /* Nonmatching */ -} - -/* 000004F0-0000052C .text __dt__4cXyzFv */ -cXyz::~cXyz() { - /* Nonmatching */ +int daNpc_kam_c::callDemoStartCheck() { + if (l_demo_start_chk_cnt != 0) { + return l_demo_start_chk_flag; + } + + l_demo_start_chk_cnt += 1; + l_demo_start_chk_flag = 0; + + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + cXyz hyoi_pear_pos = link->getHeadTopPos(); + hyoi_pear_pos.y += 20.0f; + + cXyz descend_start_pos; + cXyz line_start_pos; + cXyz line_end_pos; + + s16 angle = link->shape_angle.y + 0x8000; + mLinChk.OnBackFlag(); + + line_end_pos = hyoi_pear_pos; + + // Check if there are any straight lines from any angle around the Hyoi Pear that the Hyoi Seagull can descend from. + for (int i = 0; i < 0x10; i++) { + mDoMtx_stack_c::YrotS(angle + 0x8000); + mDoMtx_stack_c::multVec(&l_call_local_kyori, &line_end_pos); + mDoMtx_stack_c::YrotS(angle); + mDoMtx_stack_c::multVec(&l_call_local_kyori, &line_start_pos); + mDoMtx_stack_c::XrotM(-0x1555); + mDoMtx_stack_c::multVec(&l_call_local_kyori, &descend_start_pos); + + line_end_pos += hyoi_pear_pos; + line_start_pos += hyoi_pear_pos; + descend_start_pos += line_start_pos; + + mLinChk.Set(&descend_start_pos, &line_start_pos, this); + if (!dComIfG_Bgsp()->LineCross(&mLinChk)) { + mLinChk.Set(&line_start_pos, &line_end_pos, this); + if (!dComIfG_Bgsp()->LineCross(&mLinChk)) { + // Found a direction with no collisions. + mDescendStartPos = descend_start_pos; + mDescendStartPosUnangled = line_start_pos; // Unused + mDescendStartAngle.set(0x1555, angle + 0x8000, 0); + mLinChk.OffBackFlag(); + l_demo_start_chk_flag = 1; + return 1; + } + } + + angle = angle + 0x2000; + } + + mLinChk.OffBackFlag(); + + return 0; } /* 0000052C-0000054C .text daNpc_kam_XyEventCB__FPvi */ -void daNpc_kam_XyEventCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_kam_XyEventCB(void* i_this, int param_1) { + return ((daNpc_kam_c*)i_this)->XyEventCB(param_1); } /* 0000054C-00000568 .text XyEventCB__11daNpc_kam_cFi */ -void daNpc_kam_c::XyEventCB(int) { - /* Nonmatching */ +s16 daNpc_kam_c::XyEventCB(int param_1) { + onEventAccept(); + mCurrEventIdxIdx = 1; // "kamome_call" + return mEventIdxs[1]; } /* 00000568-000009E4 .text __dt__11daNpc_kam_cFv */ daNpc_kam_c::~daNpc_kam_c() { - /* Nonmatching */ -} - -/* 000009E4-00000A6C .text __dt__12dBgS_AcchCirFv */ -dBgS_AcchCir::~dBgS_AcchCir() { - /* Nonmatching */ + if (l_act == this) { + l_act = NULL; + } + + dComIfG_resDelete(&mPhs, "Kamome"); + + if (heap) { + mpMorf->stopZelAnime(); + } + + if (l_HIO.mChildID >= 0) { + mDoHIO_root.mDoHIO_deleteChild(l_HIO.mChildID); + l_HIO.mChildID = -1; + } + + offHyoiKamome(); } /* 00000A6C-00000B20 .text setAttention__11daNpc_kam_cFbi */ -void daNpc_kam_c::setAttention(bool, int) { - /* Nonmatching */ +void daNpc_kam_c::setAttention(bool param_1, int param_2) { + if (param_1) { + cXyz headTopPos = getHeadTopPos(); + mEyePos.set(headTopPos.x, headTopPos.y - 20.0f, headTopPos.z); + if (param_2) { + mAttentionInfo.mPosition.set(current.pos.x, current.pos.y, current.pos.z); + } else { + mAttentionInfo.mPosition.set(orig.pos.x, orig.pos.y, orig.pos.z); + } + } } /* 00000B20-00000C00 .text setBaseMtx__11daNpc_kam_cFv */ void daNpc_kam_c::setBaseMtx() { - /* Nonmatching */ + static cXyz l_offset(0.0f, 30.0f, 0.0f); + J3DModel* model = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::transM(l_offset); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->calc(); } /* 00000C00-00000CD0 .text headNodeCallBack__FP7J3DNodei */ -void headNodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static int headNodeCallBack(J3DNode* node, int param_1) { + if (!param_1) { + J3DJoint* joint = (J3DJoint*)node; + J3DModel* model = j3dSys.getModel(); + daNpc_kam_c* i_this = (daNpc_kam_c*)model->getUserArea(); + if (i_this) { + static cXyz l_offsetAttPos(0.0f, 20.0f, 0.0f); + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + mDoMtx_stack_c::multVec(&l_offsetAttPos, i_this->getHeadTopPosP()); + } + } + return TRUE; } /* 00000CD0-00000EB8 .text createHeap__11daNpc_kam_cFv */ -void daNpc_kam_c::createHeap() { - /* Nonmatching */ +BOOL daNpc_kam_c::createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Kamome", KAMOME_BDL_KA_HYOI); + JUT_ASSERT(763, modelData != 0); + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectRes("Kamome", KAMOME_BCK_KA_WAIT1), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1, + NULL, + 0x00080000, + 0x11000002 + ); + + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + + s16 head1JntIdx = modelData->getJointName()->getIndex("j_ka_head1"); + if (head1JntIdx >= 0) { + modelData->getJointNodePointer(head1JntIdx)->setCallBack(headNodeCallBack); + } + m_jnt_body = modelData->getJointName()->getIndex("j_ka_spin1"); + JUT_ASSERT(783, m_jnt_body >= 0); + + mpMorf->getModel()->setUserArea((u32)this); + + return TRUE; } /* 00000EB8-00000ED8 .text checkCreateHeap__FP10fopAc_ac_c */ -void checkCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL checkCreateHeap(fopAc_ac_c* i_this) { + return ((daNpc_kam_c*)i_this)->createHeap(); } /* 00000ED8-0000101C .text create__11daNpc_kam_cFv */ -void daNpc_kam_c::create() { - /* Nonmatching */ +s32 daNpc_kam_c::create() { + fopAcM_SetupActor(this, daNpc_kam_c); + + if (l_act != NULL && l_act != this) { + return cPhs_ERROR_e; + } + l_act = this; + + static u32 l_heap_size = 0x1360; + + s32 phase_state = dComIfG_resLoad(&mPhs, "Kamome"); + + if (phase_state == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, &checkCreateHeap, l_heap_size)) { + mpMorf = NULL; + return cPhs_ERROR_e; + } + + mCullMtx = mpMorf->getModel()->getBaseTRMtx(); + + if (l_HIO.mChildID < 0) { + l_HIO.mChildID = mDoHIO_root.mDoHIO_createChild("かもめ", &l_HIO); + l_HIO.mpActor = this; + } + + if (!init()) { + phase_state = cPhs_ERROR_e; + } + } + + return phase_state; } -/* 0000101C-00001390 .text __ct__11daNpc_kam_cFv */ -daNpc_kam_c::daNpc_kam_c() { - /* Nonmatching */ -} +static dCcD_SrcSph l_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_SWORD, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0x09, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0x79, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 30.0f, + }, +}; -/* 00001390-00001470 .text __dt__8dCcD_CpsFv */ -dCcD_Cps::~dCcD_Cps() { - /* Nonmatching */ -} +static dCcD_SrcSph l_tg_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ 0x05, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 30.0f, + }, +}; -/* 00001470-000014CC .text __dt__8cM3dGCpsFv */ -cM3dGCps::~cM3dGCps() { - /* Nonmatching */ -} +static dCcD_SrcCps l_kam_at_cps_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_SWORD, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0x09, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0x02, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGCpsS + { + /* Start */ 0.0f, 0.0f, 0.0f, + /* End */ 0.0f, 0.0f, 0.0f, + /* Radius */ 20.0f, + }, +}; -/* 000014CC-00001598 .text __dt__8dCcD_SphFv */ -dCcD_Sph::~dCcD_Sph() { - /* Nonmatching */ -} - -/* 00001598-000015E0 .text __dt__8cM3dGSphFv */ -cM3dGSph::~cM3dGSph() { - /* Nonmatching */ -} - -/* 000015E0-0000163C .text __dt__14cCcD_ShapeAttrFv */ -cCcD_ShapeAttr::~cCcD_ShapeAttr() { - /* Nonmatching */ -} - -/* 0000163C-00001684 .text __dt__8cM3dGAabFv */ -cM3dGAab::~cM3dGAab() { - /* Nonmatching */ -} - -/* 00001684-000016E0 .text __dt__10dCcD_GSttsFv */ -dCcD_GStts::~dCcD_GStts() { - /* Nonmatching */ -} - -/* 000016E0-0000180C .text __dt__11dBgS_LinChkFv */ -dBgS_LinChk::~dBgS_LinChk() { - /* Nonmatching */ -} - -/* 0000180C-000018AC .text __dt__8dBgS_ChkFv */ -dBgS_Chk::~dBgS_Chk() { - /* Nonmatching */ -} - -/* 000018AC-00001908 .text __dt__15dBgS_GrpPassChkFv */ -dBgS_GrpPassChk::~dBgS_GrpPassChk() { - /* Nonmatching */ -} - -/* 00001908-00001950 .text __dt__15cBgS_GrpPassChkFv */ -cBgS_GrpPassChk::~cBgS_GrpPassChk() { - /* Nonmatching */ -} - -/* 00001950-000019AC .text __dt__16dBgS_PolyPassChkFv */ -dBgS_PolyPassChk::~dBgS_PolyPassChk() { - /* Nonmatching */ -} - -/* 000019AC-000019F4 .text __dt__16cBgS_PolyPassChkFv */ -cBgS_PolyPassChk::~cBgS_PolyPassChk() { - /* Nonmatching */ -} - -/* 000019F4-00001A88 .text __dt__11cBgS_LinChkFv */ -cBgS_LinChk::~cBgS_LinChk() { - /* Nonmatching */ -} - -/* 00001A88-00001AD0 .text __dt__8cM3dGLinFv */ -cM3dGLin::~cM3dGLin() { - /* Nonmatching */ -} - -/* 00001AD0-00001B18 .text __dt__13cBgS_PolyInfoFv */ -cBgS_PolyInfo::~cBgS_PolyInfo() { - /* Nonmatching */ -} - -/* 00001B18-00001B88 .text __dt__12dBgS_ObjAcchFv */ -dBgS_ObjAcch::~dBgS_ObjAcch() { - /* Nonmatching */ -} +static char* event_name_tbl[] = { + "OPTION_CHAR_END", + "kamome_call", + "kamome_out_turn", +}; /* 00001B88-00001DBC .text init__11daNpc_kam_cFv */ -void daNpc_kam_c::init() { - /* Nonmatching */ +BOOL daNpc_kam_c::init() { + offHyoiKamome(); + mUnusedC06 = 0; + mEventState = -1; + mCurrEventIdxIdx = -1; + mScale *= 1000.0f; + mMaxY = orig.pos.y + mScale.y; + mMinY = orig.pos.y - mScale.y; + + mTargetSpeedF = l_HIO.mHio1.mSpeedF; + mAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mAngVelX = l_HIO.mHio1.mGlidingAngVelX; + mTargetAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mGlidingAngVelX; + + setNpcAction(&waitNpcAction, NULL); + + mAcchCirs[0].SetWall(20.0f, 50.0f); + mAcchCirs[1].SetWall(-20.0f, 50.0f); + mAcch.Set(¤t.pos, &next.pos, this, ARRAY_SIZE(mAcchCirs), mAcchCirs, &speed, NULL, NULL); + mAcch.ClrRoofNone(); + mAcch.SetRoofCrrHeight(20.0f); + mAcch.OnLineCheck(); + mAcch.OnSeaCheckOn(); + mAcch.OnSeaWaterHeight(); + mStts.Init(100, 0xFF, this); + mAtSph.Set(l_sph_src); + mAtSph.SetStts(&mStts); + mTgSph.Set(l_tg_sph_src); + mTgSph.SetStts(&mStts); + mCps.Set(l_kam_at_cps_src); + mCps.SetStts(&mStts); + + setBaseMtx(); + + mAttentionInfo.mFlags = 0; + mAttentionInfo.mDistances[1] = 38; + mAttentionInfo.mDistances[3] = 38; + + for (int i = 0; i < 3; i++) { + mEventIdxs[i] = dComIfGp_evmng_getEventIdx(event_name_tbl[i], 0xFF); + } + + mEvtInfo.mpCheckCB = &daNpc_kam_XyCheckCB; + mEvtInfo.mpEventCB = &daNpc_kam_XyEventCB; + + return TRUE; } /* 00001DBC-00001E8C .text setAction__11daNpc_kam_cFPM11daNpc_kam_cFPCvPvPv_iM11daNpc_kam_cFPCvPvPv_iPv */ -void daNpc_kam_c::setAction(int (daNpc_kam_c::**)(void*), int (daNpc_kam_c::*)(void*), void*) { - /* Nonmatching */ +BOOL daNpc_kam_c::setAction(ActionFunc* pCurrActionFunc, ActionFunc newActionFunc, void* arg) { + if (*pCurrActionFunc != newActionFunc) { + if (*pCurrActionFunc) { + mActionStatus = ACTION_ENDING; + (this->**pCurrActionFunc)(arg); + } + *pCurrActionFunc = newActionFunc; + mActionStatus = ACTION_STARTING; + mC08 = 0; + mC0A = 0; + mC0C = 0; + mUnusedC0E = 0; + mUnusedC14 = 0.0f; + (this->**pCurrActionFunc)(arg); + } + return TRUE; } /* 00001E8C-00001F40 .text npcAction__11daNpc_kam_cFPv */ -void daNpc_kam_c::npcAction(void*) { - /* Nonmatching */ +void daNpc_kam_c::npcAction(void* arg) { + if (!mCurrNpcActionFunc) { + speedF = 0.0f; + offHyoiKamome(); + setNpcAction(&waitNpcAction, NULL); + mDoAud_zelAudio_c::getInterface()->field_0x0062 = 0; + } + + (this->*mCurrNpcActionFunc)(arg); } /* 00001F40-00001FA4 .text setNpcAction__11daNpc_kam_cFM11daNpc_kam_cFPCvPvPv_iPv */ -void daNpc_kam_c::setNpcAction(int (daNpc_kam_c::*)(void*), void*) { - /* Nonmatching */ +void daNpc_kam_c::setNpcAction(ActionFunc actionFunc, void* arg) { + mCurrPlayerActionFunc = NULL; + setAction(&mCurrNpcActionFunc, actionFunc, arg); } /* 00001FA4-00002058 .text playerAction__11daNpc_kam_cFPv */ -void daNpc_kam_c::playerAction(void*) { - /* Nonmatching */ +void daNpc_kam_c::playerAction(void* arg) { + if (!mCurrPlayerActionFunc) { + speedF = 0.0f; + setPlayerAction(&waitPlayerAction, NULL); + } + + dComIfGp_setRStatusForce(0x07); // Show "Return" on the R button + dComIfGp_setDoStatus(0x23); // Show "Fly" on the A button + dComIfGp_setAStatus(0x3E); // Do not display the B button icon at all + + (this->*mCurrPlayerActionFunc)(arg); } /* 00002058-000020BC .text setPlayerAction__11daNpc_kam_cFM11daNpc_kam_cFPCvPvPv_iPv */ -void daNpc_kam_c::setPlayerAction(int (daNpc_kam_c::*)(void*), void*) { - /* Nonmatching */ +void daNpc_kam_c::setPlayerAction(ActionFunc actionFunc, void* arg) { + mCurrNpcActionFunc = NULL; + setAction(&mCurrPlayerActionFunc, actionFunc, arg); } /* 000020BC-00002100 .text returnLinkCheck__11daNpc_kam_cFv */ -void daNpc_kam_c::returnLinkCheck() { - /* Nonmatching */ +BOOL daNpc_kam_c::returnLinkCheck() { + if (!dComIfGp_event_runCheck()) { + if (CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0)) { + return TRUE; + } + } + return FALSE; } /* 00002100-0000235C .text changeAreaCheck__11daNpc_kam_cFv */ -void daNpc_kam_c::changeAreaCheck() { - /* Nonmatching */ +BOOL daNpc_kam_c::changeAreaCheck() { + // Determine if Link is allowed to take control of a Hyoi Seagull depending on his current position. + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz delta; + if (strcmp(dComIfGp_getStartStageName(), "sea") == 0 && fopAcM_GetRoomNo(this) == 41) { + // Forest Haven sector on the sea. + // Check if Link is standing on top of the rock formation with the Nintendo Gallery entrance on it. + // If not, do not allow Link to control a Hyoi Seagull even if he's within its moveable range. + static cXyz l_center(211555.0f, 1000.0f, 191870.0f); + if (player->current.pos.y > l_center.y) { + delta = player->current.pos - l_center; + if (delta.absXZ() < 1300.0f) { + offNpcNotChange(); + return TRUE; + } + } + } else { + // For all other sectors, simple check if Link is within the Hyoi Seagull's moveable range. + delta = player->current.pos - orig.pos; + if (delta.absXZ() < mScale.x) { + offNpcNotChange(); + return TRUE; + } + } + onNpcNotChange(); + return FALSE; } /* 0000235C-00002450 .text areaOutCheck__11daNpc_kam_cFv */ -void daNpc_kam_c::areaOutCheck() { - /* Nonmatching */ +BOOL daNpc_kam_c::areaOutCheck() { + cXyz delta = (current.pos - orig.pos); + return delta.absXZ() > mScale.x ? TRUE : FALSE; } /* 00002450-000025B0 .text getStickAngY__11daNpc_kam_cFPsPs */ -void daNpc_kam_c::getStickAngY(short*, short*) { - /* Nonmatching */ +BOOL daNpc_kam_c::getStickAngY(s16* pTargetAngleY, s16* pTargetAngleZ) { + BOOL isTurning = FALSE; + s16 deltaAngleY = 0; + s16 targetAngleZ = 0; + + f32 stickPosX = g_mDoCPd_cpadInfo[0].mMainStickPosX; + if (stickPosX) { + deltaAngleY = stickPosX * -mAngVelY; + targetAngleZ = stickPosX * l_HIO.mHio1.mMaxAngleZ; + isTurning = TRUE; + } else if (wallHitCheck() >= 0) { + if (isLeftLineHit()) { + deltaAngleY = -0x4000; + targetAngleZ = l_HIO.mHio1.mMaxAngleZ; + isTurning = TRUE; + } else if (isRightLineHit()) { + deltaAngleY = 0x4000; + targetAngleZ = -l_HIO.mHio1.mMaxAngleZ; + isTurning = TRUE; + } else if (isFrontLineHit()) { + deltaAngleY = -0x4000; + targetAngleZ = l_HIO.mHio1.mMaxAngleZ; + isTurning = TRUE; + } + } + + s16 angleY = dCam_getControledAngleY(dComIfGp_getCamera(0)); + *pTargetAngleY = deltaAngleY + angleY; + *pTargetAngleZ = targetAngleZ; + return isTurning; } /* 000025B0-00002664 .text getAngleX__11daNpc_kam_cFv */ -void daNpc_kam_c::getAngleX() { - /* Nonmatching */ +s16 daNpc_kam_c::getAngleX() { + s16 angle; + if (current.pos.y < mMinY || mAcch.ChkGroundHit() || isWaterHit()) { + // Turn up. + angle = -mAngVelX; + mLockAngleXTimer = 30; + } else if (current.pos.y > mMaxY || mAcch.ChkRoofHit()) { + // Turn down. + angle = mAngVelX; + mLockAngleXTimer = 30; + } else { + angle = g_mDoCPd_cpadInfo[0].mMainStickPosY * mAngVelX; + } + return angle; } /* 00002664-000026AC .text wallHitCheck__11daNpc_kam_cFv */ -void daNpc_kam_c::wallHitCheck() { - /* Nonmatching */ +int daNpc_kam_c::wallHitCheck() { + if (mAcch.ChkWallHit()) { + for (int i = 0; i < ARRAY_SIZE(mAcchCirs); i++) { + if (mAcchCirs[i].ChkWallHit()) { + return i; + } + } + } + return -1; } /* 000026AC-0000270C .text npcTurnCheck__11daNpc_kam_cFPs */ -void daNpc_kam_c::npcTurnCheck(short*) { - /* Nonmatching */ +BOOL daNpc_kam_c::npcTurnCheck(s16* pTargetAngleY) { + BOOL isTurning = FALSE; + if (isLeftLineHit()) { + *pTargetAngleY = current.angle.y - 0x2000; + isTurning = TRUE; + } else if (isRightLineHit()) { + *pTargetAngleY = current.angle.y + 0x2000; + isTurning = TRUE; + } else if (isFrontLineHit()) { + *pTargetAngleY = current.angle.y - 0x2000; + isTurning = TRUE; + } + return isTurning; } /* 0000270C-00002AF4 .text waitNpcAction__11daNpc_kam_cFPv */ -void daNpc_kam_c::waitNpcAction(void*) { - /* Nonmatching */ +int daNpc_kam_c::waitNpcAction(void*) { + if (mActionStatus == ACTION_STARTING) { + mActionStatus++; // ACTION_ONGOING_1 + setAnm(ANM_WAIT2); + + speedF = l_HIO.mHio1.mSpeedF; + mTargetSpeedF = l_HIO.mHio1.mSpeedF; + mAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mAngVelX = l_HIO.mHio1.mGlidingAngVelX; + mTargetAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mGlidingAngVelX; + + mC08 = cLib_getRndValue(90, 60); + mC0C = cLib_getRndValue(10, 80); + } else if (mActionStatus != ACTION_ENDING) { + if (changeAreaCheck()) { + cLib_onBit(mAttentionInfo.mFlags, 0x02000008UL); + mEventState = 6; + } else { + cLib_offBit(mAttentionInfo.mFlags, 0x02000008UL); + mEventState = -1; + } + + // Elements are randomly chosen from these arrays, except for the last two elements, which are never chosen. + static const s16 l_turn_angleY[] = {0x1000, 0xF400, 0xF000, 0x0800, 0x0C00, 0xF800}; + static const int l_anm_type[] = { + ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, ANM_WAIT2, + ANM_WAIT2, ANM_WAIT2, ANM_WAIT1, ANM_WAIT1, ANM_SING, ANM_WAIT1, ANM_SING, ANM_WAIT1, + }; + s16 targetAngleX = 0; + s16 targetAngleY = current.angle.y; + if (mActionStatus == ACTION_ONGOING_1) { + if (areaOutCheck()) { + mActionStatus = ACTION_ONGOING_2; + mC08 = 60; + setAnm(ANM_WAIT1); + } else { + if (cLib_calcTimer(&mC0C) == 0) { + mC0C = cLib_getRndValue(10, 80); + setAnm(l_anm_type[cLib_getRndValue(0, (int)ARRAY_SIZE(l_anm_type)-2)]); + } + if (!npcTurnCheck(&targetAngleY) && cLib_calcTimer(&mC08) == 0) { + mActionStatus = ACTION_ONGOING_3; + mC08 = cLib_getRndValue(60, 60); + mC0A = l_turn_angleY[cLib_getRndValue(0, (int)ARRAY_SIZE(l_turn_angleY)-2)]; + } + } + } else if (mActionStatus == ACTION_ONGOING_2) { + targetAngleY = cLib_targetAngleY(¤t.pos, &orig.pos); + if (cLib_calcTimer(&mC08) == 0 && !areaOutCheck()) { + mActionStatus = ACTION_ONGOING_1; + setAnm(ANM_WAIT2); + mC08 = cLib_getRndValue(90, 60); + } + } else if (mActionStatus == ACTION_ONGOING_3) { + if (npcTurnCheck(&targetAngleY)) { + mActionStatus = ACTION_ONGOING_1; + mC08 = cLib_getRndValue(90, 60); + } else { + targetAngleY = mC0A; + if (cLib_calcTimer(&mC08) == 0) { + mActionStatus = ACTION_ONGOING_1; + mC08 = cLib_getRndValue(90, 60); + } + } + } + + if (mAnmIdx == ANM_SING && mpMorf->checkFrame(8.0f)) { + fopAcM_seStart(this, JA_SE_CV_KAMOME, 0); + } + + if (current.pos.y < orig.pos.y) { + targetAngleX = -l_HIO.mHio1.mGlidingAngVelX; + } + + s16 angleDiffY = current.angle.y - targetAngleY; + if (abs(angleDiffY) > 0x200) { + cLib_addCalcAngleS(¤t.angle.y, targetAngleY, 30, 0x2000, 0x100); + shape_angle.y = current.angle.y; + if (angleDiffY > l_HIO.mHio1.mMaxAngleZ) { + angleDiffY = l_HIO.mHio1.mMaxAngleZ; + } else if (angleDiffY < -l_HIO.mHio1.mMaxAngleZ) { + angleDiffY = -l_HIO.mHio1.mMaxAngleZ; + } + } + + cLib_addCalcAngleS(¤t.angle.x, targetAngleX, 8, 0x2000, 0x400); + cLib_addCalcAngleS(¤t.angle.z, angleDiffY, 8, 0x2000, 0x400); + setAttention(true, 0); + } + + return 1; } /* 00002AF4-00002C04 .text keyProc__11daNpc_kam_cFv */ -void daNpc_kam_c::keyProc() { - /* Nonmatching */ +BOOL daNpc_kam_c::keyProc() { + if (cLib_calcTimer(&mFlapExhaustedTimer) == 0) { + if (CPad_CHECK_TRIG_A(0)) { + mFlapTimer = l_HIO.mHio1.mFlapDuration; + } + if (cLib_calcTimer(&mFlapTimer) != 0) { + // Flapping. + mTargetSpeedF = l_HIO.mHio1.mFlappingSpeedF; + mTargetAngVelY = l_HIO.mHio1.mFlappingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mFlappingAngVelX; + + if (cLib_calcTimer(&mFlapEnergyTimer) == 0) { + // If flapping for too long without rest, become exhausted. + mFlapExhaustedTimer = l_HIO.mHio1.mFlapExhaustedDuration; + } + } else { + // Gliding. + mTargetSpeedF = l_HIO.mHio1.mSpeedF; + mTargetAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mGlidingAngVelX; + + // Gradually build up energy to flap while gliding. + mFlapEnergyTimer++; + if (mFlapEnergyTimer > l_HIO.mHio1.mFlapEnergyDuration) { + mFlapEnergyTimer = l_HIO.mHio1.mFlapEnergyDuration; + } + } + } else { + mFlapTimer = 0; + mFlapEnergyTimer = l_HIO.mHio1.mFlapEnergyDuration; + } + return TRUE; } /* 00002C04-00002F08 .text waitPlayerAction__11daNpc_kam_cFPv */ -void daNpc_kam_c::waitPlayerAction(void*) { - /* Nonmatching */ +int daNpc_kam_c::waitPlayerAction(void*) { + if (mActionStatus == ACTION_STARTING) { + mActionStatus++; // ACTION_ONGOING_1 + onHyoiKamome(); + setAnm(ANM_WAIT1); + speedF = l_HIO.mHio1.mSpeedF; + mTargetSpeedF = l_HIO.mHio1.mSpeedF; + mAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mAngVelX = l_HIO.mHio1.mGlidingAngVelX; + mTargetAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mGlidingAngVelX; + mC08 = cLib_getRndValue(60, 90); + mC0A = 0; + mFlapTimer = 0; + mFlapExhaustedTimer = 0; + mFlapEnergyTimer = l_HIO.mHio1.mFlapEnergyDuration; + } else if (mActionStatus == ACTION_ENDING) { + offHyoiKamome(); + } else { + keyProc(); + cLib_calcTimer(&mLockAngleXTimer); + if (!dComIfGp_event_runCheck() && areaOutCheck()) { + mEventState = 2; + } + + s16 targetAngleZ = 0; + s16 targetAngleY = 0; + if (getStickAngY(&targetAngleY, &targetAngleZ)) { + cLib_addCalcAngleS(¤t.angle.y, targetAngleY, 8, 0x2000, 0x400); + } + shape_angle.y = current.angle.y; + + if (mLockAngleXTimer == 0) { + mTargetAngleX = getAngleX(); + } + + cLib_addCalcAngleS(¤t.angle.x, mTargetAngleX, 8, 0x2000, 0x400); + cLib_addCalcAngleS(¤t.angle.z, targetAngleZ, 8, 0x2000, 0x400); + setAttention(true, 1); + + if (mAnmIdx != ANM_WAIT2) { + if (mFlapTimer != 0) { + setAnm(ANM_WAIT2); + } else { + if (cLib_calcTimer(&mC08) == 0) { + mC08 = cLib_getRndValue(90, 90); + setAnm(ANM_SING); + } + } + + if (mAnmIdx == ANM_SING) { + if (mReachedAnimEnd) { + setAnm(ANM_WAIT1); + } + + if (mAnmIdx == ANM_SING && mpMorf->checkFrame(8.0f)) { + fopAcM_seStart(this, JA_SE_CV_KAMOME, 0); + } + } + } else if (mReachedAnimEnd && mFlapTimer == 0) { + setAnm(ANM_SING); + } + + if (mTgSph.ChkTgHit()) { + setPlayerAction(&damagePlayerAction, NULL); + } + } + return TRUE; } /* 00002F08-00003058 .text damagePlayerAction__11daNpc_kam_cFPv */ -void daNpc_kam_c::damagePlayerAction(void*) { - /* Nonmatching */ +BOOL daNpc_kam_c::damagePlayerAction(void*) { + if (mActionStatus == ACTION_STARTING) { + dComIfGp_getVibration().StartShock(5, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + setDamageFogTimer(150); + mActionStatus++; // ACTION_ONGOING_1 + onHyoiKamome(); + setAnm(ANM_WAIT1); + speedF = 0.0f; + fopAcM_seStart(this, JA_SE_CV_KAMOME, 0); + mC08 = 30; + } else if (mActionStatus == ACTION_ENDING) { + offHyoiKamome(); + } else { + shape_angle.y += 0x2000; + current.angle.y = shape_angle.y; + setAttention(true, 1); + if (cLib_calcTimer(&mC08) == 0) { + returnLink(); + } + } + return TRUE; } /* 00003058-0000315C .text eventOrder__11daNpc_kam_cFv */ void daNpc_kam_c::eventOrder() { - /* Nonmatching */ + if (isEventAccept()) { + return; + } + if (mEventState == 5 || mEventState == 4) { + if (dComIfGp_getPlayer(0) != this) { + mEvtInfo.onCondition(dEvtCnd_CANTALK_e); + if (mEventState == 5) { + fopAcM_orderSpeakEvent(this); + } + } else { + mEventState = -1; + } + } else if (mEventState == 6) { + if (dComIfGp_getPlayer(0) != this) { + mEvtInfo.onCondition(dEvtCnd_CANTALKITEM_e); + mEvtInfo.onCondition(dEvtCnd_CANTALK_e); + } else { + mEventState = -1; + } + } else if (mEventState != -1 && mEventState < 3) { + mCurrEventIdxIdx = mEventState; + fopAcM_orderOtherEventId(this, mEventIdxs[mCurrEventIdxIdx], -1, -1, 0, 1); + } } /* 0000315C-00003194 .text checkOrder__11daNpc_kam_cFv */ void daNpc_kam_c::checkOrder() { - /* Nonmatching */ + if (!mEvtInfo.checkCommandTalk()) { + return; + } + if (mEventState != 5 && mEventState != 4 && mEventState != 6) { + return; + } + mEventState = -1; } /* 00003194-00003200 .text checkCommandTalk__11daNpc_kam_cFv */ -void daNpc_kam_c::checkCommandTalk() { - /* Nonmatching */ +BOOL daNpc_kam_c::checkCommandTalk() { + if (mEvtInfo.checkCommandTalk()) { + if (dComIfGp_event_chkTalkXY()) { + if (mEventState == 6) { + mEventState = -1; + } + return FALSE; + } + return TRUE; + } + return FALSE; } /* 00003200-00003248 .text returnLinkPlayer__11daNpc_kam_cFv */ void daNpc_kam_c::returnLinkPlayer() { - /* Nonmatching */ + changePlayer(dComIfGp_getLinkPlayer()); + offHyoiKamome(); + mDoAud_zelAudio_c::getInterface()->field_0x0062 = 0; } +static daNpc_kam_c::EventActionInitFunc event_init_tbl[] = { + &daNpc_kam_c::initialWaitEvent, + &daNpc_kam_c::initialChangeEvent, + &daNpc_kam_c::initialDescendEvent, + &daNpc_kam_c::initialAreaOutTurn, +}; + +static daNpc_kam_c::EventActionFunc event_action_tbl[] = { + &daNpc_kam_c::actionWaitEvent, + &daNpc_kam_c::actionDefault, + &daNpc_kam_c::actionDescendEvent, + &daNpc_kam_c::actionAreaOutTurn, +}; + +static char* cut_name_tbl[] = { + "wait", + "change", + "descend", + "out_turn", +}; + /* 00003248-000034A8 .text eventProc__11daNpc_kam_cFv */ -void daNpc_kam_c::eventProc() { - /* Nonmatching */ +BOOL daNpc_kam_c::eventProc() { + if (mEvtInfo.checkCommandDemoAccrpt()) { + if (mEventState != -1) { + if (mEventState == 0) { + if (dComIfGp_evmng_startCheck("OPTION_CHAR_END") || dComIfGp_evmng_endCheck("OPTION_CHAR_END")) { + dComIfGp_event_setTalkPartner(dComIfGp_getLinkPlayer()); + mDoAud_seStart(JA_SE_CTRL_NPC_TO_LINK, NULL, 0, 0); + } else { + offReturnLink(); + mEventState = -1; + } + } + if (mEventState != -1) { + onEventAccept(); + mEventState = -1; + } + } + } + + int staffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0); + // The dComIfGp_event_runCheck inline breaks the codegen here. + // if (dComIfGp_event_runCheck() && !checkCommandTalk()) { + if (g_dComIfG_gameInfo.play.getEvent().runCheck() && !checkCommandTalk()) { + if (staffId != -1) { + int actIdx = dComIfGp_evmng_getMyActIdx(staffId, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), 1, 0); + if (actIdx == -1) { + dComIfGp_evmng_cutEnd(staffId); + } else { + if (dComIfGp_evmng_getIsAddvance(staffId)) { + (this->*event_init_tbl[actIdx])(staffId); + } + if ((this->*event_action_tbl[actIdx])(staffId)) { + dComIfGp_evmng_cutEnd(staffId); + } + } + } + + if (isEventAccept()) { + if (dComIfGp_evmng_endCheck(mEventIdxs[mCurrEventIdxIdx])) { + eventEnd(); + } + return TRUE; + } else { + return TRUE; + } + } + + return FALSE; } /* 000034A8-00003514 .text eventEnd__11daNpc_kam_cFv */ void daNpc_kam_c::eventEnd() { - /* Nonmatching */ + dComIfGp_event_onEventFlag(8); + offEventAccept(); + + if (mCurrEventIdxIdx == 0) { // "OPTION_CHAR_END" + returnLinkPlayer(); + offReturnLink(); + } + mCurrEventIdxIdx = -1; } /* 00003514-0000351C .text actionDefault__11daNpc_kam_cFi */ -void daNpc_kam_c::actionDefault(int) { - /* Nonmatching */ +BOOL daNpc_kam_c::actionDefault(int evtStaffId) { + return TRUE; } /* 0000351C-00003580 .text initialWaitEvent__11daNpc_kam_cFi */ -void daNpc_kam_c::initialWaitEvent(int) { - /* Nonmatching */ +void daNpc_kam_c::initialWaitEvent(int evtStaffId) { + u32* timerP = dComIfGp_evmng_getMyIntegerP(evtStaffId, "timer"); + if (timerP) { + mWaitTimer = *timerP; + } else { + mWaitTimer = 0; + } } /* 00003580-000035C8 .text actionWaitEvent__11daNpc_kam_cFi */ -void daNpc_kam_c::actionWaitEvent(int) { - /* Nonmatching */ +BOOL daNpc_kam_c::actionWaitEvent(int evtStaffId) { + setAttention(true, 1); + return cLib_calcTimer(&mWaitTimer) == 0 ? TRUE : FALSE; } /* 000035C8-0000361C .text initialChangeEvent__11daNpc_kam_cFi */ -void daNpc_kam_c::initialChangeEvent(int) { - /* Nonmatching */ +void daNpc_kam_c::initialChangeEvent(int evtStaffId) { + fopAcM_SetRoomNo(this, fopAcM_GetHomeRoomNo(this)); + changePlayer(this); + dComIfGs_setBaitItemEmpty(); + offNoBgCheck(); } /* 0000361C-00003730 .text initialDescendEvent__11daNpc_kam_cFi */ -void daNpc_kam_c::initialDescendEvent(int) { - /* Nonmatching */ +void daNpc_kam_c::initialDescendEvent(int evtStaffId) { + current.pos = mDescendStartPos; + current.angle = mDescendStartAngle; + shape_angle = current.angle; + + mTargetSpeedF = speedF = l_HIO.mHio1.mSpeedF; + mAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mAngVelX = l_HIO.mHio1.mGlidingAngVelX; + mTargetAngVelY = l_HIO.mHio1.mGlidingAngVelY; + mTargetAngVelX = l_HIO.mHio1.mGlidingAngVelX; + + mDoAud_seStart(JA_SE_HYOI_USE_DEMO, NULL, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mDoAud_zelAudio_c::getInterface()->field_0x0062 = 1; + + onNoBgCheck(); + + mWaitTimer = 900; } +// Needed for the .rodata section to match. +const f32 dummy5[] = {40.0f}; + /* 00003730-00003864 .text actionDescendEvent__11daNpc_kam_cFi */ -void daNpc_kam_c::actionDescendEvent(int) { - /* Nonmatching */ +BOOL daNpc_kam_c::actionDescendEvent(int evtStaffId) { + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + cXyz linkHeadTopPos = link->getHeadTopPos(); + linkHeadTopPos.y += 20.0f; + + setAttention(true, 1); + + if (current.pos.y < linkHeadTopPos.y) { + current.pos.y = linkHeadTopPos.y; + } + if (current.pos.y < linkHeadTopPos.y + 50.0f) { + cLib_addCalcAngleS(¤t.angle.x, 0, 30, 0x2000, 0x400); + shape_angle.x = current.angle.x; + } + + cXyz delta = linkHeadTopPos - current.pos; + if (delta.abs2XZ() < 100.0f*100.0f) { + return TRUE; + } + + return cLib_calcTimer(&mWaitTimer) == 0 ? TRUE : FALSE; } /* 00003864-00003884 .text initialAreaOutTurn__11daNpc_kam_cFi */ -void daNpc_kam_c::initialAreaOutTurn(int) { - /* Nonmatching */ +void daNpc_kam_c::initialAreaOutTurn(int evtStaffId) { + mWaitTimer = 10; + mAreaOutTimer = 180*30; + current.angle.x = 0; + current.angle.z = 0; } /* 00003884-000039E8 .text actionAreaOutTurn__11daNpc_kam_cFi */ -void daNpc_kam_c::actionAreaOutTurn(int) { - /* Nonmatching */ +BOOL daNpc_kam_c::actionAreaOutTurn(int evtStaffId) { + if (cLib_calcTimer(&mWaitTimer) == 0) { + onNoBgCheck(); + speedF = 0.0f; + + s16 targetAngle = cLib_targetAngleY(¤t.pos, &orig.pos); + s16 angleDiff = current.angle.y - targetAngle; + if (abs(angleDiff) != 0) { + cLib_addCalcAngleS(¤t.angle.y, targetAngle, 16, 0x2000, 0x400); + } else { + speedF = l_HIO.mHio1.mSpeedF; + } + shape_angle.y = current.angle.y; + + current.angle.z = angleDiff; + if (current.angle.z > l_HIO.mHio1.mMaxAngleZ) { + current.angle.z = l_HIO.mHio1.mMaxAngleZ; + } else if (current.angle.z < -l_HIO.mHio1.mMaxAngleZ) { + current.angle.z = -l_HIO.mHio1.mMaxAngleZ; + } + + if (!areaOutCheck()) { + offNoBgCheck(); + return TRUE; + } + } + + cLib_addCalcAngleS(&shape_angle.x, current.angle.x, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.z, current.angle.z, 8, 0x2000, 0x400); + + setAttention(true, 1); + + return cLib_calcTimer(&mAreaOutTimer) == 0 ? TRUE : FALSE; } +struct anmPrm_c { + /* 0x00 */ s8 mAnmTblIdx; + /* 0x04 */ int mLoopMode; + /* 0x08 */ f32 mMorf; + /* 0x0C */ f32 mPlaySpeed; + /* 0x10 */ int m10; +}; +struct anmTbl_c { + /* 0x00 */ s8 mBckFileIdx; + /* 0x01 */ s8 mSoundFileIdx; +}; + /* 000039E8-00003B14 .text setAnm__11daNpc_kam_cFi */ -void daNpc_kam_c::setAnm(int) { - /* Nonmatching */ +void daNpc_kam_c::setAnm(int anmIdx) { + static anmTbl_c l_anmTbl[] = { + {KAMOME_BCK_KA_WAIT1, KAMOME_BAS_KA_WAIT1}, + {KAMOME_BCK_KA_WAIT2, KAMOME_BAS_KA_WAIT2}, + {KAMOME_BCK_KA_SING1, -1}, + }; + static anmPrm_c l_anmPrm[] = { + { + /* mAnmTblIdx */ 0, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* m10 */ 0, + }, + { + /* mAnmTblIdx */ 1, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* m10 */ 0, + }, + { + /* mAnmTblIdx */ 2, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* m10 */ 0, + }, + }; + + mAnmIdx = anmIdx; + anmPrm_c* anmPrm = &l_anmPrm[anmIdx]; + + f32 playSpeed = anmPrm->mPlaySpeed; + + if (anmPrm->mAnmTblIdx == mAnmTblIdx && anmPrm->mPlaySpeed == mpMorf->getPlaySpeed()) { + return; + } + + mAnmTblIdx = anmPrm->mAnmTblIdx; + anmTbl_c* anmTbl = &l_anmTbl[mAnmTblIdx]; + + mPrevMorfFrame = 0.0f; + mReachedAnimEnd = false; + dNpc_setAnm( + mpMorf, anmPrm->mLoopMode, + anmPrm->mMorf, playSpeed, + anmTbl->mBckFileIdx, anmTbl->mSoundFileIdx, + "Kamome" + ); + + if (anmPrm->m10 < 0) { + mpMorf->setFrame(mpMorf->getEndFrame()); + } } /* 00003B14-00003C80 .text setCollision__11daNpc_kam_cFv */ void daNpc_kam_c::setCollision() { - /* Nonmatching */ + MtxP mtx = mpMorf->getModel()->getAnmMtx(m_jnt_body); + cXyz center; + center.set(mtx[0][3], mtx[1][3], mtx[2][3]); + + mAtSph.SetC(center); + dComIfG_Ccsp()->Set(&mAtSph); + + mTgSph.SetC(center); + dComIfG_Ccsp()->Set(&mTgSph); + + mDoMtx_stack_c::ZXYrotS(shape_angle); + cXyz at_global_start; + cXyz at_global_end; + cXyz at_global_vec; + mDoMtx_stack_c::multVec(&l_ms_at_local_start, &at_global_start); + mDoMtx_stack_c::multVec(&l_ms_at_local_end, &at_global_end); + mDoMtx_stack_c::multVecSR(&l_ms_at_local_vec, &at_global_vec); + at_global_start += center; + at_global_end += center; + + mCps.SetStartEnd(at_global_start, at_global_end); + mCps.SetAtVec(at_global_vec); + dComIfG_Ccsp()->Set(&mCps); } /* 00003C80-00003E4C .text setLineBgCheck__11daNpc_kam_cFv */ void daNpc_kam_c::setLineBgCheck() { - /* Nonmatching */ + offLineHit(); + csXyz lineAngle = shape_angle; + cXyz lineEndPos; + + mDoMtx_stack_c::ZXYrotS(lineAngle); + mDoMtx_stack_c::multVec(&l_line_bg_local_end, &lineEndPos); + lineEndPos += current.pos; + mLinChk.Set(¤t.pos, &lineEndPos, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + onFrontLineHit(); + } + + lineAngle.y = shape_angle.y + 0x2000; + mDoMtx_stack_c::ZXYrotS(lineAngle); + mDoMtx_stack_c::multVec(&l_line_bg_local_end, &lineEndPos); + lineEndPos += current.pos; + mLinChk.Set(¤t.pos, &lineEndPos, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + onLeftLineHit(); + } + + lineAngle.y = shape_angle.y - 0x2000; + mDoMtx_stack_c::ZXYrotS(lineAngle); + mDoMtx_stack_c::multVec(&l_line_bg_local_end, &lineEndPos); + lineEndPos += current.pos; + mLinChk.Set(¤t.pos, &lineEndPos, this); + if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + onRightLineHit(); + } } /* 00003E4C-00003F2C .text animationPlay__11daNpc_kam_cFv */ void daNpc_kam_c::animationPlay() { - /* Nonmatching */ + u32 mtrlSndId = 0; + if (mAcch.ChkGroundHit() && dComIfG_Bgsp()->ChkPolySafe(mAcch.m_gnd)) { + mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd); + } + + mReachedAnimEnd = mpMorf->play(&mEyePos, mtrlSndId, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + + f32 frame = mpMorf->getFrame(); + if (mpMorf->getPlaySpeed() < 0.0f) { + if (frame > mPrevMorfFrame) { + mReachedAnimEnd = true; + } + } else if (frame < mPrevMorfFrame) { + mReachedAnimEnd = true; + } + + mPrevMorfFrame = frame; } /* 00003F2C-0000445C .text execute__11daNpc_kam_cFv */ -void daNpc_kam_c::execute() { - /* Nonmatching */ +BOOL daNpc_kam_c::execute() { + l_demo_start_chk_cnt = 0; + + static JGeometry::TVec3 splash_scale(0.6f, 0.6f, 0.6f); + static JGeometry::TVec3 ripple_scale(1.0f, 1.0f, 1.0f); + + fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); + executeDamageFog(); + + if (!isReturnLink()) { + if (checkNowPosMove(l_staff_name)) { + mAccelF = l_HIO.mHio1.mAccelF; + + if (speedF < mTargetSpeedF) { + speedF += mAccelF; + if (speedF > mTargetSpeedF) { + speedF = mTargetSpeedF; + } + } else if (speedF > mTargetSpeedF) { + speedF -= mAccelF; + if (speedF < mTargetSpeedF) { + speedF = mTargetSpeedF; + } + } + + cLib_addCalcAngleS(&mAngVelY, mTargetAngVelY, l_HIO.mHio1.mAngVelStepScale, l_HIO.mHio1.mAngVelMaxStep, l_HIO.mHio1.mAngVelMinStep); + cLib_addCalcAngleS(&mAngVelX, mTargetAngVelX, l_HIO.mHio1.mAngVelStepScale, l_HIO.mHio1.mAngVelMaxStep, l_HIO.mHio1.mAngVelMinStep); + + f32 cosXSpeed = speedF * cM_scos(current.angle.x); + speed.y = speedF * -cM_ssin(current.angle.x); + speed.x = cosXSpeed * cM_ssin(current.angle.y); + speed.z = cosXSpeed * cM_scos(current.angle.y); + + fopAcM_posMove(this, mStts.GetCCMoveP()); + } + + if (!isNoBgCheck()) { + mAcch.CrrPos(*dComIfG_Bgsp()); + if (mAcch.GetGroundH() != -1000000000.0f) { + s8 roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + fopAcM_SetRoomNo(this, roomNo); + mTevStr.mRoomNo = roomNo; + mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + mStts.SetRoomId(roomNo); + mPolyInfo.SetPolyInfo(mAcch.m_gnd); + } + + if (mAcch.ChkSeaIn()) { + if (!isWaterHit()) { + onWaterHit(); + + JPABaseEmitter* splashEmitter = dComIfGp_particle_set(0x40, ¤t.pos); + if (splashEmitter) { + splashEmitter->setRate(15.0f); + splashEmitter->setGlobalScale(splash_scale); + } + + JPABaseEmitter* rippleEmitter = dComIfGp_particle_setSingleRipple(0x3D, ¤t.pos); + if (rippleEmitter) { + rippleEmitter->setGlobalScale(ripple_scale); + } + } + } else { + offWaterHit(); + } + } + + setLineBgCheck(); + + if (checkNowPosMove(l_staff_name)) { + animationPlay(); + } + } + + BOOL inEvent = eventProc(); + + if (!inEvent) { + if (dComIfGp_getPlayer(0) == this) { + fopAcM_SetStatusMap(this, 0x14); + + if (isReturnLink()) { + mEventState = 0; + } else { + playerAction(NULL); + if (returnLinkCheck()) { + returnLink(); + } + } + } else { + checkOrder(); + npcAction(NULL); + } + + cLib_addCalcAngleS(&shape_angle.x, current.angle.x, 8, 0x2000, 0x400); + cLib_addCalcAngleS(&shape_angle.z, current.angle.z, 8, 0x2000, 0x400); + } + + eventOrder(); + setBaseMtx(); + + if (!inEvent && dComIfGp_getPlayer(0) == this) { + setCollision(); + } + + mAtSph.ClrCoHit(); + mTgSph.ClrTgHit(); + mCps.ClrAtHit(); + mStts.ClrCcMove(); + + return TRUE; } /* 0000445C-00004548 .text draw__11daNpc_kam_cFv */ -void daNpc_kam_c::draw() { - /* Nonmatching */ +BOOL daNpc_kam_c::draw() { + J3DModel* model = mpMorf->getModel(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + + drawDamageFog(); + + g_env_light.setLightTevColorType(model, &mTevStr); + + mpMorf->entryDL(); + + cXyz shadowPos(current.pos.x, current.pos.y, current.pos.z); + mShadowId = dComIfGd_setShadow( + mShadowId, 1, model, &shadowPos, 800.0f, 20.0f, + current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &mTevStr, + 0, 1.0f, dDlst_shadowControl_c::getSimpleTex() + ); + + dSnap_RegistFig(0x55, this, 1.0f, 1.0f, 1.0f); + + return TRUE; } /* 00004548-00004568 .text daNpc_kam_Draw__FP11daNpc_kam_c */ -void daNpc_kam_Draw(daNpc_kam_c*) { - /* Nonmatching */ +static BOOL daNpc_kam_Draw(daNpc_kam_c* i_this) { + return i_this->draw(); } /* 00004568-00004588 .text daNpc_kam_Execute__FP11daNpc_kam_c */ -void daNpc_kam_Execute(daNpc_kam_c*) { - /* Nonmatching */ +static BOOL daNpc_kam_Execute(daNpc_kam_c* i_this) { + return i_this->execute(); } /* 00004588-00004590 .text daNpc_kam_IsDelete__FP11daNpc_kam_c */ -void daNpc_kam_IsDelete(daNpc_kam_c*) { - /* Nonmatching */ +static BOOL daNpc_kam_IsDelete(daNpc_kam_c* i_this) { + return TRUE; } /* 00004590-000045B8 .text daNpc_kam_Delete__FP11daNpc_kam_c */ -void daNpc_kam_Delete(daNpc_kam_c*) { - /* Nonmatching */ +static BOOL daNpc_kam_Delete(daNpc_kam_c* i_this) { + i_this->~daNpc_kam_c(); + return TRUE; } /* 000045B8-000045D8 .text daNpc_kam_Create__FP10fopAc_ac_c */ -void daNpc_kam_Create(fopAc_ac_c*) { - /* Nonmatching */ -} - -/* 000045D8-00004620 .text __dt__8cM2dGCirFv */ -cM2dGCir::~cM2dGCir() { - /* Nonmatching */ -} - -/* 00004620-0000467C .text __dt__8cM3dGCirFv */ -cM3dGCir::~cM3dGCir() { - /* Nonmatching */ -} - -/* 0000467C-000046DC .text __dt__15daNpc_kam_HIO_cFv */ -daNpc_kam_HIO_c::~daNpc_kam_HIO_c() { - /* Nonmatching */ -} - -/* 000046DC-000046F8 .text cLib_calcTimer__FPs */ -void cLib_calcTimer(short*) { - /* Nonmatching */ -} - -/* 000046F8-00004714 .text cLib_calcTimer__FPUc */ -void cLib_calcTimer(unsigned char*) { - /* Nonmatching */ -} - -/* 00004714-00004790 .text cLib_getRndValue__Fii */ -void cLib_getRndValue(int, int) { - /* Nonmatching */ -} - -/* 00004984-0000498C .text @280@__dt__8dCcD_CpsFv */ -void @280@__dt__8dCcD_CpsFv { - /* Nonmatching */ -} - -/* 0000498C-00004994 .text @248@__dt__8dCcD_CpsFv */ -void @248@__dt__8dCcD_CpsFv { - /* Nonmatching */ -} - -/* 00004994-0000499C .text @280@__dt__8dCcD_SphFv */ -void @280@__dt__8dCcD_SphFv { - /* Nonmatching */ -} - -/* 0000499C-000049A4 .text @248@__dt__8dCcD_SphFv */ -void @248@__dt__8dCcD_SphFv { - /* Nonmatching */ -} - -/* 000049A4-000049AC .text @20@__dt__11dBgS_LinChkFv */ -void @20@__dt__11dBgS_LinChkFv { - /* Nonmatching */ -} - -/* 000049AC-000049B4 .text @100@__dt__11dBgS_LinChkFv */ -void @100@__dt__11dBgS_LinChkFv { - /* Nonmatching */ -} - -/* 000049B4-000049BC .text @88@__dt__11dBgS_LinChkFv */ -void @88@__dt__11dBgS_LinChkFv { - /* Nonmatching */ -} - -/* 000049BC-000049C4 .text @12@__dt__8dBgS_ChkFv */ -void @12@__dt__8dBgS_ChkFv { - /* Nonmatching */ -} - -/* 000049C4-000049CC .text @20@__dt__11cBgS_LinChkFv */ -void @20@__dt__11cBgS_LinChkFv { - /* Nonmatching */ -} - -/* 000049CC-000049D4 .text @32@__dt__12dBgS_ObjAcchFv */ -void @32@__dt__12dBgS_ObjAcchFv { - /* Nonmatching */ -} - -/* 000049D4-000049DC .text @20@__dt__12dBgS_ObjAcchFv */ -void @20@__dt__12dBgS_ObjAcchFv { - /* Nonmatching */ -} - -/* 000049DC-000049F8 .text getHeadTopPos__9daPy_py_cCFv */ -void daPy_py_c::getHeadTopPos() const { - /* Nonmatching */ -} - -/* 000049F8-00004A00 .text getTactMusic__9daPy_py_cCFv */ -void daPy_py_c::getTactMusic() const { - /* Nonmatching */ -} - -/* 00004A00-00004A08 .text getTactTimerCancel__9daPy_py_cCFv */ -void daPy_py_c::getTactTimerCancel() const { - /* Nonmatching */ -} - -/* 00004A08-00004A10 .text checkPlayerGuard__9daPy_py_cCFv */ -void daPy_py_c::checkPlayerGuard() const { - /* Nonmatching */ -} - -/* 00004A10-00004A18 .text getGrabMissActor__9daPy_py_cFv */ -void daPy_py_c::getGrabMissActor() { - /* Nonmatching */ -} - -/* 00004A18-00004A20 .text checkPlayerFly__9daPy_py_cCFv */ -void daPy_py_c::checkPlayerFly() const { - /* Nonmatching */ -} - -/* 00004A20-00004A28 .text checkFrontRoll__9daPy_py_cCFv */ -void daPy_py_c::checkFrontRoll() const { - /* Nonmatching */ -} - -/* 00004A28-00004A30 .text checkBottleSwing__9daPy_py_cCFv */ -void daPy_py_c::checkBottleSwing() const { - /* Nonmatching */ -} - -/* 00004A30-00004A38 .text checkCutCharge__9daPy_py_cCFv */ -void daPy_py_c::checkCutCharge() const { - /* Nonmatching */ -} - -/* 00004A38-00004A40 .text getBokoFlamePos__9daPy_py_cFP4cXyz */ -void daPy_py_c::getBokoFlamePos(cXyz*) { - /* Nonmatching */ -} - -/* 00004A40-00004A48 .text checkTactWait__9daPy_py_cCFv */ -void daPy_py_c::checkTactWait() const { - /* Nonmatching */ -} - -/* 00004A48-00004A4C .text setTactZev__9daPy_py_cFUiiPc */ -void daPy_py_c::setTactZev(unsigned int, int, char*) { - /* Nonmatching */ -} - -/* 00004A4C-00004A50 .text onDekuSpReturnFlg__9daPy_py_cFUc */ -void daPy_py_c::onDekuSpReturnFlg(unsigned char) { - /* Nonmatching */ -} - -/* 00004A50-00004A58 .text checkComboCutTurn__9daPy_py_cCFv */ -void daPy_py_c::checkComboCutTurn() const { - /* Nonmatching */ -} - -/* 00004A58-00004A60 .text getItemID__9daPy_py_cCFv */ -void daPy_py_c::getItemID() const { - /* Nonmatching */ -} - -/* 00004A60-00004A68 .text getThrowBoomerangID__9daPy_py_cCFv */ -void daPy_py_c::getThrowBoomerangID() const { - /* Nonmatching */ -} - -/* 00004A68-00004A70 .text getGrabActorID__9daPy_py_cCFv */ -void daPy_py_c::getGrabActorID() const { - /* Nonmatching */ -} - -/* 00004A70-00004A78 .text checkGrabBarrel__9daPy_py_cFv */ -void daPy_py_c::checkGrabBarrel() { - /* Nonmatching */ -} - -/* 00004A78-00004A80 .text checkPlayerNoDraw__9daPy_py_cFv */ -void daPy_py_c::checkPlayerNoDraw() { - /* Nonmatching */ -} - -/* 00004A80-00004A88 .text checkRopeTag__9daPy_py_cFv */ -void daPy_py_c::checkRopeTag() { - /* Nonmatching */ -} - -/* 00004A88-00004A90 .text checkRopeReadyAnime__9daPy_py_cCFv */ -void daPy_py_c::checkRopeReadyAnime() const { - /* Nonmatching */ -} - -/* 00004A90-00004A94 .text voiceStart__9daPy_py_cFUl */ -void daPy_py_c::voiceStart(unsigned long) { - /* Nonmatching */ -} - -/* 00004A94-00004A98 .text setOutPower__9daPy_py_cFfsi */ -void daPy_py_c::setOutPower(float, short, int) { - /* Nonmatching */ -} - -/* 00004A98-00004A9C .text onFrollCrashFlg__9daPy_py_cFUl */ -void daPy_py_c::onFrollCrashFlg(unsigned long) { - /* Nonmatching */ -} - -/* 00004A9C-00004AA4 .text getModelJointMtx__9daPy_py_cFUs */ -void daPy_py_c::getModelJointMtx(unsigned short) { - /* Nonmatching */ -} - -/* 00004AA4-00004AB0 .text getOldSpeedY__9daPy_py_cFv */ -void daPy_py_c::getOldSpeedY() { - /* Nonmatching */ -} - -/* 00004AB0-00004AB8 .text setHookshotCarryOffset__9daPy_py_cFUiPC4cXyz */ -void daPy_py_c::setHookshotCarryOffset(unsigned int, const cXyz*) { - /* Nonmatching */ -} - -/* 00004AB8-00004ABC .text setPlayerPosAndAngle__9daPy_py_cFPA4_f */ -void daPy_py_c::setPlayerPosAndAngle(float(*)[4]) { - /* Nonmatching */ -} - -/* 00004ABC-00004AC0 .text setPlayerPosAndAngle__9daPy_py_cFP4cXyzP5csXyz */ -void daPy_py_c::setPlayerPosAndAngle(cXyz*, csXyz*) { - /* Nonmatching */ -} - -/* 00004AC0-00004AC4 .text setPlayerPosAndAngle__9daPy_py_cFP4cXyzs */ -void daPy_py_c::setPlayerPosAndAngle(cXyz*, short) { - /* Nonmatching */ -} - -/* 00004AC4-00004ACC .text setThrowDamage__9daPy_py_cFP4cXyzsffi */ -void daPy_py_c::setThrowDamage(cXyz*, short, float, float, int) { - /* Nonmatching */ -} - -/* 00004ACC-00004AD0 .text changeTextureAnime__9daPy_py_cFUsUsi */ -void daPy_py_c::changeTextureAnime(unsigned short, unsigned short, int) { - /* Nonmatching */ -} - -/* 00004AD0-00004AD4 .text cancelChangeTextureAnime__9daPy_py_cFv */ -void daPy_py_c::cancelChangeTextureAnime() { - /* Nonmatching */ -} - -/* 00004AD4-00004AD8 .text restartPoint__10daPy_npc_cFs */ -void daPy_npc_c::restartPoint(short) { - /* Nonmatching */ -} - -/* 00004AD8-00004AE0 .text isTagCheckOK__10daPy_npc_cFv */ -void daPy_npc_c::isTagCheckOK() { - /* Nonmatching */ -} - -/* 00004AE0-00004AE4 .text setMessageAnimation__10daPy_npc_cFUc */ -void daPy_npc_c::setMessageAnimation(unsigned char) { - /* Nonmatching */ -} - -/* 00004AE4-00004B2C .text __dt__10cCcD_GSttsFv */ -cCcD_GStts::~cCcD_GStts() { - /* Nonmatching */ -} - -/* 00004B2C-00004B3C .text GetShapeAttr__8dCcD_SphFv */ -void dCcD_Sph::GetShapeAttr() { - /* Nonmatching */ -} - -/* 00004B3C-00004B44 .text GetCoCP__12cCcD_SphAttrFv */ -void cCcD_SphAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00004B44-00004B4C .text GetCoCP__12cCcD_SphAttrCFv */ -void cCcD_SphAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00004B4C-00004B54 .text CrossAtTg__12cCcD_SphAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004B54-00004B5C .text CrossAtTg__12cCcD_SphAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004B5C-00004B94 .text CrossAtTg__12cCcD_SphAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_SphAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004B94-00004B9C .text CrossCo__12cCcD_SphAttrCFRC12cCcD_AabAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004B9C-00004BA4 .text CrossCo__12cCcD_SphAttrCFRC12cCcD_TriAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004BA4-00004BAC .text CrossCo__12cCcD_SphAttrCFRC12cCcD_PntAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004BAC-00004BE4 .text CrossCo__12cCcD_SphAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_SphAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004BE4-00004BE8 .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} - -/* 00004BE8-00004BF0 .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} - -/* 00004BF0-00004BF8 .text CrossAtTg__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_ShapeAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004BF8-00004C00 .text CrossCo__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_ShapeAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004C00-00004C0C .text GetCoCP__14cCcD_ShapeAttrFv */ -void cCcD_ShapeAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00004C0C-00004C18 .text GetCoCP__14cCcD_ShapeAttrCFv */ -void cCcD_ShapeAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00004C18-00004C28 .text GetShapeAttr__8dCcD_CpsFv */ -void dCcD_Cps::GetShapeAttr() { - /* Nonmatching */ -} - -/* 00004C28-00004C30 .text CrossAtTg__12cCcD_CpsAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004C30-00004C38 .text CrossAtTg__12cCcD_CpsAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004C38-00004C70 .text CrossAtTg__12cCcD_CpsAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00004C70-00004C78 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_AabAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004C78-00004C80 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_TriAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004C80-00004C88 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_PntAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004C88-00004CC0 .text CrossCo__12cCcD_CpsAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00004CC0-00004CC8 .text getGroundY__11daNpc_kam_cFv */ -void daNpc_kam_c::getGroundY() { - /* Nonmatching */ -} - -/* 00004CC8-00004CD0 .text getLeftHandMatrix__11daNpc_kam_cFv */ -void daNpc_kam_c::getLeftHandMatrix() { - /* Nonmatching */ -} - -/* 00004CD0-00004CD8 .text getRightHandMatrix__11daNpc_kam_cFv */ -void daNpc_kam_c::getRightHandMatrix() { - /* Nonmatching */ -} - -/* 00004CD8-00004CE4 .text getBaseAnimeFrameRate__11daNpc_kam_cFv */ -void daNpc_kam_c::getBaseAnimeFrameRate() { - /* Nonmatching */ -} - -/* 00004CE4-00004CF0 .text getBaseAnimeFrame__11daNpc_kam_cFv */ -void daNpc_kam_c::getBaseAnimeFrame() { - /* Nonmatching */ -} - -/* 00004CF0-00004CF4 .text restartPoint__11daNpc_kam_cFs */ -void daNpc_kam_c::restartPoint(short) { - /* Nonmatching */ -} - +static s32 daNpc_kam_Create(fopAc_ac_c* i_this) { + return ((daNpc_kam_c*)i_this)->create(); +} + +static actor_method_class l_daNpc_kam_Method = { + (process_method_func)daNpc_kam_Create, + (process_method_func)daNpc_kam_Delete, + (process_method_func)daNpc_kam_Execute, + (process_method_func)daNpc_kam_IsDelete, + (process_method_func)daNpc_kam_Draw, +}; + +actor_process_profile_definition g_profile_NPC_KAM = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_NPC_KAM, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daNpc_kam_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x00B6, + /* Actor SubMtd */ &l_daNpc_kam_Method, + /* Status */ fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLSPHERE_2_e, +}; diff --git a/src/d/actor/d_a_obj_toripost.cpp b/src/d/actor/d_a_obj_toripost.cpp index c1d9ef782..3d68bf9a9 100644 --- a/src/d/actor/d_a_obj_toripost.cpp +++ b/src/d/actor/d_a_obj_toripost.cpp @@ -869,7 +869,7 @@ void daObjTpost_c::modeReceiveDemoInit() { } void daObjTpost_c::modeReceiveDemo() { - if(dComIfGp_getEventManager().endCheckOld("DEFAULT_POST")) { + if(dComIfGp_evmng_endCheck("DEFAULT_POST")) { dLetter_read(m_letter[mNumReadable].mEventReg); mNumReadable = getReadableLetterNum(); dComIfGp_event_onEventFlag(8); diff --git a/src/d/actor/d_a_seatag.cpp b/src/d/actor/d_a_seatag.cpp index 6d4fa490f..c1def79ca 100644 --- a/src/d/actor/d_a_seatag.cpp +++ b/src/d/actor/d_a_seatag.cpp @@ -52,7 +52,7 @@ actor_process_profile_definition g_profile_SEATAG = { &g_fopAc_Method.base, 0x01DF, &l_daSeatag_Method, - fopAcStts_UNK40000_e | fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e, + fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e, fopAc_ACTOR_e, fopAc_CULLBOX_0_e, }; diff --git a/src/d/actor/d_a_tag_msg.cpp b/src/d/actor/d_a_tag_msg.cpp index 566131ab8..5fc89daf0 100644 --- a/src/d/actor/d_a_tag_msg.cpp +++ b/src/d/actor/d_a_tag_msg.cpp @@ -193,7 +193,7 @@ static s32 daTag_Msg_actionEvent(daTag_Msg_c* a_this) { l_msg->mMode = 0x13; dComIfGp_event_onEventFlag(8); if (a_this->getMessage() == 0x1902) { - daPy_getPlayerLinkActorClass()->mNoResetFlg0 &= 0xf7ffffff; + daPy_getPlayerLinkActorClass()->offPlayerNoDraw(); } if (a_this->getType2() & 1) { a_this->mAction = 0; @@ -217,7 +217,7 @@ static s32 daTag_Msg_actionHunt(daTag_Msg_c* a_this) { l_msg = 0; msg_mode = 0; if ((u32)a_this->getMessage() == 0x1902) { - daPy_getPlayerLinkActorClass()->mNoResetFlg0 |= 0x8000000; + daPy_getPlayerLinkActorClass()->onPlayerNoDraw(); } } else if (a_this->rangeCheck() != 0 && a_this->otherCheck() != 0) { if ((a_this->getType2() & 1) != 0) { diff --git a/src/d/d_bg_s_acch.cpp b/src/d/d_bg_s_acch.cpp index 099026b53..b805379d7 100644 --- a/src/d/d_bg_s_acch.cpp +++ b/src/d/d_bg_s_acch.cpp @@ -61,8 +61,8 @@ dBgS_Acch::dBgS_Acch() { m_tbl_size = 0; pm_acch_cir = NULL; m_roof_y = 0.0f; - m_roof_height = 0.0f; m_roof_crr_height = 0.0f; + m_roof_height = 0.0f; field_0xc8 = 200.0f; pm_angle = NULL; pm_shape_angle = NULL; @@ -162,15 +162,15 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { LineCheck(i_bgs); } - m_roof_crr_height = 1000000000.0f; + m_roof_height = 1000000000.0f; if (!(m_flags & ROOF_NONE)) { m_roof.SetExtChk(*(cBgS_Chk*)this); ClrRoofHit(); cXyz roofPos = *pm_pos; m_roof.SetPos(roofPos); m_roof_y = i_bgs.RoofChk(&m_roof); - if (m_roof_y != 1000000000.0f && pm_pos->y + m_roof_height > m_roof_y) { - m_roof_crr_height = m_roof_y - m_roof_height; + if (m_roof_y != 1000000000.0f && pm_pos->y + m_roof_crr_height > m_roof_y) { + m_roof_height = m_roof_y - m_roof_crr_height; SetRoofHit(); } } @@ -179,8 +179,8 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { ClrGroundFind(); GroundCheck(i_bgs); GroundRoofProc(i_bgs); - } else if (m_roof_crr_height < pm_pos->y) { - pm_pos->y = m_roof_crr_height; + } else if (m_roof_height < pm_pos->y) { + pm_pos->y = m_roof_height; } if (!(m_flags & WATER_NONE)) { diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index 31a54e950..af6ab7369 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -448,7 +448,7 @@ bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 spee return ret; } -bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName) { +bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName) { void* pSoundAnimRes = 0; bool ret = false; @@ -457,7 +457,7 @@ bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int a pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFileIdx); } - void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileIdx); pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); ret = true; @@ -560,15 +560,15 @@ u16 fopNpc_npc_c::talk(int param_1) { return mode; } -bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName) { +bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName) { if(0 <= soundFileIdx) { void* pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFileIdx); - void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileIdx); pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); } else { - void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileIdx); pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, 0); } @@ -800,7 +800,7 @@ void dNpc_EventCut_c::cutTurnToActorStart() { mSetId = 0; } - Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "OffsetPos"); + Vec* pos = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "OffsetPos"); if(pos) { mOffsetPos = *pos; } @@ -930,7 +930,7 @@ void dNpc_EventCut_c::cutMoveToActorStart() { u32* set = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "SetId"); f32* speed = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "Speed"); f32* dist = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "DelDistance"); - Vec* offs = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "OffsetPos"); + Vec* offs = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "OffsetPos"); u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); u32* noTurn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "NoTurn"); u32* angle = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "ShapeAngle"); @@ -1077,7 +1077,7 @@ fopAc_ac_c* dNpc_EventCut_c::findActorCallBack(fopAc_ac_c* pActor, void* pData) } void dNpc_EventCut_c::cutTurnToPosStart() { - Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "Pos"); + Vec* pos = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "Pos"); if(pos) { mPos = *pos; } @@ -1163,7 +1163,7 @@ void dNpc_EventCut_c::cutTurnToPosProc() { } void dNpc_EventCut_c::cutMoveToPosStart() { - Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "Pos"); + Vec* pos = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "Pos"); f32* speed = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "Speed"); f32* dist = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "DelDistance"); u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 7281398e9..733e36c6b 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -1342,7 +1342,7 @@ void mDoExt_McaMorf::setMorf(f32 param_0) { } /* 8001300C-800130D0 .text play__14mDoExt_McaMorfFP3VecUlSc */ -void mDoExt_McaMorf::play(Vec*, u32, s8) { +bool mDoExt_McaMorf::play(Vec*, u32, s8) { /* Nonmatching */ }