D_a_npc_tc matching for retail (#930)

* progress

* code matching non-demo

* cleanup for d_a_npc_tc and d_a_obj_smplbg
This commit is contained in:
Zeclos
2026-03-04 19:25:59 +01:00
committed by GitHub
parent d54d983a4a
commit dcf4862387
13 changed files with 2852 additions and 309 deletions
+223 -49
View File
@@ -2,37 +2,143 @@
#define D_A_NPC_TC_H
#include "f_op/f_op_actor.h"
#include "d/d_npc.h"
class daNpc_Tc_c : public fopAc_ac_c {
namespace daObjSmplbg { class Act_c; };
class daNpc_Tc_c : public fopNpc_npc_c {
public:
void getAttentionBasePos() {}
void getEyePos() {}
void incAttnSetCount() {}
void setAction(int (daNpc_Tc_c::*)(void*), void*) {}
void _searchTower(fopAc_ac_c*);
void initTexPatternAnm(bool);
enum Status {
STATUS_WAIT = 1,
STATUS_SIT = 2,
STATUS_TALK = 3,
STATUS_JUMP = 4,
STATUS_WALK_TO_JAIL = 5,
STATUS_TALK_NEAR_JAIL = 6,
STATUS_WAIT_NEAR_JAIL = 7,
STATUS_WALK_TO_STOOL = 8,
STATUS_SIT_TO_STOOL = 9,
STATUS_DEMO_JUMP = 10,
STATUS_DEMO_RESCUE = 11,
STATUS_DEMO_TALK = 12,
STATUS_PAY_RUPEE = 13,
STATUS_DEMO_PAY_RUPEE = 14,
STATUS_GET_RUPEE = 15,
STATUS_DEMO_GET_RUPEE = 16,
STATUS_MONUMENT_COMPLETE = 17,
STATUS_DEMO_MONUMENT_COMPLETE = 18,
};
enum ActionStatus {
ACTION_STARTING = 0,
ACTION_ONGOING = 1,
ACTION_ENDING = -1,
};
enum Type {
TYPE_NORMAL2 = 0,
TYPE_RED = 1,
TYPE_WHITE = 2,
TYPE_BLUE = 3,
TYPE_NORMAL = 4,
};
enum BckIdx {
BCK_IDX_WAIT01 = 0,
BCK_IDX_WAIT03 = 1,
BCK_IDX_WAIT02 = 2,
BCK_IDX_TALK01 = 3,
BCK_IDX_WALK01 = 4,
BCK_IDX_JAMP_A = 5,
BCK_IDX_JAMP_B = 6,
BCK_IDX_JAMP_C = 7,
BCK_IDX_GUARD = 8,
BCK_IDX_JTBT = 9,
BCK_IDX_HAPPY = 10,
BCK_IDX_DANCE01 = 11,
BCK_IDX_DANCE02 = 12,
BCK_IDX_GET = 13,
BCK_IDX_MAWASU = 14,
BCK_IDX_WAIT04 = 15,
BCK_IDX_TALK02 = 16,
};
enum AnmPrmIdx {
ANM_PRM_IDX_NONE = 0,
ANM_PRM_IDX_WAIT01 = 1,
ANM_PRM_IDX_WAIT03 = 2,
ANM_PRM_IDX_WAIT02 = 3,
ANM_PRM_IDX_TALK01 = 4,
ANM_PRM_IDX_WALK01 = 5,
ANM_PRM_IDX_JAMP_A = 6,
ANM_PRM_IDX_JAMP_B = 7,
ANM_PRM_IDX_JAMP_C1 = 8,
ANM_PRM_IDX_JAMP_C2 = 9,
ANM_PRM_IDX_GUARD = 10,
ANM_PRM_IDX_JTBT = 11,
ANM_PRM_IDX_HAPPY = 12,
ANM_PRM_IDX_DANCE01 = 13,
ANM_PRM_IDX_DANCE02 = 14,
ANM_PRM_IDX_GET = 15,
ANM_PRM_IDX_HAPPY2 = 16, // ANM_PRM_IDX_HAPPY gets set to this
ANM_PRM_IDX_DANCE01_TO_TALK01 = 17,
ANM_PRM_IDX_DANCE02_TO_WAIT03 = 18,
ANM_PRM_IDX_MAWASU = 19,
ANM_PRM_IDX_WAIT04 = 20,
ANM_PRM_IDX_TALK02 = 21,
ANM_PRM_IDX_TALK01_WAIT01 = 22, // loops 3x then -> WAIT01
ANM_PRM_IDX_TALK01_TALK02 = 23, // loops 5x then -> TALK02
};
typedef int (daNpc_Tc_c::*ActionFunc)(void*);
daNpc_Tc_c();
cXyz& getAttentionBasePos() { return mAttPos; }
cXyz& getEyePos() { return mEyePos; }
void incAttnSetCount() {
if (mAttnSetCount != 0xff) {
mAttnSetCount++;
}
}
BOOL setAction(ActionFunc actionFunc, void* arg) {
if (mCurrActionFunc != actionFunc) {
if (mCurrActionFunc != NULL) {
mActionStatus = ACTION_ENDING;
(this->*mCurrActionFunc)(arg);
}
mCurrActionFunc = actionFunc;
mActionStatus = ACTION_STARTING;
(this->*mCurrActionFunc)(arg);
}
return TRUE;
}
fopAc_ac_c* _searchTower(fopAc_ac_c*);
BOOL initTexPatternAnm(bool);
void playTexPatternAnm();
void smoke_set(float, float, float, float, float);
void smoke_set(f32, f32, f32, f32, f32);
void setAnm();
void setTexAnm();
void chkAttention(cXyz, short);
bool chkAttention(cXyz, s16);
void eventOrder();
void checkOrder();
void existTcMonument();
void anmAtr(unsigned short);
bool existTcMonument();
void anmAtr(u16);
void stopTower();
void startTower();
void next_msgStatusBlue(unsigned long*);
void next_msgStatusNormal(unsigned long*);
void next_msgStatus(unsigned long*);
void setFirstMsg(bool*, unsigned long, unsigned long);
void getMsgNormal();
void getMsgBlue();
void getMsg();
u16 next_msgStatusBlue(u32*);
u16 next_msgStatusNormal(u32*);
u16 next_msgStatus(u32*);
u32 setFirstMsg(bool*, u32, u32);
u32 getMsgNormal();
u32 getMsgBlue();
u32 getMsg();
void getArg();
void createInit();
void searchStoolPos(void*, void*);
static void* searchStoolPos(void*, void*);
void setAttention();
void calcMove();
void lookBack();
@@ -54,32 +160,37 @@ public:
void statusDemoJump();
void statusDemoRescue();
void statusDemoTalk();
void help_action(void*);
void wait_action(void*);
BOOL help_action(void*);
BOOL wait_action(void*);
void calc_sitpos();
void set_mtx();
BOOL _draw();
void setTower();
BOOL _execute();
BOOL _delete();
void isCreate();
bool isCreate();
cPhs_State _create();
void _createHeap();
void next_msgStatusNormal2(unsigned long*);
void getMsgNormal2();
void setRupeeSizeMsg();
void existUnknownCollectMap();
void analysisCollectMap();
void existKnownCollectMap();
void next_msgStatusWhite(unsigned long*);
void getMsgWhite();
void next_msgStatusRed(unsigned long*);
void setFinishMsg();
void getMsgRed();
void checkMonumentFee(unsigned short, unsigned short);
void checkAllMonumentFee();
void checkAllMonumentPay();
void checkMonumentPay(unsigned short, unsigned short);
BOOL _createHeap();
u16 next_msgStatusNormal2(u32*);
u32 getMsgNormal2();
#if VERSION != VERSION_DEMO
u32 setRupeeSizeMsg();
#endif
bool existUnknownCollectMap();
int analysisCollectMap();
bool existKnownCollectMap();
u16 next_msgStatusWhite(u32*);
u32 getMsgWhite();
u16 next_msgStatusRed(u32*);
u32 setFinishMsg();
u32 getMsgRed();
bool checkMonumentFee(u16, u16);
bool checkAllMonumentFee();
#if VERSION == VERSION_DEMO
bool checkOneMonumentGet();
#endif
int checkAllMonumentPay();
bool checkMonumentPay(u16, u16);
void cutProc();
void cutSitToJumpStart(int);
void cutSitToJumpProc(int);
@@ -101,15 +212,78 @@ public:
void cutPayProc(int);
public:
/* Place member variables here */
};
class daNpc_Tc_HIO_c {
public:
daNpc_Tc_HIO_c();
public:
/* Place member variables here */
};
/* 0x6C4 */ u8 field_0x6C4[0x6C8 - 0x6C4];
/* 0x6C8 */ BOOL field_0x6C8;
/* 0x6CC */ u8 mJtbtTimer;
/* 0x6CD */ u8 mTalk01Wait01Timer;
/* 0x6CE */ u8 mTalk01Talk02Timer;
/* 0x6CF */ s8 mStatus;
/* 0x6D0 */ ActionFunc mCurrActionFunc;
/* 0x6DC */ s8 mActionStatus;
/* 0x6DD */ u8 field_0x6DD[0x6E0 - 0x6DD];
/* 0x6E0 */ cXyz mSmokePos;
/* 0x6EC */ csXyz mSmokeAngle;
/* 0x6F2 */ u8 field_0x6F2[0x6F4 - 0x6F2];
/* 0x6F4 */ dPa_smokeEcallBack mSmokeCallBack;
/* 0x714 */ dPa_followEcallBack field_0x714;
/* 0x728 */ dPa_followEcallBack field_0x728;
/* 0x73C */ request_of_phase_process_class mPhs;
/* 0x744 */ u32 mShadowId;
#if VERSION == VERSION_DEMO
/* 0x748 */ J3DModel* mpModel;
#endif
/* 0x748 */ J3DAnmTexPattern* m_head_tex_pattern;
/* 0x74C */ mDoExt_btpAnm mBtpAnm;
/* 0x760 */ u8 mBlinkFrame;
/* 0x761 */ u8 field_0x761[0x762 - 0x761];
/* 0x762 */ s16 mBlinkTimer;
/* 0x764 */ cXyz mEyePos;
/* 0x770 */ cXyz mAttPos;
/* 0x77C */ u8 mAttnSetCount;
/* 0x77D */ u8 field_0x77D[0x780 - 0x77D];
/* 0x780 */ cXyz mStoolLookPos;
/* 0x78C */ s16 mMaxHeadTurnVelocity;
/* 0x78E */ u8 field_0x78E[0x790 - 0x78E];
/* 0x790 */ csXyz field_0x790;
/* 0x796 */ u8 field_0x796[0x798 - 0x796];
/* 0x798 */ s8 field_0x798;
/* 0x799 */ u8 field_0x799[0x79C - 0x799];
/* 0x79C */ f32 mTargetSpeed;
/* 0x7A0 */ cXyz mStoolPos;
/* 0x7AC */ cXyz mSitPos;
/* 0x7B8 */ cXyz mWalkToStoolPos;
/* 0x7C4 */ cXyz mDeltaPos;
/* 0x7D0 */ u8 field_0x7D0[0x7DC - 0x7D0];
/* 0x7DC */ cXyz mParticlePos;
/* 0x7E8 */ bool mHasAttention;
/* 0x7E9 */ bool mTalkingNearJail;
/* 0x7EA */ u8 field_0x7EA[0x7F1 - 0x7EA];
/* 0x7F1 */ bool mHasTalkedNearJail;
/* 0x7F2 */ bool mHasEnteredSitRadius;
/* 0x7F3 */ s8 mJumpLandingTimer;
/* 0x7F4 */ u8 field_0x7F4[0x7F6 - 0x7F4];
/* 0x7F6 */ s8 mTexPatternNum;
/* 0x7F7 */ s8 mTexPatternNumIdx;
/* 0x7F8 */ s8 mBckIdx;
/* 0x7F9 */ s8 mAnmPrmIdx;
/* 0x7FA */ s8 mOldAnmPrmIdx;
/* 0x7FB */ s8 mEventIdx;
/* 0x7FC */ u8 mType;
/* 0x7FD */ u8 field_0x7FD[0x804 - 0x7FD];
/* 0x804 */ daObjSmplbg::Act_c* m_tower_actor;
/* 0x808 */ bool field_0x808;
/* 0x809 */ bool field_0x809;
/* 0x80A */ u8 field_0x80A[0x80B - 0x80A];
/* 0x80B */ bool field_0x80B;
/* 0x80C */ u8 field_0x80C;
/* 0x80D */ bool field_0x80D;
/* 0x80E */ bool field_0x80E;
/* 0x80F */ bool field_0x80F;
/* 0x810 */ bool field_0x810;
/* 0x811 */ bool field_0x811;
/* 0x812 */ bool field_0x812;
/* 0x813 */ bool field_0x813;
/* 0x814 */ bool field_0x814;
/* 0x815 */ u8 field_0x815[0x81C - 0x815];
}; // Size: 0x81C
#endif /* D_A_NPC_TC_H */
+4 -4
View File
@@ -33,9 +33,9 @@ namespace daObjSmplbg {
static const Attr_c M_attr[];
inline const Attr_c& attr() const { return M_attr[mType]; }
void isStop() {}
void offStop() {}
void onStop() {}
bool isStop() { return mIsStop; }
void offStop() { mIsStop = false; }
void onStop() { mIsStop = true; }
int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W , PRM_TYPE_S);}
virtual BOOL CreateHeap();
@@ -53,7 +53,7 @@ namespace daObjSmplbg {
/* 0x2C8 */ request_of_phase_process_class mPhs;
/* 0x2D0 */ J3DModel* mpModel;
/* 0x2D4 */ int mType;
/* 0x2D8 */ u8 field_0x2D8;
/* 0x2D8 */ bool mIsStop;
/* 0x2D9 */ u8 field_0x2D9[0x2DC - 0x2D9];
}; // Size: 0x2DC
};
+4
View File
@@ -1108,6 +1108,10 @@ inline BOOL dComIfGs_isCollectMapTriforce(int i_no) {
return g_dComIfG_gameInfo.save.getPlayer().getMap().isTriforce(i_no - 1);
}
inline void dComIfGs_onCollectMapTriforce(int i_no) {
g_dComIfG_gameInfo.save.getPlayer().getMap().onTriforce(i_no -1);
}
inline void dComIfGs_offCollectMapTriforce(int i_no) {
g_dComIfG_gameInfo.save.getPlayer().getMap().offTriforce(i_no - 1);
}
+12
View File
@@ -161,6 +161,10 @@ public:
return mpEvtStaffName;
}
int getNowCut() {
return mCurActIdx;
}
bool getAttnFlag() {
return mbAttention;
}
@@ -169,6 +173,14 @@ public:
mbAttention = flag;
}
void setAttnNoTurnFlag(bool flag) {
mbNoTurn = flag;
}
f32 getMoveSpeed() {
return mSpeed;
}
cXyz getAttnPos() {
return mPos;
}
+4 -4
View File
@@ -126,10 +126,10 @@ enum {
/* 0x76 */ DSNAP_TYPE_UNK76,
/* 0x77 */ DSNAP_TYPE_UNK77,
/* 0x78 */ DSNAP_TYPE_UNK78,
/* 0x79 */ DSNAP_TYPE_UNK79,
/* 0x7A */ DSNAP_TYPE_UNK7A,
/* 0x7B */ DSNAP_TYPE_UNK7B,
/* 0x7C */ DSNAP_TYPE_UNK7C,
/* 0x79 */ DSNAP_TYPE_TC_NORMAL,
/* 0x7A */ DSNAP_TYPE_TC_RED,
/* 0x7B */ DSNAP_TYPE_TC_BLUE,
/* 0x7C */ DSNAP_TYPE_TC_WHITE,
/* 0x7D */ DSNAP_TYPE_UNK7D,
/* 0x7E */ DSNAP_TYPE_ROTEN,
/* 0x7F */ DSNAP_TYPE_UNK7F,
+1 -1
View File
@@ -370,7 +370,7 @@ public:
void changeAnm(J3DAnmTransform* bckAnm) { mpAnm = bckAnm; }
J3DAnmTransform* getAnm() { return mpAnm; }
f32 getMorfRatio() { return mCurMorf; }
BOOL isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); }
bool isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); }
BOOL isMorf() { return mCurMorf < 1.0f; }
private: