diff --git a/configure.py b/configure.py index eae33f85f..209f08368 100644 --- a/configure.py +++ b/configure.py @@ -366,7 +366,7 @@ config.libs = [ Object(NonMatching, "d/d_door.cpp"), Object(NonMatching, "d/d_resorce.cpp", extra_cflags=['-pragma "nosyminline on"']), Object(NonMatching, "d/d_material.cpp"), - Object(NonMatching, "d/d_event.cpp"), + Object(Matching, "d/d_event.cpp"), Object(Matching, "d/d_event_data.cpp"), Object(NonMatching, "d/d_event_manager.cpp"), Object(NonMatching, "d/d_magma.cpp"), diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 9d7477db1..e89928406 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -524,7 +524,8 @@ public: void setRStatus(u8 status) { field_0x492d = status; } u8 getRStatusForce() { return field_0x4930; } void setRStatusForce(u8 status) { field_0x4930 = status; } - inline u8 getPictureStatus() { return mPictureStatus; } + u8 getPictureStatus() { return mPictureStatus; } + void setPictureStatusOn() { mPictureStatus = 2; } u8 getScopeType() { return mbCamOverrideFarPlane; } void setScopeType(u8 v) { mbCamOverrideFarPlane = v; } @@ -2404,6 +2405,10 @@ inline u8 dComIfGp_getPictureStatus() { return g_dComIfG_gameInfo.play.getPictureStatus(); } +inline void dComIfGp_setPictureStatusOn() { + g_dComIfG_gameInfo.play.setPictureStatusOn(); +} + inline s16 dComIfGp_getMiniGameRupee() { return g_dComIfG_gameInfo.play.getMiniGameRupee(); } diff --git a/include/d/d_event.h b/include/d/d_event.h index 9b6bff0ce..d3b449d09 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -66,7 +66,7 @@ public: s32 order(u16, u16, u16, u16, void*, void*, s16, u8); void setParam(dEvt_order_c*); BOOL beforeFlagProc(dEvt_order_c*); - BOOL afterFlagProc(dEvt_order_c*); + void afterFlagProc(dEvt_order_c*); BOOL commonCheck(dEvt_order_c*, u16, u16); BOOL talkCheck(dEvt_order_c*); BOOL talkXyCheck(dEvt_order_c*); @@ -120,7 +120,7 @@ public: void reset() { onEventFlag(8); } bool runCheck() { return mMode != 0; } - u8 getMode() { return mMode; } + u32 getMode() { return mMode & 0xFF; } // &0xFF added to fix dEvt_control_c::moveApproval, probably fakematch void checkHind(u16) {} void chkPhoto() {} diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index fb51e1c9a..2212dd447 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -67,6 +67,7 @@ enum fopAc_AttentionFlag_e { fopAc_Attn_ACTION_DOOR_e = 0x00000020, fopAc_Attn_ACTION_TREASURE_e = 0x00000040, fopAc_Attn_ACTION_SHIP_e = 0x00000080, + fopAc_Attn_UNK1000000_e = 0x01000000, fopAc_Attn_TALKFLAG_NOTALK_e = 0x02000000, fopAc_Attn_ENEMYFLAG_NOLOCKON_e = 0x04000000, fopAc_Attn_TALKFLAG_LOOK_e = 0x08000000, @@ -166,22 +167,22 @@ public: void setCommand(u16 command) { mCommand = command; } void setXyEventCB(CallbackFunc cb) { mpEventCB = cb; } - s16 runXyEventCB(void* ac, int flag) { + s16 runXyEventCB(void* ac, int equippedItemIdx) { if (mpEventCB == NULL) return -1; - return mpEventCB(ac, flag); + return mpEventCB(ac, equippedItemIdx); } void setXyCheckCB(CallbackFunc cb) { mpCheckCB = cb; } - s16 runXyCheckCB(void* ac, int flag) { + s16 runXyCheckCB(void* ac, int equippedItemIdx) { if (mpCheckCB == NULL) return -1; - return mpCheckCB(ac, flag); + return mpCheckCB(ac, equippedItemIdx); } void setPhotoEventCB(CallbackFunc cb) { mpPhotoCB = cb; } - s16 runPhotoEventCB(void* ac, int flag) { + s16 runPhotoEventCB(void* ac, int equippedItemIdx) { if (mpPhotoCB == NULL) return -1; - return mpPhotoCB(ac, flag); + return mpPhotoCB(ac, equippedItemIdx); } public: diff --git a/src/JAZelAudio/JAIZelBasic.cpp b/src/JAZelAudio/JAIZelBasic.cpp index c632c8e24..0b97e93c5 100644 --- a/src/JAZelAudio/JAIZelBasic.cpp +++ b/src/JAZelAudio/JAIZelBasic.cpp @@ -156,7 +156,7 @@ void JAIZelBasic::heartGaugeOn() { /* 802A2F54-802A3058 .text processHeartGaugeSound__11JAIZelBasicFv */ void JAIZelBasic::processHeartGaugeSound() { /* Nonmatching */ - if (dComIfGp_event_getMode() == 0 && field_0x0040) { + if (dComIfGp_event_getMode() == dEvtMode_NONE_e && field_0x0040) { if (field_0x0034 && field_0x0206 == 0) { if (field_0x0034 <= 2) { seStart(JA_SE_ALMOST_DIE_ALERM_3, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); diff --git a/src/d/d_event.cpp b/src/d/d_event.cpp index f50d664bf..8f73d1b01 100644 --- a/src/d/d_event.cpp +++ b/src/d/d_event.cpp @@ -103,7 +103,7 @@ BOOL dEvt_control_c::beforeFlagProc(dEvt_order_c* order) { } /* 8007018C-80070218 .text afterFlagProc__14dEvt_control_cFP12dEvt_order_c */ -BOOL dEvt_control_c::afterFlagProc(dEvt_order_c* order) { +void dEvt_control_c::afterFlagProc(dEvt_order_c* order) { if ((order->mFlag & dEvtFlag_NOPARTNER_e)) mPt2 = getPId(NULL); @@ -153,14 +153,66 @@ BOOL dEvt_control_c::talkCheck(dEvt_order_c* order) { /* 80070390-8007055C .text talkXyCheck__14dEvt_control_cFP12dEvt_order_c */ BOOL dEvt_control_c::talkXyCheck(dEvt_order_c* order) { - /* Nonmatching */ const char* defaultEventName = "DEFAULT_TALK_XY"; - OSReport("DEFAULT_TALK_XY"); + + fopAc_ac_c* actor2 = order->mActor2; + + int equippedItemIdx; + switch (order->mEventType) { + case dEvtType_SHOWITEM_X_e: + equippedItemIdx = 0; + break; + case dEvtType_SHOWITEM_Y_e: + equippedItemIdx = 1; + break; + default: + equippedItemIdx = 2; + break; + } + + if (dComIfGp_getSelectItem(equippedItemIdx) == NO_ITEM) { + return FALSE; + } + + if (actor2 == NULL || !actor2->mEvtInfo.chkCondition(dEvtCnd_CANTALKITEM_e)) { + return FALSE; + } + + if (commonCheck(order, dEvtCnd_CANTALK_e, dEvtCmd_INTALK_e)) { + mMode = dEvtMode_TALK_e; + mItemNo = dComIfGp_getSelectItem(equippedItemIdx); + + switch (order->mEventType) { + case dEvtType_SHOWITEM_X_e: + mTalkButton = 1; + break; + case dEvtType_SHOWITEM_Y_e: + mTalkButton = 2; + break; + default: + mTalkButton = 3; + break; + } + + // Fakematch + s16 r3; + if (actor2 != NULL && (r3 = actor2->mEvtInfo.runXyEventCB(actor2, equippedItemIdx), r3 != -1)) { + mEventId = r3; + } else { + mEventId = dComIfGp_evmng_getEventIdx(defaultEventName, 0xFF); + } + + if (!dComIfGp_evmng_order(mEventId)) { + JUT_ASSERT(401, 0); + } + return TRUE; + } + + return FALSE; } /* 8007055C-800706D8 .text photoCheck__14dEvt_control_cFP12dEvt_order_c */ BOOL dEvt_control_c::photoCheck(dEvt_order_c* order) { - /* Nonmatching */ fopAc_ac_c* actor2 = order->mActor2; const char* defaultEventName = "DEFAULT_TALK"; @@ -188,7 +240,7 @@ BOOL dEvt_control_c::photoCheck(dEvt_order_c* order) { return FALSE; } - return TRUE; + return FALSE; } /* 800706D8-800707C0 .text catchCheck__14dEvt_control_cFP12dEvt_order_c */ @@ -361,16 +413,20 @@ BOOL dEvt_control_c::endProc() { /* 80070DD4-80070E1C .text checkChange__14dEvt_control_cFv */ BOOL dEvt_control_c::checkChange() { - /* Nonmatching */ if (mOrderCount != 0) { - s8 idx = mFirstOrderIdx; + dEvt_order_c* order; + s8 nextIdx = mFirstOrderIdx; while (true) { - s8 nextIdx = mOrder[idx].mNextOrderIdx; - if ((s32)mOrder[idx].mEventType == dEvtType_CHANGE_e) + order = &mOrder[nextIdx]; + nextIdx = order->mNextOrderIdx; + if ((s32)order->mEventType != dEvtType_CHANGE_e) { + // Fakematch, assigning a float member to itself tricks the compiler into creating a beq then a b. + mCullFarClipRatio = mCullFarClipRatio; + } else { return TRUE; + } - idx = nextIdx; - if (idx < 0) + if (nextIdx < 0) break; } } @@ -380,17 +436,20 @@ BOOL dEvt_control_c::checkChange() { /* 80070E1C-80070EA8 .text changeProc__14dEvt_control_cFv */ BOOL dEvt_control_c::changeProc() { - /* Nonmatching */ if (mOrderCount != 0) { mOrderCount = 0; - s8 idx = mFirstOrderIdx; + s8 nextIdx = mFirstOrderIdx; while (true) { - s8 nextIdx = mOrder[idx].mNextOrderIdx; - if ((s32)mOrder[idx].mEventType == dEvtType_CHANGE_e && demoCheck(&mOrder[idx])) + dEvt_order_c* order = &mOrder[nextIdx]; + nextIdx = order->mNextOrderIdx; + if ((s32)order->mEventType != dEvtType_CHANGE_e) { + // Fakematch, assigning a float member to itself tricks the compiler into creating a beq then a b. + mCullFarClipRatio = mCullFarClipRatio; + } else if (demoCheck(order)) { return TRUE; + } - idx = nextIdx; - if (idx < 0) + if (nextIdx < 0) break; } } @@ -500,12 +559,58 @@ BOOL dEvt_control_c::check() { /* 80071140-80071270 .text photoCheck__14dEvt_control_cFv */ BOOL dEvt_control_c::photoCheck() { - /* Nonmatching */ + fopAc_ac_c* actor1; + fopAc_ac_c* actor2; + s8 orderIdx = mFirstOrderIdx; + if (mOrderCount != 0) { + dEvt_order_c* order = &mOrder[orderIdx]; + int equippedItemIdx = -1; + switch (order->mEventType) { + case dEvtType_SHOWITEM_X_e: + equippedItemIdx = 0; + break; + case dEvtType_SHOWITEM_Y_e: + equippedItemIdx = 1; + break; + case dEvtType_SHOWITEM_Z_e: + equippedItemIdx = 2; + break; + } + + if (equippedItemIdx != -1 && + (dComIfGp_getSelectItem(equippedItemIdx) == CAMERA || dComIfGp_getSelectItem(equippedItemIdx) == CAMERA2) && + dComIfGs_getPictureNum() != 0 + ) { + actor2 = order->mActor2; + if (actor2 == NULL) { + return FALSE; + } + if (!(actor2->mAttentionInfo.mFlags & fopAc_Attn_UNK1000000_e)) { + return FALSE; + } + if (dComIfGp_getPictureStatus() == 2) { + return FALSE; + } + actor1 = order->mActor1; + if (actor1 == NULL) { + return FALSE; + } + if (!actor1->mEvtInfo.chkCondition(dEvtCnd_CANTALK_e) || + !actor2->mEvtInfo.chkCondition(dEvtCnd_CANTALK_e) + ) { + return FALSE; + } + order->mEventType = dEvtType_PHOTO_e; + dComIfGp_setPictureStatusOn(); + return TRUE; + } + } + + return FALSE; } /* 80071270-80071418 .text moveApproval__14dEvt_control_cFPv */ s32 dEvt_control_c::moveApproval(void* actor) { - /* Nonmatching */ fopAc_ac_c* i_ac = (fopAc_ac_c*)actor; if (getMode() == dEvtMode_NONE_e) return dEvtMove_MOVE_e; @@ -547,7 +652,7 @@ s32 dEvt_control_c::moveApproval(void* actor) { /* 80071418-80071468 .text compulsory__14dEvt_control_cFPvPCcUs */ BOOL dEvt_control_c::compulsory(void* actor, const char* eventName, u16 p3) { - if (getMode() != 0) + if (getMode() != dEvtMode_NONE_e) return FALSE; return orderOld(dEvtType_COMPULSORY_e, 1, 0, p3, actor, NULL, eventName); @@ -573,7 +678,7 @@ void dEvt_control_c::remove() { /* 800714AC-80071534 .text getStageEventDt__14dEvt_control_cFv */ dStage_Event_dt_c* dEvt_control_c::getStageEventDt() { dStage_EventInfo_c* stageEventInfo = dComIfGp_getStageEventInfo(); - if (getMode() == 0) + if (getMode() == dEvtMode_NONE_e) return NULL; if (stageEventInfo == NULL || mEventInfoIdx == 0xFF || mEventInfoIdx >= stageEventInfo->num) diff --git a/src/d/d_event_manager.cpp b/src/d/d_event_manager.cpp index 8a7970a3a..8d1e0075e 100644 --- a/src/d/d_event_manager.cpp +++ b/src/d/d_event_manager.cpp @@ -405,7 +405,7 @@ int dEvent_manager_c::getMyStaffId(const char* name, fopAc_ac_c* actor, int tagI for (s32 i = 0; i < mList.getEventNum(); i++) { dEvDtEvent_c* event = mList.getEventP(i); - if (event->mEventState == 2 || event->mEventState == 4 || event->mEventState == 3) { + if (event->mEventState == dEvDtEvent_c::PLAY_e || event->mEventState == dEvDtEvent_c::CLOSE_e || event->mEventState == dEvDtEvent_c::UNK3_e) { s32 nStaff = event->getNStaff(); for (s32 j = 0; j < nStaff; j++) { u32 staffIdx = event->getStaff(j); diff --git a/src/d/d_timer.cpp b/src/d/d_timer.cpp index 318590e10..9a9f06206 100644 --- a/src/d/d_timer.cpp +++ b/src/d/d_timer.cpp @@ -173,7 +173,7 @@ BOOL dTimer_c::_execute() { if (mState == 0 || mState == 2) { if (mTimerMode == 3 || mTimerMode == 2) { - if (dMenu_flag() || dComIfGp_event_getMode() == 1) + if (dMenu_flag() || dComIfGp_event_getMode() == dEvtMode_TALK_e) stop(1); else restart(1); @@ -433,7 +433,7 @@ void dDlst_TimerScrnDraw_c::setTimer(int time) { changeNumberTexture(mTimerNumber[2], sec % 10); changeNumberTexture(mTimerNumber[3], ms / 100); changeNumberTexture(mTimerNumber[4], (ms % 100) / 10); - if (dComIfGp_event_getMode() == 1) { + if (dComIfGp_event_getMode() == dEvtMode_TALK_e) { if (mClockIcon.mUserArea < 5) { mClockIcon.mUserArea++; s16 alphaStep = 5 - mClockIcon.mUserArea; @@ -448,7 +448,7 @@ void dDlst_TimerScrnDraw_c::setTimer(int time) { } else { if (mClockIcon.mUserArea > 0) { mClockIcon.mUserArea--; - int alphaStep = 5 - mClockIcon.mUserArea; + s16 alphaStep = 5 - mClockIcon.mUserArea; f32 alpha = ((f32)alphaStep * (f32)alphaStep) / 25.0f; fopMsgM_setNowAlpha(&mClockIcon, alpha); fopMsgM_setNowAlpha(&mClockBG, alpha); @@ -486,7 +486,7 @@ void dDlst_TimerScrnDraw_c::setRupee(s16 num) { changeNumberTexture(mRupeeNumberShadow[2], r100); } - if (dComIfGp_event_getMode() == 1) { + if (dComIfGp_event_getMode() == dEvtMode_TALK_e) { if (mRupee.mUserArea < 5) { mRupee.mUserArea++; s16 alphaStep = mRupee.mUserArea;