From 04e35fdbe03b06589159457ff2bdca738439c719 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 11 Nov 2023 01:49:46 -0800 Subject: [PATCH] d_event_data mostly --- include/d/d_com_inf_game.h | 12 + include/d/d_demo.h | 6 +- include/d/d_drawlist.h | 1 + include/d/d_event_data.h | 76 +++- include/d/d_event_manager.h | 4 +- include/d/d_kankyo.h | 2 + include/m_Do/m_Do_audio.h | 20 + src/d/d_event_data.cpp | 718 ++++++++++++++++++++++++++++++++++-- 8 files changed, 791 insertions(+), 48 deletions(-) diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 5b59644bb..1da8bc5ec 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1675,10 +1675,22 @@ inline dDemo_manager_c* dComIfGp_demo_get() { return g_dComIfG_gameInfo.play.getDemo(); } +inline void dComIfGp_demo_create(const u8* demo_data, cXyz* offsetPos, f32 offsetAngleY) { + g_dComIfG_gameInfo.play.getDemo()->create(demo_data, offsetPos, offsetAngleY); +} + +inline void dComIfGp_demo_remove() { + g_dComIfG_gameInfo.play.getDemo()->remove(); +} + inline void dComIfGp_demo_update() { g_dComIfG_gameInfo.play.getDemo()->update(); } +inline s32 dComIfGp_demo_mode() { + return g_dComIfG_gameInfo.play.getDemo()->getMode(); +} + inline dDemo_actor_c* dComIfGp_demo_getActor(u8 id) { return g_dComIfG_gameInfo.play.getDemo()->mDemoObj.getActor(id); } diff --git a/include/d/d_demo.h b/include/d/d_demo.h index a59fe3cd0..aa6352e97 100644 --- a/include/d/d_demo.h +++ b/include/d/d_demo.h @@ -81,6 +81,8 @@ public: void update(); int getFrame() { return mFrame; } + u32 getFrameNoMsg() { return mFrameNoMsg; } + s32 getMode() { return mMode; } /* 0x00 */ dDemo_system_c* mpSystem; /* 0x04 */ TControl* mpControl; @@ -93,8 +95,8 @@ public: /* 0x20 */ dDemo_object_c mDemoObj; /* 0xD0 */ void* field_0xd0; /* 0xD4 */ int mFrame; - /* 0xD8 */ int field_0xd8; - /* 0xDC */ int mState; + /* 0xD8 */ int mFrameNoMsg; + /* 0xDC */ int mMode; }; class mDoExt_McaMorf; diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index e373e72ca..0d1b19a30 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -429,6 +429,7 @@ public: view_class* getView() { return (view_class*)mpCamera; } static void offWipe() { mWipe = false; } + static f32 getWipeRate() { return mWipeRate; } void newPeekZdata(s16 x, s16 y, u32 * data) { mPeekZ.newData(x, y, data); } diff --git a/include/d/d_event_data.h b/include/d/d_event_data.h index 30c035ca4..8ed2d51d4 100644 --- a/include/d/d_event_data.h +++ b/include/d/d_event_data.h @@ -25,7 +25,20 @@ class dEvDtData_c {}; class dEvDtCut_c { public: - void startCheck(); + s32 startCheck(); + s32 getNext() { return mNextCutIdx; } + u32 getFlagId() { return mFlagIdx; } + u32 getTagId() { return mTagId; } + +public: + /* 0x00 */ char mName[32]; + /* 0x20 */ u32 mTagId; + /* 0x24 */ u32 mIndex; + /* 0x28 */ u32 mFlagCheck[3]; + /* 0x34 */ u32 mFlagIdx; + /* 0x38 */ u32 field_0x38; + /* 0x3C */ u32 mNextCutIdx; + /* 0x40 */ u32 field_0x40[4]; }; class dEvDtStaff_c { @@ -43,10 +56,28 @@ public: void specialProcPackage(); void specialProcTimekeeper(); + u32 getCurrentCut() { return mCurCutIdx; } + + enum StaffType_e { + NORMAL_e, + ALL_e, + CAMERA_e, + EFFECT_e, + TIMEKEEPER_e, + FIVE_e, + DIRECTOR_e, + MESSAGE_e, + SOUND_e, + LIGHT_e, + TEN_e, + PACKAGE_e, + CREATE_e, + }; + public: /* 0x00 */ char mName[32]; /* 0x20 */ int mSub; - /* 0x24 */ int mIndex; + /* 0x24 */ int mStaffIdx; /* 0x28 */ int m28; /* 0x2C */ int mStaffType; /* 0x30 */ int mFirstCutIdx; @@ -57,28 +88,51 @@ public: /* 0x42 */ s16 mTimer; /* 0x44 */ u8 m44; /* 0x45 */ u8 m45; - /* 0x46 */ u8 mbIsAdvance; + /* 0x46 */ u8 mAdvance; /* 0x47 */ u8 mbNeedsAction; /* 0x48 */ u8 field_48[0x50 - 0x48]; }; class dEvDtEvent_c { public: - void finish_check(); + BOOL finish_check(); void specialStaffProc(dEvDtStaff_c*); + + char * getName() { return mName; } + u32 getStaff(int idx) { return mStaffIdx[idx]; } + s32 getNStaff() { return mNStaff; } + u32 getPriority() { return mPriority; } + +public: + /* 0x00 */ char mName[0x20]; + /* 0x20 */ u32 field_0x20; + /* 0x24 */ u32 field_0x24; + /* 0x28 */ u32 mPriority; + /* 0x2C */ u32 mStaffIdx[20]; + /* 0x7C */ s32 mNStaff; + /* 0x80 */ int mFlagCheckStart[2]; + /* 0x88 */ int mFlagCheckFinish[3]; + /* 0x94 */ u8 mEventEndSound; + /* 0x98 */ u32 field_0x98; + /* 0x9C */ u32 field_0x9c; + /* 0xA0 */ u32 field_0xa0; + /* 0xA4 */ u32 mEventState; + /* 0xA8 */ u32 field_0xa8; + /* 0xAC */ u32 field_0xac; }; class dEvDtFlag_c { public: dEvDtFlag_c() {} - void flagCheck(int); - void flagSet(int); - void flagMaxCheck(int); + BOOL flagCheck(int); + BOOL flagSet(int); + BOOL flagMaxCheck(int); void init(); public: - u32 mFlags[320]; + u32 mFlag[320]; + enum { FlagMax = 320 * 32 }; }; // Size = 0x500 class dEvDtBase_c { @@ -88,7 +142,9 @@ public: void init(); void advanceCut(dEvDtEvent_c*); - void advanceCutLocal(dEvDtStaff_c*); + bool advanceCutLocal(dEvDtStaff_c*); + + dEvDtCut_c * getCutP(int idx) { return &mCutP[idx]; } public: /* 0x00 */ event_binary_data_header* mHeaderP; @@ -103,4 +159,4 @@ public: STATIC_ASSERT(sizeof(dEvDtBase_c) == 0x20); -#endif /* D_EVENT_D_EVENT_DATA_H */ \ No newline at end of file +#endif /* D_EVENT_D_EVENT_DATA_H */ diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index e65b82b44..6aba958e2 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -65,11 +65,13 @@ public: BOOL ChkPresentEnd(); void CancelPresent(); void checkStartDemo(); + dEvDtFlag_c& getFlags() { return mFlag; } int setStartDemo(int eventInfoIdx) { return mException.setStartDemo(eventInfoIdx); } + void setCameraPlay(u32 v) { mCameraPlay = v; } /* 0x000 */ dEvDtBase_c mList; - /* 0x020 */ int mCameraPlay; + /* 0x020 */ u32 mCameraPlay; /* 0x024 */ dEvent_exception_c mException; /* 0x030 */ cXyz mGoal; /* 0x03C */ dEvDtFlag_c mFlag; diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 6efac2488..21f65cb99 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -388,6 +388,8 @@ int dKy_get_dayofweek(); u32 dKy_moon_type_chk(); BOOL dKy_checkEventNightStop(); void dKy_set_nexttime(f32); +void dKy_instant_timechg(f32); +void dKy_instant_rainchg(); void dKy_Sound_set(cXyz i_pos, int param_1, unsigned int i_actorID, int param_3); void dKy_itudemo_se(); void dKy_actor_addcol_set(s16, s16, s16, f32); diff --git a/include/m_Do/m_Do_audio.h b/include/m_Do/m_Do_audio.h index 443fbc991..12380f2b2 100644 --- a/include/m_Do/m_Do_audio.h +++ b/include/m_Do/m_Do_audio.h @@ -50,10 +50,30 @@ inline void mDoAud_subBgmStart(u32 param_0) { mDoAud_zelAudio_c::getInterface()->subBgmStart(param_0); } +inline void mDoAud_bgmStreamPrepare(u32 id) { + mDoAud_zelAudio_c::getInterface()->bgmStreamPrepare(id); +} + +inline void mDoAud_bgmStreamPlay() { + mDoAud_zelAudio_c::getInterface()->bgmStreamPlay(); +} + inline void mDoAud_bgmStop(u32 param_0) { mDoAud_zelAudio_c::getInterface()->bgmStop(param_0, 0); } +inline void mDoAud_prepareLandingDemo(u32 idx) { + mDoAud_zelAudio_c::getInterface()->prepareLandingDemo(idx); +} + +inline void mDoAud_startLandingDemo() { + mDoAud_zelAudio_c::getInterface()->startLandingDemo(); +} + +inline void mDoAud_endLandingDemo() { + mDoAud_zelAudio_c::getInterface()->endLandingDemo(); +} + inline void mDoAud_sceneBgmStart() { mDoAud_zelAudio_c::getInterface()->sceneBgmStart(); } diff --git a/src/d/d_event_data.cpp b/src/d/d_event_data.cpp index 734815ce1..46e896871 100644 --- a/src/d/d_event_data.cpp +++ b/src/d/d_event_data.cpp @@ -5,70 +5,251 @@ #include "d/d_event_data.h" #include "d/d_com_inf_game.h" +#include "d/actor/d_a_player.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_graphic.h" /* 80071778-8007195C .text dEvDt_Next_Stage__Fii */ -void dEvDt_Next_Stage(int, int) { - /* Nonmatching */ +BOOL dEvDt_Next_Stage(int staffIdx, int wipePrm) { + u32 roomNo; + u32 layerNo; + u32 mode; + u32 wipe; + const char * pStageName; + u32 * pStartCode; + u32 * pRoomNo; + u32 * pLayer; + f32 * pHour; + u32 * pMode; + u32 * pWipe; + + roomNo = 0; + layerNo = -1; + mode = 0; + wipe = wipePrm; + + pStageName = dComIfGp_evmng_getMyStringP(staffIdx, "Stage"); + if (pStageName == NULL) + return FALSE; + + pStartCode = dComIfGp_evmng_getMyIntegerP(staffIdx, "StartCode"); + pRoomNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "RoomNo"); + if (pRoomNo != NULL) + roomNo = *pRoomNo; + pLayer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Layer"); + if (pLayer != NULL) + layerNo = *pLayer; + pHour = dComIfGp_evmng_getMyFloatP(staffIdx, "Hour"); + pMode = dComIfGp_evmng_getMyIntegerP(staffIdx, "Mode"); + if (pMode != NULL) + mode = *pMode; + pWipe = dComIfGp_evmng_getMyIntegerP(staffIdx, "Wipe"); + if (pWipe != NULL) + wipe = *pWipe; + + if (pStageName != NULL && pStartCode != NULL) { + if (pHour != NULL) + dKy_set_nexttime(*pHour * 15.0f); + dComIfGp_setNextStage(pStageName, *pStartCode, roomNo, layerNo, 0.0f, mode, 1, wipe); + } else { + JUT_ASSERT(0x88, 0); + } + + return true; } /* 8007195C-800719C4 .text flagCheck__11dEvDtFlag_cFi */ -void dEvDtFlag_c::flagCheck(int) { +BOOL dEvDtFlag_c::flagCheck(int flag_id) { /* Nonmatching */ + if (flagMaxCheck(flag_id)) + return FALSE; + + u32 byteNo = (flag_id >> 3); + u32 bitNo = 1 << (flag_id & 0x1F); + if (mFlag[byteNo] & bitNo) + return true; + return FALSE; } /* 800719C4-80071A2C .text flagSet__11dEvDtFlag_cFi */ -void dEvDtFlag_c::flagSet(int) { +BOOL dEvDtFlag_c::flagSet(int flag_id) { /* Nonmatching */ + if (flagMaxCheck(flag_id)) + return FALSE; + + u32 byteNo = (flag_id >> 3); + u32 bitNo = 1 << (flag_id & 0x1F); + mFlag[byteNo] |= bitNo; + return TRUE; } /* 80071A2C-80071AA8 .text flagMaxCheck__11dEvDtFlag_cFi */ -void dEvDtFlag_c::flagMaxCheck(int) { - /* Nonmatching */ +BOOL dEvDtFlag_c::flagMaxCheck(int flag_id) { + if (flag_id == -1) { + return TRUE; + } else if (flag_id >= FlagMax) { + JUT_ASSERT(0xc0, flag_id < FlagMax); + return TRUE; + } else { + return FALSE; + } } /* 80071AA8-80071AC8 .text init__11dEvDtFlag_cFv */ void dEvDtFlag_c::init() { - /* Nonmatching */ + for (u32 i = 0; i < ARRAY_SIZE(mFlag); i++) + mFlag[i] = 0; +} + +inline BOOL dEvDtFlagCheck(int flag_id) { + return dComIfGp_getPEvtManager()->getFlags().flagCheck(flag_id); +} + +inline BOOL dEvDtFlagSet(int flag_id) { + dComIfGp_getPEvtManager()->getFlags().flagSet(flag_id); } /* 80071AC8-80071B4C .text finish_check__12dEvDtEvent_cFv */ -void dEvDtEvent_c::finish_check() { - /* Nonmatching */ +BOOL dEvDtEvent_c::finish_check() { + for (s32 i = 0; i < (s32)ARRAY_SIZE(mFlagCheckFinish); i++) { + int flag_id = mFlagCheckFinish[i]; + if (flag_id == -1) + return TRUE; + if (!dEvDtFlagCheck(flag_id)) + return FALSE; + } + + return TRUE; } /* 80071B4C-80071BB4 .text specialStaffProc__12dEvDtEvent_cFP12dEvDtStaff_c */ -void dEvDtEvent_c::specialStaffProc(dEvDtStaff_c*) { - /* Nonmatching */ +void dEvDtEvent_c::specialStaffProc(dEvDtStaff_c* staff) { + for (s32 i = 0; i < getNStaff(); i++) + staff[getStaff(i)].specialProc(); } /* 80071BB4-80071C18 .text specialProc_WaitStart__12dEvDtStaff_cFi */ -void dEvDtStaff_c::specialProc_WaitStart(int) { - /* Nonmatching */ +void dEvDtStaff_c::specialProc_WaitStart(int staffIdx) { + u32 * pTimer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + if (pTimer == NULL) + mTimer = 0; + else + mTimer = *pTimer; } /* 80071C18-80071C5C .text specialProc_WaitProc__12dEvDtStaff_cFi */ -void dEvDtStaff_c::specialProc_WaitProc(int) { - /* Nonmatching */ +void dEvDtStaff_c::specialProc_WaitProc(int staffIdx) { + if (mTimer > 0) + mTimer--; + else + dComIfGp_evmng_cutEnd(staffIdx); } /* 80071C5C-80071D08 .text specialProc__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProc() { - /* Nonmatching */ + switch (mStaffType) { + case PACKAGE_e: + specialProcPackage(); + break; + case DIRECTOR_e: + specialProcDirector(); + break; + case TIMEKEEPER_e: + specialProcTimekeeper(); + break; + case ALL_e: + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + case CREATE_e: + specialProcCreate(); + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + case SOUND_e: + specialProcSound(); + break; + case MESSAGE_e: + specialProcMessage(); + break; + case LIGHT_e: + specialProcLight(); + break; + } } /* 80071D08-80071D58 .text init__12dEvDtStaff_cFv */ void dEvDtStaff_c::init() { - /* Nonmatching */ + mCurCutIdx = mFirstCutIdx; + mTimer = 0; + mWipeDirection = 0; + m45 = 0; + m44 = 0; + mAdvance = 2; + mbNeedsAction = false; + mCurActionIdx = -1; + if (mStaffType == CAMERA_e) + dComIfGp_getPEvtManager()->setCameraPlay(1); } /* 80071D58-80071D88 .text advanceCut__12dEvDtStaff_cFi */ -void dEvDtStaff_c::advanceCut(int) { - /* Nonmatching */ +void dEvDtStaff_c::advanceCut(int cutIdx) { + mCurCutIdx = cutIdx; + mTimer = 0; + mWipeDirection = 0; + m45 = 0; + m44 = 0; + mAdvance = 1; + mbNeedsAction = false; + mCurActionIdx = -1; } /* 80071D88-80071F58 .text specialProcLight__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcLight() { - /* Nonmatching */ + int staffIdx = dComIfGp_evmng_getMyStaffId("LIGHT", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x16a, 0); + return; + } + + static char * action_table[] = { + "WAIT", + "CHANGE", + "ADD_TIME", + }; + int act = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (act) { + case 1: // CHANGE + { + f32 * pHour = dComIfGp_evmng_getMyFloatP(staffIdx, "Hour"); + if (pHour != NULL) { + dKy_instant_timechg(*pHour * 15.0f); + } + + s32 * pWeather = (s32*)dComIfGp_evmng_getMyIntegerP(staffIdx, "Weather"); + if (pWeather != NULL) { + switch (*pWeather) { + case 0: + dKy_instant_rainchg(); + break; + } + } + } + break; + case 2: // ADD_TIME + { + f32 * pHour = dComIfGp_evmng_getMyFloatP(staffIdx, "Hour"); + if (pHour != NULL) { + f32 hour = *pHour + dComIfGs_getTime() * (1.0f / 15.0f); + while (hour >= 24.0f) + hour -= 24.0f; + dKy_instant_timechg(hour * 15.0f); + } + } + break; + } + } + dComIfGp_evmng_cutEnd(staffIdx); } /* 80071F58-80072458 .text specialProcMessage__12dEvDtStaff_cFv */ @@ -78,7 +259,7 @@ void dEvDtStaff_c::specialProcMessage() { JUT_ASSERT(0x1C2, 0); return; } - + static char* action_table[] = { "WAIT", "CREATE_MSG", @@ -93,7 +274,7 @@ void dEvDtStaff_c::specialProcMessage() { static u32 l_msgId; static msg_class* l_msg; static int l_msgNo; - + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); if (dComIfGp_evmng_getIsAddvance(staffIdx)) { switch (actIdx) { @@ -132,7 +313,7 @@ void dEvDtStaff_c::specialProcMessage() { break; } } - + switch (actIdx) { case 0: // WAIT case 7: // TELOP_ON @@ -198,46 +379,513 @@ void dEvDtStaff_c::specialProcMessage() { /* 80072458-80072748 .text specialProcSound__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcSound() { - /* Nonmatching */ + int staffIdx = dComIfGp_evmng_getMyStaffId("SOUND", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x254, 0); + return; + } + + static char* action_table[] = { + "WAIT", + "STRM_PLAY", + "STRM_DEMO_MJ_SISTER", + "STRM_DEMO_GO_MAJU", + "NOMSG_WAIT", + "RIDDLE", + "LANDING_DEMO", + "BGMSTOP", + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (actIdx) { + case 0: // WAIT + specialProc_WaitStart(staffIdx); + break; + case 1: // STRM_PLAY + mDoAud_bgmStreamPlay(); + break; + case 2: // STRM_DEMO_MJ_SISTER + mDoAud_bgmStreamPrepare(0xC0000004); + break; + case 3: // STRM_DEMO_GO_MAJU + mDoAud_bgmStreamPrepare(0xC0000005); + break; + case 4: // NOMSG_WAIT + specialProc_WaitStart(staffIdx); + break; + case 5: // RIDDLE + mDoAud_seStart(JA_SE_READ_RIDDLE_1, NULL, 0, 0); + break; + case 6: // LANDING_DEMO + { + s32* pPrepare = (s32*)dComIfGp_evmng_getMyIntegerP(staffIdx, "PREPARE"); + if (pPrepare != NULL) { + static u32 landing_table[] = { + 2, 3, 4, 5, 6, 1, 7, + }; + if (*pPrepare > 6) + JUT_ASSERT(0x293, 0); + mDoAud_prepareLandingDemo(landing_table[*pPrepare]); + } + + u32 * pStart = dComIfGp_evmng_getMyIntegerP(staffIdx, "START"); + if (pStart != NULL) + mDoAud_startLandingDemo(); + + u32 * pEnd = dComIfGp_evmng_getMyIntegerP(staffIdx, "END"); + if (pEnd != NULL) + mDoAud_endLandingDemo(); + } + break; + case 7: // BGMSTOP + { + u32* pTimer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + if (pTimer != NULL) + mDoAud_bgmStop(*pTimer); + } + break; + } + } + + switch (actIdx) { + case 0: // WAIT + specialProc_WaitProc(staffIdx); + break; + case 4: // NOMSG_WAIT + if (mTimer <= dComIfGp_demo_get()->getFrameNoMsg()) + dComIfGp_evmng_cutEnd(staffIdx); + break; + default: + dComIfGp_evmng_cutEnd(staffIdx); + break; + } } /* 80072748-80072A28 .text specialProcCreate__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcCreate() { - /* Nonmatching */ + int staffIdx = dComIfGp_evmng_getMyStaffId("CREATER", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x2d3, 0); + return; + } + + static char* action_table[] = { + "WAIT", + "CREATE", + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (actIdx) { + case 0: // WAIT + break; + case 1: // CREATE + { + const char * name = dComIfGp_evmng_getMyStringP(staffIdx, "MAKECAST"); + JUT_ASSERT(0x2e3, name); + + dStage_objectNameInf * objectName = dStage_searchName(name); + JUT_ASSERT(0x2e5, objectName); + + u32* pArg = dComIfGp_evmng_getMyIntegerP(staffIdx, "ARG"); + u32 arg; + if (pArg == NULL) { + arg = 0xFFFFFFFF; + } else { + arg = *pArg; + } + + Vec* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "POS"); + cXyz pos; + if (pPos == NULL) { + pos = dComIfGp_getPlayer(0)->getPosition(); + } else { + pos = *pPos; + } + + s32* pAngle = (s32*)dComIfGp_evmng_getMyIntegerP(staffIdx, "ANGLE"); + csXyz angle; + if (pAngle == NULL) { + angle.setall(0); + } else { + s16 x = pAngle[0]; + s16 z = pAngle[2]; + s16 y = pAngle[1]; + angle.x = x; + angle.y = y; + angle.z = z; + } + + Vec* pScale = dComIfGp_evmng_getMyXyzP(staffIdx, "SCALE"); + cXyz scale; + if (pScale == NULL) { + scale.setall(1.0f); + } else { + scale = *pScale; + } + + fopAcM_create(objectName->mProcName, arg, &pos, dComIfGp_roomControl_getStayNo(), &angle, &scale, objectName->mSubtype, NULL); + } + break; + } + } } /* 80072A28-80073064 .text specialProcDirector__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcDirector() { - /* Nonmatching */ + daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); + int staffIdx = dComIfGp_evmng_getMyStaffId("DIRECTOR", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x330, 0); + return; + } + + static char* action_table[] = { + "WAIT", + "NEXT", + "FADE", + "BGM_START", + "VIBRATION", + "SE_START", + "WIPE", + "PLAYER_DRAW", + "PLAYER_NODRAW", + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (actIdx) { + case 0: // WAIT + specialProc_WaitStart(staffIdx); + break; + case 1: // NEXT + dEvDt_Next_Stage(staffIdx, 0); + break; + case 2: // FADE + { + f32* rate = dComIfGp_evmng_getMyFloatP(staffIdx, "Rate"); + u32* color = dComIfGp_evmng_getMyIntegerP(staffIdx, "Color"); + JUT_ASSERT(0x343, rate); + if (*rate > 0.0f) { + mDoGph_gInf_c::setFadeRate(0.0f); + } + + if (color != NULL) { + GXColor fadeColor; + fadeColor.r = color[0]; + fadeColor.g = color[1]; + fadeColor.b = color[2]; + fadeColor.a = color[3]; + mDoGph_gInf_c::fadeOut(*rate, fadeColor); + } else { + mDoGph_gInf_c::fadeOut(*rate); + } + } + break; + case 3: // BGM_START + { + u32* pBGM = dComIfGp_evmng_getMyIntegerP(staffIdx, "BGM_ID"); + u32 bgm; + static u32 bgm_table[] = { + 0x80000007, // JA_BGM_I_MAJU + 0x80000012, // JA_BGM_TETRA_MEET + 0x80000017, // JA_BGM_I_LINK_FOREST + }; + + if (pBGM != NULL) { + bgm = *pBGM; + } else { + bgm = 0; + } + + mDoAud_bgmStart(bgm_table[bgm]); + } + break; + case 4: // VIBRATION + { + specialProc_WaitStart(staffIdx); + if (mTimer == 0) + JUT_ASSERT(0x36b, 0); + + const u8* pattern = (const u8*)dComIfGp_evmng_getMyIntegerP(staffIdx, "Pattern"); + const u32* type = dComIfGp_evmng_getMyIntegerP(staffIdx, "Type"); + if (pattern == NULL || type == NULL) + JUT_ASSERT(0x36f, 0); + + Vec xyz; + xyz.x = 0.0f; + xyz.y = 1.0f; + xyz.z = 0.0f; + dComIfGp_getVibration().StartQuake(pattern, 0, *type, xyz); + } + break; + case 5: // SE_START + { + s32* pSE = (s32*)dComIfGp_evmng_getMyIntegerP(staffIdx, "SENUM"); + if (pSE != NULL) { + static u32 se_table[] = { + JA_SE_CM_ZL_FDEMO_JIMEN, + }; + + if (*pSE < (s32)ARRAY_SIZE(se_table)) { + mDoAud_seStart(se_table[*pSE], NULL, 0, 0); + } + } + } + break; + case 6: // WIPE + { + f32* rate = dComIfGp_evmng_getMyFloatP(staffIdx, "Rate"); + JUT_ASSERT(0x343, rate); + dDlst_list_c::wipeIn(-*rate); + if (*rate > 0.0f) + mWipeDirection = 0; + else + mWipeDirection = 1; + u32* sound = dComIfGp_evmng_getMyIntegerP(staffIdx, "SOUND"); + if (sound != NULL) { + switch (*sound) { + case 0: + mDoAud_seStart(JA_SE_CHUYA_SWITCH, NULL, 0, 0); + break; + } + } + } + break; + case 7: // PLAYER_DRAW + player->offPlayerNoDraw(); + break; + case 8: // PLAYER_NODRAW + player->onPlayerNoDraw(); + break; + } + } + + switch (actIdx) { + case 0: // WAIT + specialProc_WaitProc(staffIdx); + break; + case 1: // NEXT + break; + case 2: // FADE + { + if (!mDoGph_gInf_c::isFade()) { + dComIfGp_evmng_cutEnd(staffIdx); + } else if (mDoGph_gInf_c::getFadeRate() >= 1.0f) { + f32* rate = dComIfGp_evmng_getMyFloatP(staffIdx, "Rate"); + JUT_ASSERT(0x3b8, rate); + if (*rate > 0.0f) + dComIfGp_evmng_cutEnd(staffIdx); + } + } + break; + case 4: // VIBRATION + { + if (mTimer > 0) { + mTimer--; + if (mTimer == 0) + dComIfGp_getVibration().StopQuake(-1); + } else { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + break; + case 6: // WIPE + { + if (mWipeDirection) { + if (dDlst_list_c::getWipeRate() == 0.0f) + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if (dDlst_list_c::getWipeRate() >= 1.0f) + dComIfGp_evmng_cutEnd(staffIdx); + } + } + break; + default: + dComIfGp_evmng_cutEnd(staffIdx); + break; + } } /* 80073064-800733CC .text specialProcPackage__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcPackage() { - /* Nonmatching */ + int staffIdx = dComIfGp_evmng_getMyStaffId("PACKAGE", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x254, 0); + return; + } + + static char* action_table[] = { + "WAIT", + "PLAY", + "PLAY2", + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (actIdx) { + case 0: // WAIT + specialProc_WaitStart(staffIdx); + break; + case 1: // PLAY + case 2: // PLAY2 + { + const char* filename = dComIfGp_evmng_getMyStringP(staffIdx, "FileName"); + Vec* pOffsetPos = dComIfGp_evmng_getMyXyzP(staffIdx, "OffsetPos"); + f32* pOffsetAngY = dComIfGp_evmng_getMyFloatP(staffIdx, "OffsetAngY"); + + f32 offsetAngY; + if (pOffsetAngY != NULL) + offsetAngY = *pOffsetAngY; + else + offsetAngY = 0.0f; + + void* demo_data = NULL; + const char* demo_arc = dStage_roomControl_c::getDemoArcName(); + if (demo_arc[0] != '\0') + demo_data = dComIfG_getObjectRes(demo_arc, filename); + if (demo_data == NULL) + demo_data = dComIfG_getStageRes("Stage", filename); + JUT_ASSERT(0x42e, demo_data); + dComIfGp_demo_create((const u8*)demo_data, (cXyz*)pOffsetPos, offsetAngY); + dComIfGp_event_setCullRate(10.0f); + u32* eventFlag = dComIfGp_evmng_getMyIntegerP(staffIdx, "EventFlag"); + if (eventFlag != NULL) + dComIfGs_onEventBit(*eventFlag); + } + break; + } + } + + switch (actIdx) { + case 0: // WAIT + specialProc_WaitProc(staffIdx); + break; + case 1: // PLAY + { + if (mWipeDirection == 0) { + if (dComIfGp_demo_mode() == 2) { + if (dEvDt_Next_Stage(staffIdx, 5)) { + mWipeDirection = 1; + } else { + dComIfGp_demo_remove(); + } + } + + if (dComIfGp_demo_mode() == 0) { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + } + break; + case -1: + JUT_ASSERT(0x45c, 0); + dComIfGp_evmng_cutEnd(staffIdx); + break; + } } /* 800733CC-800735BC .text specialProcTimekeeper__12dEvDtStaff_cFv */ void dEvDtStaff_c::specialProcTimekeeper() { - /* Nonmatching */ + int staffIdx = dComIfGp_evmng_getMyStaffId("TIMEKEEPER", NULL, 0); + if (staffIdx == -1) { + JUT_ASSERT(0x471, 0); + return; + } + + static char* action_table[] = { + "COUNTDOWN", + "WAIT", + }; + + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), 0, 0); + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch (actIdx) { + case 0: // COUNTDOWN + { + u32* idata = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + JUT_ASSERT(0x482, idata); + mTimer = *idata; + } + break; + case 1: // WAIT + break; + } + } + + switch (actIdx) { + case 0: // COUNTDOWN + { + if (mTimer > 0) + mTimer--; + else + dComIfGp_evmng_cutEnd(staffIdx); + } + break; + case 1: // WAIT + dComIfGp_evmng_cutEnd(staffIdx); + break; + case -1: + JUT_ASSERT(0x45c, 0); + dComIfGp_evmng_cutEnd(staffIdx); + break; + } } /* 800735BC-8007364C .text startCheck__10dEvDtCut_cFv */ -void dEvDtCut_c::startCheck() { - /* Nonmatching */ +s32 dEvDtCut_c::startCheck() { + for (s32 i = 0; i < (s32)ARRAY_SIZE(mFlagCheck); i++) { + int flag_id = mFlagCheck[i]; + if (flag_id == -1) { + return i == 0 ? -1 : 1; + } + if (!dEvDtFlagCheck(flag_id)) + return 0; + } + return 1; } /* 8007364C-80073674 .text init__11dEvDtBase_cFv */ void dEvDtBase_c::init() { - /* Nonmatching */ + mHeaderP = NULL; + mEventP = NULL; + mStaffP = NULL; + mCutP = NULL; + mDataP = NULL; + mFDataP = NULL; + mIDataP = NULL; + mSDataP = NULL; } /* 80073674-800736E4 .text advanceCut__11dEvDtBase_cFP12dEvDtEvent_c */ -void dEvDtBase_c::advanceCut(dEvDtEvent_c*) { - /* Nonmatching */ +void dEvDtBase_c::advanceCut(dEvDtEvent_c* evt) { + for (s32 i = 0; i < evt->getNStaff(); i++) + advanceCutLocal(&mStaffP[evt->getStaff(i)]); } /* 800736E4-800737DC .text advanceCutLocal__11dEvDtBase_cFP12dEvDtStaff_c */ -void dEvDtBase_c::advanceCutLocal(dEvDtStaff_c*) { - /* Nonmatching */ +bool dEvDtBase_c::advanceCutLocal(dEvDtStaff_c* staff) { + u32 currentCut = staff->getCurrentCut(); + dEvDtCut_c * cutP = mCutP; + + if (cutP[currentCut].getNext() != -1) { + switch (cutP[cutP[currentCut].getNext()].startCheck()) { + case -1: + if (dEvDtFlagCheck(cutP[currentCut].getFlagId())) + staff->advanceCut(cutP[currentCut].getNext()); + return true; + case 1: + dEvDtFlagSet(cutP[currentCut].getFlagId()); + staff->advanceCut(cutP[currentCut].getNext()); + return true; + } + } + + if (staff->mAdvance > 1) + staff->mAdvance = 1; + else + staff->mAdvance = 0; + return false; }