diff --git a/include/d/d_event.h b/include/d/d_event.h index 554c85b50..530bf825c 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -21,6 +21,19 @@ enum dEvtType_e { /* 0x0A */ dEvtType_CHANGE_e, }; +enum { + dEvtMode_NONE_e, + dEvtMode_TALK_e, + dEvtMode_DEMO_e, + dEvtMode_COMPULSORY_e, +}; + +enum { + dEvtFlag_NOPARTNER_e = 0x01, + dEvtFlag_STAFF_ALL_e = 0x02, + dEvtFlag_TALK_e = 0x04, + dEvtFlag_UNK8_e = 0x08, +}; enum { dEvtMove_NOMOVE_e, dEvtMove_MOVE_e, @@ -90,6 +103,8 @@ public: void setGtItm(u8 itemNo) { mGetItemNo = itemNo; } u8 getGtItm() { return mGetItemNo; } void setPtT(void* i_actor) { mPtTalk = getPId(i_actor); } + void setPt1(void* i_actor) { mPt1 = getPId(i_actor); } + void setPt2(void* i_actor) { mPt2 = getPId(i_actor); } u8 getPreItemNo() { return mItemNo; } f32 getCullRate() { return mCullFarClipRatio; } diff --git a/include/d/d_event_data.h b/include/d/d_event_data.h index 2bec9858d..6c9e3a751 100644 --- a/include/d/d_event_data.h +++ b/include/d/d_event_data.h @@ -77,7 +77,8 @@ public: const char* getName() { return mName; } u32 getStartCut() { return mFirstCutIdx; } u32 getCurrentCut() { return mCurCutIdx; } - u32 getType() { return mStaffType; } + s32 getType() { return mStaffType; } + s32 getTagID() { return mTagID; } enum StaffType_e { NORMAL_e, @@ -97,7 +98,7 @@ public: public: /* 0x00 */ char mName[32]; - /* 0x20 */ int mSub; + /* 0x20 */ int mTagID; /* 0x24 */ int mStaffIdx; /* 0x28 */ int m28; /* 0x2C */ int mStaffType; @@ -110,7 +111,7 @@ public: /* 0x44 */ u8 m44; /* 0x45 */ u8 m45; /* 0x46 */ u8 mAdvance; - /* 0x47 */ u8 mbNeedsAction; + /* 0x47 */ u8 mbHasAction; /* 0x48 */ u8 field_48[0x50 - 0x48]; }; // Size: 0x50 diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index fbdb21e00..d3aa7c837 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -88,8 +88,4 @@ public: /* 0x0C */ u16 mCastInFlag; }; -inline int dEvmng_strcmp(const char* s1, const char* s2) { - return strcmp(s1, s2); -} - #endif /* D_EVENT_D_EVENT_MANAGER_H */ diff --git a/src/d/actor/d_a_tag_ghostship.cpp b/src/d/actor/d_a_tag_ghostship.cpp index 7e0fa95bd..ea2633dd0 100644 --- a/src/d/actor/d_a_tag_ghostship.cpp +++ b/src/d/actor/d_a_tag_ghostship.cpp @@ -43,11 +43,10 @@ void daTag_Gship_c::modeClearEventInit() { void daTag_Gship_c::modeClearEvent() { if(mEvtInfo.checkCommandDemoAccrpt()) { int staffIdx = dComIfGp_evmng_getMyStaffId("PScnChg"); - if(dEvmng_strcmp(dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx), "WARAIGOE") == 0) { + if(strcmp(dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx), "WARAIGOE") == 0) { if(dComIfGs_getEventReg(0x8803) == 3) { mDoAud_seStart(JA_SE_CV_G_SHIP_SCREAM); - } - else { + } else { mDoAud_seStart(JA_SE_CV_G_SHIP_LAUGH); } diff --git a/src/d/d_event.cpp b/src/d/d_event.cpp index 31566e89f..874ddfde4 100644 --- a/src/d/d_event.cpp +++ b/src/d/d_event.cpp @@ -11,20 +11,6 @@ #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, -}; - -enum { - dEvtMode_NONE_e, - dEvtMode_TALK_e, - dEvtMode_DEMO_e, - dEvtMode_COMPULSORY_e, -}; - /* 8006FE04-8006FE54 .text __ct__14dEvt_control_cFv */ dEvt_control_c::dEvt_control_c() { remove(); diff --git a/src/d/d_event_data.cpp b/src/d/d_event_data.cpp index 4d2fc7dbc..fe846f50e 100644 --- a/src/d/d_event_data.cpp +++ b/src/d/d_event_data.cpp @@ -182,7 +182,7 @@ void dEvDtStaff_c::init() { m45 = 0; m44 = 0; mAdvance = 2; - mbNeedsAction = false; + mbHasAction = false; mCurActionIdx = -1; if (mStaffType == CAMERA_e) dComIfGp_getPEvtManager()->setCameraPlay(1); @@ -196,7 +196,7 @@ void dEvDtStaff_c::advanceCut(int cutIdx) { m45 = 0; m44 = 0; mAdvance = 1; - mbNeedsAction = false; + mbHasAction = false; mCurActionIdx = -1; } diff --git a/src/d/d_event_manager.cpp b/src/d/d_event_manager.cpp index 8902005e5..3a91dacf7 100644 --- a/src/d/d_event_manager.cpp +++ b/src/d/d_event_manager.cpp @@ -5,6 +5,7 @@ #include "d/d_event_manager.h" #include "d/d_com_inf_game.h" +#include "d/d_procname.h" /* 800737DC-800737F4 .text init__18dEvent_exception_cFv */ void dEvent_exception_c::init() { @@ -92,7 +93,7 @@ void dEvent_manager_c::debugBfProc() { enum { dEvtSub_FLOAT_e, dEvtSub_XYZ_e, - dEvtSub_UNK3_e, + dEvtSub_UNK2_e, dEvtSub_INT_e, dEvtSub_STR_e, }; @@ -112,6 +113,7 @@ void* dEvent_manager_c::getSubstance(dEvDtData_c* data, int type) { switch (data->getType()) { case dEvtSub_FLOAT_e: case dEvtSub_XYZ_e: + case dEvtSub_UNK2_e: return mList.getFDataP(data->getIndex()); case dEvtSub_INT_e: return mList.getIDataP(data->getIndex()); @@ -233,10 +235,10 @@ static void* allOffObjectCallBack(fopAc_ac_c* actor, void*) { void dEvent_manager_c::startProc(dEvDtEvent_c* event) { /* Nonmatching */ dEv_seach_prm prm(NULL, 0, 0); - for (s32 i = 0; i < event->mNStaff; i++) { - s32 staffIdx = event->mStaffIdx[i]; + for (s32 i = 0; i < event->getNStaff(); i++) { + u32 staffIdx = event->getStaff(i); dEvDtStaff_c* staff = mList.getStaffP(staffIdx); - if (staff->mStaffType == dEvDtStaff_c::NORMAL_e) { + if (staff->getType() == dEvDtStaff_c::NORMAL_e) { fopAc_ac_c* actor = specialCast(staff->mName, 1); if (actor == NULL) { setPrmStaff(&prm, staffIdx); @@ -389,8 +391,32 @@ BOOL dEvent_manager_c::endCheckOld(const char* eventName) { } /* 800745E0-80074718 .text getMyStaffId__16dEvent_manager_cFPCcP10fopAc_ac_ci */ -int dEvent_manager_c::getMyStaffId(const char*, fopAc_ac_c*, int) { +int dEvent_manager_c::getMyStaffId(const char* name, fopAc_ac_c* actor, int tagId) { /* Nonmatching */ + + if (dComIfGp_event_getMode() == dEvtMode_NONE_e) + return -1; + + if (mList.getHeaderP() == NULL) + return -1; + + if (actor && !fopAcM_checkStatus(actor, fopAcStts_FORCEMOVE_e)) + return -1; + + for (s32 i = 0; i < mList.getEventNum(); i++) { + dEvDtEvent_c* event = mList.getEventP(i); + if (event->mEventState == 2 || event->mEventState == 4 || event->mEventState == 3) { + s32 nStaff = event->getNStaff(); + for (s32 j = 0; j < nStaff; j++) { + u32 staffIdx = event->getStaff(j); + dEvDtStaff_c* staff = mList.getStaffP(staffIdx); + if (staff->mStaffType != dEvDtStaff_c::ALL_e && strcmp(name, staff->getName()) == 0 && tagId == staff->getTagID()) + return staffIdx; + } + } + } + + return -1; } /* 80074718-8007473C .text getIsAddvance__16dEvent_manager_cFi */ @@ -401,9 +427,63 @@ BOOL dEvent_manager_c::getIsAddvance(int staffIdx) { return mList.getStaffP(staffIdx)->mAdvance; } +int dEvmng_strcmp(const char* s1, char* s2) { + u32 len1 = strlen(s1); + u32 len2 = strlen(s2); + + if (len1 >= 100 || len2 >= 100) { + JUT_ASSERT(0x44a, 0); + return -1; + } + + if (len1 > len2) + return 1; + + const char* p1 = s1; + const char* p2 = s2; + while (len1-- > 0) { + if (*p1 != *p2) + return 1; + p2++; + p1++; + } + + return 0; +} + /* 80074824-80074964 .text getMyActIdx__16dEvent_manager_cFiPCPCciii */ -int dEvent_manager_c::getMyActIdx(int, const char* const*, int, int, int) { +int dEvent_manager_c::getMyActIdx(int staffIdx, const char* const* action, int actionNum, int force, int nameType) { /* Nonmatching */ + if (staffIdx == -1) + return -1; + + dEvDtStaff_c* staff = mList.getStaffP(staffIdx); + if (staff->mbHasAction && !force) + return staff->mCurActionIdx; + + char* name = getMyNowCutName(staffIdx); + if (name == NULL) + return -1; + + staff->mbHasAction = true; + for (s32 i = 0; i < actionNum; i++) { + JUT_ASSERT(0x46a, action[i]); + + if (nameType != 0) { + if (dEvmng_strcmp(action[i], name) == 0) { + staff->mCurActionIdx = i; + return i; + } + } else { + if (strcmp(action[i], name) == 0) { + staff->mCurActionIdx = i; + return i; + } + } + } + + staff->mCurActionIdx = -1; + return -1; } /* 80074964-800749A0 .text getMyActName__16dEvent_manager_cFi */ @@ -492,8 +572,48 @@ u8 dEvent_manager_c::getEventEndSound(s16 eventIdx) { /* 80074BE4-80074D78 .text exceptionProc__16dEvent_manager_cFv */ void dEvent_manager_c::exceptionProc() { /* Nonmatching */ + + const char* eventName = mException.getEventName(); + s32 eventIdx = getEventIdx(eventName, 0xFF); + + if (eventIdx == -1) { + mException.mEventInfoIdx = -1; + return; + } + + u8 mapToolID = mException.mEventInfoIdx < 200 ? mException.mEventInfoIdx : 0xFF; + + switch (mException.mState) { + case 0: + mException.mState = 1; + fopAcM_orderOtherEventId(NULL, eventIdx, mapToolID); + break; + case 1: + if (startCheck(eventIdx)) { + mException.mState = 2; + if (strcmp(eventName, "MEETSHISHIOH") == 0) + dComIfGs_onEventBit(0x0F80); + if (strcmp(eventName, "look_tetra") == 0) + dComIfGs_onEventBit(0x0280); + } else { + fopAcM_orderOtherEvent2(NULL, (char*)eventName, dEvtFlag_NOPARTNER_e); + } + break; + case 2: + if (endCheck(eventIdx)) { + dComIfGp_event_reset(); + mException.mState = 0; + mException.mEventInfoIdx = -1; + } + break; + } } +static void dummy1() { + OSReport("EVENT_DEBUG_OFF"); +} + + /* 80074D78-80074DB4 .text issueStaff__16dEvent_manager_cFPCc */ void dEvent_manager_c::issueStaff(const char* name) { dEv_seach_prm prm(name, 0, 0); @@ -515,19 +635,73 @@ cXyz* dEvent_manager_c::getGoal() { return &mGoal; } +struct find_shutter_param { + s16 profName; + fopAc_ac_c* actor; +}; + /* 80074E00-80074EB4 .text findShutterCallBack__FP10fopAc_ac_cPv */ -void findShutterCallBack(fopAc_ac_c*, void*) { - /* Nonmatching */ +static fopAc_ac_c* findShutterCallBack(fopAc_ac_c* actor, void* user) { + find_shutter_param* param = (find_shutter_param*)user; + if (param->profName != fopAcM_GetProfName(actor)) + return NULL; + + cXyz diff = actor->orig.pos - param->actor->orig.pos; + if (diff.x < 10.0f && diff.x > -10.0f && diff.y < 10.0f && diff.y > -10.0f && diff.z < 10.0f && diff.z > -10.0f) + return actor; + + return NULL; } /* 80074EB4-80074FE8 .text specialCast_Shutter__16dEvent_manager_cFsi */ -fopAc_ac_c* dEvent_manager_c::specialCast_Shutter(s16, int) { - /* Nonmatching */ +fopAc_ac_c* dEvent_manager_c::specialCast_Shutter(s16 profName, int flag) { + find_shutter_param param; + param.profName = profName; + param.actor = dComIfGp_getPlayer(0); + + if (dComIfGp_getPlayer(0) == NULL) + JUT_ASSERT(0x623, 0); + + fopAc_ac_c* shutter = (fopAc_ac_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)findShutterCallBack, ¶m); + if (shutter != NULL && flag) { + cXyz goal = shutter->orig.pos; + s16 angle = param.actor->orig.angle.y + 0x8000; + goal.x += cM_ssin(angle) * 100.0f; + goal.z += cM_scos(angle) * 100.0f; + dComIfGp_evmng_setGoal(&goal); + g_dComIfG_gameInfo.play.getEvent().setPt2(shutter); + } + + return shutter; } /* 80074FE8-800750FC .text specialCast__16dEvent_manager_cFPCci */ -fopAc_ac_c* dEvent_manager_c::specialCast(const char*, int) { - /* Nonmatching */ +fopAc_ac_c* dEvent_manager_c::specialCast(const char* name, int flag) { + fopAc_ac_c* actor = NULL; + + if (name == NULL) + return NULL; + + if (strcmp(name, "SHUTTER_DOOR") == 0) { + actor = specialCast_Shutter(PROC_DOOR10, flag); + if (actor == NULL) + actor = specialCast_Shutter(PROC_DOOR12, flag); + if (actor == NULL) + actor = specialCast_Shutter(PROC_KDDOOR, flag); + if (actor == NULL) + actor = specialCast_Shutter(PROC_KNOB00, flag); + if (actor != NULL) + dComIfGp_event_onEventFlag(0x10); + } + + if (actor != NULL) { + if (flag) + fopAcM_OnStatus(actor, fopAcStts_UNK1000_e); + else + fopAcM_OffStatus(actor, fopAcStts_UNK1000_e); + } + + return actor; } /* 800750FC-80075288 .text setPrmStaff__16dEvent_manager_cFPvi */ diff --git a/src/d/d_npc_event_cut.inc b/src/d/d_npc_event_cut.inc index ddb162c1a..e314286bd 100644 --- a/src/d/d_npc_event_cut.inc +++ b/src/d/d_npc_event_cut.inc @@ -4,6 +4,7 @@ #include "d/d_npc.h" #include "d/d_com_inf_game.h" +#include "d/d_event_manager.h" bool dNpc_EventCut_c::cutProc() { static char* action_table[] = { @@ -171,7 +172,7 @@ void dNpc_EventCut_c::cutTurnToActorProc() { fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); } else { - if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + if(mpActorName == 0 || strcmp(mpActorName, "Player") == 0) { mpTargetActor = dComIfGp_getPlayer(0); } else { @@ -199,7 +200,7 @@ void dNpc_EventCut_c::cutTurnToActorProc() { if(mpTargetActor == 0) { dComIfGp_evmng_cutEnd(mEvtStaffId); } - if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + if(mpActorName == 0 || strcmp(mpActorName, "Player") == 0) { mPos = dNpc_playerEyePos(0.0f) + mOffsetPos; } else { @@ -298,7 +299,7 @@ void dNpc_EventCut_c::cutMoveToActorProc() { fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); } else { - if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + if(mpActorName == 0 || strcmp(mpActorName, "Player") == 0) { mpTargetActor = dComIfGp_getPlayer(0); } else {