diff --git a/include/d/d_attention.h b/include/d/d_attention.h index 6d8679b54..016d19218 100644 --- a/include/d/d_attention.h +++ b/include/d/d_attention.h @@ -177,7 +177,7 @@ public: void LockEdge() {} void changeOwner() {} void chkEnemySound() {} - void getCatchChgItem() {} + u8 getCatchChgItem() { return mCatch.getChangeItem(); } void getCatghTarget() {} void getLookTarget() {} void getLook2Target() {} diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 0192f1a9b..8f3705ac4 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -75,7 +75,7 @@ enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced ALWAYS_BCK_YJ_LOOP=0x19, ALWAYS_BCK_YJ_OUT=0x1A, ALWAYS_BCK_YJ_SCALE=0x1B, - + /* BDL */ ALWAYS_BDL_ARROWITEM=0x1E, ALWAYS_BDL_FA=0x1F, @@ -91,7 +91,7 @@ enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced ALWAYS_BDL_VHAPL=0x29, ALWAYS_BDL_VHRTL=0x2A, ALWAYS_BDL_VKEYL=0x2B, - + /* BDLM */ ALWAYS_BDL_IB=0x2E, ALWAYS_BDL_MPA_SIMI=0x2F, @@ -110,17 +110,17 @@ enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced ALWAYS_BDL_YA=0x3C, ALWAYS_BDL_YAZIRUSHI_01=0x3D, ALWAYS_BDL_YTHDR00=0x3E, - + /* BMTM */ ALWAYS_BMT_ICE=0x41, - + /* BPK */ ALWAYS_BPK_YJ_DELETE=0x44, ALWAYS_BPK_YJ_IN=0x45, ALWAYS_BPK_YJ_LOOP=0x46, ALWAYS_BPK_YJ_OUT=0x47, ALWAYS_BPK_YJ_SCALE=0x48, - + /* BRK */ ALWAYS_BRK_IB_01=0x4B, ALWAYS_BRK_IB_02=0x4C, @@ -130,7 +130,7 @@ enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced ALWAYS_BRK_VHANL=0x50, ALWAYS_BRK_VLUPL=0x51, ALWAYS_BRK_YTHDR00=0x52, - + /* BTK */ ALWAYS_BTK_EFA_USONAMI_01=0x55, ALWAYS_BTK_IB=0x56, @@ -144,17 +144,17 @@ enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced ALWAYS_BTK_W_PILLAR_A=0x5E, ALWAYS_BTK_YA=0x5F, ALWAYS_BTK_YTHDR00=0x60, - + /* BTP */ ALWAYS_BTP_MPA_SIMI=0x63, ALWAYS_BTP_MPI_KIBAKO_TARU=0x64, ALWAYS_BTP_MPI_KINOHAHEN=0x65, ALWAYS_BTP_MPI_KOISHI=0x66, ALWAYS_BTP_MPM_TUBO=0x67, - + /* DAT */ ALWAYS_BIN_ITEM_TABLE=0x6A, - + /* TEX */ ALWAYS_BTI_AK_HOUSHI00=0x6D, ALWAYS_BTI_AK_SMOKE01=0x6E, @@ -337,7 +337,7 @@ public: void removeWood(); void executeWood(); void drawWood(); - + BOOL checkCameraAttentionStatus(int idx, u32 flag) { return mCameraInfo[idx].mCameraAttentionStatus & flag; } @@ -435,7 +435,7 @@ public: dTimer_c* getTimerPtr() { return mTimerInfo.mTimerPtr; } s32 getTimerMode() { return mTimerInfo.mTimerMode; } - + s16 getItemMagicCount() { return mItemMagicCount; } void setItemMagicCount(s16 magic) { mItemMagicCount += magic; } s16 getItemMaxMagicCount() { return mItemMaxMagicCount; } @@ -445,10 +445,10 @@ public: f32 getItemLifeCount() { return mItemLifeCount; } void setItemLifeCount(f32 num) { mItemLifeCount += num; } - + s16 getItemMaxLifeCount() { return mItemMaxLifeCount; } void setItemMaxLifeCount(s16 num) { mItemMaxLifeCount += num; } - + s16 getItemArrowNumCount() { return mItemArrowNumCount; } void setItemArrowNumCount(s16 num) { mItemArrowNumCount += num; } @@ -465,7 +465,7 @@ public: u8 getSelectItem(int idx) { return mSelectItem[idx]; } void setSelectItem(int idx, u8 itemNo) { mSelectItem[idx] = itemNo; } void setSelectEquip(int idx, u8 itemNo) { mSelectEquip[idx] = itemNo; } - + void setItem(u8 i_slot, u8 i_itemNo) { mItemSlot = i_slot; mItemNo = i_itemNo; @@ -474,6 +474,7 @@ public: void setAStatus(u8 status) { mCurrButtonBAction = status; } void setDoStatus(u8 status) { mCurrButtonAAction = status; } void setRStatusForce(u8 status) { field_0x4930 = status; } + inline u8 getPictureStatus() { return mPictureStatus; } u8 getScopeType() { return mbCamOverrideFarPlane; } void setScopeType(u8 v) { mbCamOverrideFarPlane = v; } @@ -672,7 +673,7 @@ public: /* 0x495B */ u8 field_0x495b; /* 0x495C */ u8 field_0x495c; /* 0x495D */ u8 field_0x495d; - /* 0x495E */ u8 field_0x495e; + /* 0x495E */ u8 mPictureStatus; /* 0x495F */ u8 field_0x495f; /* 0x4960 */ u8 field_0x4960; /* 0x4961 */ u8 field_0x4961; @@ -2133,7 +2134,7 @@ inline void dComIfGp_setSelectItem(int i_btnIdx) { int invIdx = dComIfGs_getSelectItem(i_btnIdx); u8 itemNo = dComIfGs_getItem(invIdx); g_dComIfG_gameInfo.play.setSelectItem(i_btnIdx, itemNo); - + invIdx = dComIfGs_getSelectItem(i_btnIdx); itemNo = dComIfGs_getItem(invIdx); if (itemNo == 0xFF) { @@ -2177,6 +2178,10 @@ inline void dComIfGp_setRStatusForce(u8 status) { g_dComIfG_gameInfo.play.setRStatusForce(status); } +inline u8 dComIfGp_getPictureStatus() { + return g_dComIfG_gameInfo.play.getPictureStatus(); +} + inline s16 dComIfGp_getMiniGameRupee() { return g_dComIfG_gameInfo.play.getMiniGameRupee(); } @@ -2436,6 +2441,14 @@ inline BOOL dComIfGp_evmng_existence(s16 eventIdx) { return g_dComIfG_gameInfo.play.getEvtManager().getEventData(eventIdx) != NULL; } +inline BOOL dComIfGp_evmng_order(s16 eventIdx) { + return g_dComIfG_gameInfo.play.getEvtManager().order(eventIdx); +} + +inline u8 dComIfGp_evmng_getEventEndSound(s16 eventIdx) { + return g_dComIfG_gameInfo.play.getEvtManager().getEventEndSound(eventIdx); +} + /** * === DRAWLIST === */ @@ -2896,6 +2909,10 @@ inline void dComIfGp_att_CatchRequest(fopAc_ac_c* param_0, u8 param_1, f32 param attention.CatchRequest(param_0, param_1, param_2, param_3, param_4,param_5, param_6); } +inline u8 dComIfGp_att_getCatchChgItem() { + return g_dComIfG_gameInfo.play.getAttention().getCatchChgItem(); +} + /** * === MISC === */ diff --git a/include/d/d_event.h b/include/d/d_event.h index 702f36d2c..fc85957db 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -21,6 +21,12 @@ enum dEvtType_e { /* 0x0A */ dEvtType_CHANGE_e, }; +enum { + dEvtMove_NOMOVE_e, + dEvtMove_MOVE_e, + dEvtMove_FORCE_e, +}; + class dEvt_order_c { public: ~dEvt_order_c() {} @@ -37,6 +43,8 @@ public: /* 0x15 */ u8 mEventInfoIdx; }; // Size = 0x18 +class dStage_Event_dt_c; + class dEvt_control_c { public: dEvt_control_c(); @@ -44,36 +52,36 @@ public: s32 orderOld(u16, u16, u16, u16, void*, void*, const void*); s32 order(u16, u16, u16, u16, void*, void*, s16, u8); void setParam(dEvt_order_c*); - void beforeFlagProc(dEvt_order_c*); - void afterFlagProc(dEvt_order_c*); - void commonCheck(dEvt_order_c*, u16, u16); - void talkCheck(dEvt_order_c*); - void talkXyCheck(dEvt_order_c*); - void photoCheck(dEvt_order_c*); - void catchCheck(dEvt_order_c*); - void talkEnd(); - void demoCheck(dEvt_order_c*); - void demoEnd(); - void potentialCheck(dEvt_order_c*); - void doorCheck(dEvt_order_c*); - void itemCheck(dEvt_order_c*); - void endProc(); - void checkChange(); - void changeProc(); - void checkStart(); - void soundProc(); - void check(); - void photoCheck(); + BOOL beforeFlagProc(dEvt_order_c*); + BOOL afterFlagProc(dEvt_order_c*); + BOOL commonCheck(dEvt_order_c*, u16, u16); + BOOL talkCheck(dEvt_order_c*); + BOOL talkXyCheck(dEvt_order_c*); + BOOL photoCheck(dEvt_order_c*); + BOOL catchCheck(dEvt_order_c*); + BOOL talkEnd(); + BOOL demoCheck(dEvt_order_c*); + BOOL demoEnd(); + BOOL potentialCheck(dEvt_order_c*); + BOOL doorCheck(dEvt_order_c*); + BOOL itemCheck(dEvt_order_c*); + BOOL endProc(); + BOOL checkChange(); + BOOL changeProc(); + BOOL checkStart(); + BOOL soundProc(); + BOOL check(); + BOOL photoCheck(); s32 moveApproval(void*); BOOL compulsory(void*, const char*, u16); void remove(); - void getStageEventDt(); - void nextStageEventDt(void*); + dStage_Event_dt_c* getStageEventDt(); + dStage_Event_dt_c* nextStageEventDt(void*); int getPId(void*); fopAc_ac_c * convPId(unsigned int); - void getTactFreeMStick(int); - void getTactFreeCStick(int); - void giveItemCut(u8); + u8 getTactFreeMStick(int); + u8 getTactFreeCStick(int); + bool giveItemCut(u8); u8 getTalkXYBtn() { return mTalkButton; } bool chkTalkXY() { return mTalkButton == 1 || mTalkButton == 2 || mTalkButton == 3; } @@ -86,7 +94,7 @@ public: f32 getCullRate() { return mCullFarClipRatio; } void setCullRate(f32 ratio) { mCullFarClipRatio = ratio; } - + u16 chkEventFlag(u16 flag) { return flag & mEventFlag; } void onEventFlag(u16 flag) { mEventFlag |= flag; } void offEventFlag(u16 flag) { mEventFlag &= ~flag; } @@ -95,8 +103,8 @@ public: bool runCheck() { return mMode != 0; } /* 0x00 */ dEvt_order_c mOrder[8]; - /* 0xC0 */ u8 mOrderCount; - /* 0xC1 */ u8 mFirstOrderIdx; + /* 0xC0 */ s8 mOrderCount; + /* 0xC1 */ s8 mFirstOrderIdx; /* 0xC2 */ u8 mMode; /* 0xC3 */ u8 mbEndProc; /* 0xC4 */ u32 mPt1; @@ -105,22 +113,22 @@ public: /* 0xD0 */ u32 mPtItem; /* 0xD4 */ u8 mGetItemNo; /* 0xD5 */ u8 field_0xD5[0xD6 - 0xD5]; - /* 0xD6 */ s16 field_0xd6; + /* 0xD6 */ s16 mHindFlag; /* 0xD8 */ s16 mEventId; /* 0xDA */ u8 mEventEndSound; /* 0xDB */ u8 field_0xdb; /* 0xDC */ u8 field_0xdc; /* 0xDD */ u8 field_0xdd; /* 0xDE */ u8 field_0xde; - /* 0xDF */ u8 field_0xdf; + /* 0xDF */ u8 mEventInfoIdx; /* 0xE0 */ u8 mTalkButton; /* 0xE1 */ u8 mItemNo; /* 0xE2 */ u8 mbInPhoto; /* 0xE3 */ u8 field_0xE3[0xE4 - 0xE3]; /* 0xE4 */ f32 mCullFarClipRatio; /* 0xE8 */ u16 mEventFlag; - /* 0xEA */ u8 mTactFreeMStick[4]; - /* 0xEE */ u8 mTactFreeCStick[4]; + /* 0xEA */ u8 mTactFreeMStick[5]; + /* 0xEF */ u8 mTactFreeCStick[4]; }; // Size = 0xF4 #endif /* D_EVENT_D_EVENT_H */ diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index 33bdf6a6a..3ede9bcfb 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -39,7 +39,7 @@ public: void runProc(); dEvDtEvent_c* getEventData(s16); s16 getEventIdx(const char*, u8); - void order(s16); + BOOL order(s16); BOOL startCheck(s16); BOOL startCheckOld(const char*); BOOL endCheck(s16); @@ -54,7 +54,7 @@ public: void getMySubstanceNum(int, const char*); void cutEnd(int); u16 getEventPrio(s16); - void getEventEndSound(s16); + u8 getEventEndSound(s16); void exceptionProc(); void issueStaff(const char*); void cancelStaff(const char*); diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 007cdea99..6ce31b5fe 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -283,9 +283,9 @@ struct dStage_MemoryConfig_c { struct dStage_DMap_c {}; -struct dStage_EventInfo_c { - /* 0x0 */ int field_0x0; - /* 0x1 */ char* mName; +struct dStage_Event_dt_c { + /* 0x00 */ u8 field_0x0; + /* 0x04 */ char mName[15]; /* 0x10 */ u8 field_0x10; /* 0x11 */ u8 field_0x11; /* 0x12 */ u8 field_0x12; @@ -296,6 +296,11 @@ struct dStage_EventInfo_c { /* 0x17 */ u8 field_0x17; }; // Size: 0x18 +struct dStage_EventInfo_c { + /* 0x00 */ s32 num; + /* 0x04 */ dStage_Event_dt_c* events; +}; // Size: 0x08 + struct dStage_Ship_data { /* 0x0 */ cXyz m_pos; /* 0xC */ s16 m_angle; diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 4af6840f0..c8b93fe06 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -17,12 +17,14 @@ struct actor_method_class { enum fopAc_Status_e { // Note: The lowest 5 bits of the status field (& 0x1F) act as an index controlling the map icon type. fopAcStts_SHOWMAP_e = 0x00000020, + fopAcStts_UNK40_e = 0x00000040, fopAcStts_NOCULLEXEC_e = 0x00000080, fopAcStts_CULL_e = 0x00000100, fopAcStts_FREEZE_e = 0x00000400, fopAcStts_UNK800_e = 0x00000800, fopAcStts_CARRY_e = 0x00002000, fopAcStts_UNK4000_e = 0x00004000, + fopAcStts_FORCEMOVE_e = 0x00008000, fopAcStts_NOPAUSE_e = 0x00020000, fopAcStts_UNK40000_e = 0x00040000, fopAcStts_UNK80000_e = 0x00080000, @@ -123,6 +125,7 @@ enum dEvt_Condition_e { dEvtCnd_CANDOOR_e = 0x0004, dEvtCnd_CANGETITEM_e = 0x0008, dEvtCnd_CANTALKITEM_e = 0x0020, + dEvtCnd_CANCATCH_e = 0x0040, }; // TODO: move to d_event.h @@ -148,6 +151,11 @@ public: BOOL chkCondition(u16 condition) { return (mCondition & condition) == condition; } void onCondition(u16 cond) { mCondition |= cond; } void offCondition(u16 cond) { mCondition &= ~cond; } + s16 runPhotoEventCB(void* ac, int flag) { + if (mpPhotoCB == NULL) + return -1; + return mpPhotoCB(ac, flag); + } BOOL checkCommandTalk() { return mCommand == dEvtCmd_INTALK_e; } BOOL checkCommandItem() { return mCommand == dEvtCmd_INGETITEM_e; } diff --git a/src/d/actor/d_a_tag_msg.cpp b/src/d/actor/d_a_tag_msg.cpp index b5f1c3975..73e8d4c69 100644 --- a/src/d/actor/d_a_tag_msg.cpp +++ b/src/d/actor/d_a_tag_msg.cpp @@ -56,10 +56,10 @@ const char* daTag_Msg_c::myDemoName() { if (getMessage() == 0x1902) { return "RT_TALK"; } - if (pEventInfo == NULL || (int)eventNo == 0xff || pEventInfo->field_0x0 < (int)eventNo) { + if (pEventInfo == NULL || (int)eventNo == 0xff || pEventInfo->num < (int)eventNo) { return "DEFAULT_MSG"; } - return pEventInfo->mName + eventNo * 0x18 + 1; + return pEventInfo->events[eventNo].mName; } u16 daTag_Msg_c::getMessage() { diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index eb355f175..d070bec4b 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -155,7 +155,7 @@ void dComIfG_play_c::itemInit() { field_0x495b = 0; field_0x495c = 0; field_0x495d = 0; - field_0x495e = 0; + mPictureStatus = 0; field_0x495f = 0; field_0x4960 = 0; field_0x4961 = 0; diff --git a/src/d/d_event.cpp b/src/d/d_event.cpp index ae542fc35..88d3b5a9b 100644 --- a/src/d/d_event.cpp +++ b/src/d/d_event.cpp @@ -4,8 +4,19 @@ // #include "d/d_event.h" -#include "dolphin/types.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/actor/d_a_itembase.h" #include "f_op/f_op_actor.h" // dEvt_info_c +#include "f_op/f_op_actor_mng.h" +#include "f_pc/f_pc_manager.h" + +enum { + dEvtFlag_NOPARTNER_e = 0x01, + dEvtFlag_STAFF_ALL_e = 0x02, + dEvtFlag_TALK_e = 0x04, + dEvtFlag_UNK8_e = 0x08, +}; /* 8006FE04-8006FE54 .text __ct__14dEvt_control_cFv */ dEvt_control_c::dEvt_control_c() { @@ -16,133 +27,483 @@ dEvt_control_c::dEvt_control_c() { dEvt_order_c::dEvt_order_c() {} /* 8006FE58-8006FEE8 .text orderOld__14dEvt_control_cFUsUsUsUsPvPvPCv */ -s32 dEvt_control_c::orderOld(u16, u16, u16, u16, void*, void*, const void*) { - /* Nonmatching */ +s32 dEvt_control_c::orderOld(u16 eventType, u16 priority, u16 flag, u16 hindFlag, void* ac1, void* ac2, const void* eventName) { + s32 eventIdx = dComIfGp_evmng_getEventIdx((const char*)eventName, 0xFF); + return order(eventType, priority, flag, hindFlag, ac1, ac2, eventIdx, 0xFF); } /* 8006FEE8-8007002C .text order__14dEvt_control_cFUsUsUsUsPvPvsUc */ -s32 dEvt_control_c::order(u16, u16, u16, u16, void*, void*, s16, u8) { +s32 dEvt_control_c::order(u16 eventType, u16 priority, u16 flag, u16 hindFlag, void* ac1, void* ac2, s16 eventIdx, u8 eventInfoIdx) { /* Nonmatching */ + if (mOrderCount >= 8) + return FALSE; + + dEvt_order_c* pNewOrder = &mOrder[mOrderCount]; + pNewOrder->mEventType = eventType; + pNewOrder->mPriority = priority; + pNewOrder->mFlag = flag; + pNewOrder->mActor1 = (fopAc_ac_c*)ac1; + pNewOrder->mActor2 = (fopAc_ac_c*)ac2; + pNewOrder->mEventId = eventIdx; + pNewOrder->mHindFlag = hindFlag; + pNewOrder->mEventInfoIdx = eventInfoIdx; + + if (pNewOrder->mPriority == 0) + JUT_ASSERT(0x93, 0); + + if (mOrderCount == 0) { + mFirstOrderIdx = 0; + pNewOrder->mNextOrderIdx = 0xFF; + } else { + u32 queueIdx = mFirstOrderIdx; + dEvt_order_c* pQueue = &mOrder[queueIdx]; + if (pNewOrder->mPriority < pQueue->mPriority) { + mFirstOrderIdx = mOrderCount; + pNewOrder->mNextOrderIdx = queueIdx; + } else { + while ((queueIdx = pQueue->mNextOrderIdx) < 0xFF) { + pQueue = &mOrder[queueIdx]; + if (pNewOrder->mPriority < pQueue->mPriority) + break; + } + + pNewOrder->mNextOrderIdx = queueIdx; + pQueue->mNextOrderIdx = mOrderCount; + } + } + mOrderCount++; + return TRUE; } /* 8007002C-8007015C .text setParam__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::setParam(dEvt_order_c*) { - /* Nonmatching */ +void dEvt_control_c::setParam(dEvt_order_c* order) { + dStage_EventInfo_c* stageEventInfo = dComIfGp_getStageEventInfo(); + mPt1 = getPId(order->mActor1); + mPt2 = getPId(order->mActor2); + mEventId = order->mEventId; + mHindFlag = order->mHindFlag; + if (dComIfGp_getPlayer(0) != order->mActor1) { + mPtTalk = getPId(order->mActor1); + mPtItem = getPId(order->mActor1); + } else { + mPtTalk = getPId(order->mActor2); + mPtItem = getPId(order->mActor2); + } + + mEventInfoIdx = order->mEventInfoIdx; + + if (order->mEventInfoIdx == 0xFF || stageEventInfo == NULL || order->mEventInfoIdx >= stageEventInfo->num) + field_0xde = 0xFF; + else + field_0xde = stageEventInfo->events[order->mEventInfoIdx].field_0x10; + + mCullFarClipRatio = 1.0f; + mEventFlag = 0; } /* 8007015C-8007018C .text beforeFlagProc__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::beforeFlagProc(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::beforeFlagProc(dEvt_order_c* order) { + fopAc_ac_c* actor2 = order->mActor2; + if ((order->mFlag & dEvtFlag_TALK_e) && !actor2->mEvtInfo.chkCondition(dEvtCnd_CANTALK_e)) + return false; + return true; } /* 8007018C-80070218 .text afterFlagProc__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::afterFlagProc(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::afterFlagProc(dEvt_order_c* order) { + if ((order->mFlag & dEvtFlag_NOPARTNER_e)) + mPt2 = getPId(NULL); + + if ((order->mFlag & dEvtFlag_STAFF_ALL_e)) + g_dComIfG_gameInfo.play.getEvtManager().issueStaff("ALL"); + + if ((order->mFlag & dEvtFlag_UNK8_e)) + onEventFlag(0x20); } /* 80070218-80070290 .text commonCheck__14dEvt_control_cFP12dEvt_order_cUsUs */ -void dEvt_control_c::commonCheck(dEvt_order_c*, u16, u16) { - /* Nonmatching */ +BOOL dEvt_control_c::commonCheck(dEvt_order_c* order, u16 cond, u16 cmd) { + fopAc_ac_c* actor1 = order->mActor1; + fopAc_ac_c* actor2 = order->mActor2; + if (actor1 != NULL && actor1->mEvtInfo.chkCondition(cond) && actor2 != NULL && actor2->mEvtInfo.chkCondition(cond)) { + actor1->mEvtInfo.setCommand(cmd); + actor2->mEvtInfo.setCommand(cmd); + setParam(order); + return TRUE; + } else { + return FALSE; + } } /* 80070290-80070390 .text talkCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::talkCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::talkCheck(dEvt_order_c* order) { + const char* defaultEventName = "DEFAULT_TALK"; + fopAc_ac_c* actor2 = order->mActor2; + if (commonCheck(order, dEvtCnd_CANTALK_e, dEvtCmd_INTALK_e)) { + mMode = 1; + if (mEventId == -1) { + if (actor2 != NULL && actor2->mEvtInfo.getEventName() != NULL) { + mEventId = actor2->mEvtInfo.getEventId(); + } else { + mEventId = dComIfGp_evmng_getEventIdx(defaultEventName, 0xFF); + } + } + + if (!dComIfGp_evmng_order(mEventId)) + JUT_ASSERT(0x145, 0); + + return TRUE; + } else { + return FALSE; + } } /* 80070390-8007055C .text talkXyCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::talkXyCheck(dEvt_order_c*) { +BOOL dEvt_control_c::talkXyCheck(dEvt_order_c* order) { /* Nonmatching */ + const char* defaultEventName = "DEFAULT_TALK_XY"; + OSReport("DEFAULT_TALK_XY"); } /* 8007055C-800706D8 .text photoCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::photoCheck(dEvt_order_c*) { +BOOL dEvt_control_c::photoCheck(dEvt_order_c* order) { /* Nonmatching */ + fopAc_ac_c* actor2 = order->mActor2; + const char* defaultEventName = "DEFAULT_TALK"; + + mbInPhoto = 0; + + if (dComIfGp_getPictureStatus() == 1) { + JUT_ASSERT(0x1a5, actor2); + if (!commonCheck(order, dEvtCnd_CANTALK_e, dEvtCmd_INTALK_e)) + return FALSE; + + s16 eventId = actor2->mEvtInfo.runPhotoEventCB(actor2, 0); + if (eventId != -1) { + mEventId = eventId; + } else { + mEventId = dComIfGp_evmng_getEventIdx(defaultEventName, 0xFF); + } + + if (!dComIfGp_evmng_order(mEventId)) + JUT_ASSERT(0x1b5, 0); + + mbInPhoto = 1; + mMode = 1; + return TRUE; + } + + return dComIfGp_getPictureStatus() ? TRUE : FALSE; } /* 800706D8-800707C0 .text catchCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::catchCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::catchCheck(dEvt_order_c* order) { + fopAc_ac_c* actor2 = order->mActor2; + fopAc_ac_c* actor1 = order->mActor1; + + if (actor1 == NULL || (actor2 != NULL && !actor2->mEvtInfo.chkCondition(dEvtCnd_CANCATCH_e))) + return FALSE; + + actor1->mEvtInfo.setCommand(dEvtCmd_INCATCH_e); + if (actor2 != NULL) + actor2->mEvtInfo.setCommand(dEvtCmd_INCATCH_e); + setParam(order); + mItemNo = dComIfGp_att_getCatchChgItem(); + mMode = 2; + if (mEventId != -1 && !dComIfGp_evmng_order(mEventId)) + JUT_ASSERT(0x1e3, 0); + onEventFlag(0x80); + return TRUE; } /* 800707C0-80070870 .text talkEnd__14dEvt_control_cFv */ -void dEvt_control_c::talkEnd() { - /* Nonmatching */ +BOOL dEvt_control_c::talkEnd() { + fopAc_ac_c* actor1 = convPId(mPt1); + if (actor1 != NULL) + actor1->mEvtInfo.setCommand(dEvtCmd_NONE_e); + fopAc_ac_c* actor2 = convPId(mPt2); + if (actor2 != NULL) + actor2->mEvtInfo.setCommand(dEvtCmd_NONE_e); + if (mEventId != -1) { + g_dComIfG_gameInfo.play.getEvtManager().endProc(mEventId, 1); + mEventId = -1; + } + fopAc_ac_c* itemPartner = fopAcM_getItemEventPartner(NULL); + if (itemPartner != NULL && (fopAcM_GetName(itemPartner) == PROC_ITEM || fopAcM_GetName(itemPartner) == PROC_Demo_Item)) + ((daItemBase_c*)itemPartner)->dead(); + return TRUE; } /* 80070870-800709C0 .text demoCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::demoCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::demoCheck(dEvt_order_c* order) { + fopAc_ac_c* actor1 = order->mActor1; + fopAc_ac_c* actor2 = order->mActor2; + s16 eventId = order->mEventId; + + if (actor2 == NULL) { + JUT_ASSERT(0x21f, 0); + return FALSE; + } + + if (!beforeFlagProc(order)) + return FALSE; + + if (!dComIfGp_evmng_order(eventId)) + return FALSE; + + if (actor1 != NULL) + actor1->mEvtInfo.setCommand(dEvtCmd_INDEMO_e); + if (actor2 != NULL) + actor2->mEvtInfo.setCommand(dEvtCmd_INDEMO_e); + + mMode = 2; + setParam(order); + afterFlagProc(order); + + u8 eventEndSound = dComIfGp_evmng_getEventEndSound(eventId); + if (eventEndSound != 0 && mEventEndSound == 0) { + mEventEndSound = eventEndSound; + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + return TRUE; } /* 800709C0-80070A64 .text demoEnd__14dEvt_control_cFv */ -void dEvt_control_c::demoEnd() { - /* Nonmatching */ +BOOL dEvt_control_c::demoEnd() { + fopAc_ac_c* actor1 = convPId(mPt1); + if (actor1 != NULL) + actor1->mEvtInfo.setCommand(dEvtCmd_NONE_e); + fopAc_ac_c* actor2 = convPId(mPt2); + if (actor2 != NULL) + actor2->mEvtInfo.setCommand(dEvtCmd_NONE_e); + if (mEventId != -1) { + g_dComIfG_gameInfo.play.getEvtManager().endProc(mEventId, 1); + mEventId = -1; + } + g_dComIfG_gameInfo.play.getEvtManager().cancelStaff("ALL"); + return TRUE; } /* 80070A64-80070B24 .text potentialCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::potentialCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::potentialCheck(dEvt_order_c* order) { + fopAc_ac_c* actor1 = order->mActor1; + fopAc_ac_c* actor2 = order->mActor2; + if (actor1 == NULL || actor2 == NULL) + JUT_ASSERT(0x280, 0); + + if (!beforeFlagProc(order)) + return FALSE; + + actor1->mEvtInfo.setCommand(dEvtCmd_INDEMO_e); + mMode = 2; + setParam(order); + afterFlagProc(order); + return TRUE; } /* 80070B24-80070C54 .text doorCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::doorCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::doorCheck(dEvt_order_c* order) { + if (commonCheck(order, dEvtCnd_CANDOOR_e, dEvtCmd_INDOOR_e)) { + mMode = 2; + fopAc_ac_c* actor2 = convPId(mPt2); + if (mEventId == -1 && actor2 != NULL && actor2->mEvtInfo.getEventId() != -1) + mEventId = actor2->mEvtInfo.getEventId(); + if (mEventId != -1 && g_dComIfG_gameInfo.play.getEvtManager().getEventData(mEventId) != NULL) { + if (!dComIfGp_evmng_order(mEventId)) + JUT_ASSERT(0x2c0, 0); + } else { + mEventId = -1; + reset(); + } + + if (order->mEventType == dEvtType_TREASURE_e) + dComIfGp_event_onEventFlag(4); + + return TRUE; + } else { + return FALSE; + } } /* 80070C54-80070D1C .text itemCheck__14dEvt_control_cFP12dEvt_order_c */ -void dEvt_control_c::itemCheck(dEvt_order_c*) { - /* Nonmatching */ +BOOL dEvt_control_c::itemCheck(dEvt_order_c* order) { + const char* defaultEventName = "DEFAULT_GETITEM"; + if (commonCheck(order, dEvtCnd_CANGETITEM_e, dEvtCmd_INGETITEM_e)) { + mMode = 2; + mEventId = dComIfGp_evmng_getEventIdx(defaultEventName, 0xFF); + if (!dComIfGp_evmng_order(mEventId)) + JUT_ASSERT(0x2ea, 0); + return TRUE; + } else { + return FALSE; + } } /* 80070D1C-80070DD4 .text endProc__14dEvt_control_cFv */ -void dEvt_control_c::endProc() { - /* Nonmatching */ +BOOL dEvt_control_c::endProc() { + switch (mMode) { + case 1: + talkEnd(); + break; + case 2: + demoEnd(); + break; + case 3: + break; + default: + JUT_ASSERT(0x315, 0); + } + + mMode = 0; + field_0xde = 0xFF; + mEventInfoIdx = 0xFF; + mTalkButton = 0; + mbInPhoto = 0; + mItemNo = 0xFF; + mEventFlag = 0; + return TRUE; } /* 80070DD4-80070E1C .text checkChange__14dEvt_control_cFv */ -void dEvt_control_c::checkChange() { +BOOL dEvt_control_c::checkChange() { /* Nonmatching */ + if (mOrderCount != 0) { + s8 idx = mFirstOrderIdx; + while (true) { + s8 nextIdx = mOrder[idx].mNextOrderIdx; + if ((s32)mOrder[idx].mEventType == dEvtType_CHANGE_e) + return TRUE; + + idx = nextIdx; + if (idx < 0) + break; + } + } + + return FALSE; } /* 80070E1C-80070EA8 .text changeProc__14dEvt_control_cFv */ -void dEvt_control_c::changeProc() { +BOOL dEvt_control_c::changeProc() { /* Nonmatching */ + if (mOrderCount != 0) { + mOrderCount = 0; + s8 idx = mFirstOrderIdx; + while (true) { + s8 nextIdx = mOrder[idx].mNextOrderIdx; + if ((s32)mOrder[idx].mEventType == dEvtType_CHANGE_e && demoCheck(&mOrder[idx])) + return TRUE; + + idx = nextIdx; + if (idx < 0) + break; + } + } + + return FALSE; } /* 80070EA8-80071020 .text checkStart__14dEvt_control_cFv */ -void dEvt_control_c::checkStart() { +BOOL dEvt_control_c::checkStart() { /* Nonmatching */ } /* 80071020-80071048 .text soundProc__14dEvt_control_cFv */ -void dEvt_control_c::soundProc() { - /* Nonmatching */ +BOOL dEvt_control_c::soundProc() { + if (mEventEndSound != 0 && mMode != 2) + mEventEndSound = 0; + return TRUE; } /* 80071048-80071140 .text check__14dEvt_control_cFv */ -void dEvt_control_c::check() { - /* Nonmatching */ +BOOL dEvt_control_c::check() { + field_0xdb = 0; + field_0xdc = mOrderCount; + + if (chkEventFlag(8)) { + mbEndProc = 1; + offEventFlag(8); + } + + if (runCheck() && mbEndProc == 1) { + mbEndProc = 0; + endProc(); + } + + if (checkChange()) { + if (runCheck()) { + mbEndProc = 0; + endProc(); + } + + changeProc(); + } + + if (!runCheck() && checkStart()) + g_dComIfG_gameInfo.play.getVibration().StopQuake(-1); + + soundProc(); + mOrderCount = 0; + return FALSE; } /* 80071140-80071270 .text photoCheck__14dEvt_control_cFv */ -void dEvt_control_c::photoCheck() { +BOOL dEvt_control_c::photoCheck() { /* Nonmatching */ } /* 80071270-80071418 .text moveApproval__14dEvt_control_cFPv */ -s32 dEvt_control_c::moveApproval(void*) { +s32 dEvt_control_c::moveApproval(void* actor) { /* Nonmatching */ + fopAc_ac_c* i_ac = (fopAc_ac_c*)actor; + if (mMode == 0) + return dEvtMove_MOVE_e; + + switch (mMode) { + case 1: + if (convPId(mPt1) == i_ac || convPId(mPt2) == i_ac) + return dEvtMove_FORCE_e; + break; + case 2: + if (convPId(mPt1) == i_ac || convPId(mPt2) == i_ac) + return dEvtMove_FORCE_e; + if (i_ac->mDemoActorId != 0) + return dEvtMove_FORCE_e; + break; + case 3: + if (convPId(mPt1) == i_ac) + return dEvtMove_FORCE_e; + break; + } + + if (fopAcM_checkStatus(i_ac, fopAcStts_FORCEMOVE_e)) + return dEvtMove_FORCE_e; + + if (mMode == 1 && fopAcM_checkStatus(i_ac, fopAcStts_UNK40_e)) + return dEvtMove_MOVE_e; + if (dComIfGp_demo_mode() == 1) + return dEvtMove_MOVE_e; + if (fopAcM_checkStatus(i_ac, fopAcStts_UNK800_e)) + return dEvtMove_MOVE_e; + if ((g_dComIfG_gameInfo.play.getEvent().mMode == 3 || g_dComIfG_gameInfo.play.getEvent().mMode == 1) && fopAcM_checkStatus(i_ac, fopAcStts_BOSS_e)) + return dEvtMove_NOMOVE_e; + if (chkEventFlag(0x80) && fopAcM_checkStatus(i_ac, fopAcStts_BOSS_e)) + return dEvtMove_NOMOVE_e; + if (fopAcM_checkStatus(i_ac, fopAcStts_UNK4000_e)) + return dEvtMove_MOVE_e; + return fopAcM_checkStatus(i_ac, fopAcStts_CARRY_e) ? dEvtMove_MOVE_e : dEvtMove_NOMOVE_e; } /* 80071418-80071468 .text compulsory__14dEvt_control_cFPvPCcUs */ -BOOL dEvt_control_c::compulsory(void*, const char*, u16) { - /* Nonmatching */ +BOOL dEvt_control_c::compulsory(void* actor, const char* eventName, u16 p3) { + if (mMode != 0) + return FALSE; + + return orderOld(dEvtType_COMPULSORY_e, 1, 0, p3, actor, NULL, eventName); } /* 80071468-800714AC .text remove__14dEvt_control_cFv */ void dEvt_control_c::remove() { - /* Nonmatching */ mMode = 0; mbEndProc = 0; mOrderCount = 0; @@ -151,7 +512,7 @@ void dEvt_control_c::remove() { field_0xdb = 0; mCullFarClipRatio = 0.0f; field_0xde = 0xff; - field_0xdf = 0xff; + mEventInfoIdx = 0xff; mTalkButton = 0; mbInPhoto = 0; mItemNo = 0xff; @@ -159,33 +520,49 @@ void dEvt_control_c::remove() { } /* 800714AC-80071534 .text getStageEventDt__14dEvt_control_cFv */ -void dEvt_control_c::getStageEventDt() { - /* Nonmatching */ +dStage_Event_dt_c* dEvt_control_c::getStageEventDt() { + dStage_EventInfo_c* stageEventInfo = dComIfGp_getStageEventInfo(); + if (mMode == 0) + return NULL; + + if (stageEventInfo == NULL || mEventInfoIdx == 0xFF || mEventInfoIdx >= stageEventInfo->num) + return NULL; + + return &stageEventInfo->events[mEventInfoIdx]; } /* 80071534-800715B8 .text nextStageEventDt__14dEvt_control_cFPv */ -void dEvt_control_c::nextStageEventDt(void*) { - /* Nonmatching */ +dStage_Event_dt_c* dEvt_control_c::nextStageEventDt(void* idxp) { + dStage_EventInfo_c* stageEventInfo = dComIfGp_getStageEventInfo(); + if (idxp == NULL) + return NULL; + + if (stageEventInfo == NULL || *(u8*)idxp == 0xFF || *(u8*)idxp >= stageEventInfo->num) + return NULL; + + return &stageEventInfo->events[*(u8*)idxp]; } /* 800715B8-800715DC .text getPId__14dEvt_control_cFPv */ -int dEvt_control_c::getPId(void*) { - /* Nonmatching */ +int dEvt_control_c::getPId(void* ac) { + if (ac == NULL) + return -1; + return fpcM_GetID(ac); } /* 800715DC-8007160C .text convPId__14dEvt_control_cFUi */ -fopAc_ac_c* dEvt_control_c::convPId(unsigned int) { - /* Nonmatching */ +fopAc_ac_c* dEvt_control_c::convPId(unsigned int pid) { + return fopAcM_SearchByID(pid); } /* 8007160C-80071618 .text getTactFreeMStick__14dEvt_control_cFi */ -void dEvt_control_c::getTactFreeMStick(int) { - /* Nonmatching */ +u8 dEvt_control_c::getTactFreeMStick(int which) { + return mTactFreeMStick[which]; } /* 80071618-80071624 .text getTactFreeCStick__14dEvt_control_cFi */ -void dEvt_control_c::getTactFreeCStick(int) { - /* Nonmatching */ +u8 dEvt_control_c::getTactFreeCStick(int which) { + return mTactFreeCStick[which]; } /* 80071624-80071658 .text __ct__11dEvt_info_cFv */ @@ -199,16 +576,34 @@ dEvt_info_c::dEvt_info_c() { } /* 80071658-800716AC .text setEventName__11dEvt_info_cFPc */ -void dEvt_info_c::setEventName(char*) { - /* Nonmatching */ +void dEvt_info_c::setEventName(char* evtName) { + if (evtName == NULL) { + mEventId = -1; + } else { + mEventId = dComIfGp_evmng_getEventIdx(evtName, -1); + } } /* 800716AC-800716F8 .text getEventName__11dEvt_info_cFv */ char* dEvt_info_c::getEventName() { - /* Nonmatching */ + if (mEventId == -1) { + return NULL; + } else { + dEvDtEvent_c* evtData = g_dComIfG_gameInfo.play.getEvtManager().getEventData(mEventId); + if (evtData == NULL) + return NULL; + return evtData->getName(); + } } /* 800716F8-80071778 .text giveItemCut__14dEvt_control_cFUc */ -void dEvt_control_c::giveItemCut(u8) { +bool dEvt_control_c::giveItemCut(u8 item) { /* Nonmatching */ + s32 staffIdx = dComIfGp_evmng_getMyStaffId("GIVEMAN"); + if (staffIdx == -1) + return false; + + dComIfGp_evmng_cutEnd(staffIdx); + mGetItemNo = staffIdx; + return true; } diff --git a/src/d/d_event_manager.cpp b/src/d/d_event_manager.cpp index be495cd84..49be96402 100644 --- a/src/d/d_event_manager.cpp +++ b/src/d/d_event_manager.cpp @@ -102,7 +102,7 @@ s16 dEvent_manager_c::getEventIdx(const char*, u8) { } /* 800744AC-800744E8 .text order__16dEvent_manager_cFs */ -void dEvent_manager_c::order(s16) { +BOOL dEvent_manager_c::order(s16) { /* Nonmatching */ } @@ -182,7 +182,7 @@ u16 dEvent_manager_c::getEventPrio(s16) { } /* 80074BB0-80074BE4 .text getEventEndSound__16dEvent_manager_cFs */ -void dEvent_manager_c::getEventEndSound(s16) { +u8 dEvent_manager_c::getEventEndSound(s16) { /* Nonmatching */ } diff --git a/src/f_op/f_op_actor.cpp b/src/f_op/f_op_actor.cpp index ef0e3e3d0..8b0bca6e6 100644 --- a/src/f_op/f_op_actor.cpp +++ b/src/f_op/f_op_actor.cpp @@ -39,7 +39,7 @@ s32 fopAc_Draw(void* pProc) { if ( ( - moveApproval == 2 + moveApproval == dEvtMove_FORCE_e || ( !fopAcM_checkStatus(actor, fopAc_ac_c::getStopStatus()) && !( @@ -84,10 +84,10 @@ s32 fopAc_Execute(void* pProc) { if ( ( - moveApproval == 2 + moveApproval == dEvtMove_FORCE_e || ( ( - moveApproval != 0 + moveApproval != dEvtMove_NOMOVE_e && !fopAcM_checkStatus(actor, fopAc_ac_c::getStopStatus()) ) && (